diff --git a/core/api/system-current.txt b/core/api/system-current.txt index ceec849dc202d..99aa01f98e9b9 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -5817,6 +5817,8 @@ package android.hardware.usb { field public static final int DATA_STATUS_DISABLED_CONTAMINANT = 4; // 0x4 field public static final int DATA_STATUS_DISABLED_DEBUG = 32; // 0x20 field public static final int DATA_STATUS_DISABLED_DOCK = 8; // 0x8 + field public static final int DATA_STATUS_DISABLED_DOCK_DEVICE_MODE = 128; // 0x80 + field public static final int DATA_STATUS_DISABLED_DOCK_HOST_MODE = 64; // 0x40 field public static final int DATA_STATUS_DISABLED_FORCE = 16; // 0x10 field public static final int DATA_STATUS_DISABLED_OVERHEAT = 2; // 0x2 field public static final int DATA_STATUS_ENABLED = 1; // 0x1 diff --git a/core/java/android/hardware/usb/UsbPort.java b/core/java/android/hardware/usb/UsbPort.java index e0f9cad0835a7..cdd67b7c35477 100644 --- a/core/java/android/hardware/usb/UsbPort.java +++ b/core/java/android/hardware/usb/UsbPort.java @@ -46,6 +46,8 @@ import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_CONTAMINAN import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_DOCK; import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_FORCE; import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_DEBUG; +import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_DOCK_HOST_MODE; +import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_DOCK_DEVICE_MODE; import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_DEBUG_ACCESSORY; import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_BC_1_2; import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_MISSING_RP; @@ -676,6 +678,15 @@ public final class UsbPort { statusString.append("disabled-debug, "); } + if ((usbDataStatus & DATA_STATUS_DISABLED_DOCK_HOST_MODE) == + DATA_STATUS_DISABLED_DOCK_HOST_MODE) { + statusString.append("disabled-host-dock, "); + } + + if ((usbDataStatus & DATA_STATUS_DISABLED_DOCK_DEVICE_MODE) == + DATA_STATUS_DISABLED_DOCK_DEVICE_MODE) { + statusString.append("disabled-device-dock, "); + } return statusString.toString().replaceAll(", $", ""); } diff --git a/core/java/android/hardware/usb/UsbPortStatus.java b/core/java/android/hardware/usb/UsbPortStatus.java index ed3e40d6b04c7..e61703d1c3ff4 100644 --- a/core/java/android/hardware/usb/UsbPortStatus.java +++ b/core/java/android/hardware/usb/UsbPortStatus.java @@ -219,7 +219,11 @@ public final class UsbPortStatus implements Parcelable { public static final int DATA_STATUS_DISABLED_CONTAMINANT = 1 << 2; /** - * USB data is disabled due to docking event. + * This flag indicates that some or all data modes are disabled + * due to docking event, and the specific sub-statuses viz., + * {@link #DATA_STATUS_DISABLED_DOCK_HOST_MODE}, + * {@link #DATA_STATUS_DISABLED_DOCK_DEVICE_MODE} + * can be checked for individual modes. */ public static final int DATA_STATUS_DISABLED_DOCK = 1 << 3; @@ -234,6 +238,18 @@ public final class UsbPortStatus implements Parcelable { */ public static final int DATA_STATUS_DISABLED_DEBUG = 1 << 5; + /** + * USB host mode is disabled due to docking event. + * {@link #DATA_STATUS_DISABLED_DOCK} will be set as well. + */ + public static final int DATA_STATUS_DISABLED_DOCK_HOST_MODE = 1 << 6; + + /** + * USB device mode is disabled due to docking event. + * {@link #DATA_STATUS_DISABLED_DOCK} will be set as well. + */ + public static final int DATA_STATUS_DISABLED_DOCK_DEVICE_MODE = 1 << 7; + /** * Unknown whether a power brick is connected. */ @@ -329,6 +345,8 @@ public final class UsbPortStatus implements Parcelable { DATA_STATUS_DISABLED_OVERHEAT, DATA_STATUS_DISABLED_CONTAMINANT, DATA_STATUS_DISABLED_DOCK, + DATA_STATUS_DISABLED_DOCK_HOST_MODE, + DATA_STATUS_DISABLED_DOCK_DEVICE_MODE, DATA_STATUS_DISABLED_FORCE, DATA_STATUS_DISABLED_DEBUG }) @@ -357,6 +375,20 @@ public final class UsbPortStatus implements Parcelable { mSupportedRoleCombinations = supportedRoleCombinations; mContaminantProtectionStatus = contaminantProtectionStatus; mContaminantDetectionStatus = contaminantDetectionStatus; + + // Older implementations that only set the DISABLED_DOCK_MODE will have the other two + // set at the HAL interface level, so the "dock mode only" state shouldn't be visible here. + // But the semantics are ensured here. + int disabledDockModes = (usbDataStatus & + (DATA_STATUS_DISABLED_DOCK_HOST_MODE | DATA_STATUS_DISABLED_DOCK_DEVICE_MODE)); + if (disabledDockModes != 0) { + // Set DATA_STATUS_DISABLED_DOCK when one of DATA_STATUS_DISABLED_DOCK_*_MODE is set + usbDataStatus |= DATA_STATUS_DISABLED_DOCK; + } else { + // Clear DATA_STATUS_DISABLED_DOCK when none of DATA_STATUS_DISABLED_DOCK_*_MODE is set + usbDataStatus &= ~DATA_STATUS_DISABLED_DOCK; + } + mUsbDataStatus = usbDataStatus; mPowerTransferLimited = powerTransferLimited; mPowerBrickConnectionStatus = powerBrickConnectionStatus; @@ -472,7 +504,8 @@ public final class UsbPortStatus implements Parcelable { * {@link #DATA_STATUS_UNKNOWN}, {@link #DATA_STATUS_ENABLED}, * {@link #DATA_STATUS_DISABLED_OVERHEAT}, {@link #DATA_STATUS_DISABLED_CONTAMINANT}, * {@link #DATA_STATUS_DISABLED_DOCK}, {@link #DATA_STATUS_DISABLED_FORCE}, - * {@link #DATA_STATUS_DISABLED_DEBUG} + * {@link #DATA_STATUS_DISABLED_DEBUG}, {@link #DATA_STATUS_DISABLED_DOCK_HOST_MODE}, + * {@link #DATA_STATUS_DISABLED_DOCK_DEVICE_MODE} */ public @UsbDataStatus int getUsbDataStatus() { return mUsbDataStatus; diff --git a/services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java b/services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java index ca11629800a10..ff4268fda93e6 100644 --- a/services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java +++ b/services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java @@ -80,38 +80,46 @@ public final class UsbPortAidl implements UsbPortHal { /** * USB data status is not known. */ - public static final int USB_DATA_STATUS_UNKNOWN = 0; + public static final int AIDL_USB_DATA_STATUS_UNKNOWN = 0; /** * USB data is enabled. */ - public static final int USB_DATA_STATUS_ENABLED = 1; + public static final int AIDL_USB_DATA_STATUS_ENABLED = 1; /** * USB data is disabled as the port is too hot. */ - public static final int USB_DATA_STATUS_DISABLED_OVERHEAT = 2; + public static final int AIDL_USB_DATA_STATUS_DISABLED_OVERHEAT = 2; /** * USB data is disabled due to contaminated port. */ - public static final int USB_DATA_STATUS_DISABLED_CONTAMINANT = 3; + public static final int AIDL_USB_DATA_STATUS_DISABLED_CONTAMINANT = 3; /** - * USB data is disabled due to docking event. + * USB data(both host mode and device mode) is disabled due to docking event. */ - public static final int USB_DATA_STATUS_DISABLED_DOCK = 4; + public static final int AIDL_USB_DATA_STATUS_DISABLED_DOCK = 4; /** * USB data is disabled by * {@link UsbPort#enableUsbData UsbPort.enableUsbData}. */ - public static final int USB_DATA_STATUS_DISABLED_FORCE = 5; + public static final int AIDL_USB_DATA_STATUS_DISABLED_FORCE = 5; /** * USB data is disabled for debug. */ - public static final int USB_DATA_STATUS_DISABLED_DEBUG = 6; + public static final int AIDL_USB_DATA_STATUS_DISABLED_DEBUG = 6; + /** + * USB host mode disabled due to docking event. + */ + public static final int AIDL_USB_DATA_STATUS_DISABLED_DOCK_HOST_MODE = 7; + /** + * USB device mode disabled due to docking event. + */ + public static final int AIDL_USB_DATA_STATUS_DISABLED_DOCK_DEVICE_MODE = 8; public @UsbHalVersion int getUsbHalVersion() throws RemoteException { synchronized (mLock) { @@ -529,24 +537,43 @@ public final class UsbPortAidl implements UsbPortHal { int usbDataStatus = UsbPortStatus.DATA_STATUS_UNKNOWN; for (int i = 0; i < usbDataStatusHal.length; i++) { switch (usbDataStatusHal[i]) { - case USB_DATA_STATUS_ENABLED: + case AIDL_USB_DATA_STATUS_ENABLED: usbDataStatus |= UsbPortStatus.DATA_STATUS_ENABLED; break; - case USB_DATA_STATUS_DISABLED_OVERHEAT: + case AIDL_USB_DATA_STATUS_DISABLED_OVERHEAT: usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_OVERHEAT; break; - case USB_DATA_STATUS_DISABLED_CONTAMINANT: + case AIDL_USB_DATA_STATUS_DISABLED_CONTAMINANT: usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_CONTAMINANT; break; - case USB_DATA_STATUS_DISABLED_DOCK: + /* Indicates both host and gadget mode being disabled. */ + case AIDL_USB_DATA_STATUS_DISABLED_DOCK: usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_DOCK; + usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_DOCK_HOST_MODE; + usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_DOCK_DEVICE_MODE; break; - case USB_DATA_STATUS_DISABLED_FORCE: + case AIDL_USB_DATA_STATUS_DISABLED_FORCE: usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_FORCE; break; - case USB_DATA_STATUS_DISABLED_DEBUG: + case AIDL_USB_DATA_STATUS_DISABLED_DEBUG: usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_DEBUG; break; + /* + * Set DATA_STATUS_DISABLED_DOCK when DATA_STATUS_DISABLED_DOCK_HOST_MODE + * is set. + */ + case AIDL_USB_DATA_STATUS_DISABLED_DOCK_HOST_MODE: + usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_DOCK_HOST_MODE; + usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_DOCK; + break; + /* + * Set DATA_STATUS_DISABLED_DOCK when DATA_STATUS_DISABLED_DEVICE_DOCK + * is set. + */ + case AIDL_USB_DATA_STATUS_DISABLED_DOCK_DEVICE_MODE: + usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_DOCK_DEVICE_MODE; + usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_DOCK; + break; default: usbDataStatus |= UsbPortStatus.DATA_STATUS_UNKNOWN; }