UsbDevice.java revision 575ca85c147f1521480ea98aca13aa3b1ec38884
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.Bundle;
20e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.Parcel;
21e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.os.Parcelable;
22e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport android.util.Log;
23e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
24e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodimport java.io.FileDescriptor;
25e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
26e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood/**
2711dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * This class represents a USB device attached to the android device with the android device
2811dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * acting as the USB host.
2911dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Each device contains one or more {@link UsbInterface}s, each of which contains a number of
3011dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * {@link UsbEndpoint}s (the channels via which data is transmitted over USB).
3111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood *
3211dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * <p> This class contains information (along with {@link UsbInterface} and {@link UsbEndpoint})
3311dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * that describes the capabilities of the USB device.
3411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * To communicate with the device, you open a {@link UsbDeviceConnection} for the device
3511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * and use {@link UsbRequest} to send and receive data on an endpoint.
3611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * {@link UsbDeviceConnection#controlTransfer} is used for control requests on endpoint zero.
373aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez *
383aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference">
393aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3>
403aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about communicating with USB hardware, read the
413aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/usb/index.html">USB</a> developer guide.</p>
423aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div>
43e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood */
44acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodpublic class UsbDevice implements Parcelable {
45e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
46e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    private static final String TAG = "UsbDevice";
47e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
48acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final String mName;
49575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    private final String mManufacturerName;
50575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    private final String mProductName;
51575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    private final String mSerialNumber;
52acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mVendorId;
53acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mProductId;
54acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mClass;
55acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mSubclass;
56acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final int mProtocol;
57acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    private final Parcelable[] mInterfaces;
58e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
59e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
60e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * UsbDevice should only be instantiated by UsbService implementation
61e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @hide
62e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
63e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public UsbDevice(String name, int vendorId, int productId,
64575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw            int Class, int subClass, int protocol,
65575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw            String manufacturerName, String productName, String serialNumber,
66575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw            Parcelable[] interfaces) {
67e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mName = name;
68e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mVendorId = vendorId;
69e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mProductId = productId;
70e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mClass = Class;
71e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mSubclass = subClass;
72e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mProtocol = protocol;
73575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        mManufacturerName = manufacturerName;
74575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        mProductName = productName;
75575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        mSerialNumber = serialNumber;
76e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        mInterfaces = interfaces;
77e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
78e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
79e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
80e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the name of the device.
81e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * In the standard implementation, this is the path of the device file
82e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * for the device in the usbfs file system.
83e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
84e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device name
85e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
86e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public String getDeviceName() {
87e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mName;
88e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
89e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
90e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
91575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     * Returns the manufacturer name of the device.
92575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     *
93575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     * @return the manufacturer name
94575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     */
95575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    public String getManufacturerName() {
96575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        return mManufacturerName;
97575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    }
98575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw
99575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    /**
100575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     * Returns the product name of the device.
101575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     *
102575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     * @return the product name
103575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     */
104575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    public String getProductName() {
105575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        return mProductName;
106575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    }
107575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw
108575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    /**
109575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     * Returns the serial number of the device.
110575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     *
111575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     * @return the serial number name
112575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw     */
113575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    public String getSerialNumber() {
114575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        return mSerialNumber;
115575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    }
116575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw
117575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw    /**
118e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns a unique integer ID for the device.
119e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * This is a convenience for clients that want to use an integer to represent
120e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * the device, rather than the device name.
121e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * IDs are not persistent across USB disconnects.
122e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
123e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device ID
124e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
125e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getDeviceId() {
126e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return getDeviceId(mName);
127e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
128e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
129e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
130e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns a vendor ID for the device.
131e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
132e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device vendor ID
133e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
134e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getVendorId() {
135e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mVendorId;
136e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
137e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
138e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
139e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns a product ID for the device.
140e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
141e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device product ID
142e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
143e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getProductId() {
144e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mProductId;
145e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
146e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
147e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
148e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the devices's class field.
14911dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Some useful constants for USB device classes can be found in {@link UsbConstants}.
150e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
151e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the devices's class
152e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
153e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getDeviceClass() {
154e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mClass;
155e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
156e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
157e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
158e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * Returns the device's subclass field.
159e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
160e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device's subclass
161e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
162e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getDeviceSubclass() {
163e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mSubclass;
164e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
165e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
166e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
16711dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Returns the device's protocol field.
168e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
169e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the device's protocol
170e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
171e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getDeviceProtocol() {
172e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mProtocol;
173e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
174e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
175e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
17611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Returns the number of {@link UsbInterface}s this device contains.
177e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
178e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the number of interfaces
179e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
180e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int getInterfaceCount() {
181e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return mInterfaces.length;
182e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
183e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
184e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    /**
18511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Returns the {@link UsbInterface} at the given index.
186e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     *
187e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     * @return the interface
188e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood     */
189e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public UsbInterface getInterface(int index) {
190e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return (UsbInterface)mInterfaces[index];
191e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
192e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
193e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    @Override
194e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public boolean equals(Object o) {
195e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        if (o instanceof UsbDevice) {
196e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return ((UsbDevice)o).mName.equals(mName);
197e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        } else if (o instanceof String) {
198e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return ((String)o).equals(mName);
199e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        } else {
200e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return false;
201e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
202e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
203e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
204e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    @Override
205c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood    public int hashCode() {
206c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood        return mName.hashCode();
207c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood    }
208c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood
209c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood    @Override
210e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public String toString() {
211e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return "UsbDevice[mName=" + mName + ",mVendorId=" + mVendorId +
212e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                ",mProductId=" + mProductId + ",mClass=" + mClass +
213e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                ",mSubclass=" + mSubclass + ",mProtocol=" + mProtocol +
214575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw                ",mManufacturerName=" + mManufacturerName + ",mProductName=" + mProductName +
215575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw                ",mSerialNumber=" + mSerialNumber + ",mInterfaces=" + mInterfaces + "]";
216e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
217e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
218e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public static final Parcelable.Creator<UsbDevice> CREATOR =
219e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        new Parcelable.Creator<UsbDevice>() {
220e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        public UsbDevice createFromParcel(Parcel in) {
221e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            String name = in.readString();
222e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int vendorId = in.readInt();
223e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int productId = in.readInt();
224e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int clasz = in.readInt();
225e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int subClass = in.readInt();
226e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            int protocol = in.readInt();
227575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw            String manufacturerName = in.readString();
228575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw            String productName = in.readString();
229575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw            String serialNumber = in.readString();
230e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            Parcelable[] interfaces = in.readParcelableArray(UsbInterface.class.getClassLoader());
231575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw            return new UsbDevice(name, vendorId, productId, clasz, subClass, protocol,
232575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw                                 manufacturerName, productName, serialNumber, interfaces);
233e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
234e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
235e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        public UsbDevice[] newArray(int size) {
236e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood            return new UsbDevice[size];
237e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        }
238e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    };
239e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
240e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public int describeContents() {
241e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return 0;
242e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
243e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
244e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public void writeToParcel(Parcel parcel, int flags) {
245e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeString(mName);
246e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mVendorId);
247e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mProductId);
248e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mClass);
249e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mSubclass);
250e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeInt(mProtocol);
251575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        parcel.writeString(mManufacturerName);
252575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        parcel.writeString(mProductName);
253575ca85c147f1521480ea98aca13aa3b1ec38884Robin Cutshaw        parcel.writeString(mSerialNumber);
254e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        parcel.writeParcelableArray(mInterfaces, 0);
255e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood   }
256e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
257e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public static int getDeviceId(String name) {
258e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return native_get_device_id(name);
259e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
260e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
261e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    public static String getDeviceName(int id) {
262e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood        return native_get_device_name(id);
263e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    }
264e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
265e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    private static native int native_get_device_id(String name);
266e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood    private static native String native_get_device_name(int id);
267e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood}
268