diff options
| author | 2022-02-28 19:21:54 +0000 | |
|---|---|---|
| committer | 2022-02-28 19:21:54 +0000 | |
| commit | fc94de68479fd62efc4070ea95f5692c064b9012 (patch) | |
| tree | 53c48477f81233e7a699247c4c9ed91cbf524495 | |
| parent | 9c7fdd7efa2680a1192b03eaa4600eac1e5624a2 (diff) | |
| parent | 7172089cfd22ae5a0a4d13dbb96f58654e8b35e8 (diff) | |
Merge "Fix sleep during launch animation resulting in a unlocked device." into tm-dev
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 07dfa33620a0..c01d2c316a93 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1667,11 +1667,16 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, return; } - // if the keyguard is already showing, don't bother. check flags in both files - // to account for the hiding animation which results in a delay and discrepancy - // between flags - if (mShowing && mKeyguardViewControllerLazy.get().isShowing()) { - if (DEBUG) Log.d(TAG, "doKeyguard: not showing because it is already showing"); + // If the keyguard is already showing, don't bother unless it was in the process of going + // away. If it was going away, keyguard state may be out of sync and we should make sure to + // re-show it explicitly. Check flags in both files to account for the hiding animation + // which results in a delay and discrepancy between flags. + if ((mShowing && mKeyguardViewControllerLazy.get().isShowing()) + && !mKeyguardStateController.isKeyguardGoingAway()) { + if (DEBUG) { + Log.d(TAG, "doKeyguard: not showing " + + "because it is already showing and not going away"); + } resetStateLocked(); return; } @@ -2186,7 +2191,14 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, mKeyguardExitAnimationRunner = null; mScreenOnCoordinator.setWakeAndUnlocking(false); mPendingLock = false; - setShowingLocked(true); + + // If we're asked to re-show while the keyguard is going away, force callbacks to ensure + // that state is re-set correctly. Otherwise, we might short circuit since mShowing is + // true during the keyguard going away process, despite having partially set some state + // to unlocked. + setShowingLocked( + true, mKeyguardStateController.isKeyguardGoingAway() /* forceCallbacks */); + mKeyguardViewControllerLazy.get().show(options); resetKeyguardDonePendingLocked(); mHideAnimationRun = false; @@ -2356,14 +2368,28 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, @Override public void onAnimationFinished() throws RemoteException { try { + // WindowManager always needs to know that this animation + // finished so it does not wait the 10s until timeout. finishedCallback.onAnimationFinished(); } catch (RemoteException e) { Slog.w(TAG, "Failed to call onAnimationFinished", e); } - onKeyguardExitFinished(); - mKeyguardViewControllerLazy.get().hide(0 /* startTime */, - 0 /* fadeoutDuration */); - mInteractionJankMonitor.end(CUJ_LOCKSCREEN_UNLOCK_ANIMATION); + + // If we're not interactive, it means the device is going back to + // sleep. This happens if the power button is pressed during the + // activity launch. If we're going back to sleep, we should *not* + // run keyguard exit finished callbacks and hide the keyguard, since + // we are in the process of locking again and this might result in + // the device staying unlocked when it shouldn't. + // We need to directly query isInteractive rather than mGoingToSleep + // because mGoingToSleep is set in onStartedGoingToSleep, which is + // dispatched asynchronously. + if (mPM.isInteractive()) { + onKeyguardExitFinished(); + mKeyguardViewControllerLazy.get().hide(0 /* startTime */, + 0 /* fadeoutDuration */); + mInteractionJankMonitor.end(CUJ_LOCKSCREEN_UNLOCK_ANIMATION); + } } @Override |