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

Commit 36bbc4f1 authored by Jagrut Desai's avatar Jagrut Desai
Browse files

Fix Hotseat stashing on user going to dream

This cl simply delays the taskbar icon alignment animation and stashing animation by duration of dream animation and plays it off screen with 0 duration.

Test: Manual, Presubmit
Bug: 333989177
Flag: EXEMPT bugfix
Change-Id: I35d26b0cf895f9990fcfd73ceebc15b0f9886476
parent 3a058327
Loading
Loading
Loading
Loading
+8 −15
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
package com.android.launcher3.taskbar;

import static com.android.app.animation.Interpolators.EMPHASIZED;
import static com.android.app.animation.Interpolators.FINAL_FRAME;
import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation;
import static com.android.launcher3.Hotseat.ALPHA_CHANNEL_TASKBAR_ALIGNMENT;
import static com.android.launcher3.Hotseat.ALPHA_CHANNEL_TASKBAR_STASH;
@@ -31,11 +32,8 @@ import static com.android.launcher3.taskbar.bubbles.BubbleBarView.FADE_IN_ANIM_A
import static com.android.launcher3.taskbar.bubbles.BubbleBarView.FADE_OUT_ANIM_POSITION_DURATION_MS;
import static com.android.launcher3.util.FlagDebugUtils.appendFlag;
import static com.android.launcher3.util.FlagDebugUtils.formatFlagChange;
import static com.android.quickstep.util.SystemUiFlagUtils.isTaskbarHidden;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_AWAKE;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_COMMUNAL_HUB_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DREAMING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_WAKEFULNESS_MASK;
import static com.android.systemui.shared.system.QuickStepContract.WAKEFULNESS_AWAKE;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -378,16 +376,7 @@ public class TaskbarLauncherStateController {

        updateStateForFlag(FLAG_DEVICE_LOCKED, SystemUiFlagUtils.isLocked(systemUiStateFlags));

        // Taskbar is hidden whenever the device is dreaming. The dreaming state includes the
        // interactive dreams, AoD, screen off. Since the SYSUI_STATE_DEVICE_DREAMING only kicks in
        // when the device is asleep, the second condition extends ensures that the transition from
        // and to the WAKEFULNESS_ASLEEP state also hide the taskbar, and improves the taskbar
        // hide/reveal animation timings. The Taskbar can show when dreaming if the glanceable hub
        // is showing on top.
        boolean isTaskbarHidden = (hasAnyFlag(systemUiStateFlags, SYSUI_STATE_DEVICE_DREAMING)
                && !hasAnyFlag(systemUiStateFlags, SYSUI_STATE_COMMUNAL_HUB_SHOWING))
                || (systemUiStateFlags & SYSUI_STATE_WAKEFULNESS_MASK) != WAKEFULNESS_AWAKE;
        updateStateForFlag(FLAG_TASKBAR_HIDDEN, isTaskbarHidden);
        updateStateForFlag(FLAG_TASKBAR_HIDDEN, isTaskbarHidden(systemUiStateFlags));

        if (applyState) {
            applyState();
@@ -682,8 +671,12 @@ public class TaskbarLauncherStateController {
                        + mIconAlignment.value
                        + " -> " + toAlignment + ": " + duration);
            }
            if (hasAnyFlag(FLAG_TASKBAR_HIDDEN)) {
                iconAlignAnim.setInterpolator(FINAL_FRAME);
            } else {
                animatorSet.play(iconAlignAnim);
            }
        }

        Interpolator interpolator = enableScalingRevealHomeAnimation()
                ? ScalingWorkspaceRevealAnim.SCALE_INTERPOLATOR : EMPHASIZED;
+16 −1
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.launcher3.util.FlagDebugUtils.appendFlag;
import static com.android.launcher3.util.FlagDebugUtils.formatFlagChange;
import static com.android.quickstep.util.SystemActionConstants.SYSTEM_ACTION_ID_TASKBAR;
import static com.android.quickstep.util.SystemUiFlagUtils.isTaskbarHidden;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_EXPANDED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DIALOG_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING;
@@ -104,6 +105,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
    // An internal no-op flag to determine whether we should delay the taskbar background animation
    private static final int FLAG_DELAY_TASKBAR_BG_TAG = 1 << 12;
    public static final int FLAG_STASHED_FOR_BUBBLES = 1 << 13; // show handle for stashed hotseat
    public static final int FLAG_TASKBAR_HIDDEN = 1 << 14; // taskbar hidden during dream, etc...

    // If any of these flags are enabled, isInApp should return true.
    private static final int FLAGS_IN_APP = FLAG_IN_APP | FLAG_IN_SETUP;
@@ -215,6 +217,13 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
     */
    private static final int TRANSITION_UNSTASH_SUW_MANUAL = 3;

    /**
     * total duration of entering dream state animation, which we use as start delay to
     * applyState() when SYSUI_STATE_DEVICE_DREAMING flag is present. Keep this in sync with
     * DreamAnimationController.TOTAL_ANIM_DURATION.
     */
    private static final int SKIP_TOTAL_DREAM_ANIM_DURATION = 450;

    @Retention(RetentionPolicy.SOURCE)
    @IntDef(value = {
            TRANSITION_DEFAULT,
@@ -1123,8 +1132,14 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
            startDelay = getTaskbarStashStartDelayForIme();
        }

        if (isTaskbarHidden(systemUiStateFlags) && !hasAnyFlag(FLAG_TASKBAR_HIDDEN)) {
            updateStateForFlag(FLAG_TASKBAR_HIDDEN, isTaskbarHidden(systemUiStateFlags));
            applyState(0, SKIP_TOTAL_DREAM_ANIM_DURATION);
        } else {
            updateStateForFlag(FLAG_TASKBAR_HIDDEN, isTaskbarHidden(systemUiStateFlags));
            applyState(skipAnim ? 0 : animDuration, skipAnim ? 0 : startDelay);
        }
    }

    /**
     * We stash when IME or IME switcher is showing.
+16 −0
Original line number Diff line number Diff line
@@ -47,6 +47,22 @@ object SystemUiFlagUtils {
            !hasAnyFlag(flags, QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_GOING_AWAY)
    }

    /**
     * Taskbar is hidden whenever the device is dreaming. The dreaming state includes the
     * interactive dreams, AoD, screen off. Since the SYSUI_STATE_DEVICE_DREAMING only kicks in when
     * the device is asleep, the second condition extends ensures that the transition from and to
     * the WAKEFULNESS_ASLEEP state also hide the taskbar, and improves the taskbar hide/reveal
     * animation timings. The Taskbar can show when dreaming if the glanceable hub is showing on
     * top.
     */
    @JvmStatic
    fun isTaskbarHidden(@SystemUiStateFlags flags: Long): Boolean {
        return ((hasAnyFlag(flags, QuickStepContract.SYSUI_STATE_DEVICE_DREAMING) &&
            !hasAnyFlag(flags, QuickStepContract.SYSUI_STATE_COMMUNAL_HUB_SHOWING)) ||
            (flags and QuickStepContract.SYSUI_STATE_WAKEFULNESS_MASK) !=
                QuickStepContract.WAKEFULNESS_AWAKE)
    }

    private fun hasAnyFlag(@SystemUiStateFlags flags: Long, flagMask: Long): Boolean {
        return (flags and flagMask) != 0L
    }