/** @hide */ @Override protected boolean registerListenerImpl( SensorEventListener listener, Sensor sensor, int delay, Handler handler) { boolean result = true; synchronized (sListeners) { // look for this listener in our list ListenerDelegate l = null; for (ListenerDelegate i : sListeners) { if (i.getListener() == listener) { l = i; break; } } // if we don't find it, add it to the list if (l == null) { l = new ListenerDelegate(listener, sensor, handler); sListeners.add(l); // if the list is not empty, start our main thread if (!sListeners.isEmpty()) { if (sSensorThread.startLocked()) { if (!enableSensorLocked(sensor, delay)) { // oops. there was an error sListeners.remove(l); result = false; } } else { // there was an error, remove the listener sListeners.remove(l); result = false; } } else { // weird, we couldn't add the listener result = false; } } else if (!l.hasSensor(sensor)) { l.addSensor(sensor); if (!enableSensorLocked(sensor, delay)) { // oops. there was an error l.removeSensor(sensor); result = false; } } } return result; }
/** @hide */ @Override protected void unregisterListenerImpl(SensorEventListener listener, Sensor sensor) { synchronized (sListeners) { final int size = sListeners.size(); for (int i = 0; i < size; i++) { ListenerDelegate l = sListeners.get(i); if (l.getListener() == listener) { if (sensor == null) { sListeners.remove(i); // disable all sensors for this listener for (Sensor s : l.getSensors()) { disableSensorLocked(s); } } else if (l.removeSensor(sensor) == 0) { // if we have no more sensors enabled on this listener, // take it off the list. sListeners.remove(i); disableSensorLocked(sensor); } break; } } } }