Clear fixed rotation if rotated recents activity becomes top

If recents animation is active, the transition is controlled by it.
There won't be a transition finish event after recents animation.
For example, if an activity finishes during swiping-up gesture,
the recents activity in rotated state won't be restored. So this
change checks whether recents become the top activity, then continue
the orientation update procedure to clear fixed rotation state and
let display orientation follow the current top.

Bug: 173143462
Test: atest RecentsAnimationControllerTest# \
            testClearFixedRotationLaunchingAppAfterCleanupAnimation
Change-Id: If82744bb846ac823c8fdd76bbf23b584b63776d4
(cherry picked from commit 498b87a347abb1571bc9c1cd63eb73f2808fb7e8)
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index a70e30f..adf0b44 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -5728,7 +5728,7 @@
             }
 
             if (animatingRecents != null && animatingRecents == mFixedRotationLaunchingApp
-                    && animatingRecents.isVisible()) {
+                    && animatingRecents.isVisible() && animatingRecents != topRunningActivity()) {
                 // The recents activity should be going to be invisible (switch to another app or
                 // return to original top). Only clear the top launching record without finishing
                 // the transform immediately because it won't affect display orientation. And before
diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java
index cfc50b5..d99fd0f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java
@@ -393,23 +393,25 @@
         // Simulate giving up the swipe up gesture to keep the original activity as top.
         mController.cleanupAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION);
         // The rotation transform should be cleared after updating orientation with display.
-        assertFalse(activity.hasFixedRotationTransform());
-        assertFalse(mDefaultDisplay.hasTopFixedRotationLaunchingApp());
+        assertTopFixedRotationLaunchingAppCleared(activity);
 
         // Simulate swiping up recents (home) in different rotation.
         final ActivityRecord home = mDefaultDisplay.getDefaultTaskDisplayArea().getHomeActivity();
-        mDefaultDisplay.setFixedRotationLaunchingApp(home, (mDefaultDisplay.getRotation() + 1) % 4);
-        mController = new RecentsAnimationController(mWm, mMockRunner, mAnimationCallbacks,
-                mDefaultDisplay.getDisplayId());
-        initializeRecentsAnimationController(mController, home);
-        assertTrue(home.hasFixedRotationTransform());
+        startRecentsInDifferentRotation(home);
 
+        // If the recents activity becomes the top running activity (e.g. the original top activity
+        // is either finishing or moved to back during recents animation), the display orientation
+        // will be determined by it so the fixed rotation must be cleared.
+        activity.finishing = true;
+        mController.cleanupAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION);
+        assertTopFixedRotationLaunchingAppCleared(home);
+
+        startRecentsInDifferentRotation(home);
         // Assume recents activity becomes invisible for some reason (e.g. screen off).
         home.setVisible(false);
         mController.cleanupAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION);
         // Although there won't be a transition finish callback, the fixed rotation must be cleared.
-        assertFalse(home.hasFixedRotationTransform());
-        assertFalse(mDefaultDisplay.hasTopFixedRotationLaunchingApp());
+        assertTopFixedRotationLaunchingAppCleared(home);
     }
 
     @Test
@@ -503,6 +505,21 @@
         return homeActivity;
     }
 
+    private void startRecentsInDifferentRotation(ActivityRecord recentsActivity) {
+        final DisplayContent displayContent = recentsActivity.mDisplayContent;
+        displayContent.setFixedRotationLaunchingApp(recentsActivity,
+                (displayContent.getRotation() + 1) % 4);
+        mController = new RecentsAnimationController(mWm, mMockRunner, mAnimationCallbacks,
+                displayContent.getDisplayId());
+        initializeRecentsAnimationController(mController, recentsActivity);
+        assertTrue(recentsActivity.hasFixedRotationTransform());
+    }
+
+    private static void assertTopFixedRotationLaunchingAppCleared(ActivityRecord activity) {
+        assertFalse(activity.hasFixedRotationTransform());
+        assertFalse(activity.mDisplayContent.hasTopFixedRotationLaunchingApp());
+    }
+
     private static void initializeRecentsAnimationController(RecentsAnimationController controller,
             ActivityRecord activity) {
         controller.initialize(activity.getActivityType(), new SparseBooleanArray(), activity);