1fb290df3c9a6f37ec050163029e25844de2f8590RoboErik/*
2fb290df3c9a6f37ec050163029e25844de2f8590RoboErik * Copyright (C) 2013 The Android Open Source Project
3fb290df3c9a6f37ec050163029e25844de2f8590RoboErik *
4fb290df3c9a6f37ec050163029e25844de2f8590RoboErik * Licensed under the Apache License, Version 2.0 (the "License");
5fb290df3c9a6f37ec050163029e25844de2f8590RoboErik * you may not use this file except in compliance with the License.
6fb290df3c9a6f37ec050163029e25844de2f8590RoboErik * You may obtain a copy of the License at
7fb290df3c9a6f37ec050163029e25844de2f8590RoboErik *
8fb290df3c9a6f37ec050163029e25844de2f8590RoboErik *      http://www.apache.org/licenses/LICENSE-2.0
9fb290df3c9a6f37ec050163029e25844de2f8590RoboErik *
10fb290df3c9a6f37ec050163029e25844de2f8590RoboErik * Unless required by applicable law or agreed to in writing, software
11fb290df3c9a6f37ec050163029e25844de2f8590RoboErik * distributed under the License is distributed on an "AS IS" BASIS,
12fb290df3c9a6f37ec050163029e25844de2f8590RoboErik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fb290df3c9a6f37ec050163029e25844de2f8590RoboErik * See the License for the specific language governing permissions and
14fb290df3c9a6f37ec050163029e25844de2f8590RoboErik * limitations under the License.
15fb290df3c9a6f37ec050163029e25844de2f8590RoboErik */
16fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
17fb290df3c9a6f37ec050163029e25844de2f8590RoboErikpackage android.hardware.input;
18fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
1907ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagiimport java.util.Objects;
2007ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi
21fb290df3c9a6f37ec050163029e25844de2f8590RoboErikimport android.os.Parcel;
22fb290df3c9a6f37ec050163029e25844de2f8590RoboErikimport android.os.Parcelable;
2307ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagiimport android.text.TextUtils;
24fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
25fb290df3c9a6f37ec050163029e25844de2f8590RoboErik/**
26fb290df3c9a6f37ec050163029e25844de2f8590RoboErik * Wrapper for passing identifying information for input devices.
27fb290df3c9a6f37ec050163029e25844de2f8590RoboErik *
28fb290df3c9a6f37ec050163029e25844de2f8590RoboErik * @hide
29fb290df3c9a6f37ec050163029e25844de2f8590RoboErik */
30fb290df3c9a6f37ec050163029e25844de2f8590RoboErikpublic final class InputDeviceIdentifier implements Parcelable {
31fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    private final String mDescriptor;
32fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    private final int mVendorId;
33fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    private final int mProductId;
34fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
35fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    public InputDeviceIdentifier(String descriptor, int vendorId, int productId) {
36fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        this.mDescriptor = descriptor;
37fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        this.mVendorId = vendorId;
38fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        this.mProductId = productId;
39fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    }
40fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
41fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    private InputDeviceIdentifier(Parcel src) {
42fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        mDescriptor = src.readString();
43fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        mVendorId = src.readInt();
44fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        mProductId = src.readInt();
45fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    }
46fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
47fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    @Override
48fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    public int describeContents() {
49fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        return 0;
50fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    }
51fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
52fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    @Override
53fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    public void writeToParcel(Parcel dest, int flags) {
54fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        dest.writeString(mDescriptor);
55fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        dest.writeInt(mVendorId);
56fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        dest.writeInt(mProductId);
57fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    }
58fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
59fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    public String getDescriptor() {
60fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        return mDescriptor;
61fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    }
62fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
63fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    public int getVendorId() {
64fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        return mVendorId;
65fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    }
66fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
67fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    public int getProductId() {
68fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        return mProductId;
69fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    }
70fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
7107ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi    @Override
7207ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi    public boolean equals(Object o) {
7307ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi        if (this == o) return true;
7407ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi        if (o == null || !(o instanceof InputDeviceIdentifier)) return false;
7507ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi
7607ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi        final InputDeviceIdentifier that = (InputDeviceIdentifier) o;
7707ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi        return ((mVendorId == that.mVendorId) && (mProductId == that.mProductId)
7807ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi                && TextUtils.equals(mDescriptor, that.mDescriptor));
7907ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi    }
8007ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi
8107ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi    @Override
8207ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi    public int hashCode() {
8307ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi        return Objects.hash(mDescriptor, mVendorId, mProductId);
8407ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi    }
8507ff292dcd1611a503b1a2fbe01920eebd712451Keisuke Kuroyanagi
86fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    public static final Parcelable.Creator<InputDeviceIdentifier> CREATOR =
87fb290df3c9a6f37ec050163029e25844de2f8590RoboErik            new Parcelable.Creator<InputDeviceIdentifier>() {
88fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
89fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        @Override
90fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        public InputDeviceIdentifier createFromParcel(Parcel source) {
91fb290df3c9a6f37ec050163029e25844de2f8590RoboErik            return new InputDeviceIdentifier(source);
92fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        }
93fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
94fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        @Override
95fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        public InputDeviceIdentifier[] newArray(int size) {
96fb290df3c9a6f37ec050163029e25844de2f8590RoboErik            return new InputDeviceIdentifier[size];
97fb290df3c9a6f37ec050163029e25844de2f8590RoboErik        }
98fb290df3c9a6f37ec050163029e25844de2f8590RoboErik
99fb290df3c9a6f37ec050163029e25844de2f8590RoboErik    };
100fb290df3c9a6f37ec050163029e25844de2f8590RoboErik}
101