19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 190450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roosimport android.annotation.IntegerRes; 20ddb948896ca7059161e09d0063b3332352772c0aSvet Ganovimport android.annotation.Nullable; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 22b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackbornimport android.util.ArrayMap; 23ddb948896ca7059161e09d0063b3332352772c0aSvet Ganovimport android.util.ArraySet; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 255ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkeyimport android.util.Size; 265ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkeyimport android.util.SizeF; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseBooleanArray; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayInputStream; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayOutputStream; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ObjectInputStream; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ObjectOutputStream; 375002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlockimport java.io.ObjectStreamClass; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.Serializable; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Field; 4044e440cc7e834de7811f005998acb32716835b00Neil Fullerimport java.lang.reflect.Modifier; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 42a28b83ee04ca25100781f37a50665d6e1b05e3a2Elliott Hughesimport java.util.Arrays; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 480450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roosimport dalvik.system.VMRuntime; 490450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Container for a message (data and object references) that can 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be sent through an IBinder. A Parcel can contain both flattened data 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that will be unflattened on the other side of the IPC (using the various 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * methods here for writing specific types, or the general 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable} interface), and references to live {@link IBinder} 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects that will result in the other side receiving a proxy IBinder 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connected with the original IBinder in the Parcel. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p class="note">Parcel is <strong>not</strong> a general-purpose 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * serialization mechanism. This class (and the corresponding 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable} API for placing arbitrary objects into a Parcel) is 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * designed as a high-performance IPC transport. As such, it is not 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appropriate to place any Parcel data in to persistent storage: changes 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the underlying implementation of any of the data in the Parcel can 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * render older data unreadable.</p> 66a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The bulk of the Parcel API revolves around reading and writing data 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of various types. There are six major classes of such functions available.</p> 69a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Primitives</h3> 71a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The most basic data functions are for writing and reading primitive 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data types: {@link #writeByte}, {@link #readByte}, {@link #writeDouble}, 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readDouble}, {@link #writeFloat}, {@link #readFloat}, {@link #writeInt}, 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readInt}, {@link #writeLong}, {@link #readLong}, 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeString}, {@link #readString}. Most other 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data operations are built on top of these. The given data is written and 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * read using the endianess of the host CPU.</p> 79a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Primitive Arrays</h3> 81a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are a variety of methods for reading and writing raw arrays 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of primitive objects, which generally result in writing a 4-byte length 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * followed by the primitive data items. The methods for reading can either 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * read the data into an existing array, or create and return a new array. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These available types are:</p> 87a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeBooleanArray(boolean[])}, 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readBooleanArray(boolean[])}, {@link #createBooleanArray()} 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeByteArray(byte[])}, 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeByteArray(byte[], int, int)}, {@link #readByteArray(byte[])}, 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createByteArray()} 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeCharArray(char[])}, {@link #readCharArray(char[])}, 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createCharArray()} 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeDoubleArray(double[])}, {@link #readDoubleArray(double[])}, 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createDoubleArray()} 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeFloatArray(float[])}, {@link #readFloatArray(float[])}, 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createFloatArray()} 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeIntArray(int[])}, {@link #readIntArray(int[])}, 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createIntArray()} 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeLongArray(long[])}, {@link #readLongArray(long[])}, 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createLongArray()} 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeStringArray(String[])}, {@link #readStringArray(String[])}, 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createStringArray()}. 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeSparseBooleanArray(SparseBooleanArray)}, 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readSparseBooleanArray()}. 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 109a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Parcelables</h3> 111a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The {@link Parcelable} protocol provides an extremely efficient (but 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * low-level) protocol for objects to write and read themselves from Parcels. 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can use the direct methods {@link #writeParcelable(Parcelable, int)} 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link #readParcelable(ClassLoader)} or 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeParcelableArray} and 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readParcelableArray(ClassLoader)} to write or read. These 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * methods write both the class type and its data to the Parcel, allowing 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that class to be reconstructed from the appropriate class loader when 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * later reading.</p> 121a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are also some methods that provide a more efficient way to work 1238dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * with Parcelables: {@link #writeTypedObject}, {@link #writeTypedArray}, 1248dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * {@link #writeTypedList}, {@link #readTypedObject}, 1258dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * {@link #createTypedArray} and {@link #createTypedArrayList}. These methods 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * do not write the class information of the original object: instead, the 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * caller of the read function must know what type to expect and pass in the 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appropriate {@link Parcelable.Creator Parcelable.Creator} instead to 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * properly construct the new object and read its data. (To more efficient 1308dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * write and read a single Parceable object that is not null, you can directly 1318dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * call {@link Parcelable#writeToParcel Parcelable.writeToParcel} and 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable.Creator#createFromParcel Parcelable.Creator.createFromParcel} 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * yourself.)</p> 134a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Bundles</h3> 136a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A special type-safe container, called {@link Bundle}, is available 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for key/value maps of heterogeneous values. This has many optimizations 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for improved performance when reading and writing data, and its type-safe 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * API avoids difficult to debug type errors when finally marshalling the 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data contents into a Parcel. The methods to use are 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeBundle(Bundle)}, {@link #readBundle()}, and 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readBundle(ClassLoader)}. 144a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Active Objects</h3> 146a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An unusual feature of Parcel is the ability to read and write active 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects. For these objects the actual contents of the object is not 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * written, rather a special token referencing the object is written. When 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reading the object back from the Parcel, you do not get a new instance of 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the object, but rather a handle that operates on the exact same object that 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was originally written. There are two forms of active objects available.</p> 153a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>{@link Binder} objects are a core facility of Android's general cross-process 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * communication system. The {@link IBinder} interface describes an abstract 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protocol with a Binder object. Any such interface can be written in to 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a Parcel, and upon reading you will receive either the original object 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implementing that interface or a special proxy implementation 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that communicates calls back to the original object. The methods to use are 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeStrongBinder(IBinder)}, 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeStrongInterface(IInterface)}, {@link #readStrongBinder()}, 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeBinderArray(IBinder[])}, {@link #readBinderArray(IBinder[])}, 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createBinderArray()}, 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeBinderList(List)}, {@link #readBinderList(List)}, 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createBinderArrayList()}.</p> 166a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>FileDescriptor objects, representing raw Linux file descriptor identifiers, 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be written and {@link ParcelFileDescriptor} objects returned to operate 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on the original file descriptor. The returned file descriptor is a dup 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the original file descriptor: the object and fd is different, but 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * operating on the same underlying file stream, with the same position, etc. 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The methods to use are {@link #writeFileDescriptor(FileDescriptor)}, 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readFileDescriptor()}. 174a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Untyped Containers</h3> 176a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A final class of methods are for writing and reading standard Java 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * containers of arbitrary types. These all revolve around the 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeValue(Object)} and {@link #readValue(ClassLoader)} methods 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which define the types of objects allowed. The container methods are 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeArray(Object[])}, {@link #readArray(ClassLoader)}, 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeList(List)}, {@link #readList(List, ClassLoader)}, 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readArrayList(ClassLoader)}, 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeMap(Map)}, {@link #readMap(Map, ClassLoader)}, 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeSparseArray(SparseArray)}, 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readSparseArray(ClassLoader)}. 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Parcel { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG_RECYCLE = false; 190e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn private static final boolean DEBUG_ARRAY_MAP = false; 1915b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick private static final String TAG = "Parcel"; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings({"UnusedDeclaration"}) 1948ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private long mNativePtr; // used by native code 195047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 196047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey /** 197047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey * Flag indicating if {@link #mNativePtr} was allocated by this object, 198047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey * indicating that we're responsible for its lifecycle. 199047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey */ 200047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey private boolean mOwnsNativeParcelObject; 2010450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos private long mNativeSize; 202047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private RuntimeException mStack; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int POOL_SIZE = 6; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Parcel[] sOwnedPool = new Parcel[POOL_SIZE]; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Parcel[] sHolderPool = new Parcel[POOL_SIZE]; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2093cefe6a991ba650375e663e7095266e2273d2372Samuel Tan // Keep in sync with frameworks/native/libs/binder/PersistableBundle.cpp. 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_NULL = -1; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_STRING = 0; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_INTEGER = 1; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_MAP = 2; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BUNDLE = 3; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_PARCELABLE = 4; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_SHORT = 5; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_LONG = 6; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_FLOAT = 7; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_DOUBLE = 8; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BOOLEAN = 9; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_CHARSEQUENCE = 10; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_LIST = 11; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_SPARSEARRAY = 12; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BYTEARRAY = 13; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_STRINGARRAY = 14; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_IBINDER = 15; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_PARCELABLEARRAY = 16; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_OBJECTARRAY = 17; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_INTARRAY = 18; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_LONGARRAY = 19; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BYTE = 20; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_SERIALIZABLE = 21; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_SPARSEBOOLEANARRAY = 22; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BOOLEANARRAY = 23; 23508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert private static final int VAL_CHARSEQUENCEARRAY = 24; 236719e6b167041ffaffc2245f692714c8de191863fCraig Mautner private static final int VAL_PERSISTABLEBUNDLE = 25; 2375ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey private static final int VAL_SIZE = 26; 2385ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey private static final int VAL_SIZEF = 27; 239a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan private static final int VAL_DOUBLEARRAY = 28; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2415b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // The initial int32 in a Binder call's reply Parcel header: 24280fd1208b99fbb88f24faa5d55183cdbbdeb6777Christopher Wiley // Keep these in sync with libbinder's binder/Status.h. 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_SECURITY = -1; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_BAD_PARCELABLE = -2; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_ILLEGAL_ARGUMENT = -3; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_NULL_POINTER = -4; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_ILLEGAL_STATE = -5; 2487e7144218e8681fff2065a891de517bad6fe1b38Dianne Hackborn private static final int EX_NETWORK_MAIN_THREAD = -6; 24933d738a10209d4dc882a65285d6e71cfaeabe769Dianne Hackborn private static final int EX_UNSUPPORTED_OPERATION = -7; 25080fd1208b99fbb88f24faa5d55183cdbbdeb6777Christopher Wiley private static final int EX_SERVICE_SPECIFIC = -8; 2515b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick private static final int EX_HAS_REPLY_HEADER = -128; // special; see below 25280fd1208b99fbb88f24faa5d55183cdbbdeb6777Christopher Wiley // EX_TRANSACTION_FAILED is used exclusively in native code. 25380fd1208b99fbb88f24faa5d55183cdbbdeb6777Christopher Wiley // see libbinder's binder/Status.h 25480fd1208b99fbb88f24faa5d55183cdbbdeb6777Christopher Wiley private static final int EX_TRANSACTION_FAILED = -129; 2555b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick 2568ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native int nativeDataSize(long nativePtr); 2578ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native int nativeDataAvail(long nativePtr); 2588ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native int nativeDataPosition(long nativePtr); 2598ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native int nativeDataCapacity(long nativePtr); 2600450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos private static native long nativeSetDataSize(long nativePtr, int size); 2618ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeSetDataPosition(long nativePtr, int pos); 2628ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeSetDataCapacity(long nativePtr, int size); 2638ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 2648ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native boolean nativePushAllowFds(long nativePtr, boolean allowFds); 2658ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeRestoreAllowFds(long nativePtr, boolean lastValue); 2668ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 2678ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteByteArray(long nativePtr, byte[] b, int offset, int len); 26890d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha private static native void nativeWriteBlob(long nativePtr, byte[] b, int offset, int len); 2698ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteInt(long nativePtr, int val); 2708ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteLong(long nativePtr, long val); 2718ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteFloat(long nativePtr, float val); 2728ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteDouble(long nativePtr, double val); 2738ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteString(long nativePtr, String val); 2748ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteStrongBinder(long nativePtr, IBinder val); 2750450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos private static native long nativeWriteFileDescriptor(long nativePtr, FileDescriptor val); 2768ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 2778ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native byte[] nativeCreateByteArray(long nativePtr); 27890d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha private static native byte[] nativeReadBlob(long nativePtr); 2798ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native int nativeReadInt(long nativePtr); 2808ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native long nativeReadLong(long nativePtr); 2818ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native float nativeReadFloat(long nativePtr); 2828ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native double nativeReadDouble(long nativePtr); 2838ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native String nativeReadString(long nativePtr); 2848ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native IBinder nativeReadStrongBinder(long nativePtr); 2858ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native FileDescriptor nativeReadFileDescriptor(long nativePtr); 2868ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 2878ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native long nativeCreate(); 2880450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos private static native long nativeFreeBuffer(long nativePtr); 2898ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeDestroy(long nativePtr); 2908ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 2918ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native byte[] nativeMarshall(long nativePtr); 2920450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos private static native long nativeUnmarshall( 293e08523684d5414117f81debd4eb14bc8eb494c29John Spurlock long nativePtr, byte[] data, int offset, int length); 2940450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos private static native long nativeAppendFrom( 2958ab665dda40ab10e60fc69392022171f454af530Ashok Bhat long thisNativePtr, long otherNativePtr, int offset, int length); 2968ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native boolean nativeHasFileDescriptors(long nativePtr); 2978ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteInterfaceToken(long nativePtr, String interfaceName); 2988ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeEnforceInterface(long nativePtr, String interfaceName); 299047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 300aa861666ed537389e335f586bc84fe8ddb9fb026Dan Sandler private static native long nativeGetBlobAshmemSize(long nativePtr); 3015ce0430edfc176de29c0cf503975570dfda8111fDan Sandler 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static Parcelable.Creator<String> STRING_CREATOR 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<String>() { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String createFromParcel(Parcel source) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source.readString(); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] newArray(int size) { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new String[size]; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a new Parcel object from the pool. 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Parcel obtain() { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Parcel[] pool = sOwnedPool; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (pool) { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel p; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<POOL_SIZE; i++) { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = pool[i]; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p != null) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pool[i] = null; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStack = new RuntimeException(); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Parcel(0); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Put a Parcel object back into the pool. You must not touch 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the object after this call. 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void recycle() { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) mStack = null; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project freeBuffer(); 340047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 341047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey final Parcel[] pool; 342047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey if (mOwnsNativeParcelObject) { 343047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey pool = sOwnedPool; 344047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } else { 345047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey mNativePtr = 0; 346047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey pool = sHolderPool; 347047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 348047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (pool) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<POOL_SIZE; i++) { 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pool[i] == null) { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pool[i] = this; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn /** @hide */ 360fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn public static native long getGlobalAllocSize(); 361fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn 362fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn /** @hide */ 363fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn public static native long getGlobalAllocCount(); 364fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total amount of data contained in the parcel. 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 368047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final int dataSize() { 369047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeDataSize(mNativePtr); 370047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the amount of data remaining to be read from the 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parcel. That is, {@link #dataSize}-{@link #dataPosition}. 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 376047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final int dataAvail() { 377047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeDataAvail(mNativePtr); 378047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current position in the parcel data. Never 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more than {@link #dataSize}. 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 384047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final int dataPosition() { 385047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeDataPosition(mNativePtr); 386047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total amount of space in the parcel. This is always 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * >= {@link #dataSize}. The difference between it and dataSize() is the 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * amount of room left until the parcel needs to re-allocate its 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data buffer. 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 394047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final int dataCapacity() { 395047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeDataCapacity(mNativePtr); 396047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the amount of data in the parcel. Can be either smaller or 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * larger than the current size. If larger than the current capacity, 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more memory will be allocated. 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param size The new number of bytes in the Parcel. 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 405047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void setDataSize(int size) { 4060450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos updateNativeSize(nativeSetDataSize(mNativePtr, size)); 407047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Move the current read/write position in the parcel. 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pos New offset in the parcel; must be between 0 and 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #dataSize}. 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 414047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void setDataPosition(int pos) { 415047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeSetDataPosition(mNativePtr, pos); 416047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the capacity (current available space) of the parcel. 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param size The new capacity of the parcel, in bytes. Can not be 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * less than {@link #dataSize} -- that is, you can not drop existing data 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with this method. 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 425047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void setDataCapacity(int size) { 426047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeSetDataCapacity(mNativePtr, size); 427047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4299ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn /** @hide */ 430047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final boolean pushAllowFds(boolean allowFds) { 431047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativePushAllowFds(mNativePtr, allowFds); 432047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 433c04db7e06737c5b9bae276ac462858d44002672eDianne Hackborn 434c04db7e06737c5b9bae276ac462858d44002672eDianne Hackborn /** @hide */ 435047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void restoreAllowFds(boolean lastValue) { 436047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeRestoreAllowFds(mNativePtr, lastValue); 437047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4389ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the raw bytes of the parcel. 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p class="note">The data you retrieve here <strong>must not</strong> 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be placed in any kind of persistent storage (on local disk, across 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a network, etc). For that, you should use standard serialization 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or another kind of general serialization mechanism. The Parcel 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * marshalled representation is highly optimized for local IPC, and as 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * such does not attempt to maintain compatibility with data created 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in different versions of the platform. 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 450047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final byte[] marshall() { 451047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeMarshall(mNativePtr); 452047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the bytes in data to be the raw bytes of this Parcel. 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 457e08523684d5414117f81debd4eb14bc8eb494c29John Spurlock public final void unmarshall(byte[] data, int offset, int length) { 4580450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos updateNativeSize(nativeUnmarshall(mNativePtr, data, offset, length)); 459047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 461047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void appendFrom(Parcel parcel, int offset, int length) { 4620450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos updateNativeSize(nativeAppendFrom(mNativePtr, parcel.mNativePtr, offset, length)); 463047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Report whether the parcel contains any marshalled file descriptors. 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 468047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final boolean hasFileDescriptors() { 469047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeHasFileDescriptors(mNativePtr); 470047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Store or read an IBinder interface token in the parcel at the current 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #dataPosition}. This is used to validate that the marshalled 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * transaction is intended for the target interface. 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 477047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeInterfaceToken(String interfaceName) { 478047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteInterfaceToken(mNativePtr, interfaceName); 479047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 480047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 481047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void enforceInterface(String interfaceName) { 482047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeEnforceInterface(mNativePtr, interfaceName); 483047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 486a28b83ee04ca25100781f37a50665d6e1b05e3a2Elliott Hughes * Write a byte array into the parcel at the current {@link #dataPosition}, 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing {@link #dataCapacity} if needed. 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param b Bytes to place into the parcel. 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeByteArray(byte[] b) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeByteArray(b, 0, (b != null) ? b.length : 0); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 495f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * Write a byte array into the parcel at the current {@link #dataPosition}, 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing {@link #dataCapacity} if needed. 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param b Bytes to place into the parcel. 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offset Index of first byte to be written. 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param len Number of bytes to write. 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeByteArray(byte[] b, int offset, int len) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b == null) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 506a28b83ee04ca25100781f37a50665d6e1b05e3a2Elliott Hughes Arrays.checkOffsetAndCount(b.length, offset, len); 507047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteByteArray(mNativePtr, b, offset, len); 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 51190d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha * Write a blob of data into the parcel at the current {@link #dataPosition}, 51290d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha * growing {@link #dataCapacity} if needed. 51390d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha * @param b Bytes to place into the parcel. 51490d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha * {@hide} 51539c12fab49075b715c253c68c84b5c10c3150197Sandeep Siddhartha * {@SystemApi} 51690d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha */ 51790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha public final void writeBlob(byte[] b) { 518b9f7aac3488873677377b36c57338d758098f78eDan Sandler writeBlob(b, 0, (b != null) ? b.length : 0); 519b9f7aac3488873677377b36c57338d758098f78eDan Sandler } 520b9f7aac3488873677377b36c57338d758098f78eDan Sandler 521b9f7aac3488873677377b36c57338d758098f78eDan Sandler /** 522b9f7aac3488873677377b36c57338d758098f78eDan Sandler * Write a blob of data into the parcel at the current {@link #dataPosition}, 523b9f7aac3488873677377b36c57338d758098f78eDan Sandler * growing {@link #dataCapacity} if needed. 524b9f7aac3488873677377b36c57338d758098f78eDan Sandler * @param b Bytes to place into the parcel. 525b9f7aac3488873677377b36c57338d758098f78eDan Sandler * @param offset Index of first byte to be written. 526b9f7aac3488873677377b36c57338d758098f78eDan Sandler * @param len Number of bytes to write. 527b9f7aac3488873677377b36c57338d758098f78eDan Sandler * {@hide} 528b9f7aac3488873677377b36c57338d758098f78eDan Sandler * {@SystemApi} 529b9f7aac3488873677377b36c57338d758098f78eDan Sandler */ 530b9f7aac3488873677377b36c57338d758098f78eDan Sandler public final void writeBlob(byte[] b, int offset, int len) { 531b9f7aac3488873677377b36c57338d758098f78eDan Sandler if (b == null) { 532b9f7aac3488873677377b36c57338d758098f78eDan Sandler writeInt(-1); 533b9f7aac3488873677377b36c57338d758098f78eDan Sandler return; 534b9f7aac3488873677377b36c57338d758098f78eDan Sandler } 535b9f7aac3488873677377b36c57338d758098f78eDan Sandler Arrays.checkOffsetAndCount(b.length, offset, len); 536b9f7aac3488873677377b36c57338d758098f78eDan Sandler nativeWriteBlob(mNativePtr, b, offset, len); 53790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 53890d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 53990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha /** 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write an integer value into the parcel at the current dataPosition(), 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 543047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeInt(int val) { 544047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteInt(mNativePtr, val); 545047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a long integer value into the parcel at the current dataPosition(), 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 551047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeLong(long val) { 552047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteLong(mNativePtr, val); 553047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a floating point value into the parcel at the current 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(), growing dataCapacity() if needed. 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 559047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeFloat(float val) { 560047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteFloat(mNativePtr, val); 561047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a double precision floating point value into the parcel at the 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(), growing dataCapacity() if needed. 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 567047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeDouble(double val) { 568047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteDouble(mNativePtr, val); 569047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a string value into the parcel at the current dataPosition(), 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 575047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeString(String val) { 576047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteString(mNativePtr, val); 577047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 58008bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * Write a CharSequence value into the parcel at the current dataPosition(), 58108bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * growing dataCapacity() if needed. 58208bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * @hide 58308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert */ 58408bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert public final void writeCharSequence(CharSequence val) { 58508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert TextUtils.writeToParcel(val, this, 0); 58608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 58708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 58808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert /** 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write an object into the parcel at the current dataPosition(), 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 592047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeStrongBinder(IBinder val) { 593047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteStrongBinder(mNativePtr, val); 594047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write an object into the parcel at the current dataPosition(), 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeStrongInterface(IInterface val) { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStrongBinder(val == null ? null : val.asBinder()); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a FileDescriptor into the parcel at the current dataPosition(), 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 607b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * 608b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * <p class="caution">The file descriptor will not be closed, which may 609b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * result in file descriptor leaks when objects are returned from Binder 610b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * calls. Use {@link ParcelFileDescriptor#writeToParcel} instead, which 611b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * accepts contextual flags and will close the original file descriptor 612b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * if {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set.</p> 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 614047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeFileDescriptor(FileDescriptor val) { 6150450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos updateNativeSize(nativeWriteFileDescriptor(mNativePtr, val)); 6160450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos } 6170450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos 6180450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos private void updateNativeSize(long newNativeSize) { 6190450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos if (mOwnsNativeParcelObject) { 6200450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos if (newNativeSize > Integer.MAX_VALUE) { 6210450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos newNativeSize = Integer.MAX_VALUE; 6220450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos } 6230450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos if (newNativeSize != mNativeSize) { 6240450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos int delta = (int) (newNativeSize - mNativeSize); 6250450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos if (delta > 0) { 6260450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos VMRuntime.getRuntime().registerNativeAllocation(delta); 6270450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos } else { 6280450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos VMRuntime.getRuntime().registerNativeFree(-delta); 6290450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos } 6300450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos mNativeSize = newNativeSize; 6310450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos } 6320450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos } 633047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6362f974b252f819405a54798c9736f448f979a095fCasey Dahlin * {@hide} 6372f974b252f819405a54798c9736f448f979a095fCasey Dahlin * This will be the new name for writeFileDescriptor, for consistency. 6382f974b252f819405a54798c9736f448f979a095fCasey Dahlin **/ 6392f974b252f819405a54798c9736f448f979a095fCasey Dahlin public final void writeRawFileDescriptor(FileDescriptor val) { 6402f974b252f819405a54798c9736f448f979a095fCasey Dahlin nativeWriteFileDescriptor(mNativePtr, val); 6412f974b252f819405a54798c9736f448f979a095fCasey Dahlin } 6422f974b252f819405a54798c9736f448f979a095fCasey Dahlin 6432f974b252f819405a54798c9736f448f979a095fCasey Dahlin /** 6442f974b252f819405a54798c9736f448f979a095fCasey Dahlin * {@hide} 6452f974b252f819405a54798c9736f448f979a095fCasey Dahlin * Write an array of FileDescriptor objects into the Parcel. 6462f974b252f819405a54798c9736f448f979a095fCasey Dahlin * 6472f974b252f819405a54798c9736f448f979a095fCasey Dahlin * @param value The array of objects to be written. 6482f974b252f819405a54798c9736f448f979a095fCasey Dahlin */ 6492f974b252f819405a54798c9736f448f979a095fCasey Dahlin public final void writeRawFileDescriptorArray(FileDescriptor[] value) { 6502f974b252f819405a54798c9736f448f979a095fCasey Dahlin if (value != null) { 6512f974b252f819405a54798c9736f448f979a095fCasey Dahlin int N = value.length; 6522f974b252f819405a54798c9736f448f979a095fCasey Dahlin writeInt(N); 6532f974b252f819405a54798c9736f448f979a095fCasey Dahlin for (int i=0; i<N; i++) { 6542f974b252f819405a54798c9736f448f979a095fCasey Dahlin writeRawFileDescriptor(value[i]); 6552f974b252f819405a54798c9736f448f979a095fCasey Dahlin } 6562f974b252f819405a54798c9736f448f979a095fCasey Dahlin } else { 6572f974b252f819405a54798c9736f448f979a095fCasey Dahlin writeInt(-1); 6582f974b252f819405a54798c9736f448f979a095fCasey Dahlin } 6592f974b252f819405a54798c9736f448f979a095fCasey Dahlin } 6602f974b252f819405a54798c9736f448f979a095fCasey Dahlin 6612f974b252f819405a54798c9736f448f979a095fCasey Dahlin /** 662f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * Write a byte value into the parcel at the current dataPosition(), 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeByte(byte val) { 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Please use {@link #writeBundle} instead. Flattens a Map into the parcel 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at the current dataPosition(), 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. The Map keys must be String objects. 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Map values are written using {@link #writeValue} and must follow 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the specification there. 675a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>It is strongly recommended to use {@link #writeBundle} instead of 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this method, since the Bundle class provides a type-safe API that 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allows you to avoid mysterious type errors at the point of marshalling. 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeMap(Map val) { 681b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn writeMapInternal((Map<String, Object>) val); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a Map into the parcel at the current dataPosition(), 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. The Map keys must be String objects. 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6886aff905048ba3b03724f17e2aba9089872e14cd2Dianne Hackborn /* package */ void writeMapInternal(Map<String,Object> val) { 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Set<Map.Entry<String,Object>> entries = val.entrySet(); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(entries.size()); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String,Object> e : entries) { 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(e.getKey()); 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(e.getValue()); 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 702b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn * Flatten an ArrayMap into the parcel at the current dataPosition(), 703b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn * growing dataCapacity() if needed. The Map keys must be String objects. 704b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn */ 7059c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn /* package */ void writeArrayMapInternal(ArrayMap<String, Object> val) { 706b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn if (val == null) { 707b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn writeInt(-1); 708b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn return; 709b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn } 7103cefe6a991ba650375e663e7095266e2273d2372Samuel Tan // Keep the format of this Parcel in sync with writeToParcelInner() in 7113cefe6a991ba650375e663e7095266e2273d2372Samuel Tan // frameworks/native/libs/binder/PersistableBundle.cpp. 712b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn final int N = val.size(); 713b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn writeInt(N); 714e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn if (DEBUG_ARRAY_MAP) { 715e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn RuntimeException here = new RuntimeException("here"); 716e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn here.fillInStackTrace(); 717e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn Log.d(TAG, "Writing " + N + " ArrayMap entries", here); 718e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn } 7198aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn int startPos; 720b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn for (int i=0; i<N; i++) { 7218aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn if (DEBUG_ARRAY_MAP) startPos = dataPosition(); 7229c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn writeString(val.keyAt(i)); 723b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn writeValue(val.valueAt(i)); 7248aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn if (DEBUG_ARRAY_MAP) Log.d(TAG, " Write #" + i + " " 7258aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn + (dataPosition()-startPos) + " bytes: key=0x" 7268aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn + Integer.toHexString(val.keyAt(i) != null ? val.keyAt(i).hashCode() : 0) 7278aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn + " " + val.keyAt(i)); 728b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn } 729b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn } 730b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn 731b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn /** 7329c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn * @hide For testing only. 7339c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn */ 7349c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn public void writeArrayMap(ArrayMap<String, Object> val) { 7359c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn writeArrayMapInternal(val); 7369c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn } 7379c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn 7389c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn /** 739ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov * Write an array set to the parcel. 740ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov * 741ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov * @param val The array set to write. 742ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov * 743ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov * @hide 744ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov */ 745ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov public void writeArraySet(@Nullable ArraySet<? extends Object> val) { 746ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov final int size = (val != null) ? val.size() : -1; 747ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov writeInt(size); 748ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov for (int i = 0; i < size; i++) { 749ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov writeValue(val.valueAt(i)); 750ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov } 751ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov } 752ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov 753ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov /** 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a Bundle into the parcel at the current dataPosition(), 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeBundle(Bundle val) { 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7636aff905048ba3b03724f17e2aba9089872e14cd2Dianne Hackborn val.writeToParcel(this, 0); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 767719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Flatten a PersistableBundle into the parcel at the current dataPosition(), 768719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * growing dataCapacity() if needed. 769719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 770719e6b167041ffaffc2245f692714c8de191863fCraig Mautner public final void writePersistableBundle(PersistableBundle val) { 771719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (val == null) { 772719e6b167041ffaffc2245f692714c8de191863fCraig Mautner writeInt(-1); 773719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return; 774719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 775719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 776719e6b167041ffaffc2245f692714c8de191863fCraig Mautner val.writeToParcel(this, 0); 777719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 778719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 779719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 7805ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey * Flatten a Size into the parcel at the current dataPosition(), 7815ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey * growing dataCapacity() if needed. 7825ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey */ 7835ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey public final void writeSize(Size val) { 7845ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey writeInt(val.getWidth()); 7855ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey writeInt(val.getHeight()); 7865ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey } 7875ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey 7885ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey /** 7895ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey * Flatten a SizeF into the parcel at the current dataPosition(), 7905ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey * growing dataCapacity() if needed. 7915ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey */ 7925ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey public final void writeSizeF(SizeF val) { 7935ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey writeFloat(val.getWidth()); 7945ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey writeFloat(val.getHeight()); 7955ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey } 7965ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey 7975ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey /** 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a List into the parcel at the current dataPosition(), growing 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataCapacity() if needed. The List values are written using 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeValue} and must follow the specification there. 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeList(List val) { 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(val.get(i)); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten an Object array into the parcel at the current dataPosition(), 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. The array values are written using 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeValue} and must follow the specification there. 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeArray(Object[] val) { 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(val[i]); 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a generic SparseArray into the parcel at the current 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(), growing dataCapacity() if needed. The SparseArray 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values are written using {@link #writeValue} and must follow the 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specification there. 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeSparseArray(SparseArray<Object> val) { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val.keyAt(i)); 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(val.valueAt(i)); 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeSparseBooleanArray(SparseBooleanArray val) { 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val.keyAt(i)); 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeByte((byte)(val.valueAt(i) ? 1 : 0)); 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeBooleanArray(boolean[] val) { 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val[i] ? 1 : 0); 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean[] createBooleanArray() { 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // >>2 as a fast divide-by-4 works in the create*Array() functions 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // because dataAvail() will never return a negative number. 4 is 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the size of a stored boolean in the stream. 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 2)) { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean[] val = new boolean[N]; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readInt() != 0; 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readBooleanArray(boolean[] val) { 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readInt() != 0; 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeCharArray(char[] val) { 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt((int)val[i]); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final char[] createCharArray() { 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 2)) { 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char[] val = new char[N]; 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = (char)readInt(); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readCharArray(char[] val) { 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = (char)readInt(); 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeIntArray(int[] val) { 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val[i]); 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int[] createIntArray() { 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 2)) { 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] val = new int[N]; 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readInt(); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readIntArray(int[] val) { 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readInt(); 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeLongArray(long[] val) { 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeLong(val[i]); 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final long[] createLongArray() { 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // >>3 because stored longs are 64 bits 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 3)) { 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long[] val = new long[N]; 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readLong(); 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readLongArray(long[] val) { 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readLong(); 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeFloatArray(float[] val) { 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeFloat(val[i]); 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float[] createFloatArray() { 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // >>2 because stored floats are 4 bytes 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 2)) { 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] val = new float[N]; 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readFloat(); 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readFloatArray(float[] val) { 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readFloat(); 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeDoubleArray(double[] val) { 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeDouble(val[i]); 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final double[] createDoubleArray() { 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // >>3 because stored doubles are 8 bytes 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 3)) { 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double[] val = new double[N]; 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readDouble(); 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readDoubleArray(double[] val) { 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readDouble(); 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeStringArray(String[] val) { 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(val[i]); 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final String[] createStringArray() { 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0) { 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] val = new String[N]; 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readString(); 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readStringArray(String[] val) { 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readString(); 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeBinderArray(IBinder[] val) { 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStrongBinder(val[i]); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 114108bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert /** 114208bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * @hide 114308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert */ 114408bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert public final void writeCharSequenceArray(CharSequence[] val) { 114508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert if (val != null) { 114608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert int N = val.length; 114708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert writeInt(N); 114808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert for (int i=0; i<N; i++) { 114908bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert writeCharSequence(val[i]); 115008bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 115108bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } else { 115208bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert writeInt(-1); 115308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 115408bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 115508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 11563d07c94c393831091958fe6a98811843db8973bdDianne Hackborn /** 11573d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * @hide 11583d07c94c393831091958fe6a98811843db8973bdDianne Hackborn */ 11593d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public final void writeCharSequenceList(ArrayList<CharSequence> val) { 11603d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (val != null) { 11613d07c94c393831091958fe6a98811843db8973bdDianne Hackborn int N = val.size(); 11623d07c94c393831091958fe6a98811843db8973bdDianne Hackborn writeInt(N); 11633d07c94c393831091958fe6a98811843db8973bdDianne Hackborn for (int i=0; i<N; i++) { 11643d07c94c393831091958fe6a98811843db8973bdDianne Hackborn writeCharSequence(val.get(i)); 11653d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 11663d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } else { 11673d07c94c393831091958fe6a98811843db8973bdDianne Hackborn writeInt(-1); 11683d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 11693d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 11703d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final IBinder[] createBinderArray() { 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0) { 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder[] val = new IBinder[N]; 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readStrongBinder(); 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readBinderArray(IBinder[] val) { 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readStrongBinder(); 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a List containing a particular object type into the parcel, at 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current dataPosition() and growing dataCapacity() if needed. The 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type of the objects in the list must be one that implements Parcelable. 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike the generic writeList() method, however, only the raw data of the 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects is written and not their type, so you must use the corresponding 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * readTypedList() to unmarshall them. 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val The list of objects to be written. 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #createTypedArrayList 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readTypedList 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Parcelable 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T extends Parcelable> void writeTypedList(List<T> val) { 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T item = val.get(i); 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item != null) { 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(1); 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.writeToParcel(this, 0); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(0); 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a List containing String objects into the parcel, at 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current dataPosition() and growing dataCapacity() if needed. They 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can later be retrieved with {@link #createStringArrayList} or 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readStringList}. 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val The list of strings to be written. 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #createStringArrayList 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readStringList 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeStringList(List<String> val) { 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(val.get(i)); 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a List containing IBinder objects into the parcel, at 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current dataPosition() and growing dataCapacity() if needed. They 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can later be retrieved with {@link #createBinderArrayList} or 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readBinderList}. 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val The list of strings to be written. 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #createBinderArrayList 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readBinderList 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeBinderList(List<IBinder> val) { 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStrongBinder(val.get(i)); 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a heterogeneous array containing a particular object type into 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel, at 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current dataPosition() and growing dataCapacity() if needed. The 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type of the objects in the array must be one that implements Parcelable. 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike the {@link #writeParcelableArray} method, however, only the 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * raw data of the objects is written and not their type, so you must use 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readTypedArray} with the correct corresponding 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable.Creator} implementation to unmarshall them. 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val The array of objects to be written. 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcelableFlags Contextual flags as per 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}. 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readTypedArray 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeParcelableArray 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Parcelable.Creator 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T extends Parcelable> void writeTypedArray(T[] val, 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int parcelableFlags) { 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T item = val[i]; 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item != null) { 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(1); 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.writeToParcel(this, parcelableFlags); 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(0); 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13178dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * Flatten the Parcelable object into the parcel. 13188dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * 13198dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * @param val The Parcelable object to be written. 13208dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * @param parcelableFlags Contextual flags as per 13218dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}. 13228dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * 13238dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * @see #readTypedObject 13248dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen */ 13258dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen public final <T extends Parcelable> void writeTypedObject(T val, int parcelableFlags) { 13268dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen if (val != null) { 13278dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen writeInt(1); 13288dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen val.writeToParcel(this, parcelableFlags); 13298dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen } else { 13308dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen writeInt(0); 13318dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen } 13328dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen } 13338dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen 13348dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen /** 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a generic object in to a parcel. The given Object value may 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * currently be one of the following types: 1337b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> null 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> String 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Byte 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Short 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Integer 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Long 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Float 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Double 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Boolean 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> String[] 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> boolean[] 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> byte[] 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> int[] 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> long[] 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Object[] (supporting objects of the same type defined here). 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link Bundle} 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Map (as supported by {@link #writeMap}). 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Any object that implements the {@link Parcelable} protocol. 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Parcelable[] 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> CharSequence (as supported by {@link TextUtils#writeToParcel}). 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> List (as supported by {@link #writeList}). 1360b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * <li> {@link SparseArray} (as supported by {@link #writeSparseArray(SparseArray)}). 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link IBinder} 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Any object that implements Serializable (but see 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeSerializable} for caveats). Note that all of the 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous types have relatively efficient implementations for 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * writing to a Parcel; having to rely on the generic serialization 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * approach is much less efficient and should be avoided whenever 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possible. 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 1369b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * 1370b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * <p class="caution">{@link Parcelable} objects are written with 1371b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * {@link Parcelable#writeToParcel} using contextual flags of 0. When 1372b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * serializing objects containing {@link ParcelFileDescriptor}s, 1373b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * this may result in file descriptor leaks when they are returned from 1374b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * Binder calls (where {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} 1375b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * should be used).</p> 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeValue(Object v) { 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == null) { 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_NULL); 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof String) { 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_STRING); 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString((String) v); 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Integer) { 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_INTEGER); 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt((Integer) v); 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Map) { 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_MAP); 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeMap((Map) v); 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Bundle) { 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Must be before Parcelable 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BUNDLE); 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeBundle((Bundle) v); 1393ceafe5ed8a9968752c9454ae67428caf8c6719e6Samuel Tan } else if (v instanceof PersistableBundle) { 1394ceafe5ed8a9968752c9454ae67428caf8c6719e6Samuel Tan writeInt(VAL_PERSISTABLEBUNDLE); 1395ceafe5ed8a9968752c9454ae67428caf8c6719e6Samuel Tan writePersistableBundle((PersistableBundle) v); 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Parcelable) { 1397ceafe5ed8a9968752c9454ae67428caf8c6719e6Samuel Tan // IMPOTANT: cases for classes that implement Parcelable must 1398ceafe5ed8a9968752c9454ae67428caf8c6719e6Samuel Tan // come before the Parcelable case, so that their specific VAL_* 1399ceafe5ed8a9968752c9454ae67428caf8c6719e6Samuel Tan // types will be written. 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_PARCELABLE); 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeParcelable((Parcelable) v, 0); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Short) { 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_SHORT); 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(((Short) v).intValue()); 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Long) { 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_LONG); 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeLong((Long) v); 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Float) { 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_FLOAT); 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeFloat((Float) v); 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Double) { 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_DOUBLE); 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeDouble((Double) v); 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Boolean) { 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BOOLEAN); 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt((Boolean) v ? 1 : 0); 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof CharSequence) { 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Must be after String 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_CHARSEQUENCE); 142008bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert writeCharSequence((CharSequence) v); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof List) { 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_LIST); 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeList((List) v); 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof SparseArray) { 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_SPARSEARRAY); 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeSparseArray((SparseArray) v); 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof boolean[]) { 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BOOLEANARRAY); 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeBooleanArray((boolean[]) v); 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof byte[]) { 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BYTEARRAY); 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeByteArray((byte[]) v); 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof String[]) { 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_STRINGARRAY); 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStringArray((String[]) v); 143608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } else if (v instanceof CharSequence[]) { 143708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert // Must be after String[] and before Object[] 143808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert writeInt(VAL_CHARSEQUENCEARRAY); 143908bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert writeCharSequenceArray((CharSequence[]) v); 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof IBinder) { 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_IBINDER); 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStrongBinder((IBinder) v); 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Parcelable[]) { 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_PARCELABLEARRAY); 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeParcelableArray((Parcelable[]) v, 0); 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof int[]) { 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_INTARRAY); 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeIntArray((int[]) v); 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof long[]) { 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_LONGARRAY); 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeLongArray((long[]) v); 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Byte) { 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BYTE); 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt((Byte) v); 14555ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey } else if (v instanceof Size) { 14565ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey writeInt(VAL_SIZE); 14575ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey writeSize((Size) v); 14585ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey } else if (v instanceof SizeF) { 14595ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey writeInt(VAL_SIZEF); 14605ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey writeSizeF((SizeF) v); 1461a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan } else if (v instanceof double[]) { 1462a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan writeInt(VAL_DOUBLEARRAY); 1463a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan writeDoubleArray((double[]) v); 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1465ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin Class<?> clazz = v.getClass(); 1466ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin if (clazz.isArray() && clazz.getComponentType() == Object.class) { 1467ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin // Only pure Object[] are written here, Other arrays of non-primitive types are 1468ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin // handled by serialization as this does not record the component type. 1469ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin writeInt(VAL_OBJECTARRAY); 1470ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin writeArray((Object[]) v); 1471ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin } else if (v instanceof Serializable) { 1472ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin // Must be last 1473ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin writeInt(VAL_SERIALIZABLE); 1474ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin writeSerializable((Serializable) v); 1475ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin } else { 1476ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin throw new RuntimeException("Parcel: unable to marshal value " + v); 1477ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin } 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten the name of the class of the Parcelable and its contents 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * into the parcel. 1484b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p The Parcelable object to be written. 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcelableFlags Contextual flags as per 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}. 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeParcelable(Parcelable p, int parcelableFlags) { 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) { 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(null); 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 149444e440cc7e834de7811f005998acb32716835b00Neil Fuller writeParcelableCreator(p); 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.writeToParcel(this, parcelableFlags); 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1498d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn /** @hide */ 1499d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn public final void writeParcelableCreator(Parcelable p) { 1500d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn String name = p.getClass().getName(); 1501d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn writeString(name); 1502d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 1503d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a generic serializable object in to a Parcel. It is strongly 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recommended that this method be avoided, since the serialization 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * overhead is extremely large, and this approach will be much slower than 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using the other approaches to writing data in to a Parcel. 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeSerializable(Serializable s) { 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) { 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(null); 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = s.getClass().getName(); 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(name); 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ByteArrayOutputStream baos = new ByteArrayOutputStream(); 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ObjectOutputStream oos = new ObjectOutputStream(baos); 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oos.writeObject(s); 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oos.close(); 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeByteArray(baos.toByteArray()); 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException ioe) { 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Parcelable encountered " + 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IOException writing serializable object (name = " + name + 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ")", ioe); 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special function for writing an exception result at the header of 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a parcel, to be used when returning an exception from a transaction. 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that this currently only supports a few exception types; any other 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * exception will be re-thrown by this function as a RuntimeException 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (to be caught by the system's last-resort exception handling when 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dispatching a transaction). 1539a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The supported exception types are: 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link BadParcelableException} 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link IllegalArgumentException} 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link IllegalStateException} 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link NullPointerException} 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link SecurityException} 15477e7144218e8681fff2065a891de517bad6fe1b38Dianne Hackborn * <li>{@link NetworkOnMainThreadException} 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 1549a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan * 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param e The Exception to be written. 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeNoException 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readException 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeException(Exception e) { 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int code = 0; 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e instanceof SecurityException) { 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_SECURITY; 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (e instanceof BadParcelableException) { 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_BAD_PARCELABLE; 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (e instanceof IllegalArgumentException) { 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_ILLEGAL_ARGUMENT; 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (e instanceof NullPointerException) { 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_NULL_POINTER; 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (e instanceof IllegalStateException) { 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_ILLEGAL_STATE; 15677e7144218e8681fff2065a891de517bad6fe1b38Dianne Hackborn } else if (e instanceof NetworkOnMainThreadException) { 15687e7144218e8681fff2065a891de517bad6fe1b38Dianne Hackborn code = EX_NETWORK_MAIN_THREAD; 156933d738a10209d4dc882a65285d6e71cfaeabe769Dianne Hackborn } else if (e instanceof UnsupportedOperationException) { 157033d738a10209d4dc882a65285d6e71cfaeabe769Dianne Hackborn code = EX_UNSUPPORTED_OPERATION; 157180fd1208b99fbb88f24faa5d55183cdbbdeb6777Christopher Wiley } else if (e instanceof ServiceSpecificException) { 157280fd1208b99fbb88f24faa5d55183cdbbdeb6777Christopher Wiley code = EX_SERVICE_SPECIFIC; 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(code); 1575703e5d3c7fbeb8ca0978045db01d40318f838612Brad Fitzpatrick StrictMode.clearGatheredViolations(); 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == 0) { 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e instanceof RuntimeException) { 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw (RuntimeException) e; 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(e.getMessage()); 158380fd1208b99fbb88f24faa5d55183cdbbdeb6777Christopher Wiley if (e instanceof ServiceSpecificException) { 158480fd1208b99fbb88f24faa5d55183cdbbdeb6777Christopher Wiley writeInt(((ServiceSpecificException)e).errorCode); 158580fd1208b99fbb88f24faa5d55183cdbbdeb6777Christopher Wiley } 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special function for writing information at the front of the Parcel 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indicating that no exception occurred. 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeException 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readException 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeNoException() { 15965b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // Despite the name of this function ("write no exception"), 15975b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // it should instead be thought of as "write the RPC response 15985b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // header", but because this function name is written out by 15995b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // the AIDL compiler, we're not going to rename it. 16005b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // 16015b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // The response header, in the non-exception case (see also 16025b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // writeException above, also called by the AIDL compiler), is 16035b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // either a 0 (the default case), or EX_HAS_REPLY_HEADER if 16045b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // StrictMode has gathered up violations that have occurred 16055b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // during a Binder call, in which case we write out the number 16065b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // of violations and their details, serialized, before the 16075b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // actual RPC respons data. The receiving end of this is 16085b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // readException(), below. 16095b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick if (StrictMode.hasGatheredViolations()) { 16105b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick writeInt(EX_HAS_REPLY_HEADER); 16115b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick final int sizePosition = dataPosition(); 16125b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick writeInt(0); // total size of fat header, to be filled in later 16135b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick StrictMode.writeGatheredViolationsToParcel(this); 16145b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick final int payloadPosition = dataPosition(); 16155b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick setDataPosition(sizePosition); 16165b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick writeInt(payloadPosition - sizePosition); // header size 16175b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick setDataPosition(payloadPosition); 16185b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } else { 16195b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick writeInt(0); 16205b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special function for reading an exception result from the header of 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a parcel, to be used after receiving the result of a transaction. This 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will throw the exception for you if it had been written to the Parcel, 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise return and let you read the normal result data from the Parcel. 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeException 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeNoException 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readException() { 16335b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick int code = readExceptionCode(); 16345b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick if (code != 0) { 16355b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick String msg = readString(); 16365b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick readException(code, msg); 16375b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } 16385b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } 16395b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick 16405b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick /** 16415b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * Parses the header of a Binder call's response Parcel and 16425b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * returns the exception code. Deals with lite or fat headers. 16435b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * In the common successful case, this header is generally zero. 16445b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * In less common cases, it's a small negative number and will be 16455b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * followed by an error string. 16465b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * 16475b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * This exists purely for android.database.DatabaseUtils and 16485b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * insulating it from having to handle fat headers as returned by 16495b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * e.g. StrictMode-induced RPC responses. 16505b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * 16515b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * @hide 16525b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick */ 16535b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick public final int readExceptionCode() { 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int code = readInt(); 16555b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick if (code == EX_HAS_REPLY_HEADER) { 16565b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick int headerSize = readInt(); 16575b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick if (headerSize == 0) { 16585b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick Log.e(TAG, "Unexpected zero-sized Parcel reply header."); 16595b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } else { 16605b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // Currently the only thing in the header is StrictMode stacks, 16615b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // but discussions around event/RPC tracing suggest we might 16625b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // put that here too. If so, switch on sub-header tags here. 16635b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // But for now, just parse out the StrictMode stuff. 16645b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick StrictMode.readAndHandleBinderCallViolations(this); 16655b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } 16665b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // And fat response headers are currently only used when 16675b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // there are no exceptions, so return no error: 16685b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick return 0; 16695b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } 16705b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick return code; 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1674879ea451cefa535803d9742506cf51e2e0df75a7Mark Doliner * Throw an exception with the given message. Not intended for use 1675879ea451cefa535803d9742506cf51e2e0df75a7Mark Doliner * outside the Parcel class. 1676879ea451cefa535803d9742506cf51e2e0df75a7Mark Doliner * 1677879ea451cefa535803d9742506cf51e2e0df75a7Mark Doliner * @param code Used to determine which exception class to throw. 1678879ea451cefa535803d9742506cf51e2e0df75a7Mark Doliner * @param msg The exception message. 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readException(int code, String msg) { 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (code) { 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_SECURITY: 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException(msg); 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_BAD_PARCELABLE: 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException(msg); 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_ILLEGAL_ARGUMENT: 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(msg); 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_NULL_POINTER: 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException(msg); 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_ILLEGAL_STATE: 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException(msg); 16927e7144218e8681fff2065a891de517bad6fe1b38Dianne Hackborn case EX_NETWORK_MAIN_THREAD: 16937e7144218e8681fff2065a891de517bad6fe1b38Dianne Hackborn throw new NetworkOnMainThreadException(); 169433d738a10209d4dc882a65285d6e71cfaeabe769Dianne Hackborn case EX_UNSUPPORTED_OPERATION: 169533d738a10209d4dc882a65285d6e71cfaeabe769Dianne Hackborn throw new UnsupportedOperationException(msg); 169680fd1208b99fbb88f24faa5d55183cdbbdeb6777Christopher Wiley case EX_SERVICE_SPECIFIC: 169780fd1208b99fbb88f24faa5d55183cdbbdeb6777Christopher Wiley throw new ServiceSpecificException(readInt(), msg); 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Unknown exception code: " + code 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " msg " + msg); 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read an integer value from the parcel at the current dataPosition(). 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1706047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final int readInt() { 1707047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeReadInt(mNativePtr); 1708047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a long integer value from the parcel at the current dataPosition(). 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1713047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final long readLong() { 1714047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeReadLong(mNativePtr); 1715047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a floating point value from the parcel at the current 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1721047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final float readFloat() { 1722047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeReadFloat(mNativePtr); 1723047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a double precision floating point value from the parcel at the 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1729047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final double readDouble() { 1730047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeReadDouble(mNativePtr); 1731047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a string value from the parcel at the current dataPosition(). 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1736047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final String readString() { 1737047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeReadString(mNativePtr); 1738047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 174108bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * Read a CharSequence value from the parcel at the current dataPosition(). 174208bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * @hide 174308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert */ 174408bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert public final CharSequence readCharSequence() { 174508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(this); 174608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 174708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 174808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert /** 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read an object from the parcel at the current dataPosition(). 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1751047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final IBinder readStrongBinder() { 1752047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeReadStrongBinder(mNativePtr); 1753047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a FileDescriptor from the parcel at the current dataPosition(). 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ParcelFileDescriptor readFileDescriptor() { 1759047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey FileDescriptor fd = nativeReadFileDescriptor(mNativePtr); 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fd != null ? new ParcelFileDescriptor(fd) : null; 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1763da5a3e12f4f8f965c57d6f93c74190f43ea233f3Jeff Sharkey /** {@hide} */ 1764da5a3e12f4f8f965c57d6f93c74190f43ea233f3Jeff Sharkey public final FileDescriptor readRawFileDescriptor() { 1765da5a3e12f4f8f965c57d6f93c74190f43ea233f3Jeff Sharkey return nativeReadFileDescriptor(mNativePtr); 1766da5a3e12f4f8f965c57d6f93c74190f43ea233f3Jeff Sharkey } 1767da5a3e12f4f8f965c57d6f93c74190f43ea233f3Jeff Sharkey 17682f974b252f819405a54798c9736f448f979a095fCasey Dahlin /** 17692f974b252f819405a54798c9736f448f979a095fCasey Dahlin * {@hide} 17702f974b252f819405a54798c9736f448f979a095fCasey Dahlin * Read and return a new array of FileDescriptors from the parcel. 17712f974b252f819405a54798c9736f448f979a095fCasey Dahlin * @return the FileDescriptor array, or null if the array is null. 17722f974b252f819405a54798c9736f448f979a095fCasey Dahlin **/ 17732f974b252f819405a54798c9736f448f979a095fCasey Dahlin public final FileDescriptor[] createRawFileDescriptorArray() { 17742f974b252f819405a54798c9736f448f979a095fCasey Dahlin int N = readInt(); 17752f974b252f819405a54798c9736f448f979a095fCasey Dahlin if (N < 0) { 17762f974b252f819405a54798c9736f448f979a095fCasey Dahlin return null; 17772f974b252f819405a54798c9736f448f979a095fCasey Dahlin } 17782f974b252f819405a54798c9736f448f979a095fCasey Dahlin FileDescriptor[] f = new FileDescriptor[N]; 17792f974b252f819405a54798c9736f448f979a095fCasey Dahlin for (int i = 0; i < N; i++) { 17802f974b252f819405a54798c9736f448f979a095fCasey Dahlin f[i] = readRawFileDescriptor(); 17812f974b252f819405a54798c9736f448f979a095fCasey Dahlin } 17822f974b252f819405a54798c9736f448f979a095fCasey Dahlin return f; 17832f974b252f819405a54798c9736f448f979a095fCasey Dahlin } 17842f974b252f819405a54798c9736f448f979a095fCasey Dahlin 17852f974b252f819405a54798c9736f448f979a095fCasey Dahlin /** 17862f974b252f819405a54798c9736f448f979a095fCasey Dahlin * {@hide} 17872f974b252f819405a54798c9736f448f979a095fCasey Dahlin * Read an array of FileDescriptors from a parcel. 17882f974b252f819405a54798c9736f448f979a095fCasey Dahlin * The passed array must be exactly the length of the array in the parcel. 17892f974b252f819405a54798c9736f448f979a095fCasey Dahlin * @return the FileDescriptor array, or null if the array is null. 17902f974b252f819405a54798c9736f448f979a095fCasey Dahlin **/ 17912f974b252f819405a54798c9736f448f979a095fCasey Dahlin public final void readRawFileDescriptorArray(FileDescriptor[] val) { 17922f974b252f819405a54798c9736f448f979a095fCasey Dahlin int N = readInt(); 17932f974b252f819405a54798c9736f448f979a095fCasey Dahlin if (N == val.length) { 17942f974b252f819405a54798c9736f448f979a095fCasey Dahlin for (int i=0; i<N; i++) { 17952f974b252f819405a54798c9736f448f979a095fCasey Dahlin val[i] = readRawFileDescriptor(); 17962f974b252f819405a54798c9736f448f979a095fCasey Dahlin } 17972f974b252f819405a54798c9736f448f979a095fCasey Dahlin } else { 17982f974b252f819405a54798c9736f448f979a095fCasey Dahlin throw new RuntimeException("bad array lengths"); 17992f974b252f819405a54798c9736f448f979a095fCasey Dahlin } 18002f974b252f819405a54798c9736f448f979a095fCasey Dahlin } 18012f974b252f819405a54798c9736f448f979a095fCasey Dahlin 18022f974b252f819405a54798c9736f448f979a095fCasey Dahlin 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ static native FileDescriptor openFileDescriptor(String file, 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mode) throws FileNotFoundException; 18059a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn /*package*/ static native FileDescriptor dupFileDescriptor(FileDescriptor orig) 18069a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn throws IOException; 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ static native void closeFileDescriptor(FileDescriptor desc) 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException; 1809c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn /*package*/ static native void clearFileDescriptor(FileDescriptor desc); 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a byte value from the parcel at the current dataPosition(). 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final byte readByte() { 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (byte)(readInt() & 0xff); 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Please use {@link #readBundle(ClassLoader)} instead (whose data must have 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been written with {@link #writeBundle}. Read into an existing Map object 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the parcel at the current dataPosition(). 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readMap(Map outVal, ClassLoader loader) { 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readMapInternal(outVal, N, loader); 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read into an existing List object from the parcel at the current 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(), using the given class loader to load any enclosed 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. If it is null, the default class loader is used. 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readList(List outVal, ClassLoader loader) { 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readListInternal(outVal, N, loader); 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Please use {@link #readBundle(ClassLoader)} instead (whose data must have 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been written with {@link #writeBundle}. Read and return a new HashMap 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object from the parcel at the current dataPosition(), using the given 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class loader to load any enclosed Parcelables. Returns null if 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the previously written map object was null. 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final HashMap readHashMap(ClassLoader loader) 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HashMap m = new HashMap(N); 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readMapInternal(m, N, loader); 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Bundle object from the parcel at the current 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written Bundle object was 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Bundle readBundle() { 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readBundle(null); 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Bundle object from the parcel at the current 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(), using the given class loader to initialize the class 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loader of the Bundle for later retrieval of Parcelable objects. 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns null if the previously written Bundle object was null. 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Bundle readBundle(ClassLoader loader) { 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length = readInt(); 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (length < 0) { 18744a7d824c3b41eafc4ff91d3253ff8a9ebd60a454Dianne Hackborn if (Bundle.DEBUG) Log.d(TAG, "null bundle: length=" + length); 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1877a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan 18786aff905048ba3b03724f17e2aba9089872e14cd2Dianne Hackborn final Bundle bundle = new Bundle(this, length); 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (loader != null) { 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setClassLoader(loader); 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bundle; 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1886719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Read and return a new Bundle object from the parcel at the current 1887719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * dataPosition(). Returns null if the previously written Bundle object was 1888719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * null. 1889719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1890719e6b167041ffaffc2245f692714c8de191863fCraig Mautner public final PersistableBundle readPersistableBundle() { 1891719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return readPersistableBundle(null); 1892719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1893719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1894719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1895719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Read and return a new Bundle object from the parcel at the current 1896719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * dataPosition(), using the given class loader to initialize the class 1897719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * loader of the Bundle for later retrieval of Parcelable objects. 1898719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns null if the previously written Bundle object was null. 1899719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1900719e6b167041ffaffc2245f692714c8de191863fCraig Mautner public final PersistableBundle readPersistableBundle(ClassLoader loader) { 1901719e6b167041ffaffc2245f692714c8de191863fCraig Mautner int length = readInt(); 1902719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (length < 0) { 1903719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (Bundle.DEBUG) Log.d(TAG, "null bundle: length=" + length); 1904719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1905719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1906719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1907719e6b167041ffaffc2245f692714c8de191863fCraig Mautner final PersistableBundle bundle = new PersistableBundle(this, length); 1908719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (loader != null) { 1909719e6b167041ffaffc2245f692714c8de191863fCraig Mautner bundle.setClassLoader(loader); 1910719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1911719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return bundle; 1912719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1913719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1914719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 19155ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey * Read a Size from the parcel at the current dataPosition(). 19165ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey */ 19175ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey public final Size readSize() { 19185ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey final int width = readInt(); 19195ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey final int height = readInt(); 19205ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey return new Size(width, height); 19215ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey } 19225ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey 19235ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey /** 19245ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey * Read a SizeF from the parcel at the current dataPosition(). 19255ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey */ 19265ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey public final SizeF readSizeF() { 19275ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey final float width = readFloat(); 19285ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey final float height = readFloat(); 19295ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey return new SizeF(width, height); 19305ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey } 19315ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey 19325ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey /** 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a byte[] object from the parcel. 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1935047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final byte[] createByteArray() { 1936047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeCreateByteArray(mNativePtr); 1937047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a byte[] object from the parcel and copy it into the 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given byte array. 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readByteArray(byte[] val) { 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: make this a native method to avoid the extra copy. 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] ba = createByteArray(); 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ba.length == val.length) { 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(ba, 0, val, 0, ba.length); 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 195490d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha * Read a blob of data from the parcel and return it as a byte array. 195590d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha * {@hide} 195639c12fab49075b715c253c68c84b5c10c3150197Sandeep Siddhartha * {@SystemApi} 195790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha */ 195890d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha public final byte[] readBlob() { 195990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha return nativeReadBlob(mNativePtr); 196090d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 196190d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 196290d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha /** 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a String[] object from the parcel. 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final String[] readStringArray() { 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] array = null; 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length = readInt(); 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (length >= 0) 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array = new String[length]; 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0 ; i < length ; i++) 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array[i] = readString(); 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return array; 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 198408bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * Read and return a CharSequence[] object from the parcel. 198508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * {@hide} 198608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert */ 198708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert public final CharSequence[] readCharSequenceArray() { 198808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert CharSequence[] array = null; 198908bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 199008bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert int length = readInt(); 199108bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert if (length >= 0) 199208bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert { 199308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert array = new CharSequence[length]; 199408bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 199508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert for (int i = 0 ; i < length ; i++) 199608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert { 199708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert array[i] = readCharSequence(); 199808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 199908bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 200008bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 200108bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert return array; 200208bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 200308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 200408bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert /** 20053d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * Read and return an ArrayList<CharSequence> object from the parcel. 20063d07c94c393831091958fe6a98811843db8973bdDianne Hackborn * {@hide} 20073d07c94c393831091958fe6a98811843db8973bdDianne Hackborn */ 20083d07c94c393831091958fe6a98811843db8973bdDianne Hackborn public final ArrayList<CharSequence> readCharSequenceList() { 20093d07c94c393831091958fe6a98811843db8973bdDianne Hackborn ArrayList<CharSequence> array = null; 20103d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 20113d07c94c393831091958fe6a98811843db8973bdDianne Hackborn int length = readInt(); 20123d07c94c393831091958fe6a98811843db8973bdDianne Hackborn if (length >= 0) { 20133d07c94c393831091958fe6a98811843db8973bdDianne Hackborn array = new ArrayList<CharSequence>(length); 20143d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 20153d07c94c393831091958fe6a98811843db8973bdDianne Hackborn for (int i = 0 ; i < length ; i++) { 20163d07c94c393831091958fe6a98811843db8973bdDianne Hackborn array.add(readCharSequence()); 20173d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 20183d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 20193d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 20203d07c94c393831091958fe6a98811843db8973bdDianne Hackborn return array; 20213d07c94c393831091958fe6a98811843db8973bdDianne Hackborn } 20223d07c94c393831091958fe6a98811843db8973bdDianne Hackborn 20233d07c94c393831091958fe6a98811843db8973bdDianne Hackborn /** 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new ArrayList object from the parcel at the current 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written list object was 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. The given class loader will be used to load any enclosed 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList readArrayList(ClassLoader loader) { 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList l = new ArrayList(N); 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readListInternal(l, N, loader); 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Object array from the parcel at the current 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written array was 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. The given class loader will be used to load any enclosed 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Object[] readArray(ClassLoader loader) { 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object[] l = new Object[N]; 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readArrayInternal(l, N, loader); 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new SparseArray object from the parcel at the current 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written list object was 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. The given class loader will be used to load any enclosed 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final SparseArray readSparseArray(ClassLoader loader) { 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseArray sa = new SparseArray(N); 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSparseArrayInternal(sa, N, loader); 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sa; 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new SparseBooleanArray object from the parcel at the current 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written list object was 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final SparseBooleanArray readSparseBooleanArray() { 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseBooleanArray sa = new SparseBooleanArray(N); 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSparseBooleanArrayInternal(sa, N); 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sa; 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new ArrayList containing a particular object type from 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel that was written with {@link #writeTypedList} at the 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). Returns null if the 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written list object was null. The list <em>must</em> have 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously been written via {@link #writeTypedList} with the same object 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type. 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing objects with the same data 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeTypedList 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> ArrayList<T> createTypedArrayList(Parcelable.Creator<T> c) { 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<T> l = new ArrayList<T>(N); 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.add(c.createFromParcel(this)); 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.add(null); 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read into the given List items containing a particular object type 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that were written with {@link #writeTypedList} at the 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). The list <em>must</em> have 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously been written via {@link #writeTypedList} with the same object 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type. 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing objects with the same data 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeTypedList 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> void readTypedList(List<T> list, Parcelable.Creator<T> c) { 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int M = list.size(); 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = 0; 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i < M && i < N; i++) { 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.set(i, c.createFromParcel(this)); 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.set(i, null); 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<N; i++) { 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(c.createFromParcel(this)); 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(null); 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<M; i++) { 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.remove(N); 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new ArrayList containing String objects from 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel that was written with {@link #writeStringList} at the 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). Returns null if the 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written list object was null. 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing strings with the same data 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeStringList 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<String> createStringArrayList() { 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> l = new ArrayList<String>(N); 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.add(readString()); 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new ArrayList containing IBinder objects from 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel that was written with {@link #writeBinderList} at the 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). Returns null if the 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written list object was null. 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing strings with the same data 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeBinderList 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<IBinder> createBinderArrayList() { 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<IBinder> l = new ArrayList<IBinder>(N); 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.add(readStrongBinder()); 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read into the given List items String objects that were written with 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeStringList} at the current dataPosition(). 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing strings with the same data 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeStringList 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readStringList(List<String> list) { 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int M = list.size(); 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = 0; 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i < M && i < N; i++) { 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.set(i, readString()); 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<N; i++) { 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(readString()); 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<M; i++) { 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.remove(N); 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read into the given List items IBinder objects that were written with 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeBinderList} at the current dataPosition(). 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing strings with the same data 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeBinderList 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readBinderList(List<IBinder> list) { 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int M = list.size(); 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = 0; 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i < M && i < N; i++) { 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.set(i, readStrongBinder()); 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<N; i++) { 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(readStrongBinder()); 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<M; i++) { 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.remove(N); 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new array containing a particular object type from 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel at the current dataPosition(). Returns null if the 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written array was null. The array <em>must</em> have 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously been written via {@link #writeTypedArray} with the same 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object type. 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created array containing objects with the same data 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeTypedArray 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> T[] createTypedArray(Parcelable.Creator<T> c) { 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T[] l = c.newArray(N); 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l[i] = c.createFromParcel(this); 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> void readTypedArray(T[] val, Parcelable.Creator<T> c) { 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = c.createFromParcel(this); 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = null; 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> T[] readTypedArray(Parcelable.Creator<T> c) { 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createTypedArray(c); 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22988dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * Read and return a typed Parcelable object from a parcel. 22998dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * Returns null if the previous written object was null. 23008dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * The object <em>must</em> have previous been written via 23018dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * {@link #writeTypedObject} with the same object type. 23028dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * 23038dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * @return A newly created object of the type that was previously 23048dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * written. 23058dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * 23068dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen * @see #writeTypedObject 23078dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen */ 23088dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen public final <T> T readTypedObject(Parcelable.Creator<T> c) { 23098dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen if (readInt() != 0) { 23108dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen return c.createFromParcel(this); 23118dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen } else { 23128dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen return null; 23138dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen } 23148dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen } 23158dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen 23168dea8744ac12a97533e8de0f8e56a58d630eb489Jens Ole Lauridsen /** 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a heterogeneous array of Parcelable objects into the Parcel. 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each object in the array is written along with its class name, so 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the correct class can later be instantiated. As a result, this 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has significantly more overhead than {@link #writeTypedArray}, but will 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * correctly handle an array containing more than one type of object. 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value The array of objects to be written. 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcelableFlags Contextual flags as per 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}. 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeTypedArray 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T extends Parcelable> void writeParcelableArray(T[] value, 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int parcelableFlags) { 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value != null) { 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = value.length; 23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeParcelable(value[i], parcelableFlags); 23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a typed object from a parcel. The given class loader will be 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used to load any enclosed Parcelables. If it is null, the default class 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loader will be used. 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Object readValue(ClassLoader loader) { 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type = readInt(); 23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_NULL: 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_STRING: 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readString(); 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_INTEGER: 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readInt(); 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_MAP: 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readHashMap(loader); 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_PARCELABLE: 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readParcelable(loader); 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_SHORT: 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (short) readInt(); 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_LONG: 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readLong(); 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_FLOAT: 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readFloat(); 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_DOUBLE: 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readDouble(); 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BOOLEAN: 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readInt() == 1; 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_CHARSEQUENCE: 238208bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert return readCharSequence(); 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_LIST: 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readArrayList(loader); 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BOOLEANARRAY: 2388a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan return createBooleanArray(); 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BYTEARRAY: 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createByteArray(); 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_STRINGARRAY: 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readStringArray(); 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert case VAL_CHARSEQUENCEARRAY: 239708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert return readCharSequenceArray(); 239808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_IBINDER: 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readStrongBinder(); 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_OBJECTARRAY: 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readArray(loader); 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_INTARRAY: 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createIntArray(); 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_LONGARRAY: 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createLongArray(); 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BYTE: 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readByte(); 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_SERIALIZABLE: 24155002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock return readSerializable(loader); 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_PARCELABLEARRAY: 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readParcelableArray(loader); 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_SPARSEARRAY: 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readSparseArray(loader); 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_SPARSEBOOLEANARRAY: 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readSparseBooleanArray(); 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BUNDLE: 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readBundle(loader); // loading will be deferred 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429719e6b167041ffaffc2245f692714c8de191863fCraig Mautner case VAL_PERSISTABLEBUNDLE: 2430719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return readPersistableBundle(loader); 2431719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 24325ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey case VAL_SIZE: 24335ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey return readSize(); 24345ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey 24355ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey case VAL_SIZEF: 24365ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey return readSizeF(); 24375ef33984d0cc50bf4654b0d8e9557ac34d44fdddJeff Sharkey 2438a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan case VAL_DOUBLEARRAY: 2439a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan return createDoubleArray(); 2440a8036660ea522e8509e4fd5c79bd4466ac6d9179Samuel Tan 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int off = dataPosition() - 4; 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException( 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Parcel " + this + ": Unmarshalling unknown type code " + type + " at offset " + off); 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Parcelable from the parcel. The given class loader 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be used to load any enclosed Parcelables. If it is null, the default 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class loader will be used. 24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param loader A ClassLoader from which to instantiate the Parcelable 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object, or null for the default class loader. 24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the newly created Parcelable, or null if a null 24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object has been written. 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws BadParcelableException Throws BadParcelableException if there 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was an error trying to instantiate the Parcelable. 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 245944e440cc7e834de7811f005998acb32716835b00Neil Fuller @SuppressWarnings("unchecked") 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T extends Parcelable> T readParcelable(ClassLoader loader) { 246144e440cc7e834de7811f005998acb32716835b00Neil Fuller Parcelable.Creator<?> creator = readParcelableCreator(loader); 2462d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn if (creator == null) { 2463d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return null; 2464d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 2465d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn if (creator instanceof Parcelable.ClassLoaderCreator<?>) { 246644e440cc7e834de7811f005998acb32716835b00Neil Fuller Parcelable.ClassLoaderCreator<?> classLoaderCreator = 246744e440cc7e834de7811f005998acb32716835b00Neil Fuller (Parcelable.ClassLoaderCreator<?>) creator; 246844e440cc7e834de7811f005998acb32716835b00Neil Fuller return (T) classLoaderCreator.createFromParcel(this, loader); 2469d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 247044e440cc7e834de7811f005998acb32716835b00Neil Fuller return (T) creator.createFromParcel(this); 2471d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 2472d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn 2473d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn /** @hide */ 247444e440cc7e834de7811f005998acb32716835b00Neil Fuller @SuppressWarnings("unchecked") 247544e440cc7e834de7811f005998acb32716835b00Neil Fuller public final <T extends Parcelable> T readCreator(Parcelable.Creator<?> creator, 2476d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn ClassLoader loader) { 2477d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn if (creator instanceof Parcelable.ClassLoaderCreator<?>) { 247844e440cc7e834de7811f005998acb32716835b00Neil Fuller Parcelable.ClassLoaderCreator<?> classLoaderCreator = 247944e440cc7e834de7811f005998acb32716835b00Neil Fuller (Parcelable.ClassLoaderCreator<?>) creator; 248044e440cc7e834de7811f005998acb32716835b00Neil Fuller return (T) classLoaderCreator.createFromParcel(this, loader); 2481d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 248244e440cc7e834de7811f005998acb32716835b00Neil Fuller return (T) creator.createFromParcel(this); 2483d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 2484d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn 2485d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn /** @hide */ 248644e440cc7e834de7811f005998acb32716835b00Neil Fuller public final Parcelable.Creator<?> readParcelableCreator(ClassLoader loader) { 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = readString(); 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 249144e440cc7e834de7811f005998acb32716835b00Neil Fuller Parcelable.Creator<?> creator; 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCreators) { 249344e440cc7e834de7811f005998acb32716835b00Neil Fuller HashMap<String,Parcelable.Creator<?>> map = mCreators.get(loader); 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (map == null) { 249544e440cc7e834de7811f005998acb32716835b00Neil Fuller map = new HashMap<>(); 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCreators.put(loader, map); 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project creator = map.get(name); 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (creator == null) { 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 250144e440cc7e834de7811f005998acb32716835b00Neil Fuller // If loader == null, explicitly emulate Class.forName(String) "caller 250244e440cc7e834de7811f005998acb32716835b00Neil Fuller // classloader" behavior. 250344e440cc7e834de7811f005998acb32716835b00Neil Fuller ClassLoader parcelableClassLoader = 250444e440cc7e834de7811f005998acb32716835b00Neil Fuller (loader == null ? getClass().getClassLoader() : loader); 250544e440cc7e834de7811f005998acb32716835b00Neil Fuller // Avoid initializing the Parcelable class until we know it implements 250644e440cc7e834de7811f005998acb32716835b00Neil Fuller // Parcelable and has the necessary CREATOR field. http://b/1171613. 250744e440cc7e834de7811f005998acb32716835b00Neil Fuller Class<?> parcelableClass = Class.forName(name, false /* initialize */, 250844e440cc7e834de7811f005998acb32716835b00Neil Fuller parcelableClassLoader); 250944e440cc7e834de7811f005998acb32716835b00Neil Fuller if (!Parcelable.class.isAssignableFrom(parcelableClass)) { 251044e440cc7e834de7811f005998acb32716835b00Neil Fuller throw new BadParcelableException("Parcelable protocol requires that the " 251144e440cc7e834de7811f005998acb32716835b00Neil Fuller + "class implements Parcelable"); 251244e440cc7e834de7811f005998acb32716835b00Neil Fuller } 251344e440cc7e834de7811f005998acb32716835b00Neil Fuller Field f = parcelableClass.getField("CREATOR"); 251444e440cc7e834de7811f005998acb32716835b00Neil Fuller if ((f.getModifiers() & Modifier.STATIC) == 0) { 251544e440cc7e834de7811f005998acb32716835b00Neil Fuller throw new BadParcelableException("Parcelable protocol requires " 251644e440cc7e834de7811f005998acb32716835b00Neil Fuller + "the CREATOR object to be static on class " + name); 251744e440cc7e834de7811f005998acb32716835b00Neil Fuller } 251844e440cc7e834de7811f005998acb32716835b00Neil Fuller Class<?> creatorType = f.getType(); 251944e440cc7e834de7811f005998acb32716835b00Neil Fuller if (!Parcelable.Creator.class.isAssignableFrom(creatorType)) { 252044e440cc7e834de7811f005998acb32716835b00Neil Fuller // Fail before calling Field.get(), not after, to avoid initializing 252144e440cc7e834de7811f005998acb32716835b00Neil Fuller // parcelableClass unnecessarily. 252244e440cc7e834de7811f005998acb32716835b00Neil Fuller throw new BadParcelableException("Parcelable protocol requires a " 252344e440cc7e834de7811f005998acb32716835b00Neil Fuller + "Parcelable.Creator object called " 252444e440cc7e834de7811f005998acb32716835b00Neil Fuller + "CREATOR on class " + name); 252544e440cc7e834de7811f005998acb32716835b00Neil Fuller } 252644e440cc7e834de7811f005998acb32716835b00Neil Fuller creator = (Parcelable.Creator<?>) f.get(null); 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (IllegalAccessException e) { 252944e440cc7e834de7811f005998acb32716835b00Neil Fuller Log.e(TAG, "Illegal access when unmarshalling: " + name, e); 25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException( 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IllegalAccessException when unmarshalling: " + name); 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (ClassNotFoundException e) { 253444e440cc7e834de7811f005998acb32716835b00Neil Fuller Log.e(TAG, "Class not found when unmarshalling: " + name, e); 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException( 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "ClassNotFoundException when unmarshalling: " + name); 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (NoSuchFieldException e) { 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException("Parcelable protocol requires a " 254044e440cc7e834de7811f005998acb32716835b00Neil Fuller + "Parcelable.Creator object called " 254144e440cc7e834de7811f005998acb32716835b00Neil Fuller + "CREATOR on class " + name); 254297a72f6693a7bee3255b2307c6bb18f66669a36cIrfan Sheriff } 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (creator == null) { 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException("Parcelable protocol requires a " 254544e440cc7e834de7811f005998acb32716835b00Neil Fuller + "non-null Parcelable.Creator object called " 254644e440cc7e834de7811f005998acb32716835b00Neil Fuller + "CREATOR on class " + name); 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(name, creator); 25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2553d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return creator; 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Parcelable array from the parcel. 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The given class loader will be used to load any enclosed 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Parcelable array, or null if the array is null 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Parcelable[] readParcelableArray(ClassLoader loader) { 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable[] p = new Parcelable[N]; 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 256944e440cc7e834de7811f005998acb32716835b00Neil Fuller p[i] = readParcelable(loader); 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Serializable object from the parcel. 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Serializable object, or null if the Serializable name 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wasn't found in the parcel. 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Serializable readSerializable() { 25805002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock return readSerializable(null); 25815002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock } 25825002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock 25835002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock private final Serializable readSerializable(final ClassLoader loader) { 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = readString(); 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For some reason we were unable to read the name of the Serializable (either there 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is nothing left in the Parcel to read, or the next value wasn't a String), so 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return null, which indicates that the name wasn't found in the parcel. 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] serializedData = createByteArray(); 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ByteArrayInputStream bais = new ByteArrayInputStream(serializedData); 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25955002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock ObjectInputStream ois = new ObjectInputStream(bais) { 25965002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock @Override 25975002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock protected Class<?> resolveClass(ObjectStreamClass osClass) 25985002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock throws IOException, ClassNotFoundException { 25995002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock // try the custom classloader if provided 26005002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock if (loader != null) { 26015002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock Class<?> c = Class.forName(osClass.getName(), false, loader); 26025002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock if (c != null) { 26035002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock return c; 26045002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock } 26055002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock } 26065002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock return super.resolveClass(osClass); 26075002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock } 26085002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock }; 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (Serializable) ois.readObject(); 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException ioe) { 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Parcelable encountered " + 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IOException reading a Serializable object (name = " + name + 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ")", ioe); 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (ClassNotFoundException cnfe) { 26155002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock throw new RuntimeException("Parcelable encountered " + 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "ClassNotFoundException reading a Serializable object (name = " 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + name + ")", cnfe); 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Cache of previously looked up CREATOR.createFromParcel() methods for 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // particular classes. Keys are the names of the classes, values are 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Method objects. 262444e440cc7e834de7811f005998acb32716835b00Neil Fuller private static final HashMap<ClassLoader,HashMap<String,Parcelable.Creator<?>>> 262544e440cc7e834de7811f005998acb32716835b00Neil Fuller mCreators = new HashMap<>(); 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2627b34a4615f82a4ad8ce2c0687f47e2113e057e893Narayan Kamath /** @hide for internal use only. */ 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static protected final Parcel obtain(int obj) { 26298ab665dda40ab10e60fc69392022171f454af530Ashok Bhat throw new UnsupportedOperationException(); 26308ab665dda40ab10e60fc69392022171f454af530Ashok Bhat } 26318ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 26328ab665dda40ab10e60fc69392022171f454af530Ashok Bhat /** @hide */ 26338ab665dda40ab10e60fc69392022171f454af530Ashok Bhat static protected final Parcel obtain(long obj) { 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Parcel[] pool = sHolderPool; 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (pool) { 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel p; 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<POOL_SIZE; i++) { 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = pool[i]; 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p != null) { 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pool[i] = null; 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) { 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStack = new RuntimeException(); 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.init(obj); 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Parcel(obj); 26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26528ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private Parcel(long nativePtr) { 26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) { 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStack = new RuntimeException(); 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26565b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick //Log.i(TAG, "Initializing obj=0x" + Integer.toHexString(obj), mStack); 2657047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey init(nativePtr); 2658047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 2659047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 26608ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private void init(long nativePtr) { 2661047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey if (nativePtr != 0) { 2662047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey mNativePtr = nativePtr; 2663047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey mOwnsNativeParcelObject = false; 2664047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } else { 2665047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey mNativePtr = nativeCreate(); 2666047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey mOwnsNativeParcelObject = true; 2667047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 2668047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 2669047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 2670047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey private void freeBuffer() { 2671047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey if (mOwnsNativeParcelObject) { 26720450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos updateNativeSize(nativeFreeBuffer(mNativePtr)); 2673047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 2674047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 2675047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 2676047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey private void destroy() { 2677047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey if (mNativePtr != 0) { 2678047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey if (mOwnsNativeParcelObject) { 2679047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeDestroy(mNativePtr); 26800450565d9a6de0f0828c9ad8ce16c8645c6f394cAdrian Roos updateNativeSize(0); 2681047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 2682047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey mNativePtr = 0; 2683047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) { 26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mStack != null) { 26905b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick Log.w(TAG, "Client did not call Parcel.recycle()", mStack); 26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project destroy(); 26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26966aff905048ba3b03724f17e2aba9089872e14cd2Dianne Hackborn /* package */ void readMapInternal(Map outVal, int N, 26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClassLoader loader) { 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object key = readValue(loader); 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = readValue(loader); 27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal.put(key, value); 27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2706b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn /* package */ void readArrayMapInternal(ArrayMap outVal, int N, 2707b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn ClassLoader loader) { 2708e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn if (DEBUG_ARRAY_MAP) { 2709e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn RuntimeException here = new RuntimeException("here"); 2710e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn here.fillInStackTrace(); 2711e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn Log.d(TAG, "Reading " + N + " ArrayMap entries", here); 2712e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn } 27138aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn int startPos; 2714b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn while (N > 0) { 27158aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn if (DEBUG_ARRAY_MAP) startPos = dataPosition(); 27169c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn String key = readString(); 2717b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn Object value = readValue(loader); 27188aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn if (DEBUG_ARRAY_MAP) Log.d(TAG, " Read #" + (N-1) + " " 27198aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn + (dataPosition()-startPos) + " bytes: key=0x" 27208aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn + Integer.toHexString((key != null ? key.hashCode() : 0)) + " " + key); 2721b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn outVal.append(key, value); 2722b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn N--; 2723b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn } 27249c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn outVal.validate(); 2725b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn } 2726b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn 2727e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn /* package */ void readArrayMapSafelyInternal(ArrayMap outVal, int N, 2728e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn ClassLoader loader) { 2729e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn if (DEBUG_ARRAY_MAP) { 2730e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn RuntimeException here = new RuntimeException("here"); 2731e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn here.fillInStackTrace(); 2732e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn Log.d(TAG, "Reading safely " + N + " ArrayMap entries", here); 2733e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn } 2734e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn while (N > 0) { 27359c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn String key = readString(); 2736e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn if (DEBUG_ARRAY_MAP) Log.d(TAG, " Read safe #" + (N-1) + ": key=0x" 2737e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn + (key != null ? key.hashCode() : 0) + " " + key); 2738e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn Object value = readValue(loader); 2739e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn outVal.put(key, value); 2740e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn N--; 2741e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn } 2742e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn } 2743e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn 27449c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn /** 27459c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn * @hide For testing only. 27469c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn */ 27479c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn public void readArrayMap(ArrayMap outVal, ClassLoader loader) { 27489c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn final int N = readInt(); 27499c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn if (N < 0) { 27509c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn return; 27519c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn } 27529c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn readArrayMapInternal(outVal, N, loader); 27539c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn } 27549c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn 2755ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov /** 2756ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov * Reads an array set. 2757ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov * 2758ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov * @param loader The class loader to use. 2759ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov * 2760ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov * @hide 2761ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov */ 2762ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov public @Nullable ArraySet<? extends Object> readArraySet(ClassLoader loader) { 2763ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov final int size = readInt(); 2764ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov if (size < 0) { 2765ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov return null; 2766ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov } 2767ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov ArraySet<Object> result = new ArraySet<>(size); 2768ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov for (int i = 0; i < size; i++) { 2769ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov Object value = readValue(loader); 2770ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov result.append(value); 2771ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov } 2772ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov return result; 2773ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov } 2774ddb948896ca7059161e09d0063b3332352772c0aSvet Ganov 27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readListInternal(List outVal, int N, 27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClassLoader loader) { 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = readValue(loader); 27795b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick //Log.d(TAG, "Unmarshalling value=" + value); 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal.add(value); 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readArrayInternal(Object[] outVal, int N, 27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClassLoader loader) { 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = readValue(loader); 27895b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick //Log.d(TAG, "Unmarshalling value=" + value); 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal[i] = value; 27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSparseArrayInternal(SparseArray outVal, int N, 27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClassLoader loader) { 27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int key = readInt(); 27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = readValue(loader); 27995b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick //Log.i(TAG, "Unmarshalling key=" + key + " value=" + value); 28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal.append(key, value); 28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSparseBooleanArrayInternal(SparseBooleanArray outVal, int N) { 28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int key = readInt(); 28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean value = this.readByte() == 1; 28105b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick //Log.i(TAG, "Unmarshalling key=" + key + " value=" + value); 28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal.append(key, value); 28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28155ce0430edfc176de29c0cf503975570dfda8111fDan Sandler 28165ce0430edfc176de29c0cf503975570dfda8111fDan Sandler /** 28175ce0430edfc176de29c0cf503975570dfda8111fDan Sandler * @hide For testing 28185ce0430edfc176de29c0cf503975570dfda8111fDan Sandler */ 28195ce0430edfc176de29c0cf503975570dfda8111fDan Sandler public long getBlobAshmemSize() { 28205ce0430edfc176de29c0cf503975570dfda8111fDan Sandler return nativeGetBlobAshmemSize(mNativePtr); 28215ce0430edfc176de29c0cf503975570dfda8111fDan Sandler } 28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2823