1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.hardware.usb;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.os.Parcel;
22 import android.os.Parcelable;
23 import com.android.internal.util.Preconditions;
24 
25 /**
26  * A class representing a USB accessory, which is an external hardware component
27  * that communicates with an android application over USB.
28  * The accessory is the USB host and android the device side of the USB connection.
29  *
30  * <p>When the accessory connects, it reports its manufacturer and model names,
31  * the version of the accessory, and a user visible description of the accessory to the device.
32  * The manufacturer, model and version strings are used by the USB Manager to choose
33  * an appropriate application for the accessory.
34  * The accessory may optionally provide a unique serial number
35  * and a URL to for the accessory's website to the device as well.
36  *
37  * <p>An instance of this class is sent to the application via the
38  * {@link UsbManager#ACTION_USB_ACCESSORY_ATTACHED} Intent.
39  * The application can then call {@link UsbManager#openAccessory} to open a file descriptor
40  * for reading and writing data to and from the accessory.
41  *
42  * <div class="special reference">
43  * <h3>Developer Guides</h3>
44  * <p>For more information about communicating with USB hardware, read the
45  * <a href="{@docRoot}guide/topics/usb/index.html">USB</a> developer guide.</p>
46  * </div>
47  */
48 public class UsbAccessory implements Parcelable {
49 
50     private static final String TAG = "UsbAccessory";
51 
52     private final @NonNull String mManufacturer;
53     private final @NonNull String mModel;
54     private final @Nullable String mDescription;
55     private final @Nullable String mVersion;
56     private final @Nullable String mUri;
57     private final @Nullable String mSerial;
58 
59     /** @hide */
60     public static final int MANUFACTURER_STRING = 0;
61     /** @hide */
62     public static final int MODEL_STRING = 1;
63     /** @hide */
64     public static final int DESCRIPTION_STRING = 2;
65     /** @hide */
66     public static final int VERSION_STRING = 3;
67     /** @hide */
68     public static final int URI_STRING = 4;
69     /** @hide */
70     public static final int SERIAL_STRING = 5;
71 
72     /**
73      * UsbAccessory should only be instantiated by UsbService implementation
74      * @hide
75      */
UsbAccessory(@onNull String manufacturer, @NonNull String model, @Nullable String description, @Nullable String version, @Nullable String uri, @Nullable String serial)76     public UsbAccessory(@NonNull String manufacturer, @NonNull String model,
77             @Nullable String description, @Nullable String version, @Nullable String uri,
78             @Nullable String serial) {
79         mManufacturer = Preconditions.checkNotNull(manufacturer);
80         mModel = Preconditions.checkNotNull(model);
81         mDescription = description;
82         mVersion = version;
83         mUri = uri;
84         mSerial = serial;
85     }
86 
87     /**
88      * UsbAccessory should only be instantiated by UsbService implementation
89      * @hide
90      */
UsbAccessory(String[] strings)91     public UsbAccessory(String[] strings) {
92         this(strings[MANUFACTURER_STRING], strings[MODEL_STRING], strings[DESCRIPTION_STRING],
93                 strings[VERSION_STRING], strings[URI_STRING], strings[SERIAL_STRING]);
94     }
95 
96     /**
97      * Returns the manufacturer name of the accessory.
98      *
99      * @return the accessory manufacturer
100      */
getManufacturer()101     public @NonNull String getManufacturer() {
102         return mManufacturer;
103     }
104 
105     /**
106      * Returns the model name of the accessory.
107      *
108      * @return the accessory model
109      */
getModel()110     public @NonNull String getModel() {
111         return mModel;
112     }
113 
114     /**
115      * Returns a user visible description of the accessory.
116      *
117      * @return the accessory description, or {@code null} if not set
118      */
getDescription()119     public @Nullable String getDescription() {
120         return mDescription;
121     }
122 
123     /**
124      * Returns the version of the accessory.
125      *
126      * @return the accessory version, or {@code null} if not set
127      */
getVersion()128     public @Nullable String getVersion() {
129         return mVersion;
130     }
131 
132     /**
133      * Returns the URI for the accessory.
134      * This is an optional URI that might show information about the accessory
135      * or provide the option to download an application for the accessory
136      *
137      * @return the accessory URI, or {@code null} if not set
138      */
getUri()139     public @Nullable String getUri() {
140         return mUri;
141     }
142 
143     /**
144      * Returns the unique serial number for the accessory.
145      * This is an optional serial number that can be used to differentiate
146      * between individual accessories of the same model and manufacturer
147      *
148      * @return the unique serial number, or {@code null} if not set
149      */
getSerial()150     public @Nullable String getSerial() {
151         return mSerial;
152     }
153 
compare(String s1, String s2)154     private static boolean compare(String s1, String s2) {
155         if (s1 == null) return (s2 == null);
156         return s1.equals(s2);
157     }
158 
159     @Override
equals(Object obj)160     public boolean equals(Object obj) {
161         if (obj instanceof UsbAccessory) {
162             UsbAccessory accessory = (UsbAccessory)obj;
163             return (compare(mManufacturer, accessory.getManufacturer()) &&
164                     compare(mModel, accessory.getModel()) &&
165                     compare(mDescription, accessory.getDescription()) &&
166                     compare(mVersion, accessory.getVersion()) &&
167                     compare(mUri, accessory.getUri()) &&
168                     compare(mSerial, accessory.getSerial()));
169         }
170         return false;
171     }
172 
173     @Override
hashCode()174     public int hashCode() {
175         return mManufacturer.hashCode() ^ mModel.hashCode() ^
176                 (mDescription == null ? 0 : mDescription.hashCode()) ^
177                 (mVersion == null ? 0 : mVersion.hashCode()) ^
178                 (mUri == null ? 0 : mUri.hashCode()) ^ (mSerial == null ? 0 : mSerial.hashCode());
179     }
180 
181     @Override
toString()182     public String toString() {
183         return "UsbAccessory[mManufacturer=" + mManufacturer +
184                             ", mModel=" + mModel +
185                             ", mDescription=" + mDescription +
186                             ", mVersion=" + mVersion +
187                             ", mUri=" + mUri +
188                             ", mSerial=" + mSerial + "]";
189     }
190 
191     public static final Parcelable.Creator<UsbAccessory> CREATOR =
192         new Parcelable.Creator<UsbAccessory>() {
193         public UsbAccessory createFromParcel(Parcel in) {
194             String manufacturer = in.readString();
195             String model = in.readString();
196             String description = in.readString();
197             String version = in.readString();
198             String uri = in.readString();
199             String serial = in.readString();
200             return new UsbAccessory(manufacturer, model, description, version, uri, serial);
201         }
202 
203         public UsbAccessory[] newArray(int size) {
204             return new UsbAccessory[size];
205         }
206     };
207 
describeContents()208     public int describeContents() {
209         return 0;
210     }
211 
writeToParcel(Parcel parcel, int flags)212     public void writeToParcel(Parcel parcel, int flags) {
213         parcel.writeString(mManufacturer);
214         parcel.writeString(mModel);
215         parcel.writeString(mDescription);
216         parcel.writeString(mVersion);
217         parcel.writeString(mUri);
218         parcel.writeString(mSerial);
219    }
220 }
221