Merge "Fix bug in BaseParceledListSlice implementation." into sc-dev

This commit is contained in:
Stanislav Zholnin
2021-05-07 14:20:06 +00:00
committed by Android (Google) Code Review

View File

@@ -75,16 +75,7 @@ abstract class BaseParceledListSlice<T> implements Parcelable {
if (p.readInt() == 0) { if (p.readInt() == 0) {
break; break;
} }
listElementClass = readVerifyAndAddElement(creator, p, loader, listElementClass);
final T parcelable = readCreator(creator, p, loader);
if (listElementClass == null) {
listElementClass = parcelable.getClass();
} else {
verifySameType(listElementClass, parcelable.getClass());
}
mList.add(parcelable);
if (DEBUG) Log.d(TAG, "Read inline #" + i + ": " + mList.get(mList.size()-1)); if (DEBUG) Log.d(TAG, "Read inline #" + i + ": " + mList.get(mList.size()-1));
i++; i++;
} }
@@ -104,11 +95,8 @@ abstract class BaseParceledListSlice<T> implements Parcelable {
return; return;
} }
while (i < N && reply.readInt() != 0) { while (i < N && reply.readInt() != 0) {
final T parcelable = readCreator(creator, reply, loader); listElementClass = readVerifyAndAddElement(creator, reply, loader,
verifySameType(listElementClass, parcelable.getClass()); listElementClass);
mList.add(parcelable);
if (DEBUG) Log.d(TAG, "Read extra #" + i + ": " + mList.get(mList.size()-1)); if (DEBUG) Log.d(TAG, "Read extra #" + i + ": " + mList.get(mList.size()-1));
i++; i++;
} }
@@ -117,6 +105,18 @@ abstract class BaseParceledListSlice<T> implements Parcelable {
} }
} }
private Class<?> readVerifyAndAddElement(Parcelable.Creator<?> creator, Parcel p,
ClassLoader loader, Class<?> listElementClass) {
final T parcelable = readCreator(creator, p, loader);
if (listElementClass == null) {
listElementClass = parcelable.getClass();
} else {
verifySameType(listElementClass, parcelable.getClass());
}
mList.add(parcelable);
return listElementClass;
}
private T readCreator(Parcelable.Creator<?> creator, Parcel p, ClassLoader loader) { private T readCreator(Parcelable.Creator<?> creator, Parcel p, ClassLoader loader) {
if (creator instanceof Parcelable.ClassLoaderCreator<?>) { if (creator instanceof Parcelable.ClassLoaderCreator<?>) {
Parcelable.ClassLoaderCreator<?> classLoaderCreator = Parcelable.ClassLoaderCreator<?> classLoaderCreator =