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

Commit 244ecbcf authored by Mina Granic's avatar Mina Granic
Browse files

camera2 impl: Return rotation type from `shouldOverrideToPortrait`, and rename...

camera2 impl: Return rotation type from `shouldOverrideToPortrait`, and rename to `getRotationOverride`.

Bug: 314960895
Change-Id: I875f01d1197d58299c38124f5fea9c0a92fbcb8a
Test: manual in prototype
Test: atest PropertyTest
parent 4450a8b7
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -1529,9 +1529,9 @@ package android.graphics.fonts {
package android.hardware {

  @Deprecated public class Camera {
    method @Deprecated public static void getCameraInfo(int, @NonNull android.content.Context, boolean, android.hardware.Camera.CameraInfo);
    method @Deprecated public static void getCameraInfo(int, @NonNull android.content.Context, int, android.hardware.Camera.CameraInfo);
    method @Deprecated public static int getNumberOfCameras(@NonNull android.content.Context);
    method @Deprecated public static android.hardware.Camera open(int, @NonNull android.content.Context, boolean);
    method @Deprecated public static android.hardware.Camera open(int, @NonNull android.content.Context, int);
    method @Deprecated public final void setPreviewSurface(android.view.Surface) throws java.io.IOException;
  }

@@ -1606,11 +1606,15 @@ package android.hardware.camera2 {
  public final class CameraManager {
    method @NonNull public android.hardware.camera2.CameraCharacteristics getCameraCharacteristics(@NonNull String, boolean) throws android.hardware.camera2.CameraAccessException;
    method public String[] getCameraIdListNoLazy() throws android.hardware.camera2.CameraAccessException;
    method @FlaggedApi("com.android.window.flags.camera_compat_for_freeform") public static int getRotationOverrideInternal(@Nullable android.content.Context, @Nullable android.content.pm.PackageManager, @Nullable String);
    method @RequiresPermission(android.Manifest.permission.CAMERA) public void openCamera(@NonNull String, boolean, @Nullable android.os.Handler, @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;
    method public static boolean shouldOverrideToPortrait(@Nullable android.content.pm.PackageManager, @Nullable String);
    field public static final String LANDSCAPE_TO_PORTRAIT_PROP = "camera.enable_landscape_to_portrait";
    field public static final long OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT = 250678880L; // 0xef10e60L
    field @FlaggedApi("com.android.window.flags.camera_compat_for_freeform") public static final int ROTATION_OVERRIDE_NONE = 0; // 0x0
    field @FlaggedApi("com.android.window.flags.camera_compat_for_freeform") public static final int ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT = 1; // 0x1
    field @FlaggedApi("com.android.window.flags.camera_compat_for_freeform") public static final int ROTATION_OVERRIDE_ROTATION_ONLY = 2; // 0x2
  }

  public abstract static class CameraManager.AvailabilityCallback {
+8 −13
Original line number Diff line number Diff line
@@ -308,9 +308,7 @@ public class Camera {
     */
    public static void getCameraInfo(int cameraId, CameraInfo cameraInfo) {
        Context context = ActivityThread.currentApplication().getApplicationContext();
        final int rotationOverride = CameraManager.shouldOverrideToPortrait(context)
                ? ICameraService.ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT
                : ICameraService.ROTATION_OVERRIDE_NONE;
        final int rotationOverride = CameraManager.getRotationOverride(context);
        getCameraInfo(cameraId, context, rotationOverride, cameraInfo);
    }

@@ -443,8 +441,8 @@ public class Camera {
     */
    public static Camera open(int cameraId) {
        Context context = ActivityThread.currentApplication().getApplicationContext();
        boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(context);
        return open(cameraId, context, overrideToPortrait);
        final int rotationOverride = CameraManager.getRotationOverride(context);
        return open(cameraId, context, rotationOverride);
    }

    /**
@@ -454,8 +452,8 @@ public class Camera {
     */
    @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
    @TestApi
    public static Camera open(int cameraId, @NonNull Context context, boolean overrideToPortrait) {
        return new Camera(cameraId, context, overrideToPortrait);
    public static Camera open(int cameraId, @NonNull Context context, int rotationOverride) {
        return new Camera(cameraId, context, rotationOverride);
    }

    /**
@@ -526,7 +524,7 @@ public class Camera {
        return open(cameraId);
    }

    private int cameraInit(int cameraId, Context context, boolean overrideToPortrait) {
    private int cameraInit(int cameraId, Context context, int rotationOverride) {
        mShutterCallback = null;
        mRawImageCallback = null;
        mJpegCallback = null;
@@ -543,9 +541,6 @@ public class Camera {
        } else {
            mEventHandler = null;
        }
        final int rotationOverride = CameraManager.shouldOverrideToPortrait(context)
                ? ICameraService.ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT
                : ICameraService.ROTATION_OVERRIDE_NONE;

        boolean forceSlowJpegMode = shouldForceSlowJpegMode();
        return native_setup(new WeakReference<>(this), cameraId,
@@ -567,9 +562,9 @@ public class Camera {
    }

    /** used by Camera#open, Camera#open(int) */
    Camera(int cameraId, @NonNull Context context, boolean overrideToPortrait) {
    Camera(int cameraId, @NonNull Context context, int rotationOverride) {
        Objects.requireNonNull(context);
        int err = cameraInit(cameraId, context, overrideToPortrait);
        final int err = cameraInit(cameraId, context, rotationOverride);
        if (checkInitErrors(err)) {
            if (err == -EACCES) {
                throw new RuntimeException("Fail to connect to camera service");
+96 −13
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.app.ActivityManager;
import android.app.TaskInfo;
import android.app.compat.CompatChanges;
import android.companion.virtual.VirtualDeviceManager;
import android.compat.annotation.ChangeId;
@@ -168,6 +170,36 @@ public final class CameraManager {
    public static final String LANDSCAPE_TO_PORTRAIT_PROP =
            "camera.enable_landscape_to_portrait";

    /**
     * Does not override landscape feed to portrait.
     *
     * @hide
     */
    @TestApi
    @FlaggedApi(com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM)
    public static final int ROTATION_OVERRIDE_NONE = ICameraService.ROTATION_OVERRIDE_NONE;

    /**
     * Crops and rotates landscape camera feed to portrait, and changes sensor orientation to
     * portrait.
     *
     * @hide
     */
    @TestApi
    @FlaggedApi(com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM)
    public static final int ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT =
            ICameraService.ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT;

    /**
     * Crops and rotates landscape camera feed to portrait, but doesn't change sensor orientation.
     *
     * @hide
     */
    @TestApi
    @FlaggedApi(com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM)
    public static final int ROTATION_OVERRIDE_ROTATION_ONLY =
            ICameraService.ROTATION_OVERRIDE_ROTATION_ONLY;

    /**
     * Enable physical camera availability callbacks when the logical camera is unavailable
     *
@@ -675,7 +707,7 @@ public final class CameraManager {
    @NonNull
    public CameraCharacteristics getCameraCharacteristics(@NonNull String cameraId)
            throws CameraAccessException {
        return getCameraCharacteristics(cameraId, shouldOverrideToPortrait(mContext));
        return getCameraCharacteristics(cameraId, getRotationOverride(mContext));
    }

    /**
@@ -1252,11 +1284,8 @@ public final class CameraManager {
            throw new IllegalArgumentException(
                    "oomScoreOffset < 0, cannot increase priority of camera client");
        }
        final int rotationOverride = shouldOverrideToPortrait(mContext)
                ? ICameraService.ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT
                : ICameraService.ROTATION_OVERRIDE_NONE;
        openCameraForUid(cameraId, callback, executor, USE_CALLING_UID, oomScoreOffset,
                rotationOverride);
                getRotationOverride(mContext));
    }

    /**
@@ -1315,12 +1344,8 @@ public final class CameraManager {
    public void openCameraForUid(@NonNull String cameraId,
            @NonNull final CameraDevice.StateCallback callback, @NonNull Executor executor,
            int clientUid) throws CameraAccessException {
        final int rotationOverride = shouldOverrideToPortrait(mContext)
                ? ICameraService.ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT
                : ICameraService.ROTATION_OVERRIDE_NONE;

        openCameraForUid(cameraId, callback, executor, clientUid, /*oomScoreOffset*/0,
                rotationOverride);
                getRotationOverride(mContext));
    }

    /**
@@ -1465,7 +1490,7 @@ public final class CameraManager {
    /**
     * @hide
     */
    public static boolean shouldOverrideToPortrait(@Nullable Context context) {
    public static int getRotationOverride(@Nullable Context context) {
        PackageManager packageManager = null;
        String packageName = null;

@@ -1474,7 +1499,64 @@ public final class CameraManager {
            packageName = context.getOpPackageName();
        }

        return shouldOverrideToPortrait(packageManager, packageName);
        return getRotationOverride(context, packageManager, packageName);
    }

    /**
     * @hide
     */
    public static int getRotationOverride(@Nullable Context context,
            @Nullable PackageManager packageManager, @Nullable String packageName) {
        if (com.android.window.flags.Flags.cameraCompatForFreeform()) {
            return getRotationOverrideInternal(context, packageManager, packageName);
        } else {
            return shouldOverrideToPortrait(packageManager, packageName)
                        ? ICameraService.ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT
                        : ICameraService.ROTATION_OVERRIDE_NONE;
        }
    }

    /**
     * @hide
     */
    @FlaggedApi(com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM)
    @TestApi
    public static int getRotationOverrideInternal(@Nullable Context context,
            @Nullable PackageManager packageManager, @Nullable String packageName) {
        if (!CameraManagerGlobal.sLandscapeToPortrait) {
            return ICameraService.ROTATION_OVERRIDE_NONE;
        }

        if (context != null) {
            final ActivityManager activityManager =
                    context.getSystemService(ActivityManager.class);
            for (ActivityManager.AppTask appTask : activityManager.getAppTasks()) {
                final TaskInfo taskInfo = appTask.getTaskInfo();
                if (taskInfo.appCompatTaskInfo.cameraCompatTaskInfo.freeformCameraCompatMode
                        != 0
                        && taskInfo.topActivity != null
                        && taskInfo.topActivity.getPackageName().equals(packageName)) {
                    // WindowManager has requested rotation override.
                    return ICameraService.ROTATION_OVERRIDE_ROTATION_ONLY;
                }
            }
        }

        if (packageManager != null && packageName != null) {
            try {
                return packageManager.getProperty(
                        PackageManager.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT,
                        packageName).getBoolean()
                        ? ICameraService.ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT
                        : ICameraService.ROTATION_OVERRIDE_NONE;
            } catch (PackageManager.NameNotFoundException e) {
                // No such property
            }
        }

        return CompatChanges.isChangeEnabled(OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT)
                ? ICameraService.ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT
                : ICameraService.ROTATION_OVERRIDE_NONE;
    }

    /**
@@ -1500,6 +1582,7 @@ public final class CameraManager {
        return CompatChanges.isChangeEnabled(OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT);
    }


    /**
     * @hide
     */
+2 −1
Original line number Diff line number Diff line
@@ -134,7 +134,8 @@ public class CameraDeviceSetupImpl extends CameraDevice.CameraDeviceSetup {
            try {
                CameraMetadataNative metadata = cameraService.getSessionCharacteristics(
                        mCameraId, mTargetSdkVersion,
                        CameraManager.shouldOverrideToPortrait(mContext), sessionConfig,
                        CameraManager.getRotationOverride(mContext),
                        sessionConfig,
                        mContext.getDeviceId(),
                        mCameraManager.getDevicePolicyFromContext(mContext));