From 62313cc468ab5d5e5d11ae463e0582a7d63479ee Mon Sep 17 00:00:00 2001 From: androiddevkotlin <64539346+androiddevkotlin@users.noreply.github.com> Date: Thu, 8 Apr 2021 12:42:01 +0300 Subject: [PATCH] POI-Panel: Allow to search for other POIs of the same category --- OsmAnd/res/values/strings.xml | 1 + .../plus/mapcontextmenu/MenuBuilder.java | 42 ++++++++++++++----- .../builders/AmenityMenuBuilder.java | 25 +++++------ .../plus/search/QuickSearchListAdapter.java | 9 ++-- 4 files changed, 49 insertions(+), 28 deletions(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 97cfcf3a42..f879e571de 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -12,6 +12,7 @@ --> + Search more… %1$s → … Output User points diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java index 6c55242e35..c83a5d9069 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java @@ -1217,33 +1217,40 @@ public class MenuBuilder { return new CollapsableView(textView, this, collapsed); } - protected CollapsableView getCollapsableView(Context context, boolean collapsed, List nearestAmenities, String nearestPoiType) { - LinearLayout view = buildCollapsableContentView(context, collapsed, true); + protected CollapsableView getCollapsableView(final Context context, boolean collapsed, List nearestAmenities, String nearestPoiType) { + final LinearLayout view = buildCollapsableContentView(context, collapsed, true); for (final Amenity poi : nearestAmenities) { TextViewEx button = buildButtonInCollapsableView(context, false, false); - String name = poi.getName(preferredMapAppLang, transliterateNames); + final PointDescription pointDescription = mapActivity.getMapLayers().getPoiMapLayer().getObjectName(poi); + String name = mapActivity.getMapLayers().getPoiMapLayer().getObjectName(poi).getName(); if (Algorithms.isBlank(name)) { name = AmenityMenuController.getTypeStr(poi); } float dist = (float) MapUtils.getDistance(latLon, poi.getLocation()); name += " (" + OsmAndFormatter.getFormattedDistance(dist, app) + ")"; button.setText(name); - button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LatLon latLon = new LatLon(poi.getLocation().getLatitude(), poi.getLocation().getLongitude()); - PointDescription pointDescription = mapActivity.getMapLayers().getPoiMapLayer().getObjectName(poi); mapActivity.getContextMenu().show(latLon, pointDescription, poi); + mapActivity.getContextMenu().update(latLon, pointDescription, poi); + mapActivity.setMapLocation(poi.getLocation().getLatitude(), poi.getLocation().getLongitude()); } }); view.addView(button); + } + PoiUIFilter filter = getPoiFilterForType(nearestPoiType); - if (filter != null) { + boolean isPoiFilter = nearestPoiType.equals(NEAREST_POI_KEY); + if (filter != null && nearestPoi.size() > 0) { view.addView(createShowAllButton(context, filter)); } + if (isPoiFilter && nearestPoi.size() == 0) { + view.addView(createSearchMoreButton(context, filter)); + } return new CollapsableView(view, this, collapsed); } @@ -1288,6 +1295,18 @@ public class MenuBuilder { return buttonShowAll; } + private View createSearchMoreButton(Context context, final PoiUIFilter filter) { + TextViewEx buttonShowAll = buildButtonInCollapsableView(context, false, false); + buttonShowAll.setText(app.getString(R.string.search_more)); + buttonShowAll.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mapActivity.showQuickSearch(filter); + } + }); + return buttonShowAll; + } + protected LinearLayout buildCollapsableContentView(Context context, boolean collapsed, boolean needMargin) { final LinearLayout view = new LinearLayout(context); view.setOrientation(LinearLayout.VERTICAL); @@ -1381,8 +1400,8 @@ public class MenuBuilder { } private List getSortedAmenities(PoiUIFilter filter, final LatLon latLon) { - QuadRect rect = MapUtils.calculateLatLonBbox(latLon.getLatitude(), latLon.getLongitude(), 250); - + boolean isWikiFilter = filter.getFilterId().equals("std_osmwiki"); + QuadRect rect = MapUtils.calculateLatLonBbox(latLon.getLatitude(), latLon.getLongitude(), isWikiFilter ? 250 : 1000); List nearestAmenities = getAmenities(rect, filter); nearestAmenities.remove(amenity); @@ -1395,8 +1414,11 @@ public class MenuBuilder { return Double.compare(d1, d2); } }); - - return nearestAmenities; + if (isWikiFilter) { + return nearestAmenities; + } else { + return nearestAmenities.subList(0, Math.min(10, nearestAmenities.size())); + } } private List getAmenities(QuadRect rect, PoiUIFilter filter) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java index 3907bb69dd..6fbcbb2236 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java @@ -28,6 +28,7 @@ import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.activities.search.SearchActivity; import net.osmand.plus.helpers.enums.MetricsConstants; import net.osmand.plus.mapcontextmenu.CollapsableView; import net.osmand.plus.mapcontextmenu.MenuBuilder; @@ -68,7 +69,7 @@ public class AmenityMenuBuilder extends MenuBuilder { private static final String WIKI_LINK = ".wikipedia.org/w"; public final static Log LOG = PlatformUtil.getLog(AmenityMenuBuilder.class); private final static DecimalFormat DF = new DecimalFormat("#.##"); - private MetricsConstants metricSystem; + private final MetricsConstants metricSystem; private final Amenity amenity; @@ -417,7 +418,7 @@ public class AmenityMenuBuilder extends MenuBuilder { } else if (Amenity.OPENING_HOURS.equals(key)) { iconId = R.drawable.ic_action_time; collapsableView = getCollapsableTextView(view.getContext(), true, - amenity.getAdditionalInfo(key).replace("; ", "\n").replace(",", ", ")); + amenity.getAdditionalInfo(key).replace("; ", "\n").replace(",", ", ")); collapsable = true; OpeningHoursParser.OpeningHours rs = OpeningHoursParser.parseOpenedHours(amenity.getAdditionalInfo(key)); if (rs != null) { @@ -459,7 +460,7 @@ public class AmenityMenuBuilder extends MenuBuilder { vl = sb.toString(); } else if (key.contains(Amenity.ROUTE) || key.equals(Amenity.WIKIDATA) - || key.equals(Amenity.WIKIMEDIA_COMMONS)) { + || key.equals(Amenity.WIKIMEDIA_COMMONS)) { continue; } else { if (key.contains(Amenity.DESCRIPTION)) { @@ -661,7 +662,7 @@ public class AmenityMenuBuilder extends MenuBuilder { buildAmenityRow(view, wikiInfo); } - if (processNearestPoi() && nearestPoi.size() > 0) { + if (processNearestPoi()) { AmenityInfoRow poiInfo = new AmenityInfoRow( NEAREST_POI_KEY, AmenityMenuController.getRightIconId(amenity), null, app.getString(R.string.speak_poi) + " \"" + AmenityMenuController.getTypeStr(amenity) + "\" (" + nearestPoi.size() + ")", @@ -725,35 +726,35 @@ public class AmenityMenuBuilder extends MenuBuilder { } break; case "distance": - if(Algorithms.isFloat(value)) { + if (Algorithms.isFloat(value)) { float valueAsFloatInMeters = Float.parseFloat(value) * 1000; if (metricSystem == MetricsConstants.KILOMETERS_AND_METERS) { formattedValue = - value + " " + mapActivity.getResources().getString(R.string.km); + value + " " + mapActivity.getResources().getString(R.string.km); } else { formattedValue = OsmAndFormatter.getFormattedDistance(valueAsFloatInMeters, - mapActivity.getMyApplication()); + mapActivity.getMyApplication()); } formattedPrefix = formatPrefix(prefix, - mapActivity.getResources().getString(R.string.distance)); + mapActivity.getResources().getString(R.string.distance)); break; } case "capacity": if (amenity.getSubType().equals("water_tower") || amenity.getSubType().equals("storage_tank")) { - if(Algorithms.isFloat(value)) { + if (Algorithms.isFloat(value)) { formattedValue = value + " " + mapActivity.getResources().getString(R.string.cubic_m); } } break; case "maxweight": - if(Algorithms.isInt(value)) { + if (Algorithms.isInt(value)) { formattedValue = value + " " + mapActivity.getResources().getString(R.string.metric_ton); } break; case "students": case "spots": case "seats": - if(Algorithms.isInt(value)) { + if (Algorithms.isInt(value)) { formattedPrefix = formatPrefix(prefix, mapActivity.getResources().getString(R.string.shared_string_capacity)); } break; @@ -764,7 +765,7 @@ public class AmenityMenuBuilder extends MenuBuilder { } private String formatPrefix(String prefix, String units) { - return (!prefix.isEmpty()) ? (prefix + ", " + units): units; + return (!prefix.isEmpty()) ? (prefix + ", " + units) : units; } public void buildAmenityRow(View view, AmenityInfoRow info) { diff --git a/OsmAnd/src/net/osmand/plus/search/QuickSearchListAdapter.java b/OsmAnd/src/net/osmand/plus/search/QuickSearchListAdapter.java index d8a0811601..834ef131b6 100644 --- a/OsmAnd/src/net/osmand/plus/search/QuickSearchListAdapter.java +++ b/OsmAnd/src/net/osmand/plus/search/QuickSearchListAdapter.java @@ -604,9 +604,6 @@ public class QuickSearchListAdapter extends ArrayAdapter { selectedItems.clear(); } notifyDataSetChanged(); - if (selectionListener != null) { - selectionListener.onUpdateSelectionMode(selectedItems); - } } else { QuickSearchListItem listItem = getItem(position); if (ch.isChecked()) { @@ -614,9 +611,9 @@ public class QuickSearchListAdapter extends ArrayAdapter { } else { selectedItems.remove(listItem); } - if (selectionListener != null) { - selectionListener.onUpdateSelectionMode(selectedItems); - } + } + if (selectionListener != null) { + selectionListener.onUpdateSelectionMode(selectedItems); } }