Commit a249dbf7 authored by Peter E Conn's avatar Peter E Conn Committed by Commit Bot

💥 Fix crash when removing persistent Snackbar.

When calling SnackbarManager#dismissSnackbars with a persistent
snackbar, you get an IllegalStateException from Iterator#remove.

This is because we attempt to remove the persistent Snackbar from
the list of non-persistent Snackbars.

This CL splits out the logic so we iterate through the persistent
and non-persistent Snackbar deques separately.

Bug: none
Change-Id: I620ba14fd1eaa75ab5ba6a34870655218bd3fd22
Reviewed-on: https://chromium-review.googlesource.com/1179672
Commit-Queue: Peter Conn <peconn@chromium.org>
Reviewed-by: default avatarBernhard Bauer <bauerb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#584074}
parent 333b2496
...@@ -102,32 +102,44 @@ class SnackbarCollection { ...@@ -102,32 +102,44 @@ class SnackbarCollection {
} }
boolean removeMatchingSnackbars(SnackbarController controller) { boolean removeMatchingSnackbars(SnackbarController controller) {
return removeSnackbarFromList(mSnackbars, controller)
|| removeSnackbarFromList(mPersistentSnackbars, controller);
}
private static boolean removeSnackbarFromList(Deque<Snackbar> list,
SnackbarController controller) {
boolean snackbarRemoved = false; boolean snackbarRemoved = false;
Iterator<Snackbar> iter = mSnackbars.iterator(); Iterator<Snackbar> iter = list.iterator();
Iterator<Snackbar> persistentIter = mPersistentSnackbars.iterator(); while (iter.hasNext()) {
while (iter.hasNext() || persistentIter.hasNext()) { Snackbar snackbar = iter.next();
Snackbar snackbar = iter.hasNext() ? iter.next() : persistentIter.next();
if (snackbar.getController() == controller) { if (snackbar.getController() != controller) continue;
iter.remove();
controller.onDismissNoAction(snackbar.getActionData()); iter.remove();
snackbarRemoved = true; controller.onDismissNoAction(snackbar.getActionData());
} snackbarRemoved = true;
} }
return snackbarRemoved; return snackbarRemoved;
} }
boolean removeMatchingSnackbars(SnackbarController controller, Object data) { boolean removeMatchingSnackbars(SnackbarController controller, Object data) {
return removeSnackbarFromList(mSnackbars, controller, data)
|| removeSnackbarFromList(mPersistentSnackbars, controller, data);
}
private static boolean removeSnackbarFromList(Deque<Snackbar> list,
SnackbarController controller, Object data) {
boolean snackbarRemoved = false; boolean snackbarRemoved = false;
Iterator<Snackbar> iter = mSnackbars.iterator(); Iterator<Snackbar> iter = list.iterator();
Iterator<Snackbar> persistentIter = mPersistentSnackbars.iterator(); while (iter.hasNext()) {
while (iter.hasNext() || persistentIter.hasNext()) { Snackbar snackbar = iter.next();
Snackbar snackbar = iter.hasNext() ? iter.next() : persistentIter.next();
if (snackbar.getController() == controller if (snackbar.getController() != controller) continue;
&& objectsAreEqual(snackbar.getActionData(), data)) { if (!objectsAreEqual(snackbar.getActionData(), data)) continue;
iter.remove();
controller.onDismissNoAction(data); iter.remove();
snackbarRemoved = true; controller.onDismissNoAction(snackbar.getActionData());
} snackbarRemoved = true;
} }
return snackbarRemoved; return snackbarRemoved;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment