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&lt;String&gt; name = new ObservableParcelable&lt;String&gt;();
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