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
This commit is contained in:
Riddle Hsu
2022-09-23 00:49:03 +08:00
parent 4dc756781a
commit 62d45d60c2
2 changed files with 14 additions and 1 deletions

View File

@@ -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

View File

@@ -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)