summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/InsetsSourceProvider.java6
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java26
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");