SnoozeHelperTest.java revision 4024b6696ce1be3b29194b8dc21e3d1f97776e69
172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds/*
272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds * Copyright (C) 2016 The Android Open Source Project
372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds *
472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds * Licensed under the Apache License, Version 2.0 (the "License");
572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds * you may not use this file except in compliance with the License.
672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds * You may obtain a copy of the License at
772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds *
872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds *      http://www.apache.org/licenses/LICENSE-2.0
972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds *
1072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds * Unless required by applicable law or agreed to in writing, software
1172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds * distributed under the License is distributed on an "AS IS" BASIS,
1272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds * See the License for the specific language governing permissions and
1472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds * limitations under the License.
1572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds */
1672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldspackage com.android.server.notification;
1772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
1872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport org.junit.Before;
1972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport org.junit.Test;
2072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport org.junit.runner.RunWith;
215098977b20699c2ed32a621524abd5a1b2ab7de4Julia Reynoldsimport org.mockito.ArgumentCaptor;
2272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport org.mockito.Mock;
2372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport org.mockito.MockitoAnnotations;
2472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
2572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport android.app.AlarmManager;
2672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport android.app.Notification;
2772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport android.app.NotificationChannel;
2885769915e7ef10bef2b5338ed8f04d9b787924fbJulia Reynoldsimport android.app.NotificationManager;
2972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport android.app.PendingIntent;
3072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport android.content.Context;
315098977b20699c2ed32a621524abd5a1b2ab7de4Julia Reynoldsimport android.os.SystemClock;
3272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport android.os.UserHandle;
3372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport android.service.notification.StatusBarNotification;
3472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport android.support.test.InstrumentationRegistry;
3572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport android.support.test.runner.AndroidJUnit4;
3672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport android.test.suitebuilder.annotation.SmallTest;
3772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
38cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynoldsimport static junit.framework.Assert.assertEquals;
3972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport static junit.framework.Assert.assertFalse;
4072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport static junit.framework.Assert.assertTrue;
4172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport static org.mockito.Matchers.any;
4272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport static org.mockito.Matchers.anyInt;
43b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynoldsimport static org.mockito.Matchers.anyLong;
4472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport static org.mockito.Matchers.eq;
4572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport static org.mockito.Mockito.never;
4672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport static org.mockito.Mockito.times;
4772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldsimport static org.mockito.Mockito.verify;
48cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynoldsimport static org.mockito.Mockito.when;
4972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
5072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
5172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds@SmallTest
5272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds@RunWith(AndroidJUnit4.class)
5372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynoldspublic class SnoozeHelperTest {
5472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    @Mock SnoozeHelper.Callback mCallback;
5572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    @Mock AlarmManager mAm;
5672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    @Mock ManagedServices.UserProfiles mUserProfiles;
5772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
5872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    private SnoozeHelper mSnoozeHelper;
5972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
6072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    private Context getContext() {
6172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        return InstrumentationRegistry.getTargetContext();
6272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    }
6372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
6472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    @Before
6572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    public void setUp() {
6672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        MockitoAnnotations.initMocks(this);
6772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
6872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        mSnoozeHelper = new SnoozeHelper(getContext(), mCallback, mUserProfiles);
6972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        mSnoozeHelper.setAlarmManager(mAm);
7072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    }
7172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
7272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    @Test
73b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynolds    public void testSnoozeForTime() throws Exception {
7472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
757967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r, 1000);
765098977b20699c2ed32a621524abd5a1b2ab7de4Julia Reynolds        ArgumentCaptor<Long> captor = ArgumentCaptor.forClass(Long.class);
7772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        verify(mAm, times(1)).setExactAndAllowWhileIdle(
785098977b20699c2ed32a621524abd5a1b2ab7de4Julia Reynolds                anyInt(), captor.capture(), any(PendingIntent.class));
795098977b20699c2ed32a621524abd5a1b2ab7de4Julia Reynolds        long actualSnoozedUntilDuration = captor.getValue() - SystemClock.elapsedRealtime();
804024b6696ce1be3b29194b8dc21e3d1f97776e69Julia Reynolds        assertTrue(Math.abs(actualSnoozedUntilDuration - 1000) < 25);
8172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
8272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
8372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    }
8472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
8572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    @Test
86b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynolds    public void testSnooze() throws Exception {
87b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynolds        NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
887967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r);
89b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynolds        verify(mAm, never()).setExactAndAllowWhileIdle(
90b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynolds                anyInt(), anyLong(), any(PendingIntent.class));
91b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
92b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynolds                UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
93b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynolds    }
94b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynolds
95b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynolds    @Test
9672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    public void testCancelByApp() throws Exception {
9772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
9872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.SYSTEM);
997967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r, 1000);
1007967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r2 , 1000);
10172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
10272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
10372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
10472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
10572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
10672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        mSnoozeHelper.cancel(UserHandle.USER_SYSTEM, r.sbn.getPackageName(), "one", 1);
10772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        // 3 = one for each snooze, above + one for cancel itself.
10872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        verify(mAm, times(3)).cancel(any(PendingIntent.class));
10972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertFalse(mSnoozeHelper.isSnoozed(
11072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
11172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
11272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
11372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    }
11472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
11572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    @Test
11672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    public void testCancelAllForUser() throws Exception {
11772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
11872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.SYSTEM);
11972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        NotificationRecord r3 = getNotificationRecord("pkg", 3, "three", UserHandle.ALL);
1207967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r,  1000);
1217967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r2, 1000);
1227967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r3, 1000);
12372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
12472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
12572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
12672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
12772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
12872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_ALL, r3.sbn.getPackageName(), r3.getKey()));
12972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
13072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        mSnoozeHelper.cancel(UserHandle.USER_SYSTEM, false);
13172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        // 5 = once for each snooze above (3) + once for each notification canceled (2).
13272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        verify(mAm, times(5)).cancel(any(PendingIntent.class));
13372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertFalse(mSnoozeHelper.isSnoozed(
13472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
13572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertFalse(mSnoozeHelper.isSnoozed(
13672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
13772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
13872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_ALL, r3.sbn.getPackageName(), r3.getKey()));
13972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    }
14072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
14172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    @Test
14272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    public void testCancelAllByApp() throws Exception {
14372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
14472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.SYSTEM);
14572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        NotificationRecord r3 = getNotificationRecord("pkg2", 3, "three", UserHandle.SYSTEM);
1467967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r, 1000);
1477967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r2, 1000);
1487967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r3, 1000);
14972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
15072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
15172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
15272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
15372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
15472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r3.sbn.getPackageName(), r3.getKey()));
15572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
15672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        mSnoozeHelper.cancel(UserHandle.USER_SYSTEM, "pkg2");
15772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        // 4 = once for each snooze above (3) + once for each notification canceled (1).
15872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        verify(mAm, times(4)).cancel(any(PendingIntent.class));
15972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
16072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
16172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertTrue(mSnoozeHelper.isSnoozed(
16272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
16372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        assertFalse(mSnoozeHelper.isSnoozed(
16472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                UserHandle.USER_SYSTEM, r3.sbn.getPackageName(), r3.getKey()));
16572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    }
16672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
16772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    @Test
16872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    public void testRepost() throws Exception {
16972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
1707967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r, 1000);
17172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        NotificationRecord r2 = getNotificationRecord("pkg", 2, "one", UserHandle.ALL);
1727967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r2, 1000);
173b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynolds        mSnoozeHelper.repost(r.getKey(), UserHandle.USER_SYSTEM);
17472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        verify(mCallback, times(1)).repost(UserHandle.USER_SYSTEM, r);
17572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    }
17672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
17772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    @Test
1787967230de20aeb6993d8332347752c8e508769e4Julia Reynolds    public void testRepost_noUser() throws Exception {
1797967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
1807967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r, 1000);
1817967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        NotificationRecord r2 = getNotificationRecord("pkg", 2, "one", UserHandle.ALL);
1827967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r2, 1000);
1837967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.repost(r.getKey());
1847967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        verify(mCallback, times(1)).repost(UserHandle.USER_SYSTEM, r);
1857967230de20aeb6993d8332347752c8e508769e4Julia Reynolds    }
1867967230de20aeb6993d8332347752c8e508769e4Julia Reynolds
1877967230de20aeb6993d8332347752c8e508769e4Julia Reynolds    @Test
18872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    public void testUpdate() throws Exception {
18972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
1907967230de20aeb6993d8332347752c8e508769e4Julia Reynolds        mSnoozeHelper.snooze(r , 1000);
19172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        r.getNotification().category = "NEW CATEGORY";
19272f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
19372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        mSnoozeHelper.update(UserHandle.USER_SYSTEM, r);
19472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        verify(mCallback, never()).repost(anyInt(), any(NotificationRecord.class));
19572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
196b6c1f99bd96d2f38980f4473baf3aa908d059db2Julia Reynolds        mSnoozeHelper.repost(r.getKey(), UserHandle.USER_SYSTEM);
19772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        verify(mCallback, times(1)).repost(UserHandle.USER_SYSTEM, r);
19872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    }
19972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
200cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds    @Test
201cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds    public void testGetSnoozedByUser() throws Exception {
202cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
203cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.SYSTEM);
204cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        NotificationRecord r3 = getNotificationRecord("pkg2", 3, "three", UserHandle.SYSTEM);
205cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        NotificationRecord r4 = getNotificationRecord("pkg2", 3, "three", UserHandle.CURRENT);
206cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        mSnoozeHelper.snooze(r, 1000);
207cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        mSnoozeHelper.snooze(r2, 1000);
208cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        mSnoozeHelper.snooze(r3, 1000);
209cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        mSnoozeHelper.snooze(r4, 1000);
210cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        when(mUserProfiles.getCurrentProfileIds()).thenReturn(
211cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds                new int[] {UserHandle.USER_SYSTEM});
212cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        assertEquals(3, mSnoozeHelper.getSnoozed().size());
213cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        when(mUserProfiles.getCurrentProfileIds()).thenReturn(
214cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds                new int[] {UserHandle.USER_CURRENT});
215cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        assertEquals(1, mSnoozeHelper.getSnoozed().size());
216cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds    }
217cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds
218cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds    @Test
219cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds    public void testGetSnoozedByUser_managedProfiles() throws Exception {
220cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        when(mUserProfiles.getCurrentProfileIds()).thenReturn(
221cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds                new int[] {UserHandle.USER_SYSTEM, UserHandle.USER_CURRENT});
222cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
223cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.SYSTEM);
224cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        NotificationRecord r3 = getNotificationRecord("pkg2", 3, "three", UserHandle.SYSTEM);
225cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        NotificationRecord r4 = getNotificationRecord("pkg2", 3, "three", UserHandle.CURRENT);
226cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        mSnoozeHelper.snooze(r, 1000);
227cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        mSnoozeHelper.snooze(r2, 1000);
228cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        mSnoozeHelper.snooze(r3, 1000);
229cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        mSnoozeHelper.snooze(r4, 1000);
230cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds        assertEquals(4, mSnoozeHelper.getSnoozed().size());
231cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds    }
232cf63ff1532e793560f62e1c75f3402b48b0f09baJulia Reynolds
23372f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    private NotificationRecord getNotificationRecord(String pkg, int id, String tag,
23472f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds            UserHandle user) {
23572f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        Notification n = new Notification.Builder(getContext())
23672f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                .setContentTitle("A")
23772f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                .setGroup("G")
23872f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                .setSortKey("A")
23972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                .setWhen(1205)
24072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds                .build();
24172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds        return new NotificationRecord(getContext(), new StatusBarNotification(
242924eed1ca6d3fec5dae7eb0f9c11b8f23f628697Julia Reynolds                pkg, pkg, id, tag, 0, 0, n, user, null,
243924eed1ca6d3fec5dae7eb0f9c11b8f23f628697Julia Reynolds                System.currentTimeMillis()), getDefaultChannel());
244423b9fc83d736326b8ddadbfcd6fd5f181bf9fecJulia Reynolds    }
245423b9fc83d736326b8ddadbfcd6fd5f181bf9fecJulia Reynolds
246423b9fc83d736326b8ddadbfcd6fd5f181bf9fecJulia Reynolds    private NotificationChannel getDefaultChannel() {
247423b9fc83d736326b8ddadbfcd6fd5f181bf9fecJulia Reynolds        return new NotificationChannel(NotificationChannel.DEFAULT_CHANNEL_ID, "name",
248423b9fc83d736326b8ddadbfcd6fd5f181bf9fecJulia Reynolds                NotificationManager.IMPORTANCE_LOW);
24972f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds    }
25072f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds
25172f1cbb3b988d6daa61c45a69aa9f8024c029b06Julia Reynolds}
252