Support CharSequence lists+arrays in Bundle+Intent
Fixes http://b/issue?id=2468093
Change-Id: Id82686f6ca8c9501f6db8a07018278a78ddacd05
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 6cfccee..8ad600c 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -212,6 +212,7 @@
private static final int VAL_SERIALIZABLE = 21;
private static final int VAL_SPARSEBOOLEANARRAY = 22;
private static final int VAL_BOOLEANARRAY = 23;
+ private static final int VAL_CHARSEQUENCEARRAY = 24;
private static final int EX_SECURITY = -1;
private static final int EX_BAD_PARCELABLE = -2;
@@ -411,6 +412,15 @@
public final native void writeString(String val);
/**
+ * Write a CharSequence value into the parcel at the current dataPosition(),
+ * growing dataCapacity() if needed.
+ * @hide
+ */
+ public final void writeCharSequence(CharSequence val) {
+ TextUtils.writeToParcel(val, this, 0);
+ }
+
+ /**
* Write an object into the parcel at the current dataPosition(),
* growing dataCapacity() if needed.
*/
@@ -827,6 +837,21 @@
}
}
+ /**
+ * @hide
+ */
+ public final void writeCharSequenceArray(CharSequence[] val) {
+ if (val != null) {
+ int N = val.length;
+ writeInt(N);
+ for (int i=0; i<N; i++) {
+ writeCharSequence(val[i]);
+ }
+ } else {
+ writeInt(-1);
+ }
+ }
+
public final IBinder[] createBinderArray() {
int N = readInt();
if (N >= 0) {
@@ -1045,7 +1070,7 @@
} else if (v instanceof CharSequence) {
// Must be after String
writeInt(VAL_CHARSEQUENCE);
- TextUtils.writeToParcel((CharSequence) v, this, 0);
+ writeCharSequence((CharSequence) v);
} else if (v instanceof List) {
writeInt(VAL_LIST);
writeList((List) v);
@@ -1061,6 +1086,10 @@
} else if (v instanceof String[]) {
writeInt(VAL_STRINGARRAY);
writeStringArray((String[]) v);
+ } else if (v instanceof CharSequence[]) {
+ // Must be after String[] and before Object[]
+ writeInt(VAL_CHARSEQUENCEARRAY);
+ writeCharSequenceArray((CharSequence[]) v);
} else if (v instanceof IBinder) {
writeInt(VAL_IBINDER);
writeStrongBinder((IBinder) v);
@@ -1257,6 +1286,14 @@
public final native String readString();
/**
+ * Read a CharSequence value from the parcel at the current dataPosition().
+ * @hide
+ */
+ public final CharSequence readCharSequence() {
+ return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(this);
+ }
+
+ /**
* Read an object from the parcel at the current dataPosition().
*/
public final native IBinder readStrongBinder();
@@ -1389,6 +1426,27 @@
}
/**
+ * Read and return a CharSequence[] object from the parcel.
+ * {@hide}
+ */
+ public final CharSequence[] readCharSequenceArray() {
+ CharSequence[] array = null;
+
+ int length = readInt();
+ if (length >= 0)
+ {
+ array = new CharSequence[length];
+
+ for (int i = 0 ; i < length ; i++)
+ {
+ array[i] = readCharSequence();
+ }
+ }
+
+ return array;
+ }
+
+ /**
* Read and return a new ArrayList object from the parcel at the current
* dataPosition(). Returns null if the previously written list object was
* null. The given class loader will be used to load any enclosed
@@ -1728,7 +1786,7 @@
return readInt() == 1;
case VAL_CHARSEQUENCE:
- return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(this);
+ return readCharSequence();
case VAL_LIST:
return readArrayList(loader);
@@ -1742,6 +1800,9 @@
case VAL_STRINGARRAY:
return readStringArray();
+ case VAL_CHARSEQUENCEARRAY:
+ return readCharSequenceArray();
+
case VAL_IBINDER:
return readStrongBinder();