diff options
| author | 2022-06-16 20:06:20 +0800 | |
|---|---|---|
| committer | 2022-06-16 20:07:52 +0800 | |
| commit | b509f92e499b1cf049bca60e49a263e95613b130 (patch) | |
| tree | 43468bd4908ac00a9778803193fd94fd4e628b08 | |
| parent | 12e599047cb257ca9f4b45717eae57b10529ba4c (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.java | 4 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java | 9 |
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}) |