@Override
  public void onLocationChanged(Location location) {
    mLocation = location;
    if (mLocation != null) {
      // Bug report: cached GeoPoint is being returned as the first value.
      // Wait for the 2nd value to be returned, which is hopefully not cached?
      ++mLocationCount;
      InfoLogger.geolog(
          "GeoPointActivity: "
              + System.currentTimeMillis()
              + " onLocationChanged("
              + mLocationCount
              + ") lat: "
              + mLocation.getLatitude()
              + " long: "
              + mLocation.getLongitude()
              + " acc: "
              + mLocation.getAccuracy());

      if (mLocationCount > 1) {
        mLocationDialog.setMessage(
            getString(
                R.string.location_provider_accuracy,
                mLocation.getProvider(),
                truncateDouble(mLocation.getAccuracy())));

        if (mLocation.getAccuracy() <= mLocationAccuracy) {
          returnLocation();
        }
      }
    } else {
      InfoLogger.geolog(
          "GeoPointActivity: "
              + System.currentTimeMillis()
              + " onLocationChanged("
              + mLocationCount
              + ") null location");
    }
  }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
      mLocationCount = savedInstanceState.getInt(LOCATION_COUNT);
    }

    Intent intent = getIntent();

    mLocationAccuracy = GeoPointWidget.DEFAULT_LOCATION_ACCURACY;
    if (intent != null && intent.getExtras() != null) {
      if (intent.hasExtra(GeoPointWidget.ACCURACY_THRESHOLD)) {
        mLocationAccuracy =
            intent.getDoubleExtra(
                GeoPointWidget.ACCURACY_THRESHOLD, GeoPointWidget.DEFAULT_LOCATION_ACCURACY);
      }
    }

    setTitle(getString(R.string.app_name) + " > " + getString(R.string.get_location));

    mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    // make sure we have a good location provider before continuing
    List<String> providers = mLocationManager.getProviders(true);
    for (String provider : providers) {
      if (provider.equalsIgnoreCase(LocationManager.GPS_PROVIDER)) {
        mGPSOn = true;
      }
      if (provider.equalsIgnoreCase(LocationManager.NETWORK_PROVIDER)) {
        mNetworkOn = true;
      }
    }
    if (!mGPSOn && !mNetworkOn) {
      Toast.makeText(
              getBaseContext(), getString(R.string.provider_disabled_error), Toast.LENGTH_SHORT)
          .show();
      finish();
    }

    if (mGPSOn) {
      Location loc = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
      if (loc != null) {
        InfoLogger.geolog(
            "GeoPointActivity: "
                + System.currentTimeMillis()
                + " lastKnownLocation(GPS) lat: "
                + loc.getLatitude()
                + " long: "
                + loc.getLongitude()
                + " acc: "
                + loc.getAccuracy());
      } else {
        InfoLogger.geolog(
            "GeoPointActivity: "
                + System.currentTimeMillis()
                + " lastKnownLocation(GPS) null location");
      }
    }

    if (mNetworkOn) {
      Location loc = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
      if (loc != null) {
        InfoLogger.geolog(
            "GeoPointActivity: "
                + System.currentTimeMillis()
                + " lastKnownLocation(Network) lat: "
                + loc.getLatitude()
                + " long: "
                + loc.getLongitude()
                + " acc: "
                + loc.getAccuracy());
      } else {
        InfoLogger.geolog(
            "GeoPointActivity: "
                + System.currentTimeMillis()
                + " lastKnownLocation(Network) null location");
      }
    }

    setupLocationDialog();
  }