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

Commit 7519b7c2 authored by Tony Wickham's avatar Tony Wickham
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

Change-Id: If0497fcc17bb0ec44294c4ea1163104b4d8be459
parent 6f231f69
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -24,6 +24,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.taskbar.bubbles.BubbleBarView.FADE_IN_ANIM_ALPHA_DURATION_MS;
import static com.android.launcher3.taskbar.bubbles.BubbleBarView.FADE_OUT_ANIM_POSITION_DURATION_MS;
@@ -167,7 +168,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;

@@ -535,7 +541,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);
@@ -561,7 +567,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));
            }
@@ -631,6 +638,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
@@ -191,7 +191,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 −2
Original line number Diff line number Diff line
@@ -84,7 +84,6 @@ import com.android.wm.shell.shared.bubbles.BubbleBarLocation;
import java.io.PrintWriter;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;

@@ -330,7 +329,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();
    }

    /**