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