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);
}