/**
   * Handles incoming intents.
   *
   * @param intent sent by Location Services. This Intent is provided to Location Services (inside a
   *     PendingIntent) when addGeofences() is called.
   */
  @Override
  protected void onHandleIntent(Intent intent) {
    GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
    if (geofencingEvent.hasError()) {
      String errorMessage =
          GeofenceErrorMessages.getErrorString(this, geofencingEvent.getErrorCode());
      Log.e(TAG, errorMessage);
      return;
    }

    // Get the transition type.
    int geofenceTransition = geofencingEvent.getGeofenceTransition();

    // Test that the reported transition was of interest.
    if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER
        || geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {

      // Get the geofences that were triggered. A single event can trigger multiple geofences.
      List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();

      // Get the transition details as a String.
      String geofenceTransitionDetails =
          getGeofenceTransitionDetails(this, geofenceTransition, triggeringGeofences);

      // Send notification and log the transition details.
      sendNotification(geofenceTransitionDetails);
      Log.i(TAG, geofenceTransitionDetails);
    } else {
      // Log the error.
      Log.e(TAG, getString(R.string.geofence_transition_invalid_type, geofenceTransition));
    }
  }
  /**
   * Runs when the result of calling addGeofences() and removeGeofences() becomes available. Either
   * method can complete successfully or with an error.
   *
   * <p>Since this activity implements the {@link ResultCallback} interface, we are required to
   * define this method.
   *
   * @param status The Status returned through a PendingIntent when addGeofences() or
   *     removeGeofences() get called.
   */
  public void onResult(Status status) {
    if (status.isSuccess()) {
      // Update state and save in shared preferences.
      mGeofencesAdded = !mGeofencesAdded;
      SharedPreferences.Editor editor = mSharedPreferences.edit();
      editor.putBoolean(Constants.GEOFENCES_ADDED_KEY, mGeofencesAdded);
      editor.commit();

      // Update the UI. Adding geofences enables the Remove Geofences button, and removing
      // geofences enables the Add Geofences button.
      setButtonsEnabledState();

      Toast.makeText(
              this,
              getString(mGeofencesAdded ? R.string.geofences_added : R.string.geofences_removed),
              Toast.LENGTH_SHORT)
          .show();
    } else {
      // Get the status code for the error and log it using a user-friendly message.
      String errorMessage = GeofenceErrorMessages.getErrorString(this, status.getStatusCode());
      Log.e(TAG, errorMessage);
    }
  }