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

Unverified Commit 3d96e789 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 3775edea
Loading
Loading
Loading
Loading
+33 −1
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import android.os.Parcel;
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;
@@ -66,6 +67,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;
@@ -269,6 +271,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
@@ -285,7 +306,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;
    }

    /**
@@ -316,6 +342,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 CameraCompatibilityInfo compatInfo = CameraManager.getRotationOverride(context);
        getCameraInfo(cameraId, context, compatInfo, cameraInfo);
@@ -594,6 +623,9 @@ public class Camera {

    /** used by Camera#open, Camera#open(int) */
    Camera(int cameraId, @NonNull Context context, CameraCompatibilityInfo compatInfo) {
        if (cameraId >= getNumberOfCameras()) {
            throw new RuntimeException("Unknown camera ID");
        }
        Objects.requireNonNull(context);
        final int err = cameraInit(cameraId, context, compatInfo);
        if (checkInitErrors(err)) {
+8 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import android.content.pm.PackageManager;
import android.content.res.CameraCompatibilityInfo;
import android.content.res.CompatibilityInfo;
import android.graphics.Point;
import android.hardware.Camera;
import android.hardware.CameraExtensionSessionStats;
import android.hardware.CameraStatus;
import android.hardware.ICameraService;
@@ -2485,7 +2486,9 @@ public final class CameraManager {
                    Thread.currentThread().getId(), mDeviceStatus.size()));
            try {
                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
@@ -3070,6 +3073,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",