CodeGeek
CodeGeek

Reputation: 721

PlaceAutocompleteAdapter with Places SDK compat Library

I am working on google maps and search.

The only option to search on the map is the Google Places API. https://developers.google.com/places/android-sdk/intro

Which also states that you play service version of SDK is deprecated.

So I was trying to implement it with the new SDK. Now what I want is instead of Autocomplete to Open a new Activity I want it to be displayed as a list on my autocomplete.

So I tried to implement this : https://github.com/googlesamples/android-play-places/blob/master/PlaceCompleteAdapter/Application/src/main/java/com/example/google/playservices/placecomplete/PlaceAutocompleteAdapter.java

But the issue is it works with Play service version but not with Compat version because the classes and imports are different.

This is the part of the code that I am having trouble with :

// 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;
            }

If anyone has implemented PlacesAutoCompleteAdapter with New Places API library. Please guide me with changing the above code.

Thank you.

Upvotes: 1

Views: 1854

Answers (1)

Praful Ranjan
Praful Ranjan

Reputation: 117

Reference link:

https://developers.google.com/places/android-sdk/autocomplete#get_place_predictions_programmatically

Step 1. Intialize new PlaceClient

// Initialize Places.
Places.initialize(getApplicationContext(), apiKey);
// Create a new Places client instance.
PlacesClient placesClient = Places.createClient(this);

Step 2. Create request

// contain the results when the query completes.
  FindAutocompletePredictionsRequest request = FindAutocompletePredictionsRequest.builder()
       // similar to previous mBounds
      // but you have to use Rectangular bounds (Check reference link)
      .setLocationRestriction(mBounds)  
      .setQuery(constraint.toString()) // similar to previous constraint
      .setTypeFilter(TypeFilter.ADDRESS) // similar to mPlaceFilter
      .build();

Step 3. Send request object to response method

Task<FindAutocompletePredictionsResponse> task =
      placeClient.findAutocompletePredictions(request);

Step 4. Handle OnSuccess code here

  task.addOnSuccessListener(
      (response) -> {
        for (AutocompletePrediction prediction : response.getAutocompletePredictions()) {
          Timber.d("prediction result: " + prediction);

          // add result to your arraylist
        }
        // return your arraylist outside foreach loop
      });

Step 5. Handle OnFailure code here

task.addOnFailureListener((exception) -> {
    if (exception instanceof ApiException) {
      ApiException apiException = (ApiException) exception;
      // places not found exception code
      Timber.i("error message %s", apiException.getMessage());
    }
  });

Step 6. Handle OnComplete code here

task.addOnCompleteListener((response) -> {
    Exception e = task.getException();
    if (e instanceof ApiException) {
      ApiException apiException = (ApiException) e;
      if (!task.isSuccessful()) {
        // your code
      }
    }
  });
}

Upvotes: 4

Related Questions