Usb non-compliant port partner frameworks api
Adds supportsComplianceWarnings and getComplianceWarinings to support
querying non compliant USB port partner setups. COMPLIANCE_CHANGED
broadcast is broadcasted whenever a new port with non zero compliance
warnings list is added or when compliance warnings list changes for
an existing port.
Test: atest VtsAidlUsbTargetTest
atest CtsUsbManagerTestCases
Bug: 236322506
Bug: 253298114
Change-Id: I29fab5f0191bbeb61ed54efd14838078647dd9a6
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index ae6e58c..4d2388d 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -5442,6 +5442,7 @@
method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void setCurrentFunctions(long);
field @RequiresPermission(android.Manifest.permission.MANAGE_USB) public static final String ACTION_USB_ACCESSORY_HANDSHAKE = "android.hardware.usb.action.USB_ACCESSORY_HANDSHAKE";
field @RequiresPermission(android.Manifest.permission.MANAGE_USB) public static final String ACTION_USB_PORT_CHANGED = "android.hardware.usb.action.USB_PORT_CHANGED";
+ field @RequiresPermission(android.Manifest.permission.MANAGE_USB) public static final String ACTION_USB_PORT_COMPLIANCE_CHANGED = "android.hardware.usb.action.USB_PORT_COMPLIANCE_CHANGED";
field public static final String ACTION_USB_STATE = "android.hardware.usb.action.USB_STATE";
field public static final String EXTRA_ACCESSORY_HANDSHAKE_END = "android.hardware.usb.extra.ACCESSORY_HANDSHAKE_END";
field public static final String EXTRA_ACCESSORY_START = "android.hardware.usb.extra.ACCESSORY_START";
@@ -5469,6 +5470,7 @@
method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USB) public android.hardware.usb.UsbPortStatus getStatus();
method @CheckResult @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void resetUsbPort(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void setRoles(int, int);
+ method @CheckResult @RequiresPermission(android.Manifest.permission.MANAGE_USB) public boolean supportsComplianceWarnings();
field public static final int ENABLE_LIMIT_POWER_TRANSFER_ERROR_INTERNAL = 1; // 0x1
field public static final int ENABLE_LIMIT_POWER_TRANSFER_ERROR_NOT_SUPPORTED = 2; // 0x2
field public static final int ENABLE_LIMIT_POWER_TRANSFER_ERROR_OTHER = 4; // 0x4
@@ -5494,6 +5496,7 @@
public final class UsbPortStatus implements android.os.Parcelable {
method public int describeContents();
+ method @CheckResult @NonNull public int[] getComplianceWarnings();
method public int getCurrentDataRole();
method public int getCurrentMode();
method public int getCurrentPowerRole();
@@ -5504,6 +5507,10 @@
method public boolean isPowerTransferLimited();
method public boolean isRoleCombinationSupported(int, int);
method public void writeToParcel(android.os.Parcel, int);
+ field public static final int COMPLIANCE_WARNING_BC_1_2 = 3; // 0x3
+ field public static final int COMPLIANCE_WARNING_DEBUG_ACCESSORY = 2; // 0x2
+ field public static final int COMPLIANCE_WARNING_MISSING_RP = 4; // 0x4
+ field public static final int COMPLIANCE_WARNING_OTHER = 1; // 0x1
field @NonNull public static final android.os.Parcelable.Creator<android.hardware.usb.UsbPortStatus> CREATOR;
field public static final int DATA_ROLE_DEVICE = 2; // 0x2
field public static final int DATA_ROLE_HOST = 1; // 0x1
diff --git a/core/java/android/hardware/usb/ParcelableUsbPort.java b/core/java/android/hardware/usb/ParcelableUsbPort.java
index 19655ed..7fc282c 100644
--- a/core/java/android/hardware/usb/ParcelableUsbPort.java
+++ b/core/java/android/hardware/usb/ParcelableUsbPort.java
@@ -34,11 +34,13 @@
private final int mSupportedContaminantProtectionModes;
private final boolean mSupportsEnableContaminantPresenceProtection;
private final boolean mSupportsEnableContaminantPresenceDetection;
+ private final boolean mSupportsComplianceWarnings;
private ParcelableUsbPort(@NonNull String id, int supportedModes,
int supportedContaminantProtectionModes,
boolean supportsEnableContaminantPresenceProtection,
- boolean supportsEnableContaminantPresenceDetection) {
+ boolean supportsEnableContaminantPresenceDetection,
+ boolean supportsComplianceWarnings) {
mId = id;
mSupportedModes = supportedModes;
mSupportedContaminantProtectionModes = supportedContaminantProtectionModes;
@@ -46,6 +48,8 @@
supportsEnableContaminantPresenceProtection;
mSupportsEnableContaminantPresenceDetection =
supportsEnableContaminantPresenceDetection;
+ mSupportsComplianceWarnings =
+ supportsComplianceWarnings;
}
/**
@@ -59,7 +63,8 @@
return new ParcelableUsbPort(port.getId(), port.getSupportedModes(),
port.getSupportedContaminantProtectionModes(),
port.supportsEnableContaminantPresenceProtection(),
- port.supportsEnableContaminantPresenceDetection());
+ port.supportsEnableContaminantPresenceDetection(),
+ port.supportsComplianceWarnings());
}
/**
@@ -72,7 +77,8 @@
public @NonNull UsbPort getUsbPort(@NonNull UsbManager usbManager) {
return new UsbPort(usbManager, mId, mSupportedModes, mSupportedContaminantProtectionModes,
mSupportsEnableContaminantPresenceProtection,
- mSupportsEnableContaminantPresenceDetection);
+ mSupportsEnableContaminantPresenceDetection,
+ mSupportsComplianceWarnings);
}
@Override
@@ -87,6 +93,7 @@
dest.writeInt(mSupportedContaminantProtectionModes);
dest.writeBoolean(mSupportsEnableContaminantPresenceProtection);
dest.writeBoolean(mSupportsEnableContaminantPresenceDetection);
+ dest.writeBoolean(mSupportsComplianceWarnings);
}
public static final @android.annotation.NonNull Creator<ParcelableUsbPort> CREATOR =
@@ -98,11 +105,13 @@
int supportedContaminantProtectionModes = in.readInt();
boolean supportsEnableContaminantPresenceProtection = in.readBoolean();
boolean supportsEnableContaminantPresenceDetection = in.readBoolean();
+ boolean supportsComplianceWarnings = in.readBoolean();
return new ParcelableUsbPort(id, supportedModes,
supportedContaminantProtectionModes,
supportsEnableContaminantPresenceProtection,
- supportsEnableContaminantPresenceDetection);
+ supportsEnableContaminantPresenceDetection,
+ supportsComplianceWarnings);
}
@Override
diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java
index 2c38f70..da6d0da 100644
--- a/core/java/android/hardware/usb/UsbManager.java
+++ b/core/java/android/hardware/usb/UsbManager.java
@@ -113,6 +113,19 @@
public static final String ACTION_USB_PORT_CHANGED =
"android.hardware.usb.action.USB_PORT_CHANGED";
+ /**
+ * Broadcast Action: A broadcast for USB compliance warning changes.
+ *
+ * This intent is sent when a port partner's
+ * (USB power source/cable/accessory) compliance warnings change state.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(Manifest.permission.MANAGE_USB)
+ public static final String ACTION_USB_PORT_COMPLIANCE_CHANGED =
+ "android.hardware.usb.action.USB_PORT_COMPLIANCE_CHANGED";
+
/**
* Activity intent sent when user attaches a USB device.
*
diff --git a/core/java/android/hardware/usb/UsbPort.java b/core/java/android/hardware/usb/UsbPort.java
index 7c5a4c6..e0f9cad 100644
--- a/core/java/android/hardware/usb/UsbPort.java
+++ b/core/java/android/hardware/usb/UsbPort.java
@@ -46,6 +46,10 @@
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.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;
+import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_OTHER;
import android.Manifest;
import android.annotation.CallbackExecutor;
@@ -83,6 +87,7 @@
private final int mSupportedContaminantProtectionModes;
private final boolean mSupportsEnableContaminantPresenceProtection;
private final boolean mSupportsEnableContaminantPresenceDetection;
+ private final boolean mSupportsComplianceWarnings;
private static final int NUM_DATA_ROLES = Constants.PortDataRole.NUM_DATA_ROLES;
/**
@@ -250,6 +255,18 @@
int supportedContaminantProtectionModes,
boolean supportsEnableContaminantPresenceProtection,
boolean supportsEnableContaminantPresenceDetection) {
+ this(usbManager, id, supportedModes, supportedContaminantProtectionModes,
+ supportsEnableContaminantPresenceProtection,
+ supportsEnableContaminantPresenceDetection,
+ false);
+ }
+
+ /** @hide */
+ public UsbPort(@NonNull UsbManager usbManager, @NonNull String id, int supportedModes,
+ int supportedContaminantProtectionModes,
+ boolean supportsEnableContaminantPresenceProtection,
+ boolean supportsEnableContaminantPresenceDetection,
+ boolean supportsComplianceWarnings) {
Objects.requireNonNull(id);
Preconditions.checkFlagsArgument(supportedModes,
MODE_DFP | MODE_UFP | MODE_AUDIO_ACCESSORY | MODE_DEBUG_ACCESSORY);
@@ -262,6 +279,7 @@
supportsEnableContaminantPresenceProtection;
mSupportsEnableContaminantPresenceDetection =
supportsEnableContaminantPresenceDetection;
+ mSupportsComplianceWarnings = supportsComplianceWarnings;
}
/**
@@ -331,6 +349,21 @@
}
/**
+ * Queries USB Port to see if the port is capable of identifying
+ * non compliant USB power source/cable/accessory.
+ *
+ * @return true when the UsbPort is capable of identifying
+ * non compliant USB power
+ * source/cable/accessory.
+ * @return false otherwise.
+ */
+ @CheckResult
+ @RequiresPermission(Manifest.permission.MANAGE_USB)
+ public boolean supportsComplianceWarnings() {
+ return mSupportsComplianceWarnings;
+ }
+
+ /**
* Sets the desired role combination of the port.
* <p>
* The supported role combinations depend on what is connected to the port and may be
@@ -686,6 +719,37 @@
}
/** @hide */
+ public static String complianceWarningsToString(@NonNull int[] complianceWarnings) {
+ StringBuilder complianceWarningString = new StringBuilder();
+ complianceWarningString.append("[");
+
+ if (complianceWarnings != null) {
+ for (int warning : complianceWarnings) {
+ switch (warning) {
+ case UsbPortStatus.COMPLIANCE_WARNING_OTHER:
+ complianceWarningString.append("other, ");
+ break;
+ case UsbPortStatus.COMPLIANCE_WARNING_DEBUG_ACCESSORY:
+ complianceWarningString.append("debug accessory, ");
+ break;
+ case UsbPortStatus.COMPLIANCE_WARNING_BC_1_2:
+ complianceWarningString.append("bc12, ");
+ break;
+ case UsbPortStatus.COMPLIANCE_WARNING_MISSING_RP:
+ complianceWarningString.append("missing rp, ");
+ break;
+ default:
+ complianceWarningString.append(String.format("Unknown(%d), ", warning));
+ break;
+ }
+ }
+ }
+
+ complianceWarningString.append("]");
+ return complianceWarningString.toString().replaceAll(", ]$", "]");
+ }
+
+ /** @hide */
public static void checkMode(int powerRole) {
Preconditions.checkArgumentInRange(powerRole, Constants.PortMode.NONE,
Constants.PortMode.NUM_MODES - 1, "portMode");
@@ -720,10 +784,12 @@
@Override
public String toString() {
return "UsbPort{id=" + mId + ", supportedModes=" + modeToString(mSupportedModes)
- + "supportedContaminantProtectionModes=" + mSupportedContaminantProtectionModes
- + "supportsEnableContaminantPresenceProtection="
+ + ", supportedContaminantProtectionModes=" + mSupportedContaminantProtectionModes
+ + ", supportsEnableContaminantPresenceProtection="
+ mSupportsEnableContaminantPresenceProtection
- + "supportsEnableContaminantPresenceDetection="
- + mSupportsEnableContaminantPresenceDetection;
+ + ", supportsEnableContaminantPresenceDetection="
+ + mSupportsEnableContaminantPresenceDetection
+ + ", supportsComplianceWarnings="
+ + mSupportsComplianceWarnings;
}
}
diff --git a/core/java/android/hardware/usb/UsbPortStatus.java b/core/java/android/hardware/usb/UsbPortStatus.java
index 3221ec8..ed3e40d 100644
--- a/core/java/android/hardware/usb/UsbPortStatus.java
+++ b/core/java/android/hardware/usb/UsbPortStatus.java
@@ -16,9 +16,11 @@
package android.hardware.usb;
+import android.Manifest;
+import android.annotation.CheckResult;
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -46,6 +48,7 @@
private final boolean mPowerTransferLimited;
private final @UsbDataStatus int mUsbDataStatus;
private final @PowerBrickConnectionStatus int mPowerBrickConnectionStatus;
+ private final @NonNull @ComplianceWarning int[] mComplianceWarnings;
/**
* Power role: This USB port does not have a power role.
@@ -246,6 +249,41 @@
*/
public static final int POWER_BRICK_STATUS_DISCONNECTED = 2;
+ /**
+ * Used to indicate attached sources/cables/accessories/ports
+ * that do not match the other warnings below and do not meet the
+ * requirements of specifications including but not limited to
+ * USB Type-C Cable and Connector, Universal Serial Bus
+ * Power Delivery, and Universal Serial Bus 1.x/2.0/3.x/4.0.
+ * In addition, constants introduced after the target sdk will be
+ * remapped into COMPLIANCE_WARNING_OTHER.
+ */
+ public static final int COMPLIANCE_WARNING_OTHER = 1;
+
+ /**
+ * Used to indicate Type-C port partner
+ * (cable/accessory/source) that identifies itself as debug
+ * accessory source as defined in USB Type-C Cable and
+ * Connector Specification. However, the specification states
+ * that this is meant for debug only and shall not be used for
+ * with commercial products.
+ */
+ public static final int COMPLIANCE_WARNING_DEBUG_ACCESSORY = 2;
+
+ /**
+ * Used to indicate USB ports that does not
+ * identify itself as one of the charging port types (SDP/CDP
+ * DCP etc) as defined by Battery Charging v1.2 Specification.
+ */
+ public static final int COMPLIANCE_WARNING_BC_1_2 = 3;
+
+ /**
+ * Used to indicate Type-C sources/cables that are missing pull
+ * up resistors on the CC pins as required by USB Type-C Cable
+ * and Connector Specification.
+ */
+ public static final int COMPLIANCE_WARNING_MISSING_RP = 4;
+
@IntDef(prefix = { "CONTAMINANT_DETECTION_" }, value = {
CONTAMINANT_DETECTION_NOT_SUPPORTED,
CONTAMINANT_DETECTION_DISABLED,
@@ -275,6 +313,15 @@
@Retention(RetentionPolicy.SOURCE)
@interface UsbPortMode{}
+ @IntDef(prefix = { "COMPLIANCE_WARNING_" }, value = {
+ COMPLIANCE_WARNING_OTHER,
+ COMPLIANCE_WARNING_DEBUG_ACCESSORY,
+ COMPLIANCE_WARNING_BC_1_2,
+ COMPLIANCE_WARNING_MISSING_RP,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ @interface ComplianceWarning{}
+
/** @hide */
@IntDef(prefix = { "DATA_STATUS_" }, flag = true, value = {
DATA_STATUS_UNKNOWN,
@@ -302,7 +349,8 @@
int supportedRoleCombinations, int contaminantProtectionStatus,
int contaminantDetectionStatus, @UsbDataStatus int usbDataStatus,
boolean powerTransferLimited,
- @PowerBrickConnectionStatus int powerBrickConnectionStatus) {
+ @PowerBrickConnectionStatus int powerBrickConnectionStatus,
+ @NonNull @ComplianceWarning int[] complianceWarnings) {
mCurrentMode = currentMode;
mCurrentPowerRole = currentPowerRole;
mCurrentDataRole = currentDataRole;
@@ -312,21 +360,29 @@
mUsbDataStatus = usbDataStatus;
mPowerTransferLimited = powerTransferLimited;
mPowerBrickConnectionStatus = powerBrickConnectionStatus;
+ mComplianceWarnings = complianceWarnings;
+ }
+
+ /** @hide */
+ public UsbPortStatus(int currentMode, int currentPowerRole, int currentDataRole,
+ int supportedRoleCombinations, int contaminantProtectionStatus,
+ int contaminantDetectionStatus, @UsbDataStatus int usbDataStatus,
+ boolean powerTransferLimited,
+ @PowerBrickConnectionStatus int powerBrickConnectionStatus) {
+ this(currentMode, currentPowerRole, currentDataRole, supportedRoleCombinations,
+ contaminantProtectionStatus, contaminantDetectionStatus,
+ usbDataStatus, powerTransferLimited, powerBrickConnectionStatus,
+ new int[] {});
}
/** @hide */
public UsbPortStatus(int currentMode, int currentPowerRole, int currentDataRole,
int supportedRoleCombinations, int contaminantProtectionStatus,
int contaminantDetectionStatus) {
- mCurrentMode = currentMode;
- mCurrentPowerRole = currentPowerRole;
- mCurrentDataRole = currentDataRole;
- mSupportedRoleCombinations = supportedRoleCombinations;
- mContaminantProtectionStatus = contaminantProtectionStatus;
- mContaminantDetectionStatus = contaminantDetectionStatus;
- mUsbDataStatus = DATA_STATUS_UNKNOWN;
- mPowerBrickConnectionStatus = POWER_BRICK_STATUS_UNKNOWN;
- mPowerTransferLimited = false;
+ this(currentMode, currentPowerRole, currentDataRole, supportedRoleCombinations,
+ contaminantProtectionStatus, contaminantDetectionStatus,
+ DATA_STATUS_UNKNOWN, false, POWER_BRICK_STATUS_UNKNOWN,
+ new int[] {});
}
/**
@@ -443,6 +499,21 @@
return mPowerBrickConnectionStatus;
}
+ /**
+ * Returns non compliant reasons, if any, for the connected
+ * charger/cable/accessory/USB port.
+ *
+ * @return array including {@link #NON_COMPLIANT_REASON_DEBUG_ACCESSORY},
+ * {@link #NON_COMPLIANT_REASON_BC12},
+ * {@link #NON_COMPLIANT_REASON_MISSING_RP},
+ * or {@link #NON_COMPLIANT_REASON_TYPEC}
+ */
+ @CheckResult
+ @NonNull
+ public @ComplianceWarning int[] getComplianceWarnings() {
+ return mComplianceWarnings;
+ }
+
@NonNull
@Override
public String toString() {
@@ -460,9 +531,11 @@
+ UsbPort.usbDataStatusToString(getUsbDataStatus())
+ ", isPowerTransferLimited="
+ isPowerTransferLimited()
- +", powerBrickConnectionStatus="
+ + ", powerBrickConnectionStatus="
+ UsbPort
.powerBrickConnectionStatusToString(getPowerBrickConnectionStatus())
+ + ", complianceWarnings="
+ + UsbPort.complianceWarningsToString(getComplianceWarnings())
+ "}";
}
@@ -482,6 +555,7 @@
dest.writeInt(mUsbDataStatus);
dest.writeBoolean(mPowerTransferLimited);
dest.writeInt(mPowerBrickConnectionStatus);
+ dest.writeIntArray(mComplianceWarnings);
}
public static final @NonNull Parcelable.Creator<UsbPortStatus> CREATOR =
@@ -497,10 +571,12 @@
int usbDataStatus = in.readInt();
boolean powerTransferLimited = in.readBoolean();
int powerBrickConnectionStatus = in.readInt();
+ @ComplianceWarning int[] complianceWarnings = in.createIntArray();
return new UsbPortStatus(currentMode, currentPowerRole, currentDataRole,
supportedRoleCombinations, contaminantProtectionStatus,
contaminantDetectionStatus, usbDataStatus, powerTransferLimited,
- powerBrickConnectionStatus);
+ powerBrickConnectionStatus,
+ complianceWarnings);
}
@Override
@@ -524,6 +600,7 @@
private boolean mPowerTransferLimited;
private @UsbDataStatus int mUsbDataStatus;
private @PowerBrickConnectionStatus int mPowerBrickConnectionStatus;
+ private @ComplianceWarning int[] mComplianceWarnings;
public Builder() {
mCurrentMode = MODE_NONE;
@@ -533,6 +610,7 @@
mContaminantDetectionStatus = CONTAMINANT_DETECTION_NOT_SUPPORTED;
mUsbDataStatus = DATA_STATUS_UNKNOWN;
mPowerBrickConnectionStatus = POWER_BRICK_STATUS_UNKNOWN;
+ mComplianceWarnings = new int[] {};
}
/**
@@ -619,6 +697,20 @@
}
/**
+ * Sets the non-compliant charger reasons of {@link UsbPortStatus}
+ *
+ * @return Instance of {@link Builder}
+ */
+ @NonNull
+ public Builder setComplianceWarnings(
+ @NonNull int[] complianceWarnings) {
+ mComplianceWarnings = complianceWarnings == null ? new int[] {} :
+ complianceWarnings;
+ return this;
+ }
+
+
+ /**
* Creates the {@link UsbPortStatus} object.
*/
@NonNull
@@ -626,7 +718,7 @@
UsbPortStatus status = new UsbPortStatus(mCurrentMode, mCurrentPowerRole,
mCurrentDataRole, mSupportedRoleCombinations, mContaminantProtectionStatus,
mContaminantDetectionStatus, mUsbDataStatus, mPowerTransferLimited,
- mPowerBrickConnectionStatus);
+ mPowerBrickConnectionStatus, mComplianceWarnings);
return status;
}
};
diff --git a/core/java/com/android/internal/usb/DumpUtils.java b/core/java/com/android/internal/usb/DumpUtils.java
index 1eb446e..f974d9d 100644
--- a/core/java/com/android/internal/usb/DumpUtils.java
+++ b/core/java/com/android/internal/usb/DumpUtils.java
@@ -174,6 +174,9 @@
} else {
dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, UsbPort.modeToString(mode));
}
+ dump.write("supports_compliance_warnings",
+ UsbPortProto.SUPPORTS_COMPLIANCE_WARNINGS,
+ port.supportsComplianceWarnings());
dump.end(token);
}
@@ -250,6 +253,8 @@
status.isPowerTransferLimited());
dump.write("usb_power_brick_status", UsbPortStatusProto.USB_POWER_BRICK_STATUS,
UsbPort.powerBrickConnectionStatusToString(status.getPowerBrickConnectionStatus()));
+ dump.write("compliance_warning_status", UsbPortStatusProto.COMPLIANCE_WARNINGS_STRING,
+ UsbPort.complianceWarningsToString(status.getComplianceWarnings()));
dump.end(token);
}
}
diff --git a/core/proto/android/service/usb.proto b/core/proto/android/service/usb.proto
index df5e0a9..607fd10 100644
--- a/core/proto/android/service/usb.proto
+++ b/core/proto/android/service/usb.proto
@@ -240,6 +240,7 @@
// ID of the port. A device (eg: Chromebooks) might have multiple ports.
optional string id = 1;
repeated Mode supported_modes = 2;
+ optional bool supports_compliance_warnings = 3;
}
message UsbPortStatusProto {
@@ -268,6 +269,7 @@
optional string usb_data_status = 7;
optional bool is_power_transfer_limited = 8;
optional string usb_power_brick_status = 9;
+ optional string compliance_warnings_string = 10;
}
message UsbPortStatusRoleCombinationProto {
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 87f47a4..03376f7 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -293,6 +293,7 @@
<protected-broadcast android:name="android.hardware.usb.action.USB_STATE" />
<protected-broadcast android:name="android.hardware.usb.action.USB_PORT_CHANGED" />
+ <protected-broadcast android:name="android.hardware.usb.action.USB_PORT_COMPLIANCE_CHANGED" />
<protected-broadcast android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
<protected-broadcast android:name="android.hardware.usb.action.USB_ACCESSORY_DETACHED" />
<protected-broadcast android:name="android.hardware.usb.action.USB_ACCESSORY_HANDSHAKE" />
diff --git a/services/usb/Android.bp b/services/usb/Android.bp
index 3b50fa4..52cfe25 100644
--- a/services/usb/Android.bp
+++ b/services/usb/Android.bp
@@ -29,7 +29,7 @@
"android.hardware.usb-V1.1-java",
"android.hardware.usb-V1.2-java",
"android.hardware.usb-V1.3-java",
- "android.hardware.usb-V1-java",
+ "android.hardware.usb-V2-java",
"android.hardware.usb.gadget-V1.0-java",
"android.hardware.usb.gadget-V1.1-java",
"android.hardware.usb.gadget-V1.2-java",
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index f8df6c6..4bb9de5 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -73,6 +73,7 @@
import android.service.usb.UsbPortInfoProto;
import android.service.usb.UsbPortManagerProto;
import android.util.ArrayMap;
+import android.util.IntArray;
import android.util.Log;
import android.util.Slog;
@@ -87,6 +88,7 @@
import com.android.server.usb.hal.port.UsbPortHal;
import com.android.server.usb.hal.port.UsbPortHalInstance;
+import java.util.Arrays;
import java.util.ArrayList;
import java.util.NoSuchElementException;
import java.util.Objects;
@@ -754,6 +756,31 @@
}
}
+ /**
+ * Sets Compliance Warnings for simulated USB port objects.
+ */
+ public void simulateComplianceWarnings(String portId, String complianceWarningsString,
+ IndentingPrintWriter pw) {
+ synchronized (mLock) {
+ final RawPortInfo portInfo = mSimulatedPorts.get(portId);
+ if (portInfo == null) {
+ pw.println("Simulated port not found");
+ return;
+ }
+
+ IntArray complianceWarnings = new IntArray();
+ for (String s : complianceWarningsString.split("[, ]")) {
+ if (s.length() > 0) {
+ complianceWarnings.add(Integer.parseInt(s));
+ }
+ }
+ pw.println("Simulating Compliance Warnings: portId=" + portId
+ + " Warnings=" + complianceWarningsString);
+ portInfo.complianceWarnings = complianceWarnings.toArray();
+ updatePortsLocked(pw, null);
+ }
+ }
+
public void disconnectSimulatedPort(String portId, IndentingPrintWriter pw) {
synchronized (mLock) {
final RawPortInfo portInfo = mSimulatedPorts.get(portId);
@@ -842,7 +869,10 @@
portInfo.contaminantDetectionStatus,
portInfo.usbDataStatus,
portInfo.powerTransferLimited,
- portInfo.powerBrickConnectionStatus, pw);
+ portInfo.powerBrickConnectionStatus,
+ portInfo.supportsComplianceWarnings,
+ portInfo.complianceWarnings,
+ pw);
}
} else {
for (RawPortInfo currentPortInfo : newPortInfo) {
@@ -857,7 +887,10 @@
currentPortInfo.contaminantDetectionStatus,
currentPortInfo.usbDataStatus,
currentPortInfo.powerTransferLimited,
- currentPortInfo.powerBrickConnectionStatus, pw);
+ currentPortInfo.powerBrickConnectionStatus,
+ currentPortInfo.supportsComplianceWarnings,
+ currentPortInfo.complianceWarnings,
+ pw);
}
}
@@ -880,6 +913,9 @@
handlePortRemovedLocked(portInfo, pw);
break;
}
+ if (portInfo.mComplianceWarningChange == portInfo.COMPLIANCE_WARNING_CHANGED) {
+ handlePortComplianceWarningLocked(portInfo, pw);
+ }
}
}
@@ -896,6 +932,8 @@
int usbDataStatus,
boolean powerTransferLimited,
int powerBrickConnectionStatus,
+ boolean supportsComplianceWarnings,
+ @NonNull int[] complianceWarnings,
IndentingPrintWriter pw) {
// Only allow mode switch capability for dual role ports.
// Validate that the current mode matches the supported modes we expect.
@@ -949,13 +987,15 @@
portInfo = new PortInfo(mContext.getSystemService(UsbManager.class),
portId, supportedModes, supportedContaminantProtectionModes,
supportsEnableContaminantPresenceProtection,
- supportsEnableContaminantPresenceDetection);
+ supportsEnableContaminantPresenceDetection,
+ supportsComplianceWarnings);
portInfo.setStatus(currentMode, canChangeMode,
currentPowerRole, canChangePowerRole,
currentDataRole, canChangeDataRole,
supportedRoleCombinations, contaminantProtectionStatus,
contaminantDetectionStatus, usbDataStatus,
- powerTransferLimited, powerBrickConnectionStatus);
+ powerTransferLimited, powerBrickConnectionStatus,
+ complianceWarnings);
mPorts.put(portId, portInfo);
} else {
// Validate that ports aren't changing definition out from under us.
@@ -987,13 +1027,13 @@
+ ", current=" + supportsEnableContaminantPresenceDetection);
}
-
if (portInfo.setStatus(currentMode, canChangeMode,
currentPowerRole, canChangePowerRole,
currentDataRole, canChangeDataRole,
supportedRoleCombinations, contaminantProtectionStatus,
contaminantDetectionStatus, usbDataStatus,
- powerTransferLimited, powerBrickConnectionStatus)) {
+ powerTransferLimited, powerBrickConnectionStatus,
+ complianceWarnings)) {
portInfo.mDisposition = PortInfo.DISPOSITION_CHANGED;
} else {
portInfo.mDisposition = PortInfo.DISPOSITION_READY;
@@ -1019,6 +1059,11 @@
handlePortLocked(portInfo, pw);
}
+ private void handlePortComplianceWarningLocked(PortInfo portInfo, IndentingPrintWriter pw) {
+ logAndPrint(Log.INFO, pw, "USB port compliance warning changed: " + portInfo);
+ sendComplianceWarningBroadcastLocked(portInfo);
+ }
+
private void handlePortRemovedLocked(PortInfo portInfo, IndentingPrintWriter pw) {
logAndPrint(Log.INFO, pw, "USB port removed: " + portInfo);
handlePortLocked(portInfo, pw);
@@ -1056,6 +1101,23 @@
Manifest.permission.MANAGE_USB));
}
+ private void sendComplianceWarningBroadcastLocked(PortInfo portInfo) {
+ if (portInfo.mComplianceWarningChange == portInfo.COMPLIANCE_WARNING_UNCHANGED) {
+ return;
+ }
+ final Intent intent = new Intent(UsbManager.ACTION_USB_PORT_COMPLIANCE_CHANGED);
+ intent.addFlags(
+ Intent.FLAG_RECEIVER_FOREGROUND |
+ Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
+ intent.putExtra(UsbManager.EXTRA_PORT, ParcelableUsbPort.of(portInfo.mUsbPort));
+ intent.putExtra(UsbManager.EXTRA_PORT_STATUS, portInfo.mUsbPortStatus);
+
+ // Guard against possible reentrance by posting the broadcast from the handler
+ // instead of from within the critical section.
+ mHandler.post(() -> mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
+ Manifest.permission.MANAGE_USB));
+ }
+
private void enableContaminantDetectionIfNeeded(PortInfo portInfo, IndentingPrintWriter pw) {
if (!mConnected.containsKey(portInfo.mUsbPort.getId())) {
return;
@@ -1180,6 +1242,9 @@
public static final int DISPOSITION_READY = 2;
public static final int DISPOSITION_REMOVED = 3;
+ public static final int COMPLIANCE_WARNING_UNCHANGED = 0;
+ public static final int COMPLIANCE_WARNING_CHANGED = 1;
+
public final UsbPort mUsbPort;
public UsbPortStatus mUsbPortStatus;
public boolean mCanChangeMode;
@@ -1191,15 +1256,29 @@
public long mConnectedAtMillis;
// 0 when port is connected. Else reports the last connected duration
public long mLastConnectDurationMillis;
+ // default initialized to 0 which means no changes reported
+ public int mComplianceWarningChange;
PortInfo(@NonNull UsbManager usbManager, @NonNull String portId, int supportedModes,
int supportedContaminantProtectionModes,
boolean supportsEnableContaminantPresenceDetection,
- boolean supportsEnableContaminantPresenceProtection) {
+ boolean supportsEnableContaminantPresenceProtection,
+ boolean supportsComplianceWarnings) {
mUsbPort = new UsbPort(usbManager, portId, supportedModes,
supportedContaminantProtectionModes,
supportsEnableContaminantPresenceDetection,
- supportsEnableContaminantPresenceProtection);
+ supportsEnableContaminantPresenceProtection,
+ supportsComplianceWarnings);
+ mComplianceWarningChange = COMPLIANCE_WARNING_UNCHANGED;
+ }
+
+ public boolean complianceWarningsChanged(@NonNull int[] complianceWarnings) {
+ if (Arrays.equals(complianceWarnings, mUsbPortStatus.getComplianceWarnings())) {
+ mComplianceWarningChange = COMPLIANCE_WARNING_UNCHANGED;
+ return false;
+ }
+ mComplianceWarningChange = COMPLIANCE_WARNING_CHANGED;
+ return true;
}
public boolean setStatus(int currentMode, boolean canChangeMode,
@@ -1221,7 +1300,8 @@
supportedRoleCombinations, UsbPortStatus.CONTAMINANT_PROTECTION_NONE,
UsbPortStatus.CONTAMINANT_DETECTION_NOT_SUPPORTED,
UsbPortStatus.DATA_STATUS_UNKNOWN, false,
- UsbPortStatus.POWER_BRICK_STATUS_UNKNOWN);
+ UsbPortStatus.POWER_BRICK_STATUS_UNKNOWN,
+ new int[] {});
dispositionChanged = true;
}
@@ -1266,7 +1346,8 @@
mUsbPortStatus = new UsbPortStatus(currentMode, currentPowerRole, currentDataRole,
supportedRoleCombinations, contaminantProtectionStatus,
contaminantDetectionStatus, usbDataStatus,
- powerTransferLimited, powerBrickConnectionStatus);
+ powerTransferLimited, powerBrickConnectionStatus,
+ new int[] {});
dispositionChanged = true;
}
@@ -1281,6 +1362,62 @@
return dispositionChanged;
}
+ 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 powerBrickConnectionStatus,
+ @NonNull int[] complianceWarnings) {
+ boolean dispositionChanged = false;
+
+ mCanChangeMode = canChangeMode;
+ mCanChangePowerRole = canChangePowerRole;
+ mCanChangeDataRole = canChangeDataRole;
+ if (mUsbPortStatus == null
+ || mUsbPortStatus.getCurrentMode() != currentMode
+ || mUsbPortStatus.getCurrentPowerRole() != currentPowerRole
+ || mUsbPortStatus.getCurrentDataRole() != currentDataRole
+ || mUsbPortStatus.getSupportedRoleCombinations()
+ != supportedRoleCombinations
+ || mUsbPortStatus.getContaminantProtectionStatus()
+ != contaminantProtectionStatus
+ || mUsbPortStatus.getContaminantDetectionStatus()
+ != contaminantDetectionStatus
+ || mUsbPortStatus.getUsbDataStatus()
+ != usbDataStatus
+ || mUsbPortStatus.isPowerTransferLimited()
+ != powerTransferLimited
+ || mUsbPortStatus.getPowerBrickConnectionStatus()
+ != powerBrickConnectionStatus) {
+ if (mUsbPortStatus == null && complianceWarnings.length > 0) {
+ mComplianceWarningChange = COMPLIANCE_WARNING_CHANGED;
+ }
+ mUsbPortStatus = new UsbPortStatus(currentMode, currentPowerRole, currentDataRole,
+ supportedRoleCombinations, contaminantProtectionStatus,
+ contaminantDetectionStatus, usbDataStatus,
+ powerTransferLimited, powerBrickConnectionStatus,
+ complianceWarnings);
+ dispositionChanged = true;
+ } else if (complianceWarningsChanged(complianceWarnings)) {
+ mUsbPortStatus = new UsbPortStatus(currentMode, currentPowerRole, currentDataRole,
+ supportedRoleCombinations, contaminantProtectionStatus,
+ contaminantDetectionStatus, usbDataStatus,
+ powerTransferLimited, powerBrickConnectionStatus,
+ complianceWarnings);
+ }
+
+ if (mUsbPortStatus.isConnected() && mConnectedAtMillis == 0) {
+ mConnectedAtMillis = SystemClock.elapsedRealtime();
+ mLastConnectDurationMillis = 0;
+ } else if (!mUsbPortStatus.isConnected() && mConnectedAtMillis != 0) {
+ mLastConnectDurationMillis = SystemClock.elapsedRealtime() - mConnectedAtMillis;
+ mConnectedAtMillis = 0;
+ }
+
+ return dispositionChanged;
+ }
+
void dump(@NonNull DualDumpOutputStream dump, @NonNull String idName, long id) {
long token = dump.start(idName, id);
diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java
index 86f877f..d91b246 100644
--- a/services/usb/java/com/android/server/usb/UsbService.java
+++ b/services/usb/java/com/android/server/usb/UsbService.java
@@ -1076,6 +1076,23 @@
mPortManager.dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")),
"", 0);
}
+ } else if ("set-compliance-reasons".equals(args[0]) && args.length == 3) {
+ final String portId = args[1];
+ final String complianceWarnings = args[2];
+ if (mPortManager != null) {
+ mPortManager.simulateComplianceWarnings(portId, complianceWarnings, pw);
+ pw.println();
+ mPortManager.dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")),
+ "", 0);
+ }
+ } else if ("clear-compliance-reasons".equals(args[0]) && args.length == 2) {
+ final String portId = args[1];
+ if (mPortManager != null) {
+ mPortManager.simulateComplianceWarnings(portId, "", pw);
+ pw.println();
+ mPortManager.dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")),
+ "", 0);
+ }
} else if ("ports".equals(args[0]) && args.length == 1) {
if (mPortManager != null) {
mPortManager.dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")),
@@ -1125,6 +1142,17 @@
pw.println(" dumpsys usb set-contaminant-status \"matrix\" true");
pw.println(" dumpsys usb set-contaminant-status \"matrix\" false");
pw.println();
+ pw.println("Example simulate compliance warnings:");
+ pw.println(" dumpsys usb add-port \"matrix\" dual");
+ pw.println(" dumpsys usb set-compliance-reasons \"matrix\" <reason-list>");
+ pw.println(" dumpsys usb clear-compliance-reasons \"matrix\"");
+ pw.println("<reason-list> is expected to be formatted as \"1, ..., 4\"");
+ pw.println("with reasons that need to be simulated.");
+ pw.println(" 1: debug accessory");
+ pw.println(" 2: bc12");
+ pw.println(" 3: missing rp");
+ pw.println(" 4: type c");
+ pw.println();
pw.println("Example USB device descriptors:");
pw.println(" dumpsys usb dump-descriptors -dump-short");
pw.println(" dumpsys usb dump-descriptors -dump-tree");
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 128a051..e6a3e53 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
@@ -40,6 +40,8 @@
public int usbDataStatus;
public boolean powerTransferLimited;
public int powerBrickConnectionStatus;
+ public final boolean supportsComplianceWarnings;
+ public int[] complianceWarnings;
public RawPortInfo(String portId, int supportedModes) {
this.portId = portId;
@@ -50,9 +52,10 @@
this.supportsEnableContaminantPresenceDetection = false;
this.contaminantDetectionStatus = UsbPortStatus.CONTAMINANT_DETECTION_NOT_SUPPORTED;
this.usbDataStatus = UsbPortStatus.DATA_STATUS_UNKNOWN;
-
this.powerTransferLimited = false;
this.powerBrickConnectionStatus = UsbPortStatus.POWER_BRICK_STATUS_UNKNOWN;
+ this.supportsComplianceWarnings = false;
+ this.complianceWarnings = new int[] {};
}
public RawPortInfo(String portId, int supportedModes, int supportedContaminantProtectionModes,
@@ -66,6 +69,29 @@
int usbDataStatus,
boolean powerTransferLimited,
int powerBrickConnectionStatus) {
+ this(portId, supportedModes, supportedContaminantProtectionModes,
+ currentMode, canChangeMode,
+ currentPowerRole, canChangePowerRole,
+ currentDataRole, canChangeDataRole,
+ supportsEnableContaminantPresenceProtection, contaminantProtectionStatus,
+ supportsEnableContaminantPresenceDetection, contaminantDetectionStatus,
+ usbDataStatus, powerTransferLimited, powerBrickConnectionStatus,
+ false, new int[] {});
+ }
+
+ public RawPortInfo(String portId, int supportedModes, int supportedContaminantProtectionModes,
+ int currentMode, boolean canChangeMode,
+ int currentPowerRole, boolean canChangePowerRole,
+ int currentDataRole, boolean canChangeDataRole,
+ boolean supportsEnableContaminantPresenceProtection,
+ int contaminantProtectionStatus,
+ boolean supportsEnableContaminantPresenceDetection,
+ int contaminantDetectionStatus,
+ int usbDataStatus,
+ boolean powerTransferLimited,
+ int powerBrickConnectionStatus,
+ boolean supportsComplianceWarnings,
+ int[] complianceWarnings) {
this.portId = portId;
this.supportedModes = supportedModes;
this.supportedContaminantProtectionModes = supportedContaminantProtectionModes;
@@ -84,6 +110,8 @@
this.usbDataStatus = usbDataStatus;
this.powerTransferLimited = powerTransferLimited;
this.powerBrickConnectionStatus = powerBrickConnectionStatus;
+ this.supportsComplianceWarnings = supportsComplianceWarnings;
+ this.complianceWarnings = complianceWarnings;
}
@Override
@@ -109,6 +137,8 @@
dest.writeInt(usbDataStatus);
dest.writeBoolean(powerTransferLimited);
dest.writeInt(powerBrickConnectionStatus);
+ dest.writeBoolean(supportsComplianceWarnings);
+ dest.writeIntArray(complianceWarnings);
}
public static final Parcelable.Creator<RawPortInfo> CREATOR =
@@ -131,6 +161,8 @@
int usbDataStatus = in.readInt();
boolean powerTransferLimited = in.readBoolean();
int powerBrickConnectionStatus = in.readInt();
+ boolean supportsComplianceWarnings = in.readBoolean();
+ int[] complianceWarnings = in.createIntArray();
return new RawPortInfo(id, supportedModes,
supportedContaminantProtectionModes, currentMode, canChangeMode,
currentPowerRole, canChangePowerRole,
@@ -139,7 +171,8 @@
contaminantProtectionStatus,
supportsEnableContaminantPresenceDetection,
contaminantDetectionStatus, usbDataStatus,
- powerTransferLimited, powerBrickConnectionStatus);
+ powerTransferLimited, powerBrickConnectionStatus,
+ supportsComplianceWarnings, complianceWarnings);
}
@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 94273a3..ca11629 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
@@ -34,9 +34,12 @@
import android.hardware.usb.IUsbCallback;
import android.hardware.usb.PortRole;
import android.hardware.usb.PortStatus;
+import android.hardware.usb.ComplianceWarning;
+import android.os.Build;
import android.os.ServiceManager;
import android.os.IBinder;
import android.os.RemoteException;
+import android.util.IntArray;
import android.util.Log;
import android.util.LongSparseArray;
import android.util.Slog;
@@ -46,6 +49,7 @@
import com.android.server.usb.UsbPortManager;
import com.android.server.usb.hal.port.RawPortInfo;
+import java.util.Arrays;
import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom;
import java.util.NoSuchElementException;
@@ -551,6 +555,24 @@
return usbDataStatus;
}
+ private int[] formatComplianceWarnings(int[] complianceWarnings) {
+ Objects.requireNonNull(complianceWarnings);
+ IntArray newComplianceWarnings = new IntArray();
+ Arrays.sort(complianceWarnings);
+ for (int warning : complianceWarnings) {
+ if (newComplianceWarnings.indexOf(warning) == -1
+ && warning >= UsbPortStatus.COMPLIANCE_WARNING_OTHER) {
+ // ComplianceWarnings range from [1, 4] in Android U
+ if (warning > UsbPortStatus.COMPLIANCE_WARNING_MISSING_RP) {
+ newComplianceWarnings.add(UsbPortStatus.COMPLIANCE_WARNING_OTHER);
+ } else {
+ newComplianceWarnings.add(warning);
+ }
+ }
+ }
+ return newComplianceWarnings.toArray();
+ }
+
@Override
public void notifyPortStatusChange(
android.hardware.usb.PortStatus[] currentPortStatus, int retval) {
@@ -584,7 +606,9 @@
current.contaminantDetectionStatus,
toUsbDataStatusInt(current.usbDataStatus),
current.powerTransferLimited,
- current.powerBrickStatus);
+ current.powerBrickStatus,
+ current.supportsComplianceWarnings,
+ formatComplianceWarnings(current.complianceWarnings));
newPortInfo.add(temp);
UsbPortManager.logAndPrint(Log.INFO, mPw, "ClientCallback AIDL V1: "
+ current.portName);
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 23d913c..10403c1 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
@@ -421,7 +421,8 @@
current.currentDataRole, current.canChangeDataRole,
false, CONTAMINANT_PROTECTION_NONE,
false, CONTAMINANT_DETECTION_NOT_SUPPORTED, sUsbDataStatus,
- false, POWER_BRICK_STATUS_UNKNOWN);
+ false, POWER_BRICK_STATUS_UNKNOWN,
+ false, new int[] {});
newPortInfo.add(temp);
UsbPortManager.logAndPrint(Log.INFO, mPw, "ClientCallback V1_0: "
+ current.portName);
@@ -455,7 +456,8 @@
current.status.currentDataRole, current.status.canChangeDataRole,
false, CONTAMINANT_PROTECTION_NONE,
false, CONTAMINANT_DETECTION_NOT_SUPPORTED, sUsbDataStatus,
- false, POWER_BRICK_STATUS_UNKNOWN);
+ false, POWER_BRICK_STATUS_UNKNOWN,
+ false, new int[] {});
newPortInfo.add(temp);
UsbPortManager.logAndPrint(Log.INFO, mPw, "ClientCallback V1_1: "
+ current.status.portName);
@@ -493,7 +495,8 @@
current.supportsEnableContaminantPresenceDetection,
current.contaminantDetectionStatus,
sUsbDataStatus,
- false, POWER_BRICK_STATUS_UNKNOWN);
+ false, POWER_BRICK_STATUS_UNKNOWN,
+ false, new int[] {});
newPortInfo.add(temp);
UsbPortManager.logAndPrint(Log.INFO, mPw, "ClientCallback V1_2: "
+ current.status_1_1.status.portName);