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