Merge branch 'r3.7'

This commit is contained in:
Victor Shcherb 2020-06-05 17:17:38 +02:00
commit ef773378d2
10 changed files with 206 additions and 98 deletions

View file

@ -7,38 +7,58 @@ import java.util.List;
import java.util.Map; import java.util.Map;
public class PoiFilter extends AbstractPoiType { public class PoiFilter extends AbstractPoiType {
private PoiCategory pc; private PoiCategory pc;
private List<PoiType> poiTypes = new ArrayList<PoiType>(); private List<PoiType> poiTypes = new ArrayList<PoiType>();
private Map<String, PoiType> map = new LinkedHashMap<String, PoiType>(); private Map<String, PoiType> map = new LinkedHashMap<String, PoiType>();
public PoiFilter(MapPoiTypes registry, PoiCategory pc, String keyName){ public PoiFilter(MapPoiTypes registry, PoiCategory pc, String keyName) {
super(keyName, registry); super(keyName, registry);
this.pc = pc; this.pc = pc;
} }
public PoiCategory getPoiCategory() { public PoiCategory getPoiCategory() {
return pc; return pc;
} }
public PoiType getPoiTypeByKeyName(String kn) { public PoiType getPoiTypeByKeyName(String kn) {
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);
map.put(type.getKeyName(), type); map.put(type.getKeyName(), type);
} else { } else {
PoiType prev = map.get(type.getKeyName()); PoiType prev = map.get(type.getKeyName());
if(prev.isReference()) { if (prev.isReference()) {
poiTypes.remove(prev); poiTypes.remove(prev);
poiTypes.add(type); poiTypes.add(type);
map.put(type.getKeyName(), type); map.put(type.getKeyName(), type);
} }
} }
} }
public Map<PoiCategory, LinkedHashSet<String>> putTypes(Map<PoiCategory, LinkedHashSet<String>> acceptedTypes) { public Map<PoiCategory, LinkedHashSet<String>> putTypes(Map<PoiCategory, LinkedHashSet<String>> acceptedTypes) {
if (!acceptedTypes.containsKey(pc)) { if (!acceptedTypes.containsKey(pc)) {
acceptedTypes.put(pc, new LinkedHashSet<String>()); acceptedTypes.put(pc, new LinkedHashSet<String>());
@ -65,9 +85,10 @@ public class PoiFilter extends AbstractPoiType {
} }
} }
} }
public List<PoiType> getPoiTypes() { public List<PoiType> getPoiTypes() {
return poiTypes; return poiTypes;
} }
} }

View file

@ -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;
} }

View file

@ -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);

View file

@ -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);
} }
@ -936,8 +940,9 @@ 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

View file

@ -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) {

View file

@ -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);

View file

@ -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;
} }
} }

View file

@ -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 {

View file

@ -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())) {

View file

@ -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 {
@ -86,11 +86,11 @@ public class TerrainLayer extends MapTileLayer {
new File(cacheDir, mode == HILLSHADE ? HILLSHADE_CACHE : SLOPE_CACHE).getPath(), new File(cacheDir, mode == HILLSHADE ? HILLSHADE_CACHE : SLOPE_CACHE).getPath(),
null, SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING null, SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING
| 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);
indexCachedResources(fileModified, rs); indexCachedResources(fileModified, rs);