From 271edc361c46561ee15ee45629853619ca30aa30 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Wed, 2 Mar 2022 17:16:45 +0800 Subject: [PATCH] Unset last orientation for fixed orientation transient launch The commit 7c6f6b8 uses the requested orientation. That is fine if the next app has different requested orientation. But if the next app is still the transient launch app itself, then no change will be detected by DisplayRotation#updateOrientation, and then the display stay in previous rotation. Change to use UNSET so it is similar to force update for the next time calling updateOrientation(). Bug: 216169338 Test: atest TransitionTests#testDeferRotationForTransientLaunch Change-Id: Id467d1910b32d8699fb34e7fdc04c91c7b450c71 --- .../com/android/server/wm/DisplayContent.java | 15 ++++++--------- .../com/android/server/wm/DisplayRotation.java | 6 ++---- .../server/wm/RecentsAnimationControllerTest.java | 2 +- .../com/android/server/wm/TransitionTests.java | 3 ++- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 1c0687a351e48..c04200ec12f2e 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -6368,10 +6368,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } /** - * Returns the fixed orientation requested by a transient launch (e.g. recents animation). - * If it doesn't return SCREEN_ORIENTATION_UNSET, the rotation change should be deferred. + * Returns {@code true} if the transient launch (e.g. recents animation) requested a fixed + * orientation, then the rotation change should be deferred. */ - @ActivityInfo.ScreenOrientation int getTransientFixedOrientation() { + boolean shouldDeferRotation() { ActivityRecord source = null; if (mTransitionController.isShellTransitionsEnabled()) { final ActivityRecord r = mFixedRotationLaunchingApp; @@ -6383,13 +6383,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } if (source == null || source.getRequestedConfigurationOrientation( true /* forDisplay */) == ORIENTATION_UNDEFINED) { - return SCREEN_ORIENTATION_UNSET; + return false; } - if (!mWmService.mPolicy.okToAnimate(false /* ignoreScreenOn */)) { - // If screen is off or the device is going to sleep, then still allow to update. - return SCREEN_ORIENTATION_UNSET; - } - return source.mOrientation; + // If screen is off or the device is going to sleep, then still allow to update. + return mWmService.mPolicy.okToAnimate(false /* ignoreScreenOn */); } @Override diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index f116fffa80759..262ddae027650 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -446,12 +446,10 @@ public class DisplayRotation { return false; } - final int transientFixedOrientation = - mDisplayContent.mFixedRotationTransitionListener.getTransientFixedOrientation(); - if (transientFixedOrientation != SCREEN_ORIENTATION_UNSET) { + if (mDisplayContent.mFixedRotationTransitionListener.shouldDeferRotation()) { // Makes sure that after the transition is finished, updateOrientation() can see // the difference from the latest orientation source. - mLastOrientation = transientFixedOrientation; + mLastOrientation = SCREEN_ORIENTATION_UNSET; // 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/RecentsAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java index 3c3351c0b2079..021568dd97b45 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java @@ -451,7 +451,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { final DisplayRotation displayRotation = mDisplayContent.getDisplayRotation(); final int topOrientation = DisplayContentTests.getRotatedOrientation(mDefaultDisplay); assertFalse(displayRotation.updateOrientation(topOrientation, false /* forceUpdate */)); - assertEquals(recents.mOrientation, displayRotation.getLastOrientation()); + assertEquals(ActivityInfo.SCREEN_ORIENTATION_UNSET, displayRotation.getLastOrientation()); final int prevRotation = mDisplayContent.getRotation(); mWm.cleanupRecentsAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION); diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java index 501f0c4ac1b3d..8474c3829827a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; +import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; @@ -691,7 +692,7 @@ public class TransitionTests extends WindowTestsBase { anyInt() /* orientation */, anyInt() /* lastRotation */); // Rotation update is skipped while the recents animation is running. assertFalse(mDisplayContent.updateRotationUnchecked()); - assertEquals(SCREEN_ORIENTATION_NOSENSOR, displayRotation.getLastOrientation()); + assertEquals(SCREEN_ORIENTATION_UNSET, displayRotation.getLastOrientation()); // Return to the app without fixed orientation from recents. app.moveFocusableActivityToTop("test"); player.finish();