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 Boyar 22d37b47419005587c52ca4c099432327b7f06478dYigit Boyarimport java.io.Serializable; 23d37b47419005587c52ca4c099432327b7f06478dYigit Boyar 24d37b47419005587c52ca4c099432327b7f06478dYigit Boyar/** 25d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * An observable class that holds a parcelable object. 26d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * <p> 27c9a5d6f140f732ca0ff279a4b1ee315072e1c422George Mount * Observable field classes may be used instead of creating an Observable object: 28c9a5d6f140f732ca0ff279a4b1ee315072e1c422George Mount * <pre><code>public class MyDataObject { 295884ca73e8737846bee442a8032de649615f20cbGeorge Mount * public final ObservableParcelable<String> name = new ObservableParcelable<String>(); 30c9a5d6f140f732ca0ff279a4b1ee315072e1c422George Mount * public final ObservableInt age = new ObservableInt(); 31c9a5d6f140f732ca0ff279a4b1ee315072e1c422George Mount * }</code></pre> 32c9a5d6f140f732ca0ff279a4b1ee315072e1c422George Mount * Fields of this type should be declared final because bindings only detect changes in the 33c9a5d6f140f732ca0ff279a4b1ee315072e1c422George Mount * field's value, not of the field itself. 34c9a5d6f140f732ca0ff279a4b1ee315072e1c422George Mount * <p> 35d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * This class is parcelable but you should keep in mind that listeners are ignored when the object 36d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * is parcelled. Unless you add custom observers, this should not be an issue because data binding 37d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * framework always re-registers observers when the view is bound. 38d37b47419005587c52ca4c099432327b7f06478dYigit Boyar */ 39d37b47419005587c52ca4c099432327b7f06478dYigit Boyarpublic class ObservableParcelable<T extends Parcelable> extends ObservableField<T> 40d37b47419005587c52ca4c099432327b7f06478dYigit Boyar implements Parcelable, Serializable { 41d37b47419005587c52ca4c099432327b7f06478dYigit Boyar static final long serialVersionUID = 1L; 42d37b47419005587c52ca4c099432327b7f06478dYigit Boyar /** 43d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * Wraps the given object and creates an observable object 44d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * 45d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * @param value The value to be wrapped as an observable. 46d37b47419005587c52ca4c099432327b7f06478dYigit Boyar */ 47d37b47419005587c52ca4c099432327b7f06478dYigit Boyar public ObservableParcelable(T value) { 48d37b47419005587c52ca4c099432327b7f06478dYigit Boyar super(value); 49d37b47419005587c52ca4c099432327b7f06478dYigit Boyar } 50d37b47419005587c52ca4c099432327b7f06478dYigit Boyar 51d37b47419005587c52ca4c099432327b7f06478dYigit Boyar /** 52d37b47419005587c52ca4c099432327b7f06478dYigit Boyar * Creates an empty observable object 53d37b47419005587c52ca4c099432327b7f06478dYigit Boyar */ 54d37b47419005587c52ca4c099432327b7f06478dYigit Boyar public ObservableParcelable() { 55d37b47419005587c52ca4c099432327b7f06478dYigit Boyar super(); 56d37b47419005587c52ca4c099432327b7f06478dYigit Boyar } 57d37b47419005587c52ca4c099432327b7f06478dYigit Boyar 58d37b47419005587c52ca4c099432327b7f06478dYigit Boyar @Override 59d37b47419005587c52ca4c099432327b7f06478dYigit Boyar public int describeContents() { 60d37b47419005587c52ca4c099432327b7f06478dYigit Boyar return 0; 61d37b47419005587c52ca4c099432327b7f06478dYigit Boyar } 62d37b47419005587c52ca4c099432327b7f06478dYigit Boyar 63d37b47419005587c52ca4c099432327b7f06478dYigit Boyar @Override 64d37b47419005587c52ca4c099432327b7f06478dYigit Boyar public void writeToParcel(Parcel dest, int flags) { 65d37b47419005587c52ca4c099432327b7f06478dYigit Boyar dest.writeParcelable(get(), 0); 66d37b47419005587c52ca4c099432327b7f06478dYigit Boyar } 67d37b47419005587c52ca4c099432327b7f06478dYigit Boyar 68d37b47419005587c52ca4c099432327b7f06478dYigit Boyar public static final Parcelable.Creator<ObservableParcelable> CREATOR 69d37b47419005587c52ca4c099432327b7f06478dYigit Boyar = new Parcelable.Creator<ObservableParcelable>() { 70d37b47419005587c52ca4c099432327b7f06478dYigit Boyar 71d37b47419005587c52ca4c099432327b7f06478dYigit Boyar @Override 72d37b47419005587c52ca4c099432327b7f06478dYigit Boyar public ObservableParcelable createFromParcel(Parcel source) { 73d37b47419005587c52ca4c099432327b7f06478dYigit Boyar //noinspection unchecked 74d37b47419005587c52ca4c099432327b7f06478dYigit Boyar return new ObservableParcelable(source.readParcelable(getClass().getClassLoader())); 75d37b47419005587c52ca4c099432327b7f06478dYigit Boyar } 76d37b47419005587c52ca4c099432327b7f06478dYigit Boyar 77d37b47419005587c52ca4c099432327b7f06478dYigit Boyar @Override 78d37b47419005587c52ca4c099432327b7f06478dYigit Boyar public ObservableParcelable[] newArray(int size) { 79d37b47419005587c52ca4c099432327b7f06478dYigit Boyar return new ObservableParcelable[size]; 80d37b47419005587c52ca4c099432327b7f06478dYigit Boyar } 81d37b47419005587c52ca4c099432327b7f06478dYigit Boyar }; 82d37b47419005587c52ca4c099432327b7f06478dYigit Boyar} 83