Merge "Per-app compat treatment for overrideToPortrait." into tm-qpr-dev

This commit is contained in:
Austin Borger
2023-01-11 22:00:16 +00:00
committed by Android (Google) Code Review
3 changed files with 34 additions and 20 deletions

View File

@@ -1139,7 +1139,6 @@ package android.hardware.camera2 {
public final class CameraManager { public final class CameraManager {
method public String[] getCameraIdListNoLazy() throws android.hardware.camera2.CameraAccessException; method public String[] getCameraIdListNoLazy() throws android.hardware.camera2.CameraAccessException;
method @RequiresPermission(allOf={android.Manifest.permission.SYSTEM_CAMERA, android.Manifest.permission.CAMERA}) public void openCamera(@NonNull String, int, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraDevice.StateCallback) throws android.hardware.camera2.CameraAccessException; method @RequiresPermission(allOf={android.Manifest.permission.SYSTEM_CAMERA, android.Manifest.permission.CAMERA}) public void openCamera(@NonNull String, int, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraDevice.StateCallback) throws android.hardware.camera2.CameraAccessException;
field public static final long OVERRIDE_FRONT_CAMERA_APP_COMPAT = 250678880L; // 0xef10e60L
} }
public abstract static class CameraManager.AvailabilityCallback { public abstract static class CameraManager.AvailabilityCallback {

View File

@@ -29,7 +29,6 @@ import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SdkConstant.SdkConstantType;
import android.app.ActivityThread; import android.app.ActivityThread;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.app.compat.CompatChanges;
import android.compat.annotation.UnsupportedAppUsage; import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context; import android.content.Context;
import android.graphics.ImageFormat; import android.graphics.ImageFormat;
@@ -47,7 +46,6 @@ import android.os.Message;
import android.os.Process; import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.SystemProperties;
import android.renderscript.Allocation; import android.renderscript.Allocation;
import android.renderscript.Element; import android.renderscript.Element;
import android.renderscript.RSIllegalArgumentException; import android.renderscript.RSIllegalArgumentException;
@@ -284,14 +282,6 @@ public class Camera {
*/ */
public native static int getNumberOfCameras(); public native static int getNumberOfCameras();
private static final boolean sLandscapeToPortrait =
SystemProperties.getBoolean(CameraManager.LANDSCAPE_TO_PORTRAIT_PROP, false);
private static boolean shouldOverrideToPortrait() {
return CompatChanges.isChangeEnabled(CameraManager.OVERRIDE_FRONT_CAMERA_APP_COMPAT)
&& sLandscapeToPortrait;
}
/** /**
* Returns the information about a particular camera. * Returns the information about a particular camera.
* If {@link #getNumberOfCameras()} returns N, the valid id is 0 to N-1. * If {@link #getNumberOfCameras()} returns N, the valid id is 0 to N-1.
@@ -301,7 +291,8 @@ public class Camera {
* low-level failure). * low-level failure).
*/ */
public static void getCameraInfo(int cameraId, CameraInfo cameraInfo) { public static void getCameraInfo(int cameraId, CameraInfo cameraInfo) {
boolean overrideToPortrait = shouldOverrideToPortrait(); boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(
ActivityThread.currentApplication().getApplicationContext());
_getCameraInfo(cameraId, overrideToPortrait, cameraInfo); _getCameraInfo(cameraId, overrideToPortrait, cameraInfo);
IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE); IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
@@ -498,7 +489,8 @@ public class Camera {
mEventHandler = null; mEventHandler = null;
} }
boolean overrideToPortrait = shouldOverrideToPortrait(); boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(
ActivityThread.currentApplication().getApplicationContext());
return native_setup(new WeakReference<Camera>(this), cameraId, return native_setup(new WeakReference<Camera>(this), cameraId,
ActivityThread.currentOpPackageName(), overrideToPortrait); ActivityThread.currentOpPackageName(), overrideToPortrait);
} }

View File

@@ -115,8 +115,14 @@ public final class CameraManager {
@ChangeId @ChangeId
@Overridable @Overridable
@EnabledSince(targetSdkVersion = android.os.Build.VERSION_CODES.BASE) @EnabledSince(targetSdkVersion = android.os.Build.VERSION_CODES.BASE)
@TestApi public static final long OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT = 250678880L;
public static final long OVERRIDE_FRONT_CAMERA_APP_COMPAT = 250678880L;
/**
* Package-level opt in/out for the above.
* @hide
*/
public static final String PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT =
"android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT";
/** /**
* System property for allowing the above * System property for allowing the above
@@ -602,7 +608,7 @@ public final class CameraManager {
try { try {
Size displaySize = getDisplaySize(); Size displaySize = getDisplaySize();
boolean overrideToPortrait = shouldOverrideToPortrait(); boolean overrideToPortrait = shouldOverrideToPortrait(mContext);
CameraMetadataNative info = cameraService.getCameraCharacteristics(cameraId, CameraMetadataNative info = cameraService.getCameraCharacteristics(cameraId,
mContext.getApplicationInfo().targetSdkVersion, overrideToPortrait); mContext.getApplicationInfo().targetSdkVersion, overrideToPortrait);
try { try {
@@ -722,7 +728,7 @@ public final class CameraManager {
"Camera service is currently unavailable"); "Camera service is currently unavailable");
} }
boolean overrideToPortrait = shouldOverrideToPortrait(); boolean overrideToPortrait = shouldOverrideToPortrait(mContext);
cameraUser = cameraService.connectDevice(callbacks, cameraId, cameraUser = cameraService.connectDevice(callbacks, cameraId,
mContext.getOpPackageName(), mContext.getAttributionTag(), uid, mContext.getOpPackageName(), mContext.getAttributionTag(), uid,
oomScoreOffset, mContext.getApplicationInfo().targetSdkVersion, oomScoreOffset, mContext.getApplicationInfo().targetSdkVersion,
@@ -1154,9 +1160,26 @@ public final class CameraManager {
return CameraManagerGlobal.get().getTorchStrengthLevel(cameraId); return CameraManagerGlobal.get().getTorchStrengthLevel(cameraId);
} }
private static boolean shouldOverrideToPortrait() { /**
return CompatChanges.isChangeEnabled(OVERRIDE_FRONT_CAMERA_APP_COMPAT) * @hide
&& CameraManagerGlobal.sLandscapeToPortrait; */
public static boolean shouldOverrideToPortrait(@Nullable Context context) {
if (!CameraManagerGlobal.sLandscapeToPortrait) {
return false;
}
if (context != null) {
PackageManager packageManager = context.getPackageManager();
try {
return packageManager.getProperty(context.getOpPackageName(),
PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT).getBoolean();
} catch (PackageManager.NameNotFoundException e) {
// No such property
}
}
return CompatChanges.isChangeEnabled(OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT);
} }
/** /**