package com.odc.beachodc.utilities.placeAutocomplete;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import com.odc.beachodc.R;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
/*
* Author: Paco Martín
* Esta clase se encarga de autocompletar en un AutoCompleteTextView un lugar/direccion
* a medida que vamos escribiendo en dicho AutoCompleteTextView. Para ello se hace uso
* de la API de Google Place.
*
* Se ha generado una clave, para poder usar dicha API
*/
public class FillPlace extends AsyncTask<String, Void, ArrayList<String>>
{
public ArrayAdapter<String> adapter;
public Map<String, String> referencesPlace;
public AutoCompleteTextView autoComplete;
public Context context;
// Constructor que necesita
// adaptarArg: El Adaptador usado para mostrar las distinas posibilidades de autocompletado en una lista debajo del Campo
// textview: El Campo donde se está escrbiendo y que se quiere autocompletar
// contextArg: El Contexto de donde se llamó al constructor
public FillPlace(ArrayAdapter<String> adapterArg, AutoCompleteTextView textview, Context contextArg){
adapter = adapterArg;
autoComplete = textview;
context = contextArg;
referencesPlace = new HashMap<String, String>();
}
@Override
// Se ejecuta en segundo plano, la busqueda de posibilidades de autocompletado, para no sobrecargar el hilo principal
protected ArrayList<String> doInBackground(String... args) {
ArrayList<String> predictionsArr = new ArrayList<String>();
referencesPlace.clear();
try{
// Llamamos a la API de Google, con lo que de momento lleva escrito el usuario
String direccion = args[0];
URL googlePlaces = new URL("https://maps.googleapis.com/maps/api/place/autocomplete/json?input="+ URLEncoder.encode(direccion, "UTF-8") +"&types=geocode&language=en&sensor=true&key="+context.getResources().getString(R.string.app_key_google_apis_web));
URLConnection tc = googlePlaces.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(tc.getInputStream()));
String line;
StringBuffer sb = new StringBuffer();
// Parseamos la respuesta de la API Place para aclimatarla a un objeto conocido y poder manejar lo que ha devuelto
while ((line = in.readLine()) != null) {
sb.append(line);
}
// Convertimos a JSON lo leido en la respuesta de la API
JSONObject predictions = new JSONObject(sb.toString());
// Convertimos el Objeto JSON anterior a un Array de JSON para poder iterar las respuesta de la API
JSONArray ja = new JSONArray(predictions.getString("predictions"));
for (int i = 0; i < ja.length(); i++) {
JSONObject jo = (JSONObject) ja.get(i);
// Convertimos finalmente cada iteracion del JSON a String, ya que cada iteracion es un posible Autocompletado
predictionsArr.add(jo.getString("description"));
referencesPlace.put(jo.getString("description"), jo.getString("reference"));
}
} catch (Exception e){
referencesPlace.put("error", "errorWS");
}
return predictionsArr;
}
// Este metodo se ejecuta cuando el 'doInBackground' ha terminado, y recibe como parametro
// lo devuelto en el 'doInBackground'
@Override
protected void onPostExecute(ArrayList<String> result){
// Inicializamos la lista que muestra las posibles propuestas de autocompletado
adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1);
adapter.setNotifyOnChange(true);
// Y asignamos esa lista a nuestro Campo, para que se lo muestre al usuario
autoComplete.setAdapter(adapter);
// Ahora vamos rellenando la lista con las distintas propuestas de autocompletado
for (String string : result){
adapter.add(string);
adapter.notifyDataSetChanged();
}
}
}