diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 0d181b56ea..66ee55b6e7 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -38,7 +38,9 @@ import java.io.IOException; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Comparator; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -48,6 +50,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; +import java.util.TreeSet; public class OsmandSettings { @@ -2319,9 +2322,21 @@ public class OsmandSettings { return settingsAPI.edit(globalPreferences).putString(LAST_SEARCHED_INTERSECTED_STREET, street).commit(); } - + // Avoid using this property, probably you need to use PoiFiltersHelper.getSelectedPoiFilters() public final OsmandPreference SELECTED_POI_FILTER_FOR_MAP = new StringPreference("selected_poi_filter_for_map", null).makeGlobal().cache(); + public Set getSelectedPoiFilters() { + Set result = new LinkedHashSet<>(); + String filtersId = SELECTED_POI_FILTER_FOR_MAP.get(); + if (filtersId != null) + Collections.addAll(result, filtersId.split(",")); + return result; + } + + public void setSelectedPoiFilters(final Set poiFilters) { + SELECTED_POI_FILTER_FOR_MAP.set(android.text.TextUtils.join(",", poiFilters)); + } + public static final String VOICE_PROVIDER_NOT_USE = "VOICE_PROVIDER_NOT_USE"; public static final String[] TTS_AVAILABLE_VOICES = new String[]{ diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java index 14432cd5f3..f84f1a87ad 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java @@ -4,6 +4,7 @@ package net.osmand.plus.activities; import android.content.DialogInterface; import android.content.Intent; import android.support.v7.app.AlertDialog; +import android.widget.ArrayAdapter; import android.widget.ListAdapter; import android.widget.Toast; @@ -53,6 +54,7 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map.Entry; +import java.util.Set; /** * Object is responsible to maintain layers using by map activity @@ -257,7 +259,7 @@ public class MapActivityLayers { } - public AlertDialog selectPOIFilterLayer(final OsmandMapTileView mapView, final PoiUIFilter[] selected) { + public AlertDialog selectPOIFilterLayer(final OsmandMapTileView mapView) { OsmandApplication app = getApplication(); final PoiFiltersHelper poiFilters = app.getPoiFilters(); final ContextMenuAdapter adapter = new ContextMenuAdapter(); @@ -274,36 +276,43 @@ public class MapActivityLayers { ListAdapter listAdapter = adapter.createListAdapter(activity, app.getSettings().isLightContent()); builder.setAdapter(listAdapter, new DialogInterface.OnClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - PoiUIFilter pf = list.get(which); - String filterId = pf.getFilterId(); - if (filterId.equals(PoiUIFilter.CUSTOM_FILTER_ID)) { + public void onClick(DialogInterface dialog, int position) { + PoiUIFilter pf = list.get(position); + String filterId = pf.getFilterId(); + if (filterId.equals(PoiUIFilter.CUSTOM_FILTER_ID)) { Intent search = new Intent(activity, SearchActivity.class); search.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); activity.getMyApplication().getSettings().SEARCH_TAB.set(SearchActivity.POI_TAB_INDEX); activity.startActivity(search); - } else { - pf = poiFilters.getFilterById(filterId); - if (pf != null) { - pf.setFilterByName(pf.getSavedFilterByName()); - } - getApplication().getSettings().SELECTED_POI_FILTER_FOR_MAP.set(filterId); - mapView.refreshMap(); - if (selected != null && selected.length > 0) { - selected[0] = pf; - } } } - }); - builder.setNegativeButton(R.string.shared_string_cancel, null); + builder.setTitle(R.string.show_poi_over_map) + .setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + mapView.refreshMap(); + } + }) + .setNegativeButton(R.string.shared_string_cancel, null); return builder.show(); } - private void addFilterToList(final ContextMenuAdapter adapter, final List list, PoiUIFilter f) { + private void addFilterToList(final ContextMenuAdapter adapter, final List list, final PoiUIFilter f) { list.add(f); ContextMenuItem.ItemBuilder builder = new ContextMenuItem.ItemBuilder(); + builder.setListener(new ContextMenuAdapter.ItemClickListener() { + @Override + public boolean onContextMenuClick(ArrayAdapter adapter, int itemId, int position, boolean isChecked) { + if (isChecked) + getApplication().getPoiFilters().addSelectedPoiFilter(f); + else + getApplication().getPoiFilters().removeSelectedPoiFilter(f); + return true; + } + }); builder.setTitle(f.getName()); + builder.setSelected(getApplication().getPoiFilters().isPoiFilterSelected(f)); if (RenderingIcons.containsBigIcon(f.getIconId())) { builder.setIcon(RenderingIcons.getBigIconResourceId(f.getIconId())); } else { diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchPOIActivity.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchPOIActivity.java index 9afe0bd504..cb05dd063c 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchPOIActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchPOIActivity.java @@ -157,7 +157,7 @@ public class SearchPOIActivity extends OsmandListActivity implements OsmAndCompa public boolean onMenuItemClick(MenuItem item) { OsmandSettings settings = app.getSettings(); filter.setFilterByName(searchFilter.getText().toString().trim()); - settings.SELECTED_POI_FILTER_FOR_MAP.set(filter.getFilterId()); + app.getPoiFilters().addSelectedPoiFilter(filter); if (location != null) { settings.setMapLocationToShow(location.getLatitude(), location.getLongitude(), 15); } diff --git a/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java index 3c8105de92..cfe8a66a1a 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java @@ -28,6 +28,7 @@ import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.PluginActivity; import net.osmand.plus.activities.SettingsActivity; import net.osmand.plus.activities.TransportRouteHelper; +import net.osmand.plus.poi.PoiFiltersHelper; import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin; import net.osmand.plus.render.RendererRegistry; @@ -125,17 +126,18 @@ public class ConfigureMapMenu { @Override public boolean onContextMenuClick(final ArrayAdapter adapter, int itemId, final int pos, boolean isChecked) { final OsmandSettings settings = ma.getMyApplication().getSettings(); + final PoiFiltersHelper pfh = ma.getMyApplication().getPoiFilters(); final ContextMenuItem item = cm.getItem(pos); if (item.getSelected() != null) { item.setColorRes(isChecked ? R.color.osmand_orange : ContextMenuItem.INVALID_ID); adapter.notifyDataSetChanged(); } if (itemId == R.string.layer_poi) { - settings.SELECTED_POI_FILTER_FOR_MAP.set(null); + pfh.clearSelectedPoiFilters(); if (isChecked) { selectPOILayer(adapter, adapter.getItem(pos)); } else { - adapter.getItem(pos).setDescription(POIMapLayer.getSelectedPoiName(ma.getMyApplication())); + adapter.getItem(pos).setDescription(pfh.getSelectedPoiFiltersName()); } } else if (itemId == R.string.layer_amenity_label) { settings.SHOW_POI_LABEL.set(isChecked); @@ -184,17 +186,15 @@ public class ConfigureMapMenu { protected void selectPOILayer(final ArrayAdapter adapter, final ContextMenuItem item) { - final PoiUIFilter[] selected = new PoiUIFilter[1]; - AlertDialog dlg = ma.getMapLayers().selectPOIFilterLayer(ma.getMapView(), selected); + AlertDialog dlg = ma.getMapLayers().selectPOIFilterLayer(ma.getMapView()); dlg.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { - OsmandApplication myApplication = ma.getMyApplication(); - boolean selected = myApplication.getSettings() - .SELECTED_POI_FILTER_FOR_MAP.get() != null; + PoiFiltersHelper pf = ma.getMyApplication().getPoiFilters(); + boolean selected = pf.isShowingAnyPoi(); item.setSelected(selected); - item.setDescription(POIMapLayer.getSelectedPoiName(myApplication)); + item.setDescription(pf.getSelectedPoiFiltersName()); item.setColorRes(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID); adapter.notifyDataSetChanged(); } @@ -217,11 +217,11 @@ public class ConfigureMapMenu { .setColor(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID) .setIcon(R.drawable.ic_action_fav_dark) .setListener(l).createItem()); - selected = settings.SELECTED_POI_FILTER_FOR_MAP.get() != null; + selected = app.getPoiFilters().isShowingAnyPoi(); adapter.addItem(new ContextMenuItem.ItemBuilder() .setTitleId(R.string.layer_poi, activity) - .setSelected(settings.SELECTED_POI_FILTER_FOR_MAP.get() != null) - .setDescription(POIMapLayer.getSelectedPoiName(app)) + .setSelected(selected) + .setDescription(app.getPoiFilters().getSelectedPoiFiltersName()) .setColor(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID) .setIcon(R.drawable.ic_action_info_dark) .setSecondaryIcon(R.drawable.ic_action_additional_option) diff --git a/OsmAnd/src/net/osmand/plus/helpers/WaypointDialogHelper.java b/OsmAnd/src/net/osmand/plus/helpers/WaypointDialogHelper.java index ff8e02ae41..a5ba65a7bf 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/WaypointDialogHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/WaypointDialogHelper.java @@ -603,8 +603,7 @@ public class WaypointDialogHelper { if (type == WaypointHelper.POI) { v = ctx.getLayoutInflater().inflate(R.layout.drawer_list_radius_ex, null); AndroidUtils.setTextPrimaryColor(mapActivity, (TextView) v.findViewById(R.id.titleEx), nightMode); - String descEx = waypointHelper.getPoiFilter() == null ? ctx.getString(R.string.poi) : waypointHelper - .getPoiFilter().getName(); + String descEx = app.getPoiFilters().isShowingAnyPoi() ? ctx.getString(R.string.poi) : app.getPoiFilters().getSelectedPoiFiltersName(); ((TextView) v.findViewById(R.id.title)).setText(ctx.getString(R.string.search_radius_proximity) + ":"); ((TextView) v.findViewById(R.id.titleEx)).setText(ctx.getString(R.string.shared_string_type) + ":"); final TextView radiusEx = (TextView) v.findViewById(R.id.descriptionEx); @@ -615,8 +614,7 @@ public class WaypointDialogHelper { running[0] = position; thisAdapter.notifyDataSetInvalidated(); MapActivity map = (MapActivity) ctx; - final PoiUIFilter[] selected = new PoiUIFilter[1]; - AlertDialog dlg = map.getMapLayers().selectPOIFilterLayer(map.getMapView(), selected); + AlertDialog dlg = map.getMapLayers().selectPOIFilterLayer(map.getMapView()); dlg.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { @@ -688,15 +686,14 @@ public class WaypointDialogHelper { private void selectPoi(final int[] running, final ArrayAdapter listAdapter, final int type, final boolean enable, Activity ctx) { if (ctx instanceof MapActivity && - !PoiUIFilter.CUSTOM_FILTER_ID.equals(app.getSettings().SELECTED_POI_FILTER_FOR_MAP.get())) { + !app.getPoiFilters().isPoiFilterSelected(PoiUIFilter.CUSTOM_FILTER_ID)) { MapActivity map = (MapActivity) ctx; - final PoiUIFilter[] selected = new PoiUIFilter[1]; - AlertDialog dlg = map.getMapLayers().selectPOIFilterLayer(map.getMapView(), selected); + AlertDialog dlg = map.getMapLayers().selectPOIFilterLayer(map.getMapView()); dlg.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { - if (selected != null) { + if (app.getPoiFilters().isShowingAnyPoi()) { enableType(running, listAdapter, type, enable); } } diff --git a/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java b/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java index 84edd2ee4f..d846f9c6ce 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java @@ -8,6 +8,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.EnumSet; import java.util.List; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import net.osmand.FloatMath; @@ -538,10 +539,11 @@ public class WaypointHelper { protected void calculatePoi(RouteCalculationResult route, List locationPoints) { - PoiUIFilter pf = getPoiFilter(); - if (pf != null) { + if (app.getPoiFilters().isShowingAnyPoi()) { final List locs = route.getImmutableAllLocations(); - List amenities = pf.searchAmenitiesOnThePath(locs, poiSearchDeviationRadius); + List amenities = new ArrayList<>(); + for (PoiUIFilter pf : app.getPoiFilters().getSelectedPoiFilters()) + amenities.addAll(pf.searchAmenitiesOnThePath(locs, poiSearchDeviationRadius)); for (Amenity a : amenities) { AmenityRoutePoint rp = a.getRoutePoint(); int i = locs.indexOf(rp.pointA); @@ -607,8 +609,8 @@ public class WaypointHelper { /// - public PoiUIFilter getPoiFilter() { - return app.getPoiFilters().getFilterById(app.getSettings().SELECTED_POI_FILTER_FOR_MAP.get()); + public Set getPoiFilters() { + return app.getPoiFilters().getSelectedPoiFilters(); } public boolean showPOI() { diff --git a/OsmAnd/src/net/osmand/plus/poi/PoiFiltersHelper.java b/OsmAnd/src/net/osmand/plus/poi/PoiFiltersHelper.java index 1c9c9e210e..d5ae19ef53 100644 --- a/OsmAnd/src/net/osmand/plus/poi/PoiFiltersHelper.java +++ b/OsmAnd/src/net/osmand/plus/poi/PoiFiltersHelper.java @@ -1,30 +1,33 @@ package net.osmand.plus.poi; - -import java.text.Collator; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; - -import net.osmand.access.AccessibilityPlugin; import net.osmand.osm.AbstractPoiType; import net.osmand.osm.MapPoiTypes; import net.osmand.osm.PoiCategory; import net.osmand.osm.PoiFilter; import net.osmand.osm.PoiType; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; import net.osmand.plus.api.SQLiteAPI.SQLiteConnection; import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; import net.osmand.plus.api.SQLiteAPI.SQLiteStatement; import net.osmand.util.Algorithms; +import android.support.annotation.NonNull; +import android.util.ArraySet; + +import java.text.Collator; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + public class PoiFiltersHelper { private final OsmandApplication application; @@ -36,6 +39,7 @@ public class PoiFiltersHelper { private PoiUIFilter showAllPOIFilter; private PoiUIFilter localWikiPoiFilter; private List cacheTopStandardFilters; + private Set selectedPoiFilters = new TreeSet<>(); private static final String UDF_CAR_AID = "car_aid"; private static final String UDF_FOR_TOURISTS = "for_tourists"; @@ -80,10 +84,8 @@ public class PoiFiltersHelper { return searchByNamePOIFilter; } - - public PoiUIFilter getCustomPOIFilter() { - if(customPOIFilter == null){ + if (customPOIFilter == null){ PoiUIFilter filter = new PoiUIFilter(application.getString(R.string.poi_filter_custom_filter), PoiUIFilter.CUSTOM_FILTER_ID, new LinkedHashMap>(), application); //$NON-NLS-1$ filter.setStandardFilter(true); @@ -93,7 +95,7 @@ public class PoiFiltersHelper { } public PoiUIFilter getLocalWikiPOIFilter() { - if(localWikiPoiFilter == null){ + if (localWikiPoiFilter == null){ PoiType place = application.getPoiTypes().getPoiTypeByKey("wiki_place"); if (place != null && !Algorithms.isEmpty(application.getLanguage())) { PoiUIFilter filter = new PoiUIFilter(place, application, " " + @@ -107,7 +109,7 @@ public class PoiFiltersHelper { } public PoiUIFilter getShowAllPOIFilter() { - if(showAllPOIFilter == null){ + if (showAllPOIFilter == null){ PoiUIFilter filter = new PoiUIFilter(null, application, ""); //$NON-NLS-1$ filter.setStandardFilter(true); showAllPOIFilter = filter; @@ -117,7 +119,7 @@ public class PoiFiltersHelper { private PoiUIFilter getFilterById(String filterId, PoiUIFilter... filters){ - for(PoiUIFilter pf : filters) { + for (PoiUIFilter pf : filters) { if(pf.getFilterId().equals(filterId)){ return pf; } @@ -162,7 +164,14 @@ public class PoiFiltersHelper { } return null; } - + + public List getFiltersById(String filtersId) { + List result = new ArrayList(); + for (String filterId : filtersId.split(",")) + result.add(getFilterById(filterId)); + return result; + } + public void reloadAllPoiFilters() { showAllPOIFilter = null; @@ -206,7 +215,8 @@ public class PoiFiltersHelper { // default MapPoiTypes poiTypes = application.getPoiTypes(); for (PoiFilter t : poiTypes.getTopVisibleFilters()) { - top.add(new PoiUIFilter(t, application, "")); + PoiUIFilter f = new PoiUIFilter(t, application, ""); + top.add(f); } sortListOfFilters(top); cacheTopStandardFilters = top; @@ -282,8 +292,54 @@ public class PoiFiltersHelper { } return false; } - - + + @NonNull + public Set getSelectedPoiFilters() { return selectedPoiFilters; } + + public void addSelectedPoiFilter(PoiUIFilter filter) { + selectedPoiFilters.add(filter); + } + + public void addSelectedPoiFilter(String filterId) { + selectedPoiFilters.add(getFilterById(filterId)); + } + + public void removeSelectedPoiFilter(PoiUIFilter filter) { + selectedPoiFilters.remove(filter); + } + + public boolean isShowingAnyPoi() { return !selectedPoiFilters.isEmpty(); } + + public void clearSelectedPoiFilters() { selectedPoiFilters.clear(); } + + public String getSelectedPoiFiltersName() { + if (!isShowingAnyPoi()) { + return application.getResources().getString(R.string.shared_string_none); + } + List names = new ArrayList(); + for (PoiUIFilter filter : selectedPoiFilters) + names.add(filter.getName()); + return android.text.TextUtils.join(", ", names); + } + + public boolean isPoiFilterSelected(PoiUIFilter filter) { + return selectedPoiFilters.contains(filter); + } + + public boolean isPoiFilterSelected(String filterId) { + for (PoiUIFilter filter: selectedPoiFilters) + if (filter.filterId.equals(filterId)) + return true; + return false; + } + + private void saveCurrentSelections() { + Set filters = new HashSet<>(); + for (PoiUIFilter f: selectedPoiFilters) + filters.add(f.filterId); + application.getSettings().setSelectedPoiFilters(filters); + } + public class PoiFilterDbHelper { public static final String DATABASE_NAME = "poi_filters"; //$NON-NLS-1$ diff --git a/OsmAnd/src/net/osmand/plus/poi/PoiUIFilter.java b/OsmAnd/src/net/osmand/plus/poi/PoiUIFilter.java index 6589577497..c34456f606 100644 --- a/OsmAnd/src/net/osmand/plus/poi/PoiUIFilter.java +++ b/OsmAnd/src/net/osmand/plus/poi/PoiUIFilter.java @@ -33,8 +33,9 @@ import net.osmand.util.MapUtils; import net.osmand.util.OpeningHoursParser; import net.osmand.util.OpeningHoursParser.OpeningHours; import android.content.Context; +import android.support.annotation.NonNull; -public class PoiUIFilter implements SearchPoiTypeFilter { +public class PoiUIFilter implements SearchPoiTypeFilter, Comparable { public final static String STD_PREFIX = "std_"; //$NON-NLS-1$ public final static String USER_PREFIX = "user_"; //$NON-NLS-1$ @@ -61,7 +62,7 @@ public class PoiUIFilter implements SearchPoiTypeFilter { protected String filterByName = null; protected String savedFilterByName = null; protected List currentSearchResult = null; - + // constructor for standard filters public PoiUIFilter(AbstractPoiType type, OsmandApplication application, String idSuffix) { this.app = application; @@ -97,12 +98,12 @@ public class PoiUIFilter implements SearchPoiTypeFilter { this.app = app; isStandardFilter = false; poiTypes = app.getPoiTypes(); - if(filterId == null){ + if (filterId == null) { filterId = USER_PREFIX + name.replace(' ', '_').toLowerCase(); } this.filterId = filterId; this.name = name; - if(acceptedTypes == null){ + if (acceptedTypes == null) { initSearchAll(); } else { this.acceptedTypes.putAll(acceptedTypes); @@ -123,7 +124,7 @@ public class PoiUIFilter implements SearchPoiTypeFilter { public void updateFilterResults() { List prev = currentSearchResult; - if(prev != null) { + if (prev != null) { AmenityNameFilter nameFilter = getNameFilter(filterByName); List newResults = new ArrayList(); for(Amenity a : prev) { @@ -151,7 +152,7 @@ public class PoiUIFilter implements SearchPoiTypeFilter { public List searchAgain(double lat, double lon) { List amenityList ; - if(currentSearchResult != null) { + if (currentSearchResult != null) { amenityList = currentSearchResult; } else { amenityList = searchAmenities(lat, lon, null); @@ -162,7 +163,7 @@ public class PoiUIFilter implements SearchPoiTypeFilter { public List searchFurther(double latitude, double longitude, ResultMatcher matcher){ - if(distanceInd < distanceToSearchValues.length - 1){ + if (distanceInd < distanceToSearchValues.length - 1) { distanceInd ++; } List amenityList = searchAmenities( latitude, longitude, matcher); @@ -450,8 +451,7 @@ public class PoiUIFilter implements SearchPoiTypeFilter { } return false; } - - + public void updateTypesToAccept(AbstractPoiType pt) { pt.putTypes(acceptedTypes); if (pt instanceof PoiType && ((PoiType) pt).isAdditional() && ((PoiType) pt).getParentType() != null) { @@ -466,7 +466,7 @@ public class PoiUIFilter implements SearchPoiTypeFilter { poiAdditionals.put(add.getKeyName().replace('_', ':').replace(' ', ':'), add); poiAdditionals.put(add.getTranslation().replace(' ', ':').toLowerCase(), add); } - if(pt instanceof PoiFilter && !(pt instanceof PoiCategory)) { + if (pt instanceof PoiFilter && !(pt instanceof PoiCategory)) { for(PoiType ps : ((PoiFilter) pt).getPoiTypes()) { fillPoiAdditionals(ps); } @@ -508,7 +508,7 @@ public class PoiUIFilter implements SearchPoiTypeFilter { } public void setTypeToAccept(PoiCategory poiCategory, boolean b) { - if(b) { + if (b) { acceptedTypes.put(poiCategory, null); } else { acceptedTypes.remove(poiCategory); @@ -525,9 +525,9 @@ public class PoiUIFilter implements SearchPoiTypeFilter { } public String getIconId(){ - if(filterId.startsWith(STD_PREFIX)) { + if (filterId.startsWith(STD_PREFIX)) { return standardIconId; - } else if(filterId.startsWith(USER_PREFIX)) { + } else if (filterId.startsWith(USER_PREFIX)) { return filterId.substring(USER_PREFIX.length()).toLowerCase(); } return filterId; @@ -547,17 +547,17 @@ public class PoiUIFilter implements SearchPoiTypeFilter { @Override public boolean accept(PoiCategory type, String subtype) { - if(type == null) { + if (type == null) { return true; } - if(!poiTypes.isRegisteredType(type)) { + if (!poiTypes.isRegisteredType(type)) { type = poiTypes.getOtherPoiCategory(); } - if(!acceptedTypes.containsKey(type)){ + if (!acceptedTypes.containsKey(type)){ return false; } LinkedHashSet set = acceptedTypes.get(type); - if(set == null){ + if (set == null){ return true; } return set.contains(subtype); @@ -568,7 +568,14 @@ public class PoiUIFilter implements SearchPoiTypeFilter { return acceptedTypes.isEmpty(); } - + @Override + public int compareTo(@NonNull PoiUIFilter another) { + if (another.filterId.equals(this.filterId)) + return 0; + else + return this.name.compareTo(another.name); + } + public interface AmenityNameFilter { public boolean accept(Amenity a) ; diff --git a/OsmAnd/src/net/osmand/plus/views/POIMapLayer.java b/OsmAnd/src/net/osmand/plus/views/POIMapLayer.java index 47ea75b2a0..02036a3f68 100644 --- a/OsmAnd/src/net/osmand/plus/views/POIMapLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/POIMapLayer.java @@ -83,24 +83,20 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon private OsmandMapTileView view; private final static int MAXIMUM_SHOW_AMENITIES = 5; - private ResourceManager resourceManager; private RoutingHelper routingHelper; - private PoiUIFilter filter; + private Set filters = new TreeSet<>(); private MapTextLayer mapTextLayer; /// cache for displayed POI // Work with cache (for map copied from AmenityIndexRepositoryOdb) private MapLayerData> data; - private OsmandSettings settings; - private OsmandApplication app; public POIMapLayer(final MapActivity activity) { routingHelper = activity.getRoutingHelper(); routingHelper.addListener(this); - settings = activity.getMyApplication().getSettings(); app = activity.getMyApplication(); data = new OsmandMapLayer.MapLayerData>() { { @@ -120,24 +116,26 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon @Override protected List calculateResult(RotatedTileBox tileBox) { QuadRect latLonBounds = tileBox.getLatLonBounds(); - if (filter == null || latLonBounds == null) { + if (filters.isEmpty() || latLonBounds == null) { return new ArrayList<>(); } int z = (int) Math.floor(tileBox.getZoom() + Math.log(view.getSettings().MAP_DENSITY.get()) / Math.log(2)); - List res = filter.searchAmenities(latLonBounds.top, latLonBounds.left, - latLonBounds.bottom, latLonBounds.right, z, new ResultMatcher() { + List res = new ArrayList<>(); + for (PoiUIFilter filter : filters) + res.addAll(filter.searchAmenities(latLonBounds.top, latLonBounds.left, + latLonBounds.bottom, latLonBounds.right, z, new ResultMatcher() { - @Override - public boolean publish(Amenity object) { - return true; - } + @Override + public boolean publish(Amenity object) { + return true; + } - @Override - public boolean isCancelled() { - return isInterrupted(); - } - }); + @Override + public boolean isCancelled() { + return isInterrupted(); + } + })); Collections.sort(res, new Comparator() { @Override @@ -197,7 +195,6 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon poiBackground = BitmapFactory.decodeResource(view.getResources(), R.drawable.map_white_orange_poi_shield); poiBackgroundSmall = BitmapFactory.decodeResource(view.getResources(), R.drawable.map_white_orange_poi_shield_small); - resourceManager = view.getApplication().getResourceManager(); mapTextLayer = view.getLayerByClass(MapTextLayer.class); } @@ -221,14 +218,9 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { - if (!Algorithms.objectEquals(this.settings.SELECTED_POI_FILTER_FOR_MAP.get(), - filter == null ? null : filter.getFilterId())) { - if (this.settings.SELECTED_POI_FILTER_FOR_MAP.get() == null) { - this.filter = null; - } else { - PoiFiltersHelper pfh = app.getPoiFilters(); - this.filter = pfh.getFilterById(this.settings.SELECTED_POI_FILTER_FOR_MAP.get()); - } + Set selectedPoiFilters = app.getPoiFilters().getSelectedPoiFilters(); + if (!this.filters.equals(selectedPoiFilters)) { + this.filters = new TreeSet<>(selectedPoiFilters); data.clearCache(); } @@ -236,7 +228,7 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon List fullObjects = new ArrayList<>(); List fullObjectsLatLon = new ArrayList<>(); List smallObjectsLatLon = new ArrayList<>(); - if (filter != null) { + if (!filters.isEmpty()) { if (tileBox.getZoom() >= startZoom) { data.queryNewData(tileBox); objects = data.getResults(); @@ -315,16 +307,6 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon showText(ctx, app, text, title); } - public static String getSelectedPoiName(OsmandApplication app) { - PoiFiltersHelper pfh = app.getPoiFilters(); - String filterId = app.getSettings().SELECTED_POI_FILTER_FOR_MAP.get(); - if (filterId == null) { - return app.getResources().getString(R.string.shared_string_none); - } - PoiUIFilter filter = pfh.getFilterById(filterId); - return filter.getName(); - } - static int getResIdFromAttribute(final Context ctx, final int attr) { if (attr == 0) return 0; @@ -491,7 +473,6 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon } - @Override public String getObjectDescription(Object o) { if (o instanceof Amenity) {