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

Commit a72567dc authored by Lyn Han's avatar Lyn Han Committed by Android (Google) Code Review
Browse files

Merge "Unit test bitmap job service via public API" into main

parents f2767347 ad3a44fa
Loading
Loading
Loading
Loading
+3 −7
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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;
        }
        }
+114 −84
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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