diff options
| author | Philip P. Moltmann <moltmann@google.com> | 2019-10-23 10:28:27 -0700 |
|---|---|---|
| committer | Philip P. Moltmann <moltmann@google.com> | 2019-10-24 12:19:31 -0700 |
| commit | badc09c7a5dc3a3d538cf14a5bbdfe1b9bc26f81 (patch) | |
| tree | 7b58a9e6d82399c210fd7c6e9f7e97ce820a819f /core/java/android/util/LongSparseArray.java | |
| parent | ff53253c9be5878f5ba9389b86e6e1086b54fada (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.java | 65 |
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; - } - } } |
