summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java46
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