summaryrefslogtreecommitdiff
path: root/core/java/android/util/LongSparseArray.java
diff options
context:
space:
mode:
authorPhilip P. Moltmann <moltmann@google.com>2019-10-23 10:28:27 -0700
committerPhilip P. Moltmann <moltmann@google.com>2019-10-24 12:19:31 -0700
commitbadc09c7a5dc3a3d538cf14a5bbdfe1b9bc26f81 (patch)
tree7b58a9e6d82399c210fd7c6e9f7e97ce820a819f /core/java/android/util/LongSparseArray.java
parentff53253c9be5878f5ba9389b86e6e1086b54fada (diff)
Correctly parcel LongSparseArray<String>
Before we just cast Object[] to String[]. This crashes. Now we are casting the individual objects->strings. Test: Parceled LongSparseArray Change-Id: I24883a1dad49c0682977da1aea2370eddb001173
Diffstat (limited to 'core/java/android/util/LongSparseArray.java')
-rw-r--r--core/java/android/util/LongSparseArray.java65
1 files changed, 12 insertions, 53 deletions
diff --git a/core/java/android/util/LongSparseArray.java b/core/java/android/util/LongSparseArray.java
index e78b79695d3d..73e17a61d17f 100644
--- a/core/java/android/util/LongSparseArray.java
+++ b/core/java/android/util/LongSparseArray.java
@@ -17,7 +17,6 @@
package android.util;
import android.os.Parcel;
-import android.os.Parcelable;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.GrowingArrayUtils;
@@ -25,6 +24,8 @@ import com.android.internal.util.Preconditions;
import libcore.util.EmptyArray;
+import java.util.Arrays;
+
/**
* SparseArray mapping longs to Objects. Unlike a normal array of Objects,
* there can be gaps in the indices. It is intended to be more memory efficient
@@ -450,22 +451,25 @@ public class LongSparseArray<E> implements Cloneable {
/**
* @hide
*/
- public static class StringParcelling implements com.android.internal.util.Parcelling {
+ public static class StringParcelling implements
+ com.android.internal.util.Parcelling<LongSparseArray<String>> {
@Override
- public void parcel(Object item, Parcel dest, int parcelFlags) {
- if (item == null) {
+ public void parcel(LongSparseArray<String> array, Parcel dest, int parcelFlags) {
+ if (array == null) {
dest.writeInt(-1);
return;
}
- LongSparseArray<String> array = (LongSparseArray<String>) item;
- dest.writeInt(array.mSize);
+ int size = array.mSize;
+
+ dest.writeInt(size);
dest.writeLongArray(array.mKeys);
- dest.writeStringArray((String[]) array.mValues);
+
+ dest.writeStringArray(Arrays.copyOfRange(array.mValues, 0, size, String[].class));
}
@Override
- public Object unparcel(Parcel source) {
+ public LongSparseArray<String> unparcel(Parcel source) {
int size = source.readInt();
if (size == -1) {
return null;
@@ -490,49 +494,4 @@ public class LongSparseArray<E> implements Cloneable {
return array;
}
}
-
- /**
- * @hide
- */
- public static class Parcelling<T extends Parcelable> implements
- com.android.internal.util.Parcelling {
- @Override
- public void parcel(Object item, Parcel dest, int parcelFlags) {
- if (item == null) {
- dest.writeInt(-1);
- return;
- }
-
- LongSparseArray<T> array = (LongSparseArray<T>) item;
- dest.writeInt(array.mSize);
- dest.writeLongArray(array.mKeys);
- dest.writeParcelableArray((T[]) array.mValues, parcelFlags);
- }
-
- @Override
- public Object unparcel(Parcel source) {
- int size = source.readInt();
- if (size == -1) {
- return null;
- }
-
- LongSparseArray<T> array = new LongSparseArray<>(0);
- array.mSize = size;
- array.mKeys = source.createLongArray();
- array.mValues = source.readParcelableArray(null);
-
- // Make sure array is sane
- Preconditions.checkArgument(array.mKeys.length >= size);
- Preconditions.checkArgument(array.mValues.length >= size);
-
- if (size > 0) {
- long last = array.mKeys[0];
- for (int i = 1; i < size; i++) {
- Preconditions.checkArgument(last < array.mKeys[i]);
- }
- }
-
- return array;
- }
- }
}