176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown/*
276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Copyright (C) 2015 The Android Open Source Project
376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown *
476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * you may not use this file except in compliance with the License.
676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * You may obtain a copy of the License at
776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown *
876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown *
1076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Unless required by applicable law or agreed to in writing, software
1176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * See the License for the specific language governing permissions and
1476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * limitations under the License.
1576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown */
1676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
1776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brownpackage android.hardware.usb;
1876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
1976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brownimport android.os.Parcel;
2076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brownimport android.os.Parcelable;
2176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
2276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown/**
2376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * Describes the status of a USB port.
2476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * <p>
2576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * This object is immutable.
2676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * </p>
2776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown *
2876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown * @hide
2976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown */
3076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brownpublic final class UsbPortStatus implements Parcelable {
3176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    private final int mCurrentMode;
3276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    private final int mCurrentPowerRole;
3376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    private final int mCurrentDataRole;
3476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    private final int mSupportedRoleCombinations;
3576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
3676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /** @hide */
3776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public UsbPortStatus(int currentMode, int currentPowerRole, int currentDataRole,
3876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            int supportedRoleCombinations) {
3976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        mCurrentMode = currentMode;
4076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        mCurrentPowerRole = currentPowerRole;
4176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        mCurrentDataRole = currentDataRole;
4276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        mSupportedRoleCombinations = supportedRoleCombinations;
4376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
4476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
4576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
4676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Returns true if there is anything connected to the port.
4776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     *
4876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * @return True if there is anything connected to the port.
4976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
5076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public boolean isConnected() {
5176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return mCurrentMode != 0;
5276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
5376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
5476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
5576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Gets the current mode of the port.
5676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     *
5776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * @return The current mode: {@link UsbPort#MODE_DFP}, {@link UsbPort#MODE_UFP},
5876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * or 0 if nothing is connected.
5976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
6076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public int getCurrentMode() {
6176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return mCurrentMode;
6276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
6376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
6476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
6576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Gets the current power role of the port.
6676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     *
6776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * @return The current power role: {@link UsbPort#POWER_ROLE_SOURCE},
6876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * {@link UsbPort#POWER_ROLE_SINK}, or 0 if nothing is connected.
6976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
7076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public int getCurrentPowerRole() {
7176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return mCurrentPowerRole;
7276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
7376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
7476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
7576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Gets the current data role of the port.
7676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     *
7776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * @return The current data role: {@link UsbPort#DATA_ROLE_HOST},
7876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * {@link UsbPort#DATA_ROLE_DEVICE}, or 0 if nothing is connected.
7976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
8076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public int getCurrentDataRole() {
8176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return mCurrentDataRole;
8276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
8376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
8476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /**
8576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * Returns true if the specified power and data role combination is supported
8676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * given what is currently connected to the port.
8776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     *
8876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * @param powerRole The power role to check: {@link UsbPort#POWER_ROLE_SOURCE}
8976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * or {@link UsbPort#POWER_ROLE_SINK}, or 0 if no power role.
9076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * @param dataRole The data role to check: either {@link UsbPort#DATA_ROLE_HOST}
9176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     * or {@link UsbPort#DATA_ROLE_DEVICE}, or 0 if no data role.
9276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown     */
9376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public boolean isRoleCombinationSupported(int powerRole, int dataRole) {
9476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return (mSupportedRoleCombinations &
9576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                UsbPort.combineRolesAsBit(powerRole, dataRole)) != 0;
9676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
9776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
9876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    /** @hide */
9976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public int getSupportedRoleCombinations() {
10076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return mSupportedRoleCombinations;
10176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
10276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
10376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    @Override
10476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public String toString() {
10576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return "UsbPortStatus{connected=" + isConnected()
10676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                + ", currentMode=" + UsbPort.modeToString(mCurrentMode)
10776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                + ", currentPowerRole=" + UsbPort.powerRoleToString(mCurrentPowerRole)
10876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                + ", currentDataRole=" + UsbPort.dataRoleToString(mCurrentDataRole)
10976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                + ", supportedRoleCombinations="
11076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                        + UsbPort.roleCombinationsToString(mSupportedRoleCombinations)
11176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                + "}";
11276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
11376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
11476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    @Override
11576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public int describeContents() {
11676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        return 0;
11776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
11876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
11976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    @Override
12076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public void writeToParcel(Parcel dest, int flags) {
12176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        dest.writeInt(mCurrentMode);
12276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        dest.writeInt(mCurrentPowerRole);
12376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        dest.writeInt(mCurrentDataRole);
12476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        dest.writeInt(mSupportedRoleCombinations);
12576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    }
12676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
12776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    public static final Parcelable.Creator<UsbPortStatus> CREATOR =
12876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            new Parcelable.Creator<UsbPortStatus>() {
12976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        @Override
13076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        public UsbPortStatus createFromParcel(Parcel in) {
13176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            int currentMode = in.readInt();
13276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            int currentPowerRole = in.readInt();
13376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            int currentDataRole = in.readInt();
13476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            int supportedRoleCombinations = in.readInt();
13576c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            return new UsbPortStatus(currentMode, currentPowerRole, currentDataRole,
13676c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown                    supportedRoleCombinations);
13776c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        }
13876c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown
13976c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        @Override
14076c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        public UsbPortStatus[] newArray(int size) {
14176c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown            return new UsbPortStatus[size];
14276c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown        }
14376c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown    };
14476c4c6668a1486bc003ab0c585bb1f41d16e27a7Jeff Brown}
145