Fix crash in RemoteViews w/ Bundle due to Parcel.allowSquashing

This fixes a failing CTS test, NotificationTemplateTest.

Fixes: 207741735
Bug: 212731590
Test: atest NotificationTemplateTest
Change-Id: Ide0241121d0824a2ba8c721c968e39f3c627f79d
This commit is contained in:
Jeff DeCew
2021-12-30 16:45:17 -05:00
parent b017001ae0
commit a28572eb9d

View File

@@ -300,6 +300,13 @@ public class RemoteViews implements Parcelable, Filter {
*/
public static final int FLAG_USE_LIGHT_BACKGROUND_LAYOUT = 4;
/**
* A ReadWriteHelper which has the same behavior as ReadWriteHelper.DEFAULT, but which is
* intentionally a different instance in order to trick Bundle reader so that it doesn't allow
* lazy initialization.
*/
private static final Parcel.ReadWriteHelper ALTERNATIVE_DEFAULT = new Parcel.ReadWriteHelper();
/**
* Used to restrict the views which can be inflated
*
@@ -1856,7 +1863,18 @@ public class RemoteViews implements Parcelable, Filter {
this.value = in.readTypedObject(Bitmap.CREATOR);
break;
case BUNDLE:
this.value = in.readBundle();
// Because we use Parcel.allowSquashing() when writing, and that affects
// how the contents of Bundles are written, we need to ensure the bundle is
// unparceled immediately, not lazily. Setting a custom ReadWriteHelper
// just happens to have that effect on Bundle.readFromParcel().
// TODO(b/212731590): build this state tracking into Bundle
if (in.hasReadWriteHelper()) {
this.value = in.readBundle();
} else {
in.setReadWriteHelper(ALTERNATIVE_DEFAULT);
this.value = in.readBundle();
in.setReadWriteHelper(null);
}
break;
case INTENT:
this.value = in.readTypedObject(Intent.CREATOR);