Ejemplo n.º 1
0
  /**
   * Submits an autocomplete query to the Places Geo Data Autocomplete API. Results are returned as
   * frozen AutocompletePrediction objects, ready to be cached. objects to store the Place ID and
   * description that the API returns. Returns an empty list if no results were found. Returns null
   * if the API client is not available or the query did not complete successfully. This method MUST
   * be called off the main UI thread, as it will block until data is returned from the API, which
   * may include a network request.
   *
   * @param constraint Autocomplete query string
   * @return Results from the autocomplete API or null if the query was not successful.
   * @see Places#GEO_DATA_API#getAutocomplete(CharSequence)
   * @see AutocompletePrediction#freeze()
   */
  private ArrayList<AutocompletePrediction> getAutocomplete(CharSequence constraint) {
    if (mGoogleApiClient.isConnected()) {
      Log.i(TAG, "Starting autocomplete query for: " + constraint);

      // Submit the query to the autocomplete API and retrieve a PendingResult that will
      // contain the results when the query completes.
      PendingResult<AutocompletePredictionBuffer> results =
          Places.GeoDataApi.getAutocompletePredictions(
              mGoogleApiClient, constraint.toString(), mBounds, mPlaceFilter);

      // This method should have been called off the main UI thread. Block and wait for at most 60s
      // for a result from the API.
      AutocompletePredictionBuffer autocompletePredictions = results.await(60, TimeUnit.SECONDS);

      // Confirm that the query completed successfully, otherwise return null
      final Status status = autocompletePredictions.getStatus();
      if (!status.isSuccess()) {
        Toast.makeText(
                getContext(), "Error contacting API: " + status.toString(), Toast.LENGTH_SHORT)
            .show();
        Log.e(TAG, "Error getting autocomplete prediction API call: " + status.toString());
        autocompletePredictions.release();
        return null;
      }

      Log.i(
          TAG, "Query completed. Received " + autocompletePredictions.getCount() + " predictions.");

      // Freeze the results immutable representation that can be stored safely.
      return DataBufferUtils.freezeAndClose(autocompletePredictions);
    }
    Log.e(TAG, "Google API client is not connected for autocomplete query.");
    return null;
  }
  private ArrayList<PlaceAutocomplete> getAutocomplete(CharSequence constraint) {
    if (mGoogleApiClient.isConnected()) {
      Log.i(TAG, "Starting autocomplete query for: " + constraint);

      // Submit the query to the autocomplete API and retrieve a PendingResult that will
      // contain the results when the query completes.
      PendingResult<AutocompletePredictionBuffer> results =
          Places.GeoDataApi.getAutocompletePredictions(
              mGoogleApiClient, constraint.toString(), null, mPlaceFilter);

      // This method should have been called off the main UI thread. Block and wait for at most 60s
      // for a result from the API.
      AutocompletePredictionBuffer autocompletePredictions = results.await(60, TimeUnit.SECONDS);

      // Confirm that the query completed successfully, otherwise return null
      final Status status = autocompletePredictions.getStatus();
      if (!status.isSuccess()) {
        Toast.makeText(
                getContext(),
                "Error contacting Google Places: " + status.toString(),
                Toast.LENGTH_SHORT)
            .show();
        Log.e(
            TAG,
            "Error getting autocomplete prediction API call: "
                + status.getStatusMessage()
                + status.getStatus().getStatusMessage());
        autocompletePredictions.release();
        return null;
      }

      Log.i(
          TAG, "Query completed. Received " + autocompletePredictions.getCount() + " predictions.");

      // Copy the results into our own data structure, because we can't hold onto the buffer.
      // AutocompletePrediction objects encapsulate the API response (place ID and description).

      Iterator<AutocompletePrediction> iterator = autocompletePredictions.iterator();
      ArrayList resultList = new ArrayList<>(autocompletePredictions.getCount());
      while (iterator.hasNext()) {
        AutocompletePrediction prediction = iterator.next();
        // Get the details of this prediction and copy it into a new PlaceAutocomplete object.
        resultList.add(new PlaceAutocomplete(prediction.getPlaceId(), prediction.getDescription()));
      }

      // Release the buffer now that all data has been copied.
      autocompletePredictions.release();

      return resultList;
    }
    Log.e(TAG, "Google API client is not connected for autocomplete query.");
    return null;
  }