Loading services/core/java/com/android/server/notification/NotificationManagerService.java +1 −0 Original line number Diff line number Diff line Loading @@ -1794,6 +1794,7 @@ public class NotificationManagerService extends SystemService { if (userHandle >= 0) { cancelAllNotificationsInt(MY_UID, MY_PID, null, null, 0, 0, true, userHandle, REASON_PROFILE_TURNED_OFF, null); mSnoozeHelper.clearData(userHandle); } } else if (action.equals(Intent.ACTION_USER_PRESENT)) { // turn off LED when user passes through lock screen Loading services/core/java/com/android/server/notification/SnoozeHelper.java +125 −265 File changed.Preview size limit exceeded, changes collapsed. Show changes services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java +71 −20 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static com.android.server.notification.SnoozeHelper.EXTRA_KEY; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; Loading @@ -39,7 +40,6 @@ import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.os.SystemClock; import android.os.UserHandle; import android.service.notification.StatusBarNotification; import android.test.suitebuilder.annotation.SmallTest; Loading @@ -50,7 +50,6 @@ import android.util.Xml; import androidx.test.runner.AndroidJUnit4; import com.android.internal.util.FastXmlSerializer; import com.android.server.UiServiceTestCase; import com.android.server.pm.PackageManagerService; Loading @@ -60,9 +59,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; Loading Loading @@ -197,18 +194,6 @@ public class SnoozeHelperTest extends UiServiceTestCase { systemUser, "pkg", r.getKey()).longValue()); } @Test public void testCleanupContextShouldRemovePersistedRecord() { NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); mSnoozeHelper.snooze(r, "context"); mSnoozeHelper.cleanupPersistedContext(r.getSbn().getKey()); assertNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( r.getUser().getIdentifier(), r.getSbn().getPackageName(), r.getSbn().getKey() )); } @Test public void testReadNoneSnoozedNotification() throws XmlPullParserException, IOException, InterruptedException { Loading @@ -219,8 +204,9 @@ public class SnoozeHelperTest extends UiServiceTestCase { assertEquals("should see a zero value for unsnoozed notification", 0L, mSnoozeHelper.getSnoozeTimeForUnpostedNotification( UserHandle.SYSTEM.getIdentifier(), "not_my_package", r.getKey()).longValue()); UserHandle.SYSTEM.getIdentifier(), "not_my_package", getNotificationRecord("not_my_package", 1, "one", UserHandle.SYSTEM).getKey()).longValue()); } @Test Loading Loading @@ -592,7 +578,7 @@ public class SnoozeHelperTest extends UiServiceTestCase { } @Test public void testClearData() { public void testClearData_userPackage() { // snooze 2 from same package NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.SYSTEM); Loading @@ -615,17 +601,72 @@ public class SnoozeHelperTest extends UiServiceTestCase { verify(mAm, times(4)).cancel(any(PendingIntent.class)); } @Test public void testClearData_user() { // snooze 2 from same package NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); NotificationRecord r2 = getNotificationRecord("pkg2", 2, "two", UserHandle.SYSTEM); NotificationRecord r3 = getNotificationRecord("pkg2", 3, "three", UserHandle.SYSTEM); NotificationRecord r4 = getNotificationRecord("pkg", 2, "two", UserHandle.ALL); mSnoozeHelper.snooze(r, 1000); mSnoozeHelper.snooze(r2, 1000); mSnoozeHelper.snooze(r3, "until"); mSnoozeHelper.snooze(r4, "until"); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r2.getSbn().getPackageName(), r2.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r3.getSbn().getPackageName(), r3.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_ALL, r4.getSbn().getPackageName(), r4.getKey())); // clear data mSnoozeHelper.clearData(UserHandle.USER_SYSTEM); // nothing in USER_SYSTEM snoozed; alarms canceled assertFalse(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey())); assertFalse(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r2.getSbn().getPackageName(), r2.getKey())); assertFalse(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r3.getSbn().getPackageName(), r3.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r4.getSbn().getPackageName(), r4.getKey())); assertNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( r3.getUser().getIdentifier(), r3.getSbn().getPackageName(), r3.getSbn().getKey())); assertNotNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( r4.getUser().getIdentifier(), r4.getSbn().getPackageName(), r4.getSbn().getKey())); assertEquals(0L, mSnoozeHelper.getSnoozeTimeForUnpostedNotification( r.getUser().getIdentifier(), r.getSbn().getPackageName(), r.getSbn().getKey()).longValue()); assertEquals(0L, mSnoozeHelper.getSnoozeTimeForUnpostedNotification( r2.getUser().getIdentifier(), r2.getSbn().getPackageName(), r2.getSbn().getKey()).longValue()); // 2 for initial timed-snoozes, once each for canceling the USER_SYSTEM snoozes verify(mAm, times(5)).cancel(any(PendingIntent.class)); } @Test public void testClearData_otherRecordsUntouched() { // 2 packages, 2 users NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); NotificationRecord rb = getNotificationRecord("pkg", 1, "oneb", UserHandle.SYSTEM); NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.ALL); NotificationRecord r3 = getNotificationRecord("pkg2", 3, "three", UserHandle.SYSTEM); mSnoozeHelper.snooze(r, 1000); mSnoozeHelper.snooze(rb, "until"); mSnoozeHelper.snooze(r2, 1000); mSnoozeHelper.snooze(r3, 1000); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, rb.getSbn().getPackageName(), rb.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_ALL, r2.getSbn().getPackageName(), r2.getKey())); assertTrue(mSnoozeHelper.isSnoozed( Loading @@ -636,12 +677,22 @@ public class SnoozeHelperTest extends UiServiceTestCase { assertFalse(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey())); assertFalse(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, rb.getSbn().getPackageName(), rb.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_ALL, r2.getSbn().getPackageName(), r2.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r3.getSbn().getPackageName(), r3.getKey())); assertNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( rb.getUser().getIdentifier(), rb.getSbn().getPackageName(), rb.getSbn().getKey())); assertEquals(0L, mSnoozeHelper.getSnoozeTimeForUnpostedNotification( r.getUser().getIdentifier(), r.getSbn().getPackageName(), r.getSbn().getKey()).longValue()); // once for each initial snooze, once for canceling one snooze verify(mAm, times(4)).cancel(any(PendingIntent.class)); verify(mAm, times(5)).cancel(any(PendingIntent.class)); } private NotificationRecord getNotificationRecord(String pkg, int id, String tag, Loading Loading
services/core/java/com/android/server/notification/NotificationManagerService.java +1 −0 Original line number Diff line number Diff line Loading @@ -1794,6 +1794,7 @@ public class NotificationManagerService extends SystemService { if (userHandle >= 0) { cancelAllNotificationsInt(MY_UID, MY_PID, null, null, 0, 0, true, userHandle, REASON_PROFILE_TURNED_OFF, null); mSnoozeHelper.clearData(userHandle); } } else if (action.equals(Intent.ACTION_USER_PRESENT)) { // turn off LED when user passes through lock screen Loading
services/core/java/com/android/server/notification/SnoozeHelper.java +125 −265 File changed.Preview size limit exceeded, changes collapsed. Show changes
services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java +71 −20 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static com.android.server.notification.SnoozeHelper.EXTRA_KEY; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; Loading @@ -39,7 +40,6 @@ import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.os.SystemClock; import android.os.UserHandle; import android.service.notification.StatusBarNotification; import android.test.suitebuilder.annotation.SmallTest; Loading @@ -50,7 +50,6 @@ import android.util.Xml; import androidx.test.runner.AndroidJUnit4; import com.android.internal.util.FastXmlSerializer; import com.android.server.UiServiceTestCase; import com.android.server.pm.PackageManagerService; Loading @@ -60,9 +59,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; Loading Loading @@ -197,18 +194,6 @@ public class SnoozeHelperTest extends UiServiceTestCase { systemUser, "pkg", r.getKey()).longValue()); } @Test public void testCleanupContextShouldRemovePersistedRecord() { NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); mSnoozeHelper.snooze(r, "context"); mSnoozeHelper.cleanupPersistedContext(r.getSbn().getKey()); assertNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( r.getUser().getIdentifier(), r.getSbn().getPackageName(), r.getSbn().getKey() )); } @Test public void testReadNoneSnoozedNotification() throws XmlPullParserException, IOException, InterruptedException { Loading @@ -219,8 +204,9 @@ public class SnoozeHelperTest extends UiServiceTestCase { assertEquals("should see a zero value for unsnoozed notification", 0L, mSnoozeHelper.getSnoozeTimeForUnpostedNotification( UserHandle.SYSTEM.getIdentifier(), "not_my_package", r.getKey()).longValue()); UserHandle.SYSTEM.getIdentifier(), "not_my_package", getNotificationRecord("not_my_package", 1, "one", UserHandle.SYSTEM).getKey()).longValue()); } @Test Loading Loading @@ -592,7 +578,7 @@ public class SnoozeHelperTest extends UiServiceTestCase { } @Test public void testClearData() { public void testClearData_userPackage() { // snooze 2 from same package NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.SYSTEM); Loading @@ -615,17 +601,72 @@ public class SnoozeHelperTest extends UiServiceTestCase { verify(mAm, times(4)).cancel(any(PendingIntent.class)); } @Test public void testClearData_user() { // snooze 2 from same package NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); NotificationRecord r2 = getNotificationRecord("pkg2", 2, "two", UserHandle.SYSTEM); NotificationRecord r3 = getNotificationRecord("pkg2", 3, "three", UserHandle.SYSTEM); NotificationRecord r4 = getNotificationRecord("pkg", 2, "two", UserHandle.ALL); mSnoozeHelper.snooze(r, 1000); mSnoozeHelper.snooze(r2, 1000); mSnoozeHelper.snooze(r3, "until"); mSnoozeHelper.snooze(r4, "until"); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r2.getSbn().getPackageName(), r2.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r3.getSbn().getPackageName(), r3.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_ALL, r4.getSbn().getPackageName(), r4.getKey())); // clear data mSnoozeHelper.clearData(UserHandle.USER_SYSTEM); // nothing in USER_SYSTEM snoozed; alarms canceled assertFalse(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey())); assertFalse(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r2.getSbn().getPackageName(), r2.getKey())); assertFalse(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r3.getSbn().getPackageName(), r3.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r4.getSbn().getPackageName(), r4.getKey())); assertNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( r3.getUser().getIdentifier(), r3.getSbn().getPackageName(), r3.getSbn().getKey())); assertNotNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( r4.getUser().getIdentifier(), r4.getSbn().getPackageName(), r4.getSbn().getKey())); assertEquals(0L, mSnoozeHelper.getSnoozeTimeForUnpostedNotification( r.getUser().getIdentifier(), r.getSbn().getPackageName(), r.getSbn().getKey()).longValue()); assertEquals(0L, mSnoozeHelper.getSnoozeTimeForUnpostedNotification( r2.getUser().getIdentifier(), r2.getSbn().getPackageName(), r2.getSbn().getKey()).longValue()); // 2 for initial timed-snoozes, once each for canceling the USER_SYSTEM snoozes verify(mAm, times(5)).cancel(any(PendingIntent.class)); } @Test public void testClearData_otherRecordsUntouched() { // 2 packages, 2 users NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); NotificationRecord rb = getNotificationRecord("pkg", 1, "oneb", UserHandle.SYSTEM); NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.ALL); NotificationRecord r3 = getNotificationRecord("pkg2", 3, "three", UserHandle.SYSTEM); mSnoozeHelper.snooze(r, 1000); mSnoozeHelper.snooze(rb, "until"); mSnoozeHelper.snooze(r2, 1000); mSnoozeHelper.snooze(r3, 1000); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, rb.getSbn().getPackageName(), rb.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_ALL, r2.getSbn().getPackageName(), r2.getKey())); assertTrue(mSnoozeHelper.isSnoozed( Loading @@ -636,12 +677,22 @@ public class SnoozeHelperTest extends UiServiceTestCase { assertFalse(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey())); assertFalse(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, rb.getSbn().getPackageName(), rb.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_ALL, r2.getSbn().getPackageName(), r2.getKey())); assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r3.getSbn().getPackageName(), r3.getKey())); assertNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( rb.getUser().getIdentifier(), rb.getSbn().getPackageName(), rb.getSbn().getKey())); assertEquals(0L, mSnoozeHelper.getSnoozeTimeForUnpostedNotification( r.getUser().getIdentifier(), r.getSbn().getPackageName(), r.getSbn().getKey()).longValue()); // once for each initial snooze, once for canceling one snooze verify(mAm, times(4)).cancel(any(PendingIntent.class)); verify(mAm, times(5)).cancel(any(PendingIntent.class)); } private NotificationRecord getNotificationRecord(String pkg, int id, String tag, Loading