1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.os;
18
19/**
20 * Interface for classes whose instances can be written to
21 * and restored from a {@link Parcel}.  Classes implementing the Parcelable
22 * interface must also have a static field called <code>CREATOR</code>, which
23 * is an object implementing the {@link Parcelable.Creator Parcelable.Creator}
24 * interface.
25 *
26 * <p>A typical implementation of Parcelable is:</p>
27 *
28 * <pre>
29 * public class MyParcelable implements Parcelable {
30 *     private int mData;
31 *
32 *     public int describeContents() {
33 *         return 0;
34 *     }
35 *
36 *     public void writeToParcel(Parcel out, int flags) {
37 *         out.writeInt(mData);
38 *     }
39 *
40 *     public static final Parcelable.Creator&lt;MyParcelable&gt; CREATOR
41 *             = new Parcelable.Creator&lt;MyParcelable&gt;() {
42 *         public MyParcelable createFromParcel(Parcel in) {
43 *             return new MyParcelable(in);
44 *         }
45 *
46 *         public MyParcelable[] newArray(int size) {
47 *             return new MyParcelable[size];
48 *         }
49 *     };
50 *
51 *     private MyParcelable(Parcel in) {
52 *         mData = in.readInt();
53 *     }
54 * }</pre>
55 */
56public interface Parcelable {
57    /**
58     * Flag for use with {@link #writeToParcel}: the object being written
59     * is a return value, that is the result of a function such as
60     * "<code>Parcelable someFunction()</code>",
61     * "<code>void someFunction(out Parcelable)</code>", or
62     * "<code>void someFunction(inout Parcelable)</code>".  Some implementations
63     * may want to release resources at this point.
64     */
65    public static final int PARCELABLE_WRITE_RETURN_VALUE = 0x0001;
66
67    /**
68     * Bit masks for use with {@link #describeContents}: each bit represents a
69     * kind of object considered to have potential special significance when
70     * marshalled.
71     */
72    public static final int CONTENTS_FILE_DESCRIPTOR = 0x0001;
73
74    /**
75     * Describe the kinds of special objects contained in this Parcelable's
76     * marshalled representation.
77     *
78     * @return a bitmask indicating the set of special object types marshalled
79     * by the Parcelable.
80     */
81    public int describeContents();
82
83    /**
84     * Flatten this object in to a Parcel.
85     *
86     * @param dest The Parcel in which the object should be written.
87     * @param flags Additional flags about how the object should be written.
88     * May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
89     */
90    public void writeToParcel(Parcel dest, int flags);
91
92    /**
93     * Interface that must be implemented and provided as a public CREATOR
94     * field that generates instances of your Parcelable class from a Parcel.
95     */
96    public interface Creator<T> {
97        /**
98         * Create a new instance of the Parcelable class, instantiating it
99         * from the given Parcel whose data had previously been written by
100         * {@link Parcelable#writeToParcel Parcelable.writeToParcel()}.
101         *
102         * @param source The Parcel to read the object's data from.
103         * @return Returns a new instance of the Parcelable class.
104         */
105        public T createFromParcel(Parcel source);
106
107        /**
108         * Create a new array of the Parcelable class.
109         *
110         * @param size Size of the array.
111         * @return Returns an array of the Parcelable class, with every entry
112         * initialized to null.
113         */
114        public T[] newArray(int size);
115    }
116
117    /**
118     * Specialization of {@link Creator} that allows you to receive the
119     * ClassLoader the object is being created in.
120     */
121    public interface ClassLoaderCreator<T> extends Creator<T> {
122        /**
123         * Create a new instance of the Parcelable class, instantiating it
124         * from the given Parcel whose data had previously been written by
125         * {@link Parcelable#writeToParcel Parcelable.writeToParcel()} and
126         * using the given ClassLoader.
127         *
128         * @param source The Parcel to read the object's data from.
129         * @param loader The ClassLoader that this object is being created in.
130         * @return Returns a new instance of the Parcelable class.
131         */
132        public T createFromParcel(Parcel source, ClassLoader loader);
133    }
134}
135