Cancel the existing recents animation before any initialization

- In the rare case that we are canceling the recents animation as a
  part of starting another recents animation, ensure that we do it
  before we move the target activity to be visible, otherwise the
  cancelation will undo the previous work.

Bug: 193851085
Test: atest RecentsAnimationControllerTest
Change-Id: I22589a034eab3b1fab10f4b677f777b282305bbd
Merged-In: I22589a034eab3b1fab10f4b677f777b282305bbd
(cherry picked from commit 4ebdbc9db168d38341c131f9c53cf799311b6601)
(cherry picked from commit 7d6151c61ede945a1b29154fd658a425818db049)
diff --git a/services/core/java/com/android/server/wm/ b/services/core/java/com/android/server/wm/
index b1bdc11..fea52f2 100644
--- a/services/core/java/com/android/server/wm/
+++ b/services/core/java/com/android/server/wm/
@@ -164,6 +164,13 @@
         ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "startRecentsActivity(): intent=%s", mTargetIntent);
         Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "RecentsAnimation#startRecentsActivity");
+        // Cancel any existing recents animation running synchronously (do not hold the
+        // WM lock) before starting the newly requested recents animation as they can not coexist
+        if (mWindowManager.getRecentsAnimationController() != null) {
+            mWindowManager.getRecentsAnimationController().forceCancelAnimation(
+                    REORDER_MOVE_TO_ORIGINAL_POSITION, "startRecentsActivity");
+        }
         // If the activity is associated with the root recents task, then try and get that first
         Task targetRootTask = mDefaultTaskDisplayArea.getRootTask(WINDOWING_MODE_UNDEFINED,
@@ -237,12 +244,7 @@
             // Fetch all the surface controls and pass them to the client to get the animation
-            // started. Cancel any existing recents animation running synchronously (do not hold the
-            // WM lock)
-            if (mWindowManager.getRecentsAnimationController() != null) {
-                mWindowManager.getRecentsAnimationController().forceCancelAnimation(
-                        REORDER_MOVE_TO_ORIGINAL_POSITION, "startRecentsActivity");
-            }
+            // started
             mWindowManager.initializeRecentsAnimation(mTargetActivityType, recentsAnimationRunner,
                     this, mDefaultTaskDisplayArea.getDisplayId(),
                     mTaskSupervisor.mRecentTasks.getRecentTaskIds(), targetActivity);