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

Commit b5a051ca authored by Tony Wickham's avatar Tony Wickham Committed by Android (Google) Code Review
Browse files

Merge changes I6cf84ec7,Iea599651,If3238286 into sc-v2-dev

* changes:
  Improve quick switch from home to taskbar
  Cleanup some taskbar/hotseat handoff issues
  Fix taskbar stash misalignment when going from app to overview
parents 1b0e524d 24675d36
Loading
Loading
Loading
Loading
+65 −44
Original line number Original line Diff line number Diff line
@@ -49,13 +49,15 @@ import java.util.function.Supplier;


    public static final int FLAG_RESUMED = 1 << 0;
    public static final int FLAG_RESUMED = 1 << 0;
    public static final int FLAG_RECENTS_ANIMATION_RUNNING = 1 << 1;
    public static final int FLAG_RECENTS_ANIMATION_RUNNING = 1 << 1;
    public static final int FLAG_TRANSITION_STATE_START_STASHED = 1 << 2;
    public static final int FLAG_TRANSITION_STATE_RUNNING = 1 << 2;
    public static final int FLAG_TRANSITION_STATE_COMMITTED_STASHED = 1 << 3;

    /** Equivalent to an int with all 1s for binary operation purposes */
    private static final int FLAGS_ALL = ~0;


    private final AnimatedFloat mIconAlignmentForResumedState =
    private final AnimatedFloat mIconAlignmentForResumedState =
            new AnimatedFloat(this::onIconAlignmentRatioChanged);
            new AnimatedFloat(this::onIconAlignmentRatioChangedForAppAndHomeTransition);
    private final AnimatedFloat mIconAlignmentForGestureState =
    private final AnimatedFloat mIconAlignmentForGestureState =
            new AnimatedFloat(this::onIconAlignmentRatioChanged);
            new AnimatedFloat(this::onIconAlignmentRatioChangedForAppAndHomeTransition);
    private final AnimatedFloat mIconAlignmentForLauncherState =
    private final AnimatedFloat mIconAlignmentForLauncherState =
            new AnimatedFloat(this::onIconAlignmentRatioChangedForStateTransition);
            new AnimatedFloat(this::onIconAlignmentRatioChangedForStateTransition);


@@ -64,8 +66,9 @@ import java.util.function.Supplier;
    private MultiValueAlpha.AlphaProperty mIconAlphaForHome;
    private MultiValueAlpha.AlphaProperty mIconAlphaForHome;
    private BaseQuickstepLauncher mLauncher;
    private BaseQuickstepLauncher mLauncher;


    private int mPrevState;
    private Integer mPrevState;
    private int mState;
    private int mState;
    private LauncherState mLauncherState = LauncherState.NORMAL;


    private boolean mIsAnimatingToLauncherViaGesture;
    private boolean mIsAnimatingToLauncherViaGesture;
    private boolean mIsAnimatingToLauncherViaResume;
    private boolean mIsAnimatingToLauncherViaResume;
@@ -75,15 +78,20 @@ import java.util.function.Supplier;


                @Override
                @Override
                public void onStateTransitionStart(LauncherState toState) {
                public void onStateTransitionStart(LauncherState toState) {
                    updateStateForFlag(FLAG_TRANSITION_STATE_START_STASHED,
                    if (toState != mLauncherState) {
                            toState.isTaskbarStashed());
                        // Treat FLAG_TRANSITION_STATE_RUNNING as a changed flag even if a previous
                        // state transition was already running, so we update the new target.
                        mPrevState &= ~FLAG_TRANSITION_STATE_RUNNING;
                        mLauncherState = toState;
                    }
                    updateStateForFlag(FLAG_TRANSITION_STATE_RUNNING, true);
                    applyState();
                    applyState();
                }
                }


                @Override
                @Override
                public void onStateTransitionComplete(LauncherState finalState) {
                public void onStateTransitionComplete(LauncherState finalState) {
                    updateStateForFlag(FLAG_TRANSITION_STATE_COMMITTED_STASHED,
                    mLauncherState = finalState;
                            finalState.isTaskbarStashed());
                    updateStateForFlag(FLAG_TRANSITION_STATE_RUNNING, false);
                    applyState();
                    applyState();
                }
                }
            };
            };
@@ -100,7 +108,7 @@ import java.util.function.Supplier;
                (Consumer<Float>) alpha -> mLauncher.getHotseat().setIconsAlpha(alpha > 0 ? 0 : 1));
                (Consumer<Float>) alpha -> mLauncher.getHotseat().setIconsAlpha(alpha > 0 ? 0 : 1));


        mIconAlignmentForResumedState.finishAnimation();
        mIconAlignmentForResumedState.finishAnimation();
        onIconAlignmentRatioChanged();
        onIconAlignmentRatioChangedForAppAndHomeTransition();


        mLauncher.getStateManager().addStateListener(mStateListener);
        mLauncher.getStateManager().addStateListener(mStateListener);
    }
    }
@@ -121,9 +129,10 @@ import java.util.function.Supplier;
        // If going home, align the icons to hotseat
        // If going home, align the icons to hotseat
        AnimatorSet animatorSet = new AnimatorSet();
        AnimatorSet animatorSet = new AnimatorSet();


        // Update stashed flags first to ensure goingToUnstashedLauncherState() returns correctly.
        TaskbarStashController stashController = mControllers.taskbarStashController;
        TaskbarStashController stashController = mControllers.taskbarStashController;
        stashController.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE,
        stashController.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE,
                toState.isTaskbarStashed());
                toState.isTaskbarStashed(mLauncher));
        stashController.updateStateForFlag(FLAG_IN_APP, false);
        stashController.updateStateForFlag(FLAG_IN_APP, false);


        updateStateForFlag(FLAG_RECENTS_ANIMATION_RUNNING, true);
        updateStateForFlag(FLAG_RECENTS_ANIMATION_RUNNING, true);
@@ -182,10 +191,11 @@ import java.util.function.Supplier;


    public Animator applyState(long duration, boolean start) {
    public Animator applyState(long duration, boolean start) {
        Animator animator = null;
        Animator animator = null;
        if (mPrevState != mState) {
        if (mPrevState == null || mPrevState != mState) {
            int changedFlags = mPrevState ^ mState;
            // If this is our initial state, treat all flags as changed.
            animator = onStateChangeApplied(changedFlags, duration, start);
            int changedFlags = mPrevState == null ? FLAGS_ALL : mPrevState ^ mState;
            mPrevState = mState;
            mPrevState = mState;
            animator = onStateChangeApplied(changedFlags, duration, start);
        }
        }
        return animator;
        return animator;
    }
    }
@@ -195,7 +205,8 @@ import java.util.function.Supplier;
        if (hasAnyFlag(changedFlags, FLAG_RESUMED)) {
        if (hasAnyFlag(changedFlags, FLAG_RESUMED)) {
            boolean isResumed = isResumed();
            boolean isResumed = isResumed();
            ObjectAnimator anim = mIconAlignmentForResumedState
            ObjectAnimator anim = mIconAlignmentForResumedState
                    .animateToValue(isResumed ? 1 : 0)
                    .animateToValue(isResumed && goingToUnstashedLauncherState()
                            ? 1 : 0)
                    .setDuration(duration);
                    .setDuration(duration);


            anim.addListener(new AnimatorListenerAdapter() {
            anim.addListener(new AnimatorListenerAdapter() {
@@ -219,7 +230,8 @@ import java.util.function.Supplier;
        if (hasAnyFlag(changedFlags, FLAG_RECENTS_ANIMATION_RUNNING)) {
        if (hasAnyFlag(changedFlags, FLAG_RECENTS_ANIMATION_RUNNING)) {
            boolean isRecentsAnimationRunning = isRecentsAnimationRunning();
            boolean isRecentsAnimationRunning = isRecentsAnimationRunning();
            Animator animator = mIconAlignmentForGestureState
            Animator animator = mIconAlignmentForGestureState
                    .animateToValue(isRecentsAnimationRunning ? 1 : 0);
                    .animateToValue(isRecentsAnimationRunning && goingToUnstashedLauncherState()
                            ? 1 : 0);
            if (isRecentsAnimationRunning) {
            if (isRecentsAnimationRunning) {
                animator.setDuration(duration);
                animator.setDuration(duration);
            }
            }
@@ -237,14 +249,21 @@ import java.util.function.Supplier;
            animatorSet.play(animator);
            animatorSet.play(animator);
        }
        }


        if (hasAnyFlag(changedFlags, FLAG_TRANSITION_STATE_START_STASHED)) {
        if (hasAnyFlag(changedFlags, FLAG_RESUMED | FLAG_RECENTS_ANIMATION_RUNNING)) {
            playStateTransitionAnim(isTransitionStateStartStashed(), animatorSet, duration,
            boolean goingToLauncher = hasAnyFlag(FLAG_RESUMED | FLAG_RECENTS_ANIMATION_RUNNING);
                    false /* committed */);
            animatorSet.play(mTaskbarBackgroundAlpha.animateToValue(goingToLauncher ? 0 : 1)
                    .setDuration(duration));
        }
        }


        if (hasAnyFlag(changedFlags, FLAG_TRANSITION_STATE_COMMITTED_STASHED)) {
        if (hasAnyFlag(changedFlags, FLAG_TRANSITION_STATE_RUNNING)) {
            playStateTransitionAnim(isTransitionStateCommittedStashed(), animatorSet, duration,
            boolean committed = !hasAnyFlag(FLAG_TRANSITION_STATE_RUNNING);
                    true /* committed */);
            playStateTransitionAnim(animatorSet, duration, committed);

            if (committed && mLauncherState == LauncherState.QUICK_SWITCH) {
                // We're about to be paused, set immediately to ensure seamless handoff.
                updateStateForFlag(FLAG_RESUMED, false);
                applyState(0 /* duration */);
            }
        }
        }


        if (start) {
        if (start) {
@@ -253,17 +272,24 @@ import java.util.function.Supplier;
        return animatorSet;
        return animatorSet;
    }
    }


    private void playStateTransitionAnim(boolean isTransitionStateStashed,
    /** Returns whether we're going to a state where taskbar icons should align with launcher. */
            AnimatorSet animatorSet, long duration, boolean committed) {
    private boolean goingToUnstashedLauncherState() {
        return !mControllers.taskbarStashController.isInStashedLauncherState();
    }

    private void playStateTransitionAnim(AnimatorSet animatorSet, long duration,
            boolean committed) {
        boolean isInStashedState = mLauncherState.isTaskbarStashed(mLauncher);
        float toAlignment = mLauncherState.isTaskbarAlignedWithHotseat(mLauncher) ? 1 : 0;

        TaskbarStashController controller = mControllers.taskbarStashController;
        TaskbarStashController controller = mControllers.taskbarStashController;
        controller.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE,
        controller.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE, isInStashedState);
                isTransitionStateStashed);
        Animator stashAnimator = controller.applyStateWithoutStart(duration);
        Animator stashAnimator = controller.applyStateWithoutStart(duration);
        if (stashAnimator != null) {
        if (stashAnimator != null) {
            stashAnimator.addListener(new AnimatorListenerAdapter() {
            stashAnimator.addListener(new AnimatorListenerAdapter() {
                @Override
                @Override
                public void onAnimationEnd(Animator animation) {
                public void onAnimationEnd(Animator animation) {
                    if (isTransitionStateStashed && committed) {
                    if (isInStashedState && committed) {
                        // Reset hotseat alpha to default
                        // Reset hotseat alpha to default
                        mLauncher.getHotseat().setIconsAlpha(1);
                        mLauncher.getHotseat().setIconsAlpha(1);
                    }
                    }
@@ -271,14 +297,16 @@ import java.util.function.Supplier;


                @Override
                @Override
                public void onAnimationStart(Animator animation) {
                public void onAnimationStart(Animator animation) {
                    if (mLauncher.getHotseat().getIconsAlpha() > 0) {
                        mIconAlphaForHome.setValue(mLauncher.getHotseat().getIconsAlpha());
                        mIconAlphaForHome.setValue(mLauncher.getHotseat().getIconsAlpha());
                    }
                    }
                }
            });
            });
            animatorSet.play(stashAnimator);
            animatorSet.play(stashAnimator);
            animatorSet.play(mIconAlignmentForLauncherState.animateToValue(
                    getCurrentIconAlignmentRatioForLauncherState(),
                    isTransitionStateStashed ? 0 : 1));
        }
        }

        animatorSet.play(mIconAlignmentForLauncherState.animateToValue(toAlignment)
                .setDuration(duration));
    }
    }


    private boolean isResumed() {
    private boolean isResumed() {
@@ -289,20 +317,15 @@ import java.util.function.Supplier;
        return (mState & FLAG_RECENTS_ANIMATION_RUNNING) != 0;
        return (mState & FLAG_RECENTS_ANIMATION_RUNNING) != 0;
    }
    }


    private boolean isTransitionStateStartStashed() {
        return (mState & FLAG_TRANSITION_STATE_START_STASHED) != 0;
    }

    private boolean isTransitionStateCommittedStashed() {
        return (mState & FLAG_TRANSITION_STATE_COMMITTED_STASHED) != 0;
    }

    private void onIconAlignmentRatioChangedForStateTransition() {
    private void onIconAlignmentRatioChangedForStateTransition() {
        if (!isResumed()) {
            return;
        }
        onIconAlignmentRatioChanged(this::getCurrentIconAlignmentRatioForLauncherState);
        onIconAlignmentRatioChanged(this::getCurrentIconAlignmentRatioForLauncherState);
    }
    }


    private void onIconAlignmentRatioChanged() {
    private void onIconAlignmentRatioChangedForAppAndHomeTransition() {
        onIconAlignmentRatioChanged(this::getCurrentIconAlignmentRatio);
        onIconAlignmentRatioChanged(this::getCurrentIconAlignmentRatioBetweenAppAndHome);
    }
    }


    private void onIconAlignmentRatioChanged(Supplier<Float> alignmentSupplier) {
    private void onIconAlignmentRatioChanged(Supplier<Float> alignmentSupplier) {
@@ -313,13 +336,11 @@ import java.util.function.Supplier;
        mControllers.taskbarViewController.setLauncherIconAlignment(
        mControllers.taskbarViewController.setLauncherIconAlignment(
                alignment, mLauncher.getDeviceProfile());
                alignment, mLauncher.getDeviceProfile());


        mTaskbarBackgroundAlpha.updateValue(1 - alignment);

        // Switch taskbar and hotseat in last frame
        // Switch taskbar and hotseat in last frame
        setTaskbarViewVisible(alignment < 1);
        setTaskbarViewVisible(alignment < 1);
    }
    }


    private float getCurrentIconAlignmentRatio() {
    private float getCurrentIconAlignmentRatioBetweenAppAndHome() {
        return Math.max(mIconAlignmentForResumedState.value, mIconAlignmentForGestureState.value);
        return Math.max(mIconAlignmentForResumedState.value, mIconAlignmentForGestureState.value);
    }
    }


+7 −0
Original line number Original line Diff line number Diff line
@@ -216,6 +216,13 @@ public class TaskbarStashController {
        return hasAnyFlag(FLAGS_STASHED_IN_APP);
        return hasAnyFlag(FLAGS_STASHED_IN_APP);
    }
    }


    /**
     * Returns whether the taskbar should be stashed in the current LauncherState.
     */
    public boolean isInStashedLauncherState() {
        return hasAnyFlag(FLAG_IN_STASHED_LAUNCHER_STATE) && supportsVisualStashing();
    }

    private boolean hasAnyFlag(int flagMask) {
    private boolean hasAnyFlag(int flagMask) {
        return hasAnyFlag(mState, flagMask);
        return hasAnyFlag(mState, flagMask);
    }
    }
+1 −1
Original line number Original line Diff line number Diff line
@@ -69,7 +69,7 @@ public class AllAppsState extends LauncherState {
    }
    }


    @Override
    @Override
    public boolean isTaskbarStashed() {
    public boolean isTaskbarStashed(Launcher launcher) {
        return true;
        return true;
    }
    }


+1 −1
Original line number Original line Diff line number Diff line
@@ -92,7 +92,7 @@ public class OverviewState extends LauncherState {
    }
    }


    @Override
    @Override
    public boolean isTaskbarStashed() {
    public boolean isTaskbarStashed(Launcher launcher) {
        return true;
        return true;
    }
    }


+15 −0
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@ package com.android.launcher3.uioverrides.states;


import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_BACKGROUND;
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_BACKGROUND;


import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Launcher;
import com.android.launcher3.Launcher;
import com.android.launcher3.R;
import com.android.launcher3.R;
import com.android.launcher3.util.Themes;
import com.android.launcher3.util.Themes;
@@ -42,6 +43,10 @@ public class QuickSwitchState extends BackgroundAppState {


    @Override
    @Override
    public int getWorkspaceScrimColor(Launcher launcher) {
    public int getWorkspaceScrimColor(Launcher launcher) {
        DeviceProfile dp = launcher.getDeviceProfile();
        if (dp.isTaskbarPresentInApps) {
            return launcher.getColor(R.color.taskbar_background);
        }
        return Themes.getAttrColor(launcher, R.attr.overviewScrimColor);
        return Themes.getAttrColor(launcher, R.attr.overviewScrimColor);
    }
    }


@@ -55,4 +60,14 @@ public class QuickSwitchState extends BackgroundAppState {
    public int getVisibleElements(Launcher launcher) {
    public int getVisibleElements(Launcher launcher) {
        return NONE;
        return NONE;
    }
    }

    @Override
    public boolean isTaskbarStashed(Launcher launcher) {
        return !launcher.getDeviceProfile().isTaskbarPresentInApps;
    }

    @Override
    public boolean isTaskbarAlignedWithHotseat(Launcher launcher) {
        return false;
    }
}
}
Loading