From b509f92e499b1cf049bca60e49a263e95613b130 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 16 Jun 2022 20:06:20 +0800 Subject: 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 --- services/core/java/com/android/server/wm/WindowState.java | 4 +++- .../wmtests/src/com/android/server/wm/WindowStateTests.java | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) 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 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}) -- cgit v1.2.3-59-g8ed1b