summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Iavor-Valentin Iftime <valiiftime@google.com> 2022-01-20 16:48:21 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-01-20 16:48:21 +0000
commit218e713d6ff842e38f3746a694362e6f5b6b357a (patch)
treeba6955b314749d352f5e316530626a4a21591cbe
parent8f774442c8a550b8664a14a1d24983e841124723 (diff)
parente66a2d5f888e7139c1dc865dc7c29ada3b2ca703 (diff)
Merge "Notify CameraService on USB host events"
-rw-r--r--services/core/java/com/android/server/camera/CameraServiceProxy.java40
1 files changed, 40 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java
index 9d9b90cba39b..33a26baea90e 100644
--- a/services/core/java/com/android/server/camera/CameraServiceProxy.java
+++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java
@@ -46,6 +46,8 @@ import android.hardware.camera2.CaptureRequest;
import android.hardware.devicestate.DeviceStateManager;
import android.hardware.devicestate.DeviceStateManager.FoldStateListener;
import android.hardware.display.DisplayManager;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbManager;
import android.media.AudioManager;
import android.nfc.INfcAdapter;
import android.os.Binder;
@@ -335,6 +337,16 @@ public class CameraServiceProxy extends SystemService
switchUserLocked(mLastUser);
}
break;
+ case UsbManager.ACTION_USB_DEVICE_ATTACHED:
+ case UsbManager.ACTION_USB_DEVICE_DETACHED:
+ synchronized (mLock) {
+ UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
+ if (device != null) {
+ notifyUsbDeviceHotplugLocked(device,
+ action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED));
+ }
+ }
+ break;
default:
break; // do nothing
}
@@ -645,6 +657,8 @@ public class CameraServiceProxy extends SystemService
filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
+ filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
+ filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
mContext.registerReceiver(mIntentReceiver, filter);
publishBinderService(CAMERA_SERVICE_PROXY_BINDER_NAME, mCameraServiceProxy);
@@ -963,6 +977,32 @@ public class CameraServiceProxy extends SystemService
return true;
}
+ private boolean notifyUsbDeviceHotplugLocked(@NonNull UsbDevice device, boolean attached) {
+ // Only handle external USB camera devices
+ if (device.getHasVideoCapture()) {
+ // Forward the usb hotplug event to the native camera service running in the
+ // cameraserver
+ // process.
+ ICameraService cameraService = getCameraServiceRawLocked();
+ if (cameraService == null) {
+ Slog.w(TAG, "Could not notify cameraserver, camera service not available.");
+ return false;
+ }
+
+ try {
+ int eventType = attached ? ICameraService.EVENT_USB_DEVICE_ATTACHED
+ : ICameraService.EVENT_USB_DEVICE_DETACHED;
+ mCameraServiceRaw.notifySystemEvent(eventType, new int[]{device.getDeviceId()});
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Could not notify cameraserver, remote exception: " + e);
+ // Not much we can do if camera service is dead.
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
private void updateActivityCount(CameraSessionStats cameraState) {
String cameraId = cameraState.getCameraId();
int newCameraState = cameraState.getNewCameraState();