diff options
| author | 2020-03-10 23:27:46 +0000 | |
|---|---|---|
| committer | 2020-03-10 23:27:46 +0000 | |
| commit | abb2d5847d7e70e854d54dee9c54099391cd066d (patch) | |
| tree | 12f62d35ab637df16e6a9c6716b98ab992e8412c | |
| parent | a7a96ad6f8ceb5d961dec8c3ebade5ff3d6a2bb9 (diff) | |
| parent | 6d76d3b1f6cb86caec693a84d821820e2e59219f (diff) | |
Merge "Camera: Add new hidden API for camera open/close callback" into rvc-dev
| -rw-r--r-- | core/java/android/hardware/camera2/CameraManager.java | 91 | ||||
| -rw-r--r-- | core/res/AndroidManifest.xml | 11 | ||||
| -rw-r--r-- | core/res/res/values/strings.xml | 5 | ||||
| -rw-r--r-- | data/etc/com.android.systemui.xml | 1 | ||||
| -rw-r--r-- | media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java | 9 | ||||
| -rw-r--r-- | packages/SystemUI/AndroidManifest.xml | 1 |
6 files changed, 117 insertions, 1 deletions
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 85ef4a3392a8..a091f84fe463 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -846,6 +846,33 @@ public final class CameraManager { @NonNull String physicalCameraId) { // default empty implementation } + + /** + * A camera device has been opened by an application. + * + * <p>The default implementation of this method does nothing.</p> + * + * @param cameraId The unique identifier of the new camera. + * @param packageId The package Id of the application opening the camera. + * + * @see #onCameraClosed + */ + /** @hide */ + public void onCameraOpened(@NonNull String cameraId, @NonNull String packageId) { + // default empty implementation + } + + /** + * A previously-opened camera has been closed. + * + * <p>The default implementation of this method does nothing.</p> + * + * @param cameraId The unique identifier of the closed camera. + */ + /** @hide */ + public void onCameraClosed(@NonNull String cameraId) { + // default empty implementation + } } /** @@ -1276,6 +1303,12 @@ public final class CameraManager { } @Override public void onCameraAccessPrioritiesChanged() { + } + @Override + public void onCameraOpened(String id, String clientPackageId) { + } + @Override + public void onCameraClosed(String id) { }}; String[] cameraIds = null; @@ -1503,6 +1536,38 @@ public final class CameraManager { } } + private void postSingleCameraOpenedUpdate(final AvailabilityCallback callback, + final Executor executor, final String id, final String packageId) { + final long ident = Binder.clearCallingIdentity(); + try { + executor.execute( + new Runnable() { + @Override + public void run() { + callback.onCameraOpened(id, packageId); + } + }); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + private void postSingleCameraClosedUpdate(final AvailabilityCallback callback, + final Executor executor, final String id) { + final long ident = Binder.clearCallingIdentity(); + try { + executor.execute( + new Runnable() { + @Override + public void run() { + callback.onCameraClosed(id); + } + }); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + private void postSingleUpdate(final AvailabilityCallback callback, final Executor executor, final String id, final String physicalId, final int status) { if (isAvailable(status)) { @@ -1846,6 +1911,32 @@ public final class CameraManager { } } + @Override + public void onCameraOpened(String cameraId, String clientPackageId) { + synchronized (mLock) { + final int callbackCount = mCallbackMap.size(); + for (int i = 0; i < callbackCount; i++) { + Executor executor = mCallbackMap.valueAt(i); + final AvailabilityCallback callback = mCallbackMap.keyAt(i); + + postSingleCameraOpenedUpdate(callback, executor, cameraId, clientPackageId); + } + } + } + + @Override + public void onCameraClosed(String cameraId) { + synchronized (mLock) { + final int callbackCount = mCallbackMap.size(); + for (int i = 0; i < callbackCount; i++) { + Executor executor = mCallbackMap.valueAt(i); + final AvailabilityCallback callback = mCallbackMap.keyAt(i); + + postSingleCameraClosedUpdate(callback, executor, cameraId); + } + } + } + /** * Try to connect to camera service after some delay if any client registered camera * availability callback or torch status callback. diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 885117018c50..5086c7e98598 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1305,7 +1305,7 @@ android:description="@string/permdesc_camera" android:protectionLevel="dangerous|instant" /> - <!-- @SystemApi Required in addition to android.permission.CAMERA to be able to access + <!-- @SystemApi Required in addition to android.permission.CAMERA to be able to access system only camera devices. <p>Protection level: system|signature @hide --> @@ -1315,6 +1315,15 @@ android:description="@string/permdesc_systemCamera" android:protectionLevel="system|signature" /> + <!-- Allows receiving the camera service notifications when a camera is opened + (by a certain application package) or closed. + @hide --> + <permission android:name="android.permission.CAMERA_OPEN_CLOSE_LISTENER" + android:permissionGroup="android.permission-group.UNDEFINED" + android:label="@string/permlab_cameraOpenCloseListener" + android:description="@string/permdesc_cameraOpenCloseListener" + android:protectionLevel="signature" /> + <!-- ====================================================================== --> <!-- Permissions for accessing the device sensors --> <!-- ====================================================================== --> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index d30fdced3e38..4b49dd340584 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1166,6 +1166,11 @@ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR_LIMIT=NONE] --> <string name="permdesc_systemCamera">This privileged | system app can take pictures and record videos using a system camera at any time. Requires the android.permission.CAMERA permission to be held by the app as well</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR_LIMIT=NONE] --> + <string name="permlab_cameraOpenCloseListener">Allow an application or service to receive callbacks about camera devices being opened or closed.</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR_LIMIT=NONE] --> + <string name="permdesc_cameraOpenCloseListener">This signature app can receive callbacks when any camera device is being opened (by what application package) or closed.</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_vibrate">control vibration</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> diff --git a/data/etc/com.android.systemui.xml b/data/etc/com.android.systemui.xml index 38e18a941905..72827a956f78 100644 --- a/data/etc/com.android.systemui.xml +++ b/data/etc/com.android.systemui.xml @@ -63,5 +63,6 @@ <permission name="android.permission.WRITE_SECURE_SETTINGS"/> <permission name="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS"/> <permission name="android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS" /> + <permission name="android.permission.CAMERA_OPEN_CLOSE_LISTENER" /> </privapp-permissions> </permissions> diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java index c529952843a1..6354ccd7b3b0 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java @@ -320,6 +320,15 @@ public class CameraBinderTest extends AndroidTestCase { public void onCameraAccessPrioritiesChanged() { Log.v(TAG, "Camera access permission change"); } + @Override + public void onCameraOpened(String cameraId, String clientPackageName) { + Log.v(TAG, String.format("Camera %s is opened by client package %s", + cameraId, clientPackageName)); + } + @Override + public void onCameraClosed(String cameraId) { + Log.v(TAG, String.format("Camera %s is closed", cameraId)); + } } /** diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 30b461d1fe45..da93db7b37f6 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -147,6 +147,7 @@ <uses-permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" /> <uses-permission android:name="android.permission.CAMERA" /> + <uses-permission android:name="android.permission.CAMERA_OPEN_CLOSE_LISTENER" /> <!-- Screen Capturing --> <uses-permission android:name="android.permission.MANAGE_MEDIA_PROJECTION" /> |