From 24ccb2e33e0508bd8df9f466dbf5f6943d6450fe Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Tue, 6 Jul 2010 18:10:17 +0000 Subject: [PATCH] add direction to poi git-svn-id: https://osmand.googlecode.com/svn/trunk@290 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8 --- .../src/com/osmand/ToDoConstants.java | 9 +- OsmAnd/res/layout/searchpoi_list.xml | 6 +- OsmAnd/res/values-ru-rRU/strings.xml | 2 + OsmAnd/res/values/strings.xml | 2 + OsmAnd/src/com/osmand/PoiFilter.java | 6 + .../activities/EditPOIFilterActivity.java | 31 +- .../osmand/activities/FavouritesActivity.java | 2 +- .../activities/NavigatePointActivity.java | 14 +- .../search/SearchAddressActivity.java | 7 +- .../activities/search/SearchPOIActivity.java | 332 ++++++++++++++++-- .../search/SearchPoiFilterActivity.java | 34 +- .../views/AnimateDraggingMapThread.java | 8 +- .../com/osmand/views/OsmandMapTileView.java | 4 - 13 files changed, 392 insertions(+), 65 deletions(-) diff --git a/DataExtractionOSM/src/com/osmand/ToDoConstants.java b/DataExtractionOSM/src/com/osmand/ToDoConstants.java index 7cc98b20dd..b8d44b8dca 100644 --- a/DataExtractionOSM/src/com/osmand/ToDoConstants.java +++ b/DataExtractionOSM/src/com/osmand/ToDoConstants.java @@ -12,7 +12,8 @@ public class ToDoConstants { * Write activity to show something about authors / donation .... */ public int DESCRIBE_ABOUT_AUTHORS = 8; - + + // Prepare update : android description, sites, screenshots // TODO ANDROID // 42. Revise UI (icons/layouts). Support different devices. Add inactive/focus(!) icon versions. @@ -41,10 +42,10 @@ public class ToDoConstants { // double tap to zoom [done] // forbid rotate map to landscape [ done] // REFACTOR Settings activity ( for check box properties!) [partially done] + // show POI choose near by or last map selection [done] + // Show poi direction (using sensor) [done] - // show POI choose near by or last map selection. - // Show poi direction (using sensor) - // hide center point (enable only when trackball using) + // hide center point (enable only when trackball using)? // Fix bugs with test data (bug with follow turn / left time / add turn) // Improvement : Show stops in the transport route diff --git a/OsmAnd/res/layout/searchpoi_list.xml b/OsmAnd/res/layout/searchpoi_list.xml index fa5fad2aee..94459eb8af 100644 --- a/OsmAnd/res/layout/searchpoi_list.xml +++ b/OsmAnd/res/layout/searchpoi_list.xml @@ -3,13 +3,13 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> - + android:paddingTop="2px" /> + android:textSize="22px" android:maxWidth="80dp" android:minWidth="80dp"/> diff --git a/OsmAnd/res/values-ru-rRU/strings.xml b/OsmAnd/res/values-ru-rRU/strings.xml index 1a1623c792..368daca821 100644 --- a/OsmAnd/res/values-ru-rRU/strings.xml +++ b/OsmAnd/res/values-ru-rRU/strings.xml @@ -1,5 +1,7 @@ + Искать возле видимой карты + Искать рядом По умолчанию Портрет Пейзаж diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index db18ebd134..10487789f9 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -1,5 +1,7 @@ + Search near last map location + Search nearby Default Portrait Landscape diff --git a/OsmAnd/src/com/osmand/PoiFilter.java b/OsmAnd/src/com/osmand/PoiFilter.java index 7ddb7391bc..df20514ee5 100644 --- a/OsmAnd/src/com/osmand/PoiFilter.java +++ b/OsmAnd/src/com/osmand/PoiFilter.java @@ -99,6 +99,12 @@ public class PoiFilter { return amenityList; } + public List searchAgain(double lat, double lon){ + List amenityList = ResourceManager.getResourceManager().searchAmenities(this, lat, lon, zoom, maxCount); + MapUtils.sortListOfMapObject(amenityList, lat, lon); + return amenityList; + } + public String getName(){ return name; } diff --git a/OsmAnd/src/com/osmand/activities/EditPOIFilterActivity.java b/OsmAnd/src/com/osmand/activities/EditPOIFilterActivity.java index 8a5d792f70..e70cd8fb82 100644 --- a/OsmAnd/src/com/osmand/activities/EditPOIFilterActivity.java +++ b/OsmAnd/src/com/osmand/activities/EditPOIFilterActivity.java @@ -30,19 +30,21 @@ import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; +import com.osmand.OsmandSettings; import com.osmand.PoiFilter; import com.osmand.PoiFiltersHelper; import com.osmand.R; import com.osmand.PoiFiltersHelper.PoiFilterDbHelper; import com.osmand.activities.search.SearchPOIActivity; import com.osmand.data.AmenityType; +import com.osmand.osm.LatLon; /** * @author Frolov * */ public class EditPOIFilterActivity extends ListActivity { - + public static final String AMENITY_FILTER = "com.osmand.amenity_filter"; //$NON-NLS-1$ private Button filterLevel; private PoiFilter filter; private PoiFilterDbHelper helper; @@ -56,16 +58,31 @@ public class EditPOIFilterActivity extends ListActivity { filterLevel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - Intent newIntent = new Intent(EditPOIFilterActivity.this, SearchPOIActivity.class); - Bundle bundle = new Bundle(); - bundle.putString(SearchPOIActivity.AMENITY_FILTER, filter.getFilterId()); - newIntent.putExtras(bundle); - startActivity(newIntent); + AlertDialog.Builder b = new AlertDialog.Builder(EditPOIFilterActivity.this); + b.setItems(new String[]{getString(R.string.search_nearby), getString(R.string.search_near_map)}, new DialogInterface.OnClickListener(){ + @Override + public void onClick(DialogInterface dialog, int which) { + Bundle bundle = new Bundle(); + Intent newIntent = new Intent(EditPOIFilterActivity.this, SearchPOIActivity.class); + bundle.putString(SearchPOIActivity.AMENITY_FILTER, filter.getFilterId()); + if(which == 1){ + LatLon last = OsmandSettings.getLastKnownMapLocation(EditPOIFilterActivity.this); + if(last != null){ + bundle.putDouble(SearchPOIActivity.SEARCH_LAT, last.getLatitude()); + bundle.putDouble(SearchPOIActivity.SEARCH_LON, last.getLongitude()); + } + + } + newIntent.putExtras(bundle); + startActivity(newIntent); + } + }); + b.show(); } }); Bundle bundle = this.getIntent().getExtras(); - String filterId = bundle.getString(SearchPOIActivity.AMENITY_FILTER); + String filterId = bundle.getString(AMENITY_FILTER); filter = PoiFiltersHelper.getFilterById(this, filterId); setListAdapter(new AmenityAdapter(AmenityType.getCategories())); diff --git a/OsmAnd/src/com/osmand/activities/FavouritesActivity.java b/OsmAnd/src/com/osmand/activities/FavouritesActivity.java index 3f81f0f31b..6953be4ed7 100644 --- a/OsmAnd/src/com/osmand/activities/FavouritesActivity.java +++ b/OsmAnd/src/com/osmand/activities/FavouritesActivity.java @@ -89,7 +89,7 @@ public class FavouritesActivity extends ListActivity { AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) aItem.getMenuInfo(); final FavouritePoint point = (FavouritePoint) favouritesList.get(menuInfo.position); if(aItem.getItemId() == NAVIGATE_TO){ - OsmandSettings.setMapLocationToShow(this, point.getLatitude(), point.getLongitude(), getString(R.string.favorite)+" : " + point.getName()); //$NON-NLS-1$ +// OsmandSettings.setMapLocationToShow(this, point.getLatitude(), point.getLongitude(), getString(R.string.favorite)+" : " + point.getName()); //$NON-NLS-1$ OsmandSettings.setPointToNavigate(this, point.getLatitude(), point.getLongitude()); Intent newIntent = new Intent(FavouritesActivity.this, MapActivity.class); startActivity(newIntent); diff --git a/OsmAnd/src/com/osmand/activities/NavigatePointActivity.java b/OsmAnd/src/com/osmand/activities/NavigatePointActivity.java index d79b9007f7..a819d8cdc6 100644 --- a/OsmAnd/src/com/osmand/activities/NavigatePointActivity.java +++ b/OsmAnd/src/com/osmand/activities/NavigatePointActivity.java @@ -122,14 +122,16 @@ public class NavigatePointActivity extends Activity { // TODO there is a bug in android implementation : doesn't convert if min = 59.23 or sec = 59.32 or deg=179.3 double lat = Location.convert(((TextView) findViewById(R.id.LatitudeEdit)).getText().toString()); double lon = Location.convert(((TextView) findViewById(R.id.LongitudeEdit)).getText().toString()); - // in case when it is dialog - if(activity != null) { - activity.setMapLocation(lat, lon); - } else { - OsmandSettings.setMapLocationToShow(this, lat, lon, MessageFormat.format(getString(R.string.search_history_navigate_to), lat, lon)); - } + if(navigate){ OsmandSettings.setPointToNavigate(this, lat, lon); + } else { + // in case when it is dialog + if(activity != null) { + activity.setMapLocation(lat, lon); + } else { + OsmandSettings.setMapLocationToShow(this, lat, lon, MessageFormat.format(getString(R.string.search_history_navigate_to), lat, lon)); + } } close(); } catch (RuntimeException e) { diff --git a/OsmAnd/src/com/osmand/activities/search/SearchAddressActivity.java b/OsmAnd/src/com/osmand/activities/search/SearchAddressActivity.java index fb80ca28c5..1f0f43cdd0 100644 --- a/OsmAnd/src/com/osmand/activities/search/SearchAddressActivity.java +++ b/OsmAnd/src/com/osmand/activities/search/SearchAddressActivity.java @@ -217,9 +217,10 @@ public class SearchAddressActivity extends Activity { if (l != null) { if(navigateTo){ OsmandSettings.setPointToNavigate(SearchAddressActivity.this, l.getLatitude(), l.getLongitude()); - } - OsmandSettings.setMapLocationToShow(SearchAddressActivity.this, l.getLatitude(), l.getLongitude(), historyName); - OsmandSettings.setLastKnownMapZoom(SearchAddressActivity.this, zoom); + } else { + OsmandSettings.setMapLocationToShow(SearchAddressActivity.this, l.getLatitude(), l.getLongitude(), historyName); + OsmandSettings.setLastKnownMapZoom(SearchAddressActivity.this, zoom); + } startActivity(new Intent(SearchAddressActivity.this, MapActivity.class)); } diff --git a/OsmAnd/src/com/osmand/activities/search/SearchPOIActivity.java b/OsmAnd/src/com/osmand/activities/search/SearchPOIActivity.java index daaaecb324..4fbc29e2f1 100644 --- a/OsmAnd/src/com/osmand/activities/search/SearchPOIActivity.java +++ b/OsmAnd/src/com/osmand/activities/search/SearchPOIActivity.java @@ -9,7 +9,26 @@ import java.util.List; import android.app.ListActivity; import android.content.Intent; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Paint.Style; +import android.graphics.drawable.Drawable; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.location.LocationProvider; +import android.os.Build; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -22,6 +41,8 @@ import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; +import com.osmand.Algoritms; +import com.osmand.LogUtil; import com.osmand.OsmandSettings; import com.osmand.PoiFilter; import com.osmand.PoiFiltersHelper; @@ -37,31 +58,44 @@ import com.osmand.osm.OpeningHoursParser.OpeningHoursRule; * @author Maxim Frolov * */ -public class SearchPOIActivity extends ListActivity { +public class SearchPOIActivity extends ListActivity implements LocationListener, SensorEventListener { public static final String AMENITY_FILTER = "com.osmand.amenity_filter"; //$NON-NLS-1$ + public static final String SEARCH_LAT = "com.osmand.am_search_lat"; //$NON-NLS-1$ + public static final String SEARCH_LON = "com.osmand.am_search_lon"; //$NON-NLS-1$ + private static final int GPS_TIMEOUT_REQUEST = 2000; + private static final int GPS_DIST_REQUEST = 5; + private Button searchPOILevel; private Button showOnMap; private PoiFilter filter; private AmenityAdapter amenityAdapter; - private LatLon lastKnownMapLocation; private TextView searchArea; - + + private boolean searchNearBy = false; + private Location location = null; + private Location searchedLocation = null; + private Float heading = null; + + private String currentLocationProvider = null; + private boolean sensorRegistered = false; + private Handler uiHandler; - @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.searchpoi); + uiHandler = new Handler(); searchPOILevel = (Button) findViewById(R.id.SearchPOILevelButton); searchArea = (TextView) findViewById(R.id.SearchAreaText); searchPOILevel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - amenityAdapter.setNewModel(filter.searchFurther(lastKnownMapLocation.getLatitude(), lastKnownMapLocation.getLongitude())); + amenityAdapter.setNewModel(filter.searchFurther(location.getLatitude(), location.getLongitude())); + searchedLocation = location; searchArea.setText(filter.getSearchArea()); searchPOILevel.setEnabled(filter.isSearchFurtherAvailable()); @@ -71,6 +105,15 @@ public class SearchPOIActivity extends ListActivity { Bundle bundle = this.getIntent().getExtras(); String filterId = bundle.getString(AMENITY_FILTER); filter = PoiFiltersHelper.getFilterById(this, filterId); + if(bundle.containsKey(SEARCH_LAT) && bundle.containsKey(SEARCH_LON)){ + location = new Location("internal"); //$NON-NLS-1$ + location.setLatitude(bundle.getDouble(SEARCH_LAT)); + location.setLongitude(bundle.getDouble(SEARCH_LON)); + searchNearBy = false; + } else { + location = null; + searchNearBy = true; + } showOnMap = (Button) findViewById(R.id.ShowOnMap); showOnMap.setOnClickListener(new OnClickListener() { @@ -78,6 +121,10 @@ public class SearchPOIActivity extends ListActivity { public void onClick(View v) { OsmandSettings.setPoiFilterForMap(SearchPOIActivity.this, filter.getFilterId()); OsmandSettings.setShowPoiOverMap(SearchPOIActivity.this, true); + if(searchNearBy && location != null){ + OsmandSettings.setMapLocationToShow(SearchPOIActivity.this, location.getLatitude(), location.getLongitude()); + OsmandSettings.setLastKnownMapZoom(SearchPOIActivity.this, 15); + } Intent newIntent = new Intent(SearchPOIActivity.this, MapActivity.class); startActivity(newIntent); } @@ -106,16 +153,157 @@ public class SearchPOIActivity extends ListActivity { }); } + public void setLocation(Location l){ + registerUnregisterSensor(l); + boolean handled = false; + if (l != null && filter != null) { + if (location == null) { + searchedLocation = l; + amenityAdapter.setNewModel(filter.initializeNewSearch(l.getLatitude(), l.getLongitude(), 40)); + searchPOILevel.setEnabled(filter.isSearchFurtherAvailable()); + searchArea.setText(filter.getSearchArea()); + handled = true; + } else if (searchedLocation != null && l.distanceTo(searchedLocation) > 80) { + amenityAdapter.setNewModel(filter.searchAgain(l.getLatitude(), l.getLongitude())); + searchPOILevel.setEnabled(filter.isSearchFurtherAvailable()); + searchArea.setText(filter.getSearchArea()); + handled = true; + } else if(location.distanceTo(l) > 8){ + handled = true; + } + } + + if(handled) { + location = l; + amenityAdapter.notifyDataSetChanged(); + } + } + + private boolean isRunningOnEmulator(){ + if (Build.DEVICE.equals("generic")) { //$NON-NLS-1$ + return true; + } + return false; + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE); + if (LocationManager.GPS_PROVIDER.equals(provider)) { + if (LocationProvider.OUT_OF_SERVICE == status || LocationProvider.TEMPORARILY_UNAVAILABLE == status) { + if (LocationProvider.OUT_OF_SERVICE == status) { + setLocation(null); + } + if (!isRunningOnEmulator() && service.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { + if (!Algoritms.objectEquals(currentLocationProvider, LocationManager.NETWORK_PROVIDER)) { + currentLocationProvider = LocationManager.NETWORK_PROVIDER; + service.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, this); + } + } + } else if (LocationProvider.AVAILABLE == status) { + if (!Algoritms.objectEquals(currentLocationProvider, LocationManager.GPS_PROVIDER)) { + currentLocationProvider = LocationManager.GPS_PROVIDER; + service.removeUpdates(this); + service.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, this); + } + + } + } + } + + @Override + public void onLocationChanged(Location location) { + setLocation(location); + } + @Override + public void onProviderDisabled(String provider) { + setLocation(null); + } + + @Override + public void onSensorChanged(SensorEvent event) { + // Attention : sensor produces a lot of events & can hang the system + if(heading != null && heading - event.values[0] < 4){ + // this is very small variation + return; + } + heading = event.values[0]; + + if(!uiHandler.hasMessages(5)){ + Message msg = Message.obtain(uiHandler, new Runnable(){ + @Override + public void run() { + amenityAdapter.notifyDataSetChanged(); + } + }); + msg.what = 5; + uiHandler.sendMessageDelayed(msg, 100); + } + + } + + @Override + public void onProviderEnabled(String provider) { + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + } + + @Override protected void onResume() { super.onResume(); - // TODO think where this code should be placed (onCreate() - save last search results or onResume() - search time) - lastKnownMapLocation = OsmandSettings.getLastKnownMapLocation(this); - if (filter != null) { - amenityAdapter.setNewModel(filter.initializeNewSearch(lastKnownMapLocation.getLatitude(), - lastKnownMapLocation.getLongitude(), 40)); + if (filter != null && location != null) { + searchedLocation = location; + amenityAdapter.setNewModel(filter.initializeNewSearch(location.getLatitude(), location.getLongitude(), 40)); searchPOILevel.setEnabled(filter.isSearchFurtherAvailable()); searchArea.setText(filter.getSearchArea()); + } else { + searchPOILevel.setEnabled(false); + } + showOnMap.setEnabled(filter != null); + if (searchNearBy) { + LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE); + service.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, this); + if (!service.isProviderEnabled(LocationManager.GPS_PROVIDER)) { + service.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, this); + } + } + } + + private void registerUnregisterSensor(Location location){ + // show point view only if gps enabled + if(location == null){ + if(sensorRegistered) { + Log.d(LogUtil.TAG, "Disable sensor"); //$NON-NLS-1$ + ((SensorManager) getSystemService(SENSOR_SERVICE)).unregisterListener(this); + sensorRegistered = false; + heading = null; + } + } else { + if(!sensorRegistered){ + Log.d(LogUtil.TAG, "Enable sensor"); //$NON-NLS-1$ + SensorManager sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE); + Sensor s = sensorMgr.getDefaultSensor(Sensor.TYPE_ORIENTATION); + if (s != null) { + sensorMgr.registerListener(this, s, SensorManager.SENSOR_DELAY_UI); + } + sensorRegistered = true; + } + } + } + + @Override + protected void onPause() { + super.onPause(); + if (searchNearBy) { + LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE); + service.removeUpdates(this); + + SensorManager sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE); + sensorMgr.unregisterListener(this); + sensorRegistered = false; } } @@ -125,10 +313,81 @@ public class SearchPOIActivity extends ListActivity { OsmandSettings.setShowPoiOverMap(SearchPOIActivity.this, true); } Amenity amenity = ((AmenityAdapter) getListAdapter()).getItem(position); - OsmandSettings.setMapLocationToShow(this, amenity.getLocation().getLatitude(), amenity.getLocation().getLongitude(), getString(R.string.poi)+" : " + amenity.getSimpleFormat(OsmandSettings.usingEnglishNames(this))); //$NON-NLS-1$ + OsmandSettings.setMapLocationToShow(this, amenity.getLocation().getLatitude(), amenity.getLocation().getLongitude(), + getString(R.string.poi)+" : " + amenity.getSimpleFormat(OsmandSettings.usingEnglishNames(this))); //$NON-NLS-1$ + OsmandSettings.setLastKnownMapZoom(this, 16); Intent newIntent = new Intent(SearchPOIActivity.this, MapActivity.class); startActivity(newIntent); } + + class DirectionDrawable extends Drawable { + Paint paintRouteDirection; + Path path = new Path(); + private float angle; + + private final int width = 24; + private final int height = 24; + + public DirectionDrawable(){ + paintRouteDirection = new Paint(); + paintRouteDirection.setStyle(Style.FILL_AND_STROKE); + paintRouteDirection.setColor(Color.rgb(100, 0, 255)); + paintRouteDirection.setAntiAlias(true); + + int h = 15; + int w = 4; + float sarrowL = 8; // side of arrow + float harrowL = (float) Math.sqrt(2) * sarrowL; // hypotenuse of arrow + float hpartArrowL = (float) (harrowL - w) / 2; + + path.moveTo(width / 2, height - (height - h) / 3); + path.rMoveTo(w / 2, 0); + path.rLineTo(0, -h); + path.rLineTo(hpartArrowL, 0); + path.rLineTo(-harrowL / 2, -harrowL / 2); // center + path.rLineTo(-harrowL / 2, harrowL / 2); + path.rLineTo(hpartArrowL, 0); + path.rLineTo(0, h); + } + + public void setOpenedColor(int opened){ + if(opened == 0){ + paintRouteDirection.setColor(Color.rgb(100, 0, 255)); + } else if(opened == -1){ + paintRouteDirection.setColor(Color.rgb(150, 150, 150)); + } else { + paintRouteDirection.setColor(Color.rgb(220, 100, 80)); + } + } + + + public void setAngle(float angle){ + this.angle = angle; + } + + @Override + public void draw(Canvas canvas) { + canvas.rotate(angle, width/2, height/2); + canvas.drawPath(path, paintRouteDirection); + } + + @Override + public int getOpacity() { + return 0; + } + + @Override + public void setAlpha(int alpha) { + paintRouteDirection.setAlpha(alpha); + + } + + @Override + public void setColorFilter(ColorFilter cf) { + paintRouteDirection.setColorFilter(cf); + } + + } class AmenityAdapter extends ArrayAdapter { AmenityAdapter(List list) { @@ -152,43 +411,62 @@ public class SearchPOIActivity extends ListActivity { LayoutInflater inflater = getLayoutInflater(); row = inflater.inflate(R.layout.searchpoi_list, parent, false); } + float[] mes = null; TextView label = (TextView) row.findViewById(R.id.poi_label); TextView distanceLabel = (TextView) row.findViewById(R.id.poidistance_label); ImageView icon = (ImageView) row.findViewById(R.id.poi_icon); Amenity amenity = getItem(position); - LatLon lastKnownMapLocation = OsmandSettings.getLastKnownMapLocation(SearchPOIActivity.this); - int dist = (int) (MapUtils.getDistance(amenity.getLocation(), lastKnownMapLocation.getLatitude(), lastKnownMapLocation - .getLongitude())); + if(location != null){ + mes = new float[2]; + LatLon l = amenity.getLocation(); + Location.distanceBetween(l.getLatitude(), l.getLongitude(), location.getLatitude(), location.getLongitude(), mes); + } + String str = amenity.getStringWithoutType(OsmandSettings.usingEnglishNames(SearchPOIActivity.this)); label.setText(str); + int opened = -1; if (amenity.getOpeningHours() != null) { List rs = OpeningHoursParser.parseOpenedHours(amenity.getOpeningHours()); - if(rs == null){ - icon.setImageResource(R.drawable.poi); - } else { + if (rs != null) { Calendar inst = Calendar.getInstance(); inst.setTimeInMillis(System.currentTimeMillis()); boolean work = false; - for(OpeningHoursRule p : rs){ - if(p.isOpenedForTime(inst)){ + for (OpeningHoursRule p : rs) { + if (p.isOpenedForTime(inst)) { work = true; break; } } - if(work){ - icon.setImageResource(R.drawable.opened_poi); + if (work) { + opened = 0; } else { - icon.setImageResource(R.drawable.closed_poi); + opened = 1; } } - - } else { - icon.setImageResource(R.drawable.poi); } - - distanceLabel.setText(" " + MapUtils.getFormattedDistance(dist)); //$NON-NLS-1$ + if(heading != null && location != null){ + DirectionDrawable draw = new DirectionDrawable(); + draw.setAngle(mes[1] - heading + 180); + draw.setOpenedColor(opened); + icon.setImageDrawable(draw); + } else { + if(opened == -1){ + icon.setImageResource(R.drawable.poi); + } else if(opened == 0){ + icon.setImageResource(R.drawable.opened_poi); + } else { + icon.setImageResource(R.drawable.closed_poi); + } + } + + if(mes == null){ + distanceLabel.setText(""); //$NON-NLS-1$ + } else { + distanceLabel.setText(" " + MapUtils.getFormattedDistance((int) mes[0])); //$NON-NLS-1$ + } return (row); } } + } diff --git a/OsmAnd/src/com/osmand/activities/search/SearchPoiFilterActivity.java b/OsmAnd/src/com/osmand/activities/search/SearchPoiFilterActivity.java index 7a35a966a9..0b18b703c5 100644 --- a/OsmAnd/src/com/osmand/activities/search/SearchPoiFilterActivity.java +++ b/OsmAnd/src/com/osmand/activities/search/SearchPoiFilterActivity.java @@ -6,7 +6,9 @@ package com.osmand.activities.search; import java.util.ArrayList; import java.util.List; +import android.app.AlertDialog; import android.app.ListActivity; +import android.content.DialogInterface; import android.content.Intent; import android.graphics.Typeface; import android.os.Bundle; @@ -19,10 +21,12 @@ import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; +import com.osmand.OsmandSettings; import com.osmand.PoiFilter; import com.osmand.PoiFiltersHelper; import com.osmand.R; import com.osmand.activities.EditPOIFilterActivity; +import com.osmand.osm.LatLon; /** * @author Maxim Frolov @@ -30,7 +34,6 @@ import com.osmand.activities.EditPOIFilterActivity; */ public class SearchPoiFilterActivity extends ListActivity { - private Typeface typeFace; @@ -68,22 +71,37 @@ public class SearchPoiFilterActivity extends ListActivity { Bundle bundle = new Bundle(); Intent newIntent = new Intent(SearchPoiFilterActivity.this, EditPOIFilterActivity.class); // folder selected - bundle.putString(SearchPOIActivity.AMENITY_FILTER, poi.getFilterId()); + bundle.putString(EditPOIFilterActivity.AMENITY_FILTER, poi.getFilterId()); newIntent.putExtras(bundle); startActivityForResult(newIntent, 0); } } public void onListItemClick(ListView parent, View v, int position, long id) { - PoiFilter filter = ((AmenityAdapter) getListAdapter()).getItem(position); + final PoiFilter filter = ((AmenityAdapter) getListAdapter()).getItem(position); if(filter.getFilterId().equals(PoiFilter.CUSTOM_FILTER_ID)){ showEditActivity(filter); return; } - Bundle bundle = new Bundle(); - Intent newIntent = new Intent(SearchPoiFilterActivity.this, SearchPOIActivity.class); - bundle.putString(SearchPOIActivity.AMENITY_FILTER, filter.getFilterId()); - newIntent.putExtras(bundle); - startActivityForResult(newIntent, 0); + AlertDialog.Builder b = new AlertDialog.Builder(this); + b.setItems(new String[]{getString(R.string.search_nearby), getString(R.string.search_near_map)}, new DialogInterface.OnClickListener(){ + @Override + public void onClick(DialogInterface dialog, int which) { + Bundle bundle = new Bundle(); + Intent newIntent = new Intent(SearchPoiFilterActivity.this, SearchPOIActivity.class); + bundle.putString(SearchPOIActivity.AMENITY_FILTER, filter.getFilterId()); + if(which == 1){ + LatLon last = OsmandSettings.getLastKnownMapLocation(SearchPoiFilterActivity.this); + if(last != null){ + bundle.putDouble(SearchPOIActivity.SEARCH_LAT, last.getLatitude()); + bundle.putDouble(SearchPOIActivity.SEARCH_LON, last.getLongitude()); + } + + } + newIntent.putExtras(bundle); + startActivityForResult(newIntent, 0); + } + }); + b.show(); } diff --git a/OsmAnd/src/com/osmand/views/AnimateDraggingMapThread.java b/OsmAnd/src/com/osmand/views/AnimateDraggingMapThread.java index 677bde7871..1189c3acef 100644 --- a/OsmAnd/src/com/osmand/views/AnimateDraggingMapThread.java +++ b/OsmAnd/src/com/osmand/views/AnimateDraggingMapThread.java @@ -62,9 +62,13 @@ public class AnimateDraggingMapThread implements Runnable { */ public void stopDraggingSync(){ // wait until current thread != null - // TODO implement better method for waintg stopped = true; - while(currentThread != null){} + while(currentThread != null){ + try { + currentThread.join(); + } catch (InterruptedException e) { + } + } } public void startDragging(float dTime, float startX, float startY, float endX, float endY){ diff --git a/OsmAnd/src/com/osmand/views/OsmandMapTileView.java b/OsmAnd/src/com/osmand/views/OsmandMapTileView.java index 8229918ab2..5e3cbfc511 100644 --- a/OsmAnd/src/com/osmand/views/OsmandMapTileView.java +++ b/OsmAnd/src/com/osmand/views/OsmandMapTileView.java @@ -103,9 +103,6 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall Paint paintBitmap; - - - public OsmandMapTileView(Context context, AttributeSet attrs) { super(context, attrs); initView(); @@ -163,7 +160,6 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall @Override public void surfaceDestroyed(SurfaceHolder holder) { - // TODO clear cache ? } public void addLayer(OsmandMapLayer layer, OsmandMapLayer afterIt){