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

Commit e268bda3 authored by Tracy Zhou's avatar Tracy Zhou Committed by Automerger Merge Worker
Browse files

Merge "Track LauncherState for task bar stashing better" into sc-v2-dev am: fc0b2159

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/15951094

Change-Id: If4e76bcb2859ca208746c780dc6d28524757033d
parents 9cb63858 fc0b2159
Loading
Loading
Loading
Loading
+83 −10
Original line number Diff line number Diff line
@@ -16,9 +16,11 @@
package com.android.launcher3.taskbar;

import static com.android.launcher3.LauncherState.HOTSEAT_ICONS;
import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_APP;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_STASHED_LAUNCHER_STATE;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_STASHED_IN_APP_SETUP;
import static com.android.launcher3.taskbar.TaskbarStashController.TASKBAR_STASH_DURATION;
import static com.android.launcher3.taskbar.TaskbarViewController.ALPHA_INDEX_HOME;

import android.animation.Animator;
@@ -38,6 +40,7 @@ import com.android.launcher3.QuickstepTransitionManager;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimatorListeners;
import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.logging.InstanceId;
import com.android.launcher3.logging.InstanceIdSequence;
@@ -55,6 +58,7 @@ import com.android.quickstep.views.RecentsView;
import com.android.systemui.shared.recents.model.ThumbnailData;

import java.util.Arrays;
import java.util.function.Supplier;
import java.util.stream.Stream;

/**
@@ -72,17 +76,64 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
            new AnimatedFloat(this::onIconAlignmentRatioChanged);
    private final AnimatedFloat mIconAlignmentForGestureState =
            new AnimatedFloat(this::onIconAlignmentRatioChanged);
    private final AnimatedFloat mIconAlignmentForLauncherState =
            new AnimatedFloat(this::onIconAlignmentRatioChangedForStateTransition);

    private final DeviceProfile.OnDeviceProfileChangeListener mOnDeviceProfileChangeListener =
            this::onStashedInAppChanged;

    private final StateManager.StateListener<LauncherState> mStateListener =
            new StateManager.StateListener<LauncherState>() {
                private Animator mAnimator;

                @Override
                public void onStateTransitionStart(LauncherState toState) {
                    // Stash animation from going to launcher should be already handled in
                    // createAnimToLauncher.
                    TaskbarStashController controller = mControllers.taskbarStashController;
                    long duration = TASKBAR_STASH_DURATION;
                    controller.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE,
                            toState.isTaskbarStashed());
                    Animator stashAnimator = controller.applyStateWithoutStart(duration);
                    if (stashAnimator != null) {
                        if (mAnimator != null) {
                            mAnimator.cancel();
                        }
                        PendingAnimation pendingAnimation = new PendingAnimation(duration);
                        pendingAnimation.add(stashAnimator);
                        pendingAnimation.setFloat(mIconAlignmentForLauncherState,
                                AnimatedFloat.VALUE, toState.isTaskbarStashed() ? 0 : 1,
                                FAST_OUT_SLOW_IN);
                        pendingAnimation.addListener(new AnimatorListenerAdapter() {
                            @Override
                            public void onAnimationStart(Animator animator) {
                                mTargetStateOverrideForStateTransition = toState;
                                // Copy hotseat alpha over to taskbar icons
                                mIconAlphaForHome.setValue(mLauncher.getHotseat().getIconsAlpha());
                                mLauncher.getHotseat().setIconsAlpha(0);
                            }

                            @Override
                            public void onAnimationEnd(Animator animator) {
                                if (toState.isTaskbarStashed()) {
                                    // Reset hotseat alpha to default
                                    mLauncher.getHotseat().setIconsAlpha(1);
                                }
                                mTargetStateOverrideForStateTransition = null;
                                mAnimator = null;
                            }
                        });
                        mAnimator = pendingAnimation.buildAnim();
                        mAnimator.start();
                    }
                }

                @Override
                public void onStateTransitionComplete(LauncherState finalState) {
                    TaskbarStashController controller = mControllers.taskbarStashController;
                    controller.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE,
                            finalState.isTaskbarStashed());
                    controller.applyState();
                }
            };

@@ -96,6 +147,8 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
    private TaskbarKeyguardController mKeyguardController;

    private LauncherState mTargetStateOverride = null;
    private LauncherState mTargetStateOverrideForStateTransition = null;

    private final DeviceProfile.OnDeviceProfileChangeListener mProfileChangeListener =
            new DeviceProfile.OnDeviceProfileChangeListener() {
                @Override
@@ -144,6 +197,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
        onLauncherResumedOrPaused(false);
        mIconAlignmentForResumedState.finishAnimation();
        mIconAlignmentForGestureState.finishAnimation();
        mIconAlignmentForLauncherState.finishAnimation();

        mLauncher.removeOnDeviceProfileChangeListener(mOnDeviceProfileChangeListener);
        mLauncher.getStateManager().removeStateListener(mStateListener);
@@ -258,25 +312,35 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
        return Math.max(mIconAlignmentForResumedState.value, mIconAlignmentForGestureState.value);
    }

    private float getCurrentIconAlignmentRatioForLauncherState() {
        return mIconAlignmentForLauncherState.value;
    }

    private void onIconAlignmentRatioChangedForStateTransition() {
        onIconAlignmentRatioChanged(
                mTargetStateOverrideForStateTransition != null
                        ? mTargetStateOverrideForStateTransition
                        : mLauncher.getStateManager().getState(),
                this::getCurrentIconAlignmentRatioForLauncherState);
    }

    private void onIconAlignmentRatioChanged() {
        onIconAlignmentRatioChanged(mTargetStateOverride != null ? mTargetStateOverride
                : mLauncher.getStateManager().getState(), this::getCurrentIconAlignmentRatio);
    }

    private void onIconAlignmentRatioChanged(LauncherState state,
            Supplier<Float> alignmentSupplier) {
        if (mControllers == null) {
            return;
        }
        float alignment = getCurrentIconAlignmentRatio();
        float alignment = alignmentSupplier.get();
        mControllers.taskbarViewController.setLauncherIconAlignment(
                alignment, mLauncher.getDeviceProfile());

        mTaskbarBackgroundAlpha.updateValue(1 - alignment);

        LauncherState state = mTargetStateOverride != null ? mTargetStateOverride
                : mLauncher.getStateManager().getState();
        if ((state.getVisibleElements(mLauncher) & HOTSEAT_ICONS) != 0) {
            // If the hotseat icons are visible, then switch taskbar in last frame
            setTaskbarViewVisible(alignment < 1);
        } else {
            mLauncher.getHotseat().setIconsAlpha(1);
            mIconAlphaForHome.setValue(1 - alignment);
        }
        setIconAlpha(state, alignment);
    }

    /**
@@ -295,6 +359,15 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
        return mTaskbarDragLayer;
    }

    private void setIconAlpha(LauncherState state, float progress) {
        if ((state.getVisibleElements(mLauncher) & HOTSEAT_ICONS) != 0) {
            // If the hotseat icons are visible, then switch taskbar in last frame
            setTaskbarViewVisible(progress < 1);
        } else {
            mIconAlphaForHome.setValue(1 - progress);
        }
    }

    private void setTaskbarViewVisible(boolean isVisible) {
        mIconAlphaForHome.setValue(isVisible ? 1 : 0);
        mLauncher.getHotseat().setIconsAlpha(isVisible ? 0f : 1f);
+12 −7
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@ public class TaskbarStashController {
    /**
     * How long to stash/unstash when manually invoked via long press.
     */
    private static final long TASKBAR_STASH_DURATION = 300;
    public static final long TASKBAR_STASH_DURATION = 300;

    /**
     * The scale TaskbarView animates to when being stashed.
@@ -279,7 +279,12 @@ public class TaskbarStashController {
        return false;
    }

    private Animator createAnimToIsStashed(boolean isStashed, long duration) {
    /**
     * Create a stash animation and save to {@link #mAnimator}.
     * @param isStashed whether it's a stash animation or an unstash animation
     * @param duration duration of the animation
     */
    private void createAnimToIsStashed(boolean isStashed, long duration) {
        if (mAnimator != null) {
            mAnimator.cancel();
        }
@@ -289,7 +294,7 @@ public class TaskbarStashController {
            // Just hide/show the icons instead of stashing into a handle.
            mAnimator.play(mIconAlphaForStash.animateToValue(isStashed ? 0 : 1)
                    .setDuration(duration));
            return mAnimator;
            return;
        }

        AnimatorSet fullLengthAnimatorSet = new AnimatorSet();
@@ -361,7 +366,6 @@ public class TaskbarStashController {
                mAnimator = null;
            }
        });
        return mAnimator;
    }

    /**
@@ -481,12 +485,13 @@ public class TaskbarStashController {
            boolean isStashed = mStashCondition.test(flags);
            if (mIsStashed != isStashed) {
                mIsStashed = isStashed;
                Animator animator = createAnimToIsStashed(mIsStashed, duration);
                createAnimToIsStashed(mIsStashed, duration);
                if (start) {
                    animator.start();
                }
                    mAnimator.start();
                }
                return mAnimator;
            }
            return null;
        }
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -68,6 +68,11 @@ public class AllAppsState extends LauncherState {
        return scaleAndTranslation;
    }

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

    @Override
    protected float getDepthUnchecked(Context context) {
        // The scrim fades in at approximately 50% of the swipe gesture.
+4 −0
Original line number Diff line number Diff line
@@ -198,6 +198,10 @@ public class Hotseat extends CellLayout implements Insettable {
        getShortcutsAndWidgets().setAlpha(alpha);
    }

    public float getIconsAlpha() {
        return getShortcutsAndWidgets().getAlpha();
    }

    /**
     * Returns the QSB inside hotseat
     */