From 3c5d8abf64977e40d38107500c97aaf8dd13756b Mon Sep 17 00:00:00 2001 From: Graciela Wissen Putri Date: Mon, 24 Jul 2023 08:37:24 +0000 Subject: [PATCH] [2/n] Override app orientation if user chooses fullscreen Fullscreen option is guarded behind both aspect ratio settings flag and user aspect ratio fullscreen flag. User aspect ratio override will only apply if display is set to ignore orientation request. Test: atest WmTests:LetterboxUiControllerTest Bug: 291900454 Change-Id: Ia3ef7e47c72db1c8adbd81f7cdd1da6f950965bf --- .../server/wm/LetterboxUiController.java | 42 +++++++++++++++---- .../server/wm/LetterboxUiControllerTest.java | 29 +++++++++++++ 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index 394105a646f18..7d3c87a7556b6 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -37,6 +37,7 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; +import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_USER; import static android.content.pm.ActivityInfo.isFixedOrientation; import static android.content.pm.ActivityInfo.isFixedOrientationLandscape; import static android.content.pm.ActivityInfo.screenOrientationToString; @@ -44,6 +45,7 @@ import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_16_9; import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_3_2; import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_4_3; import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_DISPLAY_SIZE; +import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_FULLSCREEN; import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_SPLIT_SCREEN; import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_UNSET; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; @@ -642,6 +644,10 @@ final class LetterboxUiController { @ScreenOrientation int overrideOrientationIfNeeded(@ScreenOrientation int candidate) { + if (shouldApplyUserFullscreenOverride()) { + return SCREEN_ORIENTATION_USER; + } + // In some cases (e.g. Kids app) we need to map the candidate orientation to some other // orientation. candidate = mActivityRecord.mWmService.mapOrientationRequest(candidate); @@ -1103,20 +1109,28 @@ final class LetterboxUiController { } boolean shouldApplyUserMinAspectRatioOverride() { - if (!mLetterboxConfiguration.isUserAppAspectRatioSettingsEnabled()) { + if (!mLetterboxConfiguration.isUserAppAspectRatioSettingsEnabled() + || mActivityRecord.mDisplayContent == null + || !mActivityRecord.mDisplayContent.getIgnoreOrientationRequest()) { return false; } - try { - final int userAspectRatio = mActivityRecord.mAtmService.getPackageManager() - .getUserMinAspectRatio(mActivityRecord.packageName, mActivityRecord.mUserId); - mUserAspectRatio = userAspectRatio; - return userAspectRatio != USER_MIN_ASPECT_RATIO_UNSET; - } catch (RemoteException e) { - // Don't apply user aspect ratio override - Slog.w(TAG, "Exception thrown retrieving aspect ratio user override " + this, e); + mUserAspectRatio = getUserMinAspectRatioOverrideCode(); + + return mUserAspectRatio != USER_MIN_ASPECT_RATIO_UNSET + && mUserAspectRatio != USER_MIN_ASPECT_RATIO_FULLSCREEN; + } + + boolean shouldApplyUserFullscreenOverride() { + if (!mLetterboxConfiguration.isUserAppAspectRatioFullscreenEnabled() + || mActivityRecord.mDisplayContent == null + || !mActivityRecord.mDisplayContent.getIgnoreOrientationRequest()) { return false; } + + mUserAspectRatio = getUserMinAspectRatioOverrideCode(); + + return mUserAspectRatio == USER_MIN_ASPECT_RATIO_FULLSCREEN; } float getUserMinAspectRatio() { @@ -1137,6 +1151,16 @@ final class LetterboxUiController { } } + private int getUserMinAspectRatioOverrideCode() { + try { + return mActivityRecord.mAtmService.getPackageManager() + .getUserMinAspectRatio(mActivityRecord.packageName, mActivityRecord.mUserId); + } catch (RemoteException e) { + Slog.w(TAG, "Exception thrown retrieving aspect ratio user override " + this, e); + } + return mUserAspectRatio; + } + private float getDisplaySizeMinAspectRatio() { final DisplayArea displayArea = mActivityRecord.getDisplayArea(); if (displayArea == null) { diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java index 81a37943505f2..72ab18dca02f7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java @@ -36,6 +36,7 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; +import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_USER; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.view.InsetsSource.FLAG_INSETS_ROUNDED_CORNER; @@ -778,6 +779,34 @@ public class LetterboxUiControllerTest extends WindowTestsBase { /* candidate */ SCREEN_ORIENTATION_UNSPECIFIED), SCREEN_ORIENTATION_PORTRAIT); } + @Test + public void testOverrideOrientationIfNeeded_userFullscreenOverride_returnsUser() { + spyOn(mController); + doReturn(true).when(mController).shouldApplyUserFullscreenOverride(); + + assertEquals(mController.overrideOrientationIfNeeded( + /* candidate */ SCREEN_ORIENTATION_UNSPECIFIED), SCREEN_ORIENTATION_USER); + } + + @Test + @EnableCompatChanges({OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_ANY_ORIENTATION}) + public void testOverrideOrientationIfNeeded_userFullScreenOverrideOverSystem_returnsUser() { + spyOn(mController); + doReturn(true).when(mController).shouldApplyUserFullscreenOverride(); + + assertEquals(mController.overrideOrientationIfNeeded( + /* candidate */ SCREEN_ORIENTATION_PORTRAIT), SCREEN_ORIENTATION_USER); + } + + @Test + public void testOverrideOrientationIfNeeded_userFullScreenOverrideDisabled_returnsUnchanged() { + spyOn(mController); + doReturn(false).when(mController).shouldApplyUserFullscreenOverride(); + + assertEquals(mController.overrideOrientationIfNeeded( + /* candidate */ SCREEN_ORIENTATION_PORTRAIT), SCREEN_ORIENTATION_PORTRAIT); + } + // shouldUseDisplayLandscapeNaturalOrientation @Test