camera2: Mark onCameraOpened/Closed callbacks @SystemApi.
This is so that regular apps don't get to know when camera devices
are opened / closed (as oppsed to being available / unavailable), in addition to not knowing the
package names of the processes that open / close the devices.
Bug: 147710835
Bug: 170870941
Test: builds
Test: atest CameraManagerTest#testCameraManagerListenerCallbacks
Change-Id: I5cad3cb5dd70775d74c5be20d7adf434fd37bfa7
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 7e12e2e..0871a1c 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -56,6 +56,7 @@
field public static final String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE";
field @Deprecated public static final String BROADCAST_NETWORK_PRIVILEGED = "android.permission.BROADCAST_NETWORK_PRIVILEGED";
field public static final String CAMERA_DISABLE_TRANSMIT_LED = "android.permission.CAMERA_DISABLE_TRANSMIT_LED";
+ field public static final String CAMERA_OPEN_CLOSE_LISTENER = "android.permission.CAMERA_OPEN_CLOSE_LISTENER";
field public static final String CAPTURE_AUDIO_HOTWORD = "android.permission.CAPTURE_AUDIO_HOTWORD";
field public static final String CAPTURE_MEDIA_OUTPUT = "android.permission.CAPTURE_MEDIA_OUTPUT";
field public static final String CAPTURE_TV_INPUT = "android.permission.CAPTURE_TV_INPUT";
@@ -2457,6 +2458,11 @@
field public static final int SESSION_OPERATION_MODE_VENDOR_START = 32768; // 0x8000
}
+ public abstract static class CameraManager.AvailabilityCallback {
+ method @RequiresPermission(android.Manifest.permission.CAMERA_OPEN_CLOSE_LISTENER) public void onCameraClosed(@NonNull String);
+ method @RequiresPermission(android.Manifest.permission.CAMERA_OPEN_CLOSE_LISTENER) public void onCameraOpened(@NonNull String, @NonNull String);
+ }
+
}
package android.hardware.camera2.params {
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index ffb31c9..1d2ef05 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -740,6 +740,11 @@
method public String[] getCameraIdListNoLazy() throws android.hardware.camera2.CameraAccessException;
}
+ public abstract static class CameraManager.AvailabilityCallback {
+ method @RequiresPermission(android.Manifest.permission.CAMERA_OPEN_CLOSE_LISTENER) public void onCameraClosed(@NonNull String);
+ method @RequiresPermission(android.Manifest.permission.CAMERA_OPEN_CLOSE_LISTENER) public void onCameraOpened(@NonNull String, @NonNull String);
+ }
+
}
package android.hardware.display {
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 8469f5f..cdfdc1f 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -20,6 +20,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.content.Context;
@@ -850,13 +851,17 @@
* 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.
+ * android.Manifest.permission.CAMERA_OPEN_CLOSE_LISTENER is required to receive this
+ * callback
+ * @param cameraId The unique identifier of the camera opened.
* @param packageId The package Id of the application opening the camera.
*
* @see #onCameraClosed
+ * @hide
*/
- /** @hide */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(android.Manifest.permission.CAMERA_OPEN_CLOSE_LISTENER)
public void onCameraOpened(@NonNull String cameraId, @NonNull String packageId) {
// default empty implementation
}
@@ -865,10 +870,14 @@
* A previously-opened camera has been closed.
*
* <p>The default implementation of this method does nothing.</p>
- *
+ * android.Manifest.permission.CAMERA_OPEN_CLOSE_LISTENER is required to receive this
+ * callback.
* @param cameraId The unique identifier of the closed camera.
+ * @hide
*/
- /** @hide */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(android.Manifest.permission.CAMERA_OPEN_CLOSE_LISTENER)
public void onCameraClosed(@NonNull String cameraId) {
// default empty implementation
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 1250eb7..ab81c01 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1361,7 +1361,7 @@
android:description="@string/permdesc_systemCamera"
android:protectionLevel="system|signature" />
- <!-- Allows receiving the camera service notifications when a camera is opened
+ <!-- @SystemApi 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"
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 7b1257b0..cb1faf5 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -181,6 +181,8 @@
<!-- Permissions needed to test system only camera devices -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.SYSTEM_CAMERA" />
+ <!-- Permissions needed to test onCameraOpened/Closed callbacks -->
+ <uses-permission android:name="android.permission.CAMERA_OPEN_CLOSE_LISTENER" />
<!-- Permissions needed for CTS camera test: RecordingTest.java when assuming shell id -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- Permission needed to enable/disable Bluetooth/Wifi -->