diff options
| author | 2021-06-10 15:05:04 +0200 | |
|---|---|---|
| committer | 2021-06-14 12:00:01 +0200 | |
| commit | d5c5517416c9e7aee7412cf2b9dda4f1992f9a0c (patch) | |
| tree | 517679f1e1321e2c2e686bb637f15aff63f071ca | |
| parent | e55a9d90364890850d71d14582274f392ba1e544 (diff) | |
Animate launches from lockscreen
Bug: 172048407
Test: Tap notification, media, QS, etc from lockscreen
Change-Id: I361aadc18b24375173f3bcea9dc1de0c13c803df
6 files changed, 39 insertions, 24 deletions
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java index 47a373ebf429..298b7c38066b 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java @@ -87,7 +87,9 @@ public interface ActivityStarter { interface OnDismissAction { /** - * @return {@code true} if the dismiss should be deferred + * @return {@code true} if the dismiss should be deferred. When returning true, make sure to + * call {@link com.android.keyguard.ViewMediatorCallback#readyForKeyguardDone()} + * *after* returning to start hiding the keyguard. */ boolean onDismiss(); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index f0d7d833a9fb..327698392ac7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1655,7 +1655,8 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, * 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. + * was called, when we are ready to hide the keyguard. It will do nothing if we were not + * expecting the keyguard to go away when called. */ public void hideWithAnimation(IRemoteAnimationRunner runner) { if (!mKeyguardDonePending) { @@ -2022,6 +2023,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, } mHiding = false; + mKeyguardExitAnimationRunner = null; mWakeAndUnlocking = false; mPendingLock = false; setShowingLocked(true); @@ -2157,6 +2159,8 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, return; } mHiding = false; + IRemoteAnimationRunner runner = mKeyguardExitAnimationRunner; + mKeyguardExitAnimationRunner = null; if (mWakeAndUnlocking && mDrawnCallback != null) { @@ -2177,9 +2181,6 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, LatencyTracker.getInstance(mContext) .onActionEnd(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK); - IRemoteAnimationRunner runner = mKeyguardExitAnimationRunner; - mKeyguardExitAnimationRunner = null; - if (KeyguardService.sEnableRemoteKeyguardGoingAwayAnimation && runner != null && finishedCallback != null) { // Wrap finishedCallback to clean up the keyguard state once the animation is done. @@ -2187,7 +2188,11 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, new IRemoteAnimationFinishedCallback() { @Override public void onAnimationFinished() throws RemoteException { - finishedCallback.onAnimationFinished(); + try { + finishedCallback.onAnimationFinished(); + } catch (RemoteException e) { + Slog.w(TAG, "Failed to call onAnimationFinished", e); + } onKeyguardExitFinished(); mKeyguardViewControllerLazy.get().hide(0 /* startTime */, 0 /* fadeoutDuration */); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index da37aa5ac943..b5e550a47022 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -288,10 +288,19 @@ public class KeyguardBouncer { public void showWithDismissAction(OnDismissAction r, Runnable cancelAction) { ensureView(); - mKeyguardViewController.setOnDismissAction(r, cancelAction); + setDismissAction(r, cancelAction); show(false /* resetSecuritySelection */); } + /** + * Set the actions to run when the keyguard is dismissed or when the dismiss is cancelled. Those + * actions will still be run even if this bouncer is not shown, for instance when authenticating + * with an alternate authenticator like the UDFPS. + */ + public void setDismissAction(OnDismissAction r, Runnable cancelAction) { + mKeyguardViewController.setOnDismissAction(r, cancelAction); + } + public void hide(boolean destroyView) { if (isShowing()) { SysUiStatsLog.write(SysUiStatsLog.KEYGUARD_BOUNCER_STATE_CHANGED, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 32e3eb0d2bbd..c5ef7b9bc472 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -3586,11 +3586,6 @@ public class NotificationPanelViewController extends PanelViewController { * security view of the bouncer. */ public void onBouncerPreHideAnimation() { - mKeyguardStatusViewController.setKeyguardStatusViewVisibility( - mBarState, - true /* keyguardFadingAway */, - false /* goingToFullShade */, - mBarState); if (mKeyguardQsUserSwitchController != null) { mKeyguardQsUserSwitchController.setKeyguardQsUserSwitchVisibility( mBarState, 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 c03aa1f5bdbc..4e77bf702ffb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -2096,13 +2096,10 @@ public class StatusBar extends SystemUI implements DemoMode, return true; } - // If we are locked, only animate if remote unlock animations are enabled and we can dismiss - // the lock screen without challenging the user. We also don't animate non-activity - // launches as they can break the animation. + // If we are locked, only animate if remote unlock animations are enabled. We also don't + // animate non-activity launches as they can break the animation. // TODO(b/184121838): Support non activity launches on the lockscreen. - return isActivityIntent - && KeyguardService.sEnableRemoteKeyguardGoingAwayAnimation - && mKeyguardStateController.canDismissLockScreen(); + return isActivityIntent && KeyguardService.sEnableRemoteKeyguardGoingAwayAnimation; } @Override @@ -2112,12 +2109,6 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void hideKeyguardWithAnimation(IRemoteAnimationRunner runner) { - if (!mKeyguardStateController.canDismissLockScreen()) { - Log.wtf(TAG, - "Unable to hide keyguard with animation as the keyguard can't be dismissed"); - return; - } - // We post to the main thread for 2 reasons: // 1. KeyguardViewMediator is not thread-safe. // 2. To ensure that ViewMediatorCallback#keyguardDonePending is called before diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 29bb1f4ac7c6..c7efcb2923e7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -447,7 +447,16 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mAfterKeyguardGoneAction = r; mKeyguardGoneCancelAction = cancelAction; + + // If there is an an alternate auth interceptor (like the UDFPS), show that one instead + // of the bouncer. if (mAlternateAuthInterceptor != null) { + if (!afterKeyguardGone) { + mBouncer.setDismissAction(mAfterKeyguardGoneAction, mKeyguardGoneCancelAction); + mAfterKeyguardGoneAction = null; + mKeyguardGoneCancelAction = null; + } + if (mAlternateAuthInterceptor.showAlternateAuthBouncer()) { mStatusBar.updateScrimController(); } @@ -615,6 +624,10 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb if (mBouncer.isShowing()) { mBouncer.startPreHideAnimation(finishRunnable); mStatusBar.onBouncerPreHideAnimation(); + + // startPreHideAnimation() will change the visibility of the bouncer, so we have to + // make sure to update its state. + updateStates(); } else if (finishRunnable != null) { finishRunnable.run(); } |