Add support for reading and writing double array values
Add support for reading and writing double arrays in
Parcel.readValue() and Parcel.writeValue.
Also, remove some trailing whitespaces in Parcel.java.
BUG: 25848659
Change-Id: Ib5430f492df4195051b83d9bf2b5163ec684bbff
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 1e879f2..ed53d44 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -58,12 +58,12 @@
* appropriate to place any Parcel data in to persistent storage: changes
* in the underlying implementation of any of the data in the Parcel can
* render older data unreadable.</p>
- *
+ *
* <p>The bulk of the Parcel API revolves around reading and writing data
* of various types. There are six major classes of such functions available.</p>
- *
+ *
* <h3>Primitives</h3>
- *
+ *
* <p>The most basic data functions are for writing and reading primitive
* data types: {@link #writeByte}, {@link #readByte}, {@link #writeDouble},
* {@link #readDouble}, {@link #writeFloat}, {@link #readFloat}, {@link #writeInt},
@@ -71,15 +71,15 @@
* {@link #writeString}, {@link #readString}. Most other
* data operations are built on top of these. The given data is written and
* read using the endianess of the host CPU.</p>
- *
+ *
* <h3>Primitive Arrays</h3>
- *
+ *
* <p>There are a variety of methods for reading and writing raw arrays
* of primitive objects, which generally result in writing a 4-byte length
* followed by the primitive data items. The methods for reading can either
* read the data into an existing array, or create and return a new array.
* These available types are:</p>
- *
+ *
* <ul>
* <li> {@link #writeBooleanArray(boolean[])},
* {@link #readBooleanArray(boolean[])}, {@link #createBooleanArray()}
@@ -101,9 +101,9 @@
* <li> {@link #writeSparseBooleanArray(SparseBooleanArray)},
* {@link #readSparseBooleanArray()}.
* </ul>
- *
+ *
* <h3>Parcelables</h3>
- *
+ *
* <p>The {@link Parcelable} protocol provides an extremely efficient (but
* low-level) protocol for objects to write and read themselves from Parcels.
* You can use the direct methods {@link #writeParcelable(Parcelable, int)}
@@ -113,7 +113,7 @@
* methods write both the class type and its data to the Parcel, allowing
* that class to be reconstructed from the appropriate class loader when
* later reading.</p>
- *
+ *
* <p>There are also some methods that provide a more efficient way to work
* with Parcelables: {@link #writeTypedObject}, {@link #writeTypedArray},
* {@link #writeTypedList}, {@link #readTypedObject},
@@ -126,9 +126,9 @@
* call {@link Parcelable#writeToParcel Parcelable.writeToParcel} and
* {@link Parcelable.Creator#createFromParcel Parcelable.Creator.createFromParcel}
* yourself.)</p>
- *
+ *
* <h3>Bundles</h3>
- *
+ *
* <p>A special type-safe container, called {@link Bundle}, is available
* for key/value maps of heterogeneous values. This has many optimizations
* for improved performance when reading and writing data, and its type-safe
@@ -136,16 +136,16 @@
* data contents into a Parcel. The methods to use are
* {@link #writeBundle(Bundle)}, {@link #readBundle()}, and
* {@link #readBundle(ClassLoader)}.
- *
+ *
* <h3>Active Objects</h3>
- *
+ *
* <p>An unusual feature of Parcel is the ability to read and write active
* objects. For these objects the actual contents of the object is not
* written, rather a special token referencing the object is written. When
* reading the object back from the Parcel, you do not get a new instance of
* the object, but rather a handle that operates on the exact same object that
* was originally written. There are two forms of active objects available.</p>
- *
+ *
* <p>{@link Binder} objects are a core facility of Android's general cross-process
* communication system. The {@link IBinder} interface describes an abstract
* protocol with a Binder object. Any such interface can be written in to
@@ -158,7 +158,7 @@
* {@link #createBinderArray()},
* {@link #writeBinderList(List)}, {@link #readBinderList(List)},
* {@link #createBinderArrayList()}.</p>
- *
+ *
* <p>FileDescriptor objects, representing raw Linux file descriptor identifiers,
* can be written and {@link ParcelFileDescriptor} objects returned to operate
* on the original file descriptor. The returned file descriptor is a dup
@@ -166,9 +166,9 @@
* operating on the same underlying file stream, with the same position, etc.
* The methods to use are {@link #writeFileDescriptor(FileDescriptor)},
* {@link #readFileDescriptor()}.
- *
+ *
* <h3>Untyped Containers</h3>
- *
+ *
* <p>A final class of methods are for writing and reading standard Java
* containers of arbitrary types. These all revolve around the
* {@link #writeValue(Object)} and {@link #readValue(ClassLoader)} methods
@@ -229,6 +229,7 @@
private static final int VAL_PERSISTABLEBUNDLE = 25;
private static final int VAL_SIZE = 26;
private static final int VAL_SIZEF = 27;
+ private static final int VAL_DOUBLEARRAY = 28;
// The initial int32 in a Binder call's reply Parcel header:
private static final int EX_SECURITY = -1;
@@ -642,7 +643,7 @@
* growing dataCapacity() if needed. The Map keys must be String objects.
* The Map values are written using {@link #writeValue} and must follow
* the specification there.
- *
+ *
* <p>It is strongly recommended to use {@link #writeBundle} instead of
* this method, since the Bundle class provides a type-safe API that
* allows you to avoid mysterious type errors at the point of marshalling.
@@ -1408,6 +1409,9 @@
} else if (v instanceof SizeF) {
writeInt(VAL_SIZEF);
writeSizeF((SizeF) v);
+ } else if (v instanceof double[]) {
+ writeInt(VAL_DOUBLEARRAY);
+ writeDoubleArray((double[]) v);
} else {
Class<?> clazz = v.getClass();
if (clazz.isArray() && clazz.getComponentType() == Object.class) {
@@ -1483,7 +1487,7 @@
* exception will be re-thrown by this function as a RuntimeException
* (to be caught by the system's last-resort exception handling when
* dispatching a transaction).
- *
+ *
* <p>The supported exception types are:
* <ul>
* <li>{@link BadParcelableException}
@@ -1493,7 +1497,7 @@
* <li>{@link SecurityException}
* <li>{@link NetworkOnMainThreadException}
* </ul>
- *
+ *
* @param e The Exception to be written.
*
* @see #writeNoException
@@ -1814,7 +1818,7 @@
if (Bundle.DEBUG) Log.d(TAG, "null bundle: length=" + length);
return null;
}
-
+
final Bundle bundle = new Bundle(this, length);
if (loader != null) {
bundle.setClassLoader(loader);
@@ -2325,7 +2329,7 @@
return readArrayList(loader);
case VAL_BOOLEANARRAY:
- return createBooleanArray();
+ return createBooleanArray();
case VAL_BYTEARRAY:
return createByteArray();
@@ -2375,6 +2379,9 @@
case VAL_SIZEF:
return readSizeF();
+ case VAL_DOUBLEARRAY:
+ return createDoubleArray();
+
default:
int off = dataPosition() - 4;
throw new RuntimeException(