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

Commit cde962dc authored by Jon Miranda's avatar Jon Miranda
Browse files

Synchronize the app launch and taskbar stash animations.

Introduce FLAG_IGNORE_IN_APP to prevent taskbar from stashing prematurely
due to HomeTransitionListener signal.

Bug: 345768019
Fixes: 319162553
Test: Launch an app, note the two animations are synced
      Verified by locally introducing a startDelay (since otherwise it is hard to tell)
Flag: com.android.launcher3.enable_scaling_reveal_home_animation
Change-Id: Ibb64e0321f33cf81e337fc7c1b2c3edfb23e6ba4
parent 2397ffd4
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -356,6 +356,14 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
        options.setOnAnimationAbortListener(endCallback);
        options.setOnAnimationFinishedListener(endCallback);

        // Prepare taskbar for animation synchronization. This needs to happen here before any
        // app transition is created.
        LauncherTaskbarUIController taskbarController = mLauncher.getTaskbarUIController();
        if (enableScalingRevealHomeAnimation() && taskbarController != null) {
            taskbarController.setIgnoreInAppFlagForSync(true);
            onEndCallback.add(() -> taskbarController.setIgnoreInAppFlagForSync(false));
        }

        IBinder cookie = mAppLaunchRunner.supportsReturnTransition()
                ? ((ContainerAnimationRunner) mAppLaunchRunner).getCookie() : null;
        addLaunchCookie(cookie, (ItemInfo) v.getTag(), options);
@@ -1912,6 +1920,21 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
                anim.addListener(mForceInvisibleListener);
            }

            // Syncs the app launch animation and taskbar stash animation (if exists).
            if (enableScalingRevealHomeAnimation()) {
                LauncherTaskbarUIController taskbarController = mLauncher.getTaskbarUIController();
                if (taskbarController != null) {
                    taskbarController.setIgnoreInAppFlagForSync(false);

                    if (launcherClosing) {
                        Animator taskbar = taskbarController.createAnimToApp();
                        if (taskbar != null) {
                            anim.play(taskbar);
                        }
                    }
                }
            }

            result.setAnimation(anim, mLauncher, mOnEndCallback::executeAllAndDestroy,
                    skipFirstFrame);
        }
+19 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import static com.android.launcher3.QuickstepTransitionManager.TRANSIENT_TASKBAR
import static com.android.launcher3.statemanager.BaseState.FLAG_NON_INTERACTIVE;
import static com.android.launcher3.taskbar.TaskbarEduTooltipControllerKt.TOOLTIP_STEP_FEATURES;
import static com.android.launcher3.taskbar.TaskbarLauncherStateController.FLAG_VISIBLE;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IGNORE_IN_APP;
import static com.android.quickstep.TaskAnimationManager.ENABLE_SHELL_TRANSITIONS;
import static com.android.window.flags.Flags.enableDesktopWindowingWallpaperActivity;

@@ -256,6 +257,24 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
        return mTaskbarLauncherStateController.createAnimToLauncher(toState, callbacks, duration);
    }

    /**
     * Create Taskbar animation to be played alongside the Launcher app launch animation.
     */
    public @Nullable Animator createAnimToApp() {
        TaskbarStashController stashController = mControllers.taskbarStashController;
        stashController.updateStateForFlag(TaskbarStashController.FLAG_IN_APP, true);
        return stashController.createApplyStateAnimator(stashController.getStashDuration());
    }

    /**
     * Temporarily ignore FLAG_IN_APP for app launches to prevent premature taskbar stashing.
     * This is needed because taskbar gets a signal to stash before we actually start the
     * app launch animation.
     */
    public void setIgnoreInAppFlagForSync(boolean enabled) {
        mControllers.taskbarStashController.updateStateForFlag(FLAG_IGNORE_IN_APP, enabled);
    }

    public void updateTaskbarLauncherStateGoingHome() {
        mTaskbarLauncherStateController.updateStateForFlag(FLAG_VISIBLE, true);
        mTaskbarLauncherStateController.applyState();
+6 −0
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
    public static final int FLAG_STASHED_SYSUI = 1 << 9; //  app pinning,...
    public static final int FLAG_STASHED_DEVICE_LOCKED = 1 << 10; // device is locked: keyguard, ...
    public static final int FLAG_IN_OVERVIEW = 1 << 11; // launcher is in overview
    public static final int FLAG_IGNORE_IN_APP = 1 << 12; // used to sync with app launch animation

    // If any of these flags are enabled, isInApp should return true.
    private static final int FLAGS_IN_APP = FLAG_IN_APP | FLAG_IN_SETUP;
@@ -1263,6 +1264,11 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
         */
        @Nullable
        public Animator createSetStateAnimator(long flags, long duration) {
            // We do this when we want to synchronize the app launch and taskbar stash animations.
            if (hasAnyFlag(FLAG_IGNORE_IN_APP) && hasAnyFlag(flags, FLAG_IN_APP)) {
                flags = flags & ~FLAG_IN_APP;
            }

            boolean isStashed = mStashCondition.test(flags);

            if (DEBUG) {