summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2022-09-23 00:49:03 +0800
committer Riddle Hsu <riddlehsu@google.com> 2022-09-23 06:28:31 +0000
commit62d45d60c26bb5e3c50a43f276f183b2ef798db6 (patch)
treecc855a3b94d70fd6cf2dbe0016771db27103cad5
parent4dc756781afb8c298554e0c26a89cc66459d2881 (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.java6
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java9
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)