summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2022-06-16 20:06:20 +0800
committer Riddle Hsu <riddlehsu@google.com> 2022-06-16 20:07:52 +0800
commitb509f92e499b1cf049bca60e49a263e95613b130 (patch)
tree43468bd4908ac00a9778803193fd94fd4e628b08
parent12e599047cb257ca9f4b45717eae57b10529ba4c (diff)
Do not set insets changed for invisible window
The visible-requested state of non-activity/wallpaper window is usually true because it doesn't consider token visibility and the policy visibility isn't hidden. Since insets change will also trigger reportResized if WindowFrames#hasInsetsChanged() returns true, the visible-requested state should be only used if the token of window implements isVisibleRequested(). Otherwise all invisible window will receive resize and report drawn for configuration change, such as display rotation. Fix: 236235776 Test: atest WindowStateTests#testSetFreezeInsetsState Test: adb shell wm logging enable-text WM_DEBUG_RESIZE Rotate screen, there is no log "Reporting new frame to" for invisible windows. Change-Id: Ibe34fa94e7cee7f9db460b0a205a87d0efe6a0f9
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java9
2 files changed, 12 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 3bb40b03a0a5..4c32edc6d709 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -884,7 +884,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
* {@link InsetsStateController#notifyInsetsChanged}.
*/
boolean isReadyToDispatchInsetsState() {
- return isVisibleRequested() && mFrozenInsetsState == null;
+ final boolean visible = shouldCheckTokenVisibleRequested()
+ ? isVisibleRequested() : isVisible();
+ return visible && mFrozenInsetsState == null;
}
void seamlesslyRotateIfAllowed(Transaction transaction, @Rotation int oldRotation,
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 e8f343e73256..20935f1d199e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -927,6 +927,15 @@ public class WindowStateTests extends WindowTestsBase {
assertTrue(app.isReadyToDispatchInsetsState());
mDisplayContent.getInsetsStateController().notifyInsetsChanged();
verify(app).notifyInsetsChanged();
+
+ // Verify that invisible non-activity window won't dispatch insets changed.
+ final WindowState overlay = createWindow(null, TYPE_APPLICATION_OVERLAY, "overlay");
+ makeWindowVisible(overlay);
+ assertTrue(overlay.isReadyToDispatchInsetsState());
+ overlay.mHasSurface = false;
+ assertFalse(overlay.isReadyToDispatchInsetsState());
+ mDisplayContent.getInsetsStateController().notifyInsetsChanged();
+ assertFalse(overlay.getWindowFrames().hasInsetsChanged());
}
@UseTestDisplay(addWindows = {W_INPUT_METHOD, W_ACTIVITY})