Compare commits
4 commits
master
...
poi_search
Author | SHA1 | Date | |
---|---|---|---|
|
d9437f89df | ||
|
d61718cdfc | ||
|
63e1ffbf1d | ||
|
62313cc468 |
5 changed files with 61 additions and 38 deletions
|
@ -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>
|
||||||
|
|
|
@ -101,6 +101,10 @@ public class MenuBuilder {
|
||||||
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) {
|
||||||
|
|
|
@ -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() + ")",
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue