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

Unverified Commit cddbe420 authored by Sauhard Pande's avatar Sauhard Pande Committed by Michael Bestas
Browse files

camera: Support exposing aux camera to apps



Co-authored-by: default avatarMichael Bestas <mkbestas@lineageos.org>
Co-authored-by: default avatarPaul Keith <javelinanddart@gmail.com>
Co-authored-by: default avatarRashed Abdel-Tawab <rashed@linux.com>
Change-Id: I15910154c6df205e6d4e00bfad30a00c9e3d5bee
parent 9eed3121
Loading
Loading
Loading
Loading
+33 −1
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemProperties;
import android.text.TextUtils;
import android.util.Log;
import android.view.Surface;
@@ -61,6 +62,7 @@ import com.android.internal.app.IAppOpsService;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
@@ -264,6 +266,25 @@ public class Camera {
     */
    private static final int CAMERA_FACE_DETECTION_SW = 1;

    /**
     * @hide
     */
    public static boolean shouldExposeAuxCamera() {
        /**
         * Force to expose only two cameras
         * if the package name does not falls in this bucket
         */
        String packageName = ActivityThread.currentOpPackageName();
        if (packageName == null)
            return true;
        List<String> packageList = Arrays.asList(
                SystemProperties.get("vendor.camera.aux.packagelist", packageName).split(","));
        List<String> packageExcludelist = Arrays.asList(
                SystemProperties.get("vendor.camera.aux.packageexcludelist", "").split(","));

        return packageList.contains(packageName) && !packageExcludelist.contains(packageName);
    }

    /**
     * Returns the number of physical cameras available on this device.
     * The return value of this method might change dynamically if the device
@@ -280,7 +301,12 @@ public class Camera {
     *   cameras or an error was encountered enumerating them.
     */
    public static int getNumberOfCameras() {
        return getNumberOfCameras(ActivityThread.currentApplication().getApplicationContext());
        int numberOfCameras =
                getNumberOfCameras(ActivityThread.currentApplication().getApplicationContext());
        if (!shouldExposeAuxCamera() && numberOfCameras > 2) {
            numberOfCameras = 2;
        }
        return numberOfCameras;
    }

    /**
@@ -307,6 +333,9 @@ public class Camera {
     *    low-level failure).
     */
    public static void getCameraInfo(int cameraId, CameraInfo cameraInfo) {
        if (cameraId >= getNumberOfCameras()) {
            throw new RuntimeException("Unknown camera ID");
        }
        Context context = ActivityThread.currentApplication().getApplicationContext();
        final int rotationOverride = CameraManager.getRotationOverride(context);
        getCameraInfo(cameraId, context, rotationOverride, cameraInfo);
@@ -563,6 +592,9 @@ public class Camera {

    /** used by Camera#open, Camera#open(int) */
    Camera(int cameraId, @NonNull Context context, int rotationOverride) {
        if (cameraId >= getNumberOfCameras()) {
            throw new RuntimeException("Unknown camera ID");
        }
        Objects.requireNonNull(context);
        final int err = cameraInit(cameraId, context, rotationOverride);
        if (checkInitErrors(err)) {
+8 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import android.compat.annotation.Overridable;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Point;
import android.hardware.Camera;
import android.hardware.CameraExtensionSessionStats;
import android.hardware.CameraStatus;
import android.hardware.ICameraService;
@@ -2284,7 +2285,9 @@ public final class CameraManager {

        private String[] extractCameraIdListLocked(int deviceId, int devicePolicy) {
            List<String> cameraIds = new ArrayList<>();
            boolean exposeAuxCamera = Camera.shouldExposeAuxCamera();
            for (int i = 0; i < mDeviceStatus.size(); i++) {
                if (!exposeAuxCamera && i == 2) break;
                int status = mDeviceStatus.valueAt(i);
                DeviceCameraInfo info = mDeviceStatus.keyAt(i);
                if (status == ICameraServiceListener.STATUS_NOT_PRESENT
@@ -2834,6 +2837,11 @@ public final class CameraManager {
        }

        private void onStatusChangedLocked(int status, DeviceCameraInfo info) {
            if (!Camera.shouldExposeAuxCamera() && Integer.parseInt(info.mCameraId) >= 2) {
                Log.w(TAG, String.format("Ignoring status update of camera %d", info.mDeviceId));
                return;
            }

            if (DEBUG) {
                Log.v(TAG,
                        String.format("Camera id %s has status changed to 0x%x for device %d",