Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 297baf11 authored by Julia Tuttle's avatar Julia Tuttle
Browse files

BigPictureStyle: set unused big picture extra to null

ag/24426105 changed BigPictureStyle so that whichever of EXTRA_PICTURE
or EXTRA_PICTURE_ICON wasn't set to the big picture would be *removed*
instead of set to null.

This was an app-visible behavior change, and turned out to break one of
our own tests, b/315128763. Since it has the potential to affect apps
that interact with notifications, I'm modifying it to preserve the old
null value behavior, while leaving the other bitmap expiration work in
that change alone.

Bug: 290381858
Bug: 315128763
Test: atest NotificationTest
Test: atest NotificationManagerServiceTest
Flag: NA
Change-Id: Ifef48da0ba6c0314dffef9ac04e5018bfb85b91b
parent 6adcf928
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -7733,11 +7733,12 @@ public class Notification implements Parcelable
            } else if (mPictureIcon.getType() == Icon.TYPE_BITMAP) {
                // If the icon contains a bitmap, use the old extra so that listeners which look
                // for that extra can still find the picture. Don't include the new extra in
                // that case, to avoid duplicating data.
                // that case, to avoid duplicating data. Leave the unused extra set to null to avoid
                // crashing apps that came to expect it to be present but null.
                extras.putParcelable(EXTRA_PICTURE, mPictureIcon.getBitmap());
                extras.remove(EXTRA_PICTURE_ICON);
                extras.putParcelable(EXTRA_PICTURE_ICON, null);
            } else {
                extras.remove(EXTRA_PICTURE);
                extras.putParcelable(EXTRA_PICTURE, null);
                extras.putParcelable(EXTRA_PICTURE_ICON, mPictureIcon);
            }
        }
+16 −8
Original line number Diff line number Diff line
@@ -1244,29 +1244,33 @@ public class NotificationTest {
    }

    @Test
    public void testBigPictureStyle_setExtras_pictureIconNull_noPictureIconKey() {
    public void testBigPictureStyle_setExtras_pictureIconNull_pictureIconKeyNull() {
        Notification.BigPictureStyle bpStyle = new Notification.BigPictureStyle();
        bpStyle.bigPicture((Bitmap) null);

        Bundle extras = new Bundle();
        bpStyle.addExtras(extras);

        assertThat(extras.containsKey(EXTRA_PICTURE_ICON)).isFalse();
        assertThat(extras.containsKey(EXTRA_PICTURE_ICON)).isTrue();
        final Parcelable pictureIcon = extras.getParcelable(EXTRA_PICTURE_ICON);
        assertThat(pictureIcon).isNull();
    }

    @Test
    public void testBigPictureStyle_setExtras_pictureIconNull_noPictureKey() {
    public void testBigPictureStyle_setExtras_pictureIconNull_pictureKeyNull() {
        Notification.BigPictureStyle bpStyle = new Notification.BigPictureStyle();
        bpStyle.bigPicture((Bitmap) null);

        Bundle extras = new Bundle();
        bpStyle.addExtras(extras);

        assertThat(extras.containsKey(EXTRA_PICTURE)).isFalse();
        assertThat(extras.containsKey(EXTRA_PICTURE)).isTrue();
        final Parcelable picture = extras.getParcelable(EXTRA_PICTURE);
        assertThat(picture).isNull();
    }

    @Test
    public void testBigPictureStyle_setExtras_pictureIconTypeBitmap_noPictureIconKey() {
    public void testBigPictureStyle_setExtras_pictureIconTypeBitmap_pictureIconKeyNull() {
        Bitmap bitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
        Notification.BigPictureStyle bpStyle = new Notification.BigPictureStyle();
        bpStyle.bigPicture(bitmap);
@@ -1274,11 +1278,13 @@ public class NotificationTest {
        Bundle extras = new Bundle();
        bpStyle.addExtras(extras);

        assertThat(extras.containsKey(EXTRA_PICTURE_ICON)).isFalse();
        assertThat(extras.containsKey(EXTRA_PICTURE_ICON)).isTrue();
        final Parcelable pictureIcon = extras.getParcelable(EXTRA_PICTURE_ICON);
        assertThat(pictureIcon).isNull();
    }

    @Test
    public void testBigPictureStyle_setExtras_pictureIconTypeIcon_noPictureKey() {
    public void testBigPictureStyle_setExtras_pictureIconTypeIcon_pictureKeyNull() {
        Icon icon = Icon.createWithResource(mContext, R.drawable.btn_plus);
        Notification.BigPictureStyle bpStyle = new Notification.BigPictureStyle();
        bpStyle.bigPicture(icon);
@@ -1286,7 +1292,9 @@ public class NotificationTest {
        Bundle extras = new Bundle();
        bpStyle.addExtras(extras);

        assertThat(extras.containsKey(EXTRA_PICTURE)).isFalse();
        assertThat(extras.containsKey(EXTRA_PICTURE)).isTrue();
        final Parcelable picture = extras.getParcelable(EXTRA_PICTURE);
        assertThat(picture).isNull();
    }

    @Test
+8 −5
Original line number Diff line number Diff line
@@ -7001,12 +7001,14 @@ public class NotificationManagerService extends SystemService {
            return false;
        }
        final boolean hasBitmap = n.extras.containsKey(Notification.EXTRA_PICTURE);
        final boolean hasBitmap = n.extras.containsKey(Notification.EXTRA_PICTURE)
                && n.extras.getParcelable(Notification.EXTRA_PICTURE) != null;
        if (hasBitmap) {
            return true;
        }
        final boolean hasIcon = n.extras.containsKey(Notification.EXTRA_PICTURE_ICON);
        final boolean hasIcon = n.extras.containsKey(Notification.EXTRA_PICTURE_ICON)
                && n.extras.getParcelable(Notification.EXTRA_PICTURE_ICON) != null;
        if (hasIcon) {
            return true;
        }
@@ -7022,9 +7024,10 @@ public class NotificationManagerService extends SystemService {
        if (!isBigPictureWithBitmapOrIcon(r.getNotification())) {
            return;
        }
        // Remove Notification object's reference to picture bitmap or URI
        r.getNotification().extras.remove(Notification.EXTRA_PICTURE);
        r.getNotification().extras.remove(Notification.EXTRA_PICTURE_ICON);
        // Remove Notification object's reference to picture bitmap or URI. Leave the extras set to
        // null to avoid crashing apps that came to expect them to be present but null.
        r.getNotification().extras.putParcelable(Notification.EXTRA_PICTURE, null);
        r.getNotification().extras.putParcelable(Notification.EXTRA_PICTURE_ICON, null);
        // Make Notification silent
        r.getNotification().flags |= FLAG_ONLY_ALERT_ONCE;
+7 −2
Original line number Diff line number Diff line
@@ -12157,7 +12157,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
                /* isImageBitmap= */ true,
                /* isExpired= */ true);
        addRecordAndRemoveBitmaps(record);
        assertThat(record.getNotification().extras.containsKey(EXTRA_PICTURE)).isFalse();
        assertThat(record.getNotification().extras.containsKey(EXTRA_PICTURE)).isTrue();
        final Parcelable picture = record.getNotification().extras.getParcelable(EXTRA_PICTURE);
        assertThat(picture).isNull();
    }
    @Test
@@ -12191,7 +12193,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
                /* isImageBitmap= */ false,
                /* isExpired= */ true);
        addRecordAndRemoveBitmaps(record);
        assertThat(record.getNotification().extras.containsKey(EXTRA_PICTURE_ICON)).isFalse();
        assertThat(record.getNotification().extras.containsKey(EXTRA_PICTURE_ICON)).isTrue();
        final Parcelable pictureIcon =
                record.getNotification().extras.getParcelable(EXTRA_PICTURE_ICON);
        assertThat(pictureIcon).isNull();
    }
    @Test