aboutsummaryrefslogtreecommitdiff
path: root/car-lib/src/android/car/hardware/CarSensorManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'car-lib/src/android/car/hardware/CarSensorManager.java')
-rw-r--r--car-lib/src/android/car/hardware/CarSensorManager.java37
1 files changed, 18 insertions, 19 deletions
diff --git a/car-lib/src/android/car/hardware/CarSensorManager.java b/car-lib/src/android/car/hardware/CarSensorManager.java
index 0878e1f8d2..6e81b08da0 100644
--- a/car-lib/src/android/car/hardware/CarSensorManager.java
+++ b/car-lib/src/android/car/hardware/CarSensorManager.java
@@ -26,10 +26,11 @@ import android.car.CarManagerBase;
import android.car.CarNotConnectedException;
import android.content.Context;
import android.os.Handler;
-import android.os.Handler.Callback;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
import com.android.car.internal.CarRatedListeners;
import com.android.car.internal.SingleMessageHandler;
@@ -37,7 +38,7 @@ import com.android.car.internal.SingleMessageHandler;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
-import java.util.HashMap;
+import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;
@@ -192,8 +193,7 @@ public final class CarSensorManager implements CarManagerBase {
* To keep record of locally active sensors. Key is sensor type. This is used as a basic lock
* for all client accesses.
*/
- private final HashMap<Integer, CarSensorListeners> mActiveSensorListeners =
- new HashMap<Integer, CarSensorListeners>();
+ private final SparseArray<CarSensorListeners> mActiveSensorListeners = new SparseArray<>();
/** Handles call back into clients. */
private final SingleMessageHandler<CarSensorEvent> mHandlerCallback;
@@ -206,8 +206,10 @@ public final class CarSensorManager implements CarManagerBase {
MSG_SENSOR_EVENTS) {
@Override
protected void handleEvent(CarSensorEvent event) {
- CarSensorListeners listeners =
- mActiveSensorListeners.get(event.sensorType);
+ CarSensorListeners listeners;
+ synchronized (mActiveSensorListeners) {
+ listeners = mActiveSensorListeners.get(event.sensorType);
+ }
if (listeners != null) {
listeners.onSensorChanged(event);
}
@@ -344,10 +346,8 @@ public final class CarSensorManager implements CarManagerBase {
public void unregisterListener(OnSensorChangedListener listener) {
//TODO: removing listener should reset update rate, bug: 32060307
synchronized(mActiveSensorListeners) {
- Iterator<Integer> sensorIterator = mActiveSensorListeners.keySet().iterator();
- while (sensorIterator.hasNext()) {
- Integer sensor = sensorIterator.next();
- doUnregisterListenerLocked(listener, sensor, sensorIterator);
+ for (int i = 0; i < mActiveSensorListeners.size(); i++) {
+ doUnregisterListenerLocked(listener, mActiveSensorListeners.keyAt(i));
}
}
}
@@ -360,12 +360,11 @@ public final class CarSensorManager implements CarManagerBase {
*/
public void unregisterListener(OnSensorChangedListener listener, @SensorType int sensorType) {
synchronized(mActiveSensorListeners) {
- doUnregisterListenerLocked(listener, sensorType, null);
+ doUnregisterListenerLocked(listener, sensorType);
}
}
- private void doUnregisterListenerLocked(OnSensorChangedListener listener, Integer sensor,
- Iterator<Integer> sensorIterator) {
+ private void doUnregisterListenerLocked(OnSensorChangedListener listener, Integer sensor) {
CarSensorListeners listeners = mActiveSensorListeners.get(sensor);
if (listeners != null) {
boolean needsServerUpdate = false;
@@ -379,11 +378,7 @@ public final class CarSensorManager implements CarManagerBase {
} catch (RemoteException e) {
//ignore
}
- if (sensorIterator == null) {
- mActiveSensorListeners.remove(sensor);
- } else {
- sensorIterator.remove();
- }
+ mActiveSensorListeners.remove(sensor);
} else if (needsServerUpdate) {
try {
registerOrUpdateSensorListener(sensor, listeners.getRate());
@@ -479,7 +474,11 @@ public final class CarSensorManager implements CarManagerBase {
return;
}
mLastUpdateTime = updateTime;
- getListeners().forEach(new Consumer<OnSensorChangedListener>() {
+ List<OnSensorChangedListener> listeners;
+ synchronized (mActiveSensorListeners) {
+ listeners = new ArrayList<>(getListeners());
+ }
+ listeners.forEach(new Consumer<OnSensorChangedListener>() {
@Override
public void accept(OnSensorChangedListener listener) {
listener.onSensorChanged(event);