fixing some issues with filter

git-svn-id: https://osmand.googlecode.com/svn/trunk@156 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
Victor Shcherb 2010-06-12 12:27:50 +00:00
parent 748dd85321
commit 3096a83555
13 changed files with 197 additions and 110 deletions

View file

@ -27,12 +27,12 @@ public class ToDoConstants {
// 31. Translation. // 31. Translation.
// 32. Introduce POI predefined filters (car filter(other-fuel, transportation-car_wash, show-car) and others) // 32. Introduce POI predefined filters (car filter(other-fuel, transportation-car_wash, show-car) and others)
// ( 1) predefined filters, 2) choose subtype's, 3) filter by name, 4) opening hours (filter)) // ( 1) predefined filters, 2) choose subtype's, 3) filter by name, 4) opening hours (filter))
// [TODO database support]
// 41. POI layer over map (shows poi by selected filter) // 41. POI layer over map (shows poi by selected filter) [TODO]
// 8. Enable change POI directly on map (requires OSM login) // 8. Enable change POI directly on map (requires OSM login)
// 33. Build transport locations. Create transport index (transport-stops) (investigate) // 33. Build transport locations. Create transport index (transport-stops) (investigate) [TODO]
// 39. Support old-versionned resources (1) odb indexes, 2) favourites table, 3) atomic settings (?)) // 39. Support old-versionned resources (1) odb indexes, 2) favourites table, 3) atomic settings (?)) [TODO]
// 38. Add button in search "navigate to".
// 42. Revise UI (icons/layouts). Support different devices. Add inactive/focus(!) icon versions. // 42. Revise UI (icons/layouts). Support different devices. Add inactive/focus(!) icon versions.
// 36. Postcode search // 36. Postcode search
@ -47,7 +47,6 @@ public class ToDoConstants {
// 20. Implement save track/route to gpx (?) // 20. Implement save track/route to gpx (?)
// BUGS Android // BUGS Android
// 5. Improvement : Implement caching files existing on FS, implement specific method in RM // 5. Improvement : Implement caching files existing on FS, implement specific method in RM
// Introducing cache of file names that are on disk (creating new File() consumes a lot of memory) // Introducing cache of file names that are on disk (creating new File() consumes a lot of memory)
@ -64,6 +63,7 @@ public class ToDoConstants {
// DONE ANDROID : // DONE ANDROID :
// 38. Add button in search "navigate to"
// 16. Support open street bugs api (supports viewing, deleting). // 16. Support open street bugs api (supports viewing, deleting).
// 13. Save point as favorite & introduce favorite points dialog // 13. Save point as favorite & introduce favorite points dialog
// 29. Show opened/closed amenities (in search poi). // 29. Show opened/closed amenities (in search poi).

View file

@ -52,6 +52,8 @@
<TableRow android:id="@+id/TableRow" android:layout_marginLeft = "5dp" > <TableRow android:id="@+id/TableRow" android:layout_marginLeft = "5dp" >
<LinearLayout android:id="@+id/LinearLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" <LinearLayout android:id="@+id/LinearLayout" android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_span="3" android:gravity="right|bottom" android:layout_marginRight = "5dp" android:layout_marginTop = "10dp"> android:layout_span="3" android:gravity="right|bottom" android:layout_marginRight = "5dp" android:layout_marginTop = "10dp">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/NavigateTo" android:text="@string/navigate_to">
</Button>
<Button android:text="Show on map" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ShowOnMap"> <Button android:text="Show on map" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ShowOnMap">
</Button> </Button>

View file

@ -3,9 +3,11 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent" android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent"> android:layout_height="fill_parent">
<Button android:layout_gravity="right" android:text="@string/search_POI_level_btn" android:id="@+id/SearchPOILevelButton" android:layout_height="wrap_content" android:layout_width="fill_parent"></Button> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
<Button android:text="@string/search_POI_level_btn" android:id="@+id/SearchPOILevelButton" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_weight="1"></Button>
<TextView android:layout_width="wrap_content" android:text="" android:id="@+id/SearchAreaText" android:layout_height="wrap_content"/>
</LinearLayout>
<ListView android:id="@android:id/list" android:layout_width="fill_parent" <ListView android:id="@android:id/list" android:layout_width="fill_parent"
android:layout_height="fill_parent"></ListView> android:layout_height="fill_parent"></ListView>
</LinearLayout> </LinearLayout>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="navigate_to">Navigate to</string>
<string name="update_tile">Update map</string> <string name="update_tile">Update map</string>
<string name="reload_tile">Reload tile</string> <string name="reload_tile">Reload tile</string>
<string name="user_name_descr">Input user name to communicate osm</string> <string name="user_name_descr">Input user name to communicate osm</string>

View file

@ -34,6 +34,7 @@ public class AmenityIndexRepository {
private double cBottomLatitude; private double cBottomLatitude;
private double cLeftLongitude; private double cLeftLongitude;
private double cRightLongitude; private double cRightLongitude;
private int cZoom;
private String cFilterId; private String cFilterId;
@ -86,15 +87,16 @@ public class AmenityIndexRepository {
cRightLongitude = 0; cRightLongitude = 0;
cLeftLongitude = 0; cLeftLongitude = 0;
cFilterId = null; cFilterId = null;
cZoom = 0;
} }
public void evaluateCachedAmenities(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, int limit, PoiFilter filter, List<Amenity> toFill){ public void evaluateCachedAmenities(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, int zoom, int limit, PoiFilter filter, List<Amenity> toFill){
cachedAmenities.clear();
cTopLatitude = topLatitude + (topLatitude -bottomLatitude); cTopLatitude = topLatitude + (topLatitude -bottomLatitude);
cBottomLatitude = bottomLatitude - (topLatitude -bottomLatitude); cBottomLatitude = bottomLatitude - (topLatitude -bottomLatitude);
cLeftLongitude = leftLongitude - (rightLongitude - leftLongitude); cLeftLongitude = leftLongitude - (rightLongitude - leftLongitude);
cRightLongitude = rightLongitude + (rightLongitude - leftLongitude); cRightLongitude = rightLongitude + (rightLongitude - leftLongitude);
cFilterId = filter == null? null :filter.getFilterId(); cFilterId = filter == null? null :filter.getFilterId();
cZoom = zoom;
// first of all put all entities in temp list in order to not freeze other read threads // first of all put all entities in temp list in order to not freeze other read threads
ArrayList<Amenity> tempList = new ArrayList<Amenity>(); ArrayList<Amenity> tempList = new ArrayList<Amenity>();
searchAmenities(cTopLatitude, cLeftLongitude, cBottomLatitude, cRightLongitude, limit, filter, tempList); searchAmenities(cTopLatitude, cLeftLongitude, cBottomLatitude, cRightLongitude, limit, filter, tempList);
@ -103,15 +105,15 @@ public class AmenityIndexRepository {
cachedAmenities.addAll(tempList); cachedAmenities.addAll(tempList);
} }
checkCachedAmenities(topLatitude, leftLongitude, bottomLatitude, rightLongitude, filter.getFilterId(), toFill); checkCachedAmenities(topLatitude, leftLongitude, bottomLatitude, rightLongitude, cZoom, filter.getFilterId(), toFill);
} }
public synchronized boolean checkCachedAmenities(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, String filterId, List<Amenity> toFill, boolean fillFound){ public synchronized boolean checkCachedAmenities(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, int zoom, String filterId, List<Amenity> toFill, boolean fillFound){
if (db == null) { if (db == null) {
return true; return true;
} }
boolean inside = cTopLatitude >= topLatitude && cLeftLongitude <= leftLongitude && cRightLongitude >= rightLongitude boolean inside = cTopLatitude >= topLatitude && cLeftLongitude <= leftLongitude && cRightLongitude >= rightLongitude
&& cBottomLatitude <= bottomLatitude; && cBottomLatitude <= bottomLatitude && zoom == cZoom;
if((inside || fillFound) && toFill != null && Algoritms.objectEquals(filterId, cFilterId)){ if((inside || fillFound) && toFill != null && Algoritms.objectEquals(filterId, cFilterId)){
for(Amenity a : cachedAmenities){ for(Amenity a : cachedAmenities){
LatLon location = a.getLocation(); LatLon location = a.getLocation();
@ -123,8 +125,8 @@ public class AmenityIndexRepository {
} }
return inside; return inside;
} }
public boolean checkCachedAmenities(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, String filterId, List<Amenity> toFill){ public boolean checkCachedAmenities(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, int zoom, String filterId, List<Amenity> toFill){
return checkCachedAmenities(topLatitude, leftLongitude, bottomLatitude, rightLongitude, filterId, toFill, false); return checkCachedAmenities(topLatitude, leftLongitude, bottomLatitude, rightLongitude, zoom, filterId, toFill, false);
} }
public void initialize(final IProgress progress, File file) { public void initialize(final IProgress progress, File file) {

View file

@ -22,7 +22,7 @@ public class PoiFilter {
private String name; private String name;
private final boolean isStandardFilter; private final boolean isStandardFilter;
private final static int finalZoom = 8; private final static int finalZoom = 6;
private final static int initialZoom = 13; private final static int initialZoom = 13;
private final static int maxCount = 200; private final static int maxCount = 200;
private int zoom = initialZoom; private int zoom = initialZoom;
@ -67,8 +67,8 @@ public class PoiFilter {
} }
public String getSearchArea(){ public String getSearchArea(){
if(zoom <= 15){ if(zoom <= 14){
int d = (int) (1.5 * (1 << (zoom - 15))); int d = (int) (1 * (1 << (14 - zoom)));
return " < " + d + " km"; return " < " + d + " km";
} else { } else {
return " < 500 m"; return " < 500 m";
@ -78,7 +78,7 @@ public class PoiFilter {
public List<Amenity> initializeNewSearch(double lat, double lon, int firstTimeLimit){ public List<Amenity> initializeNewSearch(double lat, double lon, int firstTimeLimit){
zoom = initialZoom; zoom = initialZoom;
if(areAllTypesAccepted()){ if(areAllTypesAccepted()){
zoom += 2; zoom += 1;
} }
List<Amenity> amenityList = ResourceManager.getResourceManager().searchAmenities(this, lat, lon, zoom, maxCount); List<Amenity> amenityList = ResourceManager.getResourceManager().searchAmenities(this, lat, lon, zoom, maxCount);
MapUtils.sortListOfMapObject(amenityList, lat, lon); MapUtils.sortListOfMapObject(amenityList, lat, lon);

View file

@ -42,15 +42,55 @@ public class PoiFiltersHelper {
list.add("car_wash"); list.add("car_wash");
list.add("car_repair"); list.add("car_repair");
types.put(AmenityType.TRANSPORTATION, list); types.put(AmenityType.TRANSPORTATION, list);
list = new ArrayList<String>(); list = new ArrayList<String>();
list.add("car"); list.add("car");
list.add("car_repair");
types.put(AmenityType.SHOP, list); types.put(AmenityType.SHOP, list);
filters.add(new PoiFilter("Car aid", null, types)); filters.add(new PoiFilter("Car aid", null, types));
types.clear(); types.clear();
types.put(AmenityType.HISTORIC, null);
types.put(AmenityType.TOURISM, null);
list = new ArrayList<String>();
list.add("internet_access");
list.add("bench");
list.add("embassy");
list.add("emergency_phone");
list.add("marketplace");
list.add("post_office");
list.add("recycling");
list.add("telephone");
list.add("toilets");
list.add("waste_basket");
list.add("waste_disposal");
types.put(AmenityType.OTHER, list);
filters.add(new PoiFilter("For tourists", null, types));
types.clear();
list = new ArrayList<String>();
list.add("fuel");
types.put(AmenityType.TRANSPORTATION, list);
filters.add(new PoiFilter("Fuel", null, types));
types.clear();
list = new ArrayList<String>();
list.add("alcohol");
list.add("bakery");
list.add("beverages");
list.add("butcher");
list.add("convenience");
list.add("department_store");
list.add("convenience");
list.add("farm");
list.add("general");
list.add("ice_cream");
list.add("kiosk");
list.add("supermarket");
list.add("variety_store");
types.put(AmenityType.SHOP, list);
filters.add(new PoiFilter("Food shop", null, types));
types.clear();
return filters; return filters;
} }

View file

@ -207,16 +207,16 @@ public class ResourceManager {
// //////////////////////////////////////////// Working with amenities //////////////////////////////////////////////// // //////////////////////////////////////////// Working with amenities ////////////////////////////////////////////////
public List<Amenity> searchAmenities(PoiFilter filter, double latitude, double longitude, int zoom, int limit) { public List<Amenity> searchAmenities(PoiFilter filter, double latitude, double longitude, int zoom, int limit) {
double tileNumberX = Math.floor(MapUtils.getTileNumberX(zoom, longitude)); double tileNumberX = MapUtils.getTileNumberX(zoom, longitude);
double tileNumberY = Math.floor(MapUtils.getTileNumberY(zoom, latitude)); double tileNumberY = MapUtils.getTileNumberY(zoom, latitude);
double topLatitude = MapUtils.getLatitudeFromTile(zoom, tileNumberY); double topLatitude = MapUtils.getLatitudeFromTile(zoom, tileNumberY - 0.5);
double bottomLatitude = MapUtils.getLatitudeFromTile(zoom, tileNumberY + 1); double bottomLatitude = MapUtils.getLatitudeFromTile(zoom, tileNumberY + 0.5);
double leftLongitude = MapUtils.getLongitudeFromTile(zoom, tileNumberX); double leftLongitude = MapUtils.getLongitudeFromTile(zoom, tileNumberX - 0.5);
double rightLongitude = MapUtils.getLongitudeFromTile(zoom, tileNumberX + 1); double rightLongitude = MapUtils.getLongitudeFromTile(zoom, tileNumberX + 0.5);
List<Amenity> amenities = new ArrayList<Amenity>(); List<Amenity> amenities = new ArrayList<Amenity>();
for (AmenityIndexRepository index : amenityRepositories) { for (AmenityIndexRepository index : amenityRepositories) {
if (index.checkContains(topLatitude, leftLongitude, bottomLatitude, rightLongitude)) { if (index.checkContains(topLatitude, leftLongitude, bottomLatitude, rightLongitude)) {
if (!index.checkCachedAmenities(topLatitude, leftLongitude, bottomLatitude, rightLongitude, filter.getFilterId(), amenities)) { if (!index.checkCachedAmenities(topLatitude, leftLongitude, bottomLatitude, rightLongitude, zoom, filter.getFilterId(), amenities)) {
index.searchAmenities(topLatitude, leftLongitude, bottomLatitude, rightLongitude, limit, filter, amenities); index.searchAmenities(topLatitude, leftLongitude, bottomLatitude, rightLongitude, limit, filter, amenities);
} }
} }
@ -225,13 +225,13 @@ public class ResourceManager {
return amenities; return amenities;
} }
public void searchAmenitiesAsync(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, PoiFilter filter, List<Amenity> toFill){ public void searchAmenitiesAsync(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, int zoom, PoiFilter filter, List<Amenity> toFill){
String filterId = filter == null ? null : filter.getFilterId(); String filterId = filter == null ? null : filter.getFilterId();
for(AmenityIndexRepository index : amenityRepositories){ for(AmenityIndexRepository index : amenityRepositories){
if(index.checkContains(topLatitude, leftLongitude, bottomLatitude, rightLongitude)){ if(index.checkContains(topLatitude, leftLongitude, bottomLatitude, rightLongitude)){
if(!index.checkCachedAmenities(topLatitude, leftLongitude, bottomLatitude, rightLongitude, filterId, toFill, true)){ if(!index.checkCachedAmenities(topLatitude, leftLongitude, bottomLatitude, rightLongitude, zoom, filterId, toFill, true)){
asyncLoadingTiles.requestToLoadAmenities( asyncLoadingTiles.requestToLoadAmenities(
new AmenityLoadRequest(index, topLatitude, leftLongitude, bottomLatitude, rightLongitude, filter)); new AmenityLoadRequest(index, topLatitude, leftLongitude, bottomLatitude, rightLongitude, zoom, filter));
} }
} }
} }
@ -318,15 +318,17 @@ public class ResourceManager {
public final double leftLongitude; public final double leftLongitude;
public final double rightLongitude; public final double rightLongitude;
public final PoiFilter filter; public final PoiFilter filter;
public final int zoom;
public AmenityLoadRequest(AmenityIndexRepository repository, double topLatitude, double leftLongitude, public AmenityLoadRequest(AmenityIndexRepository repository, double topLatitude, double leftLongitude,
double bottomLatitude, double rightLongitude, PoiFilter filter) { double bottomLatitude, double rightLongitude, int zoom, PoiFilter filter) {
super(); super();
this.bottomLatitude = bottomLatitude; this.bottomLatitude = bottomLatitude;
this.leftLongitude = leftLongitude; this.leftLongitude = leftLongitude;
this.repository = repository; this.repository = repository;
this.rightLongitude = rightLongitude; this.rightLongitude = rightLongitude;
this.topLatitude = topLatitude; this.topLatitude = topLatitude;
this.zoom = zoom;
this.filter = filter; this.filter = filter;
} }
@ -359,7 +361,7 @@ public class ResourceManager {
if(!amenityLoaded){ if(!amenityLoaded){
AmenityLoadRequest r = (AmenityLoadRequest) req; AmenityLoadRequest r = (AmenityLoadRequest) req;
r.repository.evaluateCachedAmenities(r.topLatitude, r.leftLongitude, r.repository.evaluateCachedAmenities(r.topLatitude, r.leftLongitude,
r.bottomLatitude, r.rightLongitude, POIMapLayer.LIMIT_POI, r.filter, null); r.bottomLatitude, r.rightLongitude, r.zoom, POIMapLayer.LIMIT_POI, r.filter, null);
amenityLoaded = true; amenityLoaded = true;
} }
} }

View file

@ -12,7 +12,6 @@ import android.app.AlertDialog.Builder;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor; import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteOpenHelper;
@ -42,8 +41,10 @@ import com.osmand.osm.MapUtils;
*/ */
public class FavouritesActivity extends ListActivity { public class FavouritesActivity extends ListActivity {
public static final int DELETE_ITEM = 0; public static final int NAVIGATE_TO = 0;
public static final int EDIT_ITEM = 1; public static final int DELETE_ITEM = 1;
public static final int EDIT_ITEM = 2;
private List<FavouritePoint> favouritesList; private List<FavouritePoint> favouritesList;
private FavouritesDbHelper helper; private FavouritesDbHelper helper;
@ -67,28 +68,31 @@ public class FavouritesActivity extends ListActivity {
@Override @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
menu.setHeaderTitle("Context menu"); menu.setHeaderTitle("Context menu");
menu.add(0, EDIT_ITEM, 0, "Edit favourite"); menu.add(0, NAVIGATE_TO, 0, "Navigate to");
menu.add(0, DELETE_ITEM, 1, "Delete favourite"); menu.add(0, EDIT_ITEM, 1, "Edit favourite");
menu.add(0, DELETE_ITEM, 2, "Delete favourite");
} }
}); });
} }
public void onListItemClick(ListView parent, View v, int position, long id) { public void onListItemClick(ListView parent, View v, int position, long id) {
SharedPreferences prefs = getSharedPreferences(OsmandSettings.SHARED_PREFERENCES_NAME, MODE_WORLD_READABLE); FavouritePoint point = favouritesList.get(position);
if (prefs != null) { OsmandSettings.setMapLocationToShow(this, point.getLatitude(), point.getLongitude());
FavouritePoint point = favouritesList.get(position); Intent newIntent = new Intent(FavouritesActivity.this, MapActivity.class);
OsmandSettings.setMapLocationToShow(this, point.getLatitude(), point.getLongitude()); startActivity(newIntent);
Intent newIntent = new Intent(FavouritesActivity.this, MapActivity.class);
startActivity(newIntent);
}
} }
@Override @Override
public boolean onContextItemSelected(MenuItem aItem) { public boolean onContextItemSelected(MenuItem aItem) {
AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) aItem.getMenuInfo(); AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) aItem.getMenuInfo();
final FavouritePoint point = (FavouritePoint) favouritesList.get(menuInfo.position); final FavouritePoint point = (FavouritePoint) favouritesList.get(menuInfo.position);
if(aItem.getItemId() == EDIT_ITEM){ if(aItem.getItemId() == NAVIGATE_TO){
OsmandSettings.setMapLocationToShow(this, point.getLatitude(), point.getLongitude());
OsmandSettings.setPointToNavigate(this, point.getLatitude(), point.getLongitude());
Intent newIntent = new Intent(FavouritesActivity.this, MapActivity.class);
startActivity(newIntent);
} else if(aItem.getItemId() == EDIT_ITEM){
Builder builder = new AlertDialog.Builder(this); Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Input new name of favourite point"); builder.setTitle("Input new name of favourite point");
final EditText editText = new EditText(this); final EditText editText = new EditText(this);

View file

@ -50,7 +50,7 @@ public class NavigatePointActivity extends Activity {
setContentView(R.layout.navigate_point); setContentView(R.layout.navigate_point);
setTitle("Navigate to point"); setTitle("Navigate to point");
initUI(loc.getLatitude(), loc.getLongitude()); initUI(loc.getLatitude(), loc.getLongitude());
((Button) findViewById(R.id.Cancel)).setVisibility(View.INVISIBLE); ((Button) findViewById(R.id.Cancel)).setText(getString(R.string.navigate_to));
} }
@Override @Override
@ -101,31 +101,42 @@ public class NavigatePointActivity extends Activity {
((Button) findViewById(R.id.Cancel)).setOnClickListener(new View.OnClickListener() { ((Button) findViewById(R.id.Cancel)).setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
close(); if(dlg == null){
showOnMap(true);
} else {
close();
}
} }
}); });
((Button) findViewById(R.id.ShowOnMap)).setOnClickListener(new View.OnClickListener() { ((Button) findViewById(R.id.ShowOnMap)).setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
try { showOnMap(false);
// TODO there is a bug in that 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(NavigatePointActivity.this, lat, lon);
}
close();
} catch (RuntimeException e) {
((TextView) findViewById(R.id.ValidateTextView)).setText("Locations are invalid");
Log.w(LogUtil.TAG, "Convertion failed", e);
}
} }
}); });
} }
public void showOnMap(boolean navigate){
try {
// 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);
}
if(navigate){
OsmandSettings.setPointToNavigate(this, lat, lon);
}
close();
} catch (RuntimeException e) {
((TextView) findViewById(R.id.ValidateTextView)).setText("Locations are invalid");
Log.w(LogUtil.TAG, "Convertion failed", e);
}
}
// THIS code is copied from Location.convert() in order to change locale // THIS code is copied from Location.convert() in order to change locale
public static final int FORMAT_DEGREES = 0; public static final int FORMAT_DEGREES = 0;

View file

@ -31,6 +31,7 @@ public class SearchAddressActivity extends Activity {
private Button cityButton; private Button cityButton;
private Button countryButton; private Button countryButton;
private Button buildingButton; private Button buildingButton;
private Button navigateTo;
private RegionAddressRepository region = null; private RegionAddressRepository region = null;
private City city = null; private City city = null;
@ -38,6 +39,7 @@ public class SearchAddressActivity extends Activity {
private Building building = null; private Building building = null;
private Street street2 = null; private Street street2 = null;
private boolean radioBuilding = true; private boolean radioBuilding = true;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -46,6 +48,7 @@ public class SearchAddressActivity extends Activity {
setContentView(R.layout.search_address); setContentView(R.layout.search_address);
showOnMap = (Button) findViewById(R.id.ShowOnMap); showOnMap = (Button) findViewById(R.id.ShowOnMap);
navigateTo = (Button) findViewById(R.id.NavigateTo);
streetButton = (Button) findViewById(R.id.StreetButton); streetButton = (Button) findViewById(R.id.StreetButton);
cityButton = (Button) findViewById(R.id.CityButton); cityButton = (Button) findViewById(R.id.CityButton);
countryButton = (Button) findViewById(R.id.CountryButton); countryButton = (Button) findViewById(R.id.CountryButton);
@ -84,47 +87,16 @@ public class SearchAddressActivity extends Activity {
} }
} }
}); });
navigateTo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showOnMap(true);
}
});
showOnMap.setOnClickListener(new View.OnClickListener() { showOnMap.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
LatLon l = null; showOnMap(false);
int zoom = 12;
if (street2 != null && street != null) {
region.preloadWayNodes(street2);
region.preloadWayNodes(street);
Node inters = null;
for(Way w : street2.getWayNodes()){
for(Way w2 : street.getWayNodes()){
for(Node n : w.getNodes()){
for(Node n2 : w2.getNodes()){
if(n.getId() == n2.getId()){
inters = n;
break;
}
}
}
}
}
if(inters != null){
l = inters.getLatLon();
zoom = 16;
}
} else if (building != null) {
l = building.getLocation();
zoom = 16;
} else if (street != null) {
l = street.getLocation();
zoom = 14;
} else if (city != null) {
l = city.getLocation();
zoom = 12;
}
if (l != null) {
OsmandSettings.setMapLocationToShow(SearchAddressActivity.this, l.getLatitude(), l.getLongitude());
OsmandSettings.setLastKnownMapZoom(SearchAddressActivity.this, zoom);
startActivity(new Intent(SearchAddressActivity.this, MapActivity.class));
}
} }
}); });
findViewById(R.id.ResetBuilding).setOnClickListener(new View.OnClickListener(){ findViewById(R.id.ResetBuilding).setOnClickListener(new View.OnClickListener(){
@ -180,6 +152,50 @@ public class SearchAddressActivity extends Activity {
}); });
} }
public void showOnMap(boolean navigateTo){
LatLon l = null;
int zoom = 12;
if (street2 != null && street != null) {
region.preloadWayNodes(street2);
region.preloadWayNodes(street);
Node inters = null;
for(Way w : street2.getWayNodes()){
for(Way w2 : street.getWayNodes()){
for(Node n : w.getNodes()){
for(Node n2 : w2.getNodes()){
if(n.getId() == n2.getId()){
inters = n;
break;
}
}
}
}
}
if(inters != null){
l = inters.getLatLon();
zoom = 16;
}
} else if (building != null) {
l = building.getLocation();
zoom = 16;
} else if (street != null) {
l = street.getLocation();
zoom = 14;
} else if (city != null) {
l = city.getLocation();
zoom = 12;
}
if (l != null) {
if(navigateTo){
OsmandSettings.setPointToNavigate(SearchAddressActivity.this, l.getLatitude(), l.getLongitude());
}
OsmandSettings.setMapLocationToShow(SearchAddressActivity.this, l.getLatitude(), l.getLongitude());
OsmandSettings.setLastKnownMapZoom(SearchAddressActivity.this, zoom);
startActivity(new Intent(SearchAddressActivity.this, MapActivity.class));
}
}
protected void updateBuildingSection(){ protected void updateBuildingSection(){
if(radioBuilding){ if(radioBuilding){
((TextView)findViewById(R.id.BuildingText)).setText("Building"); ((TextView)findViewById(R.id.BuildingText)).setText("Building");

View file

@ -36,23 +36,26 @@ import com.osmand.osm.MapUtils;
*/ */
public class SearchPOIActivity extends ListActivity { public class SearchPOIActivity extends ListActivity {
public static final String AMENITY_FILTER = "amenity_filter"; public static final String AMENITY_FILTER = "com.osmand.amenity_filter";
private Button searchPOILevel; private Button searchPOILevel;
private PoiFilter filter; private PoiFilter filter;
private AmenityAdapter amenityAdapter; private AmenityAdapter amenityAdapter;
private LatLon lastKnownMapLocation; private LatLon lastKnownMapLocation;
private TextView searchArea;
@Override @Override
public void onCreate(Bundle icicle) { public void onCreate(Bundle icicle) {
super.onCreate(icicle); super.onCreate(icicle);
setContentView(R.layout.searchpoi); setContentView(R.layout.searchpoi);
searchPOILevel = (Button) findViewById(R.id.SearchPOILevelButton); searchPOILevel = (Button) findViewById(R.id.SearchPOILevelButton);
searchArea = (TextView) findViewById(R.id.SearchAreaText);
searchPOILevel.setOnClickListener(new OnClickListener() { searchPOILevel.setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
amenityAdapter.setNewModel(filter.searchFurther(lastKnownMapLocation.getLatitude(), lastKnownMapLocation.getLongitude())); amenityAdapter.setNewModel(filter.searchFurther(lastKnownMapLocation.getLatitude(), lastKnownMapLocation.getLongitude()));
searchArea.setText(filter.getSearchArea());
searchPOILevel.setEnabled(filter.isSearchFurtherAvailable()); searchPOILevel.setEnabled(filter.isSearchFurtherAvailable());
} }
@ -60,13 +63,15 @@ public class SearchPOIActivity extends ListActivity {
Bundle bundle = this.getIntent().getExtras(); Bundle bundle = this.getIntent().getExtras();
String filterId = bundle.getString(AMENITY_FILTER); String filterId = bundle.getString(AMENITY_FILTER);
if (filterId != null) { lastKnownMapLocation = OsmandSettings.getLastKnownMapLocation(this);
lastKnownMapLocation = OsmandSettings.getLastKnownMapLocation(this); filter = PoiFiltersHelper.getFilterById(this, filterId);
filter = PoiFiltersHelper.getFilterById(this, filterId); if (filter != null) {
amenityAdapter = new AmenityAdapter(filter.initializeNewSearch(lastKnownMapLocation.getLatitude(), amenityAdapter = new AmenityAdapter(filter.initializeNewSearch(lastKnownMapLocation.getLatitude(), lastKnownMapLocation
lastKnownMapLocation.getLongitude(), 40)); .getLongitude(), 40));
setListAdapter(amenityAdapter); setListAdapter(amenityAdapter);
searchArea.setText(filter.getSearchArea());
} }
// ListActivity has a ListView, which you can get with: // ListActivity has a ListView, which you can get with:
ListView lv = getListView(); ListView lv = getListView();
@ -74,7 +79,7 @@ public class SearchPOIActivity extends ListActivity {
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override @Override
public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) { public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) {
Amenity amenity = ((AmenityAdapter)getListAdapter()).getItem(pos); Amenity amenity = ((AmenityAdapter) getListAdapter()).getItem(pos);
String format = amenity.getSimpleFormat(OsmandSettings.usingEnglishNames(v.getContext())); String format = amenity.getSimpleFormat(OsmandSettings.usingEnglishNames(v.getContext()));
if (amenity.getOpeningHours() != null) { if (amenity.getOpeningHours() != null) {
format += "\nOpening hours : " + amenity.getOpeningHours(); format += "\nOpening hours : " + amenity.getOpeningHours();
@ -85,6 +90,8 @@ public class SearchPOIActivity extends ListActivity {
}); });
} }
public void onListItemClick(ListView parent, View v, int position, long id) { public void onListItemClick(ListView parent, View v, int position, long id) {
SharedPreferences prefs = getSharedPreferences(OsmandSettings.SHARED_PREFERENCES_NAME, MODE_WORLD_READABLE); SharedPreferences prefs = getSharedPreferences(OsmandSettings.SHARED_PREFERENCES_NAME, MODE_WORLD_READABLE);
if (prefs != null) { if (prefs != null) {

View file

@ -20,7 +20,7 @@ import com.osmand.osm.MapUtils;
public class POIMapLayer implements OsmandMapLayer { public class POIMapLayer implements OsmandMapLayer {
// it is very slow to use with 15 level // it is very slow to use with 15 level
private static final int startZoom = 10; private static final int startZoom = 10;
public static final int LIMIT_POI = 100; public static final int LIMIT_POI = 200;
private Paint pointAltUI; private Paint pointAltUI;
@ -117,7 +117,7 @@ public class POIMapLayer implements OsmandMapLayer {
double rightLongitude = MapUtils.getLongitudeFromTile(view.getZoom(), tileRect.right); double rightLongitude = MapUtils.getLongitudeFromTile(view.getZoom(), tileRect.right);
objects.clear(); objects.clear();
resourceManager.searchAmenitiesAsync(topLatitude, leftLongitude, bottomLatitude, rightLongitude, filter, objects); resourceManager.searchAmenitiesAsync(topLatitude, leftLongitude, bottomLatitude, rightLongitude, view.getZoom(), filter, objects);
for (Amenity o : objects) { for (Amenity o : objects) {
int x = view.getMapXForPoint(o.getLocation().getLongitude()); int x = view.getMapXForPoint(o.getLocation().getLongitude());
int y = view.getMapYForPoint(o.getLocation().getLatitude()); int y = view.getMapYForPoint(o.getLocation().getLatitude());