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