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

Commit ee688957 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "VDM and camera framework changes for camera device awareness" into main

parents 02836401 96141040
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -1527,6 +1527,13 @@ 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 int getNumberOfCameras(@NonNull android.content.Context);
    method @Deprecated public static android.hardware.Camera open(int, @NonNull android.content.Context, boolean);
    method @Deprecated public final void setPreviewSurface(android.view.Surface) throws java.io.IOException;
  }

  public final class SensorPrivacyManager {
    method @FlaggedApi("com.android.internal.camera.flags.camera_privacy_allowlist") @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setCameraPrivacyAllowlist(@NonNull java.util.List<java.lang.String>);
    method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setSensorPrivacy(int, int, boolean);
+82 −20
Original line number Diff line number Diff line
@@ -16,14 +16,21 @@

package android.hardware;

import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT;
import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_CAMERA;
import static android.content.Context.DEVICE_ID_DEFAULT;
import static android.system.OsConstants.EACCES;
import static android.system.OsConstants.ENODEV;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SuppressLint;
import android.annotation.TestApi;
import android.app.ActivityThread;
import android.app.AppOpsManager;
import android.companion.virtual.VirtualDeviceManager;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.graphics.ImageFormat;
@@ -56,6 +63,7 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;

/**
 * The Camera class is used to set image capture settings, start/stop preview,
@@ -271,7 +279,24 @@ public class Camera {
     * @return total number of accessible camera devices, or 0 if there are no
     *   cameras or an error was encountered enumerating them.
     */
    public native static int getNumberOfCameras();
    public static int getNumberOfCameras() {
        return getNumberOfCameras(ActivityThread.currentApplication().getApplicationContext());
    }

    /**
     * Returns the number of physical cameras available on this device for the given context.
     * The return value of this method might change dynamically if the device supports external
     * cameras and an external camera is connected or disconnected.
     *
     * @hide
     */
    @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
    @TestApi
    public static int getNumberOfCameras(@NonNull Context context) {
        return _getNumberOfCameras(context.getDeviceId(), getDevicePolicyFromContext(context));
    }

    private static native int _getNumberOfCameras(int deviceId, int devicePolicy);

    /**
     * Returns the information about a particular camera.
@@ -282,10 +307,22 @@ public class Camera {
     *    low-level failure).
     */
    public static void getCameraInfo(int cameraId, CameraInfo cameraInfo) {
        boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(
                ActivityThread.currentApplication().getApplicationContext());
        Context context = ActivityThread.currentApplication().getApplicationContext();
        boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(context);
        getCameraInfo(cameraId, context, overrideToPortrait, cameraInfo);
    }

        _getCameraInfo(cameraId, overrideToPortrait, cameraInfo);
    /**
     * Returns the information about a particular camera for the given context.
     *
     * @hide
     */
    @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
    @TestApi
    public static void getCameraInfo(int cameraId, @NonNull Context context,
            boolean overrideToPortrait, CameraInfo cameraInfo) {
        _getCameraInfo(cameraId, overrideToPortrait, context.getDeviceId(),
                getDevicePolicyFromContext(context), cameraInfo);
        IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
        IAudioService audioService = IAudioService.Stub.asInterface(b);
        try {
@@ -298,8 +335,20 @@ public class Camera {
            Log.e(TAG, "Audio service is unavailable for queries");
        }
    }

    private native static void _getCameraInfo(int cameraId, boolean overrideToPortrait,
            CameraInfo cameraInfo);
            int deviceId, int devicePolicy, CameraInfo cameraInfo);

    private static int getDevicePolicyFromContext(Context context) {
        if (context.getDeviceId() == DEVICE_ID_DEFAULT
                || !android.companion.virtual.flags.Flags.virtualCamera()) {
            return DEVICE_POLICY_DEFAULT;
        }

        VirtualDeviceManager virtualDeviceManager =
                context.getSystemService(VirtualDeviceManager.class);
        return virtualDeviceManager.getDevicePolicy(context.getDeviceId(), POLICY_TYPE_CAMERA);
    }

    /**
     * Information about a camera
@@ -359,7 +408,7 @@ public class Camera {
         * when {@link Camera#takePicture takePicture} is called.</p>
         */
        public boolean canDisableShutterSound;
    };
    }

    /**
     * Creates a new Camera object to access a particular hardware camera. If
@@ -391,7 +440,20 @@ public class Camera {
     * @see android.app.admin.DevicePolicyManager#getCameraDisabled(android.content.ComponentName)
     */
    public static Camera open(int cameraId) {
        return new Camera(cameraId);
        Context context = ActivityThread.currentApplication().getApplicationContext();
        boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(context);
        return open(cameraId, context, overrideToPortrait);
    }

    /**
     * Creates a new Camera object for a given camera id for the given context.
     *
     * @hide
     */
    @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
    @TestApi
    public static Camera open(int cameraId, @NonNull Context context, boolean overrideToPortrait) {
        return new Camera(cameraId, context, overrideToPortrait);
    }

    /**
@@ -409,7 +471,7 @@ public class Camera {
        for (int i = 0; i < numberOfCameras; i++) {
            getCameraInfo(i, cameraInfo);
            if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
                return new Camera(i);
                return open(i);
            }
        }
        return null;
@@ -459,10 +521,10 @@ public class Camera {
            throw new IllegalArgumentException("Unsupported HAL version " + halVersion);
        }

        return new Camera(cameraId);
        return open(cameraId);
    }

    private int cameraInit(int cameraId) {
    private int cameraInit(int cameraId, Context context, boolean overrideToPortrait) {
        mShutterCallback = null;
        mRawImageCallback = null;
        mJpegCallback = null;
@@ -480,11 +542,10 @@ public class Camera {
            mEventHandler = null;
        }

        boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(
                ActivityThread.currentApplication().getApplicationContext());
        boolean forceSlowJpegMode = shouldForceSlowJpegMode();
        return native_setup(new WeakReference<Camera>(this), cameraId,
                ActivityThread.currentOpPackageName(), overrideToPortrait, forceSlowJpegMode);
        return native_setup(new WeakReference<>(this), cameraId,
                ActivityThread.currentOpPackageName(), overrideToPortrait, forceSlowJpegMode,
                context.getDeviceId(), getDevicePolicyFromContext(context));
    }

    private boolean shouldForceSlowJpegMode() {
@@ -501,8 +562,9 @@ public class Camera {
    }

    /** used by Camera#open, Camera#open(int) */
    Camera(int cameraId) {
        int err = cameraInit(cameraId);
    Camera(int cameraId, @NonNull Context context, boolean overrideToPortrait) {
        Objects.requireNonNull(context);
        int err = cameraInit(cameraId, context, overrideToPortrait);
        if (checkInitErrors(err)) {
            if (err == -EACCES) {
                throw new RuntimeException("Fail to connect to camera service");
@@ -515,7 +577,6 @@ public class Camera {
        initAppOps();
    }


    /**
     * @hide
     */
@@ -568,11 +629,10 @@ public class Camera {

    @UnsupportedAppUsage
    private native int native_setup(Object cameraThis, int cameraId, String packageName,
            boolean overrideToPortrait, boolean forceSlowJpegMode);
            boolean overrideToPortrait, boolean forceSlowJpegMode, int deviceId, int devicePolicy);

    private native final void native_release();


    /**
     * Disconnects and releases the Camera object resources.
     *
@@ -672,13 +732,15 @@ public class Camera {
        if (holder != null) {
            setPreviewSurface(holder.getSurface());
        } else {
            setPreviewSurface((Surface)null);
            setPreviewSurface(null);
        }
    }

    /**
     * @hide
     */
    @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
    @TestApi
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
    public native final void setPreviewSurface(Surface surface) throws IOException;

+19 −15
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.hardware;

import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;

@@ -23,7 +24,7 @@ import android.os.Parcelable;
 * Status information about a camera.
 *
 * Contains the name of the camera device, and its current status, one of the
 * ICameraServiceListener.STATUS_ values.
 * ICameraServiceListener.STATUS_* values.
 *
 * @hide
 */
@@ -32,6 +33,7 @@ public class CameraStatus implements Parcelable {
    public int status;
    public String[] unavailablePhysicalCameras;
    public String clientPackage;
    public int deviceId;

    @Override
    public int describeContents() {
@@ -44,6 +46,7 @@ public class CameraStatus implements Parcelable {
        out.writeInt(status);
        out.writeStringArray(unavailablePhysicalCameras);
        out.writeString(clientPackage);
        out.writeInt(deviceId);
    }

    public void readFromParcel(Parcel in) {
@@ -51,15 +54,16 @@ public class CameraStatus implements Parcelable {
        status = in.readInt();
        unavailablePhysicalCameras = in.readStringArray();
        clientPackage = in.readString();
        deviceId = in.readInt();
    }

    public static final @android.annotation.NonNull Parcelable.Creator<CameraStatus> CREATOR =
            new Parcelable.Creator<CameraStatus>() {
    @NonNull
    public static final Parcelable.Creator<CameraStatus> CREATOR =
            new Parcelable.Creator<>() {
                @Override
                public CameraStatus createFromParcel(Parcel in) {
                    CameraStatus status = new CameraStatus();
                    status.readFromParcel(in);

                    return status;
                }

+15 −0
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@ package android.hardware.camera2;
import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.companion.virtual.VirtualDeviceManager;
import android.companion.virtual.camera.VirtualCameraConfig;
import android.compat.annotation.UnsupportedAppUsage;
import android.hardware.camera2.impl.CameraMetadataNative;
import android.hardware.camera2.impl.ExtensionKey;
@@ -5328,6 +5330,19 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
    public static final Key<Integer> INFO_SESSION_CONFIGURATION_QUERY_VERSION =
            new Key<Integer>("android.info.sessionConfigurationQueryVersion", int.class);

    /**
     * <p>Id of the device that owns this camera.</p>
     * <p>In case of a virtual camera, this would be the id of the virtual device
     * owning the camera. For any other camera, this key would not be present.
     * Callers should assume {@link android.content.Context#DEVICE_ID_DEFAULT}
     * in case this key is not present.</p>
     * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
     *  @see VirtualDeviceManager.VirtualDevice#createVirtualCamera(VirtualCameraConfig)
     * @hide
     */
    public static final Key<Integer> INFO_DEVICE_ID =
            new Key<Integer>("android.info.deviceId", int.class);

    /**
     * <p>The maximum number of frames that can occur after a request
     * (different than the previous) has been submitted, and before the
+356 −243

File changed.

Preview size limit exceeded, changes collapsed.

Loading