From 24307a6b591cace5c91e3daa45822273eb9795c8 Mon Sep 17 00:00:00 2001 From: Mariia Sandrikova Date: Sat, 2 Apr 2022 02:45:37 +0100 Subject: [PATCH] Remember original orientation in size compat mode. We should use the original orientation of the activity when the new requested orientation is undefinded to avoid forcing the activity in the opposite orientation. Fix: 227642889 Test: atest WmTests:SizeCompatTests Change-Id: If7fcca5009d543b70f8f46f3116e4c8a14aee0ad --- .../com/android/server/wm/ActivityRecord.java | 11 ++++++++-- .../android/server/wm/SizeCompatTests.java | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 4bef126ee2c8a..dbf275b826486 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -8071,7 +8071,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final boolean orientationRequested = requestedOrientation != ORIENTATION_UNDEFINED; final int orientation = orientationRequested ? requestedOrientation - : newParentConfiguration.orientation; + // We should use the original orientation of the activity when possible to avoid + // forcing the activity in the opposite orientation. + : mCompatDisplayInsets.mOriginalRequestedOrientation != ORIENTATION_UNDEFINED + ? mCompatDisplayInsets.mOriginalRequestedOrientation + : newParentConfiguration.orientation; int rotation = newParentConfiguration.windowConfiguration.getRotation(); final boolean isFixedToUserRotation = mDisplayContent == null || mDisplayContent.getDisplayRotation().isFixedToUserRotation(); @@ -9339,8 +9343,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * compatibility mode activity compute the configuration without relying on its current display. */ static class CompatDisplayInsets { - /** The original rotation the compat insets were computed in */ + /** The original rotation the compat insets were computed in. */ final @Rotation int mOriginalRotation; + /** The original requested orientation for the activity. */ + final @Configuration.Orientation int mOriginalRequestedOrientation; /** The container width on rotation 0. */ private final int mWidth; /** The container height on rotation 0. */ @@ -9369,6 +9375,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Nullable Rect fixedOrientationBounds) { mOriginalRotation = display.getRotation(); mIsFloating = container.getWindowConfiguration().tasksAreFloating(); + mOriginalRequestedOrientation = container.getRequestedConfigurationOrientation(); if (mIsFloating) { final Rect containerBounds = container.getWindowConfiguration().getBounds(); mWidth = containerBounds.width(); diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 7b38a955f8229..76fb7ff2e6f86 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -1528,6 +1528,27 @@ public class SizeCompatTests extends WindowTestsBase { newActivityBounds.width()); } + @Test + public void testDisplayIgnoreOrientationRequest_orientationChangedToUnspecified() { + // Set up a display in landscape and ignoring orientation request. + setUpDisplaySizeWithApp(2800, 1400); + final DisplayContent display = mActivity.mDisplayContent; + display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + + // Portrait fixed app without max aspect. + prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); + + assertTrue(mActivity.isLetterboxedForFixedOrientationAndAspectRatio()); + assertFalse(mActivity.inSizeCompatMode()); + + mActivity.setRequestedOrientation(SCREEN_ORIENTATION_UNSPECIFIED); + + assertTrue(mActivity.inSizeCompatMode()); + // We should remember the original orientation. + assertEquals(mActivity.getResolvedOverrideConfiguration().orientation, + Configuration.ORIENTATION_PORTRAIT); + } + @Test public void testDisplayIgnoreOrientationRequest_newLaunchedMaxAspectApp() { // Set up a display in landscape and ignoring orientation request.