19182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood/* 29182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Copyright (C) 2011 The Android Open Source Project 39182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 49182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 59182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * you may not use this file except in compliance with the License. 69182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * You may obtain a copy of the License at 79182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 89182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 99182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 109182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Unless required by applicable law or agreed to in writing, software 119182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 129182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * See the License for the specific language governing permissions and 149182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * limitations under the License. 159182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 169182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 17c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodpackage android.hardware.usb; 189182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 19f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmannimport android.annotation.NonNull; 20f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmannimport android.annotation.Nullable; 219182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwoodimport android.os.Parcel; 229182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwoodimport android.os.Parcelable; 23f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmannimport com.android.internal.util.Preconditions; 249182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 259182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood/** 2611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * A class representing a USB accessory, which is an external hardware component 2711dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * that communicates with an android application over USB. 2811dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * The accessory is the USB host and android the device side of the USB connection. 2911dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * 3011dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * <p>When the accessory connects, it reports its manufacturer and model names, 3111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * the version of the accessory, and a user visible description of the accessory to the device. 3211dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * The manufacturer, model and version strings are used by the USB Manager to choose 3311dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * an appropriate application for the accessory. 3411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * The accessory may optionally provide a unique serial number 3511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * and a URL to for the accessory's website to the device as well. 3611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * 3711dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * <p>An instance of this class is sent to the application via the 3811dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * {@link UsbManager#ACTION_USB_ACCESSORY_ATTACHED} Intent. 3911dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * The application can then call {@link UsbManager#openAccessory} to open a file descriptor 4011dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * for reading and writing data to and from the accessory. 413aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * 423aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference"> 433aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3> 443aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about communicating with USB hardware, read the 453aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/usb/index.html">USB</a> developer guide.</p> 463aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div> 479182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 48c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodpublic class UsbAccessory implements Parcelable { 499182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 509182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood private static final String TAG = "UsbAccessory"; 519182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 52f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann private final @NonNull String mManufacturer; 53f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann private final @NonNull String mModel; 54f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann private final @Nullable String mDescription; 55f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann private final @Nullable String mVersion; 56f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann private final @Nullable String mUri; 57f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann private final @Nullable String mSerial; 589182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 59166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood /** @hide */ 60166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood public static final int MANUFACTURER_STRING = 0; 61166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood /** @hide */ 62166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood public static final int MODEL_STRING = 1; 63166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood /** @hide */ 64166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood public static final int DESCRIPTION_STRING = 2; 65166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood /** @hide */ 66166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood public static final int VERSION_STRING = 3; 67166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood /** @hide */ 68166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood public static final int URI_STRING = 4; 69166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood /** @hide */ 70166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood public static final int SERIAL_STRING = 5; 71166b05e0ce913711d27ce1a116b3f1fd906822e4Mike Lockwood 729182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 739182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * UsbAccessory should only be instantiated by UsbService implementation 749182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @hide 759182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 76f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann public UsbAccessory(@NonNull String manufacturer, @NonNull String model, 77f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann @Nullable String description, @Nullable String version, @Nullable String uri, 78f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann @Nullable String serial) { 79f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann mManufacturer = Preconditions.checkNotNull(manufacturer); 80f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann mModel = Preconditions.checkNotNull(model); 81ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood mDescription = description; 829182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood mVersion = version; 83ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood mUri = uri; 84015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood mSerial = serial; 859182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 869182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 879182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 889182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * UsbAccessory should only be instantiated by UsbService implementation 899182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @hide 909182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 919182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public UsbAccessory(String[] strings) { 92f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann this(strings[MANUFACTURER_STRING], strings[MODEL_STRING], strings[DESCRIPTION_STRING], 93f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann strings[VERSION_STRING], strings[URI_STRING], strings[SERIAL_STRING]); 949182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 959182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 969182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 9711dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood * Returns the manufacturer name of the accessory. 989182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 999182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @return the accessory manufacturer 1009182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 101f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann public @NonNull String getManufacturer() { 1029182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return mManufacturer; 1039182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 1049182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 1059182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 1069182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Returns the model name of the accessory. 1079182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 1089182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * @return the accessory model 1099182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 110f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann public @NonNull String getModel() { 1119182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return mModel; 1129182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 1139182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 1149182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 115ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood * Returns a user visible description of the accessory. 1169182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 117f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann * @return the accessory description, or {@code null} if not set 1189182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 119f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann public @Nullable String getDescription() { 120ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood return mDescription; 1219182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 1229182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 1239182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood /** 1249182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * Returns the version of the accessory. 1259182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood * 126f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann * @return the accessory version, or {@code null} if not set 1279182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood */ 128f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann public @Nullable String getVersion() { 1299182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return mVersion; 1309182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 1319182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 132ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood /** 133ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood * Returns the URI for the accessory. 134ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood * This is an optional URI that might show information about the accessory 135ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood * or provide the option to download an application for the accessory 136ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood * 137f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann * @return the accessory URI, or {@code null} if not set 138ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood */ 139f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann public @Nullable String getUri() { 140ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood return mUri; 141ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood } 142ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood 143015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood /** 144015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood * Returns the unique serial number for the accessory. 145015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood * This is an optional serial number that can be used to differentiate 146015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood * between individual accessories of the same model and manufacturer 147015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood * 148f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann * @return the unique serial number, or {@code null} if not set 149015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood */ 150f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann public @Nullable String getSerial() { 151015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood return mSerial; 152015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood } 153015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood 15402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood private static boolean compare(String s1, String s2) { 15502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood if (s1 == null) return (s2 == null); 15602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood return s1.equals(s2); 15702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 15802eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 15902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood @Override 16002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood public boolean equals(Object obj) { 16102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood if (obj instanceof UsbAccessory) { 16202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood UsbAccessory accessory = (UsbAccessory)obj; 16302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood return (compare(mManufacturer, accessory.getManufacturer()) && 16402eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood compare(mModel, accessory.getModel()) && 165ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood compare(mDescription, accessory.getDescription()) && 166ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood compare(mVersion, accessory.getVersion()) && 167015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood compare(mUri, accessory.getUri()) && 168015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood compare(mSerial, accessory.getSerial())); 16902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 17002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood return false; 17102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 17202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood 1739182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood @Override 174c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood public int hashCode() { 175f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann return mManufacturer.hashCode() ^ mModel.hashCode() ^ 176ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood (mDescription == null ? 0 : mDescription.hashCode()) ^ 177ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood (mVersion == null ? 0 : mVersion.hashCode()) ^ 178f2d83edc2604983b03bd0c7dd92c2c5d1c1378dcPhilip P. Moltmann (mUri == null ? 0 : mUri.hashCode()) ^ (mSerial == null ? 0 : mSerial.hashCode()); 179c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood } 180c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood 181c6f23e8521dedac7a07119031913235be3ca37c3Mike Lockwood @Override 1829182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public String toString() { 1839182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return "UsbAccessory[mManufacturer=" + mManufacturer + 1849182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood ", mModel=" + mModel + 185ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood ", mDescription=" + mDescription + 186ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood ", mVersion=" + mVersion + 187015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood ", mUri=" + mUri + 188015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood ", mSerial=" + mSerial + "]"; 1899182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 1909182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 1919182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public static final Parcelable.Creator<UsbAccessory> CREATOR = 1929182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood new Parcelable.Creator<UsbAccessory>() { 1939182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public UsbAccessory createFromParcel(Parcel in) { 1949182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood String manufacturer = in.readString(); 1959182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood String model = in.readString(); 196ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood String description = in.readString(); 1979182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood String version = in.readString(); 198ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood String uri = in.readString(); 199015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood String serial = in.readString(); 200015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood return new UsbAccessory(manufacturer, model, description, version, uri, serial); 2019182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2029182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 2039182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public UsbAccessory[] newArray(int size) { 2049182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return new UsbAccessory[size]; 2059182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2069182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood }; 2079182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 2089182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public int describeContents() { 2099182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood return 0; 2109182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2119182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood 2129182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood public void writeToParcel(Parcel parcel, int flags) { 2139182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood parcel.writeString(mManufacturer); 2149182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood parcel.writeString(mModel); 215ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood parcel.writeString(mDescription); 2169182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood parcel.writeString(mVersion); 217ac36d7c715a9cd793b2dce6de547594810101c3aMike Lockwood parcel.writeString(mUri); 218015b1ecaec27b7cf5f1a78099d9ae34a0c3169f2Mike Lockwood parcel.writeString(mSerial); 2199182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood } 2209182d3c4eb1f9065cb33df5a3594969dd0d42accMike Lockwood} 221