package net.osmand.plus.poi; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import net.osmand.ResultMatcher; import net.osmand.data.Amenity; import net.osmand.osm.PoiCategory; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; public class SearchByNameFilter extends PoiUIFilter { public static final String FILTER_ID = PoiUIFilter.BY_NAME_FILTER_ID; //$NON-NLS-1$ public SearchByNameFilter(OsmandApplication application) { super(application); this.name = application.getString(R.string.poi_filter_by_name); this.filterId = FILTER_ID; this.distanceToSearchValues = new double[] {100, 1000, 20000}; } @Override public boolean isAutomaticallyIncreaseSearch() { return false; } @Override protected List<Amenity> searchAmenitiesInternal(double lat, double lon, double topLatitude, double bottomLatitude, double leftLongitude, double rightLongitude, int zoom, final ResultMatcher<Amenity> matcher) { currentSearchResult = new ArrayList<Amenity>(); final int limit = distanceInd == 0 ? 500 : -1; List<Amenity> result = Collections.emptyList(); if (!Algorithms.isBlank(getFilterByName())) { result = app.getResourceManager().searchAmenitiesByName(getFilterByName(), topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, new ResultMatcher<Amenity>() { boolean elimit = false; @Override public boolean publish(Amenity object) { if (limit != -1 && currentSearchResult.size() > limit) { elimit = true; } if (matcher.publish(object)) { // Causes concurrent modification exception (below) // currentSearchResult.add(object); return true; } return false; } @Override public boolean isCancelled() { return matcher.isCancelled() || elimit; } }); MapUtils.sortListOfMapObject(result, lat, lon); } currentSearchResult = result; return currentSearchResult; } }