From 1ff9e7ae00cf4af2eb5170b96471dda5a8211832 Mon Sep 17 00:00:00 2001 From: Daniel Moore Date: Thu, 16 Feb 2017 08:57:03 -0600 Subject: [PATCH] sensors: fix concurrent modification exception The sensor listener can be removed in unregisterListener inside of the for loop. This change makes a copy of the listeners and iterates over the copy. Test: builds Bug: 37543280 Change-Id: Ie9b7b9afb6994d9627f67c4b3bfbdfb305f5583e Signed-off-by: Daniel Moore --- core/java/android/hardware/SystemSensorManager.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java index 10c4cb3df89ce..f5ad5cc63a125 100644 --- a/core/java/android/hardware/SystemSensorManager.java +++ b/core/java/android/hardware/SystemSensorManager.java @@ -322,7 +322,10 @@ public class SystemSensorManager extends SensorManager { if (sensor.getReportingMode() == Sensor.REPORTING_MODE_ONE_SHOT) { synchronized(mTriggerListeners) { - for (TriggerEventListener l: mTriggerListeners.keySet()) { + HashMap triggerListeners = + new HashMap(mTriggerListeners); + + for (TriggerEventListener l: triggerListeners.keySet()) { if (DEBUG_DYNAMIC_SENSOR){ Log.i(TAG, "removed trigger listener" + l.toString() + " due to sensor disconnection"); @@ -332,7 +335,10 @@ public class SystemSensorManager extends SensorManager { } } else { synchronized(mSensorListeners) { - for (SensorEventListener l: mSensorListeners.keySet()) { + HashMap sensorListeners = + new HashMap(mSensorListeners); + + for (SensorEventListener l: sensorListeners.keySet()) { if (DEBUG_DYNAMIC_SENSOR){ Log.i(TAG, "removed event listener" + l.toString() + " due to sensor disconnection");