diff options
| author | 2023-01-31 00:58:05 +0000 | |
|---|---|---|
| committer | 2023-01-31 01:38:04 +0000 | |
| commit | dc8d87fe419c82d03f0458c5ac3b7d051a6a8813 (patch) | |
| tree | 3823c2da292452c9a261c023341d10cc8d9386d9 | |
| parent | c1cb41e9f7be008106c833cafe6029b1345aedc5 (diff) | |
Add a DeviceConfig flag for ignoreOrientationRequest.
This allows device manufacturers to control ignoreOrientationRequest behavior from the server side.
Fix: 261614343
Test: atest WmTests:SizeCompatTests
Test: adb shell device_config put window_manager allow_ignore_orientation_request false
Change-Id: I457cb0a1cb95fc3e40bef3fdba75f49cc805e23c
4 files changed, 54 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/wm/LetterboxConfiguration.java b/services/core/java/com/android/server/wm/LetterboxConfiguration.java index 800fe090b457..b64420af7c98 100644 --- a/services/core/java/com/android/server/wm/LetterboxConfiguration.java +++ b/services/core/java/com/android/server/wm/LetterboxConfiguration.java @@ -18,6 +18,7 @@ package com.android.server.wm; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.wm.LetterboxConfigurationDeviceConfig.KEY_ALLOW_IGNORE_ORIENTATION_REQUEST; import static com.android.server.wm.LetterboxConfigurationDeviceConfig.KEY_ENABLE_DISPLAY_ROTATION_IMMERSIVE_APP_COMPAT_POLICY; import android.annotation.IntDef; @@ -311,12 +312,23 @@ final class LetterboxConfiguration { mDeviceConfig.updateFlagActiveStatus( /* isActive */ mIsDisplayRotationImmersiveAppCompatPolicyEnabled, /* key */ KEY_ENABLE_DISPLAY_ROTATION_IMMERSIVE_APP_COMPAT_POLICY); + mDeviceConfig.updateFlagActiveStatus( + /* isActive */ true, + /* key */ KEY_ALLOW_IGNORE_ORIENTATION_REQUEST); mLetterboxConfigurationPersister = letterboxConfigurationPersister; mLetterboxConfigurationPersister.start(); } /** + * Whether enabling ignoreOrientationRequest is allowed on the device. This value is controlled + * via {@link android.provider.DeviceConfig}. + */ + boolean isIgnoreOrientationRequestAllowed() { + return mDeviceConfig.getFlag(KEY_ALLOW_IGNORE_ORIENTATION_REQUEST); + } + + /** * Overrides the aspect ratio of letterbox for fixed orientation. If given value is <= {@link * #MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO}, both it and a value of {@link * com.android.internal.R.dimen.config_fixedOrientationLetterboxAspectRatio} will be ignored and diff --git a/services/core/java/com/android/server/wm/LetterboxConfigurationDeviceConfig.java b/services/core/java/com/android/server/wm/LetterboxConfigurationDeviceConfig.java index cf123a1f9ace..3f067e3a1556 100644 --- a/services/core/java/com/android/server/wm/LetterboxConfigurationDeviceConfig.java +++ b/services/core/java/com/android/server/wm/LetterboxConfigurationDeviceConfig.java @@ -38,10 +38,16 @@ final class LetterboxConfigurationDeviceConfig private static final boolean DEFAULT_VALUE_ENABLE_DISPLAY_ROTATION_IMMERSIVE_APP_COMPAT_POLICY = true; + static final String KEY_ALLOW_IGNORE_ORIENTATION_REQUEST = + "allow_ignore_orientation_request"; + private static final boolean DEFAULT_VALUE_ALLOW_IGNORE_ORIENTATION_REQUEST = true; + @VisibleForTesting static final Map<String, Boolean> sKeyToDefaultValueMap = Map.of( KEY_ENABLE_DISPLAY_ROTATION_IMMERSIVE_APP_COMPAT_POLICY, - DEFAULT_VALUE_ENABLE_DISPLAY_ROTATION_IMMERSIVE_APP_COMPAT_POLICY + DEFAULT_VALUE_ENABLE_DISPLAY_ROTATION_IMMERSIVE_APP_COMPAT_POLICY, + KEY_ALLOW_IGNORE_ORIENTATION_REQUEST, + DEFAULT_VALUE_ALLOW_IGNORE_ORIENTATION_REQUEST ); // Whether enabling rotation compat policy for immersive apps that prevents auto rotation @@ -52,6 +58,10 @@ final class LetterboxConfigurationDeviceConfig private boolean mIsDisplayRotationImmersiveAppCompatPolicyEnabled = DEFAULT_VALUE_ENABLE_DISPLAY_ROTATION_IMMERSIVE_APP_COMPAT_POLICY; + // Whether enabling ignoreOrientationRequest is allowed on the device. + private boolean mIsAllowIgnoreOrientationRequest = + DEFAULT_VALUE_ALLOW_IGNORE_ORIENTATION_REQUEST; + // Set of active device configs that need to be updated in // DeviceConfig.OnPropertiesChangedListener#onPropertiesChanged. private final ArraySet<String> mActiveDeviceConfigsSet = new ArraySet<>(); @@ -93,6 +103,8 @@ final class LetterboxConfigurationDeviceConfig switch (key) { case KEY_ENABLE_DISPLAY_ROTATION_IMMERSIVE_APP_COMPAT_POLICY: return mIsDisplayRotationImmersiveAppCompatPolicyEnabled; + case KEY_ALLOW_IGNORE_ORIENTATION_REQUEST: + return mIsAllowIgnoreOrientationRequest; default: throw new AssertionError("Unexpected flag name: " + key); } @@ -108,6 +120,10 @@ final class LetterboxConfigurationDeviceConfig mIsDisplayRotationImmersiveAppCompatPolicyEnabled = getDeviceConfig(key, defaultValue); break; + case KEY_ALLOW_IGNORE_ORIENTATION_REQUEST: + mIsAllowIgnoreOrientationRequest = + getDeviceConfig(key, defaultValue); + break; default: throw new AssertionError("Unexpected flag name: " + key); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 5065014b9bee..2911890bf80e 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4170,7 +4170,8 @@ public class WindowManagerService extends IWindowManager.Stub * <p>Note: this assumes that {@link #mGlobalLock} is held by the caller. */ boolean isIgnoreOrientationRequestDisabled() { - return mIsIgnoreOrientationRequestDisabled; + return mIsIgnoreOrientationRequestDisabled + || !mLetterboxConfiguration.isIgnoreOrientationRequestAllowed(); } @Override 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 a09bb337d56f..5b6c43fe6e9e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -2313,6 +2313,29 @@ public class SizeCompatTests extends WindowTestsBase { } @Test + public void testDisplayIgnoreOrientationRequest_disabledViaDeviceConfig_orientationRespected() { + // 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 */); + + spyOn(activity.mWmService.mLetterboxConfiguration); + doReturn(true).when(activity.mWmService.mLetterboxConfiguration) + .isIgnoreOrientationRequestAllowed(); + + // Display should not be rotated. + assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, activity.mDisplayContent.getOrientation()); + + doReturn(false).when(activity.mWmService.mLetterboxConfiguration) + .isIgnoreOrientationRequestAllowed(); + + // Display should be rotated. + assertEquals(SCREEN_ORIENTATION_PORTRAIT, activity.mDisplayContent.getOrientation()); + } + + @Test public void testSandboxDisplayApis_unresizableAppNotSandboxed() { // Set up a display in landscape with an unresizable app. setUpDisplaySizeWithApp(2500, 1000); |