Merge branch 'r3.7'
This commit is contained in:
commit
ef773378d2
10 changed files with 206 additions and 98 deletions
|
@ -25,6 +25,26 @@ public class PoiFilter extends AbstractPoiType {
|
||||||
return map.get(kn);
|
return map.get(kn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void addExtraPoiTypes(Map<String, PoiType> poiTypesToAdd) {
|
||||||
|
List<PoiType> npoiTypes = null;
|
||||||
|
Map<String, PoiType> nmap = null;
|
||||||
|
for (PoiType poiType : poiTypesToAdd.values()) {
|
||||||
|
if (!map.containsKey(poiType.getKeyName())) {
|
||||||
|
if (npoiTypes == null) {
|
||||||
|
npoiTypes = new ArrayList<PoiType>(this.poiTypes);
|
||||||
|
nmap = new LinkedHashMap<>(map);
|
||||||
|
}
|
||||||
|
npoiTypes.add(poiType);
|
||||||
|
nmap.put(poiType.getKeyName(), poiType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (npoiTypes != null) {
|
||||||
|
poiTypes = npoiTypes;
|
||||||
|
map = nmap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void addPoiType(PoiType type) {
|
public void addPoiType(PoiType type) {
|
||||||
if (!map.containsKey(type.getKeyName())) {
|
if (!map.containsKey(type.getKeyName())) {
|
||||||
poiTypes.add(type);
|
poiTypes.add(type);
|
||||||
|
@ -70,4 +90,5 @@ public class PoiFilter extends AbstractPoiType {
|
||||||
return poiTypes;
|
return poiTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,8 +26,8 @@ public class PoiType extends AbstractPoiType {
|
||||||
private int order = 90;
|
private int order = 90;
|
||||||
|
|
||||||
|
|
||||||
public PoiType(MapPoiTypes poiTypes, PoiCategory category, PoiFilter filter, String name) {
|
public PoiType(MapPoiTypes poiTypes, PoiCategory category, PoiFilter filter, String keyName) {
|
||||||
super(name, poiTypes);
|
super(keyName, poiTypes);
|
||||||
this.category = category;
|
this.category = category;
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import net.osmand.search.core.CustomSearchPoiFilter;
|
||||||
import net.osmand.search.core.ObjectType;
|
import net.osmand.search.core.ObjectType;
|
||||||
import net.osmand.search.core.SearchCoreAPI;
|
import net.osmand.search.core.SearchCoreAPI;
|
||||||
import net.osmand.search.core.SearchCoreFactory;
|
import net.osmand.search.core.SearchCoreFactory;
|
||||||
|
import net.osmand.search.core.SearchCoreFactory.SearchAmenityByTypeAPI;
|
||||||
import net.osmand.search.core.SearchCoreFactory.SearchAmenityTypesAPI;
|
import net.osmand.search.core.SearchCoreFactory.SearchAmenityTypesAPI;
|
||||||
import net.osmand.search.core.SearchCoreFactory.SearchBuildingAndIntersectionsByStreetAPI;
|
import net.osmand.search.core.SearchCoreFactory.SearchBuildingAndIntersectionsByStreetAPI;
|
||||||
import net.osmand.search.core.SearchCoreFactory.SearchStreetByCityAPI;
|
import net.osmand.search.core.SearchCoreFactory.SearchStreetByCityAPI;
|
||||||
|
@ -325,7 +326,7 @@ public class SearchUICore {
|
||||||
apis.add(new SearchCoreFactory.SearchLocationAndUrlAPI());
|
apis.add(new SearchCoreFactory.SearchLocationAndUrlAPI());
|
||||||
SearchAmenityTypesAPI searchAmenityTypesAPI = new SearchAmenityTypesAPI(poiTypes);
|
SearchAmenityTypesAPI searchAmenityTypesAPI = new SearchAmenityTypesAPI(poiTypes);
|
||||||
apis.add(searchAmenityTypesAPI);
|
apis.add(searchAmenityTypesAPI);
|
||||||
apis.add(new SearchCoreFactory.SearchAmenityByTypeAPI(poiTypes, searchAmenityTypesAPI));
|
apis.add(new SearchAmenityByTypeAPI(poiTypes, searchAmenityTypesAPI));
|
||||||
apis.add(new SearchCoreFactory.SearchAmenityByNameAPI());
|
apis.add(new SearchCoreFactory.SearchAmenityByNameAPI());
|
||||||
SearchBuildingAndIntersectionsByStreetAPI streetsApi =
|
SearchBuildingAndIntersectionsByStreetAPI streetsApi =
|
||||||
new SearchCoreFactory.SearchBuildingAndIntersectionsByStreetAPI();
|
new SearchCoreFactory.SearchBuildingAndIntersectionsByStreetAPI();
|
||||||
|
@ -573,6 +574,24 @@ public class SearchUICore {
|
||||||
return radius;
|
return radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AbstractPoiType getUnselectedPoiType() {
|
||||||
|
for (SearchCoreAPI capi : apis) {
|
||||||
|
if (capi instanceof SearchAmenityByTypeAPI) {
|
||||||
|
return ((SearchAmenityByTypeAPI) capi).getUnselectedPoiType();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCustomNameFilter() {
|
||||||
|
for (SearchCoreAPI capi : apis) {
|
||||||
|
if (capi instanceof SearchAmenityByTypeAPI) {
|
||||||
|
return ((SearchAmenityByTypeAPI) capi).getNameFilter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
void searchInternal(final SearchPhrase phrase, SearchResultMatcher matcher) {
|
void searchInternal(final SearchPhrase phrase, SearchResultMatcher matcher) {
|
||||||
preparePhrase(phrase);
|
preparePhrase(phrase);
|
||||||
ArrayList<SearchCoreAPI> lst = new ArrayList<>(apis);
|
ArrayList<SearchCoreAPI> lst = new ArrayList<>(apis);
|
||||||
|
|
|
@ -839,9 +839,8 @@ public class SearchCoreFactory {
|
||||||
private static final int BBOX_RADIUS = 10000;
|
private static final int BBOX_RADIUS = 10000;
|
||||||
private SearchAmenityTypesAPI searchAmenityTypesAPI;
|
private SearchAmenityTypesAPI searchAmenityTypesAPI;
|
||||||
private MapPoiTypes types;
|
private MapPoiTypes types;
|
||||||
private Map<PoiCategory, LinkedHashSet<String>> acceptedTypes = new LinkedHashMap<PoiCategory,
|
private AbstractPoiType unselectedPoiType;
|
||||||
LinkedHashSet<String>>();
|
private String nameFilter;
|
||||||
private Map<String, PoiType> poiAdditionals = new HashMap<String, PoiType>();
|
|
||||||
|
|
||||||
public SearchAmenityByTypeAPI(MapPoiTypes types, SearchAmenityTypesAPI searchAmenityTypesAPI) {
|
public SearchAmenityByTypeAPI(MapPoiTypes types, SearchAmenityTypesAPI searchAmenityTypesAPI) {
|
||||||
super(ObjectType.POI);
|
super(ObjectType.POI);
|
||||||
|
@ -849,6 +848,14 @@ public class SearchCoreFactory {
|
||||||
this.searchAmenityTypesAPI = searchAmenityTypesAPI;
|
this.searchAmenityTypesAPI = searchAmenityTypesAPI;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AbstractPoiType getUnselectedPoiType() {
|
||||||
|
return unselectedPoiType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNameFilter() {
|
||||||
|
return nameFilter;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isSearchMoreAvailable(SearchPhrase phrase) {
|
public boolean isSearchMoreAvailable(SearchPhrase phrase) {
|
||||||
return getSearchPriority(phrase) != -1 && super.isSearchMoreAvailable(phrase);
|
return getSearchPriority(phrase) != -1 && super.isSearchMoreAvailable(phrase);
|
||||||
|
@ -864,23 +871,17 @@ public class SearchCoreFactory {
|
||||||
return phrase.getNextRadiusSearch(BBOX_RADIUS);
|
return phrase.getNextRadiusSearch(BBOX_RADIUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void updateTypesToAccept(AbstractPoiType pt) {
|
|
||||||
pt.putTypes(acceptedTypes);
|
|
||||||
if (pt instanceof PoiType && ((PoiType) pt).isAdditional() && ((PoiType) pt).getParentType() != null) {
|
|
||||||
poiAdditionals.put(pt.getKeyName(), (PoiType) pt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean search(final SearchPhrase phrase, final SearchResultMatcher resultMatcher) throws IOException {
|
public boolean search(final SearchPhrase phrase, final SearchResultMatcher resultMatcher) throws IOException {
|
||||||
|
unselectedPoiType = null;
|
||||||
SearchPoiTypeFilter poiTypeFilter = null;
|
SearchPoiTypeFilter poiTypeFilter = null;
|
||||||
String nameFilter = null;
|
String nameFilter = null;
|
||||||
int countExtraWords = 0;
|
int countExtraWords = 0;
|
||||||
|
Map<String, PoiType> poiAdditionals = new LinkedHashMap<String, PoiType>();
|
||||||
if (phrase.isLastWord(ObjectType.POI_TYPE)) {
|
if (phrase.isLastWord(ObjectType.POI_TYPE)) {
|
||||||
Object obj = phrase.getLastSelectedWord().getResult().object;
|
Object obj = phrase.getLastSelectedWord().getResult().object;
|
||||||
if (obj instanceof AbstractPoiType) {
|
if (obj instanceof AbstractPoiType) {
|
||||||
poiTypeFilter = getPoiTypeFilter((AbstractPoiType) obj);
|
poiTypeFilter = getPoiTypeFilter((AbstractPoiType) obj, poiAdditionals);
|
||||||
} else if (obj instanceof SearchPoiTypeFilter) {
|
} else if (obj instanceof SearchPoiTypeFilter) {
|
||||||
poiTypeFilter = (SearchPoiTypeFilter) obj;
|
poiTypeFilter = (SearchPoiTypeFilter) obj;
|
||||||
} else {
|
} else {
|
||||||
|
@ -910,17 +911,20 @@ public class SearchCoreFactory {
|
||||||
nameFilter += otherSearchWords.get(k);
|
nameFilter += otherSearchWords.get(k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
poiTypeFilter = getPoiTypeFilter(poiType.getKey());
|
poiTypeFilter = getPoiTypeFilter(poiType.getKey(), poiAdditionals);
|
||||||
|
unselectedPoiType = poiType.getKey();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.nameFilter = nameFilter;
|
||||||
if (poiTypeFilter != null) {
|
if (poiTypeFilter != null) {
|
||||||
QuadRect bbox = phrase.getRadiusBBoxToSearch(BBOX_RADIUS);
|
QuadRect bbox = phrase.getRadiusBBoxToSearch(BBOX_RADIUS);
|
||||||
List<BinaryMapIndexReader> offlineIndexes = phrase.getOfflineIndexes();
|
List<BinaryMapIndexReader> offlineIndexes = phrase.getOfflineIndexes();
|
||||||
Set<String> searchedPois = new TreeSet<>();
|
Set<String> searchedPois = new TreeSet<>();
|
||||||
for (BinaryMapIndexReader r : offlineIndexes) {
|
for (BinaryMapIndexReader r : offlineIndexes) {
|
||||||
ResultMatcher<Amenity> rm = getResultMatcher(phrase, poiTypeFilter, resultMatcher, nameFilter, r, searchedPois, countExtraWords);
|
ResultMatcher<Amenity> rm = getResultMatcher(phrase, poiTypeFilter, resultMatcher, nameFilter, r,
|
||||||
|
searchedPois, poiAdditionals, countExtraWords);
|
||||||
if (poiTypeFilter instanceof CustomSearchPoiFilter) {
|
if (poiTypeFilter instanceof CustomSearchPoiFilter) {
|
||||||
rm = ((CustomSearchPoiFilter) poiTypeFilter).wrapResultMatcher(rm);
|
rm = ((CustomSearchPoiFilter) poiTypeFilter).wrapResultMatcher(rm);
|
||||||
}
|
}
|
||||||
|
@ -937,7 +941,8 @@ public class SearchCoreFactory {
|
||||||
private ResultMatcher<Amenity> getResultMatcher(final SearchPhrase phrase, final SearchPoiTypeFilter poiTypeFilter,
|
private ResultMatcher<Amenity> getResultMatcher(final SearchPhrase phrase, final SearchPoiTypeFilter poiTypeFilter,
|
||||||
final SearchResultMatcher resultMatcher, final String nameFilter,
|
final SearchResultMatcher resultMatcher, final String nameFilter,
|
||||||
final BinaryMapIndexReader selected, final Set<String> searchedPois,
|
final BinaryMapIndexReader selected, final Set<String> searchedPois,
|
||||||
final int countExtraWords) {
|
final Map<String, PoiType> poiAdditionals, final int countExtraWords) {
|
||||||
|
|
||||||
|
|
||||||
final NameStringMatcher ns = nameFilter == null ? null : new NameStringMatcher(nameFilter, StringMatcherMode.CHECK_STARTS_FROM_SPACE);
|
final NameStringMatcher ns = nameFilter == null ? null : new NameStringMatcher(nameFilter, StringMatcherMode.CHECK_STARTS_FROM_SPACE);
|
||||||
return new ResultMatcher<Amenity>() {
|
return new ResultMatcher<Amenity>() {
|
||||||
|
@ -1009,10 +1014,14 @@ public class SearchCoreFactory {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private SearchPoiTypeFilter getPoiTypeFilter(AbstractPoiType pt) {
|
private SearchPoiTypeFilter getPoiTypeFilter(AbstractPoiType pt, Map<String, PoiType> poiAdditionals ) {
|
||||||
acceptedTypes.clear();
|
final Map<PoiCategory, LinkedHashSet<String>> acceptedTypes = new LinkedHashMap<PoiCategory,
|
||||||
|
LinkedHashSet<String>>();
|
||||||
|
pt.putTypes(acceptedTypes);
|
||||||
poiAdditionals.clear();
|
poiAdditionals.clear();
|
||||||
updateTypesToAccept(pt);
|
if (pt instanceof PoiType && ((PoiType) pt).isAdditional() && ((PoiType) pt).getParentType() != null) {
|
||||||
|
poiAdditionals.put(pt.getKeyName(), (PoiType) pt);
|
||||||
|
}
|
||||||
return new SearchPoiTypeFilter() {
|
return new SearchPoiTypeFilter() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -25,7 +25,10 @@ import java.text.DecimalFormat;
|
||||||
import java.text.DecimalFormatSymbols;
|
import java.text.DecimalFormatSymbols;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
@ -372,24 +375,55 @@ public class OsmAndFormatter {
|
||||||
public static String getPoiStringWithoutType(Amenity amenity, String locale, boolean transliterate) {
|
public static String getPoiStringWithoutType(Amenity amenity, String locale, boolean transliterate) {
|
||||||
PoiCategory pc = amenity.getType();
|
PoiCategory pc = amenity.getType();
|
||||||
PoiType pt = pc.getPoiTypeByKeyName(amenity.getSubType());
|
PoiType pt = pc.getPoiTypeByKeyName(amenity.getSubType());
|
||||||
String nm = amenity.getSubType();
|
String typeName = amenity.getSubType();
|
||||||
if (pt != null) {
|
if (pt != null) {
|
||||||
nm = pt.getTranslation();
|
typeName = pt.getTranslation();
|
||||||
} else if(nm != null){
|
} else if(typeName != null){
|
||||||
nm = Algorithms.capitalizeFirstLetterAndLowercase(nm.replace('_', ' '));
|
typeName = Algorithms.capitalizeFirstLetterAndLowercase(typeName.replace('_', ' '));
|
||||||
}
|
}
|
||||||
String n = amenity.getName(locale, transliterate);
|
String localName = amenity.getName(locale, transliterate);
|
||||||
if (n.indexOf(nm) != -1) {
|
if (typeName != null && localName.contains(typeName)) {
|
||||||
// type is contained in name e.g.
|
// type is contained in name e.g.
|
||||||
// n = "Bakery the Corner"
|
// localName = "Bakery the Corner"
|
||||||
// type = "Bakery"
|
// type = "Bakery"
|
||||||
// no need to repeat this
|
// no need to repeat this
|
||||||
return n;
|
return localName;
|
||||||
}
|
}
|
||||||
if (n.length() == 0) {
|
if (localName.length() == 0) {
|
||||||
return nm;
|
return typeName;
|
||||||
}
|
}
|
||||||
return nm + " " + n; //$NON-NLS-1$
|
return typeName + " " + localName; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<String> getPoiStringsWithoutType(Amenity amenity, String locale, boolean transliterate) {
|
||||||
|
PoiCategory pc = amenity.getType();
|
||||||
|
PoiType pt = pc.getPoiTypeByKeyName(amenity.getSubType());
|
||||||
|
String typeName = amenity.getSubType();
|
||||||
|
if (pt != null) {
|
||||||
|
typeName = pt.getTranslation();
|
||||||
|
} else if(typeName != null){
|
||||||
|
typeName = Algorithms.capitalizeFirstLetterAndLowercase(typeName.replace('_', ' '));
|
||||||
|
}
|
||||||
|
List<String> res = new ArrayList<>();
|
||||||
|
String localName = amenity.getName(locale, transliterate);
|
||||||
|
addPoiString(typeName, localName, res);
|
||||||
|
for (String name : amenity.getAllNames(true)) {
|
||||||
|
addPoiString(typeName, name, res);
|
||||||
|
}
|
||||||
|
for (String name : amenity.getAdditionalInfo().values()) {
|
||||||
|
addPoiString(typeName, name, res);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addPoiString(String poiTypeName, String poiName, List<String> res) {
|
||||||
|
if (poiTypeName != null && poiName.contains(poiTypeName)) {
|
||||||
|
res.add(poiName);
|
||||||
|
}
|
||||||
|
if (poiName.length() == 0) {
|
||||||
|
res.add(poiTypeName);
|
||||||
|
}
|
||||||
|
res.add(poiTypeName + " " + poiName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getAmenityDescriptionContent(OsmandApplication ctx, Amenity amenity, boolean shortDescription) {
|
public static String getAmenityDescriptionContent(OsmandApplication ctx, Amenity amenity, boolean shortDescription) {
|
||||||
|
|
|
@ -11,13 +11,13 @@ import net.osmand.osm.AbstractPoiType;
|
||||||
import net.osmand.osm.MapPoiTypes;
|
import net.osmand.osm.MapPoiTypes;
|
||||||
import net.osmand.osm.PoiCategory;
|
import net.osmand.osm.PoiCategory;
|
||||||
import net.osmand.osm.PoiType;
|
import net.osmand.osm.PoiType;
|
||||||
import net.osmand.plus.settings.backend.ApplicationMode;
|
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.api.SQLiteAPI;
|
import net.osmand.plus.api.SQLiteAPI;
|
||||||
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
|
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
|
||||||
import net.osmand.plus.api.SQLiteAPI.SQLiteCursor;
|
import net.osmand.plus.api.SQLiteAPI.SQLiteCursor;
|
||||||
import net.osmand.plus.api.SQLiteAPI.SQLiteStatement;
|
import net.osmand.plus.api.SQLiteAPI.SQLiteStatement;
|
||||||
|
import net.osmand.plus.settings.backend.ApplicationMode;
|
||||||
import net.osmand.plus.wikipedia.WikipediaPoiMenu;
|
import net.osmand.plus.wikipedia.WikipediaPoiMenu;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
|
@ -227,7 +227,7 @@ public class PoiFiltersHelper {
|
||||||
AbstractPoiType tp = application.getPoiTypes().getAnyPoiTypeByKey(typeId);
|
AbstractPoiType tp = application.getPoiTypes().getAnyPoiTypeByKey(typeId);
|
||||||
if (tp != null) {
|
if (tp != null) {
|
||||||
PoiUIFilter lf = new PoiUIFilter(tp, application, "");
|
PoiUIFilter lf = new PoiUIFilter(tp, application, "");
|
||||||
ArrayList<PoiUIFilter> copy = new ArrayList<>(cacheTopStandardFilters);
|
ArrayList<PoiUIFilter> copy = cacheTopStandardFilters != null ? new ArrayList<>(cacheTopStandardFilters) : new ArrayList<PoiUIFilter>();
|
||||||
copy.add(lf);
|
copy.add(lf);
|
||||||
cacheTopStandardFilters = copy;
|
cacheTopStandardFilters = copy;
|
||||||
return lf;
|
return lf;
|
||||||
|
@ -235,7 +235,7 @@ public class PoiFiltersHelper {
|
||||||
AbstractPoiType lt = application.getPoiTypes().getAnyPoiAdditionalTypeByKey(typeId);
|
AbstractPoiType lt = application.getPoiTypes().getAnyPoiAdditionalTypeByKey(typeId);
|
||||||
if (lt != null) {
|
if (lt != null) {
|
||||||
PoiUIFilter lf = new PoiUIFilter(lt, application, "");
|
PoiUIFilter lf = new PoiUIFilter(lt, application, "");
|
||||||
ArrayList<PoiUIFilter> copy = new ArrayList<>(cacheTopStandardFilters);
|
ArrayList<PoiUIFilter> copy = cacheTopStandardFilters != null ? new ArrayList<>(cacheTopStandardFilters) : new ArrayList<PoiUIFilter>();
|
||||||
copy.add(lf);
|
copy.add(lf);
|
||||||
cacheTopStandardFilters = copy;
|
cacheTopStandardFilters = copy;
|
||||||
return lf;
|
return lf;
|
||||||
|
@ -279,8 +279,9 @@ public class PoiFiltersHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<PoiUIFilter> getTopDefinedPoiFilters(boolean includeDeleted) {
|
public List<PoiUIFilter> getTopDefinedPoiFilters(boolean includeDeleted) {
|
||||||
if (cacheTopStandardFilters == null) {
|
List<PoiUIFilter> top = this.cacheTopStandardFilters;
|
||||||
List<PoiUIFilter> top = new ArrayList<>();
|
if (top == null) {
|
||||||
|
top = new ArrayList<>();
|
||||||
// user defined
|
// user defined
|
||||||
top.addAll(getUserDefinedPoiFilters(true));
|
top.addAll(getUserDefinedPoiFilters(true));
|
||||||
if (getLocalWikiPOIFilter() != null) {
|
if (getLocalWikiPOIFilter() != null) {
|
||||||
|
@ -292,10 +293,10 @@ public class PoiFiltersHelper {
|
||||||
PoiUIFilter f = new PoiUIFilter(t, application, "");
|
PoiUIFilter f = new PoiUIFilter(t, application, "");
|
||||||
top.add(f);
|
top.add(f);
|
||||||
}
|
}
|
||||||
cacheTopStandardFilters = top;
|
this.cacheTopStandardFilters = top;
|
||||||
}
|
}
|
||||||
List<PoiUIFilter> result = new ArrayList<>();
|
List<PoiUIFilter> result = new ArrayList<>();
|
||||||
for (PoiUIFilter filter : cacheTopStandardFilters) {
|
for (PoiUIFilter filter : top) {
|
||||||
if (includeDeleted || !filter.isDeleted()) {
|
if (includeDeleted || !filter.isDeleted()) {
|
||||||
result.add(filter);
|
result.add(filter);
|
||||||
}
|
}
|
||||||
|
@ -462,7 +463,7 @@ public class PoiFiltersHelper {
|
||||||
}
|
}
|
||||||
boolean res = helper.addFilter(filter, helper.getWritableDatabase(), false, forHistory);
|
boolean res = helper.addFilter(filter, helper.getWritableDatabase(), false, forHistory);
|
||||||
if (res) {
|
if (res) {
|
||||||
ArrayList<PoiUIFilter> copy = new ArrayList<>(cacheTopStandardFilters);
|
ArrayList<PoiUIFilter> copy = cacheTopStandardFilters != null ? new ArrayList<>(cacheTopStandardFilters) : new ArrayList<PoiUIFilter>();
|
||||||
copy.add(filter);
|
copy.add(filter);
|
||||||
Collections.sort(copy);
|
Collections.sort(copy);
|
||||||
cacheTopStandardFilters = copy;
|
cacheTopStandardFilters = copy;
|
||||||
|
@ -510,13 +511,17 @@ public class PoiFiltersHelper {
|
||||||
if (filter.isTopWikiFilter()) {
|
if (filter.isTopWikiFilter()) {
|
||||||
prepareTopWikiFilter(filter);
|
prepareTopWikiFilter(filter);
|
||||||
}
|
}
|
||||||
|
Set<PoiUIFilter> selectedPoiFilters = new TreeSet<>(this.selectedPoiFilters);
|
||||||
selectedPoiFilters.add(filter);
|
selectedPoiFilters.add(filter);
|
||||||
saveSelectedPoiFilters();
|
saveSelectedPoiFilters(selectedPoiFilters);
|
||||||
|
this.selectedPoiFilters = selectedPoiFilters;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeSelectedPoiFilter(PoiUIFilter filter) {
|
public void removeSelectedPoiFilter(PoiUIFilter filter) {
|
||||||
|
Set<PoiUIFilter> selectedPoiFilters = new TreeSet<>(this.selectedPoiFilters);
|
||||||
selectedPoiFilters.remove(filter);
|
selectedPoiFilters.remove(filter);
|
||||||
saveSelectedPoiFilters();
|
saveSelectedPoiFilters(selectedPoiFilters);
|
||||||
|
this.selectedPoiFilters = selectedPoiFilters;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isShowingAnyPoi(PoiUIFilter ... filtersToExclude) {
|
public boolean isShowingAnyPoi(PoiUIFilter ... filtersToExclude) {
|
||||||
|
@ -524,6 +529,7 @@ public class PoiFiltersHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearSelectedPoiFilters(PoiUIFilter ... filtersToExclude) {
|
public void clearSelectedPoiFilters(PoiUIFilter ... filtersToExclude) {
|
||||||
|
Set<PoiUIFilter> selectedPoiFilters = new TreeSet<>(this.selectedPoiFilters);
|
||||||
if (filtersToExclude != null && filtersToExclude.length > 0) {
|
if (filtersToExclude != null && filtersToExclude.length > 0) {
|
||||||
Iterator<PoiUIFilter> it = selectedPoiFilters.iterator();
|
Iterator<PoiUIFilter> it = selectedPoiFilters.iterator();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
|
@ -544,7 +550,8 @@ public class PoiFiltersHelper {
|
||||||
} else {
|
} else {
|
||||||
selectedPoiFilters.clear();
|
selectedPoiFilters.clear();
|
||||||
}
|
}
|
||||||
saveSelectedPoiFilters();
|
saveSelectedPoiFilters(selectedPoiFilters);
|
||||||
|
this.selectedPoiFilters = selectedPoiFilters;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFiltersName(Set<PoiUIFilter> filters) {
|
public String getFiltersName(Set<PoiUIFilter> filters) {
|
||||||
|
@ -591,7 +598,7 @@ public class PoiFiltersHelper {
|
||||||
if(!application.getPoiTypes().isInit()) {
|
if(!application.getPoiTypes().isInit()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
selectedPoiFilters = new TreeSet<>();
|
Set<PoiUIFilter> selectedPoiFilters = new TreeSet<>();
|
||||||
for (String f : application.getSettings().getSelectedPoiFilters()) {
|
for (String f : application.getSettings().getSelectedPoiFilters()) {
|
||||||
PoiUIFilter filter = getFilterById(f);
|
PoiUIFilter filter = getFilterById(f);
|
||||||
if (filter != null) {
|
if (filter != null) {
|
||||||
|
@ -601,6 +608,7 @@ public class PoiFiltersHelper {
|
||||||
selectedPoiFilters.add(filter);
|
selectedPoiFilters.add(filter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.selectedPoiFilters = selectedPoiFilters;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
@ -630,7 +638,7 @@ public class PoiFiltersHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void saveSelectedPoiFilters() {
|
private void saveSelectedPoiFilters(Set<PoiUIFilter> selectedPoiFilters) {
|
||||||
Set<String> filters = new HashSet<>();
|
Set<String> filters = new HashSet<>();
|
||||||
for (PoiUIFilter filter : selectedPoiFilters) {
|
for (PoiUIFilter filter : selectedPoiFilters) {
|
||||||
filters.add(filter.filterId);
|
filters.add(filter.filterId);
|
||||||
|
|
|
@ -4,7 +4,6 @@ package net.osmand.plus.poi;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
import net.osmand.CollatorStringMatcher;
|
import net.osmand.CollatorStringMatcher;
|
||||||
import net.osmand.CollatorStringMatcher.StringMatcherMode;
|
import net.osmand.CollatorStringMatcher.StringMatcherMode;
|
||||||
|
@ -380,17 +379,23 @@ public class PoiUIFilter implements SearchPoiTypeFilter, Comparable<PoiUIFilter>
|
||||||
|
|
||||||
private AmenityNameFilter getNameFilterInternal(StringBuilder nmFilter,
|
private AmenityNameFilter getNameFilterInternal(StringBuilder nmFilter,
|
||||||
final boolean allTime, final boolean open, final List<PoiType> poiAdditionals) {
|
final boolean allTime, final boolean open, final List<PoiType> poiAdditionals) {
|
||||||
final CollatorStringMatcher sm =
|
final CollatorStringMatcher sm = nmFilter.length() > 0 ?
|
||||||
nmFilter.length() > 0 ?
|
|
||||||
new CollatorStringMatcher(nmFilter.toString().trim(), StringMatcherMode.CHECK_CONTAINS) : null;
|
new CollatorStringMatcher(nmFilter.toString().trim(), StringMatcherMode.CHECK_CONTAINS) : null;
|
||||||
return new AmenityNameFilter() {
|
return new AmenityNameFilter() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean accept(Amenity a) {
|
public boolean accept(Amenity a) {
|
||||||
if (sm != null) {
|
if (sm != null) {
|
||||||
String lower = OsmAndFormatter.getPoiStringWithoutType(a,
|
List<String> names = OsmAndFormatter.getPoiStringsWithoutType(a,
|
||||||
app.getSettings().MAP_PREFERRED_LOCALE.get(), app.getSettings().MAP_TRANSLITERATE_NAMES.get());
|
app.getSettings().MAP_PREFERRED_LOCALE.get(), app.getSettings().MAP_TRANSLITERATE_NAMES.get());
|
||||||
if (!sm.matches(lower)) {
|
boolean match = false;
|
||||||
|
for (String name : names) {
|
||||||
|
if (sm.matches(name)) {
|
||||||
|
match = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!match) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,11 +67,13 @@ import java.text.MessageFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.TreeMap;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import gnu.trove.map.hash.TLongObjectHashMap;
|
import gnu.trove.map.hash.TLongObjectHashMap;
|
||||||
|
@ -766,17 +768,28 @@ public class ResourceManager {
|
||||||
warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_big_for_memory), f.getName()));
|
warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_big_for_memory), f.getName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Map<PoiCategory, Map<String, PoiType>> toAddPoiTypes = new HashMap<>();
|
||||||
for (AmenityIndexRepository repo : amenityRepositories.values()) {
|
for (AmenityIndexRepository repo : amenityRepositories.values()) {
|
||||||
Map<String, List<String>> categories = ((AmenityIndexRepositoryBinary) repo).getDeltaPoiCategories();
|
Map<String, List<String>> categories = ((AmenityIndexRepositoryBinary) repo).getDeltaPoiCategories();
|
||||||
if (!categories.isEmpty()) {
|
if (!categories.isEmpty()) {
|
||||||
for (Map.Entry<String, List<String>> entry : categories.entrySet()) {
|
for (Map.Entry<String, List<String>> entry : categories.entrySet()) {
|
||||||
PoiCategory poiCategory = context.getPoiTypes().getPoiCategoryByName(entry.getKey(), true);
|
PoiCategory poiCategory = context.getPoiTypes().getPoiCategoryByName(entry.getKey(), true);
|
||||||
|
if (!toAddPoiTypes.containsKey(poiCategory)) {
|
||||||
|
toAddPoiTypes.put(poiCategory, new TreeMap<String, PoiType>());
|
||||||
|
}
|
||||||
|
Map<String, PoiType> poiTypes = toAddPoiTypes.get(poiCategory);
|
||||||
for (String s : entry.getValue()) {
|
for (String s : entry.getValue()) {
|
||||||
poiCategory.addPoiType(new PoiType(MapPoiTypes.getDefault(), poiCategory, null, s));
|
poiTypes.put(s, new PoiType(MapPoiTypes.getDefault(), poiCategory, null, s));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Iterator<Entry<PoiCategory, Map<String, PoiType>>> it = toAddPoiTypes.entrySet().iterator();
|
||||||
|
while(it.hasNext()) {
|
||||||
|
Entry<PoiCategory, Map<String, PoiType>> next = it.next();
|
||||||
|
PoiCategory category = next.getKey();
|
||||||
|
category.addExtraPoiTypes(next.getValue());
|
||||||
|
}
|
||||||
log.debug("All map files initialized " + (System.currentTimeMillis() - val) + " ms");
|
log.debug("All map files initialized " + (System.currentTimeMillis() - val) + " ms");
|
||||||
if (files.size() > 0 && (!indCache.exists() || indCache.canWrite())) {
|
if (files.size() > 0 && (!indCache.exists() || indCache.canWrite())) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -68,14 +68,12 @@ import net.osmand.osm.PoiCategory;
|
||||||
import net.osmand.osm.PoiType;
|
import net.osmand.osm.PoiType;
|
||||||
import net.osmand.plus.AppInitializer;
|
import net.osmand.plus.AppInitializer;
|
||||||
import net.osmand.plus.AppInitializer.AppInitializeListener;
|
import net.osmand.plus.AppInitializer.AppInitializeListener;
|
||||||
import net.osmand.plus.settings.backend.ApplicationMode;
|
|
||||||
import net.osmand.plus.FavouritesDbHelper;
|
import net.osmand.plus.FavouritesDbHelper;
|
||||||
import net.osmand.plus.LockableViewPager;
|
import net.osmand.plus.LockableViewPager;
|
||||||
import net.osmand.plus.OsmAndFormatter;
|
import net.osmand.plus.OsmAndFormatter;
|
||||||
import net.osmand.plus.OsmAndLocationProvider.OsmAndCompassListener;
|
import net.osmand.plus.OsmAndLocationProvider.OsmAndCompassListener;
|
||||||
import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
|
import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.UiUtilities;
|
import net.osmand.plus.UiUtilities;
|
||||||
import net.osmand.plus.Version;
|
import net.osmand.plus.Version;
|
||||||
|
@ -92,6 +90,8 @@ import net.osmand.plus.search.listitems.QuickSearchHeaderListItem;
|
||||||
import net.osmand.plus.search.listitems.QuickSearchListItem;
|
import net.osmand.plus.search.listitems.QuickSearchListItem;
|
||||||
import net.osmand.plus.search.listitems.QuickSearchMoreListItem;
|
import net.osmand.plus.search.listitems.QuickSearchMoreListItem;
|
||||||
import net.osmand.plus.search.listitems.QuickSearchMoreListItem.SearchMoreItemOnClickListener;
|
import net.osmand.plus.search.listitems.QuickSearchMoreListItem.SearchMoreItemOnClickListener;
|
||||||
|
import net.osmand.plus.settings.backend.ApplicationMode;
|
||||||
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController;
|
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController;
|
||||||
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarControllerType;
|
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarControllerType;
|
||||||
import net.osmand.search.SearchUICore;
|
import net.osmand.search.SearchUICore;
|
||||||
|
@ -354,19 +354,18 @@ public class QuickSearchDialogFragment extends DialogFragment implements OsmAndC
|
||||||
} else if (searchPhrase.isNoSelectedType() || searchPhrase.isLastWord(POI_TYPE)) {
|
} else if (searchPhrase.isNoSelectedType() || searchPhrase.isLastWord(POI_TYPE)) {
|
||||||
PoiUIFilter filter;
|
PoiUIFilter filter;
|
||||||
if (searchPhrase.isNoSelectedType()) {
|
if (searchPhrase.isNoSelectedType()) {
|
||||||
|
AbstractPoiType uselectedPoiType = searchUICore.getUnselectedPoiType();
|
||||||
if (isOnlineSearch() && !Algorithms.isEmpty(searchPhrase.getFirstUnknownSearchWord())) {
|
if (isOnlineSearch() && !Algorithms.isEmpty(searchPhrase.getFirstUnknownSearchWord())) {
|
||||||
app.getPoiFilters().resetNominatimFilters();
|
app.getPoiFilters().resetNominatimFilters();
|
||||||
filter = app.getPoiFilters().getNominatimPOIFilter();
|
filter = app.getPoiFilters().getNominatimPOIFilter();
|
||||||
filter.setFilterByName(searchPhrase.getUnknownSearchPhrase());
|
filter.setFilterByName(searchPhrase.getUnknownSearchPhrase());
|
||||||
filter.clearCurrentResults();
|
filter.clearCurrentResults();
|
||||||
// TODO Alexey
|
} else if (uselectedPoiType != null) {
|
||||||
// } else if (searchPhrase.hasUnknownSearchWordPoiType()) {
|
filter = new PoiUIFilter(uselectedPoiType, app, "");
|
||||||
// AbstractPoiType pt = searchPhrase.getUnknownSearchWordPoiType();
|
String customName = searchUICore.getCustomNameFilter();
|
||||||
// filter = new PoiUIFilter(pt, app, "");
|
if (!Algorithms.isEmpty(customName)) {
|
||||||
// String customName = searchPhrase.getPoiNameFilter();
|
filter.setFilterByName(customName);
|
||||||
// if (!Algorithms.isEmpty(customName)) {
|
}
|
||||||
// filter.setFilterByName(customName);
|
|
||||||
// }
|
|
||||||
} else {
|
} else {
|
||||||
filter = app.getPoiFilters().getSearchByNamePOIFilter();
|
filter = app.getPoiFilters().getSearchByNamePOIFilter();
|
||||||
if (!Algorithms.isEmpty(searchPhrase.getFirstUnknownSearchWord())) {
|
if (!Algorithms.isEmpty(searchPhrase.getFirstUnknownSearchWord())) {
|
||||||
|
|
|
@ -1,28 +1,5 @@
|
||||||
package net.osmand.plus.srtmplugin;
|
package net.osmand.plus.srtmplugin;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import net.osmand.IndexConstants;
|
|
||||||
import net.osmand.PlatformUtil;
|
|
||||||
import net.osmand.data.QuadRect;
|
|
||||||
import net.osmand.data.QuadTree;
|
|
||||||
import net.osmand.data.RotatedTileBox;
|
|
||||||
import net.osmand.map.TileSourceManager.TileSourceTemplate;
|
|
||||||
import net.osmand.plus.OsmandApplication;
|
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings.TerrainMode;
|
|
||||||
import net.osmand.plus.SQLiteTileSource;
|
|
||||||
import net.osmand.plus.activities.MapActivity;
|
|
||||||
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
|
|
||||||
import net.osmand.plus.views.MapTileLayer;
|
|
||||||
import net.osmand.util.Algorithms;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
|
@ -31,6 +8,29 @@ import android.graphics.Bitmap;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
|
|
||||||
|
import net.osmand.IndexConstants;
|
||||||
|
import net.osmand.PlatformUtil;
|
||||||
|
import net.osmand.data.QuadRect;
|
||||||
|
import net.osmand.data.QuadTree;
|
||||||
|
import net.osmand.data.RotatedTileBox;
|
||||||
|
import net.osmand.map.TileSourceManager.TileSourceTemplate;
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.SQLiteTileSource;
|
||||||
|
import net.osmand.plus.activities.MapActivity;
|
||||||
|
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
|
||||||
|
import net.osmand.plus.settings.backend.OsmandSettings.TerrainMode;
|
||||||
|
import net.osmand.plus.views.MapTileLayer;
|
||||||
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static net.osmand.plus.settings.backend.OsmandSettings.TerrainMode.HILLSHADE;
|
import static net.osmand.plus.settings.backend.OsmandSettings.TerrainMode.HILLSHADE;
|
||||||
|
|
||||||
public class TerrainLayer extends MapTileLayer {
|
public class TerrainLayer extends MapTileLayer {
|
||||||
|
@ -88,8 +88,8 @@ public class TerrainLayer extends MapTileLayer {
|
||||||
| SQLiteDatabase.CREATE_IF_NECESSARY );
|
| SQLiteDatabase.CREATE_IF_NECESSARY );
|
||||||
if (sqliteDb.getVersion() == 0) {
|
if (sqliteDb.getVersion() == 0) {
|
||||||
sqliteDb.setVersion(1);
|
sqliteDb.setVersion(1);
|
||||||
sqliteDb.execSQL("CREATE TABLE TILE_SOURCES(filename varchar2(256), date_modified int, left int, right int, top int, bottom int)");
|
|
||||||
}
|
}
|
||||||
|
sqliteDb.execSQL("CREATE TABLE IF NOT EXISTS TILE_SOURCES(filename varchar2(256), date_modified int, left int, right int, top int, bottom int)");
|
||||||
|
|
||||||
Map<String, Long> fileModified = new HashMap<String, Long>();
|
Map<String, Long> fileModified = new HashMap<String, Long>();
|
||||||
Map<String, SQLiteTileSource> rs = readFiles(app, tilesDir, fileModified);
|
Map<String, SQLiteTileSource> rs = readFiles(app, tilesDir, fileModified);
|
||||||
|
|
Loading…
Reference in a new issue