From 6d22064dcd921081d3b77e5085fe4bef5ce27a39 Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Tue, 8 Jun 2021 17:31:22 +0200 Subject: [PATCH] Call KeyguardViewMediator#hideWithAnimation on the main thread This CL ensures that we call KeyguardViewMediator#hideWithAnimation on the main thread when animating an app launch. This CL also changes how this method operates: it now relies on #keyguardDonePending being called beforehand. This ensures that keyguardDone() is actually called before hiding the keyguard, which was not the case with the previous implementation. Bug: 184726377 Test: Click a notification on lockscreen (without security) Change-Id: Ic391e28066282e059e57cc50c5191e50ca7df06e --- .../systemui/keyguard/KeyguardViewMediator.java | 11 ++++++++--- .../android/systemui/statusbar/phone/StatusBar.java | 7 ++++++- 2 files changed, 14 insertions(+), 4 deletions(-) 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