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

Commit 0687f9d3 authored by Louis Chang's avatar Louis Chang
Browse files

Prevents activity being stopped while folding/unfolding device

Display is turning off while swapping the physical display,
usually happens while folding/unfolding a foldable device. The
display will be turn back on after some time later, but the top
activity could be stopped if the display is not turning back on
soon enough.

Bug: 271098735
Test: tested on Youtube and some other apps
Change-Id: I687f35f4989f9e23276451c9b3a3ce8578e64280
parent 1ce89ea1
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2228,14 +2228,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                && !mScreenOffBecauseOfProximity) {
            setReportedScreenState(REPORTED_TO_POLICY_SCREEN_OFF);
            unblockScreenOn();
            mWindowManagerPolicy.screenTurnedOff(mDisplayId);
            mWindowManagerPolicy.screenTurnedOff(mDisplayId, mIsInTransition);
        } else if (!isOff
                && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_TURNING_OFF) {

            // We told policy already that screen was turning off, but now we changed our minds.
            // Complete the full state transition on -> turningOff -> off.
            unblockScreenOff();
            mWindowManagerPolicy.screenTurnedOff(mDisplayId);
            mWindowManagerPolicy.screenTurnedOff(mDisplayId, mIsInTransition);
            setReportedScreenState(REPORTED_TO_POLICY_SCREEN_OFF);
        }
        if (!isOff
+2 −2
Original line number Diff line number Diff line
@@ -1859,14 +1859,14 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
                && !mDisplayPowerProximityStateController.isScreenOffBecauseOfProximity()) {
            setReportedScreenState(REPORTED_TO_POLICY_SCREEN_OFF);
            unblockScreenOn();
            mWindowManagerPolicy.screenTurnedOff(mDisplayId);
            mWindowManagerPolicy.screenTurnedOff(mDisplayId, mIsInTransition);
        } else if (!isOff
                && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_TURNING_OFF) {

            // We told policy already that screen was turning off, but now we changed our minds.
            // Complete the full state transition on -> turningOff -> off.
            unblockScreenOff();
            mWindowManagerPolicy.screenTurnedOff(mDisplayId);
            mWindowManagerPolicy.screenTurnedOff(mDisplayId, mIsInTransition);
            setReportedScreenState(REPORTED_TO_POLICY_SCREEN_OFF);
        }
        if (!isOff
+5 −5
Original line number Diff line number Diff line
@@ -5001,11 +5001,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {

    // Called on the DisplayManager's DisplayPowerController thread.
    @Override
    public void screenTurnedOff(int displayId) {
    public void screenTurnedOff(int displayId, boolean isSwappingDisplay) {
        if (DEBUG_WAKEUP) Slog.i(TAG, "Display" + displayId + " turned off...");

        if (displayId == DEFAULT_DISPLAY) {
            updateScreenOffSleepToken(true);
            updateScreenOffSleepToken(true, isSwappingDisplay);
            mRequestedOrSleepingDefaultDisplay = false;
            mDefaultDisplayPolicy.screenTurnedOff();
            synchronized (mLock) {
@@ -5056,7 +5056,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        if (displayId == DEFAULT_DISPLAY) {
            Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn",
                    0 /* cookie */);
            updateScreenOffSleepToken(false);
            updateScreenOffSleepToken(false /* acquire */, false /* isSwappingDisplay */);
            mDefaultDisplayPolicy.screenTurnedOn(screenOnListener);
            mBootAnimationDismissable = false;

@@ -5575,9 +5575,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    }

    // TODO (multidisplay): Support multiple displays in WindowManagerPolicy.
    private void updateScreenOffSleepToken(boolean acquire) {
    private void updateScreenOffSleepToken(boolean acquire, boolean isSwappingDisplay) {
        if (acquire) {
            mScreenOffSleepTokenAcquirer.acquire(DEFAULT_DISPLAY);
            mScreenOffSleepTokenAcquirer.acquire(DEFAULT_DISPLAY, isSwappingDisplay);
        } else {
            mScreenOffSleepTokenAcquirer.release(DEFAULT_DISPLAY);
        }
+3 −1
Original line number Diff line number Diff line
@@ -835,8 +835,10 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {

    /**
     * Called when the display has turned off.
     * @param displayId The display to apply to.
     * @param isSwappingDisplay Whether the display is swapping to another physical display.
     */
    public void screenTurnedOff(int displayId);
    void screenTurnedOff(int displayId, boolean isSwappingDisplay);

    public interface ScreenOnListener {
        void onScreenOn();
+10 −0
Original line number Diff line number Diff line
@@ -8525,6 +8525,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        return inTransitionSelfOrParent();
    }

    boolean isDisplaySleepingAndSwapping() {
        for (int i = mDisplayContent.mAllSleepTokens.size() - 1; i >= 0; i--) {
            RootWindowContainer.SleepToken sleepToken = mDisplayContent.mAllSleepTokens.get(i);
            if (sleepToken.isDisplaySwapping()) {
                return true;
            }
        }
        return false;
    }

    /**
     * Whether this activity is letterboxed for fixed orientation. If letterboxed due to fixed
     * orientation then aspect ratio restrictions are also already respected.
Loading