diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 522d90760b15f..b0947cfb43e3b 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -5486,10 +5486,10 @@ class DisplayContent extends DisplayArea.Root implements WindowManagerPolicy.Dis * 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 e1073802ccb28..c63128c15e8d0 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 @@ public class DisplayRotation { } 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 8cf850736cb28..545901e550c1b 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 class DisplayContentTests extends WindowTestsBase { 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