Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0b4857a5 authored by Austin Borger's avatar Austin Borger
Browse files

Per-app compat treatment for overrideToPortrait.

Camera framework consumers will have the option to opt in or out to
the rotate and crop fix for foldables via a manifest property.
This will allow apps which correctly handle the landscape sensor
to obtain the full FOV of the camera.

Test: Tested opt-out in Camera2Basic sample, opt-in in CTSVerifier.
Bug: 263965273
Change-Id: I190963c4f8dfba29dab7570397c33f44cab702e3
parent 630e4fde
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1246,7 +1246,7 @@ package android.hardware.camera2 {
  public final class CameraManager {
    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;
    field public static final long OVERRIDE_FRONT_CAMERA_APP_COMPAT = 250678880L; // 0xef10e60L
    field public static final long OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT = 250678880L; // 0xef10e60L
  }

  public abstract static class CameraManager.AvailabilityCallback {
+4 −12
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.app.ActivityThread;
import android.app.AppOpsManager;
import android.app.compat.CompatChanges;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.graphics.ImageFormat;
@@ -42,7 +41,6 @@ import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemProperties;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RSIllegalArgumentException;
@@ -279,14 +277,6 @@ public class Camera {
     */
    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.
     * If {@link #getNumberOfCameras()} returns N, the valid id is 0 to N-1.
@@ -296,7 +286,8 @@ public class Camera {
     *    low-level failure).
     */
    public static void getCameraInfo(int cameraId, CameraInfo cameraInfo) {
        boolean overrideToPortrait = shouldOverrideToPortrait();
        boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(
                ActivityThread.currentApplication().getApplicationContext());

        _getCameraInfo(cameraId, overrideToPortrait, cameraInfo);
        IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
@@ -493,7 +484,8 @@ public class Camera {
            mEventHandler = null;
        }

        boolean overrideToPortrait = shouldOverrideToPortrait();
        boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(
                ActivityThread.currentApplication().getApplicationContext());
        return native_setup(new WeakReference<Camera>(this), cameraId,
                ActivityThread.currentOpPackageName(), overrideToPortrait);
    }
+30 −6
Original line number Diff line number Diff line
@@ -115,7 +115,14 @@ public final class CameraManager {
    @Overridable
    @EnabledSince(targetSdkVersion = android.os.Build.VERSION_CODES.BASE)
    @TestApi
    public static final long OVERRIDE_FRONT_CAMERA_APP_COMPAT = 250678880L;
    public static final long OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT = 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
@@ -607,7 +614,7 @@ public final class CameraManager {
            try {
                Size displaySize = getDisplaySize();

                boolean overrideToPortrait = shouldOverrideToPortrait();
                boolean overrideToPortrait = shouldOverrideToPortrait(mContext);
                CameraMetadataNative info = cameraService.getCameraCharacteristics(cameraId,
                        mContext.getApplicationInfo().targetSdkVersion, overrideToPortrait);
                try {
@@ -727,7 +734,7 @@ public final class CameraManager {
                        "Camera service is currently unavailable");
                }

                boolean overrideToPortrait = shouldOverrideToPortrait();
                boolean overrideToPortrait = shouldOverrideToPortrait(mContext);
                cameraUser = cameraService.connectDevice(callbacks, cameraId,
                    mContext.getOpPackageName(), mContext.getAttributionTag(), uid,
                    oomScoreOffset, mContext.getApplicationInfo().targetSdkVersion,
@@ -1159,9 +1166,26 @@ public final class CameraManager {
        return CameraManagerGlobal.get().getTorchStrengthLevel(cameraId);
    }

    private static boolean shouldOverrideToPortrait() {
        return CompatChanges.isChangeEnabled(OVERRIDE_FRONT_CAMERA_APP_COMPAT)
                && CameraManagerGlobal.sLandscapeToPortrait;
    /**
     * @hide
     */
    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);
    }

    /**