/** @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;
       }
     }
   }
 }