From c0b14b0e895d65ab428d5c05778aae37ee946e19 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Mon, 9 May 2016 13:12:40 -0400 Subject: [PATCH] Fixed a concurrent modification crash Because notifications could become isolated when the group is suppressed it could lead to concurrent modifications while looping. Change-Id: Ifd4fe0cc24110455de0d3edf2da0be0773eb8c67 Fixes: 28652038 --- .../statusbar/phone/NotificationGroupManager.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java index 48fec7dd5968a..d2326d2c2d7f6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java @@ -26,6 +26,7 @@ import com.android.systemui.statusbar.policy.HeadsUpManager; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -239,7 +240,12 @@ public class NotificationGroupManager implements HeadsUpManager.OnHeadsUpChanged } public void collapseAllGroups() { - for (NotificationGroup group : mGroupMap.values()) { + // Because notifications can become isolated when the group becomes suppressed it can + // lead to concurrent modifications while looping. We need to make a copy. + ArrayList groupCopy = new ArrayList<>(mGroupMap.values()); + int size = groupCopy.size(); + for (int i = 0; i < size; i++) { + NotificationGroup group = groupCopy.get(i); if (group.expanded) { setGroupExpanded(group, false); }