From e6731b05e1d51ea8aec42fbc192dac8eea4c2980 Mon Sep 17 00:00:00 2001 From: Avichal Rakesh Date: Thu, 19 Jan 2023 14:21:02 -0800 Subject: [PATCH] Add UVC support This CL adds support for UVC GadgetFunction. UVC can be enabled/disabled by setting the `ro.usb.uvc.enabled` property, and this CL makes sure that the Settings app honors the property when showing USB functions to the user. Bug: 242344221 Test: Manually tested that the 'USB Webcam' option is present when the property is set, and removed when property is unset. Change-Id: I5d1ff0a43d3c0c722bc9e03132a581da5c61bd76 --- res/values/strings.xml | 9 +++++++++ .../connecteddevice/usb/ConnectedUsbDeviceUpdater.java | 4 ++++ .../settings/connecteddevice/usb/UsbBackend.java | 10 ++++++++-- .../usb/UsbConnectionBroadcastReceiver.java | 3 +++ .../usb/UsbDetailsFunctionsController.java | 1 + 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 8625fe332d3..1249ac604c2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8710,6 +8710,10 @@ select what the USB connection for this device should be used for. This choice is for transferring photos via PTP. --> PTP + + Webcam @@ -8775,6 +8779,8 @@ PTP MIDI + + Webcam File transfer and supplying power @@ -8787,6 +8793,9 @@ MIDI and supplying power + + Webcam and supplying power Background check diff --git a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java index 54d039212e4..d76ac697c4f 100644 --- a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java +++ b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java @@ -129,6 +129,8 @@ public class ConnectedUsbDeviceUpdater { return R.string.usb_summary_photo_transfers; } else if (functions == UsbManager.FUNCTION_MIDI) { return R.string.usb_summary_MIDI; + } else if (functions == UsbManager.FUNCTION_UVC) { + return R.string.usb_summary_UVC; } else { return R.string.usb_summary_charging_only; } @@ -141,6 +143,8 @@ public class ConnectedUsbDeviceUpdater { return R.string.usb_summary_photo_transfers_power; } else if (functions == UsbManager.FUNCTION_MIDI) { return R.string.usb_summary_MIDI_power; + } else if (functions == UsbManager.FUNCTION_UVC) { + return R.string.usb_summary_UVC_power; } else { return R.string.usb_summary_power_only; } diff --git a/src/com/android/settings/connecteddevice/usb/UsbBackend.java b/src/com/android/settings/connecteddevice/usb/UsbBackend.java index 7f3a5987d21..2f8b5c34696 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbBackend.java +++ b/src/com/android/settings/connecteddevice/usb/UsbBackend.java @@ -53,6 +53,7 @@ public class UsbBackend { private final boolean mTetheringRestrictedBySystem; private final boolean mMidiSupported; private final boolean mTetheringSupported; + private final boolean mUVCEnabled; private final boolean mIsAdminUser; private UsbManager mUsbManager; @@ -74,12 +75,12 @@ public class UsbBackend { mFileTransferRestrictedBySystem = isUsbFileTransferRestrictedBySystem(userManager); mTetheringRestricted = isUsbTetheringRestricted(userManager); mTetheringRestrictedBySystem = isUsbTetheringRestrictedBySystem(userManager); + mUVCEnabled = isUvcEnabled(); mIsAdminUser = userManager.isAdminUser(); mMidiSupported = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI); final TetheringManager tm = context.getSystemService(TetheringManager.class); mTetheringSupported = tm.isTetheringSupported(); - updatePorts(); } @@ -200,6 +201,10 @@ public class UsbBackend { UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.of(UserHandle.myUserId())); } + private static boolean isUvcEnabled() { + return UsbManager.isUvcSupportEnabled(); + } + private boolean areFunctionDisallowed(long functions) { return (mFileTransferRestricted && ((functions & UsbManager.FUNCTION_MTP) != 0 || (functions & UsbManager.FUNCTION_PTP) != 0)) @@ -209,7 +214,8 @@ public class UsbBackend { private boolean areFunctionsDisallowedBySystem(long functions) { return (mFileTransferRestrictedBySystem && ((functions & UsbManager.FUNCTION_MTP) != 0 || (functions & UsbManager.FUNCTION_PTP) != 0)) - || (mTetheringRestrictedBySystem && ((functions & UsbManager.FUNCTION_RNDIS) != 0)); + || (mTetheringRestrictedBySystem && ((functions & UsbManager.FUNCTION_RNDIS) != 0)) + || (!mUVCEnabled && ((functions & UsbManager.FUNCTION_UVC) != 0)); } @VisibleForTesting diff --git a/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java b/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java index 1a1f8ba4142..16ea602bc4f 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java +++ b/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java @@ -87,6 +87,9 @@ public class UsbConnectionBroadcastReceiver extends BroadcastReceiver implements if (intent.getExtras().getBoolean(UsbManager.USB_FUNCTION_NCM)) { functions |= UsbManager.FUNCTION_NCM; } + if (intent.getExtras().getBoolean(UsbManager.USB_FUNCTION_UVC)) { + functions |= UsbManager.FUNCTION_UVC; + } mFunctions = functions; mDataRole = mUsbBackend.getDataRole(); mPowerRole = mUsbBackend.getPowerRole(); diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java index b887bd704f4..88e20b60dd0 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java @@ -52,6 +52,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController FUNCTIONS_MAP.put(UsbManager.FUNCTION_RNDIS, R.string.usb_use_tethering); FUNCTIONS_MAP.put(UsbManager.FUNCTION_MIDI, R.string.usb_use_MIDI); FUNCTIONS_MAP.put(UsbManager.FUNCTION_PTP, R.string.usb_use_photo_transfers); + FUNCTIONS_MAP.put(UsbManager.FUNCTION_UVC, R.string.usb_use_uvc_webcam); FUNCTIONS_MAP.put(UsbManager.FUNCTION_NONE, R.string.usb_use_charging_only); }