Only ignore rotation update if recents animation is on top

Otherwise the display rotation is not updated after switching
activities in different orientations by quickstep gesture. E.g.
Swipe from a portrait activity to a landscape activity, the
landscape activity will show as portrait.

Bug: 157447718
Test: atest DisplayContentTests#testRecentsNotRotatingWithFixedRotation
Change-Id: I4469dd668ecdb0d299395e0c5536c2f00c80a84d
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index c24c1e4..30070a3 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -5664,10 +5664,10 @@
          * Return {@code true} if there is an ongoing animation to the "Recents" activity and this
          * activity as a fixed orientation so shouldn't be rotated.
          */
-        boolean isFixedOrientationRecentsAnimating() {
+        boolean isTopFixedOrientationRecentsAnimating() {
             return mAnimatingRecents != null
                     && mAnimatingRecents.getRequestedConfigurationOrientation()
-                    != ORIENTATION_UNDEFINED;
+                    != ORIENTATION_UNDEFINED && !hasTopFixedRotationLaunchingApp();
         }
 
         @Override
diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java
index f093fd3..37ecee8 100644
--- a/services/core/java/com/android/server/wm/DisplayRotation.java
+++ b/services/core/java/com/android/server/wm/DisplayRotation.java
@@ -432,7 +432,7 @@
             }
 
             if (mDisplayContent.mFixedRotationTransitionListener
-                    .isFixedOrientationRecentsAnimating()) {
+                    .isTopFixedOrientationRecentsAnimating()) {
                 // During the recents animation, the closing app might still be considered on top.
                 // In order to ignore its requested orientation to avoid a sensor led rotation (e.g
                 // user rotating the device while the recents animation is running), we ignore
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 8cf8507..545901e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -1236,18 +1236,28 @@
     public void testRecentsNotRotatingWithFixedRotation() {
         final DisplayRotation displayRotation = mDisplayContent.getDisplayRotation();
         doCallRealMethod().when(displayRotation).updateRotationUnchecked(anyBoolean());
-        doCallRealMethod().when(displayRotation).updateOrientation(anyInt(), anyBoolean());
+        // Skip freezing so the unrelated conditions in updateRotationUnchecked won't disturb.
+        doNothing().when(mWm).startFreezingDisplay(anyInt(), anyInt(), any(), anyInt());
 
         final ActivityRecord recentsActivity = createActivityRecord(mDisplayContent,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_RECENTS);
         recentsActivity.setRequestedOrientation(SCREEN_ORIENTATION_PORTRAIT);
 
+        // Do not rotate if the recents animation is animating on top.
         mDisplayContent.mFixedRotationTransitionListener.onStartRecentsAnimation(recentsActivity);
         displayRotation.setRotation((displayRotation.getRotation() + 1) % 4);
         assertFalse(displayRotation.updateRotationUnchecked(false));
 
+        // Rotation can be updated if the recents animation is finished.
         mDisplayContent.mFixedRotationTransitionListener.onFinishRecentsAnimation(false);
         assertTrue(displayRotation.updateRotationUnchecked(false));
+
+        // Rotation can be updated if the recents animation is animating but it is not on top, e.g.
+        // switching activities in different orientations by quickstep gesture.
+        mDisplayContent.mFixedRotationTransitionListener.onStartRecentsAnimation(recentsActivity);
+        mDisplayContent.setFixedRotationLaunchingAppUnchecked(mAppWindow.mActivityRecord);
+        displayRotation.setRotation((displayRotation.getRotation() + 1) % 4);
+        assertTrue(displayRotation.updateRotationUnchecked(false));
     }
 
     @Test