diff options
4 files changed, 70 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/AppCompatCameraOverrides.java b/services/core/java/com/android/server/wm/AppCompatCameraOverrides.java index 9754595581a0..47d30c98120c 100644 --- a/services/core/java/com/android/server/wm/AppCompatCameraOverrides.java +++ b/services/core/java/com/android/server/wm/AppCompatCameraOverrides.java @@ -164,12 +164,14 @@ class AppCompatCameraOverrides { * <p>The treatment is enabled when the following conditions are met: * <ul> * <li>Feature flag gating the camera compatibility free-form treatment is enabled. - * <li>Activity is opted in by the device manufacturer with override. + * <li>Activity is opted-in using per-app override, or the treatment is enabled for all apps. * </ul> */ boolean shouldApplyFreeformTreatmentForCameraCompat() { - return Flags.enableCameraCompatForDesktopWindowing() && isChangeEnabled(mActivityRecord, - OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT); + return Flags.enableCameraCompatForDesktopWindowing() && (isChangeEnabled(mActivityRecord, + OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT) + || mActivityRecord.mWmService.mAppCompatConfiguration + .isCameraCompatFreeformWindowingTreatmentEnabled()); } boolean isOverrideOrientationOnlyForCameraEnabled() { diff --git a/services/core/java/com/android/server/wm/AppCompatConfiguration.java b/services/core/java/com/android/server/wm/AppCompatConfiguration.java index 38c6de146293..9a15c4a8bff2 100644 --- a/services/core/java/com/android/server/wm/AppCompatConfiguration.java +++ b/services/core/java/com/android/server/wm/AppCompatConfiguration.java @@ -304,6 +304,11 @@ final class AppCompatConfiguration { // See RefreshCallbackItem for context. private boolean mIsCameraCompatRefreshCycleThroughStopEnabled = true; + // Whether camera compat freeform treatment should be enabled for all eligible activities. + // This has the same effect as enabling the per-app override + // ActivityInfo.OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT for every app. + private boolean mIsCameraCompatFreeformWindowingTreatmentEnabled = false; + // Whether should ignore app requested orientation in response to an app // calling Activity#setRequestedOrientation. See // LetterboxUiController#shouldIgnoreRequestedOrientation for details. @@ -1351,6 +1356,30 @@ final class AppCompatConfiguration { } /** + * Sets whether the camera compatibility treatment in freeform windowing mode is enabled for + * all fixed-orientation apps when using camera. + */ + void setIsCameraCompatFreeformWindowingTreatmentEnabled(boolean enabled) { + mIsCameraCompatFreeformWindowingTreatmentEnabled = enabled; + } + + /** + * Whether the camera compatibility treatment in freeform windowing mode is enabled for all + * fixed-orientation apps when using camera. + */ + boolean isCameraCompatFreeformWindowingTreatmentEnabled() { + return mIsCameraCompatFreeformWindowingTreatmentEnabled; + } + + /** + * Resets whether the camera compatibility treatment in freeform windowing mode is enabled for + * all fixed-orientation apps when using camera. + */ + void resetIsCameraCompatFreeformWindowingTreatmentEnabled() { + mIsCameraCompatFreeformWindowingTreatmentEnabled = false; + } + + /** * Checks whether rotation compat policy for immersive apps that prevents auto rotation * into non-optimal screen orientation while in fullscreen is enabled at build time. This is * used when we need to safely initialize a component before the {@link DeviceConfig} flag diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java index fe2bcc7a74f3..44f5f51eb623 100644 --- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java +++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java @@ -1166,6 +1166,10 @@ public class WindowManagerShellCommand extends ShellCommand { case "--cameraCompatAspectRatio": runSetCameraCompatAspectRatio(pw); break; + case "--isCameraCompatFreeformWindowingTreatmentEnabled": + runSetBooleanFlag(pw, mAppCompatConfiguration + ::setIsCameraCompatFreeformWindowingTreatmentEnabled); + break; default: getErrPrintWriter().println( "Error: Unrecognized letterbox style option: " + arg); @@ -1260,6 +1264,10 @@ public class WindowManagerShellCommand extends ShellCommand { case "cameraCompatAspectRatio": mAppCompatConfiguration.resetCameraCompatAspectRatio(); break; + case "isCameraCompatFreeformWindowingTreatmentEnabled": + mAppCompatConfiguration + .resetIsCameraCompatFreeformWindowingTreatmentEnabled(); + break; default: getErrPrintWriter().println( "Error: Unrecognized letterbox style option: " + arg); @@ -1371,6 +1379,7 @@ public class WindowManagerShellCommand extends ShellCommand { mAppCompatConfiguration.resetCameraCompatRefreshEnabled(); mAppCompatConfiguration.resetCameraCompatRefreshCycleThroughStopEnabled(); mAppCompatConfiguration.resetCameraCompatAspectRatio(); + mAppCompatConfiguration.resetIsCameraCompatFreeformWindowingTreatmentEnabled(); } } @@ -1445,6 +1454,10 @@ public class WindowManagerShellCommand extends ShellCommand { + mAppCompatConfiguration.isUserAppAspectRatioSettingsEnabled()); pw.println("Is the fullscreen option in user aspect ratio settings enabled: " + mAppCompatConfiguration.isUserAppAspectRatioFullscreenEnabled()); + pw.println("Default aspect ratio for camera compat freeform: " + + mAppCompatConfiguration.getCameraCompatAspectRatio()); + pw.println("Is camera compatibility freeform treatment enabled for all apps: " + + mAppCompatConfiguration.isCameraCompatFreeformWindowingTreatmentEnabled()); } return 0; } @@ -1701,10 +1714,13 @@ public class WindowManagerShellCommand extends ShellCommand { pw.println(" happen using the \"stopped -> resumed\" cycle rather than"); pw.println(" \"paused -> resumed\" cycle."); pw.println(" --cameraCompatAspectRatio aspectRatio"); - pw.println(" Aspect ratio of letterbox for fixed-orientation camera apps, during "); + pw.println(" Aspect ratio of letterbox for fixed-orientation camera apps, during"); pw.println(" freeform camera compat mode. If aspectRatio <= " + AppCompatConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO); pw.println(" it will be ignored."); + pw.println(" --isCameraCompatFreeformWindowingTreatmentEnabled [true|1|false|0]"); + pw.println(" Whether camera compat treatment is enabled in freeform mode for all"); + pw.println(" eligible apps."); pw.println(" reset-letterbox-style [aspectRatio|cornerRadius|backgroundType"); pw.println(" |backgroundColor|wallpaperBlurRadius|wallpaperDarkScrimAlpha"); pw.println(" |horizontalPositionMultiplier|verticalPositionMultiplier"); @@ -1714,7 +1730,8 @@ public class WindowManagerShellCommand extends ShellCommand { pw.println(" |persistentPositionMultiplierForHorizontalReachability"); pw.println(" |persistentPositionMultiplierForVerticalReachability"); pw.println(" |defaultPositionMultiplierForVerticalReachability"); - pw.println(" |cameraCompatAspectRatio]"); + pw.println(" |cameraCompatAspectRatio"); + pw.println(" |isCameraCompatFreeformWindowingTreatmentEnabled]"); pw.println(" Resets overrides to default values for specified properties separated"); pw.println(" by space, e.g. 'reset-letterbox-style aspectRatio cornerRadius'."); pw.println(" If no arguments provided, all values will be reset."); diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraOverridesTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraOverridesTest.java index d5ed048032e7..1d138e4a48d9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraOverridesTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraOverridesTest.java @@ -249,6 +249,18 @@ public class AppCompatCameraOverridesTest extends WindowTestsBase { } @Test + @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING) + public void testShouldApplyCameraCompatFreeformTreatment_enabledByShellCommand_returnsTrue() { + runTestScenario((robot) -> { + robot.activity().createActivityWithComponentInNewTask(); + + robot.setCameraCompatTreatmentEnabledViaShellCommand(true); + + robot.checkShouldApplyFreeformTreatmentForCameraCompat(true); + }); + } + + @Test @EnableCompatChanges({OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA, OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA, OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT}) @@ -350,6 +362,11 @@ public class AppCompatCameraOverridesTest extends WindowTestsBase { spyOn(displayContent.mAppCompatCameraPolicy); } + void setCameraCompatTreatmentEnabledViaShellCommand(boolean enabled) { + activity().top().mWmService.mAppCompatConfiguration + .setIsCameraCompatFreeformWindowingTreatmentEnabled(enabled); + } + void checkShouldRefreshActivityForCameraCompat(boolean expected) { Assert.assertEquals(getAppCompatCameraOverrides() .shouldRefreshActivityForCameraCompat(), expected); |