1d37b47419005587c52ca4c099432327b7f06478dYigit Boyar/*
2d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * Copyright (C) 2015 The Android Open Source Project
3d37b47419005587c52ca4c099432327b7f06478dYigit Boyar *
4d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * you may not use this file except in compliance with the License.
6d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * You may obtain a copy of the License at
7d37b47419005587c52ca4c099432327b7f06478dYigit Boyar *
8d37b47419005587c52ca4c099432327b7f06478dYigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9d37b47419005587c52ca4c099432327b7f06478dYigit Boyar *
10d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * Unless required by applicable law or agreed to in writing, software
11d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * See the License for the specific language governing permissions and
14d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * limitations under the License.
15d37b47419005587c52ca4c099432327b7f06478dYigit Boyar */
16d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
17d37b47419005587c52ca4c099432327b7f06478dYigit Boyarpackage android.databinding;
18d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
19d37b47419005587c52ca4c099432327b7f06478dYigit Boyarimport android.os.Parcel;
20d37b47419005587c52ca4c099432327b7f06478dYigit Boyarimport android.os.Parcelable;
21d37b47419005587c52ca4c099432327b7f06478dYigit Boyarimport android.test.AndroidTestCase;
22d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
23d37b47419005587c52ca4c099432327b7f06478dYigit Boyarimport java.io.ByteArrayInputStream;
24d37b47419005587c52ca4c099432327b7f06478dYigit Boyarimport java.io.ByteArrayOutputStream;
25d37b47419005587c52ca4c099432327b7f06478dYigit Boyarimport java.io.Closeable;
26d37b47419005587c52ca4c099432327b7f06478dYigit Boyarimport java.io.IOException;
27d37b47419005587c52ca4c099432327b7f06478dYigit Boyarimport java.io.ObjectInputStream;
28d37b47419005587c52ca4c099432327b7f06478dYigit Boyarimport java.io.ObjectOutputStream;
29d37b47419005587c52ca4c099432327b7f06478dYigit Boyarimport java.io.Serializable;
30d37b47419005587c52ca4c099432327b7f06478dYigit Boyarimport java.util.UUID;
31d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
32d37b47419005587c52ca4c099432327b7f06478dYigit Boyarpublic class ObservableParcelTest extends AndroidTestCase {
33d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testParcelInt() {
34d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableInt observableInt = new ObservableInt();
35d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        observableInt.set(Integer.MAX_VALUE - 1);
36d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableInt read = parcelAndUnparcel(observableInt, ObservableInt.class);
37d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(Integer.MAX_VALUE - 1, read.get());
38d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
39d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
40d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testParcelBoolean() {
41d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableBoolean obj = new ObservableBoolean(false);
42d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableBoolean read = parcelAndUnparcel(obj, ObservableBoolean.class);
43d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertFalse(read.get());
44d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
45d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableBoolean obj2 = new ObservableBoolean(true);
46d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableBoolean read2 = parcelAndUnparcel(obj2, ObservableBoolean.class);
47d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertTrue(read2.get());
48d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
49d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
50d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testParcelByte() {
51d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableByte obj = new ObservableByte((byte) 7);
52d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableByte read = parcelAndUnparcel(obj, ObservableByte.class);
53d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals((byte) 7, read.get());
54d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
55d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
56d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testParcelChar() {
57d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableChar obj = new ObservableChar('y');
58d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableChar read = parcelAndUnparcel(obj, ObservableChar.class);
59d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals('y', read.get());
60d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
61d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
62d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testParcelDouble() {
63d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableDouble obj = new ObservableDouble(Double.MAX_VALUE);
64d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableDouble read = parcelAndUnparcel(obj, ObservableDouble.class);
65d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(Double.MAX_VALUE, read.get());
66d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
67d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
68d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testParcelFloat() {
69d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableFloat obj = new ObservableFloat(Float.MIN_VALUE);
70d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableFloat read = parcelAndUnparcel(obj, ObservableFloat.class);
71d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(Float.MIN_VALUE, read.get());
72d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
73d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
74d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testParcelParcel() {
75d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        MyParcelable myParcelable = new MyParcelable(5, "foo");
76d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableParcelable<MyParcelable> obj = new ObservableParcelable<>(myParcelable);
77d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableParcelable read = parcelAndUnparcel(obj,
78d37b47419005587c52ca4c099432327b7f06478dYigit Boyar                ObservableParcelable.class);
79d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(myParcelable, read.get());
80d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
81d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
82d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testParcelLong() {
83d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableLong obj = new ObservableLong(Long.MAX_VALUE - 1);
84d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableLong read = parcelAndUnparcel(obj, ObservableLong.class);
85d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(Long.MAX_VALUE - 1, read.get());
86d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
87d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
88d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testParcelShort() {
89d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableShort obj = new ObservableShort(Short.MIN_VALUE);
90d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableShort read = parcelAndUnparcel(obj, ObservableShort.class);
91d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(Short.MIN_VALUE, read.get());
92d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
93d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
94d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testSerializeInt() throws IOException, ClassNotFoundException {
95d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableInt observableInt = new ObservableInt();
96d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        observableInt.set(Integer.MAX_VALUE - 1);
97d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableInt read = serializeAndDeserialize(observableInt, ObservableInt.class);
98d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(Integer.MAX_VALUE - 1, read.get());
99d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
100d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
101d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testSerializeBoolean() throws IOException, ClassNotFoundException {
102d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableBoolean obj = new ObservableBoolean(false);
103d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableBoolean read = serializeAndDeserialize(obj, ObservableBoolean.class);
104d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertFalse(read.get());
105d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableBoolean obj2 = new ObservableBoolean(true);
106d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableBoolean read2 = serializeAndDeserialize(obj2, ObservableBoolean.class);
107d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertTrue(read2.get());
108d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
109d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
110d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testSerializeByte() throws IOException, ClassNotFoundException {
111d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableByte obj = new ObservableByte((byte) 7);
112d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableByte read = serializeAndDeserialize(obj, ObservableByte.class);
113d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals((byte) 7, read.get());
114d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
115d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
116d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testSerializeChar() throws IOException, ClassNotFoundException {
117d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableChar obj = new ObservableChar('y');
118d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableChar read = serializeAndDeserialize(obj, ObservableChar.class);
119d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals('y', read.get());
120d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
121d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
122d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testSerializeDouble() throws IOException, ClassNotFoundException {
123d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableDouble obj = new ObservableDouble(Double.MAX_VALUE);
124d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableDouble read = serializeAndDeserialize(obj, ObservableDouble.class);
125d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(Double.MAX_VALUE, read.get());
126d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
127d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
128d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testSerializeFloat() throws IOException, ClassNotFoundException {
129d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableFloat obj = new ObservableFloat(Float.MIN_VALUE);
130d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableFloat read = serializeAndDeserialize(obj, ObservableFloat.class);
131d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(Float.MIN_VALUE, read.get());
132d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
133d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
134d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testSerializeParcel() throws IOException, ClassNotFoundException {
135d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        MyParcelable myParcelable = new MyParcelable(5, "foo");
136d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableParcelable<MyParcelable> obj = new ObservableParcelable<>(myParcelable);
137d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableParcelable read = serializeAndDeserialize(obj,
138d37b47419005587c52ca4c099432327b7f06478dYigit Boyar                ObservableParcelable.class);
139d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(myParcelable, read.get());
140d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
141d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
142d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testSerializeField() throws IOException, ClassNotFoundException {
143d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        MyParcelable myParcelable = new MyParcelable(5, "foo");
144d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableField<MyParcelable> obj = new ObservableField<>(myParcelable);
145d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableField read = serializeAndDeserialize(obj, ObservableField.class);
146d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(myParcelable, read.get());
147d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
148d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
149d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testSerializeLong() throws IOException, ClassNotFoundException {
150d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableLong obj = new ObservableLong(Long.MAX_VALUE - 1);
151d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableLong read = serializeAndDeserialize(obj, ObservableLong.class);
152d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(Long.MAX_VALUE - 1, read.get());
153d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
154d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
155d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public void testSerializeShort() throws IOException, ClassNotFoundException {
156d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableShort obj = new ObservableShort(Short.MIN_VALUE);
157d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObservableShort read = serializeAndDeserialize(obj, ObservableShort.class);
158d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(Short.MIN_VALUE, read.get());
159d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
160d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
161d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    private <T extends Parcelable> T parcelAndUnparcel(T t, Class<T> klass) {
162d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        Parcel parcel = Parcel.obtain();
163d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        parcel.writeParcelable(t, 0);
164d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        // we append a suffix to the parcelable to test out of bounds
165d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        String parcelSuffix = UUID.randomUUID().toString();
166d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        parcel.writeString(parcelSuffix);
167d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        // get ready to read
168d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        parcel.setDataPosition(0);
169d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        Parcelable parcelable = parcel.readParcelable(getClass().getClassLoader());
170d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertNotNull(parcelable);
171d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(klass, parcelable.getClass());
172d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        assertEquals(parcelSuffix, parcel.readString());
173d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        return (T) parcelable;
174d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
175d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
176d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    private <T> T serializeAndDeserialize(T t, Class<T> klass)
177d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            throws IOException, ClassNotFoundException {
178d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObjectOutputStream oos = null;
179d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ByteArrayOutputStream bos = null;
180d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        String suffix = UUID.randomUUID().toString();
181d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        try {
182d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            bos = new ByteArrayOutputStream();
183d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            oos = new ObjectOutputStream(bos);
184d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            oos.writeObject(t);
185d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            oos.writeObject(suffix);
186d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        } finally {
187d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            closeQuietly(bos);
188d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            closeQuietly(oos);
189d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        }
190d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ByteArrayInputStream bis = null;
191d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        ObjectInputStream ois = null;
192d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        try {
193d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            bis = new ByteArrayInputStream(bos.toByteArray());
194d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            ois = new ObjectInputStream(bis);
195d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            Object o = ois.readObject();
196d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            assertEquals(klass, o.getClass());
197d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            assertEquals(suffix, ois.readObject());
198d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            return (T) o;
199d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        } finally {
200d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            closeQuietly(bis);
201d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            closeQuietly(ois);
202d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        }
203d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
204d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
205d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    private static void closeQuietly(Closeable closeable) {
206d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        try {
207d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            if (closeable != null) {
208d37b47419005587c52ca4c099432327b7f06478dYigit Boyar                closeable.close();
209d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            }
210d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        } catch (IOException ignored) {
211d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        }
212d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
213d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
214d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    public static class MyParcelable implements Parcelable, Serializable {
215d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        int x;
216d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        String y;
217d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
218d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        public MyParcelable() {
219d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        }
220d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
221d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        public MyParcelable(int x, String y) {
222d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            this.x = x;
223d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            this.y = y;
224d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        }
225d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
226d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        @Override
227d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        public int describeContents() {
228d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            return 0;
229d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        }
230d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
231d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        @Override
232d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        public void writeToParcel(Parcel dest, int flags) {
233d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            dest.writeInt(x);
234d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            dest.writeString(y);
235d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        }
236d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
237d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        @Override
238d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        public boolean equals(Object o) {
239d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            if (this == o) {
240d37b47419005587c52ca4c099432327b7f06478dYigit Boyar                return true;
241d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            }
242d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            if (o == null || getClass() != o.getClass()) {
243d37b47419005587c52ca4c099432327b7f06478dYigit Boyar                return false;
244d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            }
245d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
246d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            MyParcelable that = (MyParcelable) o;
247d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
248d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            if (x != that.x) {
249d37b47419005587c52ca4c099432327b7f06478dYigit Boyar                return false;
250d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            }
251d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            if (y != null ? !y.equals(that.y) : that.y != null) {
252d37b47419005587c52ca4c099432327b7f06478dYigit Boyar                return false;
253d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            }
254d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
255d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            return true;
256d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        }
257d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
258d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        @Override
259d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        public int hashCode() {
260d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            int result = x;
261d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            result = 31 * result + (y != null ? y.hashCode() : 0);
262d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            return result;
263d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        }
264d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
265d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        public static final Parcelable.Creator<MyParcelable> CREATOR
266d37b47419005587c52ca4c099432327b7f06478dYigit Boyar                = new Parcelable.Creator<MyParcelable>() {
267d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
268d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            @Override
269d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            public MyParcelable createFromParcel(Parcel source) {
270d37b47419005587c52ca4c099432327b7f06478dYigit Boyar                return new MyParcelable(source.readInt(), source.readString());
271d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            }
272d37b47419005587c52ca4c099432327b7f06478dYigit Boyar
273d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            @Override
274d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            public MyParcelable[] newArray(int size) {
275d37b47419005587c52ca4c099432327b7f06478dYigit Boyar                return new MyParcelable[size];
276d37b47419005587c52ca4c099432327b7f06478dYigit Boyar            }
277d37b47419005587c52ca4c099432327b7f06478dYigit Boyar        };
278d37b47419005587c52ca4c099432327b7f06478dYigit Boyar    }
279d37b47419005587c52ca4c099432327b7f06478dYigit Boyar}
280