From ba19f3166997b95c0784d2c67a632e5b2e2a72a1 Mon Sep 17 00:00:00 2001 From: Mike Schneider Date: Wed, 22 Mar 2023 14:26:25 +0100 Subject: [PATCH] Auto-stash taskbar when locking device This greatly reduces the the jank of the taskbar being shown above the lockscreen. Before: http://shortn/_PhXhkWR73t After: http://shortn/_MC3ZLGHp4o Bug: 264604213 Test: manual (http://shortn/_ISEXThUFM2), tapl Change-Id: Ib1c5dbaafd4d0e1d69fbc03d908632e0275c8a0b --- .../taskbar/TaskbarKeyguardController.java | 4 +++- .../TaskbarLauncherStateController.java | 9 ++++++-- .../taskbar/TaskbarStashController.java | 22 ++++++++++++++----- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java index 8cc8965d53..edcd4c8019 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java @@ -5,6 +5,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SCREEN_STATE_ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BACK_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DOZING; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DREAMING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_ON; @@ -34,7 +35,8 @@ public class TaskbarKeyguardController implements TaskbarControllers.LoggableTas // locked. public static final int MASK_ANY_SYSUI_LOCKED = SYSUI_STATE_BOUNCER_SHOWING | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING - | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED; + | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED + | SYSUI_STATE_DEVICE_DREAMING; private final TaskbarActivityContext mContext; private int mKeyguardSysuiFlags; diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java index d997f56a16..cf8148e6c6 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -457,8 +457,13 @@ public class TaskbarLauncherStateController { animatorSet.play(mTaskbarCornerRoundness.animateToValue(cornerRoundness)); } - if (hasAnyFlag(changedFlags, FLAG_DEVICE_LOCKED)) { - // When transitioning between locked/unlocked, there is no stashing animation. + // Keep isUnlockTransition in sync with its counterpart in + // TaskbarStashController#createAnimToIsStashed. + boolean isUnlockTransition = + hasAnyFlag(changedFlags, FLAG_DEVICE_LOCKED) && !hasAnyFlag(FLAG_DEVICE_LOCKED); + if (isUnlockTransition) { + // When transitioning to unlocked, ensure the hotseat is fully visible from the + // beginning. The hotseat itself is animated by LauncherUnlockAnimationController. mIconAlignment.cancelAnimation(); // updateValue ensures onIconAlignmentRatioChanged will be called if there is an actual // change in value diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index d26fbc4459..123d7a1da8 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -586,9 +586,12 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba // already stashed Taskbar. boolean hotseatTopElement = mControllers.uiController.isHotseatIconOnTopWhenAligned() || !hasAnyFlag(changedFlags, FLAG_IN_APP); - // If transitioning between locked/unlocked device, do not play a stash animation. - boolean unLockedTransition = hasAnyFlag(changedFlags, FLAG_STASHED_DEVICE_LOCKED); - boolean skipStashAnimation = !hotseatTopElement || unLockedTransition; + // If transitioning to unlocked device, do not play a stash animation. + // Keep isUnlockTransition in sync with its counterpart in + // TaskbarLauncherStateController#onStateChangeApplied. + boolean isUnlockTransition = hasAnyFlag(changedFlags, FLAG_STASHED_DEVICE_LOCKED) + && !hasAnyFlag(FLAG_STASHED_DEVICE_LOCKED); + boolean skipStashAnimation = !hotseatTopElement || isUnlockTransition; if (isTransientTaskbar) { createTransientAnimToIsStashed(mAnimator, isStashed, duration, animateBg, changedFlags, @@ -911,8 +914,17 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba | SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED)); updateStateForFlag(FLAG_STASHED_SYSUI, hasAnyFlag(systemUiStateFlags, SYSUI_STATE_SCREEN_PINNING)); - updateStateForFlag(FLAG_STASHED_DEVICE_LOCKED, - hasAnyFlag(systemUiStateFlags, MASK_ANY_SYSUI_LOCKED)); + + boolean isLocked = hasAnyFlag(systemUiStateFlags, MASK_ANY_SYSUI_LOCKED); + boolean wasLocked = hasAnyFlag(FLAG_STASHED_DEVICE_LOCKED); + updateStateForFlag(FLAG_STASHED_DEVICE_LOCKED, isLocked); + + if (isLocked && !wasLocked && DisplayController.isTransientTaskbar(mActivity)) { + // Stash the transient taskbar when locking the device. This improves the transition + // to AoD (otherwise the taskbar stays a bit too long above the collapsing AoD scrim), + // and ensures the taskar state is reset when unlocking the device afterwards. + updateStateForFlag(FLAG_STASHED_IN_APP_AUTO, true); + } // Only update FLAG_STASHED_IN_APP_IME when system gesture is not in progress. mIsImeShowing = hasAnyFlag(systemUiStateFlags, SYSUI_STATE_IME_SHOWING);