package ru.shutoff.cgstarter; import android.location.Location; import android.net.Uri; import android.os.Bundle; import android.os.CountDownTimer; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import org.apache.commons.lang3.StringEscapeUtils; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; public class StartActivity extends GpsActivity { static final String COORDINATES = "coordinates"; static final String PLACEMARK = "Placemark"; static final String NAME = "name"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String q = null; String url = ""; try { Uri uri = getIntent().getData(); if (uri != null) url = uri.toString(); String[] parts = uri.getQuery().split("&"); for (String part : parts) { if (part.length() < 2) continue; if ((part.length() > 3) && part.substring(0, 2).equals("q=")) { q = Uri.decode(part.substring(2)); break; } if ((part.length() > 7) && part.substring(0, 6).equals("daddr=")) { q = Uri.decode(part.substring(6)); break; } } } catch (Exception ex) { ex.printStackTrace(); } setContentView(R.layout.list); if (q == null) { if (url == null) return; Pattern pat = Pattern.compile("\\@([0-9]+\\.[0-9]+),([0-9]+\\.[0-9]+)"); Matcher matcher = pat.matcher(url); if (!matcher.find()) { HttpTask task = new HttpTask() { @Override void result(String data) { try { SearchActivity.Address addr = new SearchActivity.Address(); Vector<SearchActivity.Address> result = new Vector<SearchActivity.Address>(); int start = data.indexOf("title:\""); if (start >= 0) { start += 7; int end = data.indexOf("\"", start); addr.name = StringEscapeUtils.unescapeHtml4(data.substring(start, end)); addr.address = addr.name; result.add(addr); } start = data.indexOf("lat:"); if (start >= 0) { start += 4; int end = data.indexOf(",", start); addr.lat = Double.parseDouble(data.substring(start, end)); } start = data.indexOf("lng:"); if (start >= 0) { start += 4; int end = data.indexOf("}", start); addr.lon = Double.parseDouble(data.substring(start, end)); } if (result.size() > 0) { showResult(result); return; } finish(); } catch (Exception ex) { error(ex.getLocalizedMessage()); } } @Override void error(String error) { } }; task.execute(url + "&output=json"); return; } q = url; } Pattern pat = Pattern.compile("([0-9]+\\.[0-9]+),([0-9]+\\.[0-9]+)"); Matcher matcher = pat.matcher(q); if (matcher.find()) { try { double lat = Double.parseDouble(matcher.group(1)); double lon = Double.parseDouble(matcher.group(2)); if (OnExitService.isRunCG(StartActivity.this)) CarMonitor.killCG(StartActivity.this); CarMonitor.startCG(StartActivity.this, lat + "|" + lon, null, null); setResult(RESULT_OK); finish(); return; } catch (Exception ex) { // ignore } } final String query = q; if (query == null) { finish(); return; } CountDownTimer timer = new CountDownTimer(1000, 1000) { @Override public void onTick(long millisUntilFinished) { } @Override public void onFinish() { SearchActivity.LocationRequest req = new SearchActivity.LocationRequest() { @Override Location getLocation() { return currentBestLocation; } @Override void showError(String err) { StartActivity.this.error(err); } @Override void result(Vector<SearchActivity.Address> result) { if (result.size() == 0) { error(getString(R.string.no_address)); return; } if (result.size() == 1) { try { SearchActivity.Address addr = result.get(0); if (OnExitService.isRunCG(StartActivity.this)) CarMonitor.killCG(StartActivity.this); CarMonitor.startCG(StartActivity.this, addr.lat + "|" + addr.lon, null, addr); setResult(RESULT_OK); finish(); return; } catch (Exception ex) { error(ex.toString()); } return; } showResult(result); } }; req.exec(query); } }; timer.start(); } void showResult(final Vector<SearchActivity.Address> res) { findViewById(R.id.progress).setVisibility(View.GONE); ListView lv = (ListView) findViewById(R.id.list); lv.setVisibility(View.VISIBLE); lv.setAdapter(new BaseAdapter() { @Override public int getCount() { return res.size(); } @Override public Object getItem(int position) { return res.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { final LayoutInflater layoutInflater = LayoutInflater.from(StartActivity.this); v = layoutInflater.inflate(R.layout.addr_item, null); } TextView tv = (TextView) v.findViewById(R.id.name); tv.setText(res.get(position).address); return v; } }); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { SearchActivity.Address addr = res.get(position); if (OnExitService.isRunCG(StartActivity.this)) CarMonitor.killCG(StartActivity.this); CarMonitor.startCG(StartActivity.this, addr.lat + "|" + addr.lon, null, addr); setResult(RESULT_OK); finish(); } }); } public void locationChanged(Location location) { if ((location != null) && isBetterLocation(location, currentBestLocation)) currentBestLocation = location; locationChanged(); } void error(String error) { Toast toast = Toast.makeText(this, error, Toast.LENGTH_SHORT); toast.show(); finish(); } }