Fix regression with docking from recents transition

Because we move the task to the front in startRecentsActivity, we
always overrode the app transition type. Instead, we should remove
this logic and keep a flag whether the animation was prolonging was
finished already. If it was finished already, don't start the
prolonging when starting the transition.

Bug: 27154882
Change-Id: I1cd9e323867726ebd4b131ed5c13c3834d0f1107
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 9199d10..094b217 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -39,6 +39,7 @@
 import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
 import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation;
 import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
+import static com.android.server.wm.AppWindowAnimator.PROLONG_ANIMATION_AT_START;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
@@ -228,6 +229,7 @@
 
     private int mLastClipRevealMaxTranslation;
     private boolean mLastHadClipReveal;
+    private boolean mProlongedAnimationsEnded;
 
     AppTransition(Context context, WindowManagerService service) {
         mContext = context;
@@ -371,6 +373,22 @@
                 topClosingAppAnimator != null ? topClosingAppAnimator.animation : null);
         mService.getDefaultDisplayContentLocked().getDockedDividerController()
                 .notifyAppTransitionStarting(openingApps, closingApps);
+
+        // Prolong the start for the transition when docking a task from recents, unless recents
+        // ended it already then we don't need to wait.
+        if (mNextAppTransition == TRANSIT_DOCK_TASK_FROM_RECENTS && !mProlongedAnimationsEnded) {
+            for (int i = openingApps.size() - 1; i >= 0; i--) {
+                final AppWindowAnimator appAnimator = openingApps.valueAt(i).mAppAnimator;
+                appAnimator.startProlongAnimation(PROLONG_ANIMATION_AT_START);
+            }
+        }
+    }
+
+    /**
+     * Let the transitions manager know that the somebody wanted to end the prolonged animations.
+     */
+    void notifyProlongedAnimationsEnded() {
+        mProlongedAnimationsEnded = true;
     }
 
     void clear() {
@@ -380,6 +398,7 @@
         mNextAppTransitionAnimationsSpecsFuture = null;
         mDefaultNextAppTransitionAnimationSpec = null;
         mAnimationFinishedCallback = null;
+        mProlongedAnimationsEnded = false;
     }
 
     void freeze() {
@@ -1914,14 +1933,6 @@
                 setAppTransition(transit);
             }
         }
-        if (transit != TRANSIT_DOCK_TASK_FROM_RECENTS
-                && mNextAppTransition == TRANSIT_DOCK_TASK_FROM_RECENTS) {
-
-            // Somebody is trying to start another transition while we are waiting for the docking
-            // window to be drawn. Because TRANSIT_DOCK_TASK_FROM_RECENTS starts prolonged
-            // animations, we need to override it or our prolonged animations will never be ended.
-            setAppTransition(transit);
-        }
         boolean prepared = prepare();
         if (isTransitionSet()) {
             mService.mH.removeMessages(H.APP_TRANSITION_TIMEOUT);