summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/camera2/extension/AdvancedExtender.java9
-rw-r--r--core/java/android/hardware/camera2/extension/CameraExtensionService.java45
-rw-r--r--core/java/android/hardware/camera2/extension/SessionProcessor.java11
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();
}