@Override
  public void onTimeout(final TimeoutTimer timer) {
    endTimerForProvider(timer.getId(), (LocationListener) timer.getTag());
    updateFromLocationListener();

    Utils.d(TAG, "Location timeout for provider", timer.getId());
  }
  private void endTimer(TimeoutTimer timer) {
    if (timer == null) return;

    Utils.d(TAG, "Ending a timed update from", timer.getId());
    timer.stop(); // this will NOT stop the already running thread
    manager.removeUpdates((LocationListener) timer.getTag());
  }
 private TimeoutTimer getTimer(String id) {
   int size = timers.size();
   for (int i = 0; i < size; i++) {
     TimeoutTimer timer = timers.get(i);
     if (timer.getId().equals(id)) {
       return timer;
     }
   }
   return null;
 }