package com.ilm.sandwich.tools; import android.database.MatrixCursor; import android.os.AsyncTask; import android.util.Log; import com.ilm.sandwich.BuildConfig; import com.ilm.sandwich.GoogleMap; import com.ilm.sandwich.sensors.Core; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.Locale; public class PlacesAutoComplete extends AsyncTask<String, String, StringBuilder> { private static final String LOG_TAG = "PlacesAutocomplete"; private static final String TYPE_AUTOCOMPLETE = "/autocomplete"; private static final String OUT_JSON = "/json"; @Override protected StringBuilder doInBackground(String... input) { HttpURLConnection conn = null; StringBuilder jsonResults = new StringBuilder(); try { StringBuilder sb = new StringBuilder(Config.PLACES_API_URL + TYPE_AUTOCOMPLETE + OUT_JSON); sb.append("?sensor=true&key=" + Config.PLACES_API_KEY); sb.append("&language=" + Locale.getDefault().getLanguage()); sb.append("&location=" + Core.startLat + "," + Core.startLon); sb.append("&radius=1000"); sb.append("&input=" + URLEncoder.encode(input[0], "utf8")); if (BuildConfig.debug) { Log.i(LOG_TAG, "Places Autocomplete for: " + input[0]); Log.i(LOG_TAG, "Places Autocomplete for: " + sb.toString()); } URL url = new URL(sb.toString()); conn = (HttpURLConnection) url.openConnection(); try { conn.setRequestProperty("Referer", "smartnavi-app.com/app/places"); } catch (Exception e) { e.printStackTrace(); } InputStreamReader in = new InputStreamReader(conn.getInputStream()); // Load the results into a StringBuilder int read; char[] buff = new char[1024]; while ((read = in.read(buff)) != -1) { jsonResults.append(buff, 0, read); } try { // Fallback JSONObject jsonObj = new JSONObject(jsonResults.toString()); String status = (String) jsonObj.get("status"); if (status.equals("OVER_QUERY_LIMIT")) { // react to over query limit Config.PLACES_API_UNDER_LIMIT = false; } } catch (JSONException e) { e.printStackTrace(); } } catch (MalformedURLException e) { if (BuildConfig.debug) { Log.e(LOG_TAG, "Error processing Places API URL", e); } } catch (IOException e) { if (BuildConfig.debug) { Log.e(LOG_TAG, "Error connecting to Places API", e); } } finally { if (conn != null) { conn.disconnect(); } } return jsonResults; } @Override protected void onPostExecute(StringBuilder jsonResults) { try { // Create a JSON object hierarchy from the results JSONObject jsonObj = new JSONObject(jsonResults.toString()); JSONArray predsJsonArray = jsonObj.getJSONArray("predictions"); if (BuildConfig.debug) Log.i(LOG_TAG, "Places Autocomplete Result: " + jsonObj.toString()); // builds MatrixCursor for autocomplete search view MatrixCursor cursor = new MatrixCursor(Config.COLUMNS); for (int i = 0; i < predsJsonArray.length(); i++) { int pos = i + 1; cursor.addRow(new String[]{"" + pos, predsJsonArray.getJSONObject(i).getString("description")}); } try { GoogleMap.cursor = cursor; GoogleMap.changeSuggestionAdapter.sendEmptyMessage(0); } catch (Exception e) { e.printStackTrace(); } } catch (JSONException e) { Log.e(LOG_TAG, "Cannot process JSON results", e); e.printStackTrace(); } } }