diff options
author | Hao Ke <haok@google.com> | 2021-12-07 20:01:45 +0000 |
---|---|---|
committer | Hao Ke <haok@google.com> | 2021-12-09 15:40:04 +0000 |
commit | 31fa51440013f915c2662a1fcbbb906d575447b8 (patch) | |
tree | d66368d570f653dd59f51a38c5b1f6fbf49a5c20 | |
parent | 43981a856db5da38d20a797dddd1bb8c1fa8fc52 (diff) | |
download | base-31fa51440013f915c2662a1fcbbb906d575447b8.tar.gz |
Don't require T to extend Parcelable or Serializable in Parcel
This is because we want to support the use-case where the caller
enforces a specific class type that doesn't implement Parcelable
or Serializable but the child classes written on the payload implement them.
One such use-case that needs this before migrating is
https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/com/android/internal/infra/AndroidFuture.java;l=596;drc=2d6a545e3042d7cc91b54746e774681a05e0ff22:
we need to enforce Throwable class but it doesn't implement Parcelable itself,
while its children written on the wire are expected to.
Test: atest -d android.os.cts.ParcelTest
Bug: 195622897
Change-Id: I150416d0cfb0b87ddbaff1041d8d60aa205f6f39
-rw-r--r-- | core/api/current.txt | 4 | ||||
-rw-r--r-- | core/java/android/os/Parcel.java | 15 |
2 files changed, 4 insertions, 15 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 94ba409995e2..3627f33cc4e6 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -31590,7 +31590,7 @@ package android.os { method @Deprecated public void readMap(@NonNull java.util.Map, @Nullable ClassLoader); method public <K, V> void readMap(@NonNull java.util.Map<? super K,? super V>, @Nullable ClassLoader, @NonNull Class<K>, @NonNull Class<V>); method @Deprecated @Nullable public <T extends android.os.Parcelable> T readParcelable(@Nullable ClassLoader); - method @Nullable public <T extends android.os.Parcelable> T readParcelable(@Nullable ClassLoader, @NonNull Class<T>); + method @Nullable public <T> T readParcelable(@Nullable ClassLoader, @NonNull Class<T>); method @Deprecated @Nullable public android.os.Parcelable[] readParcelableArray(@Nullable ClassLoader); method @Nullable public <T> T[] readParcelableArray(@Nullable ClassLoader, @NonNull Class<T>); method @Deprecated @Nullable public android.os.Parcelable.Creator<?> readParcelableCreator(@Nullable ClassLoader); @@ -31600,7 +31600,7 @@ package android.os { method @Nullable public android.os.PersistableBundle readPersistableBundle(); method @Nullable public android.os.PersistableBundle readPersistableBundle(@Nullable ClassLoader); method @Deprecated @Nullable public java.io.Serializable readSerializable(); - method @Nullable public <T extends java.io.Serializable> T readSerializable(@Nullable ClassLoader, @NonNull Class<T>); + method @Nullable public <T> T readSerializable(@Nullable ClassLoader, @NonNull Class<T>); method @NonNull public android.util.Size readSize(); method @NonNull public android.util.SizeF readSizeF(); method @Deprecated @Nullable public <T> android.util.SparseArray<T> readSparseArray(@Nullable ClassLoader); diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 4d5f97c59907..09eac79c991e 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -4210,8 +4210,7 @@ public final class Parcel { * trying to instantiate an element. */ @Nullable - public <T extends Parcelable> T readParcelable(@Nullable ClassLoader loader, - @NonNull Class<T> clazz) { + public <T> T readParcelable(@Nullable ClassLoader loader, @NonNull Class<T> clazz) { Objects.requireNonNull(clazz); return readParcelableInternal(loader, clazz); } @@ -4222,10 +4221,6 @@ public final class Parcel { @SuppressWarnings("unchecked") @Nullable private <T> T readParcelableInternal(@Nullable ClassLoader loader, @Nullable Class<T> clazz) { - if (clazz != null && !Parcelable.class.isAssignableFrom(clazz)) { - throw new BadParcelableException("About to unparcel a parcelable object " - + " but class required " + clazz.getName() + " is not Parcelable"); - } Parcelable.Creator<?> creator = readParcelableCreatorInternal(loader, clazz); if (creator == null) { return null; @@ -4461,8 +4456,7 @@ public final class Parcel { * deserializing the object. */ @Nullable - public <T extends Serializable> T readSerializable(@Nullable ClassLoader loader, - @NonNull Class<T> clazz) { + public <T> T readSerializable(@Nullable ClassLoader loader, @NonNull Class<T> clazz) { Objects.requireNonNull(clazz); return readSerializableInternal( loader == null ? getClass().getClassLoader() : loader, clazz); @@ -4474,11 +4468,6 @@ public final class Parcel { @Nullable private <T> T readSerializableInternal(@Nullable final ClassLoader loader, @Nullable Class<T> clazz) { - if (clazz != null && !Serializable.class.isAssignableFrom(clazz)) { - throw new BadParcelableException("About to unparcel a serializable object " - + " but class required " + clazz.getName() + " is not Serializable"); - } - String name = readString(); if (name == null) { // For some reason we were unable to read the name of the Serializable (either there |