Compare commits

...

4 commits

Author SHA1 Message Date
androiddevkotlin
d9437f89df For redo 2021-04-13 14:13:50 +03:00
androiddevkotlin
d61718cdfc Search, go to nearest point with map centered 2021-04-11 23:23:45 +03:00
androiddevkotlin
63e1ffbf1d First two item done 2021-04-08 16:59:34 +03:00
androiddevkotlin
62313cc468 POI-Panel: Allow to search for other POIs of the same category 2021-04-08 12:42:01 +03:00
5 changed files with 61 additions and 38 deletions

View file

@ -12,6 +12,7 @@
--> -->
<string name="search_more">Search more…</string>
<string name="map_quick_action_pattern">%1$s → …</string> <string name="map_quick_action_pattern">%1$s → …</string>
<string name="output">Output</string> <string name="output">Output</string>
<string name="user_points">User points</string> <string name="user_points">User points</string>

View file

@ -98,9 +98,13 @@ public class MenuBuilder {
private static final int PICK_IMAGE = 1231; private static final int PICK_IMAGE = 1231;
public static final float SHADOW_HEIGHT_TOP_DP = 17f; public static final float SHADOW_HEIGHT_TOP_DP = 17f;
public static final int TITLE_LIMIT = 60; public static final int TITLE_LIMIT = 60;
protected static final String[] arrowChars = new String[] {"=>", " - "}; protected static final String[] arrowChars = new String[]{"=>", " - "};
protected final String NEAREST_WIKI_KEY = "nearest_wiki_key"; protected final String NEAREST_WIKI_KEY = "nearest_wiki_key";
protected final String NEAREST_POI_KEY = "nearest_poi_key"; protected final String NEAREST_POI_KEY = "nearest_poi_key";
private static final int POI_COUNT = 10;
private static final int MINIMUM_RADIUS = 100;
private static final int MAXIMUM_RADIUS = 1000;
private static final int FACTOR = 2;
protected MapActivity mapActivity; protected MapActivity mapActivity;
protected MapContextMenu mapContextMenu; protected MapContextMenu mapContextMenu;
@ -1222,32 +1226,35 @@ public class MenuBuilder {
for (final Amenity poi : nearestAmenities) { for (final Amenity poi : nearestAmenities) {
TextViewEx button = buildButtonInCollapsableView(context, false, false); TextViewEx button = buildButtonInCollapsableView(context, false, false);
String name = poi.getName(preferredMapAppLang, transliterateNames); final PointDescription pointDescription = mapActivity.getMapLayers().getPoiMapLayer().getObjectName(poi);
String name = pointDescription.getName();
if (Algorithms.isBlank(name)) { if (Algorithms.isBlank(name)) {
name = AmenityMenuController.getTypeStr(poi); name = AmenityMenuController.getTypeStr(poi);
} }
float dist = (float) MapUtils.getDistance(latLon, poi.getLocation()); float dist = (float) MapUtils.getDistance(latLon, poi.getLocation());
name += " (" + OsmAndFormatter.getFormattedDistance(dist, app) + ")"; name += " (" + OsmAndFormatter.getFormattedDistance(dist, app) + ")";
button.setText(name); button.setText(name);
button.setOnClickListener(new View.OnClickListener() { button.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
LatLon latLon = new LatLon(poi.getLocation().getLatitude(), poi.getLocation().getLongitude()); 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().show(latLon, pointDescription, poi);
mapActivity.setMapLocation(poi.getLocation().getLatitude(), poi.getLocation().getLongitude());
} }
}); });
view.addView(button); view.addView(button);
} }
PoiUIFilter filter = getPoiFilterForType(nearestPoiType); PoiUIFilter filter = getPoiFilterForType(nearestPoiType);
if (filter != null) { if (filter != null && nearestAmenities.size() == POI_COUNT) {
view.addView(createShowAllButton(context, filter)); view.addView(createShowOnMap(context, filter));
} }
view.addView(createSearchMoreButton(context, filter));
return new CollapsableView(view, this, collapsed); return new CollapsableView(view, this, collapsed);
} }
private View createShowAllButton(Context context, final PoiUIFilter filter) { private View createShowOnMap(Context context, final PoiUIFilter filter) {
TextViewEx buttonShowAll = buildButtonInCollapsableView(context, false, false); TextViewEx buttonShowAll = buildButtonInCollapsableView(context, false, false);
buttonShowAll.setText(app.getString(R.string.shared_string_show_on_map)); buttonShowAll.setText(app.getString(R.string.shared_string_show_on_map));
buttonShowAll.setOnClickListener(new View.OnClickListener() { buttonShowAll.setOnClickListener(new View.OnClickListener() {
@ -1288,6 +1295,18 @@ public class MenuBuilder {
return buttonShowAll; 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) { protected LinearLayout buildCollapsableContentView(Context context, boolean collapsed, boolean needMargin) {
final LinearLayout view = new LinearLayout(context); final LinearLayout view = new LinearLayout(context);
view.setOrientation(LinearLayout.VERTICAL); view.setOrientation(LinearLayout.VERTICAL);
@ -1381,9 +1400,14 @@ public class MenuBuilder {
} }
private List<Amenity> getSortedAmenities(PoiUIFilter filter, final LatLon latLon) { private List<Amenity> getSortedAmenities(PoiUIFilter filter, final LatLon latLon) {
QuadRect rect = MapUtils.calculateLatLonBbox(latLon.getLatitude(), latLon.getLongitude(), 250); QuadRect rect = MapUtils.calculateLatLonBbox(latLon.getLatitude(), latLon.getLongitude(), MINIMUM_RADIUS);
List<Amenity> nearestAmenities = getAmenities(rect, filter); List<Amenity> nearestAmenities = getAmenities(rect, filter);
for (int radius = MINIMUM_RADIUS; nearestAmenities.size() - 1 <= POI_COUNT && radius <= MAXIMUM_RADIUS; radius *= FACTOR) {
rect = MapUtils.calculateLatLonBbox(latLon.getLatitude(), latLon.getLongitude(), radius);
nearestAmenities = getAmenities(rect, filter);
}
nearestAmenities.remove(amenity); nearestAmenities.remove(amenity);
Collections.sort(nearestAmenities, new Comparator<Amenity>() { Collections.sort(nearestAmenities, new Comparator<Amenity>() {
@ -1396,7 +1420,7 @@ public class MenuBuilder {
} }
}); });
return nearestAmenities; return nearestAmenities.subList(0, Math.min(POI_COUNT, nearestAmenities.size()));
} }
private List<Amenity> getAmenities(QuadRect rect, PoiUIFilter filter) { private List<Amenity> getAmenities(QuadRect rect, PoiUIFilter filter) {

View file

@ -28,6 +28,7 @@ import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.Version; import net.osmand.plus.Version;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.search.SearchActivity;
import net.osmand.plus.helpers.enums.MetricsConstants; import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.mapcontextmenu.CollapsableView; import net.osmand.plus.mapcontextmenu.CollapsableView;
import net.osmand.plus.mapcontextmenu.MenuBuilder; import net.osmand.plus.mapcontextmenu.MenuBuilder;
@ -68,7 +69,7 @@ public class AmenityMenuBuilder extends MenuBuilder {
private static final String WIKI_LINK = ".wikipedia.org/w"; private static final String WIKI_LINK = ".wikipedia.org/w";
public final static Log LOG = PlatformUtil.getLog(AmenityMenuBuilder.class); public final static Log LOG = PlatformUtil.getLog(AmenityMenuBuilder.class);
private final static DecimalFormat DF = new DecimalFormat("#.##"); private final static DecimalFormat DF = new DecimalFormat("#.##");
private MetricsConstants metricSystem; private final MetricsConstants metricSystem;
private final Amenity amenity; private final Amenity amenity;
@ -661,7 +662,7 @@ public class AmenityMenuBuilder extends MenuBuilder {
buildAmenityRow(view, wikiInfo); buildAmenityRow(view, wikiInfo);
} }
if (processNearestPoi() && nearestPoi.size() > 0) { if (processNearestPoi()) {
AmenityInfoRow poiInfo = new AmenityInfoRow( AmenityInfoRow poiInfo = new AmenityInfoRow(
NEAREST_POI_KEY, AmenityMenuController.getRightIconId(amenity), null, NEAREST_POI_KEY, AmenityMenuController.getRightIconId(amenity), null,
app.getString(R.string.speak_poi) + " \"" + AmenityMenuController.getTypeStr(amenity) + "\" (" + nearestPoi.size() + ")", app.getString(R.string.speak_poi) + " \"" + AmenityMenuController.getTypeStr(amenity) + "\" (" + nearestPoi.size() + ")",
@ -725,7 +726,7 @@ public class AmenityMenuBuilder extends MenuBuilder {
} }
break; break;
case "distance": case "distance":
if(Algorithms.isFloat(value)) { if (Algorithms.isFloat(value)) {
float valueAsFloatInMeters = Float.parseFloat(value) * 1000; float valueAsFloatInMeters = Float.parseFloat(value) * 1000;
if (metricSystem == MetricsConstants.KILOMETERS_AND_METERS) { if (metricSystem == MetricsConstants.KILOMETERS_AND_METERS) {
formattedValue = formattedValue =
@ -740,20 +741,20 @@ public class AmenityMenuBuilder extends MenuBuilder {
} }
case "capacity": case "capacity":
if (amenity.getSubType().equals("water_tower") || amenity.getSubType().equals("storage_tank")) { 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); formattedValue = value + " " + mapActivity.getResources().getString(R.string.cubic_m);
} }
} }
break; break;
case "maxweight": case "maxweight":
if(Algorithms.isInt(value)) { if (Algorithms.isInt(value)) {
formattedValue = value + " " + mapActivity.getResources().getString(R.string.metric_ton); formattedValue = value + " " + mapActivity.getResources().getString(R.string.metric_ton);
} }
break; break;
case "students": case "students":
case "spots": case "spots":
case "seats": case "seats":
if(Algorithms.isInt(value)) { if (Algorithms.isInt(value)) {
formattedPrefix = formatPrefix(prefix, mapActivity.getResources().getString(R.string.shared_string_capacity)); formattedPrefix = formatPrefix(prefix, mapActivity.getResources().getString(R.string.shared_string_capacity));
} }
break; break;
@ -764,7 +765,7 @@ public class AmenityMenuBuilder extends MenuBuilder {
} }
private String formatPrefix(String prefix, String units) { 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) { public void buildAmenityRow(View view, AmenityInfoRow info) {

View file

@ -313,7 +313,7 @@ public class PoiUIFilter implements SearchPoiTypeFilter, Comparable<PoiUIFilter>
public List<Amenity> searchAmenities(double top, double left, double bottom, double right, int zoom, public List<Amenity> searchAmenities(double top, double left, double bottom, double right, int zoom,
ResultMatcher<Amenity> matcher) { ResultMatcher<Amenity> matcher) {
List<Amenity> results = new ArrayList<Amenity>(); List<Amenity> results = new ArrayList<>();
List<Amenity> tempResults = currentSearchResult; List<Amenity> tempResults = currentSearchResult;
if (tempResults != null) { if (tempResults != null) {
for (Amenity a : tempResults) { for (Amenity a : tempResults) {

View file

@ -604,9 +604,6 @@ public class QuickSearchListAdapter extends ArrayAdapter<QuickSearchListItem> {
selectedItems.clear(); selectedItems.clear();
} }
notifyDataSetChanged(); notifyDataSetChanged();
if (selectionListener != null) {
selectionListener.onUpdateSelectionMode(selectedItems);
}
} else { } else {
QuickSearchListItem listItem = getItem(position); QuickSearchListItem listItem = getItem(position);
if (ch.isChecked()) { if (ch.isChecked()) {
@ -614,11 +611,11 @@ public class QuickSearchListAdapter extends ArrayAdapter<QuickSearchListItem> {
} else { } else {
selectedItems.remove(listItem); selectedItems.remove(listItem);
} }
}
if (selectionListener != null) { if (selectionListener != null) {
selectionListener.onUpdateSelectionMode(selectedItems); selectionListener.onUpdateSelectionMode(selectedItems);
} }
} }
}
private void updateCompassVisibility(View view, QuickSearchListItem listItem) { private void updateCompassVisibility(View view, QuickSearchListItem listItem) {
View compassView = view.findViewById(R.id.compass_layout); View compassView = view.findViewById(R.id.compass_layout);