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

Commit 2afe7e40 authored by Emilian Peev's avatar Emilian Peev Committed by Android (Google) Code Review
Browse files

Merge "CameraExtensionService: Hint extension service camera usage" into main

parents 53e9688c c80c276c
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ public abstract class AdvancedExtender {
    private HashMap<String, Long> mMetadataVendorIdMap = new HashMap<>();
    private final CameraManager mCameraManager;

    private CameraUsageTracker mCameraUsageTracker;
    private static final String TAG = "AdvancedExtender";

    @FlaggedApi(Flags.FLAG_CONCERT_MODE)
@@ -82,6 +83,10 @@ public abstract class AdvancedExtender {
        }
    }

    void setCameraUsageTracker(CameraUsageTracker tracker) {
        mCameraUsageTracker = tracker;
    }

    @FlaggedApi(Flags.FLAG_CONCERT_MODE)
    public long getMetadataVendorId(@NonNull String cameraId) {
        long vendorId = mMetadataVendorIdMap.containsKey(cameraId) ?
@@ -282,7 +287,9 @@ public abstract class AdvancedExtender {

        @Override
        public ISessionProcessorImpl getSessionProcessor() {
            return AdvancedExtender.this.getSessionProcessor().getSessionProcessorBinder();
            SessionProcessor processor =AdvancedExtender.this.getSessionProcessor();
            processor.setCameraUsageTracker(mCameraUsageTracker);
            return processor.getSessionProcessorBinder();
        }

        @Override
+42 −3
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.app.AppOpsManager;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
@@ -29,6 +30,11 @@ import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.camera.flags.Flags;

interface CameraUsageTracker {
    void startCameraOperation();
    void finishCameraOperation();
}

/**
 * Base service class that extension service implementations must extend.
 *
@@ -38,8 +44,33 @@ import com.android.internal.camera.flags.Flags;
@FlaggedApi(Flags.FLAG_CONCERT_MODE)
public abstract class CameraExtensionService extends Service {
    private static final String TAG = "CameraExtensionService";
    private CameraUsageTracker mCameraUsageTracker;
    private static Object mLock = new Object();

    private final class CameraTracker implements CameraUsageTracker {

        private final AppOpsManager mAppOpsService = getApplicationContext().getSystemService(
                AppOpsManager.class);
        private final String mPackageName = getPackageName();
        private final String mAttributionTag = getAttributionTag();
        private int mUid = getApplicationInfo().uid;

        @Override
        public void startCameraOperation() {
            if (mAppOpsService != null) {
                mAppOpsService.startOp(AppOpsManager.OPSTR_CAMERA, mUid, mPackageName,
                        mAttributionTag, "Camera extensions");
            }
        }

        @Override
        public void finishCameraOperation() {
            if (mAppOpsService != null) {
                mAppOpsService.finishOp(AppOpsManager.OPSTR_CAMERA, mUid, mPackageName,
                        mAttributionTag);
            }
        }
    }
    @GuardedBy("mLock")
    private static IInitializeSessionCallback mInitializeCb = null;

@@ -49,6 +80,9 @@ public abstract class CameraExtensionService extends Service {
            synchronized (mLock) {
                mInitializeCb = null;
            }
            if (mCameraUsageTracker != null) {
                mCameraUsageTracker.finishCameraOperation();
            }
        }
    };

@@ -59,6 +93,9 @@ public abstract class CameraExtensionService extends Service {
    @Override
    @NonNull
    public IBinder onBind(@Nullable Intent intent) {
        if (mCameraUsageTracker == null) {
            mCameraUsageTracker = new CameraTracker();
        }
        return new CameraExtensionServiceImpl();
    }

@@ -132,8 +169,10 @@ public abstract class CameraExtensionService extends Service {
        @Override
        public IAdvancedExtenderImpl initializeAdvancedExtension(int extensionType)
                throws RemoteException {
            return CameraExtensionService.this.onInitializeAdvancedExtension(
                    extensionType).getAdvancedExtenderBinder();
            AdvancedExtender extender =  CameraExtensionService.this.onInitializeAdvancedExtension(
                    extensionType);
            extender.setCameraUsageTracker(mCameraUsageTracker);
            return extender.getAdvancedExtenderBinder();
        }
    }

+11 −0
Original line number Diff line number Diff line
@@ -76,10 +76,15 @@ import java.util.concurrent.Executor;
@FlaggedApi(Flags.FLAG_CONCERT_MODE)
public abstract class SessionProcessor {
    private static final String TAG = "SessionProcessor";
    private CameraUsageTracker mCameraUsageTracker;

    @FlaggedApi(Flags.FLAG_CONCERT_MODE)
    protected SessionProcessor() {}

    void setCameraUsageTracker(CameraUsageTracker tracker) {
        mCameraUsageTracker = tracker;
    }

    /**
     * Callback for notifying the status of {@link
     * #startCapture} and {@link #startRepeating}.
@@ -379,12 +384,18 @@ public abstract class SessionProcessor {
        @Override
        public void onCaptureSessionStart(IRequestProcessorImpl requestProcessor, String statsKey)
                throws RemoteException {
            if (mCameraUsageTracker != null) {
                mCameraUsageTracker.startCameraOperation();
            }
            SessionProcessor.this.onCaptureSessionStart(
                    new RequestProcessor(requestProcessor, mVendorId), statsKey);
        }

        @Override
        public void onCaptureSessionEnd() throws RemoteException {
            if (mCameraUsageTracker != null) {
                mCameraUsageTracker.finishCameraOperation();
            }
            SessionProcessor.this.onCaptureSessionEnd();
        }