diff options
| -rw-r--r-- | services/core/java/com/android/server/notification/SnoozeHelper.java | 23 | ||||
| -rw-r--r-- | services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java | 31 |
2 files changed, 50 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java index 61936df4a124..babe4eafd8f3 100644 --- a/services/core/java/com/android/server/notification/SnoozeHelper.java +++ b/services/core/java/com/android/server/notification/SnoozeHelper.java @@ -59,6 +59,9 @@ public final class SnoozeHelper { static final int CONCURRENT_SNOOZE_LIMIT = 500; + // A safe size for strings to be put in persistent storage, to avoid breaking the XML write. + static final int MAX_STRING_LENGTH = 1000; + protected static final String XML_TAG_NAME = "snoozed-notifications"; private static final String XML_SNOOZED_NOTIFICATION = "notification"; @@ -200,7 +203,7 @@ public final class SnoozeHelper { scheduleRepost(key, duration); Long activateAt = System.currentTimeMillis() + duration; synchronized (mLock) { - mPersistedSnoozedNotifications.put(key, activateAt); + mPersistedSnoozedNotifications.put(getTrimmedString(key), activateAt); } } @@ -210,7 +213,10 @@ public final class SnoozeHelper { protected void snooze(NotificationRecord record, String contextId) { if (contextId != null) { synchronized (mLock) { - mPersistedSnoozedNotificationsWithContext.put(record.getKey(), contextId); + mPersistedSnoozedNotificationsWithContext.put( + getTrimmedString(record.getKey()), + getTrimmedString(contextId) + ); } } snooze(record); @@ -225,6 +231,13 @@ public final class SnoozeHelper { } } + private String getTrimmedString(String key) { + if (key != null && key.length() > MAX_STRING_LENGTH) { + return key.substring(0, MAX_STRING_LENGTH); + } + return key; + } + protected boolean cancel(int userId, String pkg, String tag, int id) { synchronized (mLock) { final Set<Map.Entry<String, NotificationRecord>> records = @@ -293,10 +306,12 @@ public final class SnoozeHelper { } protected void repost(String key, int userId, boolean muteOnReturn) { + final String trimmedKey = getTrimmedString(key); + NotificationRecord record; synchronized (mLock) { - mPersistedSnoozedNotifications.remove(key); - mPersistedSnoozedNotificationsWithContext.remove(key); + mPersistedSnoozedNotifications.remove(trimmedKey); + mPersistedSnoozedNotificationsWithContext.remove(trimmedKey); record = mSnoozedNotifications.remove(key); } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java index 7817e8176e76..1f117b3697c9 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java @@ -234,6 +234,37 @@ public class SnoozeHelperTest extends UiServiceTestCase { } @Test + public void testScheduleRepostsForLongTagPersistedNotification() throws Exception { + String longTag = "A".repeat(66000); + NotificationRecord r = getNotificationRecord("pkg", 1, longTag, UserHandle.SYSTEM); + mSnoozeHelper.snooze(r, 0); + + // We store the full key in temp storage. + ArgumentCaptor<PendingIntent> captor = ArgumentCaptor.forClass(PendingIntent.class); + verify(mAm).setExactAndAllowWhileIdle(anyInt(), anyLong(), captor.capture()); + assertEquals(66010, captor.getValue().getIntent().getStringExtra(EXTRA_KEY).length()); + + TypedXmlSerializer serializer = Xml.newFastSerializer(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + serializer.setOutput(new BufferedOutputStream(baos), "utf-8"); + serializer.startDocument(null, true); + mSnoozeHelper.writeXml(serializer); + serializer.endDocument(); + serializer.flush(); + + TypedXmlPullParser parser = Xml.newFastPullParser(); + parser.setInput(new BufferedInputStream( + new ByteArrayInputStream(baos.toByteArray())), "utf-8"); + mSnoozeHelper.readXml(parser, 4); + + mSnoozeHelper.scheduleRepostsForPersistedNotifications(5); + + // We trim the key in persistent storage. + verify(mAm, times(2)).setExactAndAllowWhileIdle(anyInt(), anyLong(), captor.capture()); + assertEquals(1000, captor.getValue().getIntent().getStringExtra(EXTRA_KEY).length()); + } + + @Test public void testSnoozeForTime() throws Exception { NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); mSnoozeHelper.snooze(r, 1000); |