diff options
| author | 2022-09-23 00:49:03 +0800 | |
|---|---|---|
| committer | 2022-09-23 06:28:31 +0000 | |
| commit | 62d45d60c26bb5e3c50a43f276f183b2ef798db6 (patch) | |
| tree | cc855a3b94d70fd6cf2dbe0016771db27103cad5 | |
| parent | 4dc756781afb8c298554e0c26a89cc66459d2881 (diff) | |
Do not set orientation changing to invisible window
Otherwise WindowState#updateResizingWindowIfNeeded will reset the
draw state to DRAW_PENDING and WindowState#reportResized skips
it because !mToken.isVisibleRequested(). Then the window won't
report finish draw to update the draw state, which causes its
surface keeps invisible.
Bug: 247368175
Test: WindowStateTests#testRequestDrawIfNeeded
Change-Id: I9394e20dd52132c039328ce988c99b9630b16bf6
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowManagerService.java | 6 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java | 9 |
2 files changed, 14 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 66c962d855b7..b1f700dedc38 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -5988,7 +5988,11 @@ public class WindowManagerService extends IWindowManager.Stub if (mFrozenDisplayId != INVALID_DISPLAY && mFrozenDisplayId == w.getDisplayId() && mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_TIMEOUT) { ProtoLog.v(WM_DEBUG_ORIENTATION, "Changing surface while display frozen: %s", w); - w.setOrientationChanging(true); + // WindowsState#reportResized won't tell invisible requested window to redraw, + // so do not set it as changing orientation to avoid affecting draw state. + if (w.isVisibleRequested()) { + w.setOrientationChanging(true); + } if (mWindowsFreezingScreen == WINDOWS_FREEZING_SCREENS_NONE) { mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_ACTIVE; // XXX should probably keep timeout from 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 cfc0da7a4a15..9bcc1367f8ab 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -731,6 +731,15 @@ public class WindowStateTests extends WindowTestsBase { assertTrue(mWm.mResizingWindows.contains(startingApp)); assertTrue(startingApp.isDrawn()); assertFalse(startingApp.getOrientationChanging()); + + // Even if the display is frozen, invisible requested window should not be affected. + startingApp.mActivityRecord.mVisibleRequested = false; + mWm.startFreezingDisplay(0, 0, mDisplayContent); + doReturn(true).when(mWm.mPolicy).isScreenOn(); + startingApp.getWindowFrames().setInsetsChanged(true); + startingApp.updateResizingWindowIfNeeded(); + assertTrue(startingApp.isDrawn()); + assertFalse(startingApp.getOrientationChanging()); } @UseTestDisplay(addWindows = W_ABOVE_ACTIVITY) |