diff options
4 files changed, 35 insertions, 18 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index a510c7704751..476232cb40b3 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -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); } } diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java index 1577d9c1c1ab..5b0502da1bdf 100644 --- a/core/tests/coretests/src/android/app/NotificationTest.java +++ b/core/tests/coretests/src/android/app/NotificationTest.java @@ -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 diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index a919db947593..135a467cc6b0 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -7018,12 +7018,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; } @@ -7039,9 +7041,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; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 9a1359591890..e004ca011a6b 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -12302,7 +12302,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 @@ -12336,7 +12338,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 |