private boolean updateFromStoredLocation() {
    Location location = null;
    String provider;

    int size = fineProviders.size();
    for (int i = 0; i < size; i++) {
      provider = fineProviders.get(i);
      location = manager.getLastKnownLocation(provider);
      if (location != null) {
        Utils.d(TAG, "Last location from", provider, location);
        callback.onLocationUpdate(location);
        return true;
      }
    }

    size = coarseProviders.size();
    for (int i = 0; i < size; i++) {
      provider = coarseProviders.get(i);
      location = manager.getLastKnownLocation(provider);
      if (location != null) {
        Utils.d(TAG, "Last known location is", location, provider);
        callback.onLocationUpdate(location);
        return true;
      }
    }
    return false;
  }
  public void updateLocation() {
    updateEnabledProviders();

    if (providersNotEnabled()) {
      callback.onSuggestLocationSettings();
      return;
    }

    if (!updateFromStoredLocation()) {
      updateFromLocationListener();
    }
  }
  private void updateFromLocationListener() {
    if (isCancelled) {
      return;
    }

    if (fineCounter < fineProviders.size()) {
      startTimerForProvider(fineProviders.get(fineCounter), fineListener);
      fineCounter++;
    } else if (coarseCounter < coarseProviders.size()) {
      startTimerForProvider(coarseProviders.get(coarseCounter), coarseListener);
      coarseCounter++;
    } else {
      if (!foundLocation) {
        callback.onLocationUpdateError();
      }
    }
  }