| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.hardware.usb; |
| |
| import android.annotation.CheckResult; |
| import android.annotation.FlaggedApi; |
| import android.annotation.IntDef; |
| import android.annotation.NonNull; |
| import android.annotation.Nullable; |
| import android.annotation.SystemApi; |
| import android.hardware.usb.flags.Flags; |
| import android.os.Parcel; |
| import android.os.Parcelable; |
| |
| import com.android.internal.annotations.Immutable; |
| |
| import java.lang.annotation.Retention; |
| import java.lang.annotation.RetentionPolicy; |
| |
| /** |
| * Describes the status of a USB port. |
| * |
| * @hide |
| */ |
| @Immutable |
| @SystemApi |
| public final class UsbPortStatus implements Parcelable { |
| private static final String TAG = "UsbPortStatus"; |
| private final int mCurrentMode; |
| private final @UsbPowerRole int mCurrentPowerRole; |
| private final @UsbDataRole int mCurrentDataRole; |
| private final int mSupportedRoleCombinations; |
| private final @ContaminantProtectionStatus int mContaminantProtectionStatus; |
| private final @ContaminantDetectionStatus int mContaminantDetectionStatus; |
| private final boolean mPowerTransferLimited; |
| private final @UsbDataStatus int mUsbDataStatus; |
| private final @PowerBrickConnectionStatus int mPowerBrickConnectionStatus; |
| private final @NonNull @ComplianceWarning int[] mComplianceWarnings; |
| private final @PlugState int mPlugState; |
| /** |
| * Holds the DisplayPort Alt Mode info for the Port. This field |
| * is null if the device does not support DisplayPort Alt Mode. |
| */ |
| private final @Nullable DisplayPortAltModeInfo mDisplayPortAltModeInfo; |
| |
| |
| /** |
| * Power role: This USB port does not have a power role. |
| */ |
| public static final int POWER_ROLE_NONE = 0; |
| |
| /** |
| * Power role: This USB port can act as a source (provide power). |
| */ |
| public static final int POWER_ROLE_SOURCE = 1; |
| |
| /** |
| * Power role: This USB port can act as a sink (receive power). |
| */ |
| public static final int POWER_ROLE_SINK = 2; |
| |
| @IntDef(prefix = { "POWER_ROLE_" }, value = { |
| POWER_ROLE_NONE, |
| POWER_ROLE_SOURCE, |
| POWER_ROLE_SINK |
| }) |
| @Retention(RetentionPolicy.SOURCE) |
| @interface UsbPowerRole{} |
| |
| /** |
| * Power role: This USB port does not have a data role. |
| */ |
| public static final int DATA_ROLE_NONE = 0; |
| |
| /** |
| * Data role: This USB port can act as a host (access data services). |
| */ |
| public static final int DATA_ROLE_HOST = 1; |
| |
| /** |
| * Data role: This USB port can act as a device (offer data services). |
| */ |
| public static final int DATA_ROLE_DEVICE = 2; |
| |
| @IntDef(prefix = { "DATA_ROLE_" }, value = { |
| DATA_ROLE_NONE, |
| DATA_ROLE_HOST, |
| DATA_ROLE_DEVICE |
| }) |
| @Retention(RetentionPolicy.SOURCE) |
| @interface UsbDataRole{} |
| |
| /** |
| * There is currently nothing connected to this USB port. |
| */ |
| public static final int MODE_NONE = 0; |
| |
| /** |
| * This USB port can act as an upstream facing port (device). |
| * |
| * <p> Implies that the port supports the {@link #POWER_ROLE_SINK} and |
| * {@link #DATA_ROLE_DEVICE} combination of roles (and possibly others as well). |
| */ |
| public static final int MODE_UFP = 1 << 0; |
| |
| /** |
| * This USB port can act as a downstream facing port (host). |
| * |
| * <p> Implies that the port supports the {@link #POWER_ROLE_SOURCE} and |
| * {@link #DATA_ROLE_HOST} combination of roles (and possibly others as well). |
| */ |
| public static final int MODE_DFP = 1 << 1; |
| |
| /** |
| * This USB port can act either as an downstream facing port (host) or as |
| * an upstream facing port (device). |
| * |
| * <p> Implies that the port supports the {@link #POWER_ROLE_SOURCE} and |
| * {@link #DATA_ROLE_HOST} combination of roles and the {@link #POWER_ROLE_SINK} and |
| * {@link #DATA_ROLE_DEVICE} combination of roles (and possibly others as well). |
| * |
| * @hide |
| */ |
| public static final int MODE_DUAL = MODE_UFP | MODE_DFP; |
| |
| /** |
| * This USB port can support USB Type-C Audio accessory. |
| */ |
| public static final int MODE_AUDIO_ACCESSORY = 1 << 2; |
| |
| /** |
| * This USB port can support USB Type-C debug accessory. |
| */ |
| public static final int MODE_DEBUG_ACCESSORY = 1 << 3; |
| |
| /** |
| * Contaminant presence detection not supported by the device. |
| * @hide |
| */ |
| public static final int CONTAMINANT_DETECTION_NOT_SUPPORTED = 0; |
| |
| /** |
| * Contaminant presence detection supported but disabled. |
| * @hide |
| */ |
| public static final int CONTAMINANT_DETECTION_DISABLED = 1; |
| |
| /** |
| * Contaminant presence enabled but not detected. |
| * @hide |
| */ |
| public static final int CONTAMINANT_DETECTION_NOT_DETECTED = 2; |
| |
| /** |
| * Contaminant presence enabled and detected. |
| * @hide |
| */ |
| public static final int CONTAMINANT_DETECTION_DETECTED = 3; |
| |
| /** |
| * Contaminant protection - No action performed upon detection of |
| * contaminant presence. |
| * @hide |
| */ |
| public static final int CONTAMINANT_PROTECTION_NONE = 0; |
| |
| /** |
| * Contaminant protection - Port is forced to sink upon detection of |
| * contaminant presence. |
| * @hide |
| */ |
| public static final int CONTAMINANT_PROTECTION_SINK = 1 << 0; |
| |
| /** |
| * Contaminant protection - Port is forced to source upon detection of |
| * contaminant presence. |
| * @hide |
| */ |
| public static final int CONTAMINANT_PROTECTION_SOURCE = 1 << 1; |
| |
| /** |
| * Contaminant protection - Port is disabled upon detection of |
| * contaminant presence. |
| * @hide |
| */ |
| public static final int CONTAMINANT_PROTECTION_FORCE_DISABLE = 1 << 2; |
| |
| /** |
| * Contaminant protection - Port is disabled upon detection of |
| * contaminant presence. |
| * @hide |
| */ |
| public static final int CONTAMINANT_PROTECTION_DISABLED = 1 << 3; |
| |
| /** |
| * USB data status is not known. |
| */ |
| public static final int DATA_STATUS_UNKNOWN = 0; |
| |
| /** |
| * USB data is enabled. |
| */ |
| public static final int DATA_STATUS_ENABLED = 1 << 0; |
| |
| /** |
| * USB data is disabled as the port is too hot. |
| */ |
| public static final int DATA_STATUS_DISABLED_OVERHEAT = 1 << 1; |
| |
| /** |
| * USB data is disabled due to contaminated port. |
| */ |
| public static final int DATA_STATUS_DISABLED_CONTAMINANT = 1 << 2; |
| |
| /** |
| * 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; |
| |
| /** |
| * USB data is disabled by |
| * {@link UsbPort#enableUsbData UsbPort.enableUsbData}. |
| */ |
| public static final int DATA_STATUS_DISABLED_FORCE = 1 << 4; |
| |
| /** |
| * USB data is disabled for debug. |
| */ |
| 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. |
| */ |
| public static final int POWER_BRICK_STATUS_UNKNOWN = 0; |
| |
| /** |
| * The connected device is a power brick. |
| */ |
| public static final int POWER_BRICK_STATUS_CONNECTED = 1; |
| |
| /** |
| * The connected device is not power brick. |
| */ |
| 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; |
| |
| /** |
| * Used to indicate the charging setups on the USB ports are unable to |
| * deliver negotiated power. Introduced in Android V (API level 35) |
| * and client applicantions that target API levels lower than 35 will |
| * receive {@link #COMPLIANCE_WARNING_OTHER} instead. |
| */ |
| @FlaggedApi(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING) |
| public static final int COMPLIANCE_WARNING_INPUT_POWER_LIMITED = 5; |
| |
| /** |
| * Used to indicate the cable/connector on the USB ports are missing |
| * the required wires on the data pins to make data transfer. |
| * Introduced in Android V (API level 35) and client applicantions that |
| * target API levels lower than 35 will receive |
| * {@link #COMPLIANCE_WARNING_OTHER} instead. |
| */ |
| @FlaggedApi(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING) |
| public static final int COMPLIANCE_WARNING_MISSING_DATA_LINES = 6; |
| |
| /** |
| * Used to indicate enumeration failures on the USB ports, potentially due to |
| * signal integrity issues or other causes. Introduced in Android V |
| * (API level 35) and client applicantions that target API levels lower |
| * than 35 will receive {@link #COMPLIANCE_WARNING_OTHER} instead. |
| */ |
| @FlaggedApi(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING) |
| public static final int COMPLIANCE_WARNING_ENUMERATION_FAIL = 7; |
| |
| /** |
| * Used to indicate unexpected data disconnection on the USB ports, |
| * potentially due to signal integrity issues or other causes. |
| * Introduced in Android V (API level 35) and client applicantions that |
| * target API levels lower than 35 will receive |
| * {@link #COMPLIANCE_WARNING_OTHER} instead. |
| */ |
| @FlaggedApi(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING) |
| public static final int COMPLIANCE_WARNING_FLAKY_CONNECTION = 8; |
| |
| /** |
| * Used to indicate unreliable or slow data transfer on the USB ports, |
| * potentially due to signal integrity issues or other causes. |
| * Introduced in Android V (API level 35) and client applicantions that |
| * target API levels lower than 35 will receive |
| * {@link #COMPLIANCE_WARNING_OTHER} instead. |
| */ |
| @FlaggedApi(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING) |
| public static final int COMPLIANCE_WARNING_UNRELIABLE_IO = 9; |
| |
| /** |
| * Indicates that the Type-C plug orientation cannot be |
| * determined because the connected state of the device is unknown. |
| */ |
| public static final int PLUG_STATE_UNKNOWN = 0; |
| |
| /** |
| * Indicates no Type-C plug is inserted into the device. |
| */ |
| public static final int PLUG_STATE_UNPLUGGED = 1; |
| |
| /** |
| * Indicates a Type-C plug is inserted into the device, but |
| * the orientation cannot be determined. |
| */ |
| public static final int PLUG_STATE_PLUGGED_ORIENTATION_UNKNOWN = 2; |
| |
| /** |
| * Indicates that the connected plug uses its CC1 |
| * pin to manage the Source-to-Sink connection. |
| */ |
| public static final int PLUG_STATE_PLUGGED_ORIENTATION_NORMAL = 3; |
| |
| /** |
| * Indicates that the connected plug uses its CC2 |
| * pin to manage the Source-to-Sink connection. |
| */ |
| public static final int PLUG_STATE_PLUGGED_ORIENTATION_FLIPPED = 4; |
| |
| @IntDef(prefix = { "CONTAMINANT_DETECTION_" }, value = { |
| CONTAMINANT_DETECTION_NOT_SUPPORTED, |
| CONTAMINANT_DETECTION_DISABLED, |
| CONTAMINANT_DETECTION_NOT_DETECTED, |
| CONTAMINANT_DETECTION_DETECTED, |
| }) |
| @Retention(RetentionPolicy.SOURCE) |
| @interface ContaminantDetectionStatus{} |
| |
| @IntDef(prefix = { "CONTAMINANT_PROTECTION_" }, flag = true, value = { |
| CONTAMINANT_PROTECTION_NONE, |
| CONTAMINANT_PROTECTION_SINK, |
| CONTAMINANT_PROTECTION_SOURCE, |
| CONTAMINANT_PROTECTION_FORCE_DISABLE, |
| CONTAMINANT_PROTECTION_DISABLED, |
| }) |
| @Retention(RetentionPolicy.SOURCE) |
| @interface ContaminantProtectionStatus{} |
| |
| @IntDef(prefix = { "MODE_" }, value = { |
| MODE_NONE, |
| MODE_DFP, |
| MODE_UFP, |
| MODE_AUDIO_ACCESSORY, |
| MODE_DEBUG_ACCESSORY, |
| }) |
| @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, |
| COMPLIANCE_WARNING_INPUT_POWER_LIMITED, |
| COMPLIANCE_WARNING_MISSING_DATA_LINES, |
| COMPLIANCE_WARNING_ENUMERATION_FAIL, |
| COMPLIANCE_WARNING_FLAKY_CONNECTION, |
| COMPLIANCE_WARNING_UNRELIABLE_IO, |
| }) |
| @Retention(RetentionPolicy.SOURCE) |
| @interface ComplianceWarning{} |
| |
| @IntDef(prefix = { "PLUG_STATE_" }, value = { |
| PLUG_STATE_UNKNOWN, |
| PLUG_STATE_UNPLUGGED, |
| PLUG_STATE_PLUGGED_ORIENTATION_UNKNOWN, |
| PLUG_STATE_PLUGGED_ORIENTATION_NORMAL, |
| PLUG_STATE_PLUGGED_ORIENTATION_FLIPPED, |
| }) |
| @Retention(RetentionPolicy.SOURCE) |
| @interface PlugState{} |
| |
| /** @hide */ |
| @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_DOCK_HOST_MODE, |
| DATA_STATUS_DISABLED_DOCK_DEVICE_MODE, |
| DATA_STATUS_DISABLED_FORCE, |
| DATA_STATUS_DISABLED_DEBUG, |
| }) |
| @Retention(RetentionPolicy.SOURCE) |
| @interface UsbDataStatus{} |
| |
| /** @hide */ |
| @IntDef(prefix = { "POWER_BRICK_STATUS_" }, value = { |
| POWER_BRICK_STATUS_UNKNOWN, |
| POWER_BRICK_STATUS_DISCONNECTED, |
| POWER_BRICK_STATUS_CONNECTED, |
| }) |
| @Retention(RetentionPolicy.SOURCE) |
| @interface PowerBrickConnectionStatus{} |
| |
| /** @hide */ |
| public UsbPortStatus(int currentMode, int currentPowerRole, int currentDataRole, |
| int supportedRoleCombinations, int contaminantProtectionStatus, |
| int contaminantDetectionStatus, @UsbDataStatus int usbDataStatus, |
| boolean powerTransferLimited, |
| @PowerBrickConnectionStatus int powerBrickConnectionStatus, |
| @NonNull @ComplianceWarning int[] complianceWarnings, |
| int plugState, |
| @Nullable DisplayPortAltModeInfo displayPortAltModeInfo) { |
| mCurrentMode = currentMode; |
| mCurrentPowerRole = currentPowerRole; |
| mCurrentDataRole = currentDataRole; |
| 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; |
| mComplianceWarnings = complianceWarnings; |
| mPlugState = plugState; |
| mDisplayPortAltModeInfo = displayPortAltModeInfo; |
| } |
| |
| /** @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[] {}, PLUG_STATE_UNKNOWN, null); |
| } |
| |
| /** @hide */ |
| public UsbPortStatus(int currentMode, int currentPowerRole, int currentDataRole, |
| int supportedRoleCombinations, int contaminantProtectionStatus, |
| int contaminantDetectionStatus) { |
| this(currentMode, currentPowerRole, currentDataRole, supportedRoleCombinations, |
| contaminantProtectionStatus, contaminantDetectionStatus, |
| DATA_STATUS_UNKNOWN, false, POWER_BRICK_STATUS_UNKNOWN, |
| new int[] {}, PLUG_STATE_UNKNOWN, null); |
| } |
| |
| /** |
| * Returns true if there is anything connected to the port. |
| * |
| * @return {@code true} iff there is anything connected to the port. |
| */ |
| public boolean isConnected() { |
| return mCurrentMode != 0; |
| } |
| |
| /** |
| * Gets the current mode of the port. |
| * |
| * @return The current mode: {@link #MODE_DFP}, {@link #MODE_UFP}, |
| * {@link #MODE_AUDIO_ACCESSORY}, {@link #MODE_DEBUG_ACCESSORY}, or {@link {@link #MODE_NONE} if |
| * nothing is connected. |
| */ |
| public @UsbPortMode int getCurrentMode() { |
| return mCurrentMode; |
| } |
| |
| /** |
| * Gets the current power role of the port. |
| * |
| * @return The current power role: {@link #POWER_ROLE_SOURCE}, {@link #POWER_ROLE_SINK}, or |
| * {@link #POWER_ROLE_NONE} if nothing is connected. |
| */ |
| public @UsbPowerRole int getCurrentPowerRole() { |
| return mCurrentPowerRole; |
| } |
| |
| /** |
| * Gets the current data role of the port. |
| * |
| * @return The current data role: {@link #DATA_ROLE_HOST}, {@link #DATA_ROLE_DEVICE}, or |
| * {@link #DATA_ROLE_NONE} if nothing is connected. |
| */ |
| public @UsbDataRole int getCurrentDataRole() { |
| return mCurrentDataRole; |
| } |
| |
| /** |
| * Returns true if the specified power and data role combination is supported |
| * given what is currently connected to the port. |
| * |
| * @param powerRole The power role to check: {@link #POWER_ROLE_SOURCE} or |
| * {@link #POWER_ROLE_SINK}, or {@link #POWER_ROLE_NONE} if no power role. |
| * @param dataRole The data role to check: either {@link #DATA_ROLE_HOST} or |
| * {@link #DATA_ROLE_DEVICE}, or {@link #DATA_ROLE_NONE} if no data role. |
| */ |
| public boolean isRoleCombinationSupported(@UsbPowerRole int powerRole, |
| @UsbDataRole int dataRole) { |
| return (mSupportedRoleCombinations & |
| UsbPort.combineRolesAsBit(powerRole, dataRole)) != 0; |
| } |
| |
| /** |
| * This function checks if the port is USB Power Delivery (PD) compliant - |
| * https://www.usb.org/usb-charger-pd. All of the power and data roles must be supported for a |
| * port to be PD compliant. |
| * |
| * @return true if the port is PD compliant. |
| */ |
| @FlaggedApi(Flags.FLAG_ENABLE_IS_PD_COMPLIANT_API) |
| public boolean isPdCompliant() { |
| return isRoleCombinationSupported(POWER_ROLE_SINK, DATA_ROLE_DEVICE) |
| && isRoleCombinationSupported(POWER_ROLE_SINK, DATA_ROLE_HOST) |
| && isRoleCombinationSupported(POWER_ROLE_SOURCE, DATA_ROLE_DEVICE) |
| && isRoleCombinationSupported(POWER_ROLE_SOURCE, DATA_ROLE_HOST); |
| } |
| |
| /** |
| * Get the supported role combinations. |
| */ |
| public int getSupportedRoleCombinations() { |
| return mSupportedRoleCombinations; |
| } |
| |
| /** |
| * Returns contaminant detection status. |
| * |
| * @hide |
| */ |
| public @ContaminantDetectionStatus int getContaminantDetectionStatus() { |
| return mContaminantDetectionStatus; |
| } |
| |
| /** |
| * Returns contamiant protection status. |
| * |
| * @hide |
| */ |
| public @ContaminantProtectionStatus int getContaminantProtectionStatus() { |
| return mContaminantProtectionStatus; |
| } |
| |
| /** |
| * Returns UsbData status. |
| * |
| * @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}, {@link #DATA_STATUS_DISABLED_DOCK_HOST_MODE}, |
| * {@link #DATA_STATUS_DISABLED_DOCK_DEVICE_MODE} |
| */ |
| public @UsbDataStatus int getUsbDataStatus() { |
| return mUsbDataStatus; |
| } |
| |
| /** |
| * Returns whether power transfer is limited. |
| * |
| * @return true when power transfer is limited. |
| * false otherwise. |
| */ |
| public boolean isPowerTransferLimited() { |
| return mPowerTransferLimited; |
| } |
| |
| /** |
| * 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 @PowerBrickConnectionStatus int getPowerBrickConnectionStatus() { |
| return mPowerBrickConnectionStatus; |
| } |
| |
| /** |
| * Returns non compliant reasons, if any, for the connected |
| * charger/cable/accessory/USB port. |
| * |
| * @return array including {@link #COMPLIANCE_WARNING_OTHER}, |
| * {@link #COMPLIANCE_WARNING_DEBUG_ACCESSORY}, |
| * {@link #COMPLIANCE_WARNING_BC_1_2}, |
| * {@link #COMPLIANCE_WARNING_MISSING_RP}. |
| */ |
| @CheckResult |
| @NonNull |
| public @ComplianceWarning int[] getComplianceWarnings() { |
| return mComplianceWarnings; |
| } |
| |
| /** |
| * Returns the plug state of the attached cable/adapter. |
| * |
| */ |
| public @PlugState int getPlugState() { |
| return mPlugState; |
| } |
| |
| /** |
| * Returns the DisplayPortInfo of the USB Port, if applicable. |
| * |
| * @return an instance of type DisplayPortInfo |
| * or null if not applicable. |
| */ |
| @Nullable |
| public DisplayPortAltModeInfo getDisplayPortAltModeInfo() { |
| return (mDisplayPortAltModeInfo == null) ? null : mDisplayPortAltModeInfo; |
| } |
| |
| @NonNull |
| @Override |
| public String toString() { |
| StringBuilder mString = new StringBuilder("UsbPortStatus{connected=" + isConnected() |
| + ", currentMode=" + UsbPort.modeToString(mCurrentMode) |
| + ", currentPowerRole=" + UsbPort.powerRoleToString(mCurrentPowerRole) |
| + ", currentDataRole=" + UsbPort.dataRoleToString(mCurrentDataRole) |
| + ", supportedRoleCombinations=" |
| + UsbPort.roleCombinationsToString(mSupportedRoleCombinations) |
| + ", contaminantDetectionStatus=" |
| + getContaminantDetectionStatus() |
| + ", contaminantProtectionStatus=" |
| + getContaminantProtectionStatus() |
| + ", usbDataStatus=" |
| + UsbPort.usbDataStatusToString(getUsbDataStatus()) |
| + ", isPowerTransferLimited=" |
| + isPowerTransferLimited() |
| + ", powerBrickConnectionStatus=" |
| + UsbPort |
| .powerBrickConnectionStatusToString(getPowerBrickConnectionStatus()) |
| + ", complianceWarnings=" |
| + UsbPort.complianceWarningsToString(getComplianceWarnings()) |
| + ", plugState=" |
| + getPlugState() |
| + ", displayPortAltModeInfo=" |
| + mDisplayPortAltModeInfo |
| + "}"); |
| return mString.toString(); |
| } |
| |
| @Override |
| public int describeContents() { |
| return 0; |
| } |
| |
| @Override |
| public void writeToParcel(Parcel dest, int flags) { |
| dest.writeInt(mCurrentMode); |
| dest.writeInt(mCurrentPowerRole); |
| dest.writeInt(mCurrentDataRole); |
| dest.writeInt(mSupportedRoleCombinations); |
| dest.writeInt(mContaminantProtectionStatus); |
| dest.writeInt(mContaminantDetectionStatus); |
| dest.writeInt(mUsbDataStatus); |
| dest.writeBoolean(mPowerTransferLimited); |
| dest.writeInt(mPowerBrickConnectionStatus); |
| dest.writeIntArray(mComplianceWarnings); |
| dest.writeInt(mPlugState); |
| if (mDisplayPortAltModeInfo == null) { |
| dest.writeBoolean(false); |
| } else { |
| dest.writeBoolean(true); |
| mDisplayPortAltModeInfo.writeToParcel(dest, 0); |
| } |
| } |
| |
| public static final @NonNull Parcelable.Creator<UsbPortStatus> CREATOR = |
| new Parcelable.Creator<UsbPortStatus>() { |
| @Override |
| public UsbPortStatus createFromParcel(Parcel in) { |
| int currentMode = in.readInt(); |
| int currentPowerRole = in.readInt(); |
| int currentDataRole = in.readInt(); |
| int supportedRoleCombinations = in.readInt(); |
| int contaminantProtectionStatus = in.readInt(); |
| int contaminantDetectionStatus = in.readInt(); |
| int usbDataStatus = in.readInt(); |
| boolean powerTransferLimited = in.readBoolean(); |
| int powerBrickConnectionStatus = in.readInt(); |
| @ComplianceWarning int[] complianceWarnings = in.createIntArray(); |
| int plugState = in.readInt(); |
| boolean supportsDisplayPortAltMode = in.readBoolean(); |
| DisplayPortAltModeInfo displayPortAltModeInfo; |
| if (supportsDisplayPortAltMode) { |
| displayPortAltModeInfo = DisplayPortAltModeInfo.CREATOR.createFromParcel(in); |
| } else { |
| displayPortAltModeInfo = null; |
| } |
| return new UsbPortStatus(currentMode, currentPowerRole, currentDataRole, |
| supportedRoleCombinations, contaminantProtectionStatus, |
| contaminantDetectionStatus, usbDataStatus, powerTransferLimited, |
| powerBrickConnectionStatus, |
| complianceWarnings, plugState, displayPortAltModeInfo); |
| } |
| |
| @Override |
| public UsbPortStatus[] newArray(int size) { |
| 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; |
| private @ComplianceWarning int[] mComplianceWarnings; |
| private @PlugState int mPlugState; |
| private @Nullable DisplayPortAltModeInfo mDisplayPortAltModeInfo; |
| |
| 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; |
| mComplianceWarnings = new int[] {}; |
| mPlugState = PLUG_STATE_UNKNOWN; |
| mDisplayPortAltModeInfo = null; |
| } |
| |
| /** |
| * 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; |
| } |
| |
| /** |
| * 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; |
| } |
| |
| /** |
| * Sets the plug orientation of {@link UsbPortStatus} |
| * |
| * @return Instance of {@link Builder} |
| */ |
| @NonNull |
| public Builder setPlugState(int plugState) { |
| mPlugState = plugState; |
| return this; |
| } |
| |
| /** |
| * Sets the plug orientation of {@link UsbPortStatus} |
| * |
| * @return Instance of {@link Builder} |
| */ |
| @NonNull |
| public Builder setDisplayPortAltModeInfo( |
| @Nullable DisplayPortAltModeInfo displayPortAltModeInfo) { |
| mDisplayPortAltModeInfo = displayPortAltModeInfo; |
| return this; |
| } |
| |
| /** |
| * Creates the {@link UsbPortStatus} object. |
| */ |
| @NonNull |
| public UsbPortStatus build() { |
| UsbPortStatus status = new UsbPortStatus(mCurrentMode, mCurrentPowerRole, |
| mCurrentDataRole, mSupportedRoleCombinations, mContaminantProtectionStatus, |
| mContaminantDetectionStatus, mUsbDataStatus, mPowerTransferLimited, |
| mPowerBrickConnectionStatus, mComplianceWarnings, |
| mPlugState, mDisplayPortAltModeInfo); |
| return status; |
| } |
| }; |
| } |