package net.osmand.plus.activities.search; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.TextView; import android.widget.Toast; import net.osmand.ResultMatcher; import net.osmand.data.Amenity; import net.osmand.data.City; import net.osmand.data.LatLon; import net.osmand.data.MapObject; import net.osmand.data.PointDescription; import net.osmand.data.Street; import net.osmand.plus.AppInitializer; import net.osmand.plus.AppInitializer.AppInitializeListener; import net.osmand.plus.AppInitializer.InitEvents; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.OsmandListActivity; import net.osmand.plus.resources.RegionAddressRepository; import net.osmand.plus.resources.ResourceManager; import net.osmand.util.Algorithms; import net.osmand.util.GeoPointParserUtil; import net.osmand.util.GeoPointParserUtil.GeoParsedPoint; import net.osmand.util.MapUtils; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import gnu.trove.map.hash.TLongObjectHashMap; public class GeoIntentActivity extends OsmandListActivity { private ProgressDialog progressDlg; private LatLon location; protected static final boolean DO_NOT_SEARCH_ADDRESS = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search_address_offline); getSupportActionBar().setTitle(R.string.search_osm_offline); getMyApplication().checkApplicationIsBeingInitialized(this, new AppInitializeListener() { @Override public void onProgress(AppInitializer init, InitEvents event) { } @Override public void onFinish(AppInitializer init) { } }); location = getMyApplication().getSettings().getLastKnownMapLocation(); final Intent intent = getIntent(); if (intent != null) { final ProgressDialog progress = ProgressDialog.show(GeoIntentActivity.this, getString(R.string.searching), getString(R.string.searching_address)); final GeoIntentTask task = new GeoIntentTask(progress, intent); progress.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { task.cancel(true); } }); progress.setCancelable(true); task.execute(); setIntent(null); } } private PointDescription getString(MapObject o) { if (o instanceof Amenity) { OsmandSettings settings = ((OsmandApplication) getApplication()).getSettings(); return new PointDescription(PointDescription.POINT_TYPE_POI, OsmAndFormatter.getPoiStringWithoutType((Amenity) o, settings.MAP_PREFERRED_LOCALE.get(), settings.MAP_TRANSLITERATE_NAMES.get())); } if (o instanceof Street) { return new PointDescription(PointDescription.POINT_TYPE_ADDRESS, ((Street) o).getCity().getName() + " " + o.getName()); } return new PointDescription(PointDescription.POINT_TYPE_ADDRESS, o.toString()); } private class GeoIntentTask extends AsyncTask<Void, Void, GeoParsedPoint> { private final ProgressDialog progress; private final Intent intent; private GeoIntentTask(final ProgressDialog progress, final Intent intent) { this.progress = progress; this.intent = intent; } @Override protected void onPreExecute() { } /** * Extracts information from geo and map intents: * * geo:47.6,-122.3<br/> * geo:47.6,-122.3?z=11<br/> * geo:0,0?q=34.99,-106.61(Treasure)<br/> * geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA<br/> * * @param uri * The intent uri * @return */ @Override protected GeoParsedPoint doInBackground(Void... nothing) { try { while (getMyApplication().isApplicationInitializing()) { Thread.sleep(200); } Uri uri = intent.getData(); return GeoPointParserUtil.parse(uri.toString()); } catch (Exception e) { return null; } } @Override protected void onPostExecute(GeoPointParserUtil.GeoParsedPoint p ) { progress.dismiss(); OsmandSettings settings = getMyApplication().getSettings(); if (p != null && p.isGeoPoint()) { PointDescription pd = new PointDescription(p.getLatitude(), p.getLongitude()); if(!Algorithms.isEmpty(p.getLabel())) { pd.setName(p.getLabel()); } settings.setMapLocationToShow(p.getLatitude(), p.getLongitude(), settings.getLastKnownMapZoom(), pd); //$NON-NLS-1$ MapActivity.launchMapActivityMoveToTop(GeoIntentActivity.this); } Uri uri = intent.getData(); String searchString = p != null && p.isGeoAddress() ? p.getQuery() : uri.toString(); settings.setSearchRequestToShow(searchString); MapActivity.launchMapActivityMoveToTop(GeoIntentActivity.this); } } @Override protected void onStop() { dismiss(); super.onStop(); } private void dismiss() { if (progressDlg != null) { progressDlg.dismiss(); progressDlg = null; } } }