summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/camera2/CameraManager.java71
-rw-r--r--core/jni/Android.bp1
-rw-r--r--core/jni/android_hardware_Camera.cpp23
3 files changed, 71 insertions, 24 deletions
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 21627920f598..344f6b61423b 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -19,6 +19,7 @@ package android.hardware.camera2;
import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT;
import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_CAMERA;
import static android.content.Context.DEVICE_ID_DEFAULT;
+import static android.content.Context.DEVICE_ID_INVALID;
import android.annotation.CallbackExecutor;
import android.annotation.FlaggedApi;
@@ -36,6 +37,7 @@ import android.companion.virtual.VirtualDeviceManager;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledSince;
import android.compat.annotation.Overridable;
+import android.content.AttributionSource;
import android.content.AttributionSourceState;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -674,8 +676,8 @@ public final class CameraManager {
}
try {
for (String physicalCameraId : physicalCameraIds) {
- AttributionSourceState clientAttribution = getClientAttribution();
- clientAttribution.deviceId = DEVICE_ID_DEFAULT;
+ AttributionSourceState clientAttribution = getClientAttribution(DEVICE_ID_DEFAULT,
+ /* useContextAttributionSource= */ false);
CameraMetadataNative physicalCameraInfo =
cameraService.getCameraCharacteristics(
physicalCameraId,
@@ -972,27 +974,58 @@ public final class CameraManager {
}
/**
- * Constructs an AttributionSourceState with only the uid, pid, and deviceId fields set
+ * Retrieves the AttributionSourceState to pass to the CameraService.
*
- * <p>This method is a temporary stopgap in the transition to using AttributionSource. Currently
- * AttributionSourceState is only used as a vehicle for passing deviceId, uid, and pid
- * arguments.</p>
+ * @param deviceIdOverride An override of the AttributionSource's deviceId, if not equal to
+ * DEVICE_ID_INVALID
+ * @param useContextAttributionSource Whether to return the full attribution source provided by
+ * the Context.
+ *
+ * @hide
+ */
+ public AttributionSourceState getClientAttribution(int deviceIdOverride,
+ boolean useContextAttributionSource) {
+ AttributionSource contextAttributionSource = mContext.getAttributionSource();
+ if (deviceIdOverride != DEVICE_ID_INVALID) {
+ contextAttributionSource = contextAttributionSource.withDeviceId(deviceIdOverride);
+ }
+ AttributionSourceState contextAttributionSourceState =
+ contextAttributionSource.asState();
+
+ if (Flags.useContextAttributionSource() && useContextAttributionSource) {
+ return contextAttributionSourceState;
+ } else {
+ AttributionSourceState clientAttribution =
+ new AttributionSourceState();
+ clientAttribution.uid = USE_CALLING_UID;
+ clientAttribution.pid = USE_CALLING_PID;
+ clientAttribution.deviceId = contextAttributionSourceState.deviceId;
+ clientAttribution.packageName = mContext.getOpPackageName();
+ clientAttribution.attributionTag = mContext.getAttributionTag();
+ clientAttribution.next = new AttributionSourceState[0];
+ return clientAttribution;
+ }
+ }
+
+ /**
+ * Retrieves the AttributionSourceState to pass to the CameraService.
+ *
+ * @param useContextAttributionSource Whether to return the full attribution source provided by
+ * the Context.
+ *
+ * @hide
+ */
+ public AttributionSourceState getClientAttribution(boolean useContextAttributionSource) {
+ return getClientAttribution(DEVICE_ID_INVALID, useContextAttributionSource);
+ }
+
+ /**
+ * Retrieves the AttributionSourceState to pass to the CameraService.
*
* @hide
*/
public AttributionSourceState getClientAttribution() {
- // TODO: Send the full contextAttribution over aidl, remove USE_CALLING_*
- AttributionSourceState contextAttribution =
- mContext.getAttributionSource().asState();
- AttributionSourceState clientAttribution =
- new AttributionSourceState();
- clientAttribution.uid = USE_CALLING_UID;
- clientAttribution.pid = USE_CALLING_PID;
- clientAttribution.deviceId = contextAttribution.deviceId;
- clientAttribution.packageName = mContext.getOpPackageName();
- clientAttribution.attributionTag = mContext.getAttributionTag();
- clientAttribution.next = new AttributionSourceState[0];
- return clientAttribution;
+ return getClientAttribution(DEVICE_ID_INVALID, /* useContextAttributionSource= */ false);
}
/**
@@ -1047,7 +1080,7 @@ public final class CameraManager {
}
AttributionSourceState clientAttribution =
- getClientAttribution();
+ getClientAttribution(/* useContextAttributionSource= */ true);
cameraUser =
cameraService.connectDevice(
callbacks,
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 9a4ff8fc264f..f2ca44c41b8c 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -307,6 +307,7 @@ cc_library_shared_for_libandroid_runtime {
"spatializer-aidl-cpp",
"av-types-aidl-cpp",
"android.hardware.camera.device@3.2",
+ "camera_platform_flags_c_lib",
"libandroid_net",
"libbattery",
"libnetdutils",
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index 3f74fac35bb7..10e49efee92e 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -25,6 +25,7 @@
#include <binder/Parcel.h>
#include <camera/Camera.h>
#include <camera/StringUtils.h>
+#include <com_android_internal_camera_flags.h>
#include <cutils/properties.h>
#include <gui/GLConsumer.h>
#include <gui/Surface.h>
@@ -37,6 +38,7 @@
#include "jni.h"
using namespace android;
+namespace flags = com::android::internal::camera::flags;
enum {
// Keep up to date with Camera.java
@@ -527,14 +529,19 @@ void JNICameraContext::clearCallbackBuffers_l(JNIEnv *env, Vector<jbyteArray> *b
}
static bool attributionSourceStateForJavaParcel(JNIEnv *env, jobject jClientAttributionParcel,
+ bool useContextAttributionSource,
AttributionSourceState &clientAttribution) {
const Parcel *clientAttributionParcel = parcelForJavaObject(env, jClientAttributionParcel);
if (clientAttribution.readFromParcel(clientAttributionParcel) != ::android::OK) {
jniThrowRuntimeException(env, "Fail to unparcel AttributionSourceState");
return false;
}
- clientAttribution.uid = Camera::USE_CALLING_UID;
- clientAttribution.pid = Camera::USE_CALLING_PID;
+
+ if (!(useContextAttributionSource && flags::use_context_attribution_source())) {
+ clientAttribution.uid = Camera::USE_CALLING_UID;
+ clientAttribution.pid = Camera::USE_CALLING_PID;
+ }
+
return true;
}
@@ -542,7 +549,9 @@ static jint android_hardware_Camera_getNumberOfCameras(JNIEnv *env, jobject thiz
jobject jClientAttributionParcel,
jint devicePolicy) {
AttributionSourceState clientAttribution;
- if (!attributionSourceStateForJavaParcel(env, jClientAttributionParcel, clientAttribution)) {
+ if (!attributionSourceStateForJavaParcel(env, jClientAttributionParcel,
+ /* useContextAttributionSource= */ false,
+ clientAttribution)) {
return 0;
}
return Camera::getNumberOfCameras(clientAttribution, devicePolicy);
@@ -553,7 +562,9 @@ static void android_hardware_Camera_getCameraInfo(JNIEnv *env, jobject thiz, jin
jobject jClientAttributionParcel,
jint devicePolicy, jobject info_obj) {
AttributionSourceState clientAttribution;
- if (!attributionSourceStateForJavaParcel(env, jClientAttributionParcel, clientAttribution)) {
+ if (!attributionSourceStateForJavaParcel(env, jClientAttributionParcel,
+ /* useContextAttributionSource= */ false,
+ clientAttribution)) {
return;
}
@@ -587,7 +598,9 @@ static jint android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz, jobj
jobject jClientAttributionParcel,
jint devicePolicy) {
AttributionSourceState clientAttribution;
- if (!attributionSourceStateForJavaParcel(env, jClientAttributionParcel, clientAttribution)) {
+ if (!attributionSourceStateForJavaParcel(env, jClientAttributionParcel,
+ /* useContextAttributionSource= */ true,
+ clientAttribution)) {
return -EACCES;
}