diff options
| author | 2021-10-01 09:46:40 +0000 | |
|---|---|---|
| committer | 2021-10-01 09:46:40 +0000 | |
| commit | 861d2e12cb614eaf7f497e3457f4df94b0382b57 (patch) | |
| tree | 4ed09f75c95d1b0f3f490c02e80dffd234b8ceb2 | |
| parent | d3199a6084b8e7572a445f8d513d4ff533b679ce (diff) | |
| parent | 5539926c4ab3afc234bd577515e3b31ef71ca8ac (diff) | |
Merge "Correct Parcel value types"
| -rw-r--r-- | core/java/android/os/BaseBundle.java | 8 | ||||
| -rw-r--r-- | core/java/android/os/Parcel.java | 93 |
2 files changed, 95 insertions, 6 deletions
diff --git a/core/java/android/os/BaseBundle.java b/core/java/android/os/BaseBundle.java index 64d54b820a92..7ce8d7267de2 100644 --- a/core/java/android/os/BaseBundle.java +++ b/core/java/android/os/BaseBundle.java @@ -1048,7 +1048,7 @@ public class BaseBundle { */ char getChar(String key, char defaultValue) { unparcel(); - Object o = getValue(key); + Object o = mMap.get(key); if (o == null) { return defaultValue; } @@ -1451,7 +1451,7 @@ public class BaseBundle { @Nullable short[] getShortArray(@Nullable String key) { unparcel(); - Object o = getValue(key); + Object o = mMap.get(key); if (o == null) { return null; } @@ -1474,7 +1474,7 @@ public class BaseBundle { @Nullable char[] getCharArray(@Nullable String key) { unparcel(); - Object o = getValue(key); + Object o = mMap.get(key); if (o == null) { return null; } @@ -1543,7 +1543,7 @@ public class BaseBundle { @Nullable float[] getFloatArray(@Nullable String key) { unparcel(); - Object o = getValue(key); + Object o = mMap.get(key); if (o == null) { return null; } diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 9af8e6ff3451..243dfb3e04bc 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -263,6 +263,10 @@ public final class Parcel { private static final int VAL_SIZE = 26; private static final int VAL_SIZEF = 27; private static final int VAL_DOUBLEARRAY = 28; + private static final int VAL_CHAR = 29; + private static final int VAL_SHORTARRAY = 30; + private static final int VAL_CHARARRAY = 31; + private static final int VAL_FLOATARRAY = 32; // The initial int32 in a Binder call's reply Parcel header: // Keep these in sync with libbinder's binder/Status.h. @@ -1319,6 +1323,46 @@ public final class Parcel { } } + /** @hide */ + public void writeShortArray(@Nullable short[] val) { + if (val != null) { + int n = val.length; + writeInt(n); + for (int i = 0; i < n; i++) { + writeInt(val[i]); + } + } else { + writeInt(-1); + } + } + + /** @hide */ + @Nullable + public short[] createShortArray() { + int n = readInt(); + if (n >= 0 && n <= (dataAvail() >> 2)) { + short[] val = new short[n]; + for (int i = 0; i < n; i++) { + val[i] = (short) readInt(); + } + return val; + } else { + return null; + } + } + + /** @hide */ + public void readShortArray(@NonNull short[] val) { + int n = readInt(); + if (n == val.length) { + for (int i = 0; i < n; i++) { + val[i] = (short) readInt(); + } + } else { + throw new RuntimeException("bad array lengths"); + } + } + public final void writeCharArray(@Nullable char[] val) { if (val != null) { int N = val.length; @@ -1984,6 +2028,14 @@ public final class Parcel { return VAL_SIZE; } else if (v instanceof double[]) { return VAL_DOUBLEARRAY; + } else if (v instanceof Character) { + return VAL_CHAR; + } else if (v instanceof short[]) { + return VAL_SHORTARRAY; + } else if (v instanceof char[]) { + return VAL_CHARARRAY; + } else if (v instanceof float[]) { + return VAL_FLOATARRAY; } else { Class<?> clazz = v.getClass(); if (clazz.isArray() && clazz.getComponentType() == Object.class) { @@ -2086,6 +2138,18 @@ public final class Parcel { case VAL_DOUBLEARRAY: writeDoubleArray((double[]) v); break; + case VAL_CHAR: + writeInt((Character) v); + break; + case VAL_SHORTARRAY: + writeShortArray((short[]) v); + break; + case VAL_CHARARRAY: + writeCharArray((char[]) v); + break; + case VAL_FLOATARRAY: + writeFloatArray((float[]) v); + break; case VAL_OBJECTARRAY: writeArray((Object[]) v); break; @@ -3696,6 +3760,22 @@ public final class Parcel { object = createDoubleArray(); break; + case VAL_CHAR: + object = (char) readInt(); + break; + + case VAL_SHORTARRAY: + object = createShortArray(); + break; + + case VAL_CHARARRAY: + object = createCharArray(); + break; + + case VAL_FLOATARRAY: + object = createFloatArray(); + break; + default: int off = dataPosition() - 4; throw new RuntimeException( @@ -3711,12 +3791,17 @@ public final class Parcel { } private boolean isLengthPrefixed(int type) { + // In general, we want custom types and containers of custom types to be length-prefixed, + // this allows clients (eg. Bundle) to skip their content during deserialization. The + // exception to this is Bundle, since Bundle is already length-prefixed and already copies + // the correspondent section of the parcel internally. switch (type) { + case VAL_MAP: case VAL_PARCELABLE: - case VAL_PARCELABLEARRAY: case VAL_LIST: case VAL_SPARSEARRAY: - case VAL_BUNDLE: + case VAL_PARCELABLEARRAY: + case VAL_OBJECTARRAY: case VAL_SERIALIZABLE: return true; default: @@ -4249,6 +4334,10 @@ public final class Parcel { case VAL_SIZE: return "VAL_SIZE"; case VAL_SIZEF: return "VAL_SIZEF"; case VAL_DOUBLEARRAY: return "VAL_DOUBLEARRAY"; + case VAL_CHAR: return "VAL_CHAR"; + case VAL_SHORTARRAY: return "VAL_SHORTARRAY"; + case VAL_CHARARRAY: return "VAL_CHARARRAY"; + case VAL_FLOATARRAY: return "VAL_FLOATARRAY"; case VAL_OBJECTARRAY: return "VAL_OBJECTARRAY"; case VAL_SERIALIZABLE: return "VAL_SERIALIZABLE"; default: return "UNKNOWN(" + type + ")"; |