diff options
3 files changed, 61 insertions, 4 deletions
diff --git a/core/java/android/hardware/camera2/extension/AdvancedExtender.java b/core/java/android/hardware/camera2/extension/AdvancedExtender.java index fb2df546f545..eb889493f570 100644 --- a/core/java/android/hardware/camera2/extension/AdvancedExtender.java +++ b/core/java/android/hardware/camera2/extension/AdvancedExtender.java @@ -56,6 +56,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) @@ -81,6 +82,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) ? @@ -264,7 +269,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 diff --git a/core/java/android/hardware/camera2/extension/CameraExtensionService.java b/core/java/android/hardware/camera2/extension/CameraExtensionService.java index 1426d7bceb7f..fa0d14a3f05a 100644 --- a/core/java/android/hardware/camera2/extension/CameraExtensionService.java +++ b/core/java/android/hardware/camera2/extension/CameraExtensionService.java @@ -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,16 +80,22 @@ public abstract class CameraExtensionService extends Service { synchronized (mLock) { mInitializeCb = null; } + if (mCameraUsageTracker != null) { + mCameraUsageTracker.finishCameraOperation(); + } } }; @FlaggedApi(Flags.FLAG_CONCERT_MODE) - protected CameraExtensionService() {} + protected CameraExtensionService() { } @FlaggedApi(Flags.FLAG_CONCERT_MODE) @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(); } } diff --git a/core/java/android/hardware/camera2/extension/SessionProcessor.java b/core/java/android/hardware/camera2/extension/SessionProcessor.java index 6ed0c1404212..9c5136bcf903 100644 --- a/core/java/android/hardware/camera2/extension/SessionProcessor.java +++ b/core/java/android/hardware/camera2/extension/SessionProcessor.java @@ -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(); } |