diff options
| author | 2023-02-02 21:37:01 +0000 | |
|---|---|---|
| committer | 2023-02-02 21:37:01 +0000 | |
| commit | 3a92f9c023a11a2a478bb6335d919bf91f579268 (patch) | |
| tree | d192c8a4dbec978c1e03f9cdd32830b574a53ea3 | |
| parent | a0535e7148f5102ee61aabed80182ac521f49e8a (diff) | |
| parent | bc2f7bc5bd9ca065651a8acdcf3bf4baa00e4918 (diff) | |
Merge "Merge "Per-app override for disabling ignoreOrientationRequest" into tm-qpr-dev am: 61a6250921 am: 0b3dcae402"
4 files changed, 74 insertions, 1 deletions
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index fd7371915ac5..83f089414706 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -1103,6 +1103,17 @@ public class ActivityInfo extends ComponentInfo implements Parcelable { public static final long ALWAYS_SANDBOX_DISPLAY_APIS = 185004937L; // buganizer id /** + * This change id excludes the packages it is applied to from ignoreOrientationRequest behaviour + * that can be enabled by the device manufacturers for the com.android.server.wm.DisplayArea + * or for the whole display. + * @hide + */ + @ChangeId + @Overridable + @Disabled + public static final long OVERRIDE_RESPECT_REQUESTED_ORIENTATION = 236283604L; // buganizer id + + /** * This change id excludes the packages it is applied to from the camera compat force rotation * treatment. See com.android.server.wm.DisplayRotationCompatPolicy for context. * @hide diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java index de631914bcc9..c2ddb4158846 100644 --- a/services/core/java/com/android/server/wm/DisplayArea.java +++ b/services/core/java/com/android/server/wm/DisplayArea.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; @@ -246,7 +247,22 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> { || orientation == ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) { return false; } - return getIgnoreOrientationRequest(); + return getIgnoreOrientationRequest() + && !shouldRespectOrientationRequestDueToPerAppOverride(); + } + + private boolean shouldRespectOrientationRequestDueToPerAppOverride() { + if (mDisplayContent == null) { + return false; + } + ActivityRecord activity = mDisplayContent.topRunningActivity( + /* considerKeyguardState= */ true); + return activity != null && activity.getTaskFragment() != null + // Checking TaskFragment rather than ActivityRecord to ensure that transition + // between fullscreen and PiP would work well. Checking TaskFragment rather than + // Task to ensure that Activity Embedding is excluded. + && activity.getTaskFragment().getWindowingMode() == WINDOWING_MODE_FULLSCREEN + && activity.mLetterboxUiController.isOverrideRespectRequestedOrientationEnabled(); } boolean getIgnoreOrientationRequest() { diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index 8d6de58c7246..9681789347cf 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -25,6 +25,7 @@ import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS; import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION; import static android.content.pm.ActivityInfo.OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE; import static android.content.pm.ActivityInfo.OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA; +import static android.content.pm.ActivityInfo.OVERRIDE_RESPECT_REQUESTED_ORIENTATION; import static android.content.pm.ActivityInfo.OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR; import static android.content.pm.ActivityInfo.OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT; import static android.content.pm.ActivityInfo.OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION; @@ -143,6 +144,8 @@ final class LetterboxUiController { private final boolean mIsOverrideOrientationOnlyForCameraEnabled; // Corresponds to OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION private final boolean mIsOverrideUseDisplayLandscapeNaturalOrientationEnabled; + // Corresponds to OVERRIDE_RESPECT_REQUESTED_ORIENTATION + private final boolean mIsOverrideRespectRequestedOrientationEnabled; // Corresponds to OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION private final boolean mIsOverrideCameraCompatDisableForceRotationEnabled; @@ -272,6 +275,8 @@ final class LetterboxUiController { isCompatChangeEnabled(OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA); mIsOverrideUseDisplayLandscapeNaturalOrientationEnabled = isCompatChangeEnabled(OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION); + mIsOverrideRespectRequestedOrientationEnabled = + isCompatChangeEnabled(OVERRIDE_RESPECT_REQUESTED_ORIENTATION); mIsOverrideCameraCompatDisableForceRotationEnabled = isCompatChangeEnabled(OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION); @@ -418,6 +423,10 @@ final class LetterboxUiController { mIsRefreshAfterRotationRequested = isRequested; } + boolean isOverrideRespectRequestedOrientationEnabled() { + return mIsOverrideRespectRequestedOrientationEnabled; + } + /** * Whether should fix display orientation to landscape natural orientation when a task is * fullscreen and the display is ignoring orientation requests. 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 7ad544256ed4..6db0f277661f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -1895,6 +1895,43 @@ public class SizeCompatTests extends WindowTestsBase { } @Test + @EnableCompatChanges({ActivityInfo.OVERRIDE_RESPECT_REQUESTED_ORIENTATION}) + public void testOverrideRespectRequestedOrientationIsEnabled_orientationIsRespected() { + // Set up a display in landscape + setUpDisplaySizeWithApp(2800, 1400); + + final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */ false, + RESIZE_MODE_UNRESIZEABLE, SCREEN_ORIENTATION_PORTRAIT); + activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + + // Display should be rotated. + assertEquals(SCREEN_ORIENTATION_PORTRAIT, activity.mDisplayContent.getOrientation()); + + // No size compat mode + assertFalse(activity.inSizeCompatMode()); + } + + @Test + @EnableCompatChanges({ActivityInfo.OVERRIDE_RESPECT_REQUESTED_ORIENTATION}) + public void testOverrideRespectRequestedOrientationIsEnabled_multiWindow_orientationIgnored() { + // Set up a display in landscape + setUpDisplaySizeWithApp(2800, 1400); + + final ActivityRecord activity = buildActivityRecord(/* supportsSizeChanges= */ false, + RESIZE_MODE_UNRESIZEABLE, SCREEN_ORIENTATION_PORTRAIT); + TaskFragment taskFragment = activity.getTaskFragment(); + spyOn(taskFragment); + activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + doReturn(WINDOWING_MODE_MULTI_WINDOW).when(taskFragment).getWindowingMode(); + + // Display should not be rotated. + assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, activity.mDisplayContent.getOrientation()); + + // No size compat mode + assertFalse(activity.inSizeCompatMode()); + } + + @Test public void testSplitAspectRatioForUnresizableLandscapeApps() { // Set up a display in portrait and ignoring orientation request. int screenWidth = 1400; |