Loading services/core/java/com/android/server/notification/NotificationManagerService.java +3 −7 Original line number Original line Diff line number Diff line Loading @@ -6630,8 +6630,7 @@ public class NotificationManagerService extends SystemService { } } }; }; @VisibleForTesting private static boolean isBigPictureWithBitmapOrIcon(Notification n) { static boolean isBigPictureWithBitmapOrIcon(Notification n) { final boolean isBigPicture = n.isStyle(Notification.BigPictureStyle.class); final boolean isBigPicture = n.isStyle(Notification.BigPictureStyle.class); if (!isBigPicture) { if (!isBigPicture) { return false; return false; Loading @@ -6649,15 +6648,12 @@ public class NotificationManagerService extends SystemService { return false; return false; } } @VisibleForTesting private static boolean isBitmapExpired(long timePostedMs, long timeNowMs, long timeToLiveMs) { // TODO(b/298414239) Unit test via public API static boolean isBitmapExpired(long timePostedMs, long timeNowMs, long timeToLiveMs) { final long timeDiff = timeNowMs - timePostedMs; final long timeDiff = timeNowMs - timePostedMs; return timeDiff > timeToLiveMs; return timeDiff > timeToLiveMs; } } @VisibleForTesting private void removeBitmapAndRepost(NotificationRecord r) { void removeBitmapAndRepost(NotificationRecord r) { if (!isBigPictureWithBitmapOrIcon(r.getNotification())) { if (!isBigPictureWithBitmapOrIcon(r.getNotification())) { return; return; } } Loading services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +114 −84 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,8 @@ import static android.app.ActivityManagerInternal.ServiceNotificationPolicy.NOT_ import static android.app.ActivityManagerInternal.ServiceNotificationPolicy.SHOW_IMMEDIATELY; import static android.app.ActivityManagerInternal.ServiceNotificationPolicy.SHOW_IMMEDIATELY; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.Notification.EXTRA_ALLOW_DURING_SETUP; import static android.app.Notification.EXTRA_ALLOW_DURING_SETUP; import static android.app.Notification.EXTRA_PICTURE; import static android.app.Notification.EXTRA_PICTURE_ICON; import static android.app.Notification.FLAG_AUTO_CANCEL; import static android.app.Notification.FLAG_AUTO_CANCEL; import static android.app.Notification.FLAG_BUBBLE; import static android.app.Notification.FLAG_BUBBLE; import static android.app.Notification.FLAG_CAN_COLORIZE; import static android.app.Notification.FLAG_CAN_COLORIZE; Loading @@ -30,7 +32,6 @@ import static android.app.Notification.FLAG_NO_CLEAR; import static android.app.Notification.FLAG_ONGOING_EVENT; import static android.app.Notification.FLAG_ONGOING_EVENT; import static android.app.Notification.FLAG_ONLY_ALERT_ONCE; import static android.app.Notification.FLAG_ONLY_ALERT_ONCE; import static android.app.Notification.FLAG_USER_INITIATED_JOB; import static android.app.Notification.FLAG_USER_INITIATED_JOB; import static android.app.Notification.GROUP_KEY_SILENT; import static android.app.NotificationChannel.USER_LOCKED_ALLOW_BUBBLE; import static android.app.NotificationChannel.USER_LOCKED_ALLOW_BUBBLE; import static android.app.NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED; import static android.app.NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED; import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL; import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL; Loading Loading @@ -89,6 +90,7 @@ import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STR import static com.android.server.am.PendingIntentRecord.FLAG_ACTIVITY_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_ACTIVITY_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_BROADCAST_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_BROADCAST_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_SERVICE_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_SERVICE_SENDER; import static com.android.server.notification.NotificationManagerService.BITMAP_EXPIRATION_TIME_MS; import static com.android.server.notification.NotificationManagerService.DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE; import static com.android.server.notification.NotificationManagerService.DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE; import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_ADJUSTED; import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_ADJUSTED; import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_POSTED; import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_POSTED; Loading Loading @@ -11285,114 +11287,142 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { r.getSbn().getId(), r.getSbn().getTag(), r, false, false)).isTrue(); r.getSbn().getId(), r.getSbn().getTag(), r, false, false)).isTrue(); } } @Test private NotificationRecord createBigPictureRecord(boolean isBigPictureStyle, boolean hasImage, public void testIsBigPictureWithBitmapOrIcon_notBigPicture_false() { boolean isImageBitmap, boolean isExpired) { Notification n = new Notification.Builder(mContext).build(); Notification.Builder builder = new Notification.Builder(mContext); Notification.BigPictureStyle style = new Notification.BigPictureStyle(); assertThat(mService.isBigPictureWithBitmapOrIcon(n)).isFalse(); if (isBigPictureStyle && hasImage) { if (isImageBitmap) { style = style.bigPicture(Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888)); } else { style = style.bigPicture(Icon.createWithResource(mContext, R.drawable.btn_plus)); } } if (isBigPictureStyle) { builder.setStyle(style); } } @Test Notification notification = builder.setChannelId(TEST_CHANNEL_ID).build(); public void testIsBigPictureWithBitmapOrIcon_bigPictureWithBitmap_true() { Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888); Notification n = new Notification.Builder(mContext) .setStyle(new Notification.BigPictureStyle().bigPicture(bitmap)) .build(); assertThat(mService.isBigPictureWithBitmapOrIcon(n)).isTrue(); long timePostedMs = System.currentTimeMillis(); if (isExpired) { timePostedMs -= BITMAP_EXPIRATION_TIME_MS; } } StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, notification, UserHandle.getUserHandleForUid(mUid), null, timePostedMs); @Test return new NotificationRecord(mContext, sbn, mTestNotificationChannel); public void testIsBigPictureWithBitmapOrIcon_bigPictureWithIcon_true() { } Icon icon = Icon.createWithResource(mContext, R.drawable.btn_plus); Notification n = new Notification.Builder(mContext) .setStyle(new Notification.BigPictureStyle().bigPicture(icon)) .build(); assertThat(mService.isBigPictureWithBitmapOrIcon(n)).isTrue(); private void addRecordAndRemoveBitmaps(NotificationRecord record) { mService.addNotification(record); mInternalService.removeBitmaps(); waitForIdle(); } } @Test @Test public void testIsBitmapExpired_notExpired_false() { public void testRemoveBitmaps_notBigPicture_noRepost() { final boolean result = mService.isBitmapExpired( addRecordAndRemoveBitmaps( /* timePosted= */ 0, createBigPictureRecord( /* timeNow= */ 1, /* isBigPictureStyle= */ false, /* timeToLive= */ 2); /* hasImage= */ false, assertThat(result).isFalse(); /* isImageBitmap= */ false, /* isExpired= */ false)); verify(mWorkerHandler, never()) .post(any(NotificationManagerService.EnqueueNotificationRunnable.class)); } } @Test @Test public void testIsBitmapExpired_expired_true() { public void testRemoveBitmaps_bigPictureNoImage_noRepost() { final boolean result = mService.isBitmapExpired( addRecordAndRemoveBitmaps( /* timePosted= */ 0, createBigPictureRecord( /* timeNow= */ 2, /* isBigPictureStyle= */ true, /* timeToLive= */ 1); /* hasImage= */ false, assertThat(result).isTrue(); /* isImageBitmap= */ false, /* isExpired= */ false)); verify(mWorkerHandler, never()) .post(any(NotificationManagerService.EnqueueNotificationRunnable.class)); } } @Test @Test public void testRemoveBitmapAndRepost_removeBitmapFromExtras() { public void testRemoveBitmaps_notExpired_noRepost() { // Create big picture NotificationRecord with bitmap addRecordAndRemoveBitmaps( Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888); createBigPictureRecord( /* isBigPictureStyle= */ true, Notification n = new Notification.Builder(mContext, "test") /* hasImage= */ true, .setStyle(new android.app.Notification.BigPictureStyle().bigPicture(bitmap)) /* isImageBitmap= */ true, .build(); /* isExpired= */ false)); verify(mWorkerHandler, never()) StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, .post(any(NotificationManagerService.EnqueueNotificationRunnable.class)); n, UserHandle.getUserHandleForUid(mUid), null, 0); NotificationRecord bigPictureRecord = new NotificationRecord(mContext, sbn, mTestNotificationChannel); mService.removeBitmapAndRepost(bigPictureRecord); Bitmap bitmapExtra = bigPictureRecord.getNotification().extras.getParcelable( Notification.EXTRA_PICTURE, Bitmap.class); assertThat(bitmapExtra).isNull(); } } @Test @Test public void testRemoveBitmapAndRepost_removeIconFromExtras() { public void testRemoveBitmaps_bitmapExpired_repost() { // Create big picture NotificationRecord with Icon addRecordAndRemoveBitmaps( Icon icon = Icon.createWithResource(mContext, R.drawable.btn_plus); createBigPictureRecord( /* isBigPictureStyle= */ true, Notification n = new Notification.Builder(mContext, "test") /* hasImage= */ true, .setStyle(new android.app.Notification.BigPictureStyle().bigPicture(icon)) /* isImageBitmap= */ true, .build(); /* isExpired= */ true)); verify(mWorkerHandler, times(1)) StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, .post(any(NotificationManagerService.EnqueueNotificationRunnable.class)); n, UserHandle.getUserHandleForUid(mUid), null, 0); NotificationRecord bigPictureRecord = new NotificationRecord(mContext, sbn, mTestNotificationChannel); mService.removeBitmapAndRepost(bigPictureRecord); Icon iconExtra = bigPictureRecord.getNotification().extras.getParcelable( Notification.EXTRA_PICTURE_ICON, Icon.class); assertThat(iconExtra).isNull(); } } @Test @Test public void testRemoveBitmapAndRepost_flagOnlyAlertOnce() { public void testRemoveBitmaps_bitmapExpired_bitmapGone() { Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888); NotificationRecord record = createBigPictureRecord( /* isBigPictureStyle= */ true, Notification n = new Notification.Builder(mContext, "test") /* hasImage= */ true, .setStyle(new android.app.Notification.BigPictureStyle().bigPicture(bitmap)) /* isImageBitmap= */ true, .build(); /* isExpired= */ true); addRecordAndRemoveBitmaps(record); assertThat(record.getNotification().extras.containsKey(EXTRA_PICTURE)).isFalse(); } StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, @Test n, UserHandle.getUserHandleForUid(mUid), null, 0); public void testRemoveBitmaps_bitmapExpired_silent() { NotificationRecord record = createBigPictureRecord( /* isBigPictureStyle= */ true, /* hasImage= */ true, /* isImageBitmap= */ true, /* isExpired= */ true); addRecordAndRemoveBitmaps(record); assertThat(record.getNotification().flags & FLAG_ONLY_ALERT_ONCE).isNotEqualTo(0); } NotificationRecord bigPictureRecord = @Test new NotificationRecord(mContext, sbn, mTestNotificationChannel); public void testRemoveBitmaps_iconExpired_repost() { addRecordAndRemoveBitmaps( createBigPictureRecord( /* isBigPictureStyle= */ true, /* hasImage= */ true, /* isImageBitmap= */ false, /* isExpired= */ true)); verify(mWorkerHandler, times(1)) .post(any(NotificationManagerService.EnqueueNotificationRunnable.class)); } mService.removeBitmapAndRepost(bigPictureRecord); @Test public void testRemoveBitmaps_iconExpired_iconGone() { NotificationRecord record = createBigPictureRecord( /* isBigPictureStyle= */ true, /* hasImage= */ true, /* isImageBitmap= */ false, /* isExpired= */ true); addRecordAndRemoveBitmaps(record); assertThat(record.getNotification().extras.containsKey(EXTRA_PICTURE_ICON)).isFalse(); } assertThat(n.flags & FLAG_ONLY_ALERT_ONCE).isNotEqualTo(0); @Test public void testRemoveBitmaps_iconExpired_silent() { NotificationRecord record = createBigPictureRecord( /* isBigPictureStyle= */ true, /* hasImage= */ true, /* isImageBitmap= */ false, /* isExpired= */ true); addRecordAndRemoveBitmaps(record); assertThat(record.getNotification().flags & FLAG_ONLY_ALERT_ONCE).isNotEqualTo(0); } } @Test @Test Loading
services/core/java/com/android/server/notification/NotificationManagerService.java +3 −7 Original line number Original line Diff line number Diff line Loading @@ -6630,8 +6630,7 @@ public class NotificationManagerService extends SystemService { } } }; }; @VisibleForTesting private static boolean isBigPictureWithBitmapOrIcon(Notification n) { static boolean isBigPictureWithBitmapOrIcon(Notification n) { final boolean isBigPicture = n.isStyle(Notification.BigPictureStyle.class); final boolean isBigPicture = n.isStyle(Notification.BigPictureStyle.class); if (!isBigPicture) { if (!isBigPicture) { return false; return false; Loading @@ -6649,15 +6648,12 @@ public class NotificationManagerService extends SystemService { return false; return false; } } @VisibleForTesting private static boolean isBitmapExpired(long timePostedMs, long timeNowMs, long timeToLiveMs) { // TODO(b/298414239) Unit test via public API static boolean isBitmapExpired(long timePostedMs, long timeNowMs, long timeToLiveMs) { final long timeDiff = timeNowMs - timePostedMs; final long timeDiff = timeNowMs - timePostedMs; return timeDiff > timeToLiveMs; return timeDiff > timeToLiveMs; } } @VisibleForTesting private void removeBitmapAndRepost(NotificationRecord r) { void removeBitmapAndRepost(NotificationRecord r) { if (!isBigPictureWithBitmapOrIcon(r.getNotification())) { if (!isBigPictureWithBitmapOrIcon(r.getNotification())) { return; return; } } Loading
services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +114 −84 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,8 @@ import static android.app.ActivityManagerInternal.ServiceNotificationPolicy.NOT_ import static android.app.ActivityManagerInternal.ServiceNotificationPolicy.SHOW_IMMEDIATELY; import static android.app.ActivityManagerInternal.ServiceNotificationPolicy.SHOW_IMMEDIATELY; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.Notification.EXTRA_ALLOW_DURING_SETUP; import static android.app.Notification.EXTRA_ALLOW_DURING_SETUP; import static android.app.Notification.EXTRA_PICTURE; import static android.app.Notification.EXTRA_PICTURE_ICON; import static android.app.Notification.FLAG_AUTO_CANCEL; import static android.app.Notification.FLAG_AUTO_CANCEL; import static android.app.Notification.FLAG_BUBBLE; import static android.app.Notification.FLAG_BUBBLE; import static android.app.Notification.FLAG_CAN_COLORIZE; import static android.app.Notification.FLAG_CAN_COLORIZE; Loading @@ -30,7 +32,6 @@ import static android.app.Notification.FLAG_NO_CLEAR; import static android.app.Notification.FLAG_ONGOING_EVENT; import static android.app.Notification.FLAG_ONGOING_EVENT; import static android.app.Notification.FLAG_ONLY_ALERT_ONCE; import static android.app.Notification.FLAG_ONLY_ALERT_ONCE; import static android.app.Notification.FLAG_USER_INITIATED_JOB; import static android.app.Notification.FLAG_USER_INITIATED_JOB; import static android.app.Notification.GROUP_KEY_SILENT; import static android.app.NotificationChannel.USER_LOCKED_ALLOW_BUBBLE; import static android.app.NotificationChannel.USER_LOCKED_ALLOW_BUBBLE; import static android.app.NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED; import static android.app.NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED; import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL; import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL; Loading Loading @@ -89,6 +90,7 @@ import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STR import static com.android.server.am.PendingIntentRecord.FLAG_ACTIVITY_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_ACTIVITY_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_BROADCAST_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_BROADCAST_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_SERVICE_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_SERVICE_SENDER; import static com.android.server.notification.NotificationManagerService.BITMAP_EXPIRATION_TIME_MS; import static com.android.server.notification.NotificationManagerService.DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE; import static com.android.server.notification.NotificationManagerService.DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE; import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_ADJUSTED; import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_ADJUSTED; import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_POSTED; import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_POSTED; Loading Loading @@ -11285,114 +11287,142 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { r.getSbn().getId(), r.getSbn().getTag(), r, false, false)).isTrue(); r.getSbn().getId(), r.getSbn().getTag(), r, false, false)).isTrue(); } } @Test private NotificationRecord createBigPictureRecord(boolean isBigPictureStyle, boolean hasImage, public void testIsBigPictureWithBitmapOrIcon_notBigPicture_false() { boolean isImageBitmap, boolean isExpired) { Notification n = new Notification.Builder(mContext).build(); Notification.Builder builder = new Notification.Builder(mContext); Notification.BigPictureStyle style = new Notification.BigPictureStyle(); assertThat(mService.isBigPictureWithBitmapOrIcon(n)).isFalse(); if (isBigPictureStyle && hasImage) { if (isImageBitmap) { style = style.bigPicture(Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888)); } else { style = style.bigPicture(Icon.createWithResource(mContext, R.drawable.btn_plus)); } } if (isBigPictureStyle) { builder.setStyle(style); } } @Test Notification notification = builder.setChannelId(TEST_CHANNEL_ID).build(); public void testIsBigPictureWithBitmapOrIcon_bigPictureWithBitmap_true() { Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888); Notification n = new Notification.Builder(mContext) .setStyle(new Notification.BigPictureStyle().bigPicture(bitmap)) .build(); assertThat(mService.isBigPictureWithBitmapOrIcon(n)).isTrue(); long timePostedMs = System.currentTimeMillis(); if (isExpired) { timePostedMs -= BITMAP_EXPIRATION_TIME_MS; } } StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, notification, UserHandle.getUserHandleForUid(mUid), null, timePostedMs); @Test return new NotificationRecord(mContext, sbn, mTestNotificationChannel); public void testIsBigPictureWithBitmapOrIcon_bigPictureWithIcon_true() { } Icon icon = Icon.createWithResource(mContext, R.drawable.btn_plus); Notification n = new Notification.Builder(mContext) .setStyle(new Notification.BigPictureStyle().bigPicture(icon)) .build(); assertThat(mService.isBigPictureWithBitmapOrIcon(n)).isTrue(); private void addRecordAndRemoveBitmaps(NotificationRecord record) { mService.addNotification(record); mInternalService.removeBitmaps(); waitForIdle(); } } @Test @Test public void testIsBitmapExpired_notExpired_false() { public void testRemoveBitmaps_notBigPicture_noRepost() { final boolean result = mService.isBitmapExpired( addRecordAndRemoveBitmaps( /* timePosted= */ 0, createBigPictureRecord( /* timeNow= */ 1, /* isBigPictureStyle= */ false, /* timeToLive= */ 2); /* hasImage= */ false, assertThat(result).isFalse(); /* isImageBitmap= */ false, /* isExpired= */ false)); verify(mWorkerHandler, never()) .post(any(NotificationManagerService.EnqueueNotificationRunnable.class)); } } @Test @Test public void testIsBitmapExpired_expired_true() { public void testRemoveBitmaps_bigPictureNoImage_noRepost() { final boolean result = mService.isBitmapExpired( addRecordAndRemoveBitmaps( /* timePosted= */ 0, createBigPictureRecord( /* timeNow= */ 2, /* isBigPictureStyle= */ true, /* timeToLive= */ 1); /* hasImage= */ false, assertThat(result).isTrue(); /* isImageBitmap= */ false, /* isExpired= */ false)); verify(mWorkerHandler, never()) .post(any(NotificationManagerService.EnqueueNotificationRunnable.class)); } } @Test @Test public void testRemoveBitmapAndRepost_removeBitmapFromExtras() { public void testRemoveBitmaps_notExpired_noRepost() { // Create big picture NotificationRecord with bitmap addRecordAndRemoveBitmaps( Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888); createBigPictureRecord( /* isBigPictureStyle= */ true, Notification n = new Notification.Builder(mContext, "test") /* hasImage= */ true, .setStyle(new android.app.Notification.BigPictureStyle().bigPicture(bitmap)) /* isImageBitmap= */ true, .build(); /* isExpired= */ false)); verify(mWorkerHandler, never()) StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, .post(any(NotificationManagerService.EnqueueNotificationRunnable.class)); n, UserHandle.getUserHandleForUid(mUid), null, 0); NotificationRecord bigPictureRecord = new NotificationRecord(mContext, sbn, mTestNotificationChannel); mService.removeBitmapAndRepost(bigPictureRecord); Bitmap bitmapExtra = bigPictureRecord.getNotification().extras.getParcelable( Notification.EXTRA_PICTURE, Bitmap.class); assertThat(bitmapExtra).isNull(); } } @Test @Test public void testRemoveBitmapAndRepost_removeIconFromExtras() { public void testRemoveBitmaps_bitmapExpired_repost() { // Create big picture NotificationRecord with Icon addRecordAndRemoveBitmaps( Icon icon = Icon.createWithResource(mContext, R.drawable.btn_plus); createBigPictureRecord( /* isBigPictureStyle= */ true, Notification n = new Notification.Builder(mContext, "test") /* hasImage= */ true, .setStyle(new android.app.Notification.BigPictureStyle().bigPicture(icon)) /* isImageBitmap= */ true, .build(); /* isExpired= */ true)); verify(mWorkerHandler, times(1)) StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, .post(any(NotificationManagerService.EnqueueNotificationRunnable.class)); n, UserHandle.getUserHandleForUid(mUid), null, 0); NotificationRecord bigPictureRecord = new NotificationRecord(mContext, sbn, mTestNotificationChannel); mService.removeBitmapAndRepost(bigPictureRecord); Icon iconExtra = bigPictureRecord.getNotification().extras.getParcelable( Notification.EXTRA_PICTURE_ICON, Icon.class); assertThat(iconExtra).isNull(); } } @Test @Test public void testRemoveBitmapAndRepost_flagOnlyAlertOnce() { public void testRemoveBitmaps_bitmapExpired_bitmapGone() { Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888); NotificationRecord record = createBigPictureRecord( /* isBigPictureStyle= */ true, Notification n = new Notification.Builder(mContext, "test") /* hasImage= */ true, .setStyle(new android.app.Notification.BigPictureStyle().bigPicture(bitmap)) /* isImageBitmap= */ true, .build(); /* isExpired= */ true); addRecordAndRemoveBitmaps(record); assertThat(record.getNotification().extras.containsKey(EXTRA_PICTURE)).isFalse(); } StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, @Test n, UserHandle.getUserHandleForUid(mUid), null, 0); public void testRemoveBitmaps_bitmapExpired_silent() { NotificationRecord record = createBigPictureRecord( /* isBigPictureStyle= */ true, /* hasImage= */ true, /* isImageBitmap= */ true, /* isExpired= */ true); addRecordAndRemoveBitmaps(record); assertThat(record.getNotification().flags & FLAG_ONLY_ALERT_ONCE).isNotEqualTo(0); } NotificationRecord bigPictureRecord = @Test new NotificationRecord(mContext, sbn, mTestNotificationChannel); public void testRemoveBitmaps_iconExpired_repost() { addRecordAndRemoveBitmaps( createBigPictureRecord( /* isBigPictureStyle= */ true, /* hasImage= */ true, /* isImageBitmap= */ false, /* isExpired= */ true)); verify(mWorkerHandler, times(1)) .post(any(NotificationManagerService.EnqueueNotificationRunnable.class)); } mService.removeBitmapAndRepost(bigPictureRecord); @Test public void testRemoveBitmaps_iconExpired_iconGone() { NotificationRecord record = createBigPictureRecord( /* isBigPictureStyle= */ true, /* hasImage= */ true, /* isImageBitmap= */ false, /* isExpired= */ true); addRecordAndRemoveBitmaps(record); assertThat(record.getNotification().extras.containsKey(EXTRA_PICTURE_ICON)).isFalse(); } assertThat(n.flags & FLAG_ONLY_ALERT_ONCE).isNotEqualTo(0); @Test public void testRemoveBitmaps_iconExpired_silent() { NotificationRecord record = createBigPictureRecord( /* isBigPictureStyle= */ true, /* hasImage= */ true, /* isImageBitmap= */ false, /* isExpired= */ true); addRecordAndRemoveBitmaps(record); assertThat(record.getNotification().flags & FLAG_ONLY_ALERT_ONCE).isNotEqualTo(0); } } @Test @Test