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

Commit 6102ee30 authored by Coco Duan's avatar Coco Duan
Browse files

Fix screen getting relocked after unlocking once and wallpaper dream has stopped

For windowless dream, onAppTransitionFinishedLocked is not
called when dreaming starts like other dreams, so
mLockAfterAppTransitionFinished flag remains true.
When user unlocked via bouncer and dreaming stopped,
onAppTransitionFinishedLocked got called and lockNow would
then be called to relock the screen.

Fix is to add isDreaming check so when dreaming has stopped,
we won't call lockNow.
Renamed the variable to mLockAfterDreamingTransitionFinished
as it is only used by power button press to start dreaming.

Bug: b/285059622
Test: atest PowerKeyGestureTests; manual
Change-Id: Iceeb2ac97514600bd9a52439282496a38c387b98
parent aa15d011
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -600,8 +600,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    // What we do when the user double-taps on home
    private int mDoubleTapOnHomeBehavior;

    // Whether to lock the device after the next app transition has finished.
    boolean mLockAfterAppTransitionFinished;
    // Whether to lock the device after the next dreaming transition has finished.
    private boolean mLockAfterDreamingTransitionFinished;

    // Allowed theater mode wake actions
    private boolean mAllowTheaterModeWakeFromKey;
@@ -1104,7 +1104,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        synchronized (mLock) {
            // If the setting to lock instantly on power button press is true, then set the flag to
            // lock after the dream transition has finished.
            mLockAfterAppTransitionFinished =
            mLockAfterDreamingTransitionFinished =
                    mLockPatternUtils.getPowerButtonInstantlyLocks(mCurrentUserId);
        }

@@ -2253,20 +2253,22 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                        true /* notifyOccluded */);

                synchronized (mLock) {
                    mLockAfterAppTransitionFinished = false;
                    mLockAfterDreamingTransitionFinished = false;
                }
            }

            @Override
            public void onAppTransitionFinishedLocked(IBinder token) {
                synchronized (mLock) {
                    if (!mLockAfterAppTransitionFinished) {
                        return;
                    final DreamManagerInternal dreamManagerInternal = getDreamManagerInternal();
                    // check both isDreaming and mLockAfterDreamingTransitionFinished before lockNow
                    // so it won't relock after dreaming has stopped
                    if (dreamManagerInternal != null && dreamManagerInternal.isDreaming()
                            && mLockAfterDreamingTransitionFinished) {
                        lockNow(null);
                    }
                    mLockAfterAppTransitionFinished = false;
                    mLockAfterDreamingTransitionFinished = false;
                }

                lockNow(null);
            }
        });

+12 −1
Original line number Diff line number Diff line
@@ -58,9 +58,20 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase {
        mPhoneWindowManager.overrideCanStartDreaming(true);
        sendKey(KEYCODE_POWER);
        mPhoneWindowManager.assertDreamRequest();
        mPhoneWindowManager.overrideIsDreaming(true);
        mPhoneWindowManager.assertLockedAfterAppTransitionFinished();
    }

    @Test
    public void testAppTransitionFinishedCalledAfterDreamStoppedWillNotLockAgain() {
        mPhoneWindowManager.overrideShortPressOnPower(SHORT_PRESS_POWER_DREAM_OR_SLEEP);
        mPhoneWindowManager.overrideCanStartDreaming(true);
        sendKey(KEYCODE_POWER);
        mPhoneWindowManager.assertDreamRequest();
        mPhoneWindowManager.overrideIsDreaming(false);
        mPhoneWindowManager.assertDidNotLockAfterAppTransitionFinished();
    }

    /**
     * Power double-press to launch camera does not lock device when the single press behavior is to
     * dream.
@@ -72,7 +83,7 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase {
        sendKey(KEYCODE_POWER);
        sendKey(KEYCODE_POWER);
        mPhoneWindowManager.assertCameraLaunch();
        mPhoneWindowManager.assertWillNotLockAfterAppTransitionFinished();
        mPhoneWindowManager.assertDidNotLockAfterAppTransitionFinished();
    }

    /**
+17 −5
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ import android.hardware.display.DisplayManagerInternal;
import android.media.AudioManagerInternal;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.PowerManagerInternal;
import android.os.RemoteException;
@@ -344,6 +345,10 @@ class TestPhoneWindowManager {
        doReturn(canDream).when(mDreamManagerInternal).canStartDreaming(anyBoolean());
    }

    void overrideIsDreaming(boolean isDreaming) {
        doReturn(isDreaming).when(mDreamManagerInternal).isDreaming();
    }

    void overrideDisplayState(int state) {
        doReturn(state).when(mDisplay).getState();
        doReturn(state == STATE_ON).when(mDisplayPolicy).isAwake();
@@ -520,19 +525,26 @@ class TestPhoneWindowManager {
        verify(mInputManagerInternal).toggleCapsLock(anyInt());
    }

    void assertWillNotLockAfterAppTransitionFinished() {
        Assert.assertFalse(mPhoneWindowManager.mLockAfterAppTransitionFinished);
    }

    void assertLockedAfterAppTransitionFinished() {
        ArgumentCaptor<AppTransitionListener> transitionCaptor =
                ArgumentCaptor.forClass(AppTransitionListener.class);
        verify(mWindowManagerInternal).registerAppTransitionListener(
                transitionCaptor.capture());
        transitionCaptor.getValue().onAppTransitionFinishedLocked(any());
        final IBinder token = mock(IBinder.class);
        transitionCaptor.getValue().onAppTransitionFinishedLocked(token);
        verify(mPhoneWindowManager).lockNow(null);
    }

    void assertDidNotLockAfterAppTransitionFinished() {
        ArgumentCaptor<AppTransitionListener> transitionCaptor =
                ArgumentCaptor.forClass(AppTransitionListener.class);
        verify(mWindowManagerInternal).registerAppTransitionListener(
                transitionCaptor.capture());
        final IBinder token = mock(IBinder.class);
        transitionCaptor.getValue().onAppTransitionFinishedLocked(token);
        verify(mPhoneWindowManager, never()).lockNow(null);
    }

    void assertGoToHomescreen() {
        waitForIdle();
        verify(mPhoneWindowManager).launchHomeFromHotKey(anyInt());