diff options
6 files changed, 42 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index 4f8332a49750..9e6468020fc0 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -162,6 +162,12 @@ class InsetsSourceProvider { return mSource; } + @VisibleForTesting + @NonNull + Rect getSourceFrame() { + return mSourceFrame; + } + /** * @return Whether the current flag configuration allows to control this source. */ diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 0e3ab63aefb9..ab8384601f8f 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1378,6 +1378,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // should be updated after the new given insets are sent to window manager. return; } + if (!mRelayoutCalled) { + // The window was not laid out yet. The source frame should be updated after the window + // is laid out. + return; + } final SparseArray<InsetsSourceProvider> providers = getInsetsSourceProviders(); for (int i = providers.size() - 1; i >= 0; i--) { providers.valueAt(i).updateSourceFrame(winFrame); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java index 7a0961d8c306..1015651438c3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java @@ -84,6 +84,7 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { // Disabling this call for most tests since it can override the systemUiFlags when called. doNothing().when(mDisplayPolicy).updateSystemBarAttributes(); + makeWindowVisible(mStatusBarWindow, mNavBarWindow); updateDisplayFrames(); } @@ -154,6 +155,7 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { }; addWindow(win); win.getFrame().set(0, 0, 500, 100); + makeWindowVisible(win); win.updateSourceFrame(win.getFrame()); mDisplayContent.getInsetsStateController().onPostLayout(); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java index 6a89178ec9bf..3bd57475614f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java @@ -540,6 +540,7 @@ public class DisplayPolicyTests extends WindowTestsBase { final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy(); mDisplayContent.setInputMethodWindowLocked(mImeWindow); + makeWindowVisible(mImeWindow); mImeWindow.getControllableInsetProvider().setServerVisible(true); mImeWindow.mGivenContentInsets.set(0, 10, 0, 0); diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index d0d7c06bd706..66a66a1e358b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -291,6 +291,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime"); + makeWindowVisible(statusBar); + // IME cannot be the IME target. ime.mAttrs.flags |= FLAG_NOT_FOCUSABLE; diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index 2d5e5dacc217..e7e184c537f7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -483,6 +483,32 @@ public class WindowStateTests extends WindowTestsBase { assertFalse(statusBar.isVisible()); } + /** + * Verifies that the InsetsSourceProvider frame cannot be updated by WindowState before + * relayout is called. + */ + @SetupWindows(addWindows = { W_STATUS_BAR }) + @Test + public void testUpdateSourceFrameBeforeRelayout() { + final WindowState statusBar = mStatusBarWindow; + statusBar.mHasSurface = true; + assertTrue(statusBar.isVisible()); + final int statusBarId = InsetsSource.createId(null, 0, statusBars()); + final var statusBarProvider = mDisplayContent.getInsetsStateController() + .getOrCreateSourceProvider(statusBarId, statusBars()); + statusBarProvider.setWindowContainer(statusBar, null /* frameProvider */, + null /* imeFrameProvider */); + + statusBar.updateSourceFrame(new Rect(0, 0, 500, 200)); + assertTrue("InsetsSourceProvider frame should not be updated before relayout", + statusBarProvider.getSourceFrame().isEmpty()); + + makeWindowVisible(statusBar); + statusBar.updateSourceFrame(new Rect(0, 0, 500, 100)); + assertEquals("InsetsSourceProvider frame should be updated after relayout", + new Rect(0, 0, 500, 100), statusBarProvider.getSourceFrame()); + } + @Test public void testIsSelfOrAncestorWindowAnimating() { final WindowState root = createWindow(null, TYPE_APPLICATION, "root"); |