1e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood/*
2e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Copyright (C) 2010 The Android Open Source Project
3e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood *
4e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
5e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * you may not use this file except in compliance with the License.
6e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * You may obtain a copy of the License at
7e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood *
8e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
9e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood *
10e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * Unless required by applicable law or agreed to in writing, software
11e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
12e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * See the License for the specific language governing permissions and
14e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood * limitations under the License.
15e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */
16e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
17c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodpackage android.hardware.usb;
18e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
19e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.Parcel;
20e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.Parcelable;
21e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
22e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood/**
2311dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * This class represents a USB device attached to the android device with the android device
2411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * acting as the USB host.
2511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Each device contains one or more {@link UsbInterface}s, each of which contains a number of
2611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * {@link UsbEndpoint}s (the channels via which data is transmitted over USB).
2711dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood *
2811dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * <p> This class contains information (along with {@link UsbInterface} and {@link UsbEndpoint})
2911dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * that describes the capabilities of the USB device.
3011dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * To communicate with the device, you open a {@link UsbDeviceConnection} for the device
3111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * and use {@link UsbRequest} to send and receive data on an endpoint.
3211dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * {@link UsbDeviceConnection#controlTransfer} is used for control requests on endpoint zero.
333aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez *
343aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference">
353aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3>
363aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about communicating with USB hardware, read the
373aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/usb/index.html">USB</a> developer guide.</p>
383aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div>
39e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */
40acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodpublic class UsbDevice implements Parcelable {
41e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
42e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    private static final String TAG = "UsbDevice";
43e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
44acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final String mName;
45575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    private final String mManufacturerName;
46575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    private final String mProductName;
47575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    private final String mSerialNumber;
48acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mVendorId;
49acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mProductId;
50acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mClass;
51acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mSubclass;
52acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mProtocol;
537531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    private Parcelable[] mConfigurations;
547531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood
557531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    // list of all interfaces on the device
567531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    private UsbInterface[] mInterfaces;
57e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
58e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
59e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * UsbDevice should only be instantiated by UsbService implementation
60e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @hide
61e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
62e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public UsbDevice(String name, int vendorId, int productId,
63575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw            int Class, int subClass, int protocol,
647531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            String manufacturerName, String productName, String serialNumber) {
65e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mName = name;
66e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mVendorId = vendorId;
67e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mProductId = productId;
68e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mClass = Class;
69e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mSubclass = subClass;
70e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mProtocol = protocol;
71575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        mManufacturerName = manufacturerName;
72575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        mProductName = productName;
73575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        mSerialNumber = serialNumber;
74e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
75e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
76e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
77e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the name of the device.
78e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * In the standard implementation, this is the path of the device file
79e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * for the device in the usbfs file system.
80e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
81e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device name
82e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
83e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public String getDeviceName() {
84e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mName;
85e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
86e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
87e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
88575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     * Returns the manufacturer name of the device.
89575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     *
90575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     * @return the manufacturer name
91575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     */
92575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    public String getManufacturerName() {
93575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        return mManufacturerName;
94575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    }
95575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw
96575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    /**
97575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     * Returns the product name of the device.
98575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     *
99575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     * @return the product name
100575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     */
101575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    public String getProductName() {
102575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        return mProductName;
103575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    }
104575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw
105575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    /**
106575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     * Returns the serial number of the device.
107575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     *
108575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     * @return the serial number name
109575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     */
110575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    public String getSerialNumber() {
111575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        return mSerialNumber;
112575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    }
113575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw
114575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    /**
115e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns a unique integer ID for the device.
116e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * This is a convenience for clients that want to use an integer to represent
117e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * the device, rather than the device name.
118e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * IDs are not persistent across USB disconnects.
119e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
120e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device ID
121e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
122e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getDeviceId() {
123e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return getDeviceId(mName);
124e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
125e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
126e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
127e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns a vendor ID for the device.
128e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
129e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device vendor ID
130e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
131e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getVendorId() {
132e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mVendorId;
133e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
134e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
135e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
136e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns a product ID for the device.
137e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
138e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device product ID
139e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
140e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getProductId() {
141e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mProductId;
142e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
143e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
144e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
145e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the devices's class field.
14611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Some useful constants for USB device classes can be found in {@link UsbConstants}.
147e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
148e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the devices's class
149e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
150e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getDeviceClass() {
151e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mClass;
152e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
153e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
154e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
155e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the device's subclass field.
156e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
157e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device's subclass
158e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
159e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getDeviceSubclass() {
160e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mSubclass;
161e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
162e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
163e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
16411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Returns the device's protocol field.
165e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
166e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device's protocol
167e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
168e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getDeviceProtocol() {
169e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mProtocol;
170e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
171e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
172e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
1737531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * Returns the number of {@link UsbConfiguration}s this device contains.
1747531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     *
1757531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * @return the number of configurations
1767531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     */
1777531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    public int getConfigurationCount() {
1787531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        return mConfigurations.length;
1797531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    }
1807531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood
1817531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    /**
1827531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * Returns the {@link UsbConfiguration} at the given index.
1837531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     *
1847531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * @return the configuration
1857531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     */
1867531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    public UsbConfiguration getConfiguration(int index) {
1877531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        return (UsbConfiguration)mConfigurations[index];
1887531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    }
1897531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood
1907531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    private UsbInterface[] getInterfaceList() {
1917531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        if (mInterfaces == null) {
1927531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            int configurationCount = mConfigurations.length;
1937531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            int interfaceCount = 0;
1947531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            for (int i = 0; i < configurationCount; i++) {
1957531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                UsbConfiguration configuration = (UsbConfiguration)mConfigurations[i];
1967531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                interfaceCount += configuration.getInterfaceCount();
1977531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            }
1987531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood
1997531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            mInterfaces = new UsbInterface[interfaceCount];
2007531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            int offset = 0;
2017531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            for (int i = 0; i < configurationCount; i++) {
2027531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                UsbConfiguration configuration = (UsbConfiguration)mConfigurations[i];
2037531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                interfaceCount = configuration.getInterfaceCount();
2047531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                for (int j = 0; j < interfaceCount; j++) {
2057531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                    mInterfaces[offset++] = configuration.getInterface(j);
2067531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                }
2077531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            }
2087531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        }
2097531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood
2107531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        return mInterfaces;
2117531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    }
2127531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood
2137531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    /**
21411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Returns the number of {@link UsbInterface}s this device contains.
2157531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * For devices with multiple configurations, you will probably want to use
2167531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * {@link UsbConfiguration#getInterfaceCount} instead.
217e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
218e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the number of interfaces
219e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
220e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getInterfaceCount() {
2217531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        return getInterfaceList().length;
222e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
223e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
224e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
22511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Returns the {@link UsbInterface} at the given index.
2267531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * For devices with multiple configurations, you will probably want to use
2277531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * {@link UsbConfiguration#getInterface} instead.
228e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
229e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the interface
230e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
231e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public UsbInterface getInterface(int index) {
2327531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        return getInterfaceList()[index];
2337531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    }
2347531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood
2357531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    /**
2367531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * Only used by UsbService implementation
2377531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     * @hide
2387531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood     */
2397531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood    public void setConfigurations(Parcelable[] configuration) {
2407531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        mConfigurations = configuration;
241e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
242e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
243e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    @Override
244e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public boolean equals(Object o) {
245e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        if (o instanceof UsbDevice) {
246e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return ((UsbDevice)o).mName.equals(mName);
247e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        } else if (o instanceof String) {
248e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return ((String)o).equals(mName);
249e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        } else {
250e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return false;
251e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
252e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
253e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
254e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    @Override
255c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood    public int hashCode() {
256c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood        return mName.hashCode();
257c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood    }
258c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood
259c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood    @Override
260e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public String toString() {
2617531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        StringBuilder builder = new StringBuilder("UsbDevice[mName=" + mName +
2627531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                ",mVendorId=" + mVendorId + ",mProductId=" + mProductId +
2637531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                ",mClass=" + mClass + ",mSubclass=" + mSubclass + ",mProtocol=" + mProtocol +
264575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw                ",mManufacturerName=" + mManufacturerName + ",mProductName=" + mProductName +
2657531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                ",mSerialNumber=" + mSerialNumber + ",mConfigurations=[");
2667531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        for (int i = 0; i < mConfigurations.length; i++) {
2677531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            builder.append("\n");
2687531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            builder.append(mConfigurations[i].toString());
2697531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        }
2707531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        builder.append("]");
2717531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        return builder.toString();
272e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
273e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
274e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public static final Parcelable.Creator<UsbDevice> CREATOR =
275e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        new Parcelable.Creator<UsbDevice>() {
276e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        public UsbDevice createFromParcel(Parcel in) {
277e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            String name = in.readString();
278e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int vendorId = in.readInt();
279e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int productId = in.readInt();
280e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int clasz = in.readInt();
281e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int subClass = in.readInt();
282e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int protocol = in.readInt();
283575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw            String manufacturerName = in.readString();
284575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw            String productName = in.readString();
285575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw            String serialNumber = in.readString();
2867531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            Parcelable[] configurations = in.readParcelableArray(UsbInterface.class.getClassLoader());
2877531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            UsbDevice device = new UsbDevice(name, vendorId, productId, clasz, subClass, protocol,
2887531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood                                 manufacturerName, productName, serialNumber);
2897531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            device.setConfigurations(configurations);
2907531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood            return device;
291e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
292e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
293e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        public UsbDevice[] newArray(int size) {
294e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return new UsbDevice[size];
295e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
296e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    };
297e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
298e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int describeContents() {
299e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return 0;
300e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
301e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
302e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public void writeToParcel(Parcel parcel, int flags) {
303e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeString(mName);
304e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mVendorId);
305e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mProductId);
306e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mClass);
307e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mSubclass);
308e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mProtocol);
309575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        parcel.writeString(mManufacturerName);
310575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        parcel.writeString(mProductName);
311575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        parcel.writeString(mSerialNumber);
3127531aa22355cf03f51def61ba67f1636bf85f408Mike Lockwood        parcel.writeParcelableArray(mConfigurations, 0);
313e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood   }
314e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
315e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public static int getDeviceId(String name) {
316e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return native_get_device_id(name);
317e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
318e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
319e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public static String getDeviceName(int id) {
320e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return native_get_device_name(id);
321e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
322e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
323e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    private static native int native_get_device_id(String name);
324e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    private static native String native_get_device_name(int id);
325e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood}
326