Merge "Use an iterator in removeChannelNotifications rather than index." into sc-dev
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index a71722c..215c393 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -695,14 +695,15 @@
// Remove notifications with the specified user & channel ID.
public void removeChannelNotifications(String pkg, @UserIdInt int userId,
String channelId) {
- for (int i = 0; i < mBuffer.size(); i++) {
- final Pair<StatusBarNotification, Integer> pair = mBuffer.get(i);
+ Iterator<Pair<StatusBarNotification, Integer>> bufferIter = mBuffer.iterator();
+ while (bufferIter.hasNext()) {
+ final Pair<StatusBarNotification, Integer> pair = bufferIter.next();
if (pair.first != null
&& userId == pair.first.getNormalizedUserId()
&& pkg != null && pkg.equals(pair.first.getPackageName())
&& pair.first.getNotification() != null
&& Objects.equals(channelId, pair.first.getNotification().getChannelId())) {
- mBuffer.remove(i);
+ bufferIter.remove();
}
}
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java
index a2ad89e..a05fea2 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java
@@ -144,15 +144,21 @@
@Test
public void testRemoveChannelNotifications() {
List<String> expected = new ArrayList<>();
- for (int i = 0; i < SIZE; i++) {
+ // Add one extra notification to the beginning to test when 2 adjacent notifications will be
+ // removed in the same pass.
+ StatusBarNotification sbn0 = getNotification("pkg", 0, UserHandle.of(USER_CURRENT));
+ mArchive.record(sbn0, REASON_CANCEL);
+ for (int i = 0; i < SIZE - 1; i++) {
StatusBarNotification sbn = getNotification("pkg", i, UserHandle.of(USER_CURRENT));
mArchive.record(sbn, REASON_CANCEL);
- if (i != 3) {
- // Will delete notification for this user in channel "test3".
+ if (i != 0 && i != SIZE - 2) {
+ // Will delete notification for this user in channel "test0", and also the last
+ // element in the list.
expected.add(sbn.getKey());
}
}
- mArchive.removeChannelNotifications("pkg", USER_CURRENT, "test3");
+ mArchive.removeChannelNotifications("pkg", USER_CURRENT, "test0");
+ mArchive.removeChannelNotifications("pkg", USER_CURRENT, "test" + (SIZE - 2));
List<StatusBarNotification> actual = Arrays.asList(mArchive.getArray(SIZE, true));
assertThat(actual).hasSize(expected.size());
for (StatusBarNotification sbn : actual) {