From 9c80283f831e77602af4dcfc2fbc4f21dd3a07a0 Mon Sep 17 00:00:00 2001 From: Badhri Jagan Sridharan Date: Mon, 24 Jan 2022 19:25:06 -0800 Subject: [PATCH] Convert @UsbDataStatus into bit field flags. getUsbDataStatus now returns bit field values of @UsbDataStatus. Also renaming from USB_DATA_STATUS_* to DATA_STATUS_* based on review comments. Bug: 216640242 Signed-off-by: Badhri Jagan Sridharan Change-Id: I96ade3dd7041a4094e57907069a872909a62e72f --- core/api/system-current.txt | 18 +- core/java/android/hardware/usb/UsbPort.java | 82 +++---- .../android/hardware/usb/UsbPortStatus.java | 204 ++++++++++++++---- .../com/android/internal/usb/DumpUtils.java | 2 +- .../android/server/usb/UsbPortManager.java | 48 ++--- .../server/usb/hal/port/RawPortInfo.java | 27 ++- .../server/usb/hal/port/UsbPortAidl.java | 70 +++++- .../server/usb/hal/port/UsbPortHidl.java | 14 +- 8 files changed, 313 insertions(+), 152 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index b1f0b54b06b59..31050e5b54fd6 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -5318,9 +5318,9 @@ package android.hardware.usb { method public int getCurrentDataRole(); method public int getCurrentMode(); method public int getCurrentPowerRole(); - method public int getPowerBrickStatus(); + method public int getPowerBrickConnectionStatus(); method public int getSupportedRoleCombinations(); - method @Nullable public int[] getUsbDataStatus(); + method public int getUsbDataStatus(); method public boolean isConnected(); method public boolean isPowerTransferLimited(); method public boolean isRoleCombinationSupported(int, int); @@ -5329,6 +5329,13 @@ package android.hardware.usb { field public static final int DATA_ROLE_DEVICE = 2; // 0x2 field public static final int DATA_ROLE_HOST = 1; // 0x1 field public static final int DATA_ROLE_NONE = 0; // 0x0 + 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_FORCE = 16; // 0x10 + field public static final int DATA_STATUS_DISABLED_OVERHEAT = 2; // 0x2 + field public static final int DATA_STATUS_ENABLED = 1; // 0x1 + field public static final int DATA_STATUS_UNKNOWN = 0; // 0x0 field public static final int MODE_AUDIO_ACCESSORY = 4; // 0x4 field public static final int MODE_DEBUG_ACCESSORY = 8; // 0x8 field public static final int MODE_DFP = 2; // 0x2 @@ -5340,13 +5347,6 @@ package android.hardware.usb { field public static final int POWER_ROLE_NONE = 0; // 0x0 field public static final int POWER_ROLE_SINK = 2; // 0x2 field public static final int POWER_ROLE_SOURCE = 1; // 0x1 - field public static final int USB_DATA_STATUS_DISABLED_CONTAMINANT = 3; // 0x3 - field public static final int USB_DATA_STATUS_DISABLED_DEBUG = 6; // 0x6 - field public static final int USB_DATA_STATUS_DISABLED_DOCK = 4; // 0x4 - field public static final int USB_DATA_STATUS_DISABLED_FORCE = 5; // 0x5 - field public static final int USB_DATA_STATUS_DISABLED_OVERHEAT = 2; // 0x2 - field public static final int USB_DATA_STATUS_ENABLED = 1; // 0x1 - field public static final int USB_DATA_STATUS_UNKNOWN = 0; // 0x0 } } diff --git a/core/java/android/hardware/usb/UsbPort.java b/core/java/android/hardware/usb/UsbPort.java index a9797250898ff..7b695e79018c4 100644 --- a/core/java/android/hardware/usb/UsbPort.java +++ b/core/java/android/hardware/usb/UsbPort.java @@ -39,13 +39,13 @@ import static android.hardware.usb.UsbPortStatus.POWER_BRICK_STATUS_CONNECTED; import static android.hardware.usb.UsbPortStatus.POWER_ROLE_NONE; import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SINK; import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SOURCE; -import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_UNKNOWN; -import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_ENABLED; -import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_DISABLED_OVERHEAT; -import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_DISABLED_CONTAMINANT; -import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_DISABLED_DOCK; -import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_DISABLED_FORCE; -import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_DISABLED_DEBUG; +import static android.hardware.usb.UsbPortStatus.DATA_STATUS_UNKNOWN; +import static android.hardware.usb.UsbPortStatus.DATA_STATUS_ENABLED; +import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_OVERHEAT; +import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_CONTAMINANT; +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 android.Manifest; import android.annotation.CheckResult; @@ -400,7 +400,7 @@ public final class UsbPort { } /** - * Enables Usb data when disabled due to {@link UsbPort#USB_DATA_STATUS_DISABLED_DOCK} + * Enables Usb data when disabled due to {@link UsbPort#DATA_STATUS_DISABLED_DOCK} * * @return {@link #ENABLE_USB_DATA_WHILE_DOCKED_SUCCESS} when request completes successfully or * {@link #ENABLE_USB_DATA_WHILE_DOCKED_ERROR_INTERNAL} when request fails due to @@ -421,7 +421,8 @@ public final class UsbPort { + " callingUid:" + Binder.getCallingUid()); UsbPortStatus portStatus = getStatus(); if (portStatus != null && - !usbDataStatusToString(portStatus.getUsbDataStatus()).contains("disabled-dock")) { + (portStatus.getUsbDataStatus() & DATA_STATUS_DISABLED_DOCK) != + DATA_STATUS_DISABLED_DOCK) { return ENABLE_USB_DATA_WHILE_DOCKED_ERROR_DATA_ENABLED; } @@ -584,44 +585,43 @@ public final class UsbPort { /** @hide */ public static String usbDataStatusToString(int usbDataStatus) { - switch (usbDataStatus) { - case USB_DATA_STATUS_UNKNOWN: - return "unknown"; - case USB_DATA_STATUS_ENABLED: - return "enabled"; - case USB_DATA_STATUS_DISABLED_OVERHEAT: - return "disabled-overheat"; - case USB_DATA_STATUS_DISABLED_CONTAMINANT: - return "disabled-contaminant"; - case USB_DATA_STATUS_DISABLED_DOCK: - return "disabled-dock"; - case USB_DATA_STATUS_DISABLED_FORCE: - return "disabled-force"; - case USB_DATA_STATUS_DISABLED_DEBUG: - return "disabled-debug"; - default: - return Integer.toString(usbDataStatus); - } - } + StringBuilder statusString = new StringBuilder(); - /** @hide */ - public static String usbDataStatusToString(int[] usbDataStatus) { - StringBuilder modeString = new StringBuilder(); - if (usbDataStatus == null) { + if (usbDataStatus == DATA_STATUS_UNKNOWN) { return "unknown"; } - for (int i = 0; i < usbDataStatus.length; i++) { - modeString.append(usbDataStatusToString(usbDataStatus[i])); - if (i < usbDataStatus.length - 1) { - modeString.append(", "); - } + + if ((usbDataStatus & DATA_STATUS_ENABLED) == DATA_STATUS_ENABLED) { + return "enabled"; } - return modeString.toString(); + + if ((usbDataStatus & DATA_STATUS_DISABLED_OVERHEAT) == DATA_STATUS_DISABLED_OVERHEAT) { + statusString.append("disabled-overheat, "); + } + + if ((usbDataStatus & DATA_STATUS_DISABLED_CONTAMINANT) + == DATA_STATUS_DISABLED_CONTAMINANT) { + statusString.append("disabled-contaminant, "); + } + + if ((usbDataStatus & DATA_STATUS_DISABLED_DOCK) == DATA_STATUS_DISABLED_DOCK) { + statusString.append("disabled-dock, "); + } + + if ((usbDataStatus & DATA_STATUS_DISABLED_FORCE) == DATA_STATUS_DISABLED_FORCE) { + statusString.append("disabled-force, "); + } + + if ((usbDataStatus & DATA_STATUS_DISABLED_DEBUG) == DATA_STATUS_DISABLED_DEBUG) { + statusString.append("disabled-debug, "); + } + + return statusString.toString().replaceAll(", $", ""); } /** @hide */ - public static String powerBrickStatusToString(int powerBrickStatus) { - switch (powerBrickStatus) { + public static String powerBrickConnectionStatusToString(int powerBrickConnectionStatus) { + switch (powerBrickConnectionStatus) { case POWER_BRICK_STATUS_UNKNOWN: return "unknown"; case POWER_BRICK_STATUS_CONNECTED: @@ -629,7 +629,7 @@ public final class UsbPort { case POWER_BRICK_STATUS_DISCONNECTED: return "disconnected"; default: - return Integer.toString(powerBrickStatus); + return Integer.toString(powerBrickConnectionStatus); } } diff --git a/core/java/android/hardware/usb/UsbPortStatus.java b/core/java/android/hardware/usb/UsbPortStatus.java index d1f424667d730..3221ec8577acd 100644 --- a/core/java/android/hardware/usb/UsbPortStatus.java +++ b/core/java/android/hardware/usb/UsbPortStatus.java @@ -44,8 +44,8 @@ public final class UsbPortStatus implements Parcelable { private final @ContaminantProtectionStatus int mContaminantProtectionStatus; private final @ContaminantDetectionStatus int mContaminantDetectionStatus; private final boolean mPowerTransferLimited; - private final @UsbDataStatus int[] mUsbDataStatus; - private final @PowerBrickStatus int mPowerBrickStatus; + private final @UsbDataStatus int mUsbDataStatus; + private final @PowerBrickConnectionStatus int mPowerBrickConnectionStatus; /** * Power role: This USB port does not have a power role. @@ -198,38 +198,38 @@ public final class UsbPortStatus implements Parcelable { /** * USB data status is not known. */ - public static final int USB_DATA_STATUS_UNKNOWN = 0; + public static final int DATA_STATUS_UNKNOWN = 0; /** * USB data is enabled. */ - public static final int USB_DATA_STATUS_ENABLED = 1; + public static final int DATA_STATUS_ENABLED = 1 << 0; /** * USB data is disabled as the port is too hot. */ - public static final int USB_DATA_STATUS_DISABLED_OVERHEAT = 2; + public static final int DATA_STATUS_DISABLED_OVERHEAT = 1 << 1; /** * USB data is disabled due to contaminated port. */ - public static final int USB_DATA_STATUS_DISABLED_CONTAMINANT = 3; + public static final int DATA_STATUS_DISABLED_CONTAMINANT = 1 << 2; /** * USB data is disabled due to docking event. */ - public static final int USB_DATA_STATUS_DISABLED_DOCK = 4; + public static final int DATA_STATUS_DISABLED_DOCK = 1 << 3; /** * USB data is disabled by * {@link UsbPort#enableUsbData UsbPort.enableUsbData}. */ - public static final int USB_DATA_STATUS_DISABLED_FORCE = 5; + public static final int DATA_STATUS_DISABLED_FORCE = 1 << 4; /** * USB data is disabled for debug. */ - public static final int USB_DATA_STATUS_DISABLED_DEBUG = 6; + public static final int DATA_STATUS_DISABLED_DEBUG = 1 << 5; /** * Unknown whether a power brick is connected. @@ -276,14 +276,14 @@ public final class UsbPortStatus implements Parcelable { @interface UsbPortMode{} /** @hide */ - @IntDef(prefix = { "USB_DATA_STATUS_" }, value = { - USB_DATA_STATUS_UNKNOWN, - USB_DATA_STATUS_ENABLED, - USB_DATA_STATUS_DISABLED_OVERHEAT, - USB_DATA_STATUS_DISABLED_CONTAMINANT, - USB_DATA_STATUS_DISABLED_DOCK, - USB_DATA_STATUS_DISABLED_FORCE, - USB_DATA_STATUS_DISABLED_DEBUG + @IntDef(prefix = { "DATA_STATUS_" }, flag = true, value = { + DATA_STATUS_UNKNOWN, + DATA_STATUS_ENABLED, + DATA_STATUS_DISABLED_OVERHEAT, + DATA_STATUS_DISABLED_CONTAMINANT, + DATA_STATUS_DISABLED_DOCK, + DATA_STATUS_DISABLED_FORCE, + DATA_STATUS_DISABLED_DEBUG }) @Retention(RetentionPolicy.SOURCE) @interface UsbDataStatus{} @@ -295,13 +295,14 @@ public final class UsbPortStatus implements Parcelable { POWER_BRICK_STATUS_CONNECTED, }) @Retention(RetentionPolicy.SOURCE) - @interface PowerBrickStatus{} + @interface PowerBrickConnectionStatus{} /** @hide */ public UsbPortStatus(int currentMode, int currentPowerRole, int currentDataRole, int supportedRoleCombinations, int contaminantProtectionStatus, - int contaminantDetectionStatus, @UsbDataStatus int[] usbDataStatus, - boolean powerTransferLimited, @PowerBrickStatus int powerBrickStatus) { + int contaminantDetectionStatus, @UsbDataStatus int usbDataStatus, + boolean powerTransferLimited, + @PowerBrickConnectionStatus int powerBrickConnectionStatus) { mCurrentMode = currentMode; mCurrentPowerRole = currentPowerRole; mCurrentDataRole = currentDataRole; @@ -310,7 +311,7 @@ public final class UsbPortStatus implements Parcelable { mContaminantDetectionStatus = contaminantDetectionStatus; mUsbDataStatus = usbDataStatus; mPowerTransferLimited = powerTransferLimited; - mPowerBrickStatus = powerBrickStatus; + mPowerBrickConnectionStatus = powerBrickConnectionStatus; } /** @hide */ @@ -323,8 +324,8 @@ public final class UsbPortStatus implements Parcelable { mSupportedRoleCombinations = supportedRoleCombinations; mContaminantProtectionStatus = contaminantProtectionStatus; mContaminantDetectionStatus = contaminantDetectionStatus; - mUsbDataStatus = new int[]{USB_DATA_STATUS_UNKNOWN}; - mPowerBrickStatus = POWER_BRICK_STATUS_UNKNOWN; + mUsbDataStatus = DATA_STATUS_UNKNOWN; + mPowerBrickConnectionStatus = POWER_BRICK_STATUS_UNKNOWN; mPowerTransferLimited = false; } @@ -411,13 +412,13 @@ public final class UsbPortStatus implements Parcelable { /** * Returns UsbData status. * - * @return Current USB data status of the port: {@link #USB_DATA_STATUS_UNKNOWN} - * or {@link #USB_DATA_STATUS_ENABLED} or {@link #USB_DATA_STATUS_DIASBLED_OVERHEAT} - * or {@link #USB_DATA_STATUS_DISABLED_CONTAMINANT} - * or {@link #USB_DATA_STATUS_DISABLED_DOCK} or {@link #USB_DATA_STATUS_DISABLED_FORCE} - * or {@link #USB_DATA_STATUS_DISABLED_DEBUG} + * @return Current USB data status of the port with one or more of the following values + * {@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} */ - public @UsbDataStatus @Nullable int[] getUsbDataStatus() { + public @UsbDataStatus int getUsbDataStatus() { return mUsbDataStatus; } @@ -432,14 +433,14 @@ public final class UsbPortStatus implements Parcelable { } /** - * Let's the caller know if a power brick is connected to the USB port. + * Returns the connection status of the power brick. * * @return {@link #POWER_BRICK_STATUS_UNKNOWN} * or {@link #POWER_BRICK_STATUS_CONNECTED} * or {@link #POWER_BRICK_STATUS_DISCONNECTED} */ - public @PowerBrickStatus int getPowerBrickStatus() { - return mPowerBrickStatus; + public @PowerBrickConnectionStatus int getPowerBrickConnectionStatus() { + return mPowerBrickConnectionStatus; } @NonNull @@ -459,8 +460,9 @@ public final class UsbPortStatus implements Parcelable { + UsbPort.usbDataStatusToString(getUsbDataStatus()) + ", isPowerTransferLimited=" + isPowerTransferLimited() - +", powerBrickStatus=" - + UsbPort.powerBrickStatusToString(getPowerBrickStatus()) + +", powerBrickConnectionStatus=" + + UsbPort + .powerBrickConnectionStatusToString(getPowerBrickConnectionStatus()) + "}"; } @@ -477,10 +479,9 @@ public final class UsbPortStatus implements Parcelable { dest.writeInt(mSupportedRoleCombinations); dest.writeInt(mContaminantProtectionStatus); dest.writeInt(mContaminantDetectionStatus); - dest.writeInt(mUsbDataStatus.length); - dest.writeIntArray(mUsbDataStatus); + dest.writeInt(mUsbDataStatus); dest.writeBoolean(mPowerTransferLimited); - dest.writeInt(mPowerBrickStatus); + dest.writeInt(mPowerBrickConnectionStatus); } public static final @NonNull Parcelable.Creator CREATOR = @@ -493,14 +494,13 @@ public final class UsbPortStatus implements Parcelable { int supportedRoleCombinations = in.readInt(); int contaminantProtectionStatus = in.readInt(); int contaminantDetectionStatus = in.readInt(); - int[] usbDataStatus = new int[in.readInt()]; - in.readIntArray(usbDataStatus); + int usbDataStatus = in.readInt(); boolean powerTransferLimited = in.readBoolean(); - int powerBrickStatus = in.readInt(); + int powerBrickConnectionStatus = in.readInt(); return new UsbPortStatus(currentMode, currentPowerRole, currentDataRole, supportedRoleCombinations, contaminantProtectionStatus, contaminantDetectionStatus, usbDataStatus, powerTransferLimited, - powerBrickStatus); + powerBrickConnectionStatus); } @Override @@ -508,4 +508,126 @@ public final class UsbPortStatus implements Parcelable { return new UsbPortStatus[size]; } }; + + /** + * Builder is used to create {@link UsbPortStatus} objects. + * + * @hide + */ + public static final class Builder { + private @UsbPortMode int mCurrentMode; + private @UsbPowerRole int mCurrentPowerRole; + private @UsbDataRole int mCurrentDataRole; + private int mSupportedRoleCombinations; + private @ContaminantProtectionStatus int mContaminantProtectionStatus; + private @ContaminantDetectionStatus int mContaminantDetectionStatus; + private boolean mPowerTransferLimited; + private @UsbDataStatus int mUsbDataStatus; + private @PowerBrickConnectionStatus int mPowerBrickConnectionStatus; + + public Builder() { + mCurrentMode = MODE_NONE; + mCurrentPowerRole = POWER_ROLE_NONE; + mCurrentDataRole = DATA_ROLE_NONE; + mContaminantProtectionStatus = CONTAMINANT_PROTECTION_NONE; + mContaminantDetectionStatus = CONTAMINANT_DETECTION_NOT_SUPPORTED; + mUsbDataStatus = DATA_STATUS_UNKNOWN; + mPowerBrickConnectionStatus = POWER_BRICK_STATUS_UNKNOWN; + } + + /** + * Sets the current mode of {@link UsbPortStatus} + * + * @return Instance of {@link Builder} + */ + @NonNull + public Builder setCurrentMode(@UsbPortMode int currentMode) { + mCurrentMode = currentMode; + return this; + } + + /** + * Sets the current power role and data role of {@link UsbPortStatus} + * + * @return Instance of {@link Builder} + */ + @NonNull + public Builder setCurrentRoles(@UsbPowerRole int currentPowerRole, + @UsbDataRole int currentDataRole) { + mCurrentPowerRole = currentPowerRole; + mCurrentDataRole = currentDataRole; + return this; + } + + /** + * Sets supported role combinations of {@link UsbPortStatus} + * + * @return Instance of {@link Builder} + */ + @NonNull + public Builder setSupportedRoleCombinations(int supportedRoleCombinations) { + mSupportedRoleCombinations = supportedRoleCombinations; + return this; + } + + /** + * Sets current contaminant status of {@link UsbPortStatus} + * + * @return Instance of {@link Builder} + */ + @NonNull + public Builder setContaminantStatus( + @ContaminantProtectionStatus int contaminantProtectionStatus, + @ContaminantDetectionStatus int contaminantDetectionStatus) { + mContaminantProtectionStatus = contaminantProtectionStatus; + mContaminantDetectionStatus = contaminantDetectionStatus; + return this; + } + + /** + * Sets power limit power transfer of {@link UsbPortStatus} + * + * @return Instance of {@link Builder} + */ + @NonNull + public Builder setPowerTransferLimited(boolean powerTransferLimited) { + mPowerTransferLimited = powerTransferLimited; + return this; + } + + /** + * Sets the USB data status of {@link UsbPortStatus} + * + * @return Instance of {@link Builder} + */ + @NonNull + public Builder setUsbDataStatus(@UsbDataStatus int usbDataStatus) { + mUsbDataStatus = usbDataStatus; + return this; + } + + /** + * Sets the power brick connection status of {@link UsbPortStatus} + * + * @return Instance of {@link Builder} + */ + @NonNull + public Builder setPowerBrickConnectionStatus( + @PowerBrickConnectionStatus int powerBrickConnectionStatus) { + mPowerBrickConnectionStatus = powerBrickConnectionStatus; + return this; + } + + /** + * Creates the {@link UsbPortStatus} object. + */ + @NonNull + public UsbPortStatus build() { + UsbPortStatus status = new UsbPortStatus(mCurrentMode, mCurrentPowerRole, + mCurrentDataRole, mSupportedRoleCombinations, mContaminantProtectionStatus, + mContaminantDetectionStatus, mUsbDataStatus, mPowerTransferLimited, + mPowerBrickConnectionStatus); + return status; + } + }; } diff --git a/core/java/com/android/internal/usb/DumpUtils.java b/core/java/com/android/internal/usb/DumpUtils.java index b32a6b078884f..1eb446eff1711 100644 --- a/core/java/com/android/internal/usb/DumpUtils.java +++ b/core/java/com/android/internal/usb/DumpUtils.java @@ -249,7 +249,7 @@ public class DumpUtils { dump.write("is_power_transfer_limited", UsbPortStatusProto.IS_POWER_TRANSFER_LIMITED, status.isPowerTransferLimited()); dump.write("usb_power_brick_status", UsbPortStatusProto.USB_POWER_BRICK_STATUS, - UsbPort.powerBrickStatusToString(status.getPowerBrickStatus())); + UsbPort.powerBrickConnectionStatusToString(status.getPowerBrickConnectionStatus())); dump.end(token); } } diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java index d0825ba3b6202..f07a4061d7173 100644 --- a/services/usb/java/com/android/server/usb/UsbPortManager.java +++ b/services/usb/java/com/android/server/usb/UsbPortManager.java @@ -384,7 +384,7 @@ public class UsbPortManager { } /** - * Enables USB data when disabled due to {@link UsbPortStatus#USB_DATA_STATUS_DISABLED_DOCK} + * Enables USB data when disabled due to {@link UsbPortStatus#DATA_STATUS_DISABLED_DOCK} */ public void enableUsbDataWhileDocked(@NonNull String portId, long transactionId, IUsbOperationInternal callback, IndentingPrintWriter pw) { @@ -844,7 +844,7 @@ public class UsbPortManager { portInfo.contaminantDetectionStatus, portInfo.usbDataStatus, portInfo.powerTransferLimited, - portInfo.powerBrickStatus, pw); + portInfo.powerBrickConnectionStatus, pw); } } else { for (RawPortInfo currentPortInfo : newPortInfo) { @@ -859,7 +859,7 @@ public class UsbPortManager { currentPortInfo.contaminantDetectionStatus, currentPortInfo.usbDataStatus, currentPortInfo.powerTransferLimited, - currentPortInfo.powerBrickStatus, pw); + currentPortInfo.powerBrickConnectionStatus, pw); } } @@ -895,9 +895,9 @@ public class UsbPortManager { int contaminantProtectionStatus, boolean supportsEnableContaminantPresenceDetection, int contaminantDetectionStatus, - int[] usbDataStatus, + int usbDataStatus, boolean powerTransferLimited, - int powerBrickStatus, + int powerBrickConnectionStatus, IndentingPrintWriter pw) { // Only allow mode switch capability for dual role ports. // Validate that the current mode matches the supported modes we expect. @@ -957,7 +957,7 @@ public class UsbPortManager { currentDataRole, canChangeDataRole, supportedRoleCombinations, contaminantProtectionStatus, contaminantDetectionStatus, usbDataStatus, - powerTransferLimited, powerBrickStatus); + powerTransferLimited, powerBrickConnectionStatus); mPorts.put(portId, portInfo); } else { // Validate that ports aren't changing definition out from under us. @@ -995,7 +995,7 @@ public class UsbPortManager { currentDataRole, canChangeDataRole, supportedRoleCombinations, contaminantProtectionStatus, contaminantDetectionStatus, usbDataStatus, - powerTransferLimited, powerBrickStatus)) { + powerTransferLimited, powerBrickConnectionStatus)) { portInfo.mDisposition = PortInfo.DISPOSITION_CHANGED; } else { portInfo.mDisposition = PortInfo.DISPOSITION_READY; @@ -1222,7 +1222,7 @@ public class UsbPortManager { mUsbPortStatus = new UsbPortStatus(currentMode, currentPowerRole, currentDataRole, supportedRoleCombinations, UsbPortStatus.CONTAMINANT_PROTECTION_NONE, UsbPortStatus.CONTAMINANT_DETECTION_NOT_SUPPORTED, - new int[]{UsbPortStatus.USB_DATA_STATUS_UNKNOWN}, false, + UsbPortStatus.DATA_STATUS_UNKNOWN, false, UsbPortStatus.POWER_BRICK_STATUS_UNKNOWN); dispositionChanged = true; } @@ -1238,31 +1238,12 @@ public class UsbPortManager { return dispositionChanged; } - private boolean dataStatusEquals(int[] dataStatusL, int[] dataStatusR) { - if (dataStatusL == null && dataStatusR == null) { - return true; - } - if ((dataStatusL == null && dataStatusR != null) - || (dataStatusL != null && dataStatusR == null)) { - return false; - } - if (dataStatusL.length != dataStatusR.length) { - return false; - } - for (int i = 0; i < dataStatusL.length; i++) { - if (dataStatusL[i] != dataStatusR[i]) { - return false; - } - } - return true; - } - public boolean setStatus(int currentMode, boolean canChangeMode, int currentPowerRole, boolean canChangePowerRole, int currentDataRole, boolean canChangeDataRole, int supportedRoleCombinations, int contaminantProtectionStatus, - int contaminantDetectionStatus, int[] usbDataStatus, - boolean powerTransferLimited, int powerBrickStatus) { + int contaminantDetectionStatus, int usbDataStatus, + boolean powerTransferLimited, int powerBrickConnectionStatus) { boolean dispositionChanged = false; mCanChangeMode = canChangeMode; @@ -1278,15 +1259,16 @@ public class UsbPortManager { != contaminantProtectionStatus || mUsbPortStatus.getContaminantDetectionStatus() != contaminantDetectionStatus - || !dataStatusEquals(mUsbPortStatus.getUsbDataStatus(), usbDataStatus) + || mUsbPortStatus.getUsbDataStatus() + != usbDataStatus || mUsbPortStatus.isPowerTransferLimited() != powerTransferLimited - || mUsbPortStatus.getPowerBrickStatus() - != powerBrickStatus) { + || mUsbPortStatus.getPowerBrickConnectionStatus() + != powerBrickConnectionStatus) { mUsbPortStatus = new UsbPortStatus(currentMode, currentPowerRole, currentDataRole, supportedRoleCombinations, contaminantProtectionStatus, contaminantDetectionStatus, usbDataStatus, - powerTransferLimited, powerBrickStatus); + powerTransferLimited, powerBrickConnectionStatus); dispositionChanged = true; } diff --git a/services/usb/java/com/android/server/usb/hal/port/RawPortInfo.java b/services/usb/java/com/android/server/usb/hal/port/RawPortInfo.java index dd256205c220e..128a0512e8304 100644 --- a/services/usb/java/com/android/server/usb/hal/port/RawPortInfo.java +++ b/services/usb/java/com/android/server/usb/hal/port/RawPortInfo.java @@ -37,9 +37,9 @@ public final class RawPortInfo implements Parcelable { public int contaminantProtectionStatus; public boolean supportsEnableContaminantPresenceDetection; public int contaminantDetectionStatus; - public int[] usbDataStatus; + public int usbDataStatus; public boolean powerTransferLimited; - public int powerBrickStatus; + public int powerBrickConnectionStatus; public RawPortInfo(String portId, int supportedModes) { this.portId = portId; @@ -49,9 +49,10 @@ public final class RawPortInfo implements Parcelable { this.contaminantProtectionStatus = UsbPortStatus.CONTAMINANT_PROTECTION_NONE; this.supportsEnableContaminantPresenceDetection = false; this.contaminantDetectionStatus = UsbPortStatus.CONTAMINANT_DETECTION_NOT_SUPPORTED; - this.usbDataStatus[0] = UsbPortStatus.USB_DATA_STATUS_UNKNOWN; + this.usbDataStatus = UsbPortStatus.DATA_STATUS_UNKNOWN; + this.powerTransferLimited = false; - this.powerBrickStatus = UsbPortStatus.POWER_BRICK_STATUS_UNKNOWN; + this.powerBrickConnectionStatus = UsbPortStatus.POWER_BRICK_STATUS_UNKNOWN; } public RawPortInfo(String portId, int supportedModes, int supportedContaminantProtectionModes, @@ -62,9 +63,9 @@ public final class RawPortInfo implements Parcelable { int contaminantProtectionStatus, boolean supportsEnableContaminantPresenceDetection, int contaminantDetectionStatus, - int[] usbDataStatus, + int usbDataStatus, boolean powerTransferLimited, - int powerBrickStatus) { + int powerBrickConnectionStatus) { this.portId = portId; this.supportedModes = supportedModes; this.supportedContaminantProtectionModes = supportedContaminantProtectionModes; @@ -82,7 +83,7 @@ public final class RawPortInfo implements Parcelable { this.contaminantDetectionStatus = contaminantDetectionStatus; this.usbDataStatus = usbDataStatus; this.powerTransferLimited = powerTransferLimited; - this.powerBrickStatus = powerBrickStatus; + this.powerBrickConnectionStatus = powerBrickConnectionStatus; } @Override @@ -105,10 +106,9 @@ public final class RawPortInfo implements Parcelable { dest.writeInt(contaminantProtectionStatus); dest.writeBoolean(supportsEnableContaminantPresenceDetection); dest.writeInt(contaminantDetectionStatus); - dest.writeInt(usbDataStatus.length); - dest.writeIntArray(usbDataStatus); + dest.writeInt(usbDataStatus); dest.writeBoolean(powerTransferLimited); - dest.writeInt(powerBrickStatus); + dest.writeInt(powerBrickConnectionStatus); } public static final Parcelable.Creator CREATOR = @@ -128,10 +128,9 @@ public final class RawPortInfo implements Parcelable { int contaminantProtectionStatus = in.readInt(); boolean supportsEnableContaminantPresenceDetection = in.readBoolean(); int contaminantDetectionStatus = in.readInt(); - int[] usbDataStatus = new int[in.readInt()]; - in.readIntArray(usbDataStatus); + int usbDataStatus = in.readInt(); boolean powerTransferLimited = in.readBoolean(); - int powerBrickStatus = in.readInt(); + int powerBrickConnectionStatus = in.readInt(); return new RawPortInfo(id, supportedModes, supportedContaminantProtectionModes, currentMode, canChangeMode, currentPowerRole, canChangePowerRole, @@ -140,7 +139,7 @@ public final class RawPortInfo implements Parcelable { contaminantProtectionStatus, supportsEnableContaminantPresenceDetection, contaminantDetectionStatus, usbDataStatus, - powerTransferLimited, powerBrickStatus); + powerTransferLimited, powerBrickConnectionStatus); } @Override 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 f468db353ccd4..1db018edf7764 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 @@ -73,6 +73,42 @@ public final class UsbPortAidl implements UsbPortHal { private boolean mSystemReady; private long mTransactionId; + /** + * USB data status is not known. + */ + public static final int USB_DATA_STATUS_UNKNOWN = 0; + + /** + * USB data is enabled. + */ + public static final int 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; + + /** + * USB data is disabled due to contaminated port. + */ + public static final int USB_DATA_STATUS_DISABLED_CONTAMINANT = 3; + + /** + * USB data is disabled due to docking event. + */ + public static final int 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; + + /** + * USB data is disabled for debug. + */ + public static final int USB_DATA_STATUS_DISABLED_DEBUG = 6; + public @UsbHalVersion int getUsbHalVersion() throws RemoteException { synchronized (mLock) { if (mProxy == null) { @@ -489,12 +525,34 @@ public final class UsbPortAidl implements UsbPortHal { return supportedContaminantProtectionModes; } - private int[] toIntArray(byte[] input) { - int[] output = new int[input.length]; - for (int i = 0; i < input.length; i++) { - output[i] = input[i]; + private int toUsbDataStatusInt(byte[] usbDataStatusHal) { + int usbDataStatus = UsbPortStatus.DATA_STATUS_UNKNOWN; + for (int i = 0; i < usbDataStatusHal.length; i++) { + switch (usbDataStatusHal[i]) { + case USB_DATA_STATUS_ENABLED: + usbDataStatus |= UsbPortStatus.DATA_STATUS_ENABLED; + break; + case USB_DATA_STATUS_DISABLED_OVERHEAT: + usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_OVERHEAT; + break; + case USB_DATA_STATUS_DISABLED_CONTAMINANT: + usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_CONTAMINANT; + break; + case USB_DATA_STATUS_DISABLED_DOCK: + usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_DOCK; + break; + case USB_DATA_STATUS_DISABLED_FORCE: + usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_FORCE; + break; + case USB_DATA_STATUS_DISABLED_DEBUG: + usbDataStatus |= UsbPortStatus.DATA_STATUS_DISABLED_DEBUG; + break; + default: + usbDataStatus |= UsbPortStatus.DATA_STATUS_UNKNOWN; + } } - return output; + UsbPortManager.logAndPrint(Log.INFO, mPw, "AIDL UsbDataStatus:" + usbDataStatus); + return usbDataStatus; } @Override @@ -528,7 +586,7 @@ public final class UsbPortAidl implements UsbPortHal { toContaminantProtectionStatus(current.contaminantProtectionStatus), current.supportsEnableContaminantPresenceDetection, current.contaminantDetectionStatus, - toIntArray(current.usbDataStatus), + toUsbDataStatusInt(current.usbDataStatus), current.powerTransferLimited, current.powerBrickStatus); newPortInfo.add(temp); diff --git a/services/usb/java/com/android/server/usb/hal/port/UsbPortHidl.java b/services/usb/java/com/android/server/usb/hal/port/UsbPortHidl.java index 64e8adc597c69..c7f077564fd17 100644 --- a/services/usb/java/com/android/server/usb/hal/port/UsbPortHidl.java +++ b/services/usb/java/com/android/server/usb/hal/port/UsbPortHidl.java @@ -33,8 +33,8 @@ import static android.hardware.usb.UsbPortStatus.MODE_UFP; import static android.hardware.usb.UsbPortStatus.POWER_BRICK_STATUS_UNKNOWN; import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SINK; import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SOURCE; -import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_DISABLED_FORCE; -import static android.hardware.usb.UsbPortStatus.USB_DATA_STATUS_UNKNOWN; +import static android.hardware.usb.UsbPortStatus.DATA_STATUS_DISABLED_FORCE; +import static android.hardware.usb.UsbPortStatus.DATA_STATUS_UNKNOWN; import static com.android.server.usb.UsbPortManager.logAndPrint; @@ -85,7 +85,7 @@ public final class UsbPortHidl implements UsbPortHal { private HALCallback mHALCallback; private boolean mSystemReady; // Workaround since HIDL HAL versions report UsbDataEnabled status in UsbPortStatus; - private static int sUsbDataStatus = USB_DATA_STATUS_UNKNOWN; + private static int sUsbDataStatus = DATA_STATUS_UNKNOWN; public @UsbHalVersion int getUsbHalVersion() throws RemoteException { int version; @@ -375,7 +375,7 @@ public final class UsbPortHidl implements UsbPortHal { } } if (success) { - sUsbDataStatus = enable ? USB_DATA_STATUS_UNKNOWN : USB_DATA_STATUS_DISABLED_FORCE; + sUsbDataStatus = enable ? DATA_STATUS_UNKNOWN : DATA_STATUS_DISABLED_FORCE; } try { callback.onOperationComplete(success @@ -421,7 +421,7 @@ public final class UsbPortHidl implements UsbPortHal { current.canChangePowerRole, current.currentDataRole, current.canChangeDataRole, false, CONTAMINANT_PROTECTION_NONE, - false, CONTAMINANT_DETECTION_NOT_SUPPORTED, new int[sUsbDataStatus], + false, CONTAMINANT_DETECTION_NOT_SUPPORTED, sUsbDataStatus, false, POWER_BRICK_STATUS_UNKNOWN); newPortInfo.add(temp); UsbPortManager.logAndPrint(Log.INFO, mPw, "ClientCallback V1_0: " @@ -455,7 +455,7 @@ public final class UsbPortHidl implements UsbPortHal { current.status.canChangePowerRole, current.status.currentDataRole, current.status.canChangeDataRole, false, CONTAMINANT_PROTECTION_NONE, - false, CONTAMINANT_DETECTION_NOT_SUPPORTED, new int[sUsbDataStatus], + false, CONTAMINANT_DETECTION_NOT_SUPPORTED, sUsbDataStatus, false, POWER_BRICK_STATUS_UNKNOWN); newPortInfo.add(temp); UsbPortManager.logAndPrint(Log.INFO, mPw, "ClientCallback V1_1: " @@ -493,7 +493,7 @@ public final class UsbPortHidl implements UsbPortHal { current.contaminantProtectionStatus, current.supportsEnableContaminantPresenceDetection, current.contaminantDetectionStatus, - new int[sUsbDataStatus], + sUsbDataStatus, false, POWER_BRICK_STATUS_UNKNOWN); newPortInfo.add(temp); UsbPortManager.logAndPrint(Log.INFO, mPw, "ClientCallback V1_2: "