From d72ce23707e5f0658c0693b8903442223ece3c48 Mon Sep 17 00:00:00 2001 From: Sihua Ma Date: Fri, 28 Apr 2023 11:37:10 -0700 Subject: [PATCH] Fix ConcurrentModificationException in QuickstepWidgetHolder If the listeners would modify the listener list in the widget holder, this would cause a ConcurrentModificationException. Fix: 275100497 Test: N/A Change-Id: I3ae0e92db71f1c21d35dbf391dfcb92b46dd30f1 --- .../launcher3/uioverrides/QuickstepWidgetHolder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java index 36e78fba80..39543b0d7d 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java @@ -95,7 +95,11 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder { i -> MAIN_EXECUTOR.execute(() -> sHolders.forEach(h -> h.mAppWidgetRemovedCallback.accept(i))), () -> MAIN_EXECUTOR.execute(() -> - sHolders.forEach(h -> h.mProviderChangedListeners.forEach( + sHolders.forEach(h -> + // Listeners might remove themselves from the list during the + // iteration. Creating a copy of the list to avoid exceptions + // for concurrent modification. + new ArrayList<>(h.mProviderChangedListeners).forEach( ProviderChangedListener::notifyWidgetProvidersChanged))), UI_HELPER_EXECUTOR.getLooper()); if (!WidgetsModel.GO_DISABLE_WIDGETS) {