diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 5a74f4aafc..9faf39277d 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -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); } diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index 779009a6b0..0add1c41de 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -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(); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index 430c0032a6..0c5ad42147 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -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) {