/* * 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). * *

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). * *

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). * *

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 CREATOR = new Parcelable.Creator() { @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; } }; }