From 2ab3cc241eb8592de3a5bfb4cf411a7a81a92883 Mon Sep 17 00:00:00 2001 From: Jeff Blattman Date: Fri, 28 Feb 2020 14:58:08 -0800 Subject: Use a concurrent hash map to access VolumeDialogControllerImpl's callbacks The issue is that the VolumeDialogControllerImpl.C's mCallbackMap is accessed from two different threads. Instrumentation shows that via add() and remove() it is modified on the main thread, and methods like C.onConfigurationChanged() are called from VolumeDialogControllerImpl.Receiver, which registers with on a handler tied to a background thread (VolumeDialogControllerImpl.W/mWorker). C.onConfigurationChanged() is called directly from that thread. Use a concurrent hash map in place of hash map to avoid the concurrent modification exception. Test: manual. Ensure device boots. Ensure basic volume control functions. Ensure a configuration change (via locale change) does not result in any crash. Bug: https://issuetracker.google.com/issues/150402778 Change-Id: I26bb8533c30d57e48f500e6863d0f522e1559567 --- .../src/com/android/systemui/volume/VolumeDialogControllerImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java index f19c49cc123f..699c1393da04 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java @@ -75,6 +75,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; import javax.inject.Inject; import javax.inject.Singleton; @@ -829,7 +830,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } class C implements Callbacks { - private final HashMap mCallbackMap = new HashMap<>(); + private final Map mCallbackMap = new ConcurrentHashMap<>(); public void add(Callbacks callback, Handler handler) { if (callback == null || handler == null) throw new IllegalArgumentException(); -- cgit v1.2.3-59-g8ed1b