Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 62d45d60 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

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
parent 4dc75678
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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);
            // 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
+9 −0
Original line number Diff line number Diff line
@@ -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)