diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index a159984ddcd35..56efafba4640f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1651,14 +1651,19 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, Trace.endSection(); } - /** Hide the keyguard and let {@code runner} handle the animation. */ + /** + * Hide the keyguard and let {@code runner} handle the animation. + * + * This method should typically be called after {@link ViewMediatorCallback#keyguardDonePending} + * was called, when we are ready to hide the keyguard. + */ public void hideWithAnimation(IRemoteAnimationRunner runner) { - if (!mShowing) { + if (!mKeyguardDonePending) { return; } mKeyguardExitAnimationRunner = runner; - hideLocked(); + mViewMediatorCallback.readyForKeyguardDone(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 06aedaa5d06ed..09779d12f7b34 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -2118,7 +2118,12 @@ public class StatusBar extends SystemUI implements DemoMode, return; } - mKeyguardViewMediator.hideWithAnimation(runner); + // We post to the main thread for 2 reasons: + // 1. KeyguardViewMediator is not thread-safe. + // 2. To ensure that ViewMediatorCallback#keyguardDonePending is called before + // ViewMediatorCallback#readyForKeyguardDone. The wrong order could occur when doing + // dismissKeyguardThenExecute { hideKeyguardWithAnimation(runner) }. + mMainThreadHandler.post(() -> mKeyguardViewMediator.hideWithAnimation(runner)); } @Override