diff options
| -rw-r--r-- | core/java/android/hardware/camera2/CameraManager.java | 71 | ||||
| -rw-r--r-- | core/jni/Android.bp | 1 | ||||
| -rw-r--r-- | core/jni/android_hardware_Camera.cpp | 23 |
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; } |