Loading services/core/java/com/android/server/wm/DisplayPolicy.java +25 −1 Original line number Diff line number Diff line Loading @@ -2004,6 +2004,9 @@ public class DisplayPolicy { */ final Rect mConfigFrame = new Rect(); /** The count of insets sources when calculating this info. */ int mLastInsetsSourceCount; private boolean mNeedUpdate = true; void update(DisplayContent dc, int rotation, int w, int h) { Loading @@ -2025,6 +2028,7 @@ public class DisplayPolicy { mNonDecorFrame.inset(mNonDecorInsets); mConfigFrame.set(displayFrame); mConfigFrame.inset(mConfigInsets); mLastInsetsSourceCount = dc.getDisplayPolicy().mInsetsSourceWindowsExceptIme.size(); mNeedUpdate = false; } Loading @@ -2033,6 +2037,7 @@ public class DisplayPolicy { mConfigInsets.set(other.mConfigInsets); mNonDecorFrame.set(other.mNonDecorFrame); mConfigFrame.set(other.mConfigFrame); mLastInsetsSourceCount = other.mLastInsetsSourceCount; mNeedUpdate = false; } Loading @@ -2048,6 +2053,12 @@ public class DisplayPolicy { static final int DECOR_TYPES = Type.displayCutout() | Type.navigationBars(); /** * The types that may affect display configuration. This excludes cutout because it is * known from display info. */ static final int CONFIG_TYPES = Type.statusBars() | Type.navigationBars(); private final DisplayContent mDisplayContent; private final Info[] mInfoForRotation = new Info[4]; final Info mTmpInfo = new Info(); Loading Loading @@ -2087,7 +2098,20 @@ public class DisplayPolicy { final DecorInsets.Info newInfo = mDecorInsets.mTmpInfo; newInfo.update(mDisplayContent, rotation, dw, dh); final DecorInsets.Info currentInfo = getDecorInsetsInfo(rotation, dw, dh); if (newInfo.mNonDecorFrame.equals(currentInfo.mNonDecorFrame)) { if (newInfo.mConfigFrame.equals(currentInfo.mConfigFrame)) { // Even if the config frame is not changed in current rotation, it may change the // insets in other rotations if the source count is changed. if (newInfo.mLastInsetsSourceCount != currentInfo.mLastInsetsSourceCount) { for (int i = mDecorInsets.mInfoForRotation.length - 1; i >= 0; i--) { if (i != rotation) { final boolean flipSize = (i + rotation) % 2 == 1; final int w = flipSize ? dh : dw; final int h = flipSize ? dw : dh; mDecorInsets.mInfoForRotation[i].update(mDisplayContent, i, w, h); } } mDecorInsets.mInfoForRotation[rotation].set(newInfo); } return false; } mDecorInsets.invalidate(); Loading services/core/java/com/android/server/wm/WindowManagerService.java +2 −2 Original line number Diff line number Diff line Loading @@ -1885,7 +1885,7 @@ public class WindowManagerService extends IWindowManager.Stub boolean needToSendNewConfiguration = win.isVisibleRequestedOrAdding() && displayContent.updateOrientation(); if (win.providesNonDecorInsets()) { if (win.providesDisplayDecorInsets()) { needToSendNewConfiguration |= displayPolicy.updateDecorInsetsInfo(); } if (needToSendNewConfiguration) { Loading Loading @@ -2358,7 +2358,7 @@ public class WindowManagerService extends IWindowManager.Stub & WindowManager.LayoutParams.SYSTEM_UI_VISIBILITY_CHANGED) != 0) { win.mLayoutNeeded = true; } if (layoutChanged && win.providesNonDecorInsets()) { if (layoutChanged && win.providesDisplayDecorInsets()) { configChanged = displayPolicy.updateDecorInsetsInfo(); } if (win.mActivityRecord != null && ((flagChanges & FLAG_SHOW_WHEN_LOCKED) != 0 Loading services/core/java/com/android/server/wm/WindowState.java +4 −4 Original line number Diff line number Diff line Loading @@ -1897,13 +1897,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return (mPolicyVisibility & POLICY_VISIBILITY_ALL) == POLICY_VISIBILITY_ALL; } boolean providesNonDecorInsets() { boolean providesDisplayDecorInsets() { if (mProvidedInsetsSources == null) { return false; } for (int i = mProvidedInsetsSources.size() - 1; i >= 0; i--) { final int type = mProvidedInsetsSources.keyAt(i); if ((InsetsState.toPublicType(type) & WindowInsets.Type.navigationBars()) != 0) { if ((InsetsState.toPublicType(type) & DisplayPolicy.DecorInsets.CONFIG_TYPES) != 0) { return true; } } Loading Loading @@ -2631,13 +2631,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } // Check if window provides non decor insets before clearing its provided insets. final boolean windowProvidesNonDecorInsets = providesNonDecorInsets(); final boolean windowProvidesDisplayDecorInsets = providesDisplayDecorInsets(); removeImmediately(); // Removing a visible window may affect the display orientation so just update it if // needed. Also recompute configuration if it provides screen decor insets. boolean needToSendNewConfiguration = wasVisible && displayContent.updateOrientation(); if (windowProvidesNonDecorInsets) { if (windowProvidesDisplayDecorInsets) { needToSendNewConfiguration |= displayContent.getDisplayPolicy().updateDecorInsetsInfo(); } Loading services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +1 −1 Original line number Diff line number Diff line Loading @@ -3117,7 +3117,7 @@ public class ActivityRecordTests extends WindowTestsBase { .setSystemDecorations(true).build(); // Add a decor insets provider window. final WindowState navbar = createNavBarWithProvidedInsets(squareDisplay); assertTrue(navbar.providesNonDecorInsets() assertTrue(navbar.providesDisplayDecorInsets() && squareDisplay.getDisplayPolicy().updateDecorInsetsInfo()); squareDisplay.sendNewConfiguration(); final Task task = new TaskBuilder(mSupervisor).setDisplay(squareDisplay).build(); Loading services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +10 −2 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; Loading Loading @@ -301,20 +302,27 @@ public class DisplayPolicyTests extends WindowTestsBase { @Test public void testUpdateDisplayConfigurationByDecor() { doReturn(NO_CUTOUT).when(mDisplayContent).calculateDisplayCutoutForRotation(anyInt()); final WindowState navbar = createNavBarWithProvidedInsets(mDisplayContent); final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy(); final DisplayInfo di = mDisplayContent.getDisplayInfo(); final int prevScreenHeightDp = mDisplayContent.getConfiguration().screenHeightDp; assertTrue(navbar.providesNonDecorInsets() && displayPolicy.updateDecorInsetsInfo()); assertTrue(navbar.providesDisplayDecorInsets() && displayPolicy.updateDecorInsetsInfo()); assertEquals(NAV_BAR_HEIGHT, displayPolicy.getDecorInsetsInfo(di.rotation, di.logicalWidth, di.logicalHeight).mConfigInsets.bottom); mDisplayContent.sendNewConfiguration(); assertNotEquals(prevScreenHeightDp, mDisplayContent.getConfiguration().screenHeightDp); assertFalse(navbar.providesNonDecorInsets() && displayPolicy.updateDecorInsetsInfo()); assertFalse(navbar.providesDisplayDecorInsets() && displayPolicy.updateDecorInsetsInfo()); navbar.removeIfPossible(); assertEquals(0, displayPolicy.getDecorInsetsInfo(di.rotation, di.logicalWidth, di.logicalHeight).mNonDecorInsets.bottom); final WindowState statusBar = createStatusBarWithProvidedInsets(mDisplayContent); assertTrue(statusBar.providesDisplayDecorInsets() && displayPolicy.updateDecorInsetsInfo()); assertEquals(STATUS_BAR_HEIGHT, displayPolicy.getDecorInsetsInfo(di.rotation, di.logicalWidth, di.logicalHeight).mConfigInsets.top); } @UseTestDisplay(addWindows = { W_NAVIGATION_BAR, W_INPUT_METHOD }) Loading Loading
services/core/java/com/android/server/wm/DisplayPolicy.java +25 −1 Original line number Diff line number Diff line Loading @@ -2004,6 +2004,9 @@ public class DisplayPolicy { */ final Rect mConfigFrame = new Rect(); /** The count of insets sources when calculating this info. */ int mLastInsetsSourceCount; private boolean mNeedUpdate = true; void update(DisplayContent dc, int rotation, int w, int h) { Loading @@ -2025,6 +2028,7 @@ public class DisplayPolicy { mNonDecorFrame.inset(mNonDecorInsets); mConfigFrame.set(displayFrame); mConfigFrame.inset(mConfigInsets); mLastInsetsSourceCount = dc.getDisplayPolicy().mInsetsSourceWindowsExceptIme.size(); mNeedUpdate = false; } Loading @@ -2033,6 +2037,7 @@ public class DisplayPolicy { mConfigInsets.set(other.mConfigInsets); mNonDecorFrame.set(other.mNonDecorFrame); mConfigFrame.set(other.mConfigFrame); mLastInsetsSourceCount = other.mLastInsetsSourceCount; mNeedUpdate = false; } Loading @@ -2048,6 +2053,12 @@ public class DisplayPolicy { static final int DECOR_TYPES = Type.displayCutout() | Type.navigationBars(); /** * The types that may affect display configuration. This excludes cutout because it is * known from display info. */ static final int CONFIG_TYPES = Type.statusBars() | Type.navigationBars(); private final DisplayContent mDisplayContent; private final Info[] mInfoForRotation = new Info[4]; final Info mTmpInfo = new Info(); Loading Loading @@ -2087,7 +2098,20 @@ public class DisplayPolicy { final DecorInsets.Info newInfo = mDecorInsets.mTmpInfo; newInfo.update(mDisplayContent, rotation, dw, dh); final DecorInsets.Info currentInfo = getDecorInsetsInfo(rotation, dw, dh); if (newInfo.mNonDecorFrame.equals(currentInfo.mNonDecorFrame)) { if (newInfo.mConfigFrame.equals(currentInfo.mConfigFrame)) { // Even if the config frame is not changed in current rotation, it may change the // insets in other rotations if the source count is changed. if (newInfo.mLastInsetsSourceCount != currentInfo.mLastInsetsSourceCount) { for (int i = mDecorInsets.mInfoForRotation.length - 1; i >= 0; i--) { if (i != rotation) { final boolean flipSize = (i + rotation) % 2 == 1; final int w = flipSize ? dh : dw; final int h = flipSize ? dw : dh; mDecorInsets.mInfoForRotation[i].update(mDisplayContent, i, w, h); } } mDecorInsets.mInfoForRotation[rotation].set(newInfo); } return false; } mDecorInsets.invalidate(); Loading
services/core/java/com/android/server/wm/WindowManagerService.java +2 −2 Original line number Diff line number Diff line Loading @@ -1885,7 +1885,7 @@ public class WindowManagerService extends IWindowManager.Stub boolean needToSendNewConfiguration = win.isVisibleRequestedOrAdding() && displayContent.updateOrientation(); if (win.providesNonDecorInsets()) { if (win.providesDisplayDecorInsets()) { needToSendNewConfiguration |= displayPolicy.updateDecorInsetsInfo(); } if (needToSendNewConfiguration) { Loading Loading @@ -2358,7 +2358,7 @@ public class WindowManagerService extends IWindowManager.Stub & WindowManager.LayoutParams.SYSTEM_UI_VISIBILITY_CHANGED) != 0) { win.mLayoutNeeded = true; } if (layoutChanged && win.providesNonDecorInsets()) { if (layoutChanged && win.providesDisplayDecorInsets()) { configChanged = displayPolicy.updateDecorInsetsInfo(); } if (win.mActivityRecord != null && ((flagChanges & FLAG_SHOW_WHEN_LOCKED) != 0 Loading
services/core/java/com/android/server/wm/WindowState.java +4 −4 Original line number Diff line number Diff line Loading @@ -1897,13 +1897,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return (mPolicyVisibility & POLICY_VISIBILITY_ALL) == POLICY_VISIBILITY_ALL; } boolean providesNonDecorInsets() { boolean providesDisplayDecorInsets() { if (mProvidedInsetsSources == null) { return false; } for (int i = mProvidedInsetsSources.size() - 1; i >= 0; i--) { final int type = mProvidedInsetsSources.keyAt(i); if ((InsetsState.toPublicType(type) & WindowInsets.Type.navigationBars()) != 0) { if ((InsetsState.toPublicType(type) & DisplayPolicy.DecorInsets.CONFIG_TYPES) != 0) { return true; } } Loading Loading @@ -2631,13 +2631,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } // Check if window provides non decor insets before clearing its provided insets. final boolean windowProvidesNonDecorInsets = providesNonDecorInsets(); final boolean windowProvidesDisplayDecorInsets = providesDisplayDecorInsets(); removeImmediately(); // Removing a visible window may affect the display orientation so just update it if // needed. Also recompute configuration if it provides screen decor insets. boolean needToSendNewConfiguration = wasVisible && displayContent.updateOrientation(); if (windowProvidesNonDecorInsets) { if (windowProvidesDisplayDecorInsets) { needToSendNewConfiguration |= displayContent.getDisplayPolicy().updateDecorInsetsInfo(); } Loading
services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +1 −1 Original line number Diff line number Diff line Loading @@ -3117,7 +3117,7 @@ public class ActivityRecordTests extends WindowTestsBase { .setSystemDecorations(true).build(); // Add a decor insets provider window. final WindowState navbar = createNavBarWithProvidedInsets(squareDisplay); assertTrue(navbar.providesNonDecorInsets() assertTrue(navbar.providesDisplayDecorInsets() && squareDisplay.getDisplayPolicy().updateDecorInsetsInfo()); squareDisplay.sendNewConfiguration(); final Task task = new TaskBuilder(mSupervisor).setDisplay(squareDisplay).build(); Loading
services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +10 −2 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; Loading Loading @@ -301,20 +302,27 @@ public class DisplayPolicyTests extends WindowTestsBase { @Test public void testUpdateDisplayConfigurationByDecor() { doReturn(NO_CUTOUT).when(mDisplayContent).calculateDisplayCutoutForRotation(anyInt()); final WindowState navbar = createNavBarWithProvidedInsets(mDisplayContent); final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy(); final DisplayInfo di = mDisplayContent.getDisplayInfo(); final int prevScreenHeightDp = mDisplayContent.getConfiguration().screenHeightDp; assertTrue(navbar.providesNonDecorInsets() && displayPolicy.updateDecorInsetsInfo()); assertTrue(navbar.providesDisplayDecorInsets() && displayPolicy.updateDecorInsetsInfo()); assertEquals(NAV_BAR_HEIGHT, displayPolicy.getDecorInsetsInfo(di.rotation, di.logicalWidth, di.logicalHeight).mConfigInsets.bottom); mDisplayContent.sendNewConfiguration(); assertNotEquals(prevScreenHeightDp, mDisplayContent.getConfiguration().screenHeightDp); assertFalse(navbar.providesNonDecorInsets() && displayPolicy.updateDecorInsetsInfo()); assertFalse(navbar.providesDisplayDecorInsets() && displayPolicy.updateDecorInsetsInfo()); navbar.removeIfPossible(); assertEquals(0, displayPolicy.getDecorInsetsInfo(di.rotation, di.logicalWidth, di.logicalHeight).mNonDecorInsets.bottom); final WindowState statusBar = createStatusBarWithProvidedInsets(mDisplayContent); assertTrue(statusBar.providesDisplayDecorInsets() && displayPolicy.updateDecorInsetsInfo()); assertEquals(STATUS_BAR_HEIGHT, displayPolicy.getDecorInsetsInfo(di.rotation, di.logicalWidth, di.logicalHeight).mConfigInsets.top); } @UseTestDisplay(addWindows = { W_NAVIGATION_BAR, W_INPUT_METHOD }) Loading