Fix persistence of long tag notifications.

More context about the issue, and testing steps in http://b/258422365#comment17

Test: atest SnoozeHelperTest & tested manually with the steps in the
comment linked above
Bug: 258422365

Change-Id: Ie809cb4d648a40622618e0fb374f36b6d8dc972a
This commit is contained in:
Ioana Alexandru
2022-12-19 15:47:49 +00:00
parent 56fbcccf2a
commit 5c4acdccf4
2 changed files with 37 additions and 18 deletions

View File

@@ -129,7 +129,7 @@ public final class SnoozeHelper {
protected Long getSnoozeTimeForUnpostedNotification(int userId, String pkg, String key) {
Long time = null;
synchronized (mLock) {
time = mPersistedSnoozedNotifications.get(key);
time = mPersistedSnoozedNotifications.get(getTrimmedString(key));
}
if (time == null) {
time = 0L;
@@ -139,7 +139,7 @@ public final class SnoozeHelper {
protected String getSnoozeContextForUnpostedNotification(int userId, String pkg, String key) {
synchronized (mLock) {
return mPersistedSnoozedNotificationsWithContext.get(key);
return mPersistedSnoozedNotificationsWithContext.get(getTrimmedString(key));
}
}
@@ -364,8 +364,9 @@ public final class SnoozeHelper {
final NotificationRecord record = mSnoozedNotifications.valueAt(i);
if (record.getUserId() == userId && record.getSbn().getPackageName().equals(pkg)) {
mSnoozedNotifications.removeAt(i);
mPersistedSnoozedNotificationsWithContext.remove(record.getKey());
mPersistedSnoozedNotifications.remove(record.getKey());
String trimmedKey = getTrimmedString(record.getKey());
mPersistedSnoozedNotificationsWithContext.remove(trimmedKey);
mPersistedSnoozedNotifications.remove(trimmedKey);
Runnable runnable = () -> {
final PendingIntent pi = createPendingIntent(record.getKey());
mAm.cancel(pi);
@@ -386,8 +387,9 @@ public final class SnoozeHelper {
final NotificationRecord record = mSnoozedNotifications.valueAt(i);
if (record.getUserId() == userId) {
mSnoozedNotifications.removeAt(i);
mPersistedSnoozedNotificationsWithContext.remove(record.getKey());
mPersistedSnoozedNotifications.remove(record.getKey());
String trimmedKey = getTrimmedString(record.getKey());
mPersistedSnoozedNotificationsWithContext.remove(trimmedKey);
mPersistedSnoozedNotifications.remove(trimmedKey);
Runnable runnable = () -> {
final PendingIntent pi = createPendingIntent(record.getKey());

View File

@@ -234,7 +234,7 @@ public class SnoozeHelperTest extends UiServiceTestCase {
}
@Test
public void testScheduleRepostsForLongTagPersistedNotification() throws Exception {
public void testLongTagPersistedNotification() throws Exception {
String longTag = "A".repeat(66000);
NotificationRecord r = getNotificationRecord("pkg", 1, longTag, UserHandle.SYSTEM);
mSnoozeHelper.snooze(r, 0);
@@ -612,7 +612,8 @@ public class SnoozeHelperTest extends UiServiceTestCase {
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);
NotificationRecord r2 = getNotificationRecord("pkg", 2, "two" + "2".repeat(66000),
UserHandle.SYSTEM); // include notif with very long tag
mSnoozeHelper.snooze(r, 1000);
mSnoozeHelper.snooze(r2, 1000);
assertTrue(mSnoozeHelper.isSnoozed(
@@ -634,11 +635,14 @@ public class SnoozeHelperTest extends UiServiceTestCase {
@Test
public void testClearData_user() {
// snooze 2 from same package
// snooze 2 from same package, including notifs with long tag
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);
NotificationRecord r2 = getNotificationRecord("pkg2", 2, "two" + "2".repeat(66000),
UserHandle.SYSTEM);
NotificationRecord r3 = getNotificationRecord("pkg2", 3, "three",
UserHandle.SYSTEM);
NotificationRecord r4 = getNotificationRecord("pkg", 2, "two" + "2".repeat(66000),
UserHandle.ALL);
mSnoozeHelper.snooze(r, 1000);
mSnoozeHelper.snooze(r2, 1000);
mSnoozeHelper.snooze(r3, "until");
@@ -653,6 +657,19 @@ public class SnoozeHelperTest extends UiServiceTestCase {
assertTrue(mSnoozeHelper.isSnoozed(
UserHandle.USER_ALL, r4.getSbn().getPackageName(), r4.getKey()));
assertFalse(0L == mSnoozeHelper.getSnoozeTimeForUnpostedNotification(
r.getUser().getIdentifier(), r.getSbn().getPackageName(),
r.getSbn().getKey()));
assertFalse(0L == mSnoozeHelper.getSnoozeTimeForUnpostedNotification(
r2.getUser().getIdentifier(), r2.getSbn().getPackageName(),
r2.getSbn().getKey()));
assertNotNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification(
r3.getUser().getIdentifier(), r3.getSbn().getPackageName(),
r3.getSbn().getKey()));
assertNotNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification(
r4.getUser().getIdentifier(), r4.getSbn().getPackageName(),
r4.getSbn().getKey()));
// clear data
mSnoozeHelper.clearData(UserHandle.USER_SYSTEM);
@@ -666,18 +683,18 @@ public class SnoozeHelperTest extends UiServiceTestCase {
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());
assertNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification(
r3.getUser().getIdentifier(), r3.getSbn().getPackageName(),
r3.getSbn().getKey()));
assertNotNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification(
r4.getUser().getIdentifier(), r4.getSbn().getPackageName(),
r4.getSbn().getKey()));
// 2 for initial timed-snoozes, once each for canceling the USER_SYSTEM snoozes
verify(mAm, times(5)).cancel(any(PendingIntent.class));