Loading core/java/android/app/CameraCompatTaskInfo.java +48 −50 Original line number Diff line number Diff line Loading @@ -42,58 +42,58 @@ public class CameraCompatTaskInfo implements Parcelable { /** * Undefined camera compat mode. */ public static final int CAMERA_COMPAT_FREEFORM_UNSPECIFIED = 0; public static final int CAMERA_COMPAT_UNSPECIFIED = 0; /** * The value to use when no camera compat treatment should be applied to a windowed task. */ public static final int CAMERA_COMPAT_FREEFORM_NONE = 1; public static final int CAMERA_COMPAT_NONE = 1; /** * The value to use when camera compat treatment should be applied to an activity requesting * portrait orientation, while a device is in landscape. Applies only to freeform tasks. * portrait orientation, while a device is in landscape. */ public static final int CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE = 2; public static final int CAMERA_COMPAT_PORTRAIT_DEVICE_IN_LANDSCAPE = 2; /** * The value to use when camera compat treatment should be applied to an activity requesting * landscape orientation, while a device is in landscape. Applies only to freeform tasks. * landscape orientation, while a device is in landscape. */ public static final int CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_LANDSCAPE = 3; public static final int CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_LANDSCAPE = 3; /** * The value to use when camera compat treatment should be applied to an activity requesting * portrait orientation, while a device is in portrait. Applies only to freeform tasks. * portrait orientation, while a device is in portrait. */ public static final int CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_PORTRAIT = 4; public static final int CAMERA_COMPAT_PORTRAIT_DEVICE_IN_PORTRAIT = 4; /** * The value to use when camera compat treatment should be applied to an activity requesting * landscape orientation, while a device is in portrait. Applies only to freeform tasks. * landscape orientation, while a device is in portrait. */ public static final int CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_PORTRAIT = 5; public static final int CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_PORTRAIT = 5; @Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "CAMERA_COMPAT_FREEFORM_" }, value = { CAMERA_COMPAT_FREEFORM_UNSPECIFIED, CAMERA_COMPAT_FREEFORM_NONE, CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_PORTRAIT, CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_PORTRAIT, @IntDef(prefix = { "CAMERA_COMPAT_" }, value = { CAMERA_COMPAT_UNSPECIFIED, CAMERA_COMPAT_NONE, CAMERA_COMPAT_PORTRAIT_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_PORTRAIT_DEVICE_IN_PORTRAIT, CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_PORTRAIT, }) public @interface FreeformCameraCompatMode {} public @interface CameraCompatMode {} /** * Whether the camera activity is letterboxed in freeform windowing mode to emulate expected * aspect ratio for fixed-orientation apps. * Whether the camera activity is letterboxed to emulate expected aspect ratio for * fixed-orientation apps. * * <p>This field is used by the WM and the camera framework, to coordinate camera compat mode * setup. */ // TODO(b/414347702): Revisit data structure. @FreeformCameraCompatMode public int freeformCameraCompatMode = CAMERA_COMPAT_FREEFORM_UNSPECIFIED; @CameraCompatMode public int cameraCompatMode = CAMERA_COMPAT_UNSPECIFIED; /** * Real display rotation, never affected by camera compat sandboxing. Loading Loading @@ -139,7 +139,7 @@ public class CameraCompatTaskInfo implements Parcelable { * Reads the CameraCompatTaskInfo from a parcel. */ void readFromParcel(Parcel source) { freeformCameraCompatMode = source.readInt(); cameraCompatMode = source.readInt(); displayRotation = source.readInt(); } Loading @@ -148,7 +148,7 @@ public class CameraCompatTaskInfo implements Parcelable { */ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(freeformCameraCompatMode); dest.writeInt(cameraCompatMode); dest.writeInt(displayRotation); } Loading @@ -160,7 +160,7 @@ public class CameraCompatTaskInfo implements Parcelable { if (that == null) { return false; } return freeformCameraCompatMode == that.freeformCameraCompatMode return cameraCompatMode == that.cameraCompatMode && displayRotation == that.displayRotation; } Loading @@ -171,14 +171,14 @@ public class CameraCompatTaskInfo implements Parcelable { if (that == null) { return false; } return freeformCameraCompatMode == that.freeformCameraCompatMode return cameraCompatMode == that.cameraCompatMode && displayRotation == that.displayRotation; } @Override public String toString() { return "CameraCompatTaskInfo { freeformCameraCompatMode=" + freeformCameraCompatModeToString(freeformCameraCompatMode) return "CameraCompatTaskInfo { cameraCompatMode=" + cameraCompatModeToString(cameraCompatMode) + displayRotationToString(displayRotation) + "}"; } Loading @@ -187,44 +187,43 @@ public class CameraCompatTaskInfo implements Parcelable { * Returns the sandboxed display rotation based on the given {@code cameraCompatMode}. * * <p>This will be what the app likely expects in its requested orientation while running on a * device with portrait natural orientation: `CAMERA_COMPAT_FREEFORM_PORTRAIT_*` is 0, and * `CAMERA_COMPAT_FREEFORM_LANDSCAPE_*` is 90. * device with portrait natural orientation: `CAMERA_COMPAT_PORTRAIT_*` is 0, and * `CAMERA_COMPAT_LANDSCAPE_*` is 90. * * @return {@link WindowConfiguration#ROTATION_UNDEFINED} if not in camera compat mode. */ @Surface.Rotation public static int getDisplayRotationFromCameraCompatMode(@FreeformCameraCompatMode int public static int getDisplayRotationFromCameraCompatMode(@CameraCompatMode int cameraCompatMode) { return switch (cameraCompatMode) { case CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_PORTRAIT -> ROTATION_0; case CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_PORTRAIT -> ROTATION_90; case CAMERA_COMPAT_PORTRAIT_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_PORTRAIT_DEVICE_IN_PORTRAIT -> ROTATION_0; case CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_PORTRAIT -> ROTATION_90; default -> ROTATION_UNDEFINED; }; } /** Human readable version of the freeform camera compat mode. */ /** Human readable version of the camera compat mode. */ @NonNull public static String freeformCameraCompatModeToString( @FreeformCameraCompatMode int freeformCameraCompatMode) { return switch (freeformCameraCompatMode) { case CAMERA_COMPAT_FREEFORM_UNSPECIFIED -> "undefined"; case CAMERA_COMPAT_FREEFORM_NONE -> "inactive"; case CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE -> public static String cameraCompatModeToString(@CameraCompatMode int cameraCompatMode) { return switch (cameraCompatMode) { case CAMERA_COMPAT_UNSPECIFIED -> "undefined"; case CAMERA_COMPAT_NONE -> "inactive"; case CAMERA_COMPAT_PORTRAIT_DEVICE_IN_LANDSCAPE -> "app-portrait-device-landscape"; case CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_LANDSCAPE -> case CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_LANDSCAPE -> "app-landscape-device-landscape"; case CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_PORTRAIT -> case CAMERA_COMPAT_PORTRAIT_DEVICE_IN_PORTRAIT -> "app-portrait-device-portrait"; case CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_PORTRAIT -> case CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_PORTRAIT -> "app-landscape-device-portrait"; default -> throw new AssertionError( "Unexpected camera compat mode: " + freeformCameraCompatMode); default -> throw new AssertionError("Unexpected camera compat mode: " + cameraCompatMode); }; } /** Human readable version of the freeform camera compat mode. */ /** Human readable version of the camera compat mode. */ @NonNull public static String displayRotationToString(@Surface.Rotation int displayRotation) { return switch (displayRotation) { Loading @@ -233,8 +232,7 @@ public class CameraCompatTaskInfo implements Parcelable { case ROTATION_90 -> "90"; case ROTATION_180 -> "180"; case ROTATION_270 -> "270"; default -> throw new AssertionError( "Unexpected display rotation: " + displayRotation); default -> throw new AssertionError("Unexpected display rotation: " + displayRotation); }; } } core/java/android/hardware/camera2/CameraManager.java +11 −11 Original line number Diff line number Diff line Loading @@ -1719,13 +1719,13 @@ public final class CameraManager { if (activityManager != null) { for (ActivityManager.AppTask appTask : activityManager.getAppTasks()) { final TaskInfo taskInfo = appTask.getTaskInfo(); final int freeformCameraCompatMode = taskInfo.appCompatTaskInfo .cameraCompatTaskInfo.freeformCameraCompatMode; if (isInCameraCompatMode(freeformCameraCompatMode) final int cameraCompatMode = taskInfo.appCompatTaskInfo.cameraCompatTaskInfo .cameraCompatMode; if (isInCameraCompatMode(cameraCompatMode) && taskInfo.topActivity != null && taskInfo.topActivity.getPackageName().equals(packageName)) { // WindowManager has requested rotation override. return getRotationOverrideForCompatFreeform(freeformCameraCompatMode, return getRotationOverrideForCompatFreeform(cameraCompatMode, taskInfo.appCompatTaskInfo.cameraCompatTaskInfo .displayRotation); } Loading @@ -1751,10 +1751,10 @@ public final class CameraManager { : ICameraService.ROTATION_OVERRIDE_NONE; } private static boolean isInCameraCompatMode(@CameraCompatTaskInfo.FreeformCameraCompatMode int freeformCameraCompatMode) { return (freeformCameraCompatMode != CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_UNSPECIFIED) && (freeformCameraCompatMode != CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_NONE); private static boolean isInCameraCompatMode(@CameraCompatTaskInfo.CameraCompatMode int cameraCompatMode) { return (cameraCompatMode != CameraCompatTaskInfo.CAMERA_COMPAT_UNSPECIFIED) && (cameraCompatMode != CameraCompatTaskInfo.CAMERA_COMPAT_NONE); } private static int getRotationOverrideForCompatFreeform( Loading @@ -1769,13 +1769,13 @@ public final class CameraManager { } private static int getRotationOverrideForCompatFreeform( @CameraCompatTaskInfo.FreeformCameraCompatMode int freeformCameraCompatMode, @CameraCompatTaskInfo.CameraCompatMode int freeformCameraCompatMode, @Surface.Rotation int displayRotation) { // Only rotate-and-crop if the app and device orientations do not match. if (freeformCameraCompatMode == CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_PORTRAIT == CameraCompatTaskInfo.CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_PORTRAIT || freeformCameraCompatMode == CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE) { == CameraCompatTaskInfo.CAMERA_COMPAT_PORTRAIT_DEVICE_IN_LANDSCAPE) { // Rotate-and-crop compensates for changes in camera preview calculations (sandboxing). // Recommended calculation of camera preview is: // rotation = (sensorOrientationDegrees - deviceOrientationDegrees * sign + 360) % 360 Loading services/core/java/com/android/server/wm/AppCompatCameraOverrides.java +2 −2 Original line number Diff line number Diff line Loading @@ -188,7 +188,7 @@ class AppCompatCameraOverrides { * <li>Activity is opted-in using per-app override, or the treatment is enabled for all apps. * </ul> */ boolean shouldApplyFreeformTreatmentForCameraCompat() { boolean shouldApplyCameraCompatSimReqOrientationTreatment() { return DesktopModeFlags.ENABLE_CAMERA_COMPAT_SIMULATE_REQUESTED_ORIENTATION.isTrue() && (shouldEnableCameraCompatSimulateRequestedOrientationTreatmentForApp() || shouldForceEnableCameraCompatSimulateRequestedOrientationTreatment()); Loading Loading @@ -254,7 +254,7 @@ class AppCompatCameraOverrides { proto.write(SHOULD_REFRESH_ACTIVITY_VIA_PAUSE_FOR_CAMERA_COMPAT, shouldRefreshActivityViaPauseForCameraCompat()); proto.write(SHOULD_ALLOW_SIMULATE_REQUESTED_ORIENTATION_FOR_CAMERA_COMPAT, shouldApplyFreeformTreatmentForCameraCompat()); shouldApplyCameraCompatSimReqOrientationTreatment()); } static class AppCompatCameraOverridesState { Loading services/core/java/com/android/server/wm/AppCompatCameraPolicy.java +39 −40 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ class AppCompatCameraPolicy { @Nullable final DisplayRotationCompatPolicy mDisplayRotationCompatPolicy; @Nullable final CameraCompatFreeformPolicy mCameraCompatFreeformPolicy; final AppCompatCameraSimReqOrientationPolicy mSimReqOrientationPolicy; AppCompatCameraPolicy(@NonNull WindowManagerService wmService, @NonNull DisplayContent displayContent) { Loading @@ -54,29 +54,28 @@ class AppCompatCameraPolicy { // without the need to restart the device. final boolean needsDisplayRotationCompatPolicy = wmService.mAppCompatConfiguration .isCameraCompatForceRotateTreatmentEnabledAtBuildTime(); final boolean needsCameraCompatFreeformPolicy = final boolean needsSimReqOrientationPolicy = DesktopModeFlags.ENABLE_CAMERA_COMPAT_SIMULATE_REQUESTED_ORIENTATION.isTrue() && DesktopModeHelper.canEnterDesktopMode(wmService.mContext) && wmService.mAppCompatConfiguration .isCameraCompatSimulateRequestedOrientationTreatmentEnabled(); if (needsDisplayRotationCompatPolicy || needsCameraCompatFreeformPolicy) { if (needsDisplayRotationCompatPolicy || needsSimReqOrientationPolicy) { final AppCompatCameraStateSource cameraStateListenerDelegate = new AppCompatCameraStateSource(); mCameraStateMonitor = new CameraStateMonitor(displayContent, wmService.mH, cameraStateListenerDelegate); mActivityRefresher = new ActivityRefresher(wmService, wmService.mH); mDisplayRotationCompatPolicy = needsDisplayRotationCompatPolicy ? new DisplayRotationCompatPolicy( displayContent, mCameraStateMonitor, cameraStateListenerDelegate, mActivityRefresher) mDisplayRotationCompatPolicy = needsDisplayRotationCompatPolicy ? new DisplayRotationCompatPolicy(displayContent, mCameraStateMonitor, cameraStateListenerDelegate, mActivityRefresher) : null; mCameraCompatFreeformPolicy = needsCameraCompatFreeformPolicy ? new CameraCompatFreeformPolicy(displayContent, mSimReqOrientationPolicy = needsSimReqOrientationPolicy ? new AppCompatCameraSimReqOrientationPolicy(displayContent, mCameraStateMonitor, cameraStateListenerDelegate, mActivityRefresher) : null; } else { mDisplayRotationCompatPolicy = null; mCameraCompatFreeformPolicy = null; mSimReqOrientationPolicy = null; mCameraStateMonitor = null; mActivityRefresher = null; } Loading Loading @@ -150,8 +149,8 @@ class AppCompatCameraPolicy { if (mDisplayRotationCompatPolicy != null) { mDisplayRotationCompatPolicy.start(); } if (mCameraCompatFreeformPolicy != null) { mCameraCompatFreeformPolicy.start(); if (mSimReqOrientationPolicy != null) { mSimReqOrientationPolicy.start(); } if (mCameraStateMonitor != null) { mCameraStateMonitor.startListeningToCameraState(); Loading @@ -162,8 +161,8 @@ class AppCompatCameraPolicy { if (mDisplayRotationCompatPolicy != null) { mDisplayRotationCompatPolicy.dispose(); } if (mCameraCompatFreeformPolicy != null) { mCameraCompatFreeformPolicy.dispose(); if (mSimReqOrientationPolicy != null) { mSimReqOrientationPolicy.dispose(); } if (mCameraStateMonitor != null) { mCameraStateMonitor.stopListeningToCameraState(); Loading @@ -174,8 +173,8 @@ class AppCompatCameraPolicy { return mDisplayRotationCompatPolicy != null; } boolean hasCameraCompatFreeformPolicy() { return mCameraCompatFreeformPolicy != null; boolean hasSimReqOrientationPolicy() { return mSimReqOrientationPolicy != null; } boolean hasCameraStateMonitor() { Loading @@ -198,8 +197,8 @@ class AppCompatCameraPolicy { return (cameraPolicy.mDisplayRotationCompatPolicy != null && cameraPolicy.mDisplayRotationCompatPolicy .shouldCameraCompatControlOrientation(activity)) || (cameraPolicy.mCameraCompatFreeformPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy || (cameraPolicy.mSimReqOrientationPolicy != null && cameraPolicy.mSimReqOrientationPolicy .shouldCameraCompatControlOrientation(activity)); } Loading @@ -209,8 +208,8 @@ class AppCompatCameraPolicy { if (cameraPolicy == null) { return false; } return cameraPolicy.mCameraCompatFreeformPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy return cameraPolicy.mSimReqOrientationPolicy != null && cameraPolicy.mSimReqOrientationPolicy .isFreeformLetterboxingForCameraAllowed(activity); } Loading @@ -223,8 +222,8 @@ class AppCompatCameraPolicy { return (cameraPolicy.mDisplayRotationCompatPolicy != null && cameraPolicy.mDisplayRotationCompatPolicy .shouldCameraCompatControlAspectRatio(activity)) || (cameraPolicy.mCameraCompatFreeformPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy || (cameraPolicy.mSimReqOrientationPolicy != null && cameraPolicy.mSimReqOrientationPolicy .shouldCameraCompatControlAspectRatio(activity)); } Loading @@ -243,8 +242,8 @@ class AppCompatCameraPolicy { && cameraPolicy.mDisplayRotationCompatPolicy .isCameraRunningAndWindowingModeEligible(activity, /* mustBeFullscreen */ true)) || (cameraPolicy.mCameraCompatFreeformPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy || (cameraPolicy.mSimReqOrientationPolicy != null && cameraPolicy.mSimReqOrientationPolicy .isCameraRunningAndWindowingModeEligible(activity)); } Loading @@ -263,29 +262,29 @@ class AppCompatCameraPolicy { } float displayRotationCompatPolicyAspectRatio = cameraPolicy.mDisplayRotationCompatPolicy != null ? cameraPolicy.mDisplayRotationCompatPolicy.getCameraCompatAspectRatio(activity) ? cameraPolicy.mDisplayRotationCompatPolicy.getCameraCompatAspectRatio( activity) : MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; float cameraCompatFreeformPolicyAspectRatio = cameraPolicy.mCameraCompatFreeformPolicy != null ? cameraPolicy.mCameraCompatFreeformPolicy.getCameraCompatAspectRatio(activity) float simReqOrientationPolicyAspectRatio = cameraPolicy.mSimReqOrientationPolicy != null ? cameraPolicy.mSimReqOrientationPolicy.getCameraCompatAspectRatio(activity) : MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; return Math.max(displayRotationCompatPolicyAspectRatio, cameraCompatFreeformPolicyAspectRatio); return Math.max(displayRotationCompatPolicyAspectRatio, simReqOrientationPolicyAspectRatio); } @CameraCompatTaskInfo.FreeformCameraCompatMode static int getCameraCompatFreeformMode(@NonNull ActivityRecord activity) { @CameraCompatTaskInfo.CameraCompatMode static int getCameraCompatSimReqOrientationMode(@NonNull ActivityRecord activity) { final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity); return cameraPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy != null ? cameraPolicy.mCameraCompatFreeformPolicy.getCameraCompatMode(activity) : CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_NONE; return cameraPolicy != null && cameraPolicy.mSimReqOrientationPolicy != null ? cameraPolicy.mSimReqOrientationPolicy.getCameraCompatMode(activity) : CameraCompatTaskInfo.CAMERA_COMPAT_NONE; } @Surface.Rotation static int getCameraDeviceRotation(@NonNull ActivityRecord activity) { final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity); return cameraPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy != null ? cameraPolicy.mCameraCompatFreeformPolicy.getCameraDeviceRotation() return cameraPolicy != null && cameraPolicy.mSimReqOrientationPolicy != null ? cameraPolicy.mSimReqOrientationPolicy.getCameraDeviceRotation() : ROTATION_UNDEFINED; } Loading services/core/java/com/android/server/wm/CameraCompatFreeformPolicy.java→services/core/java/com/android/server/wm/AppCompatCameraSimReqOrientationPolicy.java +25 −26 File changed and moved.Preview size limit exceeded, changes collapsed. Show changes Loading
core/java/android/app/CameraCompatTaskInfo.java +48 −50 Original line number Diff line number Diff line Loading @@ -42,58 +42,58 @@ public class CameraCompatTaskInfo implements Parcelable { /** * Undefined camera compat mode. */ public static final int CAMERA_COMPAT_FREEFORM_UNSPECIFIED = 0; public static final int CAMERA_COMPAT_UNSPECIFIED = 0; /** * The value to use when no camera compat treatment should be applied to a windowed task. */ public static final int CAMERA_COMPAT_FREEFORM_NONE = 1; public static final int CAMERA_COMPAT_NONE = 1; /** * The value to use when camera compat treatment should be applied to an activity requesting * portrait orientation, while a device is in landscape. Applies only to freeform tasks. * portrait orientation, while a device is in landscape. */ public static final int CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE = 2; public static final int CAMERA_COMPAT_PORTRAIT_DEVICE_IN_LANDSCAPE = 2; /** * The value to use when camera compat treatment should be applied to an activity requesting * landscape orientation, while a device is in landscape. Applies only to freeform tasks. * landscape orientation, while a device is in landscape. */ public static final int CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_LANDSCAPE = 3; public static final int CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_LANDSCAPE = 3; /** * The value to use when camera compat treatment should be applied to an activity requesting * portrait orientation, while a device is in portrait. Applies only to freeform tasks. * portrait orientation, while a device is in portrait. */ public static final int CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_PORTRAIT = 4; public static final int CAMERA_COMPAT_PORTRAIT_DEVICE_IN_PORTRAIT = 4; /** * The value to use when camera compat treatment should be applied to an activity requesting * landscape orientation, while a device is in portrait. Applies only to freeform tasks. * landscape orientation, while a device is in portrait. */ public static final int CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_PORTRAIT = 5; public static final int CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_PORTRAIT = 5; @Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "CAMERA_COMPAT_FREEFORM_" }, value = { CAMERA_COMPAT_FREEFORM_UNSPECIFIED, CAMERA_COMPAT_FREEFORM_NONE, CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_PORTRAIT, CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_PORTRAIT, @IntDef(prefix = { "CAMERA_COMPAT_" }, value = { CAMERA_COMPAT_UNSPECIFIED, CAMERA_COMPAT_NONE, CAMERA_COMPAT_PORTRAIT_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_PORTRAIT_DEVICE_IN_PORTRAIT, CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_PORTRAIT, }) public @interface FreeformCameraCompatMode {} public @interface CameraCompatMode {} /** * Whether the camera activity is letterboxed in freeform windowing mode to emulate expected * aspect ratio for fixed-orientation apps. * Whether the camera activity is letterboxed to emulate expected aspect ratio for * fixed-orientation apps. * * <p>This field is used by the WM and the camera framework, to coordinate camera compat mode * setup. */ // TODO(b/414347702): Revisit data structure. @FreeformCameraCompatMode public int freeformCameraCompatMode = CAMERA_COMPAT_FREEFORM_UNSPECIFIED; @CameraCompatMode public int cameraCompatMode = CAMERA_COMPAT_UNSPECIFIED; /** * Real display rotation, never affected by camera compat sandboxing. Loading Loading @@ -139,7 +139,7 @@ public class CameraCompatTaskInfo implements Parcelable { * Reads the CameraCompatTaskInfo from a parcel. */ void readFromParcel(Parcel source) { freeformCameraCompatMode = source.readInt(); cameraCompatMode = source.readInt(); displayRotation = source.readInt(); } Loading @@ -148,7 +148,7 @@ public class CameraCompatTaskInfo implements Parcelable { */ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(freeformCameraCompatMode); dest.writeInt(cameraCompatMode); dest.writeInt(displayRotation); } Loading @@ -160,7 +160,7 @@ public class CameraCompatTaskInfo implements Parcelable { if (that == null) { return false; } return freeformCameraCompatMode == that.freeformCameraCompatMode return cameraCompatMode == that.cameraCompatMode && displayRotation == that.displayRotation; } Loading @@ -171,14 +171,14 @@ public class CameraCompatTaskInfo implements Parcelable { if (that == null) { return false; } return freeformCameraCompatMode == that.freeformCameraCompatMode return cameraCompatMode == that.cameraCompatMode && displayRotation == that.displayRotation; } @Override public String toString() { return "CameraCompatTaskInfo { freeformCameraCompatMode=" + freeformCameraCompatModeToString(freeformCameraCompatMode) return "CameraCompatTaskInfo { cameraCompatMode=" + cameraCompatModeToString(cameraCompatMode) + displayRotationToString(displayRotation) + "}"; } Loading @@ -187,44 +187,43 @@ public class CameraCompatTaskInfo implements Parcelable { * Returns the sandboxed display rotation based on the given {@code cameraCompatMode}. * * <p>This will be what the app likely expects in its requested orientation while running on a * device with portrait natural orientation: `CAMERA_COMPAT_FREEFORM_PORTRAIT_*` is 0, and * `CAMERA_COMPAT_FREEFORM_LANDSCAPE_*` is 90. * device with portrait natural orientation: `CAMERA_COMPAT_PORTRAIT_*` is 0, and * `CAMERA_COMPAT_LANDSCAPE_*` is 90. * * @return {@link WindowConfiguration#ROTATION_UNDEFINED} if not in camera compat mode. */ @Surface.Rotation public static int getDisplayRotationFromCameraCompatMode(@FreeformCameraCompatMode int public static int getDisplayRotationFromCameraCompatMode(@CameraCompatMode int cameraCompatMode) { return switch (cameraCompatMode) { case CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_PORTRAIT -> ROTATION_0; case CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_PORTRAIT -> ROTATION_90; case CAMERA_COMPAT_PORTRAIT_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_PORTRAIT_DEVICE_IN_PORTRAIT -> ROTATION_0; case CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_LANDSCAPE, CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_PORTRAIT -> ROTATION_90; default -> ROTATION_UNDEFINED; }; } /** Human readable version of the freeform camera compat mode. */ /** Human readable version of the camera compat mode. */ @NonNull public static String freeformCameraCompatModeToString( @FreeformCameraCompatMode int freeformCameraCompatMode) { return switch (freeformCameraCompatMode) { case CAMERA_COMPAT_FREEFORM_UNSPECIFIED -> "undefined"; case CAMERA_COMPAT_FREEFORM_NONE -> "inactive"; case CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE -> public static String cameraCompatModeToString(@CameraCompatMode int cameraCompatMode) { return switch (cameraCompatMode) { case CAMERA_COMPAT_UNSPECIFIED -> "undefined"; case CAMERA_COMPAT_NONE -> "inactive"; case CAMERA_COMPAT_PORTRAIT_DEVICE_IN_LANDSCAPE -> "app-portrait-device-landscape"; case CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_LANDSCAPE -> case CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_LANDSCAPE -> "app-landscape-device-landscape"; case CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_PORTRAIT -> case CAMERA_COMPAT_PORTRAIT_DEVICE_IN_PORTRAIT -> "app-portrait-device-portrait"; case CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_PORTRAIT -> case CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_PORTRAIT -> "app-landscape-device-portrait"; default -> throw new AssertionError( "Unexpected camera compat mode: " + freeformCameraCompatMode); default -> throw new AssertionError("Unexpected camera compat mode: " + cameraCompatMode); }; } /** Human readable version of the freeform camera compat mode. */ /** Human readable version of the camera compat mode. */ @NonNull public static String displayRotationToString(@Surface.Rotation int displayRotation) { return switch (displayRotation) { Loading @@ -233,8 +232,7 @@ public class CameraCompatTaskInfo implements Parcelable { case ROTATION_90 -> "90"; case ROTATION_180 -> "180"; case ROTATION_270 -> "270"; default -> throw new AssertionError( "Unexpected display rotation: " + displayRotation); default -> throw new AssertionError("Unexpected display rotation: " + displayRotation); }; } }
core/java/android/hardware/camera2/CameraManager.java +11 −11 Original line number Diff line number Diff line Loading @@ -1719,13 +1719,13 @@ public final class CameraManager { if (activityManager != null) { for (ActivityManager.AppTask appTask : activityManager.getAppTasks()) { final TaskInfo taskInfo = appTask.getTaskInfo(); final int freeformCameraCompatMode = taskInfo.appCompatTaskInfo .cameraCompatTaskInfo.freeformCameraCompatMode; if (isInCameraCompatMode(freeformCameraCompatMode) final int cameraCompatMode = taskInfo.appCompatTaskInfo.cameraCompatTaskInfo .cameraCompatMode; if (isInCameraCompatMode(cameraCompatMode) && taskInfo.topActivity != null && taskInfo.topActivity.getPackageName().equals(packageName)) { // WindowManager has requested rotation override. return getRotationOverrideForCompatFreeform(freeformCameraCompatMode, return getRotationOverrideForCompatFreeform(cameraCompatMode, taskInfo.appCompatTaskInfo.cameraCompatTaskInfo .displayRotation); } Loading @@ -1751,10 +1751,10 @@ public final class CameraManager { : ICameraService.ROTATION_OVERRIDE_NONE; } private static boolean isInCameraCompatMode(@CameraCompatTaskInfo.FreeformCameraCompatMode int freeformCameraCompatMode) { return (freeformCameraCompatMode != CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_UNSPECIFIED) && (freeformCameraCompatMode != CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_NONE); private static boolean isInCameraCompatMode(@CameraCompatTaskInfo.CameraCompatMode int cameraCompatMode) { return (cameraCompatMode != CameraCompatTaskInfo.CAMERA_COMPAT_UNSPECIFIED) && (cameraCompatMode != CameraCompatTaskInfo.CAMERA_COMPAT_NONE); } private static int getRotationOverrideForCompatFreeform( Loading @@ -1769,13 +1769,13 @@ public final class CameraManager { } private static int getRotationOverrideForCompatFreeform( @CameraCompatTaskInfo.FreeformCameraCompatMode int freeformCameraCompatMode, @CameraCompatTaskInfo.CameraCompatMode int freeformCameraCompatMode, @Surface.Rotation int displayRotation) { // Only rotate-and-crop if the app and device orientations do not match. if (freeformCameraCompatMode == CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_PORTRAIT == CameraCompatTaskInfo.CAMERA_COMPAT_LANDSCAPE_DEVICE_IN_PORTRAIT || freeformCameraCompatMode == CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE) { == CameraCompatTaskInfo.CAMERA_COMPAT_PORTRAIT_DEVICE_IN_LANDSCAPE) { // Rotate-and-crop compensates for changes in camera preview calculations (sandboxing). // Recommended calculation of camera preview is: // rotation = (sensorOrientationDegrees - deviceOrientationDegrees * sign + 360) % 360 Loading
services/core/java/com/android/server/wm/AppCompatCameraOverrides.java +2 −2 Original line number Diff line number Diff line Loading @@ -188,7 +188,7 @@ class AppCompatCameraOverrides { * <li>Activity is opted-in using per-app override, or the treatment is enabled for all apps. * </ul> */ boolean shouldApplyFreeformTreatmentForCameraCompat() { boolean shouldApplyCameraCompatSimReqOrientationTreatment() { return DesktopModeFlags.ENABLE_CAMERA_COMPAT_SIMULATE_REQUESTED_ORIENTATION.isTrue() && (shouldEnableCameraCompatSimulateRequestedOrientationTreatmentForApp() || shouldForceEnableCameraCompatSimulateRequestedOrientationTreatment()); Loading Loading @@ -254,7 +254,7 @@ class AppCompatCameraOverrides { proto.write(SHOULD_REFRESH_ACTIVITY_VIA_PAUSE_FOR_CAMERA_COMPAT, shouldRefreshActivityViaPauseForCameraCompat()); proto.write(SHOULD_ALLOW_SIMULATE_REQUESTED_ORIENTATION_FOR_CAMERA_COMPAT, shouldApplyFreeformTreatmentForCameraCompat()); shouldApplyCameraCompatSimReqOrientationTreatment()); } static class AppCompatCameraOverridesState { Loading
services/core/java/com/android/server/wm/AppCompatCameraPolicy.java +39 −40 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ class AppCompatCameraPolicy { @Nullable final DisplayRotationCompatPolicy mDisplayRotationCompatPolicy; @Nullable final CameraCompatFreeformPolicy mCameraCompatFreeformPolicy; final AppCompatCameraSimReqOrientationPolicy mSimReqOrientationPolicy; AppCompatCameraPolicy(@NonNull WindowManagerService wmService, @NonNull DisplayContent displayContent) { Loading @@ -54,29 +54,28 @@ class AppCompatCameraPolicy { // without the need to restart the device. final boolean needsDisplayRotationCompatPolicy = wmService.mAppCompatConfiguration .isCameraCompatForceRotateTreatmentEnabledAtBuildTime(); final boolean needsCameraCompatFreeformPolicy = final boolean needsSimReqOrientationPolicy = DesktopModeFlags.ENABLE_CAMERA_COMPAT_SIMULATE_REQUESTED_ORIENTATION.isTrue() && DesktopModeHelper.canEnterDesktopMode(wmService.mContext) && wmService.mAppCompatConfiguration .isCameraCompatSimulateRequestedOrientationTreatmentEnabled(); if (needsDisplayRotationCompatPolicy || needsCameraCompatFreeformPolicy) { if (needsDisplayRotationCompatPolicy || needsSimReqOrientationPolicy) { final AppCompatCameraStateSource cameraStateListenerDelegate = new AppCompatCameraStateSource(); mCameraStateMonitor = new CameraStateMonitor(displayContent, wmService.mH, cameraStateListenerDelegate); mActivityRefresher = new ActivityRefresher(wmService, wmService.mH); mDisplayRotationCompatPolicy = needsDisplayRotationCompatPolicy ? new DisplayRotationCompatPolicy( displayContent, mCameraStateMonitor, cameraStateListenerDelegate, mActivityRefresher) mDisplayRotationCompatPolicy = needsDisplayRotationCompatPolicy ? new DisplayRotationCompatPolicy(displayContent, mCameraStateMonitor, cameraStateListenerDelegate, mActivityRefresher) : null; mCameraCompatFreeformPolicy = needsCameraCompatFreeformPolicy ? new CameraCompatFreeformPolicy(displayContent, mSimReqOrientationPolicy = needsSimReqOrientationPolicy ? new AppCompatCameraSimReqOrientationPolicy(displayContent, mCameraStateMonitor, cameraStateListenerDelegate, mActivityRefresher) : null; } else { mDisplayRotationCompatPolicy = null; mCameraCompatFreeformPolicy = null; mSimReqOrientationPolicy = null; mCameraStateMonitor = null; mActivityRefresher = null; } Loading Loading @@ -150,8 +149,8 @@ class AppCompatCameraPolicy { if (mDisplayRotationCompatPolicy != null) { mDisplayRotationCompatPolicy.start(); } if (mCameraCompatFreeformPolicy != null) { mCameraCompatFreeformPolicy.start(); if (mSimReqOrientationPolicy != null) { mSimReqOrientationPolicy.start(); } if (mCameraStateMonitor != null) { mCameraStateMonitor.startListeningToCameraState(); Loading @@ -162,8 +161,8 @@ class AppCompatCameraPolicy { if (mDisplayRotationCompatPolicy != null) { mDisplayRotationCompatPolicy.dispose(); } if (mCameraCompatFreeformPolicy != null) { mCameraCompatFreeformPolicy.dispose(); if (mSimReqOrientationPolicy != null) { mSimReqOrientationPolicy.dispose(); } if (mCameraStateMonitor != null) { mCameraStateMonitor.stopListeningToCameraState(); Loading @@ -174,8 +173,8 @@ class AppCompatCameraPolicy { return mDisplayRotationCompatPolicy != null; } boolean hasCameraCompatFreeformPolicy() { return mCameraCompatFreeformPolicy != null; boolean hasSimReqOrientationPolicy() { return mSimReqOrientationPolicy != null; } boolean hasCameraStateMonitor() { Loading @@ -198,8 +197,8 @@ class AppCompatCameraPolicy { return (cameraPolicy.mDisplayRotationCompatPolicy != null && cameraPolicy.mDisplayRotationCompatPolicy .shouldCameraCompatControlOrientation(activity)) || (cameraPolicy.mCameraCompatFreeformPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy || (cameraPolicy.mSimReqOrientationPolicy != null && cameraPolicy.mSimReqOrientationPolicy .shouldCameraCompatControlOrientation(activity)); } Loading @@ -209,8 +208,8 @@ class AppCompatCameraPolicy { if (cameraPolicy == null) { return false; } return cameraPolicy.mCameraCompatFreeformPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy return cameraPolicy.mSimReqOrientationPolicy != null && cameraPolicy.mSimReqOrientationPolicy .isFreeformLetterboxingForCameraAllowed(activity); } Loading @@ -223,8 +222,8 @@ class AppCompatCameraPolicy { return (cameraPolicy.mDisplayRotationCompatPolicy != null && cameraPolicy.mDisplayRotationCompatPolicy .shouldCameraCompatControlAspectRatio(activity)) || (cameraPolicy.mCameraCompatFreeformPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy || (cameraPolicy.mSimReqOrientationPolicy != null && cameraPolicy.mSimReqOrientationPolicy .shouldCameraCompatControlAspectRatio(activity)); } Loading @@ -243,8 +242,8 @@ class AppCompatCameraPolicy { && cameraPolicy.mDisplayRotationCompatPolicy .isCameraRunningAndWindowingModeEligible(activity, /* mustBeFullscreen */ true)) || (cameraPolicy.mCameraCompatFreeformPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy || (cameraPolicy.mSimReqOrientationPolicy != null && cameraPolicy.mSimReqOrientationPolicy .isCameraRunningAndWindowingModeEligible(activity)); } Loading @@ -263,29 +262,29 @@ class AppCompatCameraPolicy { } float displayRotationCompatPolicyAspectRatio = cameraPolicy.mDisplayRotationCompatPolicy != null ? cameraPolicy.mDisplayRotationCompatPolicy.getCameraCompatAspectRatio(activity) ? cameraPolicy.mDisplayRotationCompatPolicy.getCameraCompatAspectRatio( activity) : MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; float cameraCompatFreeformPolicyAspectRatio = cameraPolicy.mCameraCompatFreeformPolicy != null ? cameraPolicy.mCameraCompatFreeformPolicy.getCameraCompatAspectRatio(activity) float simReqOrientationPolicyAspectRatio = cameraPolicy.mSimReqOrientationPolicy != null ? cameraPolicy.mSimReqOrientationPolicy.getCameraCompatAspectRatio(activity) : MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; return Math.max(displayRotationCompatPolicyAspectRatio, cameraCompatFreeformPolicyAspectRatio); return Math.max(displayRotationCompatPolicyAspectRatio, simReqOrientationPolicyAspectRatio); } @CameraCompatTaskInfo.FreeformCameraCompatMode static int getCameraCompatFreeformMode(@NonNull ActivityRecord activity) { @CameraCompatTaskInfo.CameraCompatMode static int getCameraCompatSimReqOrientationMode(@NonNull ActivityRecord activity) { final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity); return cameraPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy != null ? cameraPolicy.mCameraCompatFreeformPolicy.getCameraCompatMode(activity) : CameraCompatTaskInfo.CAMERA_COMPAT_FREEFORM_NONE; return cameraPolicy != null && cameraPolicy.mSimReqOrientationPolicy != null ? cameraPolicy.mSimReqOrientationPolicy.getCameraCompatMode(activity) : CameraCompatTaskInfo.CAMERA_COMPAT_NONE; } @Surface.Rotation static int getCameraDeviceRotation(@NonNull ActivityRecord activity) { final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity); return cameraPolicy != null && cameraPolicy.mCameraCompatFreeformPolicy != null ? cameraPolicy.mCameraCompatFreeformPolicy.getCameraDeviceRotation() return cameraPolicy != null && cameraPolicy.mSimReqOrientationPolicy != null ? cameraPolicy.mSimReqOrientationPolicy.getCameraDeviceRotation() : ROTATION_UNDEFINED; } Loading
services/core/java/com/android/server/wm/CameraCompatFreeformPolicy.java→services/core/java/com/android/server/wm/AppCompatCameraSimReqOrientationPolicy.java +25 −26 File changed and moved.Preview size limit exceeded, changes collapsed. Show changes