Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0a176950 authored by Tony Wickham's avatar Tony Wickham Committed by Android Build Coastguard Worker
Browse files

Fix Taskbar unlock transition

- There are multiple signals that come just after FLAG_DEVICE_LOCKED
  is removed, and those should still be considered part of the unlock
  transition. We already did this for TaskbarStashController so I copied
  it to TaskbarLauncherStateController.
- Also animate when changing SYSUI_STATE_OVERVIEW_DISABLED, since this
  happens when the device is locked/unlocked and changes the visibility
  of TaskbarView icons.

Test: manually unlock over both home screen and in-app, verify clean
transition without jump (e.g. Hotseat is immediately visible as part of
Workspace, and Taskbar fades in during unlock to an app)
Flag: EXEMPT bug fix
Fixes: 364586744

(cherry picked from commit 7519b7c2)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:060a883fca73711684ad3a1069677569a264b7fb)
Merged-In: If0497fcc17bb0ec44294c4ea1163104b4d8be459
Change-Id: If0497fcc17bb0ec44294c4ea1163104b4d8be459
parent c12e4e85
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_APP;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_OVERVIEW;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_STASHED_LAUNCHER_STATE;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_STASHED_FOR_BUBBLES;
import static com.android.launcher3.taskbar.TaskbarStashController.UNLOCK_TRANSITION_MEMOIZATION_MS;
import static com.android.launcher3.taskbar.TaskbarViewController.ALPHA_INDEX_HOME;
import static com.android.launcher3.util.FlagDebugUtils.appendFlag;
import static com.android.launcher3.util.FlagDebugUtils.formatFlagChange;
@@ -160,7 +161,12 @@ public class TaskbarLauncherStateController {
    private boolean mSkipNextRecentsAnimEnd;

    // Time when FLAG_TASKBAR_HIDDEN was last cleared, SystemClock.elapsedRealtime (milliseconds).
    private long mLastUnlockTimeMs = 0;
    private long mLastRemoveTaskbarHiddenTimeMs = 0;
    /**
     * Time when FLAG_DEVICE_LOCKED was last cleared, plus
     * {@link TaskbarStashController#UNLOCK_TRANSITION_MEMOIZATION_MS}
     */
    private long mLastUnlockTransitionTimeout;

    private @Nullable TaskBarRecentsAnimationListener mTaskBarRecentsAnimationListener;

@@ -524,7 +530,7 @@ public class TaskbarLauncherStateController {

        if (hasAnyFlag(changedFlags, FLAG_TASKBAR_HIDDEN) && !hasAnyFlag(FLAG_TASKBAR_HIDDEN)) {
            // Take note of the current time, as the taskbar is made visible again.
            mLastUnlockTimeMs = SystemClock.elapsedRealtime();
            mLastRemoveTaskbarHiddenTimeMs = SystemClock.elapsedRealtime();
        }

        boolean isHidden = hasAnyFlag(FLAG_TASKBAR_HIDDEN);
@@ -550,7 +556,8 @@ public class TaskbarLauncherStateController {
                // with a fingerprint reader. This should only be done when the device was woken
                // up via fingerprint reader, however since this information is currently not
                // available, opting to always delay the fade-in a bit.
                long durationSinceLastUnlockMs = SystemClock.elapsedRealtime() - mLastUnlockTimeMs;
                long durationSinceLastUnlockMs = SystemClock.elapsedRealtime()
                        - mLastRemoveTaskbarHiddenTimeMs;
                taskbarVisibility.setStartDelay(
                        Math.max(0, TASKBAR_SHOW_DELAY_MS - durationSinceLastUnlockMs));
            }
@@ -620,6 +627,15 @@ public class TaskbarLauncherStateController {
        boolean isUnlockTransition =
                hasAnyFlag(changedFlags, FLAG_DEVICE_LOCKED) && !hasAnyFlag(FLAG_DEVICE_LOCKED);
        if (isUnlockTransition) {
            // the launcher might not be resumed at the time the device is considered
            // unlocked (when the keyguard goes away), but possibly shortly afterwards.
            // To play the unlock transition at the time the unstash animation actually happens,
            // this memoizes the state transition for UNLOCK_TRANSITION_MEMOIZATION_MS.
            mLastUnlockTransitionTimeout =
                    SystemClock.elapsedRealtime() + UNLOCK_TRANSITION_MEMOIZATION_MS;
        }
        boolean isInUnlockTimeout = SystemClock.elapsedRealtime() < mLastUnlockTransitionTimeout;
        if (isUnlockTransition || isInUnlockTimeout) {
            // When transitioning to unlocked, ensure the hotseat is fully visible from the
            // beginning. The hotseat itself is animated by LauncherUnlockAnimationController.
            mIconAlignment.cancelAnimation();
+1 −1
Original line number Diff line number Diff line
@@ -185,7 +185,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba

    // Duration for which an unlock event is considered "current", as other events are received
    // asynchronously.
    private static final long UNLOCK_TRANSITION_MEMOIZATION_MS = 200;
    public static final long UNLOCK_TRANSITION_MEMOIZATION_MS = 200;

    /**
     * The default stash animation, morphing the taskbar into the navbar.
+2 −1
Original line number Diff line number Diff line
@@ -326,7 +326,8 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar
     */
    public void setRecentsButtonDisabled(boolean isDisabled) {
        // TODO: check TaskbarStashController#supportsStashing(), to stash instead of setting alpha.
        mTaskbarIconAlpha.get(ALPHA_INDEX_RECENTS_DISABLED).setValue(isDisabled ? 0 : 1);
        mTaskbarIconAlpha.get(ALPHA_INDEX_RECENTS_DISABLED).animateToValue(isDisabled ? 0 : 1)
                .start();
    }

    /**