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

Commit a3f4d6bf authored by Matt Pietal's avatar Matt Pietal Committed by Mohammed Althaf T
Browse files

Remove all pending keyguard exits on SHOW

Noticed during rapid requests to enabled/disable keyguard,
prevent any preexisting requests to hide or dismiss keyguard
from running when a SHOW message is handled. Reset goingAway,
and also make sure to prevent any WM callbacks in flight from
continuing.

Test: atest KeyguardViewMediatorTest
Bug: 395640609
Bug: 419095873
Flag: EXEMPT bugfix
(cherry picked from commit 8853b2c7)
Cherrypick-From: https://googleplex-android-review.googlesource.com/q/commit:a1774adb8385c3e275e10b0395c4089d26adf87f
Merged-In: I732fb7d577a5f4c65c8d84cc66a61f5006ed8d53
Change-Id: I732fb7d577a5f4c65c8d84cc66a61f5006ed8d53
parent 5a30bf02
Loading
Loading
Loading
Loading
+39 −4
Original line number Diff line number Diff line
@@ -466,6 +466,13 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
     */
    private boolean mHiding;

    /**
     * Tracks SHOW/HIDE requests, in order to determine if a HIDE request show be completed after a
     * series of binder calls returns from WM.
     */
    private int mLastShowRequest = 0;
    private int mLastHideRequest = 0;

    /**
     * we send this intent when the keyguard is dismissed.
     */
@@ -2024,6 +2031,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
                mNeedToReshowWhenReenabled = false;
                updateInputRestrictedLocked();

                mHandler.removeMessages(HIDE);
                mHandler.removeMessages(START_KEYGUARD_EXIT_ANIM);
                showKeyguard(null);

                // block until we know the keyguard is done drawing (and post a message
@@ -2416,6 +2425,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
        if (DEBUG) Log.d(TAG, "showKeyguard");
        // ensure we stay awake until we are finished displaying the keyguard
        mShowKeyguardWakeLock.acquire();
        mLastShowRequest++;
        Message msg = mHandler.obtainMessage(SHOW, options);
        // Treat these messages with priority - This call can originate from #doKeyguardTimeout,
        // meaning the device may lock, so it shouldn't wait for other messages on the thread to
@@ -2428,7 +2438,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
     * Send message to keyguard telling it to hide itself
     * @see #handleHide()
     */
    private void hideLocked() {
    @VisibleForTesting
    void hideLocked() {
        Trace.beginSection("KeyguardViewMediator#hideLocked");
        if (DEBUG) Log.d(TAG, "hideLocked");
        Message msg = mHandler.obtainMessage(HIDE);
@@ -2891,6 +2902,14 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
            setShowingLocked(true, hidingOrGoingAway /* force */);
            mHiding = false;

            // Any valid exit animation will set this to false before proceeding
            mIsKeyguardExitAnimationCanceled = true;
            // Make sure to remove any pending exit animation requests that would override a SHOW
            mHandler.removeMessages(START_KEYGUARD_EXIT_ANIM);
            mHandler.removeMessages(HIDE);
            mShadeController.get().instantCollapseShade();
            mKeyguardStateController.notifyKeyguardGoingAway(false);

            if (!KeyguardWmStateRefactor.isEnabled()) {
                // Handled directly in StatusBarKeyguardViewManager if enabled.
                mKeyguardViewControllerLazy.get().show(options);
@@ -3055,6 +3074,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
        synchronized (KeyguardViewMediator.this) {
            if (DEBUG) Log.d(TAG, "handleHide");

            mLastHideRequest = mLastShowRequest;
            // If waking and unlocking, waking from dream has been set properly.
            if (!mWakeAndUnlocking) {
                setUnlockAndWakeFromDream(mStatusBarStateController.isDreaming()
@@ -3068,6 +3088,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
                mHiding = true;
                mKeyguardGoingAwayRunnable.run();
            } else {
                mGoingAwayRequestedForUserId = KeyguardUpdateMonitor.getCurrentUser();

                Log.d(TAG, "Hiding keyguard while occluded. Just hide the keyguard view and exit.");

                if (!KeyguardWmStateRefactor.isEnabled()) {
@@ -3096,11 +3118,22 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
        Log.d(TAG, "handleStartKeyguardExitAnimation startTime=" + startTime
                + " fadeoutDuration=" + fadeoutDuration);
        int currentUserId = KeyguardUpdateMonitor.getCurrentUser();

        // Requests to exit directly from WM are valid if the lockscreen can be dismissed
        if (mKeyguardStateController.canDismissLockScreen()) {
            mLastHideRequest = mLastShowRequest;
        }

        String error = null;
        if (mGoingAwayRequestedForUserId != currentUserId) {
            Log.e(TAG, "Not executing handleStartKeyguardExitAnimationInner() due to userId "
            error = "Not executing handleStartKeyguardExitAnimationInner() due to userId "
                    + "mismatch. Requested: " + mGoingAwayRequestedForUserId + ", current: "
                    + currentUserId);
            mIsKeyguardExitAnimationCanceled = true;
                    + currentUserId;
        } else if (mLastHideRequest != mLastShowRequest) {
            error = "Show requested after hide, cancel animation";
        }
        if (error != null) {
            Log.e(TAG, error);
            if (finishedCallback != null) {
                // There will not execute animation, send a finish callback to ensure the remote
                // animation won't hang there.
@@ -3467,6 +3500,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
            if (mKeyguardUnlockAnimationControllerLazy.get().isSupportedLauncherUnderneath()) {
                flags |= KEYGUARD_GOING_AWAY_FLAG_TO_LAUNCHER_CLEAR_SNAPSHOT;
            }
            mLastHideRequest = mLastShowRequest;
            mIsKeyguardExitAnimationCanceled = false;

            if (!KeyguardWmStateRefactor.isEnabled()) {
                // Handled in WmLockscreenVisibilityManager.
+2 −1
Original line number Diff line number Diff line
@@ -1183,7 +1183,8 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
        IRemoteAnimationFinishedCallback callback = mock(IRemoteAnimationFinishedCallback.class);

        when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(true);
        mViewMediator.mKeyguardGoingAwayRunnable.run();
        mViewMediator.hideLocked();
        processAllMessagesAndBgExecutorMessages();
        mViewMediator.startKeyguardExitAnimation(TRANSIT_OLD_KEYGUARD_GOING_AWAY, apps, wallpapers,
                null, callback);
        processAllMessagesAndBgExecutorMessages();