summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yuri Lin <yurilin@google.com> 2021-04-27 20:40:09 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-04-27 20:40:09 +0000
commit2e7c07e699ca1d7e41f0fb4dc69e43fd4aa2184d (patch)
treeec633404fb2b3f1431465ba688208e1d197799a5
parent0847f5a7464a0ed01addbbe45349ec2b04d995ec (diff)
parentacbca16cfaf4248320ab8c5e1e7189bf314eaa29 (diff)
Merge "Use an iterator in removeChannelNotifications rather than index." into sc-dev
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java7
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ArchiveTest.java14
2 files changed, 14 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index a71722c93d48..215c3933fce3 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 @@ public class NotificationManagerService extends SystemService {
// 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 a2ad89edcf5e..a05fea2c8f70 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 @@ public class ArchiveTest extends UiServiceTestCase {
@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) {