Handle the animation when restarting apps

Fixes: 170338921
Test: manual

Change-Id: I5a5722cb62fb53a68d140621ad79ed97f4d98571
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 6cf3c7a..43c088b 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -1020,7 +1020,7 @@
 
     protected abstract HomeAnimationFactory createHomeAnimationFactory(long duration);
 
-    private TaskStackChangeListener mActivityRestartListener = new TaskStackChangeListener() {
+    private final TaskStackChangeListener mActivityRestartListener = new TaskStackChangeListener() {
         @Override
         public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task,
                 boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) {
@@ -1459,13 +1459,33 @@
 
     protected abstract void finishRecentsControllerToHome(Runnable callback);
 
+    private final TaskStackChangeListener mLiveTileRestartListener = new TaskStackChangeListener() {
+        @Override
+        public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task,
+                boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) {
+            if (mRecentsAnimationTargets.hasTask(task.taskId)) {
+                launchOtherTaskInLiveTileMode(task.taskId, mRecentsAnimationTargets.apps);
+            }
+            ActivityManagerWrapper.getInstance().unregisterTaskStackListener(
+                    mLiveTileRestartListener);
+        }
+    };
+
     private void setupLauncherUiAfterSwipeUpToRecentsAnimation() {
         endLauncherTransitionController();
         mActivityInterface.onSwipeUpToRecentsComplete();
         mRecentsView.onSwipeUpAnimationSuccess();
         if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
             mTaskAnimationManager.setLaunchOtherTaskInLiveTileModeHandler(
-                    this::launchOtherTaskInLiveTileMode);
+                    appearedTaskTarget -> {
+                        RemoteAnimationTargetCompat[] apps = Arrays.copyOf(
+                                mRecentsAnimationTargets.apps,
+                                mRecentsAnimationTargets.apps.length + 1);
+                        apps[apps.length - 1] = appearedTaskTarget;
+                        launchOtherTaskInLiveTileMode(appearedTaskTarget.taskId, apps);
+                    });
+            ActivityManagerWrapper.getInstance().registerTaskStackListener(
+                    mLiveTileRestartListener);
         }
 
         SystemUiProxy.INSTANCE.get(mContext).onOverviewShown(false, TAG);
@@ -1473,17 +1493,12 @@
         reset();
     }
 
-    private void launchOtherTaskInLiveTileMode(RemoteAnimationTargetCompat appearedTaskTarget) {
-        TaskView taskView = mRecentsView.getTaskView(appearedTaskTarget.taskId);
+    private void launchOtherTaskInLiveTileMode(int taskId, RemoteAnimationTargetCompat[] apps) {
+        TaskView taskView = mRecentsView.getTaskView(taskId);
         if (taskView == null) {
             return;
         }
 
-        RemoteAnimationTargetCompat[] apps = Arrays.copyOf(
-                mRecentsAnimationTargets.apps,
-                mRecentsAnimationTargets.apps.length + 1);
-        apps[apps.length - 1] = appearedTaskTarget;
-
         AnimatorSet anim = new AnimatorSet();
         TaskViewUtils.composeRecentsLaunchAnimator(
                 anim, taskView, apps,
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationTargets.java b/quickstep/src/com/android/quickstep/RecentsAnimationTargets.java
index 718c5ba..da0a664 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationTargets.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationTargets.java
@@ -41,4 +41,13 @@
     public boolean hasTargets() {
         return unfilteredApps.length != 0;
     }
+
+    public boolean hasTask(int taskId) {
+        for (RemoteAnimationTargetCompat target : unfilteredApps) {
+            if (target.taskId == taskId) {
+                return true;
+            }
+        }
+        return false;
+    }
 }