Merge branches 'master' and 'speed_cameras' of https://github.com/osmandapp/Osmand into speed_cameras

 Conflicts:
	OsmAnd/res/values/strings.xml
This commit is contained in:
veliymolfar 2020-06-10 11:08:17 +03:00
commit 678306870b
87 changed files with 8087 additions and 524 deletions

View file

@ -33,8 +33,9 @@ public class CollatorStringMatcher implements StringMatcher {
public CollatorStringMatcher(String part, StringMatcherMode mode) {
this.collator = OsmAndCollator.primaryCollator();
this.part = part.toLowerCase(Locale.getDefault());
this.part = simplifyStringAndAlignChars(part);
this.mode = mode;
}
public Collator getCollator() {
@ -123,14 +124,15 @@ public class CollatorStringMatcher implements StringMatcher {
* @param theStart
* @return true if searchIn starts with token
*/
public static boolean cstartsWith(Collator collator, String fullText, String theStart,
public static boolean cstartsWith(Collator collator, String fullTextP, String theStart,
boolean checkBeginning, boolean checkSpaces, boolean equals) {
String searchIn = fullText.toLowerCase(Locale.getDefault());
String searchIn = simplifyStringAndAlignChars(fullTextP);
int searchInLength = searchIn.length();
int startLength = theStart.length();
if (startLength == 0) {
return true;
}
// this is not correct because of Auhofstrasse != Auhofstraße
if (startLength > searchInLength) {
return false;
}
@ -152,7 +154,8 @@ public class CollatorStringMatcher implements StringMatcher {
if (isSpace(searchIn.charAt(i - 1)) && !isSpace(searchIn.charAt(i))) {
if (collator.equals(searchIn.substring(i, i + startLength), theStart)) {
if(equals) {
if(i + startLength == searchInLength || isSpace(searchIn.charAt(i + startLength))) {
if(i + startLength == searchInLength ||
isSpace(searchIn.charAt(i + startLength))) {
return true;
}
} else {
@ -168,7 +171,17 @@ public class CollatorStringMatcher implements StringMatcher {
return false;
}
private static String simplifyStringAndAlignChars(String fullText) {
int i;
fullText = fullText.toLowerCase(Locale.getDefault());
while( (i = fullText.indexOf('ß') ) != -1 ) {
fullText = fullText.substring(0, i) + "ss" + fullText.substring(i+1);
}
return fullText;
}
private static boolean isSpace(char c){
return !Character.isLetter(c) && !Character.isDigit(c);
}
}

View file

@ -38,4 +38,5 @@ public class OsmAndCollator {
}
};
}
}

View file

@ -1,6 +1,7 @@
package net.osmand;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import org.apache.commons.logging.Log;
@ -20,11 +21,8 @@ public class Reshaper {
}
}
public static String reshape(String s) {
// if(true) {
// return s;
// }
try {
ArabicShaping as = new ArabicShaping(ArabicShaping.LETTERS_SHAPE | ArabicShaping.LENGTH_GROW_SHRINK);
ArabicShaping as = new ArabicShaping(ArabicShaping.LETTERS_SHAPE |ArabicShaping.LENGTH_GROW_SHRINK);
try {
s = as.shape(s);
} catch (ArabicShapingException e) {
@ -32,48 +30,53 @@ public class Reshaper {
}
Bidi line = new Bidi(s.length(), s.length());
line.setPara(s, Bidi.LEVEL_DEFAULT_LTR, null);
// line.setPara(s, Bidi.LEVEL_DEFAULT_LTR, null);
// s = line.writeReordered(Bidi.DO_MIRRORING);
// s = reordered;
byte direction = line.getDirection();
if (direction != Bidi.MIXED) {
// unidirectional
if(line.isLeftToRight()) {
if (line.isLeftToRight()) {
return s;
} else {
char[] chs = new char[s.length()];
for(int i = 0; i< chs.length ; i++) {
chs[i] = s.charAt(chs.length - i - 1);
// chs[i] = s.charAt(chs.length - i - 1);
chs[i] = mirror(s.charAt(chs.length - i - 1));
}
return new String(chs);
}
} else {
// // mixed-directional
// mixed-directional
// System.out.println(s);
// printSplit("Split", s);
int count = line.countRuns();
// if (styleRunCount <= 1) {
// int style = styleRuns[0].style;
// // iterate over directional runs
// for (i = 0; i < count; ++i) {
// run = line.getVisualRun(i);
// renderRun(text, run.getStart(), run.getLimit(),
// run.getDirection(), style);
// }
// }
StringBuilder res = new StringBuilder();
// iterate over both directional and style runs
for (int i = 0; i < count; ++i) {
StringBuilder runs = new StringBuilder();
BidiRun run = line.getVisualRun(i);
int st = run.getStart();
int e = run.getLimit();
int j = run.getDirection() == Bidi.LTR ? st : e - 1;
int l = run.getDirection() == Bidi.LTR ? e : st - 1;
boolean plus = run.getDirection() == Bidi.LTR;
while (j != l) {
res.append(s.charAt(j));
if (plus) {
j++;
boolean ltr = run.getDirection() == Bidi.LTR;
int start = run.getStart();
int limit = run.getLimit();
int begin = ltr ? start : limit - 1;
int end = ltr ? limit : start - 1;
int ind = begin;
while (ind != end) {
char ch = s.charAt(ind);
if (!ltr) {
ch = mirror(ch);
}
res.append(ch);
runs.append(ch);
if (ltr) {
ind++;
} else {
j--;
ind--;
}
}
printSplit(run.getDirection() + " " + run.getEmbeddingLevel(), runs.toString());
}
return res.toString();
}
@ -83,24 +86,74 @@ public class Reshaper {
}
}
private static char mirror(char ch) {
switch (ch) {
case '(': ch = ')'; break;
case ')': ch = '('; break;
case '[': ch = ']'; break;
case ']': ch = '['; break;
}
return ch;
}
public static void main(String[] args) {
// char[] c = new char[] {'א', 'ד','ם', ' ', '1', '2'} ;
// String reshape = "אדם";
char[] c = new char[] {'א', 'ד','ם'} ;
String reshape = reshape(new String(c));
for(int i=0; i < reshape.length(); i++) {
System.out.println(reshape.charAt(i));
}
// char[] c = new char[] {'א', 'ד','ם'} ;
// String reshape = reshape(new String(c));
// for (int i = 0; i < reshape.length(); i++) {
// System.out.println(reshape.charAt(i));
// }
test2();
test3();
test4();
test5();
}
private static void test3() {
String s = "מרכז מסחרי/השלום (40050)";
String reshape = reshape(s);
String expected = "(40050) םולשה/ירחסמ זכרמ";
check(s, reshape, expected);
}
private static void test5() {
String s = "מרכז מסחרי/השלום (מרז)";
String reshape = reshape(s);
String expected = "(זרמ) םולשה/ירחסמ זכרמ";
check(s, reshape, expected);
}
private static void check(String source, String reshape, String expected) {
printSplit("Source ", source);
printSplit("Expected", expected);
printSplit("Reshaped", reshape);
System.out.println(reshape);
if (!reshape.equals(expected)) {
throw new IllegalArgumentException(String.format("Bug: expected '%s', reshaped '%s'", expected, reshape));
}
}
private static void printSplit(String p, String source) {
System.out.print(p);
System.out.print(": \u2066");
for(int i = 0; i < source.length(); i++) {
System.out.print(source.charAt(i));
System.out.print(" \u200e");
}
// System.out.println(Arrays.toString(source.toCharArray()));
System.out.println();
System.out.flush();
}
private static void test2() {
String s = "گچ پژ نمکی باللغة العربي";
String reshape = reshape(s);
if (!reshape.equals("ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ ﯽﮑﻤﻧ ﮋﭘ ﭻﮔ")) {
throw new IllegalArgumentException("BUG!!!");
String expected1 = "ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ ﯽﮑﻤﻧ ﮋﭘ ﭻﮔ";
String expected2 = "ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ یکﻤﻧ ژپ چگ";
check(s, reshape, expected1);
}
private static void test4() {
String s = "Abc (123)";
check(s, reshape(s), s);
}
}

View file

@ -843,6 +843,7 @@ public class CommonWords {
addCommon("van");
addCommon("road");
addCommon("street");
addCommon("sector");
addCommon("drive");
addCommon("avenue");
addCommon("rue");

View file

@ -12,7 +12,7 @@ public class PoiFilter extends AbstractPoiType {
private List<PoiType> poiTypes = new ArrayList<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);
this.pc = pc;
}
@ -25,13 +25,33 @@ public class PoiFilter extends AbstractPoiType {
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) {
if (!map.containsKey(type.getKeyName())) {
poiTypes.add(type);
map.put(type.getKeyName(), type);
} else {
PoiType prev = map.get(type.getKeyName());
if(prev.isReference()) {
if (prev.isReference()) {
poiTypes.remove(prev);
poiTypes.add(type);
map.put(type.getKeyName(), type);
@ -70,4 +90,5 @@ public class PoiFilter extends AbstractPoiType {
return poiTypes;
}
}

View file

@ -26,8 +26,8 @@ public class PoiType extends AbstractPoiType {
private int order = 90;
public PoiType(MapPoiTypes poiTypes, PoiCategory category, PoiFilter filter, String name) {
super(name, poiTypes);
public PoiType(MapPoiTypes poiTypes, PoiCategory category, PoiFilter filter, String keyName) {
super(keyName, poiTypes);
this.category = category;
this.filter = filter;
}

View file

@ -301,8 +301,11 @@ public abstract class Entity implements Serializable {
String values = getTag(OSMTagKey.IS_IN);
if (values == null) {
String city = getTag(OSMTagKey.ADDR_CITY);
String place = getTag(OSMTagKey.ADDR_PLACE);
if(!Algorithms.isEmpty(city)) {
return Collections.singleton(city.trim());
} else if(!Algorithms.isEmpty(place)) {
return Collections.singleton(place.trim());
}
return Collections.emptySet();
}

View file

@ -34,9 +34,11 @@ public class OSMSettings {
// address
PLACE("place"), //$NON-NLS-1$
ADDR_HOUSE_NUMBER("addr:housenumber"), //$NON-NLS-1$
ADDR2_HOUSE_NUMBER("addr2:housenumber"), //$NON-NLS-1$
ADDR_HOUSE_NAME("addr:housename"), //$NON-NLS-1$
ADDR_STREET("addr:street"), //$NON-NLS-1$
ADDR_STREET2("addr:street2"), //$NON-NLS-1$
ADDR2_STREET("addr2:street"), //$NON-NLS-1$
ADDR_CITY("addr:city"), //$NON-NLS-1$
ADDR_PLACE("addr:place"), //$NON-NLS-1$
ADDR_POSTCODE("addr:postcode"), //$NON-NLS-1$

View file

@ -8,6 +8,9 @@ import java.util.Map;
public class RenderingRuleStorageProperties {
public static final String UI_CATEGORY_HIDDEN = "ui_hidden";
public static final String UI_CATEGORY_DETAILS = "details";
public static final String UI_CATEGORY_HIDE = "hide";
public static final String UI_CATEGORY_ROUTES = "routes";
public static final String A_ENGINE_V1 = "engine_v1";
public static final String A_APP_MODE= "appMode";
public static final String A_BASE_APP_MODE = "baseAppMode";

View file

@ -91,7 +91,7 @@ public class RoutePlannerFrontEnd {
}
if (road != null) {
if(!transportStop) {
float prio = ctx.getRouter().defineSpeedPriority(road.road);
float prio = Math.max(ctx.getRouter().defineSpeedPriority(road.road), 0.3f);
if (prio > 0) {
road.distSquare = (road.distSquare + GPS_POSSIBLE_ERROR * GPS_POSSIBLE_ERROR)
/ (prio * prio);

View file

@ -1,5 +1,6 @@
package net.osmand.router;
import net.osmand.NativeLibrary;
import net.osmand.PlatformUtil;
import net.osmand.binary.BinaryMapIndexReader;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
@ -1721,7 +1722,7 @@ public class RouteResultPreparation {
}
}
Iterator<RouteSegment> it;
if(rr.getPreAttachedRoutes(pointInd) != null) {
if (rr.getPreAttachedRoutes(pointInd) != null) {
final RouteSegmentResult[] list = rr.getPreAttachedRoutes(pointInd);
it = new Iterator<BinaryRoutePlanner.RouteSegment>() {
int i = 0;
@ -1740,7 +1741,7 @@ public class RouteResultPreparation {
public void remove() {
}
};
} else if (recalculation) {
} else if (recalculation || ctx.nativeLib == null) {
RouteSegment rt = ctx.loadRouteSegment(road.getPoint31XTile(pointInd), road.getPoint31YTile(pointInd), ctx.config.memoryLimitation);
it = rt == null ? null : rt.getIterator();
} else {

View file

@ -403,7 +403,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
}
public void copyPreattachedRoutes(RouteSegmentResult toCopy, int shift) {
if(toCopy.preAttachedRoutes != null) {
if (toCopy.preAttachedRoutes != null) {
int l = toCopy.preAttachedRoutes.length - shift;
preAttachedRoutes = new RouteSegmentResult[l][];
System.arraycopy(toCopy.preAttachedRoutes, shift, preAttachedRoutes, 0, l);
@ -412,7 +412,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
public RouteSegmentResult[] getPreAttachedRoutes(int routeInd) {
int st = Math.abs(routeInd - startPointIndex);
if(preAttachedRoutes != null && st < preAttachedRoutes.length) {
if (preAttachedRoutes != null && st < preAttachedRoutes.length) {
return preAttachedRoutes[st];
}
return null;
@ -421,7 +421,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
public List<RouteSegmentResult> getAttachedRoutes(int routeInd) {
int st = Math.abs(routeInd - startPointIndex);
List<RouteSegmentResult> list = attachedRoutes[st];
if(list == null) {
if (list == null) {
return Collections.emptyList();
}
return list;

View file

@ -9,11 +9,13 @@ import net.osmand.data.City;
import net.osmand.data.LatLon;
import net.osmand.data.MapObject;
import net.osmand.data.Street;
import net.osmand.osm.AbstractPoiType;
import net.osmand.osm.MapPoiTypes;
import net.osmand.search.core.CustomSearchPoiFilter;
import net.osmand.search.core.ObjectType;
import net.osmand.search.core.SearchCoreAPI;
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.SearchBuildingAndIntersectionsByStreetAPI;
import net.osmand.search.core.SearchCoreFactory.SearchStreetByCityAPI;
@ -324,7 +326,7 @@ public class SearchUICore {
apis.add(new SearchCoreFactory.SearchLocationAndUrlAPI());
SearchAmenityTypesAPI searchAmenityTypesAPI = new SearchAmenityTypesAPI(poiTypes);
apis.add(searchAmenityTypesAPI);
apis.add(new SearchCoreFactory.SearchAmenityByTypeAPI(poiTypes, searchAmenityTypesAPI));
apis.add(new SearchAmenityByTypeAPI(poiTypes, searchAmenityTypesAPI));
apis.add(new SearchCoreFactory.SearchAmenityByNameAPI());
SearchBuildingAndIntersectionsByStreetAPI streetsApi =
new SearchCoreFactory.SearchBuildingAndIntersectionsByStreetAPI();
@ -572,6 +574,24 @@ public class SearchUICore {
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) {
preparePhrase(phrase);
ArrayList<SearchCoreAPI> lst = new ArrayList<>(apis);
@ -758,14 +778,28 @@ public class SearchUICore {
return exportedCities;
}
public void exportObject(MapObject object) {
public void exportObject(SearchPhrase phrase, MapObject object) {
double maxDistance = phrase.getSettings().getExportSettings().getMaxDistance();
if (maxDistance > 0) {
double distance = MapUtils.getDistance(phrase.getSettings().getOriginalLocation(), object.getLocation());
if (distance > maxDistance) {
return;
}
}
if (exportedObjects == null) {
exportedObjects = new ArrayList<>();
}
exportedObjects.add(object);
}
public void exportCity(City city) {
public void exportCity(SearchPhrase phrase, City city) {
double maxDistance = phrase.getSettings().getExportSettings().getMaxDistance();
if (maxDistance > 0) {
double distance = MapUtils.getDistance(phrase.getSettings().getOriginalLocation(), city.getLocation());
if (distance > maxDistance) {
return;
}
}
if (exportedCities == null) {
exportedCities = new ArrayList<>();
}
@ -858,6 +892,7 @@ public class SearchUICore {
TOP_VISIBLE,
FOUND_WORD_COUNT, // more is better (top)
UNKNOWN_PHRASE_MATCH_WEIGHT, // more is better (top)
COMPARE_AMENITY_TYPE_ADDITIONAL,
SEARCH_DISTANCE_IF_NOT_BY_NAME,
COMPARE_FIRST_NUMBER_IN_NAME,
COMPARE_DISTANCE_TO_PARENT_SEARCH_RESULT, // makes sense only for inner subqueries
@ -908,6 +943,17 @@ public class SearchUICore {
}
break;
}
case COMPARE_AMENITY_TYPE_ADDITIONAL: {
if(o1.object instanceof AbstractPoiType && o2.object instanceof AbstractPoiType ) {
boolean additional1 = ((AbstractPoiType) o1.object).isAdditional();
boolean additional2 = ((AbstractPoiType) o2.object).isAdditional();
if (additional1 != additional2) {
// -1 - means 1st is less than 2nd
return additional1 ? 1 : -1;
}
}
break;
}
case COMPARE_DISTANCE_TO_PARENT_SEARCH_RESULT:
double ps1 = o1.parentSearchResult == null ? 0 : o1.parentSearchResult.getSearchDistance(c.loc);
double ps2 = o2.parentSearchResult == null ? 0 : o2.parentSearchResult.getSearchDistance(c.loc);

View file

@ -226,7 +226,7 @@ public class SearchCoreFactory {
sr.objectType = ObjectType.REGION;
sr.location = bmir.getRegionCenter();
sr.preferredZoom = 6;
if (phrase.getFirstUnknownSearchWord().length() <= 1 && phrase.isNoSelectedType()) {
if (phrase.getFullSearchPhrase().length() <= 1 && phrase.isNoSelectedType()) {
resultMatcher.publish(sr);
} else if (phrase.getFirstUnknownNameStringMatcher().matches(sr.localeName)) {
resultMatcher.publish(sr);
@ -343,7 +343,7 @@ public class SearchCoreFactory {
int limit = 0;
for (City c : resArray) {
if (phrase.getSettings().isExportObjects()) {
resultMatcher.exportCity(c);
resultMatcher.exportCity(phrase, c);
}
SearchResult res = new SearchResult(phrase);
res.object = c;
@ -388,7 +388,7 @@ public class SearchCoreFactory {
@Override
public boolean publish(MapObject object) {
if (phrase.getSettings().isExportObjects()) {
resultMatcher.exportObject(object);
resultMatcher.exportObject(phrase, object);
}
if (isCancelled()) {
return false;
@ -546,7 +546,7 @@ public class SearchCoreFactory {
@Override
public boolean publish(Amenity object) {
if (phrase.getSettings().isExportObjects()) {
resultMatcher.exportObject(object);
resultMatcher.exportObject(phrase, object);
}
if (limit++ > LIMIT) {
return false;
@ -648,6 +648,7 @@ public class SearchCoreFactory {
public void clearCustomFilters() {
this.customPoiFilters.clear();
this.activePoiFilters.clear();
}
public void addCustomFilter(CustomSearchPoiFilter poiFilter, int priority) {
@ -702,6 +703,9 @@ public class SearchCoreFactory {
if (nm.matches(pf.getEnTranslation())) {
lst = addToList(pf.getEnTranslation(), lst);
}
if (nm.matches(pf.getKeyName())) {
lst = addToList(pf.getKeyName().replace('_', ' '), lst);
}
if (nm.matches(pf.getSynonyms())) {
String[] synonyms = pf.getSynonyms().split(";");
@ -728,6 +732,7 @@ public class SearchCoreFactory {
if (translatedNames.isEmpty()) {
translatedNames = types.getAllTranslatedNames(false);
topVisibleFilters = types.getTopVisibleFilters();
topVisibleFilters.remove(types.getOsmwiki());
categories = types.getCategories(false);
}
}
@ -784,6 +789,7 @@ public class SearchCoreFactory {
String stdFilterId , SearchResult res) {
res.priorityDistance = 0;
res.objectType = ObjectType.POI_TYPE;
res.firstUnknownWordMatches = true;
if (showTopFiltersOnly) {
if (activePoiFilters.containsKey(stdFilterId)) {
res.priority = getPoiTypePriority(stdFilterId);
@ -835,9 +841,8 @@ public class SearchCoreFactory {
private static final int BBOX_RADIUS = 10000;
private SearchAmenityTypesAPI searchAmenityTypesAPI;
private MapPoiTypes types;
private Map<PoiCategory, LinkedHashSet<String>> acceptedTypes = new LinkedHashMap<PoiCategory,
LinkedHashSet<String>>();
private Map<String, PoiType> poiAdditionals = new HashMap<String, PoiType>();
private AbstractPoiType unselectedPoiType;
private String nameFilter;
public SearchAmenityByTypeAPI(MapPoiTypes types, SearchAmenityTypesAPI searchAmenityTypesAPI) {
super(ObjectType.POI);
@ -845,6 +850,14 @@ public class SearchCoreFactory {
this.searchAmenityTypesAPI = searchAmenityTypesAPI;
}
public AbstractPoiType getUnselectedPoiType() {
return unselectedPoiType;
}
public String getNameFilter() {
return nameFilter;
}
@Override
public boolean isSearchMoreAvailable(SearchPhrase phrase) {
return getSearchPriority(phrase) != -1 && super.isSearchMoreAvailable(phrase);
@ -860,23 +873,17 @@ public class SearchCoreFactory {
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
public boolean search(final SearchPhrase phrase, final SearchResultMatcher resultMatcher) throws IOException {
unselectedPoiType = null;
SearchPoiTypeFilter poiTypeFilter = null;
String nameFilter = null;
int countExtraWords = 0;
Map<String, PoiType> poiAdditionals = new LinkedHashMap<String, PoiType>();
if (phrase.isLastWord(ObjectType.POI_TYPE)) {
Object obj = phrase.getLastSelectedWord().getResult().object;
if (obj instanceof AbstractPoiType) {
poiTypeFilter = getPoiTypeFilter((AbstractPoiType) obj);
poiTypeFilter = getPoiTypeFilter((AbstractPoiType) obj, poiAdditionals);
} else if (obj instanceof SearchPoiTypeFilter) {
poiTypeFilter = (SearchPoiTypeFilter) obj;
} else {
@ -906,17 +913,20 @@ public class SearchCoreFactory {
nameFilter += otherSearchWords.get(k);
}
}
poiTypeFilter = getPoiTypeFilter(poiType.getKey());
poiTypeFilter = getPoiTypeFilter(poiType.getKey(), poiAdditionals);
unselectedPoiType = poiType.getKey();
}
}
}
}
this.nameFilter = nameFilter;
if (poiTypeFilter != null) {
QuadRect bbox = phrase.getRadiusBBoxToSearch(BBOX_RADIUS);
List<BinaryMapIndexReader> offlineIndexes = phrase.getOfflineIndexes();
Set<String> searchedPois = new TreeSet<>();
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) {
rm = ((CustomSearchPoiFilter) poiTypeFilter).wrapResultMatcher(rm);
}
@ -933,7 +943,8 @@ public class SearchCoreFactory {
private ResultMatcher<Amenity> getResultMatcher(final SearchPhrase phrase, final SearchPoiTypeFilter poiTypeFilter,
final SearchResultMatcher resultMatcher, final String nameFilter,
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);
return new ResultMatcher<Amenity>() {
@ -941,7 +952,7 @@ public class SearchCoreFactory {
@Override
public boolean publish(Amenity object) {
if (phrase.getSettings().isExportObjects()) {
resultMatcher.exportObject(object);
resultMatcher.exportObject(phrase, object);
}
SearchResult res = new SearchResult(phrase);
String poiID = object.getType().getKeyName() + "_" + object.getId();
@ -1005,10 +1016,14 @@ public class SearchCoreFactory {
};
}
private SearchPoiTypeFilter getPoiTypeFilter(AbstractPoiType pt) {
acceptedTypes.clear();
private SearchPoiTypeFilter getPoiTypeFilter(AbstractPoiType pt, Map<String, PoiType> poiAdditionals ) {
final Map<PoiCategory, LinkedHashSet<String>> acceptedTypes = new LinkedHashMap<PoiCategory,
LinkedHashSet<String>>();
pt.putTypes(acceptedTypes);
poiAdditionals.clear();
updateTypesToAccept(pt);
if (pt instanceof PoiType && ((PoiType) pt).isAdditional() && ((PoiType) pt).getParentType() != null) {
poiAdditionals.put(pt.getKeyName(), (PoiType) pt);
}
return new SearchPoiTypeFilter() {
@Override

View file

@ -3,30 +3,29 @@ package net.osmand.search.core;
public class SearchExportSettings {
private boolean exportEmptyCities;
private boolean exportBuildings;
private double maxDistance;
public SearchExportSettings() {
exportEmptyCities = true;
exportBuildings = true;
maxDistance = -1;
}
public SearchExportSettings(boolean exportEmptyCities, boolean exportBuildings) {
public SearchExportSettings(boolean exportEmptyCities, boolean exportBuildings, double maxDistance) {
this.exportEmptyCities = exportEmptyCities;
this.exportBuildings = exportBuildings;
this.maxDistance = maxDistance;
}
public boolean isExportEmptyCities() {
return exportEmptyCities;
}
public void setExportEmptyCities(boolean exportEmptyCities) {
this.exportEmptyCities = exportEmptyCities;
}
public boolean isExportBuildings() {
return exportBuildings;
}
public void setExportBuildings(boolean exportBuildings) {
this.exportBuildings = exportBuildings;
public double getMaxDistance() {
return maxDistance;
}
}

View file

@ -24,7 +24,7 @@ public class SearchSettings {
private boolean emptyQueryAllowed;
private boolean sortByName;
private SearchExportSettings exportSettings;
//private SearchExportSettings exportSettings = new SearchExportSettings(false, false);
//private SearchExportSettings exportSettings = new SearchExportSettings(false, false, -1);
public SearchSettings(SearchSettings s) {
if(s != null) {

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,25 @@
{
"settings": {
"lat": "51.04933",
"lon": "13.73815",
"radiusLevel": 1,
"totalLimit": -1,
"lang": "",
"transliterateIfMissing": false,
"emptyQueryAllowed": false,
"sortByName": false
},
"phrase": ["Fuel", "Fuel "],
"results": [[
"Aircraft fuel station (Filling station) [[1, POI_TYPE, 1.000, 0.00 km]]",
"Gas station (Filling station) [[1, POI_TYPE, 1.000, 0.00 km]]",
"Gas station for boats (Filling station) [[1, POI_TYPE, 1.000, 0.00 km]]"
],
[
"Aircraft fuel station (Filling station) [[1, POI_TYPE, 1.000, 0.00 km]]",
"Gas station (Filling station) [[1, POI_TYPE, 1.000, 0.00 km]]",
"Gas station for boats (Filling station) [[1, POI_TYPE, 1.000, 0.00 km]]"
]],
"amenities": [],
"cities": []
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,125 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="5"
android:minHeight="@dimen/bottom_sheet_title_height"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingTop="@dimen/content_padding_small"
android:paddingBottom="@dimen/content_padding_small"
android:textAppearance="@style/TextAppearance.ListItemTitle"
osmand:typeface="@string/font_roboto_medium"
tools:text="Some Title"
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding" />
<ImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/content_padding_half"
android:contentDescription="@string/shared_string_icon" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:letterSpacing="@dimen/text_button_letter_spacing"
android:minHeight="@dimen/bottom_sheet_list_item_height"
android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingBottom="@dimen/content_padding"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_list_text_size"
android:lineSpacingMultiplier="@dimen/bottom_sheet_info_spacing_multiplier"
osmand:typeface="@string/font_roboto_regular"
tools:text="@string/weight_limit_description"
android:paddingEnd="@dimen/content_padding"
android:paddingStart="@dimen/content_padding" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding">
<LinearLayout
android:id="@+id/text"
android:paddingTop="@dimen/content_padding_half"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
android:id="@+id/text_caption"
android:layout_width="0dp"
android:layout_height="wrap_content"
osmand:hintEnabled="false"
android:gravity="start"
android:layout_weight="1"
osmand:boxBackgroundColor="@color/material_text_input_layout_bg">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/text_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:inputType="numberDecimal"
android:maxLines="1"
android:maxLength="5"
android:minHeight="@dimen/favorites_list_item_height"
android:paddingBottom="@dimen/card_content_padding_large"
android:paddingStart="@dimen/content_padding_small"
android:paddingLeft="@dimen/content_padding_small"
android:paddingRight="@dimen/content_padding_small"
android:paddingEnd="@dimen/content_padding_small"
android:textSize="@dimen/default_list_text_size"
tools:text="@string/lorem_ipsum" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<TextView
android:id="@+id/metric"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingStart="@dimen/content_padding_small"
android:paddingRight="@dimen/content_padding_small"
android:paddingEnd="@dimen/content_padding_small"
android:paddingLeft="@dimen/content_padding_small"
android:text="@string/shared_string_meters" />
</FrameLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/content_padding_small"
android:paddingBottom="@dimen/content_padding_small"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding"
android:clipToPadding="false"
android:orientation="horizontal"
osmand:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:itemCount="3"
tools:listitem="@layout/point_editor_icon_category_item" />
</LinearLayout>

View file

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/bottom_sheet_item_with_switch" />
<LinearLayout
android:id="@+id/bottom_btns"
android:layout_width="match_parent"
android:layout_height="@dimen/dialog_button_height"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginTop="@dimen/text_margin_small"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginBottom="@dimen/content_padding_small"
android:background="?attr/btn_bg_border_inactive"
android:baselineAligned="false"
android:orientation="horizontal"
android:visibility="gone"
tools:visibility="visible">
<FrameLayout
android:id="@+id/left_btn_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/left_btn"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground"
android:gravity="center"
android:text="@string/shared_string_hillshade"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium" />
</FrameLayout>
<FrameLayout
android:id="@+id/right_btn_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/right_btn"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground"
android:gravity="center"
android:text="@string/shared_string_slope"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium" />
</FrameLayout>
</LinearLayout>
</LinearLayout>

View file

@ -40,6 +40,7 @@
android:background="@null"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"/>
android:focusableInTouchMode="false"
android:saveEnabled="false"/>
</LinearLayout>

View file

@ -75,7 +75,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@string/shared_string_name"
app:boxBackgroundColor="@color/input_layout_bg_color">
app:boxBackgroundColor="@color/material_text_input_layout_bg">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/name_edit"
@ -128,7 +128,7 @@
android:layout_marginRight="@dimen/content_padding"
android:layout_weight="1"
android:hint="@string/shared_string_description"
app:boxBackgroundColor="@color/input_layout_bg_color">
app:boxBackgroundColor="@color/material_text_input_layout_bg">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/description_edit"

View file

@ -1631,4 +1631,10 @@
<string name="poi_access_motorcycle">مدخل دراجات نارية</string>
<string name="poi_access_disabled">مدخل معاقين</string>
<string name="poi_cash_withdrawal_bank_card">سحب نقدي</string>
<string name="poi_access_motorhome">عربة منزل متنقل</string>
<string name="poi_access_caravan">مدخل منازل متنقلة</string>
<string name="poi_snowmobile_filter">مدخل دراجة جليد</string>
<string name="poi_socket_schuko_output_filter">مخرج Schuko</string>
<string name="poi_socket_cee_blue_output_filter">مخرج CEE أزرق</string>
<string name="poi_socket_type3_output_filter">مخرج نوع 3</string>
</resources>

View file

@ -3138,7 +3138,7 @@
<string name="utm_format_descr">يستخدم أوسماند تنسيق UTM وهو مشابه ولكن غير مطابق لتنسيق UTM الناتو.</string>
<string name="shared_string_example">مثال</string>
<string name="navigate_point_format_utm">معيار الإحداثيات</string>
<string name="navigate_point_format_olc">رمز موقع مفتوح</string>
<string name="navigate_point_format_olc">Open Location Code</string>
<string name="coordinates_format_info">سيتم تطبيق التنسيق المحدد في كل أنحاء التطبيق.</string>
<string name="pref_selected_by_default_for_profiles">يتم تحديد هذا الاعداد بشكل افتراضي للأوضاع: %s</string>
<string name="change_default_settings">تغيير الإعدادات</string>
@ -3147,7 +3147,7 @@
<string name="start_up_message_pref">رسالة البدء</string>
<string name="analytics_pref_title">تحليل</string>
<string name="turn_screen_on_info">إظهار الخريطة على شاشة القفل أثناء التنقل.</string>
<string name="wake_time">وقت الاستيقاظ</string>
<string name="wake_time">المهلة بعد الاستيقاظ</string>
<string name="units_and_formats">الوحدات والأشكال</string>
<string name="appearance">المظهر</string>
<string name="map_look_descr">مظهر الخريطة</string>
@ -3179,7 +3179,7 @@
<string name="route_parameters">معلمات الطريق</string>
<string name="application_profile_changed">تم تغيير وضع التطبيق إلى \"%s\"</string>
<string name="logcat_buffer">سجل الاستخدام</string>
<string name="plugins_settings">إعدادات البرنامج المساعد</string>
<string name="plugins_settings">ضبط الملحقات</string>
<string name="shared_string_by_default">بشكل افتراضي</string>
<string name="download_detailed_map">قم بتنزيل خريطة مفصلة%s لعرض هذه المنطقة.</string>
<string name="internal_app_storage_description">تخزين داخلي ، مخفي عن المستخدم والتطبيقات الأخرى ، يمكن الوصول إليه حصريا من أوسماند.</string>
@ -3459,7 +3459,7 @@
<string name="monitoring_min_speed">الحد الأدنى للسرعة</string>
<string name="monitoring_min_accuracy">دقة الحد الأدنى</string>
<string name="monitoring_min_distance">الحد الأدنى للإزاحة</string>
<string name="reset_plugin_to_default">إعادة تعيين إعدادات البرنامج المساعد الافتراضي</string>
<string name="reset_plugin_to_default">إعادة ضبط الملحقات للافتراضي</string>
<string name="multimedia_rec_split_title">تقسيم المسجل</string>
<string name="multimedia_use_system_camera">استخدام تطبيق النظام</string>
<string name="multimedia_photo_play_sound">صوت الكاميرا</string>
@ -3470,7 +3470,7 @@
<string name="shared_string_available">متاح</string>
<string name="add_custom_category">إضافة فئة مخصصة</string>
<string name="rendering_attr_streetLightingNight_name">اظهر في الليل فقط</string>
<string name="plugin_prefs_reset_successful">استعادة جميع إعدادات البرنامج المساعد إلى الحالة الافتراضية.</string>
<string name="plugin_prefs_reset_successful">استعادة ضبط الملحق للافتراضي.</string>
<string name="profile_prefs_reset_successful">تمت استعادة جميع إعدادات الوضع إلى الحالة الافتراضية.</string>
<string name="ltr_or_rtl_combine_via_slash">%1$s/%2$s</string>
<string name="sunset_at">غروب الشمس على %1$s</string>
@ -3486,19 +3486,19 @@
\n
\n• إضافة رقم الخروج في الملاحة
\n
\n• إعادة صياغة إعدادات البرنامج المساعد
\n• إعادة صياغة ضبط الملحقات
\n
\n• إعادة صياغة شاشة الإعدادات للوصول السريع إلى جميع الأوضاع
\n
\n• إضافة خيار لنسخ الإعدادات من ملف شخصي آخر
\n• إضافة خيار لنسخ الإعدادات من وضع آخر
\n
\n• إضافة القدرة على تغيير أمر أو إخفاء فئات POI في البحث
\n
\n• رموز POI محاذاة بشكل صحيح على الخريطة
\n
\n• إضافة بيانات غروب الشمس / شروق الشمس لتكوين الخريطة
\n• إضافة بيانات غروب/شروق الشمس لتكوين الخريطة
\n
\n• إضافة رموز المنزل / العمل على الخريطة
\n• إضافة رموز المنزل/العمل على الخريطة
\n
\n• إضافة دعم للوصف متعدد الأسطر في الإعدادات
\n
@ -3730,7 +3730,7 @@
<string name="turn_screen_on_wake_time_descr">حدد مهلة الشاشة بعد الاستيقاظ. (\"%1$s\" لا ينطبق أي مهلة.)</string>
<string name="keep_screen_on">إبقاء الشاشة قيد التشغيل</string>
<string name="keep_screen_off">إبقاء الشاشة مطفأة</string>
<string name="screen_timeout_descr">محدد ب \"٪1$s\" ، إذا تم تمكينه.</string>
<string name="screen_timeout_descr">إذا تم تفعيل الخيار \"%1$s\" ، فسوف يعتمد وقت النشاط عليه.</string>
<string name="pseudo_mercator_projection">إسقاط ميركاتور الوهمي</string>
<string name="one_image_per_tile">ملف صورة واحد لكل إطار متجانب</string>
<string name="sqlite_db_file">ملف SQLiteDB</string>
@ -3752,8 +3752,17 @@
\nأسبوع واحد هو 10080 دقيقة.
\nشهر واحد هو 43 829 دقيقة.</string>
<string name="tiles_storage_descr">اختر كيفية تخزين الطبقات التي تم تنزيلها.</string>
<string name="default_screen_timeout">مهلة شاشة النظام</string>
<string name="default_screen_timeout">مهلة الشاشة الافتراضية</string>
<string name="export_import_quick_actions_with_profiles_promo">يمكنك تصدير أو استيراد إجراءات سريعة باستخدام ملفات تعريف بروفايل التطبيق.</string>
<string name="shared_string_delete_all_q">حذف الكل؟</string>
<string name="delete_all_actions_message_q">هل أنت متأكد من رغبتك في حذف الإجراءات السريعة %d نهائيًا؟</string>
<string name="screen_timeout">مهلة الشاشة</string>
<string name="shared_string_tones">أساليب</string>
<string name="width_limit_description">أدل بعرض مركبتك، قد يتم تطبيق بعض القيود على المركبات العريضة.</string>
<string name="height_limit_description">أدل بارتفاع مركبتك ،قد يتم تطبيق بعض القيود على المركبات المرتفعة.</string>
<string name="weight_limit_description">أدل بوزن مركبتك ،قد يتم تطبيق بعض القيود على المركبات الثقيلة.</string>
<string name="shared_string_meters">أمتار</string>
<string name="details_dialog_decr">التحكم في رؤية التفاصيل الإضافية الظاهرة على الخريطة</string>
<string name="shared_string_night_map">خريطة ليلية</string>
<string name="shared_string_all_time">كل الوقت</string>
</resources>

View file

@ -1111,7 +1111,7 @@
<string name="routing_attr_avoid_toll_name">Sense vies de peatge</string>
<string name="routing_attr_avoid_toll_description">Evita les vies de peatge</string>
<string name="routing_attr_avoid_unpaved_name">Només vies pavimentades</string>
<string name="routing_attr_avoid_unpaved_description">Evita les vies sense pavimentar.</string>
<string name="routing_attr_avoid_unpaved_description">Evita les vies sense pavimentar</string>
<string name="routing_attr_avoid_ferries_name">Sense transbordadors</string>
<string name="routing_attr_avoid_ferries_description">Evita els transbordadors</string>
<string name="routing_attr_avoid_motorway_name">Sense autopistes</string>
@ -2029,7 +2029,7 @@ Per retornar a l\'estil habitual dels mapes d\'OsmAnd, només cal desactivar aqu
<string name="update_all_maps_now">Voleu actualitzar tots els mapes ara mateix?</string>
<string name="clear_tile_data">Esborra totes les tessel·les</string>
<string name="search_map">Cercant mapes…</string>
<string name="first_usage_wizard_desc">"Permeteu a OsmAnd determinar la vostra localització i suggerir-vos els mapes a baixar d\'aquesta zona."</string>
<string name="first_usage_wizard_desc">Permeteu a OsmAnd determinar la vostra localització i suggerir-vos els mapes a baixar d\'aquesta zona.</string>
<string name="location_not_found">No s\'ha determinat la localització</string>
<string name="no_inet_connection">Sense connexió a Internet</string>
<string name="no_inet_connection_desc_map">És necessari per baixar mapes.</string>
@ -3186,7 +3186,7 @@ Abasta l\'àrea: %1$s x %2$s</string>
<string name="routing_attr_allow_expert_description">Rutes molt difícils, amb obstacles i dreceres perillosos.</string>
<string name="routing_attr_allow_skating_only_name">Permet rutes de només skateboarding</string>
<string name="routing_attr_allow_skating_only_description">Rutes preparades per a estil lliure o skateboarding sense pistes clàssiques.</string>
<string name="routing_attr_allow_classic_only_description">Rutes preparades per a estil clàssic sense pistes de skateboarding. Això inclou rutes preparades amb una moto de neu més petita amb amb pistes fetes manualment pels esquiadors.</string>
<string name="routing_attr_allow_classic_only_description">Rutes preparades per a estil clàssic sense pistes de skateboarding. Això inclou rutes preparades amb una moto de neu més petita amb pistes fetes manualment pels esquiadors.</string>
<string name="routing_attr_freeride_policy_name">Fora de pista</string>
<string name="app_mode_ufo">Ovni</string>
<string name="app_mode_monowheel">Monocicle</string>

View file

@ -3479,4 +3479,6 @@ Zobrazená oblast: %1$s x %2$s</string>
\nJeden týden má 10 080 minut.
\nJeden měsíc má 43 829 minut.</string>
<string name="tiles_storage_descr">Zvolte způsob uložení stažených dlaždic.</string>
<string name="export_import_quick_actions_with_profiles_promo">Rychlé akce můžete importovat nebo exportovat prostřednictvím profilů.</string>
<string name="shared_string_delete_all_q">Odstranit vše\?</string>
</resources>

View file

@ -3682,4 +3682,22 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="profiles_for_action_not_found">Kunne ikke finde sådanne profiler.</string>
<string name="index_item_world_basemap_detailed">Verdensoversigtskort (detaljeret)</string>
<string name="unsupported_type_error">Ikke understøttet type</string>
<string name="shared_string_always">Altid</string>
<string name="screen_control">Skærmstyring</string>
<string name="turn_screen_on_navigation_instructions_descr">Hver navigationsinstruktion tænder skærmen.</string>
<string name="turn_screen_on_navigation_instructions">Navigationsinstruktioner</string>
<string name="turn_screen_on_power_button">Tænd/sluk-knap</string>
<string name="turn_screen_on_proximity_sensor">Nærhedssensor</string>
<string name="keep_screen_on">Hold skærmen tændt</string>
<string name="keep_screen_off">Hold skærmen slukket</string>
<string name="pseudo_mercator_projection">Pseudo-Mercatorprojektion</string>
<string name="sqlite_db_file">SQLiteDB fil</string>
<string name="online_map_name_helper_text">Angiv et navn til onlinekortkilden.</string>
<string name="edit_online_source">Rediger onlinekilde</string>
<string name="expire_time">Udløbstid</string>
<string name="mercator_projection">Mercatorprojektion</string>
<string name="storage_format">Lagerformat</string>
<string name="shared_string_delete_all_q">Slet alt\?</string>
<string name="shared_string_tones">toner</string>
<string name="shared_string_meters">meter</string>
</resources>

View file

@ -3256,7 +3256,7 @@
<string name="analytics_pref_title">Analyseinstrumente</string>
<string name="turn_screen_on_info">Karte während der Navigation auf dem Sperrbildschirm anzeigen.</string>
<string name="route_parameters_info">Einstellungen für die Routenplanung des gewählten Profils „%1$s“.</string>
<string name="wake_time">Aufwachzeit</string>
<string name="wake_time">Zeitüberschreitung nach dem Aufwachen</string>
<string name="units_and_formats">Einheiten und Formate</string>
<string name="appearance">Aussehen</string>
<string name="map_look_descr">Kartendarstellung</string>
@ -3728,9 +3728,9 @@
<string name="profiles_for_action_not_found">Konnte keine solchen Profile finden.</string>
<string name="index_item_world_basemap_detailed">Weltübersichtskarte (detailliert)</string>
<string name="unsupported_type_error">Nicht unterstützter Typ</string>
<string name="ui_customization_description">Passen Sie die Menge der Elemente in \"Schublade\", \"Karte konfigurieren\" und \"Kontextmenü\" an.
<string name="ui_customization_description">Passen Sie die Menge der Elemente in „Schublade”, „Karte konfigurieren” und „Kontextmenü” an.
\n
\nSchalten Sie nicht verwendete Plugins aus, um alle ihre Steuerelemente auszublenden. %1$s.</string>
\nDeaktivieren Sie ungenutzte Plugins, um deren Steuerelemente auszublenden. %1$s.</string>
<string name="ui_customization_short_descr">Schubladenelemente, Kontextmenü</string>
<string name="shared_string_drawer">Schublade</string>
<string name="gpx_parse_error">OsmAnd GPX ist nicht optimal geformt, bitte kontaktieren Sie das Support-Team, um weitere Nachforschungen anzustellen.</string>
@ -3746,17 +3746,15 @@
<string name="system_screen_timeout">Systembildschirm-Timeout verwenden</string>
<string name="turn_screen_on_options_descr">Optionen zum Aktivieren des Bildschirms:</string>
<string name="turn_screen_on_descr">Wählen Sie Optionen zum Aufwecken des Bildschirms (stellen Sie sicher, dass OsmAnd im Vordergrund ist, wenn das Gerät gesperrt wird):</string>
<string name="turn_screen_on_navigation_instructions_descr">Der Bildschirm schaltet sich automatisch einige Sekunden vor Navigationsanweisungen für die unter „Aufweckzeiten“ festgelegte Dauer ein.
\n
\nFunktioniert nur während der Navigation.</string>
<string name="turn_screen_on_navigation_instructions_descr">Für jede Navigationsanweisung wird der Bildschirm eingeschaltet.</string>
<string name="turn_screen_on_navigation_instructions">Navigationsanweisungen</string>
<string name="turn_screen_on_power_button_descr">Drücken Sie den Einschaltknopf des Geräts, um den Bildschirm mit OsmAnd im Vordergrund einzuschalten.</string>
<string name="turn_screen_on_power_button">Einschaltknopf</string>
<string name="turn_screen_on_proximity_sensor">Näherungssensor</string>
<string name="turn_screen_on_wake_time_descr">Wählen Sie das Bildschirm-Timeout nach dem Aufwachen. (\"%1$s\" wendet keine Zeitüberschreitung an).</string>
<string name="turn_screen_on_wake_time_descr">Wählen Sie die Zeitüberschreitung des Bildschirms nach dem Aufwachen. („%1$s”, um keine Zeitüberschreitung anzuwenden.)</string>
<string name="keep_screen_on">Bildschirm eingeschaltet lassen</string>
<string name="keep_screen_off">Bildschirm ausgeschaltet lassen</string>
<string name="screen_timeout_descr">Begrenzt durch \"%1$s\", falls aktiviert.</string>
<string name="screen_timeout_descr">Wenn die Option „%1$s” aktiviert ist, ist die Dauer der Aktivität davon abhängig.</string>
<string name="pseudo_mercator_projection">Pseudo-Mercator-Projektion</string>
<string name="one_image_per_tile">Eine Bilddatei pro Kachel</string>
<string name="sqlite_db_file">SQLiteDB-Datei</string>
@ -3772,5 +3770,16 @@
\nEine Woche hat 10 080 Minuten.
\nEin Monat hat 43 829 Minuten.</string>
<string name="tiles_storage_descr">Wählen Sie aus, wie heruntergeladene Kacheln gespeichert werden.</string>
<string name="default_screen_timeout">Zeitüberschreitung des Systembildschirms</string>
<string name="default_screen_timeout">Zeitüberschreitung des Standardbildschirms</string>
<string name="width_limit_description">Bitte geben Sie Ihre Fahrzeugbreite an. Für breite Fahrzeuge könnten einige Streckenabschnitte nicht befahrbar sein.</string>
<string name="height_limit_description">Bitte geben Sie Ihre Fahrzeughöhe an. Für hohe Fahrzeuge könnten einige Streckenabschnitte nicht befahrbar sein.</string>
<string name="weight_limit_description">Bitte geben Sie Ihr Fahrzeuggewicht an. Für schwere Fahrzeuge könnten einige Streckenabschnitte nicht befahrbar sein.</string>
<string name="export_import_quick_actions_with_profiles_promo">Sie können Schnellaktionen mit Anwendungsprofilen exportieren oder importieren.</string>
<string name="shared_string_delete_all_q">Alles Löschen\?</string>
<string name="delete_all_actions_message_q">Möchten Sie %d Schnellaktionen wirklich unwiderruflich löschen\?</string>
<string name="shared_string_tones">Töne</string>
<string name="shared_string_meters">Meter</string>
<string name="screen_timeout">Bildschirm-Zeitlimit</string>
<string name="details_dialog_decr">Kontrollieren Sie die Sichtbarkeit zusätzlicher Details, die auf der Karte angezeigt werden</string>
<string name="shared_string_night_map">Nachtkarte</string>
</resources>

View file

@ -219,7 +219,7 @@
<string name="favorite_category_add_new">Aldoni novan</string>
<string name="favorite_category_select">Elekti kategorion</string>
<string name="default_speed_system_descr">Difini unuon de rapido.</string>
<string name="default_speed_system">Unuoj de rapido</string>
<string name="default_speed_system">Unuo de rapido</string>
<string name="nm">nm</string>
<string name="si_nm">Marmejloj</string>
<string name="si_kmh">Kilometroj en horo</string>
@ -813,9 +813,9 @@
<string name="routing_attr_avoid_stairs_description">Eviti ŝtuparojn</string>
<string name="routing_attr_avoid_borders_name">Sen landlimaj trairejoj</string>
<string name="routing_attr_avoid_borders_description">Eviti landlimajn trairejojn</string>
<string name="routing_attr_weight_name">Pezlimo</string>
<string name="routing_attr_weight_name">Limigo de pezo</string>
<string name="routing_attr_weight_description">Agordi maksimuman permesatan pezon de veturilo.</string>
<string name="routing_attr_height_name">Altlimo</string>
<string name="routing_attr_height_name">Limigo de alto</string>
<string name="routing_attr_height_description">Agordi maksimuman permesan alton de veturilo.</string>
<string name="android_19_location_disabled">Ekde la versio 4.4 (KitKat) de Android, la antaŭa dosierujo (%s) estas evitinda. Ĉu kopii ĉiujn dosierojn de OsmAnd al la nova dosierujo\?
\n Rimarko 1: viaj malnovaj dosieroj ne estos ŝanĝitaj (tamen vi povos forigi ilin permane).
@ -1227,7 +1227,7 @@
<string name="switch_to_raster_map_to_see">Elŝutu malkonektan vektoran mapon por tiu ĉi loko per “elŝuti mapojn”, aŭ aktivigu la kromprogramon “enretaj mapoj”.</string>
<string name="send_files_to_osm">Ĉu alŝuti GPX-dosierojn al OSM?</string>
<string name="gpx_tags_txt">Etikedoj</string>
<string name="gpx_visibility_txt">Videbleco</string>
<string name="gpx_visibility_txt">Videblo</string>
<string name="shared_string_description">Priskribo</string>
<string name="validate_gpx_upload_name_pwd">Bonvolu enmeti vian uzantnomon kaj pasvorton al OSM por alŝuti GPX-dosierojn.</string>
<string name="default_buttons_support">Subteni</string>
@ -3237,8 +3237,8 @@
<string name="start_up_message_pref">Mesaĝo je starto</string>
<string name="analytics_pref_title">Analiziloj</string>
<string name="turn_screen_on_info">Montri mapon sur la ŝlosekrano dum navigado.</string>
<string name="route_parameters_info">Agordoj pri kursdifinado por la elektita profilo “%1$s”.</string>
<string name="wake_time">Aktiveca periodo</string>
<string name="route_parameters_info">Agordoj pri kursdifinado por la elektita profilo: “%1$s”.</string>
<string name="wake_time">Aktiveca periodo de ekrano</string>
<string name="units_and_formats">Unuoj kaj formoj</string>
<string name="appearance">Aspekto</string>
<string name="map_look_descr">Alĝustigi mapon</string>
@ -3733,7 +3733,7 @@
<string name="turn_screen_on_wake_time_descr">Elekti aktivecan periodon de la ekrano post vekiĝi, la ekrano ne malŝaltiĝos se “%1$s” estos aktiva.</string>
<string name="keep_screen_on">Teni ekranon aktiva</string>
<string name="keep_screen_off">Teni ekranon malaktiva</string>
<string name="screen_timeout_descr">Limigita al “%1$s”, se aktiva.</string>
<string name="screen_timeout_descr">Nur kiam la agordo “%1$s” estas ŝaltita, aktiveca periodo de la ekrano dependos de ĝi.</string>
<string name="pseudo_mercator_projection">Kvazaŭ-merkatora projekcio</string>
<string name="one_image_per_tile">Po unu bilddosiero per kahelo</string>
<string name="sqlite_db_file">SQLiteDB-dosiero</string>
@ -3755,5 +3755,17 @@
\nUnu semajno egalas al 10 080 minutoj.
\nUnu jaro egalas al 43 829 minutoj.</string>
<string name="tiles_storage_descr">Elekti kiel konservi elŝutitajn kahelojn.</string>
<string name="default_screen_timeout">Laŭ sistema agordo</string>
<string name="default_screen_timeout">Implicita aktiveco de ekrano</string>
<string name="screen_timeout">Aktiveca periodo de ekrano</string>
<string name="export_import_quick_actions_with_profiles_promo">Vi povas enporti aŭ elporti rapidajn agojn kune kun profiloj de aplikaĵo.</string>
<string name="shared_string_delete_all_q">Ĉu forigi ĉiujn\?</string>
<string name="delete_all_actions_message_q">Ĉu vi certe volas neinversigeble forigi %d rapidajn agojn\?</string>
<string name="width_limit_description">Enigu larĝon de via veturilo, iuj vojaj limigoj aplikas al larĝaj veturiloj.</string>
<string name="height_limit_description">Enigu alton de via veturilo, iuj vojaj limigoj aplikas al altaj veturiloj.</string>
<string name="weight_limit_description">Enigu pezon de via veturilo, iuj vojaj limigoj aplikas al pezaj veturiloj.</string>
<string name="shared_string_tones">tunoj</string>
<string name="shared_string_meters">metroj</string>
<string name="details_dialog_decr">Alĝustigi videblon de pliaj detaloj montrataj sur la mapo</string>
<string name="shared_string_night_map">Nokta mapo</string>
<string name="shared_string_all_time">Ĉiam</string>
</resources>

View file

@ -3249,7 +3249,7 @@
<string name="analytics_pref_title">Análisis</string>
<string name="turn_screen_on_info">Mostrar el mapa en la pantalla de bloqueo durante la navegación.</string>
<string name="route_parameters_info">Ajustes para la navegación del perfil elegido «%1$s».</string>
<string name="wake_time">Duración del encendido</string>
<string name="wake_time">Tiempo de espera después del encendido</string>
<string name="units_and_formats">Unidades y formatos</string>
<string name="appearance">Aspecto</string>
<string name="map_look_descr">Apariencia del mapa</string>
@ -3746,7 +3746,7 @@
<string name="turn_screen_on_wake_time_descr">Elige el tiempo de espera de la pantalla luego del encendido. («%1$s» no aplica ningún tiempo de espera.)</string>
<string name="keep_screen_on">Mantener la pantalla encendida</string>
<string name="keep_screen_off">Mantener la pantalla apagada</string>
<string name="screen_timeout_descr">Limitado por «%1$s», si está activado.</string>
<string name="screen_timeout_descr">Si la opción «%1$s» está activada, el tiempo de actividad dependerá de ello.</string>
<string name="pseudo_mercator_projection">Proyección de pseudo-Mercator</string>
<string name="one_image_per_tile">Un archivo de imagen por tesela</string>
<string name="sqlite_db_file">Archivo SQLiteDB</string>
@ -3768,8 +3768,17 @@
\nUna semana son 10 080 minutos.
\nUn mes son 43 829 minutos.</string>
<string name="tiles_storage_descr">Elige cómo se almacenarán las teselas descargadas.</string>
<string name="default_screen_timeout">Tiempo de espera de la pantalla del sistema</string>
<string name="default_screen_timeout">Tiempo predefinido de la espera de la pantalla</string>
<string name="export_import_quick_actions_with_profiles_promo">Puedes exportar o importar acciones rápidas con perfiles de aplicación.</string>
<string name="shared_string_delete_all_q">¿Borrar todo\?</string>
<string name="delete_all_actions_message_q">¿Borrar irrevocablemente %d acciones rápidas\?</string>
<string name="width_limit_description">Proporciona el ancho del vehículo. Se pueden aplicar algunas restricciones de ruta para vehículos anchos.</string>
<string name="height_limit_description">Proporciona la altura del vehículo, se pueden aplicar algunas restricciones de ruta para vehículos altos.</string>
<string name="weight_limit_description">Proporciona el peso del vehículo, se pueden aplicar algunas restricciones de ruta para vehículos pesados.</string>
<string name="screen_timeout">Tiempo de espera de la pantalla</string>
<string name="shared_string_tones">tonos</string>
<string name="shared_string_meters">metros</string>
<string name="details_dialog_decr">Controla la visibilidad de los detalles adicionales que se muestran en el mapa</string>
<string name="shared_string_night_map">Mapa nocturno</string>
<string name="shared_string_all_time">Todo el tiempo</string>
</resources>

View file

@ -3705,4 +3705,47 @@
<string name="lang_jv">Javanés</string>
<string name="search_poi_types">Buscar tipos de PDI</string>
<string name="download_unsupported_action">Acción %1$s no admitida</string>
<string name="index_item_world_basemap_detailed">Mapa general del mundo (detallado)</string>
<string name="unsupported_type_error">Tipo no admitido</string>
<string name="width_limit_description">Proporciona la anchura de tu vehículo, algunas restricciones de rutas pueden aplicarse para los vehículos anchos.</string>
<string name="height_limit_description">Proporciona la altura de tu vehículo, algunas restricciones de rutas pueden aplicarse para los vehículos altos.</string>
<string name="weight_limit_description">Proporciona el peso de tu vehículo, algunas restricciones de rutas pueden aplicarse para los vehículos pesados.</string>
<string name="gpx_parse_error">OsmAnd GPX no está bien formado, por favor ponte en contacto con el equipo de soporte para investigar más a fondo.</string>
<string name="shared_string_always">Siempre</string>
<string name="screen_control">Control de pantalla</string>
<string name="system_screen_timeout_descr">Apaga la pantalla después del tiempo de apagado de la pantalla definido en el sistema.</string>
<string name="system_screen_timeout">Usar el tiempo de apagado de la pantalla del sistema</string>
<string name="turn_screen_on_descr">Selecciona las opciones de activación de la pantalla (asegúrate de que OsmAnd esté en primer plano cuando se bloquee el dispositivo):</string>
<string name="turn_screen_on_navigation_instructions_descr">Cada instrucción de navegación encenderá la pantalla.</string>
<string name="turn_screen_on_navigation_instructions">Instrucciones de navegación</string>
<string name="turn_screen_on_power_button_descr">Al pulsar el botón de encendido del dispositivo se encenderá la pantalla con OsmAnd encima de la pantalla de bloqueo.</string>
<string name="turn_screen_on_power_button">Botón de encendido</string>
<string name="turn_screen_on_proximity_sensor">Sensor de proximidad</string>
<string name="turn_screen_on_wake_time_descr">Selecciona el tiempo de apagado de la pantalla después de despertarte. (\"%1$s\" no la apaga.)</string>
<string name="keep_screen_on">Mantener la pantalla encendida</string>
<string name="keep_screen_off">Mantener la pantalla apagada</string>
<string name="pseudo_mercator_projection">Proyección Pseudo-Mercator</string>
<string name="one_image_per_tile">Un archivo de imagen por tesela</string>
<string name="sqlite_db_file">Archivo SQLiteDB</string>
<string name="online_map_name_helper_text">Proporciona un nombre para la fuente del mapa en línea.</string>
<string name="online_map_url_helper_text">Escribe o pega la URL de la fuente en línea.</string>
<string name="edit_online_source">Editar fuente en línea</string>
<string name="expire_time">Tiempo de expiración</string>
<string name="mercator_projection">Proyección de Mercator</string>
<string name="storage_format">Formato de almacenamiento</string>
<string name="map_source_zoom_levels">Fija el nivel de zoom mínimo y máximo en el que se mostrará o cargará el mapa en línea.</string>
<string name="expire_time_descr">Tiempo de expiración en minutos. Las teselas almacenadas se volverán a cargar después del tiempo especificado. Deja este campo vacío para que no se actualicen nunca las teselas de esta fuente.
\n
\nUn día son 1.440 minutos.
\nUna semana son 10.080 minutos.
\nUn mes son 43.829 minutos.</string>
<string name="tiles_storage_descr">Elige cómo se guardarán las teselas descargadas</string>
<string name="export_import_quick_actions_with_profiles_promo">Puedes Exportar o Importar acciones rápidas con perfiles de aplicación.</string>
<string name="shared_string_delete_all_q">¿Eliminar todo\?</string>
<string name="delete_all_actions_message_q">¿Estás seguro de que deseas eliminar irrevocablemente% d acciones rápidas\?</string>
<string name="screen_timeout">Tiempo de apagado de la pantalla</string>
<string name="screen_timeout_descr">Si la opción \"%1$s\" está habilitada, el tiempo de actividad dependerá de ella.</string>
<string name="shared_string_meters">metros</string>
<string name="details_dialog_decr">Controla la visibilidad de los detalles adicionales mostrados en el mapa</string>
<string name="shared_string_night_map">Mapa nocturno</string>
</resources>

View file

@ -3233,7 +3233,7 @@ Area honi dagokio: %1$s x %2$s</string>
<string name="analytics_pref_title">Analitikak</string>
<string name="turn_screen_on_info">Erakutsi mapa blokeo pantailan nabigazioan zehar.</string>
<string name="route_parameters_info">Ibilbide ezarpenak hautatutako \"%1$s.\" profilean.</string>
<string name="wake_time">Esnatze ordua</string>
<string name="wake_time">Pantaila denbora-muga pertsonalizatua</string>
<string name="units_and_formats">Unitate eta formatuak</string>
<string name="appearance">Itxura</string>
<string name="map_look_descr">Maparen itxura</string>
@ -3750,7 +3750,7 @@ Area honi dagokio: %1$s x %2$s</string>
<string name="turn_screen_on_wake_time_descr">Hautatu pantailaren denbora-muga esnatu ondoren. (\"%1$s\" ez da aplikatzen denbora-muga.)</string>
<string name="keep_screen_on">Mantendu pantaila piztuta</string>
<string name="keep_screen_off">Mantendu pantaila itzalita</string>
<string name="screen_timeout_descr">\"%1$s\"-k mugatua, gaituta badago.</string>
<string name="screen_timeout_descr">Hau eraginkorra izateko \"%1$s\" desgaitu behar da.</string>
<string name="pseudo_mercator_projection">Sasi-Mercator proiekzioa</string>
<string name="one_image_per_tile">Irudi fitxategi bat lauzako</string>
<string name="sqlite_db_file">SQLiteDB fitxategia</string>
@ -3773,4 +3773,8 @@ Area honi dagokio: %1$s x %2$s</string>
\nHilabete bat 43829 minutu dira.</string>
<string name="tiles_storage_descr">Aukeratu nola gorde deskargatutako lauzak.</string>
<string name="default_screen_timeout">Sistemako pantailaren denbora-muga</string>
<string name="export_import_quick_actions_with_profiles_promo">Ekintza azkarrak esportatu edo inportatu ditzakezu aplikazio-profilekin.</string>
<string name="shared_string_delete_all_q">Ezabatu denak\?</string>
<string name="delete_all_actions_message_q">Ziur behin betiko ezabatu nahi dituzula %d ekintza azkar\?</string>
<string name="screen_timeout">Pantailaren denbora-muga</string>
</resources>

View file

@ -3250,7 +3250,7 @@
<string name="navigate_point_format_olc">Open Location Code</string>
<string name="coordinates_format_info">قالب انتخابی در همه‌جای برنامه به کار خواهد رفت.</string>
<string name="start_up_message_pref">پیام راه‌اندازی</string>
<string name="wake_time">زمان بیدارباش</string>
<string name="wake_time">زمان خاموشی پس از بیدارباش</string>
<string name="units_and_formats">یکاها و قالب‌ها</string>
<string name="appearance">ظاهر</string>
<string name="map_look">چهرهٔ نقشه</string>
@ -3758,7 +3758,7 @@
<string name="reset_deafult_order">بازنشانی ترتیب پیشفرض اقلام</string>
<string name="gpx_parse_error">OsmAnd GPX قالب درستی ندارد. لطفاً برای بررسی بیشتر با گروه پشتیبانی تماس بگیرید.</string>
<string name="turn_screen_on_wake_time_descr">زمان خاموشی صفحه پس از بیدارباش را انتخاب کنید. («%1$s» یعنی خاموش نشود)</string>
<string name="screen_timeout_descr">محدودشده به‌وسیلهٔ «%1$s»، اگر فعال باشد.</string>
<string name="screen_timeout_descr">اگر گزینهٔ «%1$s» فعال باشد، زمان فعالیت به آن وابسته خواهد بود.</string>
<string name="shared_string_always">همیشه</string>
<string name="screen_control">کنترل صفحه</string>
<string name="system_screen_timeout_descr">هنگامی که زمان خاموشی صفحه مطابق تنظیمات دستگاه سر برسد، صفحه را خاموش می‌کند.</string>
@ -3792,8 +3792,17 @@
\nیک هفته ۱۰ ۰۸۰ دقیقه است.
\nیک ماه ۴۳ ۸۲۹ دقیقه است.</string>
<string name="tiles_storage_descr">شیوهٔ ذخیره‌سازی کاشی‌های دانلودشده را انتخاب کنید.</string>
<string name="default_screen_timeout">زمان خاموشی صفحه در دستگاه</string>
<string name="default_screen_timeout">زمان خاموشی پیشفرض صفحه</string>
<string name="export_import_quick_actions_with_profiles_promo">می‌توانید کنش‌های فوری را همراه با پروفایل‌های برنامه برون‌برد یا درون‌برد کنید.</string>
<string name="shared_string_delete_all_q">همه حذف شود؟</string>
<string name="delete_all_actions_message_q">آیا %d کنش فوری را حذف می‌کنید؟ (برگشت‌ناپذیر است)</string>
<string name="screen_timeout">زمان خاموشی صفحه</string>
<string name="width_limit_description">عرض وسیلهٔ نقلیهٔ خود را مشخص کنید. ممکن است محدودیت‌های مسیر برای وسایل نقلیهٔ عریض اِعمال شود.</string>
<string name="height_limit_description">ارتفاع وسیلهٔ نقلیهٔ خود را مشخص کنید. ممکن است محدودیت‌های مسیر برای وسایل نقلیهٔ بلند اِعمال شود.</string>
<string name="weight_limit_description">وزن وسیلهٔ نقلیهٔ خود را مشخص کنید. ممکن است محدودیت‌های مسیر برای وسایل نقلیهٔ سنگین اِعمال شود.</string>
<string name="shared_string_tones">تُن</string>
<string name="shared_string_meters">متر</string>
<string name="details_dialog_decr">نمایانی جزئیات اضافه‌تر روی نقشه را کنترل کنید</string>
<string name="shared_string_night_map">نقشهٔ شب</string>
<string name="shared_string_all_time">همیشه</string>
</resources>

View file

@ -2938,7 +2938,7 @@
<string name="poi_surface_metal_grid">Grille métallique</string>
<string name="poi_location_underground">Emplacement : souterrain</string>
<string name="poi_location_underwater">Emplacement : sous l\'eau</string>
<string name="poi_location_overground">Emplacement : au dessus du sol</string>
<string name="poi_location_overground">Emplacement : en surface</string>
<string name="poi_location_overhead">Emplacement : aérien</string>
<string name="poi_location_roof">Emplacement : toit</string>
<string name="poi_location_rooftop">Emplacement : dessus du toit</string>

View file

@ -3248,7 +3248,7 @@
<string name="analytics_pref_title">Analyses</string>
<string name="turn_screen_on_info">Afficher la carte sur l\'écran de verrouillage pendant la navigation.</string>
<string name="route_parameters_info">Paramètres de calcul d\'itinéraire pour le profil sélectionné: « %1$s».</string>
<string name="wake_time">Durée d\'allumage</string>
<string name="wake_time">Durée d\'allumage de lécran</string>
<string name="map_look_descr">Apparence de la carte</string>
<string name="map_look">Apparence de la carte</string>
<string name="general_settings_profile_descr">Thème de l\'application, unités, région</string>
@ -3716,7 +3716,7 @@
\n%2$s : Niveaux de zoom auxquels les tuiles originales seront visibles. En dehors de ces valeurs, il y aura une augmentation ou une diminution d\'échelle.</string>
<string name="turn_screen_on_navigation_instructions_descr">L\'écran s\'allumera pour afficher les instructions de navigation.</string>
<string name="turn_screen_on_wake_time_descr">Sélectionnez le temps d\'affichage de l\'écran après allumage (\"%1$s\" signifie pas d\'extinction).</string>
<string name="screen_timeout_descr">Limité par l\'option \"%1$s\" si elle est activée.</string>
<string name="screen_timeout_descr">Si l\'option \"%1$s\" est activée, le temps d\'activité en dépendra.</string>
<string name="expire_time_descr">Délai d\'expiration en minutes. Les tuiles en cache seront rechargées après ce délai. Laissez ce champ vide pour ne jamais rafraîchir les tuiles pour cette source.
\n
\nUn jour correspond à 1440 minutes.
@ -3744,8 +3744,17 @@
<string name="storage_format">Format de stockage</string>
<string name="map_source_zoom_levels">Définissez les niveaux de zoom minimum et maximum auxquels la carte en ligne sera affichée ou chargée.</string>
<string name="tiles_storage_descr">Sélectionnez comment les tuiles téléchargées seront stockées.</string>
<string name="default_screen_timeout">Délai système de veille écran</string>
<string name="default_screen_timeout">Délai par défaut de veille écran</string>
<string name="export_import_quick_actions_with_profiles_promo">Vous pouvez exporter ou importer les actions rapides avec les profils dapplication.</string>
<string name="shared_string_delete_all_q">Tout supprimer \?</string>
<string name="delete_all_actions_message_q">Voulez-vous vraiment supprimer définitivement %d actions rapides \?</string>
<string name="screen_timeout">Délai de veille de lécran</string>
<string name="height_limit_description">Indiquez la hauteur de votre véhicule, certaines restrictions d\'itinéraire peuvent s\'appliquer aux véhicules hauts.</string>
<string name="weight_limit_description">Indiquez le poids de votre véhicule, certaines restrictions d\'itinéraire peuvent s\'appliquer aux véhicules lourds.</string>
<string name="width_limit_description">Indiquez la largeur de votre véhicule, certaines restrictions d\'itinéraire peuvent s\'appliquer aux véhicules larges.</string>
<string name="shared_string_tones">sonneries</string>
<string name="shared_string_meters">mètres</string>
<string name="details_dialog_decr">Contrôler la visibilité des autres détails affichés sur la carte</string>
<string name="shared_string_night_map">Carte nocturne</string>
<string name="shared_string_all_time">Tout le temps</string>
</resources>

View file

@ -109,13 +109,13 @@
<string name="local_index_gpx_info_show">"
\n
\nMantén premido para opcións"</string>
<string name="gpx_info_subtracks">"Subpistas: %1$s "</string>
<string name="gpx_info_waypoints">"Puntos de pasaxe: %1$s "</string>
<string name="gpx_info_distance">"Distancia: %1$s (%2$s puntos) "</string>
<string name="gpx_info_start_time">"Hora do comezo: %1$tF, %1$tT "</string>
<string name="gpx_info_end_time">"Hora do remate: %1$tF, %1$tT "</string>
<string name="gpx_info_average_speed">"Velocidade media: %1$s "</string>
<string name="gpx_info_maximum_speed">"Velocidade máxima: %1$s "</string>
<string name="gpx_info_subtracks">Subpistas: %1$s</string>
<string name="gpx_info_waypoints">Puntos de pasaxe: %1$s</string>
<string name="gpx_info_distance">Distancia: %1$s (%2$s puntos)</string>
<string name="gpx_info_start_time">Hora do comezo: %1$tF, %1$tT</string>
<string name="gpx_info_end_time">Hora do remate: %1$tF, %1$tT</string>
<string name="gpx_info_average_speed">Velocidade media: %1$s</string>
<string name="gpx_info_maximum_speed">Velocidade máxima: %1$s</string>
<string name="gpx_info_avg_altitude">Altitude media: %1$s</string>
<string name="gpx_info_diff_altitude">Intre de altitudes: %1$s</string>
<string name="gpx_info_asc_altitude">Descenso/ascenso: %1$s</string>
@ -216,7 +216,7 @@
<string name="routing_attr_prefer_motorway_description">Preferir as autoestradas</string>
<string name="routing_attr_avoid_toll_name">Sen estradas de portaxe ou peaxe</string>
<string name="routing_attr_avoid_toll_description">Evitar estradas de portaxe ou peaxe</string>
<string name="routing_attr_avoid_unpaved_name">Non hai estradas sen pavimentar</string>
<string name="routing_attr_avoid_unpaved_name">Sen estradas non pavimentadas</string>
<string name="routing_attr_avoid_unpaved_description">Evitar estradas sen pavimentar</string>
<string name="routing_attr_avoid_ferries_name">Sen ferris</string>
<string name="routing_attr_avoid_ferries_description">Evitar ferris</string>
@ -250,7 +250,7 @@
<string name="local_osm_changes_delete_all_confirm">Eliminar %1$d modificación(s) no OSM\?</string>
<string name="shared_string_delete_all">Eliminar todo</string>
<string name="animate_routing_route_not_calculated">Calcular a ruta primeiro</string>
<string name="animate_routing_route">"Simular empregando a rota calculada "</string>
<string name="animate_routing_route">Simular empregando a rota calculada</string>
<string name="animate_routing_gpx">Simular empregando pista GPX</string>
<string name="shared_string_remember_my_choice">Lembrar escolla</string>
<string name="shared_string_and">e</string>
@ -284,7 +284,7 @@
<string name="driving_region_japan">Xapón</string>
<string name="driving_region_us">Estados Unidos</string>
<string name="driving_region_canada">Canadá</string>
<string name="driving_region_europe_asia">"Europa, Asia, Lationoamérica e semellantes"</string>
<string name="driving_region_europe_asia">Europa, Asia, Lationoamérica e semellantes</string>
<string name="driving_region_uk">Reino Unido, India e semellantes</string>
<string name="speak_title">Anunciar…</string>
<string name="speak_descr">Configura os avisos para nomes de rúas, avisos de tráfico (detencións forzosas, bandas sonoras), avisos de radar e límites de velocidade.</string>
@ -400,7 +400,7 @@
<string name="av_use_external_camera_descr">Empregar a aplicación do sistema para as imaxes.</string>
<string name="av_use_external_camera">Empregar a aplicación da cámara</string>
<string name="av_settings_descr">Configurar os axustes de son e vídeo.</string>
<string name="av_settings">"Axustes do son/vídeo "</string>
<string name="av_settings">Axustes do son/vídeo</string>
<string name="recording_error">Fallou a gravación</string>
<string name="recording_camera_not_available">A cámara non está dispoñíbel</string>
<string name="recording_is_recorded">Estase a gravar son/vídeo. Para detelo preme o trebello S/V.</string>
@ -422,7 +422,6 @@
<string name="osmand_srtm_short_description_80_chars">Plugin do OsmAnd para curvas de nivel sen conexión</string>
<string name="osmand_srtm_long_description_1000_chars">Este plugin fornece unha capa de sobreposición de curvas do nivel e unha capa de sombras da altitude (relevo) que poden ser amosadas nos mapas sen conexión do OsmAnd. Esta funcionalidade pode ser moi apreciada por atletas, camiñantes, sendeiristas e calquera que teña interese pola estrutura do relevo da paisaxe.
\n
\n
\nOs datos globais (entre os 70 graos norte e os 70 graos sul) están baseados nas medicións do SRTM (Misión Topográfica con Radar da Lanzadeira Espacial) e ASTER (Radiómetro Espacial Avanzado de Emisión Térmica e Reflexión) e instrumentos de imaxes a bordo do Terra, o satélite máis importante do Sistema de Observación Terrestre da NASA. ASTER é un esforzo cooperativo entre a NASA, o Ministerio de Economía do Xapón, Comercio e Industria (METI) e Sistemas Espaciais Xaponeses (J-spaceystems).</string>
<string name="map_widget_distancemeasurement">Medición de distancias</string>
<string name="audionotes_location_not_defined">Preme \'Empregar localización…\' para engadir unha nota á localización.</string>
@ -507,9 +506,9 @@
<string name="interrupt_music">Deter a música</string>
<string name="osmand_play_title_30_chars">Mapas e navegación OsmAnd</string>
<string name="osmand_short_description_80_chars">Visualización e navegación móbil de mapas globais do OSM con e sen conexión</string>
<string name="osmand_long_description_1000_chars">"OsmAnd (Indicacións de navegación automatizadas do OSM)
<string name="osmand_long_description_1000_chars">OsmAnd (Indicacións de navegación automatizadas do OSM)
\n
\n O OsmAnd é unha aplicación de navegación de código aberto con acceso a unha ampla variedade de datos globais do OSM. Tódolos mapas dos datos (mapas vectoriais ou teselas) poden seren almacenados no cartón de memoria do teléfono móbil para empregalos sen conexión. O OsmAnd tamen fornece a funcionalidade de cálculo de rotas sen conexión, incluíndo a guía por voz paso a paso.
\n O OsmAnd é unha aplicación de navegación de código aberto con acceso a unha ampla variedade de datos globais do OSM. Tódolos datos do mapa (mapas vectoriais ou teselas) poden ser almacenados no cartón de memoria do teléfono móbil para empregalos sen conexión. O OsmAnd tamen fornece a funcionalidade de cálculo de rotas sen conexión, incluíndo a guía por voz paso a paso.
\n
\n Algunhas das funcións principais:
\n - Funcionalidade completa sen conexión (os mapas vectoriais ou de teselas baixados almacénanse no cartafol que se escolla)
@ -517,18 +516,18 @@
\n - Pódense baixar mapas de países ou rexións de xeito directo dende a aplicación
\n - É posíbel sobrepor varias capas de mapas, coma pistas de GPX ou de navegación, puntos de interese (PDI), favoritos, curvas do nivel, paraxes de transporte público ou mapas adicionais con transparencia regulábel
\n - Procura sen conexión dos enderezos e lugares (PDI)
\n - Cálculo de rotas sen conexión para distancias curtas (experimental)
\n - Modos para automóbil, bicicleta e peóns, con:
\n - Vistas de día e noite automatizadas opcionais
\n - Achegamento opcional do mapa dependendo da velocidade
\n - Aliñamento opcional do mapa dependendo do compás ou da dirección do movemento
\n - Guía opcional de faixas ou carrís da estrada, límites de velocidade, voces gravadas e TTS
\n - Cálculo de rotas sen conexión para distancias medias
\n - Modos para automóbil, bicicleta e peóns, opcionalmente con:
\n - Cambio de vista diurna e nocturna automática
\n - Achegamento do mapa dependendo da velocidade
\n - Aliñamento do mapa dependendo do compás ou da dirección do movemento
\n - Guía de faixas ou carrís da estrada, límites de velocidade, voces gravadas e TTS
\n
\n Limitacións desta versión de balde do OsmAnd:
\n - O número de mapas a baixar está limitado
\n - Non hai acceso ós puntos de interese (PDI) da Wikipedia sen conexión
\n
\n O OsmAnd está a ser desenvolvido activamente e o noso proxecto e o seu progreso futuro depende da contribución financeira para financia-lo desenvolvemento e as probas das funcionalidades novas. Coida a posibilidade de mercar o OsmAnd+ ou de financiar funcións novas específicas ou de facer unha doazón xeral no osmand.net."</string>
\n O OsmAnd está a ser desenvolvido activamente e o noso proxecto e o seu progreso futuro depende da contribución financeira para financia-lo desenvolvemento e as probas das funcionalidades novas. Coida a posibilidade de mercar o OsmAnd+ ou de financiar funcións novas específicas ou de facer unha doazón xeral no osmand.net.</string>
<string name="osmand_plus_play_title_30_chars">Mapas e navegación de OsmAnd+</string>
<string name="osmand_plus_short_description_80_chars">Visualización e navegación móbil de mapas globais para mapas de OSM con e sen conexión</string>
<string name="osmand_plus_long_description_1000_chars">O OsmAnd+ (Indicacións da navegación automatizadas do OSM) é un aplicativo de navegación de código aberto con acceso a unha ampla variedade de datos globais do OSM. Tódolos mapas dos datos (mapas vectoriais ou teselas) poden seren almacenados no cartón de memoria do teléfono para empregalos sen conexión. O OsmAnd tamén fornece funcionalidade de cálculo de rotas sen conexión, incluíndo a guía por voz paso a paso.
@ -559,7 +558,7 @@
<string name="map_widget_renderer">Estilo do mapa</string>
<string name="layer_map_appearance">Configurar a pantalla</string>
<string name="show_lanes">Faixas ou carrís</string>
<string name="avoid_unpaved">Non hai estradas sen pavimentar</string>
<string name="avoid_unpaved">Sen estradas non pavimentadas</string>
<string name="avoid_ferries">Sen ferris</string>
<string name="avoid_in_routing_title">Evitar…</string>
<string name="map_widget_fluorescent">Rotas fluorescentes</string>
@ -1036,7 +1035,7 @@
<string name="continuous_rendering_descr">Amosar renderizado continuo no canto dunha imaxe de cada vez.</string>
<string name="rendering_exception">Non foi posíbel debuxar a área escollida.</string>
<string name="show_point_options">Empregar a localización…</string>
<string name="renderer_load_sucess">"Carregouse a visualización "</string>
<string name="renderer_load_sucess">Carregouse a visualización</string>
<string name="renderer_load_exception">Non foi posíbel cargar o visualizador (renderizador).</string>
<string name="renderers">Renderizador vectorial</string>
<string name="renderers_descr">Escolle a aparencia da visualización (renderizado) dos mapas</string>
@ -1446,7 +1445,7 @@
<string name="lang_os">Osetiano</string>
<string name="lang_eo">Esperanto</string>
<string name="lang_es_ar">Español da Arxentina</string>
<string name="lang_nb">"Noruegués Bokmål "</string>
<string name="lang_nb">Noruegués Bokmål</string>
<string name="lang_vo">Volapük</string>
<string name="lang_th">Tailandés</string>
<string name="lang_te">Telugu</string>
@ -1571,7 +1570,7 @@ Lon %2$s</string>
<string name="we_really_care_about_your_opinion">A túa opinión e comentarios son valorados.</string>
<string name="rate_this_app">Avalía esta aplicación</string>
<string name="rate_this_app_long">Dálle unha valoración ó OsmAnd na Google Play</string>
<string name="user_hates_app_get_feedback">Díganos o porque.</string>
<string name="user_hates_app_get_feedback">Dinos o por que.</string>
<string name="user_hates_app_get_feedback_long">Por favor, fáganos saber calquera suxestión.</string>
<string name="delete_change">Eliminar modificación</string>
<string name="successfully_uploaded_pattern">Subido {0}/{1}</string>
@ -1795,7 +1794,7 @@ Lon %2$s</string>
<string name="looking_up_address">Estase a procurar o enderezo</string>
<string name="rendering_attr_currentTrackColor_description">Cor de GPX</string>
<string name="rendering_attr_currentTrackWidth_description">Largo do GPX</string>
<string name="free">"Libre %1$s "</string>
<string name="free">Libre %1$s</string>
<string name="rendering_attr_roadStyle_description">Estilo das estradas</string>
<string name="routing_attr_avoid_stairs_name">Sen escadas</string>
<string name="routing_attr_avoid_stairs_description">Evitar escadas</string>
@ -1969,7 +1968,7 @@ Lon %2$s</string>
<string name="city_type_district">Distrito</string>
<string name="city_type_neighbourhood">Barrio</string>
<string name="map_widget_search">Procurar</string>
<string name="shared_string_is_open_24_7">Aberto 24/7</string>
<string name="shared_string_is_open_24_7">Aberto 24h</string>
<string name="storage_directory_card">Cartón de memoria</string>
<string name="coords_format">Formato das coordenadas</string>
<string name="coords_format_descr">Formato das coordenadas xeográficas.</string>
@ -2437,7 +2436,7 @@ Lon %2$s</string>
<string name="rendering_value_walkingRoutesScopeOSMC_name">Cor por afiliación da rede</string>
<string name="average">Media</string>
<string name="of">%1$d de %2$d</string>
<string name="ascent_descent">"Subida/Descenso "</string>
<string name="ascent_descent">Subida/Descenso</string>
<string name="max_min">Máx/Mín</string>
<string name="markers_remove_dialog_msg">Eliminar marcaxe do mapa \"%s\"\?</string>
<string name="edit_map_marker">Editar marcaxe do mapa</string>
@ -2450,7 +2449,8 @@ Lon %2$s</string>
<string name="ask_for_location_permission">Para proseguer, permite acceder á localización ó OsmAnd.</string>
<string name="thank_you_for_feedback">Grazas polos teus comentarios</string>
<string name="poi_cannot_be_found">Non foi posíbel atopar o nó ou a vía.</string>
<string name="search_no_results_feedback">Sen resultados de procura\? Mándanos a túa opinión</string>
<string name="search_no_results_feedback">Sen resultados de procura\?
\nMándanos a túa opinión</string>
<string name="commiting_way">Estase a envíar camiño…</string>
<string name="increase_search_radius_to">Aumentar o raio de procura para %1$s</string>
<string name="shared_string_world">Mundo</string>
@ -2534,7 +2534,7 @@ Lon %2$s</string>
<string name="topo_render_descr">Para practicar andainas, sendeirismo e ciclismo na natureza. Lexíbel ao ar libre. Camiños e obxectos naturais en contraste, diferentes tipos de percorridos, opcións avanzadas en curvas de nivel, detalles adicionais. Axustar a integridade da superficie, distingue a calidade do camiño. Sen modo noite.</string>
<string name="mapnik_render_descr">Antigo estilo predefinido do Mapnik. Cores semellantes ó Mapnik.</string>
<string name="touring_view_render_descr">Estilo turístico con alto contraste e máximo detalle. Inclúe todas as opcións do estilo predefinido do OsmAnd, mentres que amosa tantos detalles como sexa posíbel, en camiños, sendeiros e outros xeitos de viaxe. Clara distinción do \"atlas turístico\" entre tipos de camiños. Axeitado para emprego de día, de noite e ao ar libre.</string>
<string name="default_render_descr">Estilo de emprego xeral. Cidade densas amosadas de xeito limpi. Conta con curvas de nivel, percorridos, calidade da superficie, restricións de acceso, sinais, visualización de camiños segundo a escala SA e elementos de deportes acuáticos.</string>
<string name="default_render_descr">Estilo de emprego xeral. Cidade densas amosadas de xeito limpo. Conta con curvas de nivel, percorridos, calidade da superficie, restricións de acceso, sinais, visualización de camiños segundo a escala SA e elementos de deportes acuáticos.</string>
<string name="open_wikipedia_link_online">Abrir ligazón da Wikipedia en liña</string>
<string name="open_wikipedia_link_online_description">A ligazón abrirase nun navegador web.</string>
<string name="how_to_open_link">De que xeito abrir a ligazón\?</string>
@ -3167,6 +3167,8 @@ Lon %2$s</string>
\n
\n • Engade a opción de amosar o compás no mapa cunha regra de raio
\n
\n • Arreglado o rexistro de pistas en segundo plano
\n
\n • Melloradas as descargas de mapas en segundo plano
\n
\n• Volta a opción de \'Activar pantalla\'
@ -3266,7 +3268,7 @@ Lon %2$s</string>
<string name="analytics_pref_title">Análises</string>
<string name="turn_screen_on_info">Amosar o mapa na pantalla de bloqueo durante a navegación.</string>
<string name="route_parameters_info">Axustes para a navegación do perfil escollido \"%1$s\".</string>
<string name="wake_time">Hora de espertado</string>
<string name="wake_time">Tempo de espera da pantalla após acender</string>
<string name="units_and_formats">Unidades e formatos</string>
<string name="appearance">Aparencia</string>
<string name="map_look_descr">Aparencia do mapa</string>
@ -3480,10 +3482,10 @@ Lon %2$s</string>
<string name="monitoring_min_speed_descr_side_effect">Efecto secundario: No teu traxecto fallarán todos os treitos nos que non se cumprira o criterio de velocidade mínima (por exemplo, cando empurres a túa bicicleta por unha costa empinada). Ademais, non haberá información sobre os períodos de asueto, como as pausas. Isto ten efectos en calquera análise ou posprocesamento, como cando se trata de determinar a dura total da túa viaxe, o tempo en movemento ou a túa velocidade media.</string>
<string name="monitoring_min_speed_descr_recommendation">Recomendación: Proba primeiro a empregar a detección de movemento mediante o filtro de desprazamento mínimo de rexistro (B), pode producir mellores resultados e perderás menos datos. Se as pistas seguen a ser ruidosas a baixas velocidades, proba aquí con valores distintos de cero. Ten en conta que algunhas medicións poden non informar ningún valor de velocidade (algúns métodos baseados na rede), nese caso no se rexistraría ren.</string>
<string name="monitoring_min_speed_descr_remark">Observación: comprobacións de velocidade &gt; 0: A meirande parte dos chipsets de GPS informan un valor de velocidade só se o algoritmo determina que está en movemento. Polo tanto, o uso do axuste &gt; 0 neste filtro, en certo senso emprega a detección de movemento do conxunto de chips do GPS. Pero aínda se non se filtra aquí no intre da gravación, seguimos a empregar esta función no noso análise GPX para determinar a distancia corrixida, é dicir, o valor que se amosa nese campo é a distancia gravada en movemento.</string>
<string name="monitoring_min_accuracy_descr">Isto registrará só os puntos medidos cunha indicación de precisión mínima (en metros/pés, segundo o informado polo Android para o teu conxunto de chips). A precisión é a proximidade das medicións á posición real, e non está directamente relacionada coa precisión, que é a dispersión de medicións repetidas.</string>
<string name="monitoring_min_accuracy_descr">Isto rexistrará só os puntos medidos cunha indicación de precisión mínima (en metros/pés, segundo o informado polo Android para o teu conxunto de chips). A precisión é a proximidade das medicións á posición real, e non está directamente relacionada coa dispersión de medicións repetidas.</string>
<string name="monitoring_min_accuracy_descr_side_effect">Efecto secundario: Como resultado da filtraxe por precisión, poden fallar puntos por exemplo embaixo de pontes, baixo árbores, entre edificios altos ou con certas condicións climáticas.</string>
<string name="monitoring_min_accuracy_descr_recommendation">Recomendación: É difícil predicir o que se gravará e o que non, pode ser mellor apagar este filtro.</string>
<string name="monitoring_min_accuracy_descr_remark">Observación: Se o GPS houbese apagado de xeito inmediato antes dunha gravación, o primeiro punto medido podería ter unha precisión disminuída, polo que no noso código pode que queiramos agardar un segundo máis ou menos antes de gravar un punto (ou gravar o mellor de 3 puntos consecutivos, etc.), pero isto aínda non se implementou.</string>
<string name="monitoring_min_accuracy_descr_recommendation">Recomendación: É difícil predicir o que se gravará e o que non, polo que pode ser mellor desactivar este filtro.</string>
<string name="monitoring_min_accuracy_descr_remark">Observación: Se o GPS estiver apagado xusto antes dunha gravación, o primeiro punto medido podería ter unha precisión diminuída, polo que no noso código pode que queiramos agardar un segundo máis ou menos antes de gravar un punto (ou gravar o mellor de 3 puntos consecutivos, etc.), pero isto aínda non se implementou.</string>
<string name="monitoring_min_distance_descr">Este filtro evita que se graven puntos duplicados nos que pode haber moi pouco movemento real, e dá unha aparencia espacial máis agradábel ás pistas que non se procesan de xeito posterior.</string>
<string name="monitoring_min_distance_descr_side_effect">Efectos secundarios: Os períodos de asueto non se rexistran en absoluto ou só nun punto cada un. Os pequenos movementos (do mundo real) (por exemplo, cara os lados, para marcar un posíbel desviamento na túa viaxe) poden ser filtrados. O teu ficheiro contén menos información para o posprocesamento, e ten piores estatísticas ó filtrar os puntos obviamente redundantes no tempo de gravación, mentres que de xeito potencial mantén os aparellos causados pola má recepción ou os efectos do chipset do GPS.</string>
<string name="monitoring_min_distance_descr_recommendation">Recomendación: Un axuste de 5 metros pode funcionar ben se non precisas capturar detalles máis finos que iso, e non desexas capturar de xeito explícito os datos mentres estás en asueto.</string>
@ -3680,7 +3682,7 @@ Lon %2$s</string>
<string name="shared_string_min">Mín</string>
<string name="ui_customization_description">Personaliza a cantidade de elementos na \"Gabeta\", na \"Configuración do mapa\" e no \"Menú contextual\".
\n
\nDesactiva os plugins non enpregados, para agochar todos os seus controis da aplicación %1$s.</string>
\nDesactiva os plugins non empregados para agochar todos os seus controis. %1$s.</string>
<string name="ui_customization_short_descr">Elementos da gabeta, menú contextual</string>
<string name="ui_customization">Personalización da interface de usuario</string>
<string name="shared_string_drawer">Gabeta</string>
@ -3694,9 +3696,9 @@ Lon %2$s</string>
<string name="ltr_or_rtl_combine_via_slash_with_space">%1$s / %2$s</string>
<string name="osm_live_payment_subscription_management">"O pagamento será cobrado na túa conta da Google Play na confirmación da compra.
\n
\n  A subscrición é renovada de xeito automático, a menos que sexa desbotada antes da data de renovación. A túa conta será cobrada polo período de renovación (més/trimestre/ano) soamente na data de renovación.
\n A subscrición é renovada de xeito automático, a menos que sexa desbotada antes da data de renovación. A túa conta será cobrada polo período de renovación (més/trimestre/ano) soamente na data de renovación.
\n
\n  Podes xestionar e desbotar as túas subscricións entrando nos axustes da Google Play."</string>
\n Podes xestionar e desbotar as túas subscricións entrando nos axustes da Google Play."</string>
<string name="search_poi_types">Procurar tipos de PDI</string>
<string name="search_poi_types_descr">Combina tipos de PDI de diferentes categorías. Preme en \"trocar\" para marcar todo, preme o lado esquerdo para escoller unha categoría.</string>
<string name="download_unsupported_action">Acción %1$s non admitida</string>
@ -3767,7 +3769,7 @@ Lon %2$s</string>
<string name="turn_screen_on_power_button_descr">Premendo o botón de acendido do dispositivo acenderá a pantalla co OsmAnd na pantalla de bloqueo.</string>
<string name="turn_screen_on_proximity_sensor">Sensor de proximidade</string>
<string name="keep_screen_on">Manter a pantalla acendida</string>
<string name="screen_timeout_descr">Limitado por \"%1$s\", se está activado.</string>
<string name="screen_timeout_descr">Se a opción \"%1$s\" está activada, o tempo de actividade dependerá diso.</string>
<string name="one_image_per_tile">Un ficheiro de imaxe por tesela</string>
<string name="online_map_name_helper_text">Fornece un nome para a fonte do mapa en liña.</string>
<string name="online_map_url_helper_text">Insire ou pega a URL da fonte en liña.</string>
@ -3787,5 +3789,17 @@ Lon %2$s</string>
\n Unha semana son 10080 minutos.
\n Un mes son 43829 minutos.</string>
<string name="tiles_storage_descr">Escolle de que xeito serán almacenadas as teselas baixadas.</string>
<string name="default_screen_timeout">Tempo de espera da pantalla do sistema</string>
<string name="default_screen_timeout">Tempo de espera da pantalla por defecto</string>
<string name="export_import_quick_actions_with_profiles_promo">Podes exportar ou importar accións rápidas con perfís de aplicación.</string>
<string name="shared_string_delete_all_q">Eliminar todo\?</string>
<string name="delete_all_actions_message_q">Eliminar de xeito irrevogábel %d accións rápidas\?</string>
<string name="screen_timeout">Tempo de espera da pantalla</string>
<string name="height_limit_description">Fornece a altura do teu vehículo, algunhas restricións de ruta poden ser aplicadas para vehículos altos.</string>
<string name="weight_limit_description">Fornece o peso do teu vehículo, algunhas restricións de ruta poden ser aplicadas a vehículos pesados.</string>
<string name="width_limit_description">Fornece a largura do teu vehículo. Algunhas restricións de ruta poden ser aplicadas a vehículos largos.</string>
<string name="shared_string_tones">tons</string>
<string name="shared_string_meters">metros</string>
<string name="details_dialog_decr">Controlar a visibilidade dos detalles adicionais amosados no mapa</string>
<string name="shared_string_night_map">Mapa de noite</string>
<string name="shared_string_all_time">Todo o tempo</string>
</resources>

View file

@ -3221,7 +3221,7 @@
<string name="analytics_pref_title">ניתוח</string>
<string name="turn_screen_on_info">להציג מפה על מסך הנעילה במהלך הניווט.</string>
<string name="route_parameters_info">הגדרות לניווט בפרופיל הנבחר: „%1$s”.</string>
<string name="wake_time">זמן התעוררות</string>
<string name="wake_time">תפוגת זמן לאחר התעוררות</string>
<string name="units_and_formats">יחידות ותבניות</string>
<string name="appearance">מראה</string>
<string name="map_look_descr">מראה המפה</string>
@ -3769,9 +3769,18 @@
<string name="turn_screen_on_wake_time_descr">לבחור את זמן תפוגת שומר המסך של המערכת לאחר ההתעוררות. („%1$s” - ללא זמן תפוגה.)</string>
<string name="keep_screen_on">להשאיר את המסך פעיל</string>
<string name="keep_screen_off">להשאיר את המסך כבוי</string>
<string name="screen_timeout_descr">מוגבל על ידי „%1$s”, אם פעיל.</string>
<string name="default_screen_timeout">תפוגת שומר המסך של המערכת</string>
<string name="screen_timeout_descr">אם האפשרות „%1$s” פעילה, זמן הפעילות יהיה תלוי בה.</string>
<string name="default_screen_timeout">ברירת מחדל של תפוגת שומר המסך</string>
<string name="export_import_quick_actions_with_profiles_promo">ניתן לייצא או לייבא פעולות מהירות עם פרופילי יישומון.</string>
<string name="shared_string_delete_all_q">למחוק הכול\?</string>
<string name="delete_all_actions_message_q">למחוק %d פעולות מהירות באופן בלתי הפיך\?</string>
<string name="screen_timeout">תפוגת זמן שומר מסך</string>
<string name="width_limit_description">נא לציין את רוחב כלי הרכב שלך, יתכן שחלות מגבלות מעבר על כלי רכב רחבים.</string>
<string name="height_limit_description">נא לציין את גובה כלי הרכב שלך, יתכן שחלות מגבלות מעבר על כלי רכב גבוהים.</string>
<string name="weight_limit_description">נא לציין את משקל כלי הרכב שלך, יתכן שחלות מגבלות מעבר על כלי רכב כבדים.</string>
<string name="shared_string_tones">גוונים</string>
<string name="shared_string_meters">מטרים</string>
<string name="details_dialog_decr">שליטה בהופעה של פירוט נוסף על המפה</string>
<string name="shared_string_night_map">מפת לילה</string>
<string name="shared_string_all_time">כל הזמן</string>
</resources>

View file

@ -920,7 +920,7 @@
<string name="prefer_in_routing_descr">Preferisci autostrade.</string>
<string name="prefer_motorways">Preferisci le autostrade</string>
<string name="prefer_in_routing_title">Preferisci…</string>
<string name="av_def_action_choose">Su richiesta\?</string>
<string name="av_def_action_choose">Chiedi</string>
<string name="item_checked">segnato</string>
<string name="item_unchecked">non segnato</string>
<string name="access_arrival_time">Orario di arrivo</string>
@ -2563,7 +2563,7 @@
<string name="one_tap_active">\'Un tap\' attivo</string>
<string name="empty_state_av_notes">Prendi delle note!</string>
<string name="empty_state_av_notes_desc">Aggiungi note audio, video o foto in qualsiasi punto sulla mappa, utilizzando il widget o il menù contestuale.</string>
<string name="notes_by_date">Note ordinate per data</string>
<string name="notes_by_date">Note a/v per data</string>
<string name="by_date">Per data</string>
<string name="by_type">Per tipo</string>
<string name="modify_the_search_query">Cambia la tua ricerca.</string>
@ -3767,4 +3767,8 @@
<string name="lang_lmo">Lombardo</string>
<string name="custom_color">Colori personalizzati</string>
<string name="search_poi_types">Cerca in base al PDI</string>
<string name="export_import_quick_actions_with_profiles_promo">Puoi Esportare o importare le azioni veloci con i profili dell\'applicazione.</string>
<string name="shared_string_delete_all_q">Cancellare tutto\?</string>
<string name="delete_all_actions_message_q">Sei sicuro di volere cancellare definitivamente l\'azione veloce %d \?</string>
<string name="screen_timeout">Tempo del blocco schermo</string>
</resources>

View file

@ -3657,4 +3657,6 @@
<string name="expire_time">Utløpstid</string>
<string name="storage_format">Lagringsformat</string>
<string name="tiles_storage_descr">Velg hvordan nedlastede fliskart lagres.</string>
<string name="details_dialog_decr">Kontroller synlighet for ytterligere detaljer vist på kartet</string>
<string name="shared_string_night_map">Nattkart</string>
</resources>

View file

@ -3730,4 +3730,40 @@ Reprezentuje obszar: %1$s x %2$s</string>
<string name="profiles_for_action_not_found">Nie znaleziono profili wybranych dla tej czynności.</string>
<string name="index_item_world_basemap_detailed">Mapa przeglądowa świata (szczegółowa)</string>
<string name="unsupported_type_error">Nieobsługiwany typ</string>
<string name="turn_screen_on_power_button">Przycisk zasilania</string>
<string name="turn_screen_on_proximity_sensor">Czujnik zbliżeniowy</string>
<string name="keep_screen_on">Nie wyłączaj ekranu</string>
<string name="keep_screen_off">Nie włączaj ekranu</string>
<string name="pseudo_mercator_projection">Projekcja Pseudo-Mercator</string>
<string name="one_image_per_tile">Jeden plik obrazu na kafelek</string>
<string name="sqlite_db_file">Plik SQLiteDB</string>
<string name="online_map_name_helper_text">Podaj nazwę źródła mapy online.</string>
<string name="online_map_url_helper_text">Wpisz lub wklej URL dla źródła online.</string>
<string name="edit_online_source">Edytuj źródło online</string>
<string name="expire_time">Czas wygaśnięcia</string>
<string name="mercator_projection">Projekcja Mercatora</string>
<string name="storage_format">Format pamięci masowej</string>
<string name="map_source_zoom_levels">Wybierz minimalny i maksymalny poziom powiększenia na którym mapy online będą wyświetlane lub wczytywane.</string>
<string name="map_source_zoom_levels_descr">Te parametry wpłyną na wyświetlanie, gdy są używane jako mapa lub nakładka/podkład.
\n
\n%1$s: Mapa będzie ograniczona do wybranych powiększeń.
\n
\n%2$s: Poziomy powiększenia na których początkowe kafelki będą widoczne. Skalowanie w dół lub w górę nastąpi niezależnie od tych wartości.</string>
<string name="expire_time_descr">Czas wygaśnięcia w minutach. Buforowane kafelki zostaną ponownie załadowane po określonym czasie. Pozostaw to pole puste, aby nigdy nie odświeżać kafelków dla tego źródła.
\n
\nJeden dzień to 1440 minut.
\nJeden tydzień to 10 080 minut.
\nJeden miesiąc to 43 829 minut.</string>
<string name="tiles_storage_descr">Wybierz jak będą gromadzone pobrane kafelki.</string>
<string name="export_import_quick_actions_with_profiles_promo">Możesz importować lub eksportować szybkie czynności z profilami aplikacji.</string>
<string name="shared_string_delete_all_q">Usunąć wszystko\?</string>
<string name="delete_all_actions_message_q">Czy na pewno chcesz nieodwracalnie usunąć szybkie akcje %d\?</string>
<string name="screen_timeout">Wygaszanie ekranu</string>
<string name="screen_timeout_descr">Jeśli opcja \"%1$s\" jest włączona, czas aktywności będzie od niej zależeć.</string>
<string name="default_screen_timeout">Domyślne wygaszanie ekranu</string>
<string name="shared_string_tones">tony</string>
<string name="shared_string_meters">metry</string>
<string name="details_dialog_decr">Kontroluj widoczność dodatkowych szczegółów na mapie</string>
<string name="shared_string_night_map">Mapa nocna</string>
<string name="shared_string_all_time">Cały czas</string>
</resources>

View file

@ -3236,7 +3236,7 @@ Pôr do Sol: %2$s</string>
<string name="analytics_pref_title">Análises</string>
<string name="turn_screen_on_info">Mostrar mapa na tela de bloqueio durante a navegação.</string>
<string name="route_parameters_info">Configurações para roteamento no perfil selecionado \"%1$s\".</string>
<string name="wake_time">Tempo de despertar</string>
<string name="wake_time">Tempo limite após acordar</string>
<string name="units_and_formats">Unidades e formatos</string>
<string name="appearance">Aparência</string>
<string name="map_look_descr">Aparência do mapa</string>
@ -3728,7 +3728,7 @@ Pôr do Sol: %2$s</string>
\nUma semana é de 10 080 minutos.
\nUm mês é 43 829 minutos.</string>
<string name="tiles_storage_descr">Escolha como os mosaicos baixados serão armazenados.</string>
<string name="default_screen_timeout">Tempo limite da tela do sistema</string>
<string name="default_screen_timeout">Tempo limite da tela padrão</string>
<string name="shared_string_always">Sempre</string>
<string name="screen_control">Controle de tela</string>
<string name="system_screen_timeout_descr">Desligar a tela após o tempo limite da tela do sistema.</string>
@ -3743,7 +3743,7 @@ Pôr do Sol: %2$s</string>
<string name="turn_screen_on_wake_time_descr">Selecionar o tempo limite da tela depois de acordar. (\"%1$s\" não se aplica a tempo limite.)</string>
<string name="keep_screen_on">Manter a tela ligada</string>
<string name="keep_screen_off">Manter a tela desligada</string>
<string name="screen_timeout_descr">Limitado por \"%1$s\", se ativado.</string>
<string name="screen_timeout_descr">Se a opção \"%1$s\" estiver ativada, o tempo de atividade dependerá disso.</string>
<string name="pseudo_mercator_projection">Projeção pseudo-Mercator</string>
<string name="one_image_per_tile">Um arquivo de imagem por mosaico</string>
<string name="sqlite_db_file">Arquivo SQLiteDB</string>
@ -3753,4 +3753,13 @@ Pôr do Sol: %2$s</string>
<string name="export_import_quick_actions_with_profiles_promo">Você pode exportar ou importar ações rápidas com perfis de aplicativos.</string>
<string name="shared_string_delete_all_q">Excluir tudo\?</string>
<string name="delete_all_actions_message_q">Tem certeza de que deseja excluir irrevogavelmente %d ações rápidas\?</string>
<string name="screen_timeout">Tempo limite da tela</string>
<string name="width_limit_description">Forneça a largura do seu veículo. Algumas restrições de rotas podem ser aplicadas a veículos largos.</string>
<string name="height_limit_description">Forneça a altura do veículo, algumas restrições de rotas podem ser aplicadas para veículos altos.</string>
<string name="weight_limit_description">Forneça o peso do veículo, algumas restrições de rotas podem ser aplicadas a veículos pesados.</string>
<string name="shared_string_tones">tons</string>
<string name="shared_string_meters">metros</string>
<string name="details_dialog_decr">Controlar a visibilidade dos detalhes adicionais mostrados no mapa</string>
<string name="shared_string_night_map">Mapa noturno</string>
<string name="shared_string_all_time">Tempo todo</string>
</resources>

View file

@ -3717,7 +3717,7 @@
<string name="turn_screen_on_wake_time_descr">Selecione o tempo limite do ecrã após acordar. (\"%1$s\" não aplica tempo limite).</string>
<string name="keep_screen_on">Manter o ecrã ligado</string>
<string name="keep_screen_off">Manter o ecrã desligado</string>
<string name="screen_timeout_descr">Limitado por \"%1$s\", se ativado.</string>
<string name="screen_timeout_descr">Se a opção \"%1$s\" estiver ativada, o tempo de atividade dependerá disso.</string>
<string name="pseudo_mercator_projection">Projeção pseudo-Mercator</string>
<string name="one_image_per_tile">Um ficheiro de imagem por quadrícula</string>
<string name="sqlite_db_file">Ficheiro SQLiteDB</string>
@ -3739,5 +3739,17 @@
\nUma semana são 10 080 minutos.
\nUm mês são 43 829 minutos.</string>
<string name="tiles_storage_descr">Escolha como as quadrículas descarregadas serão armazenadas.</string>
<string name="default_screen_timeout">Tempo limite do ecrã do sistema</string>
<string name="default_screen_timeout">Padrão de tempo limite do ecrã</string>
<string name="width_limit_description">Forneça a largura do seu veículo, algumas restrições de rotas podem ser aplicadas a veículos largos.</string>
<string name="height_limit_description">Forneça a altura do seu veículo, algumas restrições de rotas podem ser aplicadas a veículos altos.</string>
<string name="weight_limit_description">Forneça o peso do seu veículo, algumas restrições de rotas podem ser aplicadas a veículos pesados.</string>
<string name="export_import_quick_actions_with_profiles_promo">Pode Exportar ou Importar ações rápidas com perfis de aplicações.</string>
<string name="shared_string_delete_all_q">Apagar tudo\?</string>
<string name="delete_all_actions_message_q">Tem certeza de que deseja apagar de forma irrevogável %d de ações rápidas\?</string>
<string name="screen_timeout">Tempo limite do ecrã</string>
<string name="shared_string_tones">tons</string>
<string name="shared_string_meters">metros</string>
<string name="details_dialog_decr">Controla a visibilidade de detalhes adicionais mostrados no mapa</string>
<string name="shared_string_night_map">Mapa noturno</string>
<string name="shared_string_all_time">O tempo todo</string>
</resources>

View file

@ -3795,4 +3795,21 @@
<string name="poi_pump_status_missing_beam">Состояние насоса: отсутствует рычаг</string>
<string name="poi_socket_tesla_standard_yes">Tesla standard</string>
<string name="poi_cuisine_suki">Суки (тайский горячий горшок)</string>
<string name="poi_seamark_water_level_awash">Уровень воды: наводнение</string>
<string name="poi_seamark_water_level_dry">Уровень воды: сухо</string>
<string name="poi_seamark_water_level_submerged">Уровень воды: погружено</string>
<string name="poi_seamark_water_level_part_submerged">Уровень воды: частично погружено</string>
<string name="poi_memorial_ghost_bike">Велосипед Ghost</string>
<string name="poi_psv_no">Доступ к PSV: нет</string>
<string name="poi_psv_yes">Доступ к PSV: да</string>
<string name="poi_checkpoint_type_needler">Игольник</string>
<string name="poi_seamark_water_level_floating">Уровень воды: плавающий</string>
<string name="poi_seamark_water_level_covers">Уровень воды: покрыт</string>
<string name="poi_psv_designated">Доступ к PSV: предписанный</string>
<string name="poi_fire_hydrant_type_pipe">Труба</string>
<string name="poi_seamark_water_level_below_mwl">Уровень воды: ниже среднего уровня</string>
<string name="poi_seamark_water_level_above_mwl">Уровень воды: выше среднего уровня</string>
<string name="poi_seamark_water_level_floods">Уровень воды: наводнение</string>
<string name="poi_coach_no">Доступ к автобусу: нет</string>
<string name="poi_coach_yes">Доступ к автобусу: да</string>
</resources>

View file

@ -190,7 +190,7 @@
<string name="wiki_around">Статьи Википедии рядом</string>
<string name="search_map_hint">Город или регион</string>
<string name="route_roundabout_short">Сверните на %1$d съезд</string>
<string name="upload_poi">Выгрузить POI</string>
<string name="upload_poi">Отправить POI</string>
<string name="route_calculation">Построение маршрута</string>
<string name="gpx_no_tracks_title">У вас пока нет файлов GPX</string>
<string name="gpx_no_tracks_title_folder">Вы также можете добавить файлы GPX в папку</string>
@ -392,7 +392,7 @@
<string name="gpx_visibility_txt">Видимость</string>
<string name="gpx_tags_txt">Теги</string>
<string name="shared_string_description">Описание</string>
<string name="validate_gpx_upload_name_pwd">Пожалуйста, укажите имя и пароль пользователя OSM для выгрузки файлов GPX.</string>
<string name="validate_gpx_upload_name_pwd">Пожалуйста, укажите имя и пароль пользователя OSM для отправки файлов GPX.</string>
<string name="default_buttons_support">Поддержка</string>
<string name="support_new_features">Поддержать разработку новых функций</string>
<string name="show_ruler_level">Показывать масштаб</string>
@ -402,9 +402,9 @@
<string name="offline_edition">Локальное редактирование</string>
<string name="offline_edition_descr">Всегда использовать редактирование на устройстве.</string>
<string name="update_poi_does_not_change_indexes">Изменение POI в приложении не меняет POI загруженные из интернета, однако все изменения сохраняются в локальный файл на устройстве.</string>
<string name="local_openstreetmap_uploading">Выгрузка…</string>
<string name="local_openstreetmap_were_uploaded">{0} POI/заметок выгружено</string>
<string name="local_openstreetmap_uploadall">Выгрузить все</string>
<string name="local_openstreetmap_uploading">Отправка…</string>
<string name="local_openstreetmap_were_uploaded">{0} POI/заметок отправлено</string>
<string name="local_openstreetmap_uploadall">Отправить все</string>
<string name="local_openstreetmap_upload">Отправить изменения в OSM</string>
<string name="local_openstreetmap_delete">Удалить правку</string>
<string name="local_openstreetmap_descr_title">Локальное дополнение:</string>
@ -473,8 +473,8 @@
<string name="route_successfully_saved_at">Маршрут успешно сохранён в «%1$s».</string>
<string name="filename_input">Имя файла: </string>
<string name="file_with_name_already_exist">Файл с таким именем уже существует.</string>
<string name="local_index_upload_gpx_description">Выгрузить файлы GPX в сообщество OSM. Они будут использованы для улучшения карты.</string>
<string name="local_index_items_uploaded">%1$d из %2$d объектов успешно загружены.</string>
<string name="local_index_upload_gpx_description">Отправить файлы GPX в сообщество OSM. Они будут использованы для улучшения карты.</string>
<string name="local_index_items_uploaded">%1$d из %2$d объектов успешно отправлены.</string>
<string name="local_index_mi_upload_gpx">Отправить в OSM</string>
<string name="show_more_map_detail">Детализированная карта</string>
<string name="show_more_map_detail_descr">Показывать детали (дороги и др.), начиная с мелких масштабов.</string>
@ -779,8 +779,8 @@
<string name="search_history_int_streets">Пересечение улиц: {0} x {1} в {2}</string>
<string name="search_history_building">Здание: {0}, {1}, {2}</string>
<string name="favorite">Избранное</string>
<string name="uploading_data">Загрузка данных…</string>
<string name="uploading">Загрузка…</string>
<string name="uploading_data">Отправка данных…</string>
<string name="uploading">Отправка…</string>
<string name="search_nothing_found">По вашему запросу ничего не найдено</string>
<string name="searching">Поиск…</string>
<string name="searching_address">Поиск адреса…</string>
@ -1907,9 +1907,9 @@
<string name="rendering_attr_currentTrackColor_name">Цвет трека GPX</string>
<string name="rendering_attr_currentTrackWidth_name">Толщина трека GPX</string>
<string name="no_updates_available">Нет доступных обновлений</string>
<string name="failed_to_upload">Не удалось закачать</string>
<string name="failed_to_upload">Не удалось отправить</string>
<string name="delete_change">Удалить изменения</string>
<string name="successfully_uploaded_pattern">Успешно загружены {0}/{1}</string>
<string name="successfully_uploaded_pattern">Отправлены {0}/{1}</string>
<string name="error_message_pattern">Ошибка: {0}</string>
<string name="we_really_care_about_your_opinion">Ваше мнение и отзывы ценятся.</string>
<string name="user_hates_app_get_feedback">Скажите нам почему.</string>
@ -1940,7 +1940,7 @@
<string name="working_days">Рабочие дни</string>
<string name="favourites">Избранные</string>
<string name="saved_at_time">Успешно сохранён в: %1$s</string>
<string name="poi_deleted_localy">POI будут удалены после того как вы загрузите ваши изменения</string>
<string name="poi_deleted_localy">POI будут удалены после того как вы отправите ваши изменения</string>
<string name="show_gpx">Показать данные GPX</string>
<string name="poi_action_delete">удалить</string>
<string name="recent_places">Недавние места</string>
@ -2028,7 +2028,7 @@
<string name="plugins_menu_group">Плагины</string>
<string name="map_legend">Легенда</string>
<string name="shared_string_update">Обновить</string>
<string name="shared_string_upload">Загрузить</string>
<string name="shared_string_upload">Отправить</string>
<string name="osm_edit_created_poi">Создана OSM POI</string>
<string name="osmand_running_in_background">Запустить в фоновом режиме</string>
<string name="av_locations">Места</string>
@ -2104,7 +2104,7 @@
\nЕсли вы любите OsmAnd и OSM и хотите поддержать их, данная подписка — отличный способ сделать это.</string>
<string name="select_map_marker">Выберите маркер</string>
<string name="map_markers_other">Другие маркеры</string>
<string name="upload_anonymously">Загрузить анонимно</string>
<string name="upload_anonymously">Отправить анонимно</string>
<string name="map_marker_1st">Первый маркер</string>
<string name="map_marker_2nd">Второй маркер</string>
<string name="shared_string_toolbar">Панель инструментов</string>
@ -2135,8 +2135,8 @@
<string name="download_files_error_not_enough_space">Недостаточно места!
\nНеобходимо {3} МБ временного хранилища и {1} МБ постоянного.
\n(Доступно только {2} МБ)</string>
<string name="upload_osm_note_description">Загрузите свою заметку OSM анонимно или используя свой профиль OpenStreetMap.org.</string>
<string name="upload_osm_note">Загрузить OSM заметку</string>
<string name="upload_osm_note_description">Отправьте свою заметку OSM анонимно или используя свой профиль OpenStreetMap.org.</string>
<string name="upload_osm_note">Отправить OSM заметку</string>
<string name="use_drawer_btn">Использовать меню</string>
<string name="use_dashboard_btn">Использовать панель управления</string>
<string name="dashboard_or_drawer_title">Панель управления или меню</string>
@ -2534,7 +2534,7 @@
\n• Карта масштабируется соответственно вашей скорости
\n• Поиск места по адресу, типу (паркинг, ресторан, отель, заправка, музей и т.д.) или географическим координатам
\n• Поддержка промежуточных точек маршрута
\n• Запись собственного или загрузка GPX трека и следование ему
\n• Запись собственного или отправка GPX трека и следование ему
\n</string>
<string name="osmand_extended_description_part3">Карта
\n• Отображает POI (точки интереса) около вас
@ -2558,12 +2558,12 @@
\n• Википедия на предпочитаемом вами языке может многое рассказать вам во время экскурсии по городу
\n• Остановки общественного транспорта (автобус, трамвай, поезд), включая названия маршрутов, помогут ориентироваться в новом городе
\n• GPS навигация в пешеходном режиме высчитывает маршрут, используя пешеходные тропы
\n• Загрузите и следуйте по маршруту GPX или запишите и поделитесь своим собственным
\n• Отправьте и следуйте по маршруту GPX или запишите и поделитесь своим собственным
\n</string>
<string name="osmand_extended_description_part7">Внесение вклада в OSM
\n• Сообщения об ошибках
\n• Загрузка треков GPX в OSM напрямую из программы
\n• Добавление точек интереса (POI) и загрузка их в OSM (или позже, если интернет недоступен)
\n• Отправка треков GPX в OSM напрямую из программы
\n• Добавление точек интереса (POI) и отправка их в OSM (или позже, если интернет недоступен)
\n</string>
<string name="osmand_plus_extended_description_part1">OsmAnd+ (OSM Automated Navigation Directions) — картографическая и навигационная программа с доступом к свободным, мировым и высококачественным данным OSM.
\n Получайте наслаждение от голосовой и визуальной навигации, просматривайте точки интереса (англ. POI, points of interest), создавайте и управляйте треками GPX, используйте визуализацию контурных линий и данных высот, переключайтесь между режимами автомобиль, велосипед и пешеход, редактируйте данные OSM и многое другое.
@ -2629,8 +2629,8 @@
\n• Отображение контурных линий и затенения высот (через дополнительный плагин)</string>
<string name="osmand_plus_extended_description_part7">Непосредственный вклад в OSM
\n • Сообщения об ошибках в данных
\n • Загрузка GPX треков в OSM непосредственно из приложения
\n • Добавление точек интереса (POI) и непосредственная загрузка их в OSM (или позже, если в автономном режиме)
\n • Отправка GPX треков в OSM непосредственно из приложения
\n • Добавление точек интереса (POI) и непосредственная отправка их в OSM (или позже, если в автономном режиме)
\n • Возможность записи путешествие в фоновом режиме (в то время, как устройство находится в спящем режиме)
\n OsmAnd это активно развивающееся программное обеспечение с открытым исходным кодом. Каждый может внести свой вклад в приложение, сообщая об ошибках, улучшая переводы или кодируя новые функции. Кроме того, проект опирается на финансовые взносы для финансирования разработки и тестирования новых функциональных возможностей.
\n</string>
@ -3241,7 +3241,7 @@
<string name="coordinates_format_info">Выбранный формат будет применён во всём приложении.</string>
<string name="pref_selected_by_default_for_profiles">Параметр выбран по умолчанию для профилей: %s</string>
<string name="route_parameters_info">Настройки для маршрутизации в выбранном профиле «%1$s».</string>
<string name="wake_time">Время пробуждения</string>
<string name="wake_time">Время работы после пробуждения</string>
<string name="appearance">Внешний вид</string>
<string name="configure_navigation">Настроить навигацию</string>
<string name="screen_alerts_descr">Предупреждения отображаются в левом нижнем углу во время навигации.</string>
@ -3525,7 +3525,7 @@
<string name="login_and_pass">Имя пользователя и пароль</string>
<string name="plugin_global_prefs_info">Эти настройки применяются ко всем профилям.</string>
<string name="osm_editing">Редактирование OSM</string>
<string name="osm_edits_view_descr">Просмотр ваших исправлений или ошибок OSM, ещё не загруженных в %1$s. Загруженные точки больше не будут отображаться.</string>
<string name="osm_edits_view_descr">Просмотр ваших исправлений или ошибок OSM, ещё не отправленных в %1$s. Отправленные точки больше не будут отображаться.</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Значок, отображаемый во время навигации или движения.</string>
<string name="select_map_icon_descr">Значок, отображаемый в состоянии покоя.</string>
@ -3622,7 +3622,7 @@
\n
\nМожно отключить неиспользуемые плагины, чтобы скрыть их элементы управления. %1$s.</string>
<string name="ui_customization_short_descr">Элементы панели, контекстное меню</string>
<string name="shared_string_drawer">Панель</string>
<string name="shared_string_drawer">Боковое меню</string>
<string name="divider_descr">Элементы ниже разделённые делителем.</string>
<string name="shared_string_items">Элементы</string>
<string name="ui_customization">Настройка интерфейса</string>
@ -3727,7 +3727,7 @@
<string name="gpx_parse_error">OsmAnd сформировал GPX не совсем правильно, пожалуйста, свяжитесь со службой поддержки для дальнейшего расследования.</string>
<string name="turn_screen_on_navigation_instructions_descr">Каждая навигационная инструкция включает экран.</string>
<string name="turn_screen_on_navigation_instructions">Инструкции по навигации</string>
<string name="screen_timeout_descr">Если используется, ограничено «%1$s».</string>
<string name="screen_timeout_descr">Если функция «%1$s» включена, время работы будет зависеть от неё.</string>
<string name="turn_screen_on_wake_time_descr">Время работы экрана после включения. («%1$s» отключает выключение экрана.)</string>
<string name="turn_screen_on_power_button_descr">Нажатие кнопки питания устройства включит экран с OsmAnd на переднем плане экрана блокировки.</string>
<string name="pseudo_mercator_projection">Псевдо-проекция Меркатора</string>
@ -3761,8 +3761,17 @@
<string name="screen_control">Управление экраном</string>
<string name="turn_screen_on_options_descr">Параметры включения экрана:</string>
<string name="turn_screen_on_descr">Настройки включения экрана (убедитесь, что перед блокировкой устройства OsmAnd находится на переднем плане):</string>
<string name="default_screen_timeout">Системная настройка отключения экрана</string>
<string name="default_screen_timeout">Настройка отключения экрана по умолчанию</string>
<string name="export_import_quick_actions_with_profiles_promo">Вы можете экспортировать или импортировать быстрые действия вместе с профилями.</string>
<string name="shared_string_delete_all_q">Удалить все\?</string>
<string name="delete_all_actions_message_q">Вы уверены, что хотите безвозвратно удалить %d быстрых действий\?</string>
<string name="screen_timeout">Время экрана</string>
<string name="width_limit_description">Укажите ширину автомобиля, для больших транспортных средств могут применяться ограничения на некоторых маршрутах.</string>
<string name="height_limit_description">Укажите высоту автомобиля, для больших транспортных средств могут применяться ограничения на некоторых маршрутах.</string>
<string name="weight_limit_description">Укажите вес автомобиля, для тяжёлых транспортных средств могут применяться ограничения на некоторых маршрутах.</string>
<string name="shared_string_tones">тонны</string>
<string name="shared_string_meters">метры</string>
<string name="details_dialog_decr">Управление отображением дополнительных деталей на карте</string>
<string name="shared_string_all_time">Всё время</string>
<string name="shared_string_night_map">Ночная карта</string>
</resources>

View file

@ -3732,4 +3732,5 @@
<string name="export_import_quick_actions_with_profiles_promo">Podes esportare o importare atziones lestras cun profilos de s\'aplicatzione.</string>
<string name="shared_string_delete_all_q">Iscantzellare totu\?</string>
<string name="delete_all_actions_message_q">Ses seguru de chèrrere iscantzellare definitivamente %d atziones lestras\?</string>
<string name="shared_string_all_time">Totu su tempus</string>
</resources>

View file

@ -3241,7 +3241,7 @@
<string name="analytics_pref_title">Analýzy</string>
<string name="turn_screen_on_info">Zobraziť mapu na zamknutej obrazovke počas navigácie.</string>
<string name="route_parameters_info">Nastavenia navigácie v zvolenom profile \"%1$s\".</string>
<string name="wake_time">Čas zobudenia</string>
<string name="wake_time">Časový limit obrazovky po prebudení</string>
<string name="units_and_formats">Jednotky &amp; formáty</string>
<string name="appearance">Zobrazenie</string>
<string name="map_look_descr">Zobrazenie mapy</string>
@ -3725,7 +3725,7 @@
<string name="unsupported_type_error">Nepodporovaný typ</string>
<string name="shared_string_always">Vždy</string>
<string name="turn_screen_on_descr">Vyberte možnosti prebudenia obrazovky (pri uzamknutí zariadenia sa uistite, že je OsmAnd v popredí):</string>
<string name="screen_timeout_descr">Limitované \"%1$s\", ak je povolené.</string>
<string name="screen_timeout_descr">Ak je voľba \"%1$s\" zapnutá, čas aktivity bude na nej závisieť.</string>
<string name="one_image_per_tile">Jeden obrazový súbor na dlaždicu</string>
<string name="system_screen_timeout">Použiť systémový časový limit obrazovky</string>
<string name="turn_screen_on_options_descr">Možnosti prebudenia obrazovky:</string>
@ -3760,5 +3760,17 @@
\nJeden deň je 1440 minút.
\nJeden týždeň je 10 080 minút.
\nJeden mesiac je 43 829 minút.</string>
<string name="default_screen_timeout">Systémový časový limit obrazovky</string>
<string name="default_screen_timeout">Predvolený časový limit obrazovky</string>
<string name="export_import_quick_actions_with_profiles_promo">Rýchle akcie môžete exportovať a importovať spolu s profilmi aplikácie.</string>
<string name="shared_string_delete_all_q">Odstrániť všetko\?</string>
<string name="delete_all_actions_message_q">Naozaj chcete nevratne odstrániť %d rýchlych akcií\?</string>
<string name="screen_timeout">Časový limit obrazovky</string>
<string name="width_limit_description">Zadajte šírku vášho vozidla, pretože na trase môžu byť obmedzenia pre široké vozidlá.</string>
<string name="height_limit_description">Zadajte výšku vášho vozidla, pretože na trase môžu byť obmedzenia pre vysoké vozidlá.</string>
<string name="weight_limit_description">Zadajte hmotnosť vášho vozidla, pretože na trase môžu byť obmedzenia pre ťažké vozidlá.</string>
<string name="shared_string_tones">tony</string>
<string name="shared_string_meters">metre</string>
<string name="details_dialog_decr">Ovládajte viditeľnosť ďalších detailov zobrazených na mape</string>
<string name="shared_string_night_map">Nočná mapa</string>
<string name="shared_string_all_time">Vždy</string>
</resources>

View file

@ -880,7 +880,7 @@
<string name="shared_string_history">Geçmiş</string>
<string name="uploading_data">Veri yükleniyor…</string>
<string name="uploading">Yükleniyor…</string>
<string name="search_nothing_found">Sonuç bulunamadı</string>
<string name="search_nothing_found">Hiçbir şey bulunamadı</string>
<string name="hint_search_online">Çevrim içi arama: Ev numarası, sokak, şehir</string>
<string name="search_offline_address">Çevrim dışı arama</string>
<string name="route_general_information">Toplam uzaklık %1$s, seyahat süresi %2$d s %3$d dak.</string>
@ -1619,7 +1619,7 @@
<string name="shared_string_waypoint">Mevki</string>
<string name="selected_gpx_info_show">"
\n
\nGörmek için harita üzerinde basılı tutun"</string>
\nHaritada görüntülemek için uzun dokunun"</string>
<string name="delay_navigation_start">Otomatik dönüş rehberlik dönüş başlayın</string>
<string name="gpx_info_subtracks">Alt-rotalar: %1$s</string>
<string name="gpx_info_waypoints">Yol işaretleri: %1$s</string>
@ -2603,7 +2603,7 @@
<string name="analytics_pref_title">Analytics</string>
<string name="turn_screen_on_info">Navigasyon sırasında haritayı kilit ekranında göster.</string>
<string name="route_parameters_info">Seçili profildeki yönlendirme ayarları \"%1$s\".</string>
<string name="wake_time">Uyanma zamanı</string>
<string name="wake_time">Uyandıktan sonra zaman aşımı</string>
<string name="units_and_formats">Birimler ve biçimler</string>
<string name="appearance">Görünüm</string>
<string name="map_look_descr">Harita görünümü</string>
@ -3695,7 +3695,7 @@
<string name="turn_screen_on_wake_time_descr">Uyandıktan sonra ekran zaman aşımını seçin. (\"%1$s\" zaman aşımı uygulamaz.)</string>
<string name="keep_screen_on">Ekranıık tut</string>
<string name="keep_screen_off">Ekranı kapalı tut</string>
<string name="screen_timeout_descr">Etkinse \"%1$s\" ile sınırlıdır.</string>
<string name="screen_timeout_descr">\"%1$s\" seçeneği etkinleştirilirse, etkinlik süresi buna bağlı olacaktır.</string>
<string name="pseudo_mercator_projection">Pseudo-Mercator projeksiyon</string>
<string name="one_image_per_tile">Döşeme başına bir görüntü dosyası</string>
<string name="sqlite_db_file">SQLiteDB dosyası</string>
@ -3717,8 +3717,17 @@
\nBir hafta 10 080 dakikadır.
\nBir ay 43 829 dakikadır.</string>
<string name="tiles_storage_descr">İndirilen döşemelerin nasıl saklanacağını seçin.</string>
<string name="default_screen_timeout">Sistemin ekran zaman aşımı</string>
<string name="default_screen_timeout">Öntanımlı ekran zaman aşımı</string>
<string name="export_import_quick_actions_with_profiles_promo">Uygulama profilleri ile hızlı eylemleri içe veya dışa aktarabilirsiniz.</string>
<string name="shared_string_delete_all_q">Hepsini sil\?</string>
<string name="delete_all_actions_message_q">%d hızlı eylemi geri döndürülemez bir şekilde silmek istediğinizden emin misiniz\?</string>
<string name="screen_timeout">Ekran zaman aşımı</string>
<string name="width_limit_description">Aracınızın genişliğini belirtin, geniş araçlar için bazı güzergah kısıtlamaları geçerli olabilir.</string>
<string name="height_limit_description">Aracınızın yüksekliğini belirtin, yüksek araçlar için bazı güzergah kısıtlamaları geçerli olabilir.</string>
<string name="weight_limit_description">Aracınızın ağırlığını belirtin, ağır araçlar için bazı güzergah kısıtlamaları geçerli olabilir.</string>
<string name="shared_string_meters">metre</string>
<string name="details_dialog_decr">Haritada gösterilen ek ayrıntıların görünürlüğünü denetleyin</string>
<string name="shared_string_night_map">Gece haritası</string>
<string name="shared_string_all_time">Her zaman</string>
<string name="shared_string_tones">ton</string>
</resources>

View file

@ -1025,7 +1025,7 @@
<string name="av_camera_focus_edof">Збільшення глибини різкості</string>
<string name="av_camera_focus_infinity">Фокус встановлюється на нескінченність</string>
<string name="av_photo_play_sound">Відтворювати звук затвору камери</string>
<string name="av_photo_play_sound_descr">Під час знімкування відтворювати звук.</string>
<string name="av_photo_play_sound_descr">Програвання звуку затвора камери.</string>
<string name="osmand_net_previously_installed">Всі локальні дані зі старого встановленого застосунку будуть підтримуватися новим, але Закладки потрібно експортувати зі старого застосунку та імпортувати в новий.</string>
<string name="speak_speed_limit">Обмеження швидкості</string>
<string name="speak_cameras">Камери детектування швидкості</string>
@ -1076,7 +1076,7 @@
<string name="gpx_file_is_empty">Порожній GPX-файл</string>
<string name="shared_string_tracks">Треки</string>
<string name="shared_string_my_favorites">Закладки</string>
<string name="shared_string_my_places">Місця</string>
<string name="shared_string_my_places">Місця та треки</string>
<string name="rendering_value_pink_name">рожевий</string>
<string name="rendering_value_brown_name">Коричневий</string>
<string name="osmo_edit_color">Колір</string>
@ -1105,7 +1105,7 @@
<string name="rendering_attr_hideWoodScrubs_name">Дерева та кущі</string>
<string name="rendering_attr_buildings15zoom_name">Будинки на масштабі 15</string>
<string name="rendering_attr_moreDetailed_name">Докладніше</string>
<string name="rendering_attr_lessDetailed_name">Спрощено</string>
<string name="rendering_attr_lessDetailed_name">Спрощеніше</string>
<string name="rendering_attr_hideAccess_name">Обмеження доступу</string>
<string name="rendering_attr_showAccess_name">Показати обмеження доступу та збір</string>
<string name="rendering_attr_showSurfaceGrade_name">Показувати якість доріг</string>
@ -1514,7 +1514,7 @@
<string name="shared_string_go">Вирушаємо</string>
<string name="shared_string_do_not_use">Не використовувати</string>
<string name="shared_string_address">Адреса</string>
<string name="plugin_touringview_descr">Задіювання цього виду змінює стиль мапи OsmAnd на „Туристичну мапу“ – особливий стиль з докладною деталізацією для мандрівників та професіональних водіїв.
<string name="plugin_touringview_descr">Задіювання цього вигляду змінює стиль мапи OsmAnd на „Туристичну мапу“ – особливий стиль з докладною деталізацією для мандрівників та професіональних водіїв.
\n
\nЦей режим надає, на будь-якому масштабі, найбільшу кількість відомостей потрібну для подорожніх (дороги, путівці, стежки та орієнтири).
\n
@ -1658,7 +1658,7 @@
<string name="lang_mk">Македонська</string>
<string name="lang_fy">Західнофризька</string>
<string name="lang_als">Албанська (Тоскська)</string>
<string name="read_more">Детальніше</string>
<string name="read_more">Докладніше</string>
<string name="whats_new">Що нового у</string>
<string name="shared_string_upload">Вивантажити</string>
<string name="osm_edit_created_poi">OSM POI створено</string>
@ -1855,7 +1855,7 @@
<string name="shared_string_status">Стан</string>
<string name="shared_string_save_changes">Зберегти зміни</string>
<string name="shared_string_email_address">Адреса електронної пошти</string>
<string name="shared_string_read_more">Детальніше</string>
<string name="shared_string_read_more">Докладніше</string>
<string name="clear_updates_proposition_message">Завантажені поновлення можна вилучити і повернутися до початкової редакції мапи</string>
<string name="rec_split">Розбиття на кліпи</string>
<string name="rec_split_title">Використовувати розбиття на кліпи</string>
@ -2706,7 +2706,7 @@
<string name="show_images">Показати зображення</string>
<string name="off_road_render_descr">Для позашляхового руху, заснованого на стилі \"Topo\", та для використання із зеленими супутниковими зображеннями в якості підкладки. Зменшення товщини основної дороги, збільшення товщини доріжок, путівців, велосипедних та інших маршрутів.</string>
<string name="light_rs_render_descr">Простий і контрастний стиль для автомобільної навігації. Зручний для очей в нічному режимі. Ключові особливості: горизонталі, контрастні помаранчеві дороги, менш відволікаючі другорядні об\'єкти мапи.</string>
<string name="topo_render_descr">Для походів і катання на природі. Читання на відкритому повітрі. Контрастні дороги та природні об’єкти, різні типи маршрутів, розширені варіанти контуру, додаткові деталі. Регулювання цілісності поверхні відрізняє якість дороги. Нічного режиму немає.</string>
<string name="topo_render_descr">Для походів і катання на природі. Читання на відкритому повітрі. Контрастні дороги та природні об’єкти, різні типи маршрутів, розширені варіанти контуру, більше подробиць. Регулювання цілісності поверхні відрізняє якість дороги. Нічного режиму немає.</string>
<string name="mapnik_render_descr">Старий усталений стиль \"Mapnik\". Подібні кольори до \'Mapnik\'.</string>
<string name="touring_view_render_descr">Туристичний стиль з високим контрастом і щонайбільшою деталізацією. Включає всі усталені параметри стилю OsmAnd, відображаючи при цьому найдетальніші відомості, зокрема дороги, путі та інші шляхи подорожі. Чіткий \"туристичний атлас\" відрізняє типи доріг. Підходить для денного, нічного та зовнішнього використання.</string>
<string name="default_render_descr">Стиль загального призначення. Густі міста показані чисто. Особливості горизонталей, маршрутів, якості поверхні, обмеження доступу, дорожні щити, надання доріжок за шкалою SAC, пункти біловодних видів спорту.</string>
@ -3171,7 +3171,7 @@
<string name="turn_screen_on_router">Прокидатися перед поворотом</string>
<string name="turn_screen_on_time_descr">Відрегулюйте, як довго повинен бути ввімкнений екран.</string>
<string name="turn_screen_on_sensor">Використовувати датчик наближення</string>
<string name="turn_screen_on_sensor_descr">Вмикати екран махом руки.</string>
<string name="turn_screen_on_sensor_descr">Вмикати екран помахом руки.</string>
<string name="rendering_attr_highway_class_track_grade1_name">1 клас</string>
<string name="rendering_attr_highway_class_track_grade2_name">2 клас</string>
<string name="rendering_attr_highway_class_track_grade3_name">3 клас</string>
@ -3269,7 +3269,7 @@
<string name="pref_selected_by_default_for_profiles">Це налаштування вибране як усталене для профілів: %s</string>
<string name="turn_screen_on_info">Показати мапу на екрані блокування під час навігації.</string>
<string name="route_parameters_info">Налаштування для маршрутизації у вибраному профілі: %1$s.</string>
<string name="wake_time">Час пробудження</string>
<string name="wake_time">Час очікування екрана</string>
<string name="screen_alerts_descr">Попередження відображаються внизу зліва під час навігації.</string>
<string name="language_and_output">Мова та вивід</string>
<string name="osmand_settings_descr">Впливає на весь застосунок</string>
@ -3342,13 +3342,13 @@
\n
\n • Виправлення нічного режиму
\n
\n • Виправлено кілька проблем з маршрутизацією по всьому світу
\n • Виправлено кілька помилок з маршрутизацією по всьому світу
\n
\n • Оновлена основна мапа з детальнішою дорожньою мережею
\n • Оновлена основна мапа з докладнішою дорожньою мережею
\n
\n • Виправлено затоплені території по всьому світу
\n
\n • Лижні маршрути: Додано профіль висоти та складність маршруту до деталей маршруту
\n • Лижні маршрути: Додано профіль висоти та складність маршруту до подробиць маршруту
\n
\n • Інші виправлення
\n
@ -3403,7 +3403,7 @@
<string name="personal_category_name">Особистий</string>
<string name="shared_string_downloading_formatted">Завантаження %s</string>
<string name="rendering_value_thick_name">Товсто</string>
<string name="desert_render_descr">Для пустель та інших малонаселених ділянок. Більше докладностей.</string>
<string name="desert_render_descr">Для пустель та інших малонаселених ділянок. Докладніше.</string>
<string name="select_navigation_icon">Значок положення під час руху</string>
<string name="select_map_icon">Позиція значка в спокої</string>
<string name="delete_profiles_descr">Натиснення \"Застосувати\" видалить профілі назавжди.</string>
@ -3447,7 +3447,7 @@
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Значок відображається під час навігації чи переміщення.</string>
<string name="select_map_icon_descr">Значок показано в спокої.</string>
<string name="logcat_buffer_descr">Перевіряти та обмінюватися докладними журналами програми</string>
<string name="logcat_buffer_descr">Перевіряти та обмінюватися докладними журналами застосунку</string>
<string name="search_offline_geo_error">Не вдалося розібрати метод \'%s\'.</string>
<string name="permission_is_required">Для використання цього параметра потрібен дозвіл.</string>
<string name="monitoring_min_speed_descr">Це низькошвидкісний відсічний фільтр, щоб не записувати точки нижче певної швидкості. Це може призвести до плавнішого вигляду записаних треків при перегляді на мапі.</string>
@ -3719,7 +3719,7 @@
<string name="shared_string_add_profile">Додати профіль</string>
<string name="change_application_profile">Змінити профіль програми</string>
<string name="profiles_for_action_not_found">Не вдалося знайти жодного профілю.</string>
<string name="index_item_world_basemap_detailed">Оглядова карта світу (детальна)</string>
<string name="index_item_world_basemap_detailed">Всесвітня оглядова мапа (докладна)</string>
<string name="unsupported_type_error">Непідтримуваний тип</string>
<string name="gpx_parse_error">OsmAnd GPX недостатньо сформований. Зверніться до служби підтримки для подальшого дослідження.</string>
<string name="shared_string_always">Завжди</string>
@ -3738,7 +3738,7 @@
<string name="turn_screen_on_wake_time_descr">Час очікування екрану після увімкнення. («%1$s» вимикає вимкнення екрану.)</string>
<string name="keep_screen_on">Тримати екран увімкненим</string>
<string name="keep_screen_off">Тримати екран вимкненим</string>
<string name="screen_timeout_descr">Обмежено \"%1$s\", якщо ввімкнено.</string>
<string name="screen_timeout_descr">Використовується, тільки якщо \"%1$s\" вимкнено.</string>
<string name="pseudo_mercator_projection">Псевдопроєкція Меркатора</string>
<string name="one_image_per_tile">Один файл зображення на плитку</string>
<string name="sqlite_db_file">Файл SQLiteDB</string>
@ -3761,4 +3761,8 @@
\nОдин місяць - 43 829 хвилин.</string>
<string name="tiles_storage_descr">Виберіть спосіб зберігання завантажених плиток.</string>
<string name="default_screen_timeout">Системний час очікування екрану</string>
<string name="export_import_quick_actions_with_profiles_promo">Ви можете експортувати або імпортувати швидкі дії з профілями застосунку.</string>
<string name="shared_string_delete_all_q">Видалити все\?</string>
<string name="delete_all_actions_message_q">Ви дійсно бажаєте безповоротно видалити %d швидких дій\?</string>
<string name="screen_timeout">Час очікування екрана</string>
</resources>

View file

@ -3241,7 +3241,7 @@
<string name="analytics_pref_title">分析</string>
<string name="turn_screen_on_info">導航時在鎖定畫面上顯示地圖。</string>
<string name="route_parameters_info">在選定的設定檔「%1$s」的路徑設定。</string>
<string name="wake_time">喚醒時</string>
<string name="wake_time">喚醒後的逾</string>
<string name="units_and_formats">單位與格式</string>
<string name="appearance">外觀</string>
<string name="map_look_descr">地圖外觀</string>
@ -3735,7 +3735,7 @@
<string name="turn_screen_on_wake_time_descr">選取喚醒後的螢幕逾時。(「%1$s」不適用逾時。</string>
<string name="keep_screen_on">保持螢幕開啟</string>
<string name="keep_screen_off">保持螢幕關閉</string>
<string name="screen_timeout_descr">若啟用的話則由「%1$s」限制</string>
<string name="screen_timeout_descr">如果「%1$s」選項已啟用則活動時間將取決於它</string>
<string name="pseudo_mercator_projection">偽麥卡托投影</string>
<string name="mercator_projection">麥卡托投影</string>
<string name="one_image_per_tile">每個圖磚一個圖片檔案</string>
@ -3757,8 +3757,17 @@
\n一週是10080分鐘。
\n一個月是43829分鐘。</string>
<string name="tiles_storage_descr">選擇要如何儲存下載的圖磚。</string>
<string name="default_screen_timeout">系統螢幕逾時</string>
<string name="default_screen_timeout">預設螢幕逾時</string>
<string name="export_import_quick_actions_with_profiles_promo">您可以使用應用程式設定檔匯出或匯入快速動作。</string>
<string name="shared_string_delete_all_q">刪除全部?</string>
<string name="delete_all_actions_message_q">您確定您想要刪除 %d 快速動作嗎?</string>
<string name="screen_timeout">螢幕逾時</string>
<string name="width_limit_description">提供您的車輛寬度,某些路線的限制可能適用於超寬車輛。</string>
<string name="height_limit_description">提供您的車輛高度,某些路線的限制可能適用於超高車輛。</string>
<string name="weight_limit_description">提供您的車輛重量,某些路線的限制可能適用於重型車輛。</string>
<string name="shared_string_tones">色調</string>
<string name="shared_string_meters">公尺</string>
<string name="details_dialog_decr">控制地圖上顯示的額外詳細資訊可見程度</string>
<string name="shared_string_night_map">夜晚地圖</string>
<string name="shared_string_all_time">全部時間</string>
</resources>

View file

@ -21,6 +21,7 @@
<color name="app_bar_color_dark">#252727</color>
<color name="status_bar_color_light">#e68200</color>
<color name="status_bar_color_dark">#232525</color>
<color name="material_text_input_layout_bg">#4DCCCCCC</color>
<color name="active_buttons_and_links_bg_pressed_light">#0f67eb</color>
<color name="active_buttons_and_links_bg_pressed_dark">#b87114</color>

View file

@ -271,6 +271,7 @@
<dimen name="bottom_sheet_image_text_margin_start">10dp</dimen>
<dimen name="bottom_sheet_selected_item_title_height">56dp</dimen>
<dimen name="bottom_sheet_text_spacing_multiplier" format="float">1.25</dimen>
<dimen name="bottom_sheet_info_spacing_multiplier" format="float">1.5</dimen>
<dimen name="bottom_sheet_big_item_height">128dp</dimen>
<dimen name="action_bar_image_width_land">236dp</dimen>

View file

@ -11,6 +11,13 @@
Thx - Hardy
-->
<!-- string name="shared_string_all_time">All time</string -->
<string name="shared_string_night_map">Night map</string>
<string name="details_dialog_decr">Control visibility of additional details shown on the map</string>
<string name="shared_string_meters">meters</string>
<string name="shared_string_tones">tones</string>
<string name="default_screen_timeout">Default screen timeout</string>
<string name="screen_timeout_descr">If the \"%1$s\" option is enabled, the activity time will depend on it.</string>
<string name="speed_cameras_alert">Speed cameras alerts in some countries is prohibited by the law.</string>
<string name="shared_string_uninstall">Uninstall</string>
<string name="keep_active">Keep active</string>
@ -25,7 +32,6 @@
<string name="delete_all_actions_message_q">Are you sure you want to irrevocably delete %d quick actions?</string>
<string name="shared_string_delete_all_q">Delete all?</string>
<string name="export_import_quick_actions_with_profiles_promo">You can Export or Import quick actions with application profiles.</string>
<string name="default_screen_timeout">System screen timeout</string>
<string name="tiles_storage_descr">Choose how downloaded tiles will be stored.</string>
<string name="expire_time_descr">Expiration time in minutes. Cached tiles will be reloaded after specified time.
Leave this field empty to never refresh tiles for this source.
@ -43,13 +49,13 @@
<string name="sqlite_db_file">SQLiteDB file</string>
<string name="one_image_per_tile">One image file per tile</string>
<string name="pseudo_mercator_projection">Pseudo-Mercator projection</string>
<string name="screen_timeout_descr">This is only effective if \"%1$s\" is disabled.</string>
<string name="keep_screen_off">Keep screen off</string>
<string name="keep_screen_on">Keep screen on</string>
<string name="turn_screen_on_wake_time_descr">Select the screen timeout after waking up. (\"%1$s\" applies no timeout.)</string>
<string name="turn_screen_on_proximity_sensor">Proximity sensor</string>
<string name="turn_screen_on_power_button">Power button</string>
<string name="turn_screen_on_power_button_descr">Pressing the device power button will turn the screen on with OsmAnd on top of the lock screen.</string>
<string name="turn_screen_on_power_button_disabled">Disabled. Requires \'Keep screen on\' under \'Timeout after wake-up\'.</string>
<string name="turn_screen_on_navigation_instructions">Navigation instructions</string>
<string name="turn_screen_on_navigation_instructions_descr">Each navigation instruction will turn the screen on.</string>
<string name="turn_screen_on_descr">Select screen wake-up options (make sure OsmAnd is in the foreground when the device is being locked):</string>
@ -59,6 +65,9 @@
<string name="screen_control">Screen control</string>
<string name="shared_string_always">Always</string>
<string name="gpx_parse_error">OsmAnd GPX is not well formed, please contact the support team to investigate further.</string>
<string name="weight_limit_description">Provide your vehicle weight, some routes restrictions may be applied for heavy vehicles.</string>
<string name="height_limit_description">Provide your vehicle height, some routes restrictions may apply for high vehicles.</string>
<string name="width_limit_description">Provide your vehicle width some routes restrictions may be applied for wide vehicles.</string>
<string name="unsupported_type_error">Unsupported type</string>
<string name="index_item_world_basemap_detailed">World overview map (detailed)</string>
<string name="profiles_for_action_not_found">Could not find any such profiles.</string>
@ -473,7 +482,7 @@
<string name="analytics_pref_title">Analytics</string>
<string name="turn_screen_on_info">Show map on the lock screen during navigation.</string>
<string name="route_parameters_info">Settings for routing in the selected profile \"%1$s\".</string>
<string name="wake_time">Custom screen timeout</string>
<string name="wake_time">Timeout after wake-up</string>
<string name="units_and_formats">Units &amp; formats</string>
<string name="map_look_descr">Map appearance</string>
<string name="map_look">Map look</string>

View file

@ -25,7 +25,10 @@ import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map.Entry;
@ -372,24 +375,55 @@ public class OsmAndFormatter {
public static String getPoiStringWithoutType(Amenity amenity, String locale, boolean transliterate) {
PoiCategory pc = amenity.getType();
PoiType pt = pc.getPoiTypeByKeyName(amenity.getSubType());
String nm = amenity.getSubType();
String typeName = amenity.getSubType();
if (pt != null) {
nm = pt.getTranslation();
} else if(nm != null){
nm = Algorithms.capitalizeFirstLetterAndLowercase(nm.replace('_', ' '));
typeName = pt.getTranslation();
} else if(typeName != null){
typeName = Algorithms.capitalizeFirstLetterAndLowercase(typeName.replace('_', ' '));
}
String n = amenity.getName(locale, transliterate);
if (n.indexOf(nm) != -1) {
String localName = amenity.getName(locale, transliterate);
if (typeName != null && localName.contains(typeName)) {
// type is contained in name e.g.
// n = "Bakery the Corner"
// localName = "Bakery the Corner"
// type = "Bakery"
// no need to repeat this
return n;
return localName;
}
if (n.length() == 0) {
return nm;
if (localName.length() == 0) {
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) {

View file

@ -34,6 +34,7 @@ public class BottomSheetItemTitleWithDescrAndButton extends BottomSheetItemWithD
Drawable background,
CharSequence title,
@ColorRes int titleColorId,
boolean iconHidden,
CharSequence description,
@ColorRes int descriptionColorId,
int descriptionMaxLines,
@ -53,6 +54,7 @@ public class BottomSheetItemTitleWithDescrAndButton extends BottomSheetItemWithD
background,
title,
titleColorId,
iconHidden,
description,
descriptionColorId,
descriptionMaxLines,
@ -128,6 +130,7 @@ public class BottomSheetItemTitleWithDescrAndButton extends BottomSheetItemWithD
background,
title,
titleColorId,
iconHidden,
description,
descriptionColorId,
descriptionMaxLines,

View file

@ -0,0 +1,231 @@
package net.osmand.plus.base.bottomsheetmenu;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
import net.osmand.AndroidUtils;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.helpers.AndroidUiHelper;
public class BottomSheetItemTwoChoicesButton extends BottomSheetItemWithCompoundButton {
private LinearLayout bottomButtons;
private FrameLayout leftBtnContainer;
private FrameLayout rightBtnContainer;
private TextView leftBtn;
private TextView rightBtn;
@StringRes
private int leftBtnTitleRes;
@StringRes
private int rightBtnTitleRes;
private boolean isLeftBtnSelected;
private OnBottomBtnClickListener onBottomBtnClickListener;
private int bottomBtnBgRadius;
private int bottomBtnTextColor;
private int activeColor;
private GradientDrawable bottomBtnBg;
public BottomSheetItemTwoChoicesButton(View customView,
int layoutId,
Object tag,
boolean disabled,
View.OnClickListener onClickListener,
int position,
Drawable icon,
Drawable background,
CharSequence title,
int titleColorId,
boolean iconHidden,
CharSequence description,
int descriptionColorId,
int descriptionMaxLines,
boolean descriptionLinksClickable,
boolean checked,
ColorStateList buttonTintList,
CompoundButton.OnCheckedChangeListener onCheckedChangeListener,
int compoundButtonColorId,
boolean isLeftBtnSelected,
int leftBtnTitleRes,
int rightBtnTitleRes,
OnBottomBtnClickListener onBottomBtnClickListener) {
super(customView,
layoutId,
tag,
disabled,
onClickListener,
position,
icon,
background,
title,
titleColorId,
iconHidden,
description,
descriptionColorId,
descriptionMaxLines,
descriptionLinksClickable,
checked,
buttonTintList,
onCheckedChangeListener,
compoundButtonColorId);
this.leftBtnTitleRes = leftBtnTitleRes;
this.rightBtnTitleRes = rightBtnTitleRes;
this.isLeftBtnSelected = isLeftBtnSelected;
this.onBottomBtnClickListener = onBottomBtnClickListener;
}
@Override
public void inflate(Context context, ViewGroup container, boolean nightMode) {
super.inflate(context, container, nightMode);
bottomBtnBgRadius = AndroidUtils.dpToPx(context, 4);
bottomBtnTextColor = ContextCompat.getColor(context, nightMode
? R.color.text_color_primary_dark
: R.color.text_color_primary_light);
activeColor = ContextCompat.getColor(context, nightMode
? R.color.active_color_primary_dark
: R.color.active_color_primary_light);
bottomBtnBg = new GradientDrawable();
bottomBtnBg.setColor(UiUtilities.getColorWithAlpha(activeColor, 0.1f));
bottomBtnBg.setStroke(AndroidUtils.dpToPx(context, 1), UiUtilities.getColorWithAlpha(activeColor, 0.5f));
bottomButtons = view.findViewById(R.id.bottom_btns);
leftBtnContainer = view.findViewById(R.id.left_btn_container);
rightBtnContainer = view.findViewById(R.id.right_btn_container);
leftBtn = view.findViewById(R.id.left_btn);
rightBtn = view.findViewById(R.id.right_btn);
AndroidUiHelper.updateVisibility(bottomButtons, isChecked());
if (leftBtn != null) {
leftBtn.setText(leftBtnTitleRes);
leftBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isLeftBtnSelected = true;
if (onBottomBtnClickListener != null) {
onBottomBtnClickListener.onBottomBtnClick(true);
}
updateBottomButtons();
}
});
}
if (rightBtn != null) {
rightBtn.setText(rightBtnTitleRes);
rightBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isLeftBtnSelected = false;
if (onBottomBtnClickListener != null) {
onBottomBtnClickListener.onBottomBtnClick(false);
}
updateBottomButtons();
}
});
}
updateBottomButtons();
}
@Override
public void setChecked(boolean checked) {
super.setChecked(checked);
AndroidUiHelper.updateVisibility(bottomButtons, checked);
updateBottomButtons();
}
public void setIsLeftBtnSelected(boolean isLeftBtnSelected) {
this.isLeftBtnSelected = isLeftBtnSelected;
updateBottomButtons();
}
private void updateBottomButtons() {
if (bottomBtnBg == null || rightBtn == null || rightBtnContainer == null || leftBtn == null || leftBtnContainer == null) {
return;
}
if (isLeftBtnSelected) {
bottomBtnBg.setCornerRadii(new float[]{bottomBtnBgRadius, bottomBtnBgRadius, 0, 0, 0, 0, bottomBtnBgRadius, bottomBtnBgRadius});
rightBtnContainer.setBackgroundColor(Color.TRANSPARENT);
rightBtn.setTextColor(activeColor);
leftBtnContainer.setBackgroundDrawable(bottomBtnBg);
leftBtn.setTextColor(bottomBtnTextColor);
} else {
bottomBtnBg.setCornerRadii(new float[]{0, 0, bottomBtnBgRadius, bottomBtnBgRadius, bottomBtnBgRadius, bottomBtnBgRadius, 0, 0});
rightBtnContainer.setBackgroundDrawable(bottomBtnBg);
rightBtn.setTextColor(bottomBtnTextColor);
leftBtnContainer.setBackgroundColor(Color.TRANSPARENT);
leftBtn.setTextColor(activeColor);
}
}
public static class Builder extends BottomSheetItemWithCompoundButton.Builder {
@StringRes
private int leftBtnTitleRes;
@StringRes
private int rightBtnTitleRes;
private boolean isLeftBtnSelected;
private OnBottomBtnClickListener onBottomBtnClickListener;
public Builder setLeftBtnTitleRes(int leftBtnTitleRes) {
this.leftBtnTitleRes = leftBtnTitleRes;
return this;
}
public Builder setRightBtnTitleRes(int rightBtnTitleRes) {
this.rightBtnTitleRes = rightBtnTitleRes;
return this;
}
public Builder setLeftBtnSelected(boolean leftBtnSelected) {
isLeftBtnSelected = leftBtnSelected;
return this;
}
public Builder setOnBottomBtnClickListener(OnBottomBtnClickListener onBottomBtnClickListener) {
this.onBottomBtnClickListener = onBottomBtnClickListener;
return this;
}
public BottomSheetItemTwoChoicesButton create() {
return new BottomSheetItemTwoChoicesButton(customView,
layoutId,
tag,
disabled,
onClickListener,
position,
icon,
background,
title,
titleColorId,
iconHidden,
description,
descriptionColorId,
descriptionMaxLines,
descriptionLinksClickable,
checked,
buttonTintList,
onCheckedChangeListener,
compoundButtonColorId,
isLeftBtnSelected,
leftBtnTitleRes,
rightBtnTitleRes,
onBottomBtnClickListener);
}
}
public interface OnBottomBtnClickListener {
void onBottomBtnClick(boolean onLeftClick);
}
}

View file

@ -39,6 +39,7 @@ public class BottomSheetItemWithCompoundButton extends BottomSheetItemWithDescri
Drawable background,
CharSequence title,
@ColorRes int titleColorId,
boolean iconHidden,
CharSequence description,
@ColorRes int descriptionColorId,
int descriptionMaxLines,
@ -57,6 +58,7 @@ public class BottomSheetItemWithCompoundButton extends BottomSheetItemWithDescri
background,
title,
titleColorId,
iconHidden,
description,
descriptionColorId,
descriptionMaxLines,
@ -135,6 +137,7 @@ public class BottomSheetItemWithCompoundButton extends BottomSheetItemWithDescri
background,
title,
titleColorId,
iconHidden,
description,
descriptionColorId,
descriptionMaxLines,

View file

@ -33,11 +33,12 @@ public class BottomSheetItemWithDescription extends SimpleBottomSheetItem {
Drawable background,
CharSequence title,
@ColorRes int titleColorId,
boolean iconHidden,
CharSequence description,
@ColorRes int descriptionColorId,
int descriptionMaxLines,
boolean descriptionLinksClickable) {
super(customView, layoutId, tag, disabled, onClickListener, position, icon, background, title, titleColorId);
super(customView, layoutId, tag, disabled, onClickListener, position, icon, background, title, titleColorId, iconHidden);
this.description = description;
this.descriptionColorId = descriptionColorId;
this.descriptionMaxLines = descriptionMaxLines;
@ -126,6 +127,7 @@ public class BottomSheetItemWithDescription extends SimpleBottomSheetItem {
background,
title,
titleColorId,
iconHidden,
description,
descriptionColorId,
descriptionMaxLines,

View file

@ -18,6 +18,7 @@ public class SimpleBottomSheetItem extends BaseBottomSheetItem {
private Drawable background;
private Drawable icon;
private boolean iconHidden;
protected CharSequence title;
@ColorRes
protected int titleColorId = INVALID_ID;
@ -34,12 +35,14 @@ public class SimpleBottomSheetItem extends BaseBottomSheetItem {
Drawable icon,
Drawable background,
CharSequence title,
@ColorRes int titleColorId) {
@ColorRes int titleColorId,
boolean iconHidden) {
super(customView, layoutId, tag, disabled, onClickListener, position);
this.icon = icon;
this.background = background;
this.title = title;
this.titleColorId = titleColorId;
this.iconHidden = iconHidden;
}
protected SimpleBottomSheetItem() {
@ -67,6 +70,7 @@ public class SimpleBottomSheetItem extends BaseBottomSheetItem {
iconView = ((ImageView) view.findViewById(R.id.icon));
if (iconView != null) {
iconView.setImageDrawable(icon);
iconView.setVisibility(iconHidden ? View.GONE : View.VISIBLE);
}
titleTv = (TextView) view.findViewById(R.id.title);
if (title != null && titleTv != null) {
@ -87,6 +91,7 @@ public class SimpleBottomSheetItem extends BaseBottomSheetItem {
protected CharSequence title;
@ColorRes
protected int titleColorId = INVALID_ID;
protected boolean iconHidden;
public Builder setIcon(Drawable icon) {
this.icon = icon;
@ -108,6 +113,11 @@ public class SimpleBottomSheetItem extends BaseBottomSheetItem {
return this;
}
public Builder setIconHidden(boolean iconHidden) {
this.iconHidden = iconHidden;
return this;
}
public SimpleBottomSheetItem create() {
return new SimpleBottomSheetItem(customView,
layoutId,
@ -118,7 +128,8 @@ public class SimpleBottomSheetItem extends BaseBottomSheetItem {
icon,
background,
title,
titleColorId);
titleColorId,
iconHidden);
}
}
}

View file

@ -40,7 +40,9 @@ public class TestVoiceActivity extends OsmandActionBarActivity {
private String osmandVoice ="";
private String osmandVoiceLang ="";
private Button infoButton;
private Button buttonInfo;
private Button buttonDelay;
private Button buttonDisplay;
@Override
public void onCreate(Bundle icicle) {
@ -149,10 +151,10 @@ public class TestVoiceActivity extends OsmandActionBarActivity {
v += "\n \u25CF BT SCO: The current app profile is not set to use 'Phone call audio'.";
}
OsmandSettings.OsmandPreference<Integer> pref = ((OsmandApplication) getApplication()).getSettings().VOICE_PROMPT_DELAY[stream];
if(pref != null) {
v += "\n \u25CF Voice prompt delay for selected output: " + pref.get() + "\u00A0ms";
}
//OsmandSettings.OsmandPreference<Integer> pref = ((OsmandApplication) getApplication()).getSettings().VOICE_PROMPT_DELAY[stream];
//if(pref != null) {
// v += "\n \u25CF Voice prompt delay for selected output: " + pref.get() + "\u00A0ms";
//}
return v;
}
@ -162,7 +164,7 @@ public class TestVoiceActivity extends OsmandActionBarActivity {
addButton(ll, "\u25BA (1.2) New route calculated, 1350m, 3680sec (01:01:20)", builder(p).newRouteCalculated(1350, 3680));
addButton(ll, "\u25BA (1.3) New route calculated 3700m, 7320sec (02:02)", builder(p).newRouteCalculated(3700, 7320));
addButton(ll, "\u25BA (1.4) New route calculated 9100m, 10980sec (03:03)", builder(p).newRouteCalculated(9100, 10980));
addButton(ll, "\u25BA (1.5) New route calculated, 1500m, 4280sec (01:20:20)", builder(p).newRouteCalculated(1500, 4280));
addButton(ll, "\u25BA (1.5) New route calculated, 1500m, 4280sec (01:20:20)", builder(p).newRouteCalculated(1500, 4820));
addButton(ll, "\u25BA (2.1) Route recalculated 11500m, 18600sec (05:10)", builder(p).routeRecalculated(11500, 18600));
addButton(ll, "\u25BA (2.2) Route recalculated 19633m, 26700sec (07:25)", builder(p).routeRecalculated(19633, 26700) );
addButton(ll, "\u25BA (2.3) Route recalculated 89750m, 55800sec (15:30)", builder(p).routeRecalculated(89750, 55800) );
@ -233,9 +235,13 @@ public class TestVoiceActivity extends OsmandActionBarActivity {
addButton(ll, "\u25BA (10.3) You have been off the route for 1050m", builder(p).offRoute(1050));
addButton(ll, "\u25BA (10.4) You are back on the route", builder(p).backOnRoute());
addButton(ll, "Voice system info:", builder(p));
addButton(ll, "\u25BA (11.1) (Tap to refresh)\n" + getVoiceSystemInfo(), builder(p).attention(""));
addButton(ll, "\u25BA (11.2) Tap to change voice prompt delay (if car stereo cuts off prompts). Default is 1500\u00A0ms for Phone call audio, or else 0\u00A0ms.", builder(p).attention(""));
addButton(ll, "System info and settings:", builder(p));
addButton(ll, "\u25BA (11.1) (TAP TO FULLY POPULATE)\n" + getVoiceSystemInfo(), builder(p).attention(""));
addButton(ll, "\u25BA (11.2) (TAP TO CHANGE)\n \u25CF Voice prompt delay for selected output: " +
((OsmandApplication) getApplication()).getSettings().VOICE_PROMPT_DELAY[((OsmandApplication) getApplication()).getSettings().AUDIO_MANAGER_STREAM.get()].get() +
"\u00A0ms.\nAvoids car stereo cutting off prompts. Default is 1500\u00A0ms for Phone call audio, or else 0\u00A0ms.", builder(p).attention(""));
addButton(ll, "\u25BA (11.3) (TAP TO TOGGLE)\n \u25CF Display each TTS utterance on screen: " +
((OsmandApplication) getApplication()).getSettings().DISPLAY_TTS_UTTERANCE.get().toString(), builder(p).attention(""));
ll.forceLayout();
}
@ -273,7 +279,12 @@ public class TestVoiceActivity extends OsmandActionBarActivity {
button.setPadding(40, 5, 10, 5);
}
if (description.startsWith("\u25BA (11.1)")) {
infoButton = button;
// Buttons with refreshable caption
buttonInfo = button;
} else if (description.startsWith("\u25BA (11.2)")) {
buttonDelay = button;
} else if (description.startsWith("\u25BA (11.3)")) {
buttonDisplay = button;
}
layout.addView(button);
@ -283,8 +294,8 @@ public class TestVoiceActivity extends OsmandActionBarActivity {
public void onClick(View v) {
builder.play();
if (description.startsWith("\u25BA (11.1)")) {
infoButton.setText("\u25BA (11.1) (Tap to refresh)\n" + getVoiceSystemInfo());
Toast.makeText(TestVoiceActivity.this, "Info refreshed.", Toast.LENGTH_LONG).show();
buttonInfo.setText("\u25BA (11.1) Voice system info:\n" + getVoiceSystemInfo());
// Toast.makeText(TestVoiceActivity.this, "Info refreshed.", Toast.LENGTH_LONG).show();
}
if (description.startsWith("\u25BA (11.2)")) {
int ams = ((OsmandApplication) getApplication()).getSettings().AUDIO_MANAGER_STREAM.get();
@ -295,10 +306,20 @@ public class TestVoiceActivity extends OsmandActionBarActivity {
} else {
pref.set(pref.get() + 500);
}
Toast.makeText(TestVoiceActivity.this, "Voice prompt delay changed to " + pref.get() + "\u00A0ms.", Toast.LENGTH_LONG).show();
// Toast.makeText(TestVoiceActivity.this, "Voice prompt delay changed to " + pref.get() + "\u00A0ms.", Toast.LENGTH_LONG).show();
}
infoButton.setText("\u25BA (11.1) (Tap to refresh)\n" + getVoiceSystemInfo());
buttonDelay.setText("\u25BA (11.2) (TAP TO CHANGE)\n \u25CF Voice prompt delay for selected output: " +
((OsmandApplication) getApplication()).getSettings().VOICE_PROMPT_DELAY[((OsmandApplication) getApplication()).getSettings().AUDIO_MANAGER_STREAM.get()].get() +
"\u00A0ms.\nAvoids car stereo cutting off prompts. Default is 1500\u00A0ms for Phone call audio, or else 0\u00A0ms.");
}
if (description.startsWith("\u25BA (11.3)")) {
if (((OsmandApplication) getApplication()).getSettings().DISPLAY_TTS_UTTERANCE.get() == false) {
((OsmandApplication) getApplication()).getSettings().DISPLAY_TTS_UTTERANCE.set(true);
} else {
((OsmandApplication) getApplication()).getSettings().DISPLAY_TTS_UTTERANCE.set(false);
}
buttonDisplay.setText("\u25BA (11.3) (TAP TO TOGGLE)\n \u25CF Display each TTS utterance on screen: " +
((OsmandApplication) getApplication()).getSettings().DISPLAY_TTS_UTTERANCE.get().toString());
}
}
});

View file

@ -107,6 +107,9 @@ import static net.osmand.plus.srtmplugin.SRTMPlugin.CONTOUR_LINES_ATTR;
import static net.osmand.plus.srtmplugin.SRTMPlugin.CONTOUR_LINES_SCHEME_ATTR;
import static net.osmand.plus.srtmplugin.SRTMPlugin.CONTOUR_WIDTH_ATTR;
import static net.osmand.plus.transport.TransportLinesMenu.RENDERING_CATEGORY_TRANSPORT;
import static net.osmand.render.RenderingRuleStorageProperties.UI_CATEGORY_DETAILS;
import static net.osmand.render.RenderingRuleStorageProperties.UI_CATEGORY_HIDE;
import static net.osmand.render.RenderingRuleStorageProperties.UI_CATEGORY_ROUTES;
public class ConfigureMapMenu {
private static final Log LOG = PlatformUtil.getLog(ConfigureMapMenu.class);
@ -787,12 +790,12 @@ public class ConfigureMapMenu {
.createItem());
props = createProperties(customRules, null, R.string.rendering_category_details, R.drawable.ic_action_layers,
"details", null, adapter, activity, true, DETAILS_ID, themeRes, nightMode, selectedProfileColor);
UI_CATEGORY_DETAILS, null, adapter, activity, true, DETAILS_ID, themeRes, nightMode, selectedProfileColor);
if (props != null) {
adapter.addItem(props);
}
props = createProperties(customRules, null, R.string.rendering_category_hide, R.drawable.ic_action_hide,
"hide", null, adapter, activity, true, HIDE_ID, themeRes, nightMode, selectedProfileColor);
UI_CATEGORY_HIDE, null, adapter, activity, true, HIDE_ID, themeRes, nightMode, selectedProfileColor);
if (props != null) {
adapter.addItem(props);
}
@ -804,7 +807,7 @@ public class ConfigureMapMenu {
}
}
props = createProperties(customRules, customRulesIncluded, R.string.rendering_category_routes, R.drawable.ic_action_map_routes,
"routes", null, adapter, activity, true, ROUTES_ID, themeRes, nightMode, selectedProfileColor);
UI_CATEGORY_ROUTES, null, adapter, activity, true, ROUTES_ID, themeRes, nightMode, selectedProfileColor);
if (props != null) {
adapter.addItem(props);
}
@ -862,7 +865,7 @@ public class ConfigureMapMenu {
final List<RenderingRuleProperty> customRulesIncluded,
@StringRes final int strId,
@DrawableRes final int icon,
String category,
final String category,
final ListStringPreference defaultSettings,
final ContextMenuAdapter adapter,
final MapActivity activity,
@ -917,10 +920,14 @@ public class ConfigureMapMenu {
a.notifyDataSetInvalidated();
refreshMapComplete(activity);
activity.getMapLayers().updateLayers(activity.getMapView());
} else {
if (UI_CATEGORY_DETAILS.equals(category)) {
DetailsBottomSheet.showInstance(activity.getSupportFragmentManager(), ps, prefs, a, adapter, pos);
} else {
showPreferencesDialog(adapter, a, pos, activity, activity.getString(strId), ps, prefs,
useDescription, defaultSettings, true, customRulesIncluded, themeRes, nightMode, selectedProfileColor);
}
}
return false;
}

View file

@ -0,0 +1,224 @@
package net.osmand.plus.dialogs;
import android.app.Activity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemTwoChoicesButton;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemTwoChoicesButton.OnBottomBtnClickListener;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.ShortDescriptionItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.settings.bottomsheets.BasePreferenceBottomSheet;
import net.osmand.render.RenderingRuleProperty;
import net.osmand.render.RenderingRuleStorageProperties;
import java.util.ArrayList;
import java.util.List;
import static net.osmand.plus.transport.TransportLinesMenu.RENDERING_CATEGORY_TRANSPORT;
import static net.osmand.render.RenderingRuleStorageProperties.UI_CATEGORY_DETAILS;
public class DetailsBottomSheet extends BasePreferenceBottomSheet {
public static final String TAG = DetailsBottomSheet.class.getName();
public static final String STREET_LIGHTING = "streetLighting";
public static final String STREET_LIGHTING_NIGHT = "streetLightingNight";
public static final String MORE_DETAILED = "moreDetailed";
public static final String SHOW_SURFACE_GRADE = "showSurfaceGrade";
public static final String COLORED_BUILDINGS = "coloredBuildings";
private OsmandApplication app;
private List<RenderingRuleProperty> properties;
private List<CommonPreference<Boolean>> preferences;
private ArrayAdapter<?> arrayAdapter;
private ContextMenuAdapter adapter;
private int position;
public static void showInstance(@NonNull FragmentManager fm,
List<RenderingRuleProperty> properties,
List<CommonPreference<Boolean>> preferences,
ArrayAdapter<?> arrayAdapter,
ContextMenuAdapter adapter,
int position) {
if (!fm.isStateSaved()) {
DetailsBottomSheet bottomSheet = new DetailsBottomSheet();
bottomSheet.setProperties(properties);
bottomSheet.setPreferences(preferences);
bottomSheet.setAdapter(adapter);
bottomSheet.setPosition(position);
bottomSheet.setArrayAdapter(arrayAdapter);
bottomSheet.show(fm, TAG);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = requiredMyApplication();
if (properties == null || preferences == null) {
properties = new ArrayList<>();
preferences = new ArrayList<>();
List<RenderingRuleProperty> customRules = ConfigureMapMenu.getCustomRules(app,
RenderingRuleStorageProperties.UI_CATEGORY_HIDDEN, RENDERING_CATEGORY_TRANSPORT);
for (RenderingRuleProperty pr : customRules) {
if (UI_CATEGORY_DETAILS.equals(pr.getCategory()) && pr.isBoolean()) {
properties.add(pr);
final CommonPreference<Boolean> pref = app.getSettings()
.getCustomRenderBooleanProperty(pr.getAttrName());
preferences.add(pref);
}
}
}
}
@Override
public void createMenuItems(Bundle savedInstanceState) {
int selectedProfileColorRes = app.getSettings().APPLICATION_MODE.get().getIconColorInfo().getColor(nightMode);
TitleItem titleItem = new TitleItem(getString(R.string.rendering_category_details));
items.add(titleItem);
ShortDescriptionItem descriptionItem = new ShortDescriptionItem(getString(R.string.details_dialog_decr));
items.add(descriptionItem);
if (preferences != null && properties != null) {
RenderingRuleProperty streetLightNightProp = getStreetLightNightProp();
for (int i = 0; i < properties.size(); i++) {
RenderingRuleProperty property = properties.get(i);
final CommonPreference<Boolean> pref = preferences.get(i);
if (STREET_LIGHTING.equals(property.getAttrName()) && streetLightNightProp != null) {
final CommonPreference<Boolean> streetLightsNightPref = preferences.get(properties.indexOf(streetLightNightProp));
final BottomSheetItemTwoChoicesButton[] item = new BottomSheetItemTwoChoicesButton[1];
item[0] = (BottomSheetItemTwoChoicesButton) new BottomSheetItemTwoChoicesButton.Builder()
.setLeftBtnSelected(!streetLightsNightPref.get())
.setLeftBtnTitleRes(R.string.shared_string_always)
.setRightBtnTitleRes(R.string.shared_string_night_map)
.setOnBottomBtnClickListener(new OnBottomBtnClickListener() {
@Override
public void onBottomBtnClick(boolean onLeftClick) {
streetLightsNightPref.set(!onLeftClick);
}
})
.setCompoundButtonColorId(selectedProfileColorRes)
.setChecked(pref.get())
.setTitle(property.getName())
.setIconHidden(true)
.setLayoutId(R.layout.bottom_sheet_item_two_choices)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean checked = !pref.get();
pref.set(checked);
streetLightsNightPref.set(false);
item[0].setChecked(checked);
item[0].setIsLeftBtnSelected(true);
}
})
.create();
items.add(item[0]);
} else if (!STREET_LIGHTING_NIGHT.equals(property.getAttrName())) {
final BottomSheetItemWithCompoundButton[] item = new BottomSheetItemWithCompoundButton[1];
item[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder()
.setCompoundButtonColorId(selectedProfileColorRes)
.setChecked(pref.get())
.setTitle(property.getName())
.setIconHidden(true)
.setLayoutId(R.layout.bottom_sheet_item_with_switch)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean checked = !pref.get();
pref.set(checked);
item[0].setChecked(checked);
}
})
.create();
items.add(item[0]);
}
String attrName = property.getAttrName();
if (MORE_DETAILED.equals(attrName) || SHOW_SURFACE_GRADE.equals(attrName)
|| COLORED_BUILDINGS.equals(attrName) || STREET_LIGHTING.equals(attrName)) {
items.add(new DividerItem(app));
}
}
}
}
@Nullable
private RenderingRuleProperty getStreetLightNightProp() {
if (properties != null) {
for (RenderingRuleProperty property : properties) {
if (STREET_LIGHTING_NIGHT.equals(property.getAttrName())) {
return property;
}
}
}
return null;
}
@Override
protected int getDismissButtonTextId() {
return R.string.shared_string_close;
}
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
boolean checked = false;
int selected = 0;
for (int i = 0; i < preferences.size(); i++) {
boolean active = preferences.get(i).get();
checked |= active;
if (active) {
selected++;
}
}
if (adapter != null) {
adapter.getItem(position).setSelected(checked);
adapter.getItem(position).setColorRes(checked ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
adapter.getItem(position).setDescription(getString(
R.string.ltr_or_rtl_combine_via_slash,
String.valueOf(selected),
String.valueOf(preferences.size())));
}
if (arrayAdapter != null) {
arrayAdapter.notifyDataSetInvalidated();
}
Activity activity = getActivity();
if (activity instanceof MapActivity) {
MapActivity a = (MapActivity) activity;
ConfigureMapMenu.refreshMapComplete(a);
a.getMapLayers().updateLayers(a.getMapView());
}
super.onDismiss(dialog);
}
public void setProperties(List<RenderingRuleProperty> properties) {
this.properties = properties;
}
public void setPreferences(List<CommonPreference<Boolean>> preferences) {
this.preferences = preferences;
}
public void setAdapter(ContextMenuAdapter adapter) {
this.adapter = adapter;
}
public void setPosition(int position) {
this.position = position;
}
public void setArrayAdapter(ArrayAdapter<?> arrayAdapter) {
this.arrayAdapter = arrayAdapter;
}
}

View file

@ -248,6 +248,8 @@ public class ImportHelper {
}
} catch (FileNotFoundException e) {
//
} catch (SecurityException e) {
log.error(e.getMessage(), e);
} finally {
if (is != null) try {
is.close();
@ -314,6 +316,8 @@ public class ImportHelper {
}
} catch (FileNotFoundException e) {
//
} catch (SecurityException e) {
log.error(e.getMessage(), e);
} finally {
if (is != null) try {
is.close();
@ -410,7 +414,7 @@ public class ImportHelper {
}
}
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage(), e);
} finally {
try {
if (is != null) {
@ -463,6 +467,8 @@ public class ImportHelper {
}
} catch (FileNotFoundException e) {
//
} catch (SecurityException e) {
log.error(e.getMessage(), e);
} finally {
if (is != null) try {
is.close();
@ -549,6 +555,9 @@ public class ImportHelper {
} catch (IOException e) {
e.printStackTrace();
error = e.getMessage();
} catch (SecurityException e) {
e.printStackTrace();
error = e.getMessage();
} finally {
if (in != null) {
try {
@ -918,6 +927,8 @@ public class ImportHelper {
log.error(e);
} catch (IOException e) {
log.error(e);
} catch (SecurityException e) {
log.error(e.getMessage(), e);
} finally {
if (is != null) try {
is.close();

View file

@ -35,7 +35,6 @@ import androidx.fragment.app.FragmentManager;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.activities.LocalIndexHelper;
@ -50,6 +49,7 @@ import net.osmand.plus.inapp.InAppPurchaseHelper.InAppPurchaseListener;
import net.osmand.plus.inapp.InAppPurchaseHelper.InAppPurchaseTaskType;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription;
import net.osmand.plus.resources.IncrementalChangesManager;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.util.Algorithms;
import java.io.File;
@ -82,6 +82,8 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
return lhs.getName().compareTo(rhs.getName());
}
};
private OsmandApplication app;
private View subscriptionHeader;
private ExpandableListView listView;
private LocalIndexesAdapter adapter;
@ -109,6 +111,7 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
app = getMyApplication();
if (getActivity() instanceof OsmLiveActivity) {
showSettingsOnly = ((OsmLiveActivity) getActivity()).isShowSettingOnly();
}
@ -120,7 +123,6 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
View view = inflater.inflate(R.layout.fragment_live_updates, container, false);
listView = (ExpandableListView) view.findViewById(android.R.id.list);
final OsmandApplication app = getMyApplication();
boolean nightMode = !app.getSettings().isLightContent();
final SwipeRefreshLayout swipeRefresh = view.findViewById(R.id.swipe_refresh);
int swipeColor = ContextCompat.getColor(app, nightMode ? R.color.osmand_orange_dark : R.color.osmand_orange);
@ -141,7 +143,7 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
listView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
if (!processing && InAppPurchaseHelper.isSubscribedToLiveUpdates(getMyApplication())) {
if (!processing && InAppPurchaseHelper.isSubscribedToLiveUpdates(app)) {
final FragmentManager fragmentManager = getChildFragmentManager();
LiveUpdatesSettingsDialogFragment
.createInstance(adapter.getChild(groupPosition, childPosition).getFileName())
@ -155,7 +157,7 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
progressBar = (ProgressBar) view.findViewById(R.id.progress);
if (!Version.isDeveloperVersion(getMyApplication())) {
if (!Version.isDeveloperVersion(app)) {
subscriptionHeader = inflater.inflate(R.layout.live_updates_header, listView, false);
updateSubscriptionHeader();
listView.addHeaderView(subscriptionHeader, "subscriptionHeader", false);
@ -172,22 +174,22 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
if (getActivity() instanceof OsmLiveActivity && subscriptionHeader != null) {
View subscriptionBanner = subscriptionHeader.findViewById(R.id.subscription_banner);
View subscriptionInfo = subscriptionHeader.findViewById(R.id.subscription_info);
if (InAppPurchaseHelper.isSubscribedToLiveUpdates(getMyApplication())) {
if (InAppPurchaseHelper.isSubscribedToLiveUpdates(app)) {
ImageView statusIcon = (ImageView) subscriptionHeader.findViewById(R.id.statusIcon);
TextView statusTextView = (TextView) subscriptionHeader.findViewById(R.id.statusTextView);
TextView regionNameHeaderTextView = (TextView) subscriptionHeader.findViewById(R.id.regionHeaderTextView);
TextView regionNameTextView = (TextView) subscriptionHeader.findViewById(R.id.regionTextView);
statusTextView.setText(getString(R.string.osm_live_active));
statusIcon.setImageDrawable(getMyApplication().getUIUtilities().getThemedIcon(R.drawable.ic_action_done));
statusIcon.setImageDrawable(app.getUIUtilities().getThemedIcon(R.drawable.ic_action_done));
regionNameHeaderTextView.setText(R.string.osm_live_support_region);
String countryName = getSettings().BILLING_USER_COUNTRY.get();
String countryName = app.getSettings().BILLING_USER_COUNTRY.get();
InAppPurchaseHelper purchaseHelper = getInAppPurchaseHelper();
if (purchaseHelper != null) {
InAppSubscription monthlyPurchased = purchaseHelper.getPurchasedMonthlyLiveUpdates();
if (monthlyPurchased != null && monthlyPurchased.isDonationSupported()) {
if (Algorithms.isEmpty(countryName)) {
if (getSettings().BILLING_USER_COUNTRY_DOWNLOAD_NAME.get().equals(OsmandSettings.BILLING_USER_DONATION_NONE_PARAMETER)) {
if (app.getSettings().BILLING_USER_COUNTRY_DOWNLOAD_NAME.get().equals(OsmandSettings.BILLING_USER_DONATION_NONE_PARAMETER)) {
regionNameHeaderTextView.setText(R.string.default_buttons_support);
countryName = getString(R.string.osmand_team);
} else {
@ -277,12 +279,10 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
}
public void notifyLiveUpdatesChanged() {
if (getActivity() != null) {
if (adapter != null && getMyApplication() != null) {
if (getActivity() != null && adapter != null) {
adapter.notifyLiveUpdatesChanged();
}
}
}
private boolean isDonationSupported() {
InAppPurchaseHelper purchaseHelper = getInAppPurchaseHelper();
@ -313,7 +313,7 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
public void add(LocalIndexInfo info) {
OsmandSettings.CommonPreference<Boolean> preference = preferenceLiveUpdatesOn(
info.getFileName(), getSettings());
info.getFileName(), app.getSettings());
if (preference.get()) {
dataShouldUpdate.add(info);
} else {
@ -325,7 +325,7 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
Set<LocalIndexInfo> changedSet = new HashSet<>();
for (LocalIndexInfo localIndexInfo : dataShouldUpdate) {
OsmandSettings.CommonPreference<Boolean> preference =
preferenceLiveUpdatesOn(localIndexInfo.getFileName(), getSettings());
preferenceLiveUpdatesOn(localIndexInfo.getFileName(), app.getSettings());
if (!preference.get()) {
changedSet.add(localIndexInfo);
}
@ -335,7 +335,7 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
changedSet.clear();
for (LocalIndexInfo localIndexInfo : dataShouldNotUpdate) {
OsmandSettings.CommonPreference<Boolean> preference =
preferenceLiveUpdatesOn(localIndexInfo.getFileName(), getSettings());
preferenceLiveUpdatesOn(localIndexInfo.getFileName(), app.getSettings());
if (preference.get()) {
changedSet.add(localIndexInfo);
}
@ -410,11 +410,11 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (InAppPurchaseHelper.isSubscribedToLiveUpdates(getMyApplication())) {
if (InAppPurchaseHelper.isSubscribedToLiveUpdates(app)) {
switchOnLiveUpdates(settings);
} else {
liveUpdatesSwitch.setChecked(false);
getMyApplication().showToastMessage(getString(R.string.osm_live_ask_for_purchase));
app.showToastMessage(getString(R.string.osm_live_ask_for_purchase));
}
} else {
settings.IS_LIVE_UPDATES_ON.set(false);
@ -447,16 +447,16 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
private void showUpdateDialog() {
if(dataShouldUpdate.size() > 0) {
if (dataShouldUpdate.size() == 1) {
runLiveUpdate(getMyApplication(), dataShouldUpdate.get(0).getFileName(), false);
runLiveUpdate(app, dataShouldUpdate.get(0).getFileName(), false);
} else {
Builder bld = new AlertDialog.Builder(getActivity());
Builder bld = new AlertDialog.Builder(ctx);
bld.setMessage(R.string.update_all_maps_now);
bld.setPositiveButton(R.string.shared_string_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
for (LocalIndexInfo li : dataShouldUpdate) {
runLiveUpdate(getMyApplication(), li.getFileName(), false);
runLiveUpdate(app, li.getFileName(), false);
}
notifyDataSetChanged();
}
@ -468,17 +468,15 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
}
private void enableLiveUpdates(boolean enable) {
AlarmManager alarmMgr = (AlarmManager) getActivity()
.getSystemService(Context.ALARM_SERVICE);
AlarmManager alarmMgr = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
for (LocalIndexInfo li : dataShouldUpdate) {
String fileName = li.getFileName();
PendingIntent alarmIntent = getPendingIntent(getActivity(),
fileName);
PendingIntent alarmIntent = getPendingIntent(ctx, fileName);
if (enable) {
final OsmandSettings.CommonPreference<Integer> updateFrequencyPreference =
preferenceUpdateFrequency(fileName, getSettings());
preferenceUpdateFrequency(fileName, app.getSettings());
final OsmandSettings.CommonPreference<Integer> timeOfDayPreference =
preferenceTimeOfDayToUpdate(fileName, getSettings());
preferenceTimeOfDayToUpdate(fileName, app.getSettings());
UpdateFrequency updateFrequency = UpdateFrequency.values()[updateFrequencyPreference.get()];
TimeOfDay timeOfDayToUpdate = TimeOfDay.values()[timeOfDayPreference.get()];
setAlarmForPendingIntent(alarmIntent, alarmMgr, updateFrequency, timeOfDayToUpdate);
@ -713,8 +711,8 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
@Override
public void onGetItems() {
if (!InAppPurchaseHelper.isSubscribedToLiveUpdates(getMyApplication())) {
getSettings().IS_LIVE_UPDATES_ON.set(false);
if (!InAppPurchaseHelper.isSubscribedToLiveUpdates(app)) {
app.getSettings().IS_LIVE_UPDATES_ON.set(false);
adapter.enableLiveUpdates(false);
}
disableProgress();

View file

@ -19,7 +19,6 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
@ -46,6 +45,7 @@ import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.BaseOsmAndFragment;
import net.osmand.plus.helpers.ColorDialogs;
import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter;
import net.osmand.plus.widgets.FlowLayout;
import net.osmand.util.Algorithms;
@ -63,7 +63,6 @@ import java.util.Set;
import static net.osmand.data.FavouritePoint.*;
import static net.osmand.plus.FavouritesDbHelper.FavoriteGroup.PERSONAL_CATEGORY;
import static net.osmand.plus.FavouritesDbHelper.FavoriteGroup.isPersonalCategoryDisplayName;
import static net.osmand.util.Algorithms.capitalizeFirstLetter;
public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
@ -463,13 +462,22 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
e.printStackTrace();
}
}
IconCategoriesAdapter iconCategoriesAdapter = new IconCategoriesAdapter();
iconCategoriesAdapter.setItems(new ArrayList<>(iconCategories.keySet()));
HorizontalSelectionAdapter horizontalSelectionAdapter = new HorizontalSelectionAdapter(app, nightMode);
horizontalSelectionAdapter.setItems(new ArrayList<>(iconCategories.keySet()));
horizontalSelectionAdapter.setSelectedItem(selectedIconCategory);
horizontalSelectionAdapter.setListener(new HorizontalSelectionAdapter.HorizontalSelectionAdapterListener() {
@Override
public void onItemSelected(String item) {
selectedIconCategory = item;
createIconForCategory();
updateIconSelector(selectedIcon, PointEditorFragmentNew.this.view);
}
});
RecyclerView iconCategoriesRecyclerView = view.findViewById(R.id.group_name_recycler_view);
iconCategoriesRecyclerView.setAdapter(iconCategoriesAdapter);
iconCategoriesRecyclerView.setAdapter(horizontalSelectionAdapter);
iconCategoriesRecyclerView.setLayoutManager(new LinearLayoutManager(app, RecyclerView.HORIZONTAL, false));
iconCategoriesAdapter.notifyDataSetChanged();
iconCategoriesRecyclerView.smoothScrollToPosition(iconCategoriesAdapter.getItemPosition(selectedIconCategory));
horizontalSelectionAdapter.notifyDataSetChanged();
iconCategoriesRecyclerView.smoothScrollToPosition(horizontalSelectionAdapter.getItemPosition(selectedIconCategory));
for (String name : iconNameList) {
selectIcon.addView(createIconItemView(name, selectIcon), new FlowLayout.LayoutParams(0, 0));
}
@ -894,71 +902,4 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
groupButton = itemView.findViewById(R.id.outlineRect);
}
}
class IconCategoriesAdapter extends RecyclerView.Adapter<NameViewHolder> {
List<String> items;
public void setItems(List<String> items) {
this.items = items;
}
@NonNull
@Override
public NameViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.point_editor_icon_category_item, parent, false);
return new NameViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull NameViewHolder holder, final int position) {
final String category = items.get(position);
TextView textView = holder.buttonText;
int activeColorResId = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light;
if (category.equals(selectedIconCategory)) {
AndroidUtils.setBackground(holder.button, app.getUIUtilities().getPaintedIcon(R.drawable.bg_select_icon_group_button,
ContextCompat.getColor(app, activeColorResId)));
textView.setTextColor(ContextCompat.getColor(app, R.color.color_white));
} else {
textView.setTextColor(ContextCompat.getColor(app, R.color.preference_category_title));
GradientDrawable buttonBackground = (GradientDrawable) AppCompatResources.getDrawable(app,
R.drawable.bg_select_icon_group_button).mutate();
buttonBackground.setStroke(AndroidUtils.dpToPx(app, 1), ContextCompat.getColor(app,
nightMode ? R.color.stroked_buttons_and_links_outline_dark
: R.color.stroked_buttons_and_links_outline_light));
buttonBackground.setColor(ContextCompat.getColor(app, R.color.color_transparent));
AndroidUtils.setBackground(holder.button, buttonBackground);
}
textView.setText(capitalizeFirstLetter(category));
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
selectedIconCategory = category;
createIconForCategory();
updateIconSelector(selectedIcon, PointEditorFragmentNew.this.view);
}
});
}
@Override
public int getItemCount() {
return items.size();
}
int getItemPosition(String name) {
return items.indexOf(name);
}
}
static class NameViewHolder extends RecyclerView.ViewHolder {
final TextView buttonText;
final LinearLayout button;
NameViewHolder(@NonNull View itemView) {
super(itemView);
buttonText = itemView.findViewById(R.id.button_text);
button = itemView.findViewById(R.id.button_container);
}
}
}

View file

@ -0,0 +1,114 @@
package net.osmand.plus.mapcontextmenu.other;
import android.graphics.drawable.GradientDrawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.AndroidUtils;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import java.util.List;
import static net.osmand.util.Algorithms.capitalizeFirstLetter;
public class HorizontalSelectionAdapter extends RecyclerView.Adapter<HorizontalSelectionAdapter.ItemViewHolder> {
private List<String> items;
private OsmandApplication app;
private boolean nightMode;
private HorizontalSelectionAdapterListener listener;
private String selectedItem = "";
public HorizontalSelectionAdapter(OsmandApplication app, boolean nightMode) {
this.app = app;
this.nightMode = nightMode;
}
public void setItems(List<String> items) {
this.items = items;
}
@NonNull
@Override
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
view = UiUtilities.getInflater(parent.getContext(), nightMode).inflate(R.layout.point_editor_icon_category_item, parent, false);
return new ItemViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ItemViewHolder holder, final int position) {
final String item = items.get(holder.getAdapterPosition());
TextView textView = holder.buttonText;
int activeColorResId = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light;
if (item.equals(selectedItem)) {
AndroidUtils.setBackground(holder.button, app.getUIUtilities().getPaintedIcon(R.drawable.bg_select_icon_group_button,
ContextCompat.getColor(app, activeColorResId)));
textView.setTextColor(ContextCompat.getColor(app, R.color.color_white));
} else {
textView.setTextColor(ContextCompat.getColor(app, R.color.preference_category_title));
GradientDrawable buttonBackground = (GradientDrawable) AppCompatResources.getDrawable(app,
R.drawable.bg_select_icon_group_button).mutate();
buttonBackground.setStroke(AndroidUtils.dpToPx(app, 1), ContextCompat.getColor(app,
nightMode ? R.color.stroked_buttons_and_links_outline_dark
: R.color.stroked_buttons_and_links_outline_light));
buttonBackground.setColor(ContextCompat.getColor(app, R.color.color_transparent));
AndroidUtils.setBackground(holder.button, buttonBackground);
}
textView.setText(capitalizeFirstLetter(item));
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectedItem = item;
if (listener != null) {
listener.onItemSelected(item);
}
}
});
}
@Override
public int getItemCount() {
return items.size();
}
public int getItemPosition(String name) {
return items.indexOf(name);
}
public void setSelectedItem(String selectedItem) {
this.selectedItem = selectedItem;
notifyDataSetChanged();
}
public void setListener(HorizontalSelectionAdapterListener listener) {
this.listener = listener;
}
public interface HorizontalSelectionAdapterListener {
void onItemSelected(String item);
}
static class ItemViewHolder extends RecyclerView.ViewHolder {
final TextView buttonText;
final LinearLayout button;
ItemViewHolder(@NonNull View itemView) {
super(itemView);
buttonText = itemView.findViewById(R.id.button_text);
button = itemView.findViewById(R.id.button_container);
}
}
}

View file

@ -128,7 +128,8 @@ public class EditPoiData {
if (oldValue == null || !oldValue.equals(value)) {
changedTags.add(tag);
}
tagValues.put(tag, value);
String tagVal = value != null ? value : "";
tagValues.put(tag, tagVal);
notifyDatasetChanged(tag);
} finally {
isInEdit = false;
@ -207,7 +208,8 @@ public class EditPoiData {
public void updateTypeTag(String string, boolean userChanges) {
checkNotInEdit();
try {
tagValues.put(POI_TYPE_TAG, string);
String val = string != null ? string : "";
tagValues.put(POI_TYPE_TAG, val);
if (userChanges) {
changedTags.add(POI_TYPE_TAG);
}
@ -216,7 +218,8 @@ public class EditPoiData {
if (pt != null) {
removeTypeTagWithPrefix(!tagValues.containsKey(REMOVE_TAG_PREFIX + pt.getEditOsmTag()));
currentPoiType = pt;
tagValues.put(pt.getEditOsmTag(), pt.getEditOsmValue());
String tagVal = pt.getEditOsmValue() != null ? pt.getEditOsmValue() : "";
tagValues.put(pt.getEditOsmTag(), tagVal);
if (userChanges) {
changedTags.add(pt.getEditOsmTag());
}

View file

@ -67,7 +67,6 @@ import net.osmand.osm.edit.OSMSettings;
import net.osmand.osm.edit.Way;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
@ -75,6 +74,7 @@ import net.osmand.plus.base.BaseOsmAndDialogFragment;
import net.osmand.plus.osmedit.OsmPoint.Action;
import net.osmand.plus.osmedit.dialogs.PoiSubTypeDialogFragment;
import net.osmand.plus.osmedit.dialogs.PoiTypeDialogFragment;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
@ -465,8 +465,8 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment {
}
private String isTextLengthInRange() {
for (Entry<String, String> s: editPoiData.getTagValues().entrySet()) {
if (s.getValue().length() > AMENITY_TEXT_LENGTH) {
for (Entry<String, String> s : editPoiData.getTagValues().entrySet()) {
if (!Algorithms.isEmpty(s.getValue()) && s.getValue().length() > AMENITY_TEXT_LENGTH) {
return s.getKey();
}
}
@ -559,7 +559,7 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment {
if (getActivity() instanceof MapActivity) {
((MapActivity) getActivity()).getMapView().refreshMap(true);
}
dismiss();
dismissAllowingStateLoss();
} else {
OsmEditingPlugin plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class);
mOpenstreetmapUtil = plugin.getPoiModificationLocalUtil();

View file

@ -11,13 +11,13 @@ import net.osmand.osm.AbstractPoiType;
import net.osmand.osm.MapPoiTypes;
import net.osmand.osm.PoiCategory;
import net.osmand.osm.PoiType;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.api.SQLiteAPI;
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
import net.osmand.plus.api.SQLiteAPI.SQLiteCursor;
import net.osmand.plus.api.SQLiteAPI.SQLiteStatement;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.wikipedia.WikipediaPoiMenu;
import net.osmand.util.Algorithms;
@ -54,7 +54,6 @@ public class PoiFiltersHelper {
private PoiUIFilter searchByNamePOIFilter;
private PoiUIFilter customPOIFilter;
private PoiUIFilter showAllPOIFilter;
private PoiUIFilter localWikiPoiFilter;
private PoiUIFilter topWikiPoiFilter;
private List<PoiUIFilter> cacheTopStandardFilters;
private Set<PoiUIFilter> selectedPoiFilters = new TreeSet<>();
@ -120,20 +119,6 @@ public class PoiFiltersHelper {
return customPOIFilter;
}
public PoiUIFilter getLocalWikiPOIFilter() {
if (localWikiPoiFilter == null) {
PoiType place = application.getPoiTypes().getPoiTypeByKey(WIKI_PLACE);
if (place != null && !Algorithms.isEmpty(application.getLanguage())) {
PoiUIFilter filter = new PoiUIFilter(place, application, " " +
application.getLangTranslation(application.getLanguage()));
filter.setSavedFilterByName("wiki:lang:" + application.getLanguage());
filter.setStandardFilter(true);
localWikiPoiFilter = filter;
}
}
return localWikiPoiFilter;
}
public void prepareTopWikiFilter(@NonNull PoiUIFilter wiki) {
boolean prepareByDefault = true;
Bundle wikiSettings = WikipediaPoiMenu.getWikiPoiSettings(application);
@ -217,8 +202,7 @@ public class PoiFiltersHelper {
}
}
PoiUIFilter ff = getFilterById(filterId, getCustomPOIFilter(), getSearchByNamePOIFilter(),
getTopWikiPoiFilter(), getLocalWikiPOIFilter(), getShowAllPOIFilter(),
getNominatimPOIFilter(), getNominatimAddressFilter());
getTopWikiPoiFilter(), getShowAllPOIFilter(), getNominatimPOIFilter(), getNominatimAddressFilter());
if (ff != null) {
return ff;
}
@ -227,7 +211,7 @@ public class PoiFiltersHelper {
AbstractPoiType tp = application.getPoiTypes().getAnyPoiTypeByKey(typeId);
if (tp != null) {
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);
cacheTopStandardFilters = copy;
return lf;
@ -235,7 +219,7 @@ public class PoiFiltersHelper {
AbstractPoiType lt = application.getPoiTypes().getAnyPoiAdditionalTypeByKey(typeId);
if (lt != null) {
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);
cacheTopStandardFilters = copy;
return lf;
@ -279,23 +263,21 @@ public class PoiFiltersHelper {
}
public List<PoiUIFilter> getTopDefinedPoiFilters(boolean includeDeleted) {
if (cacheTopStandardFilters == null) {
List<PoiUIFilter> top = new ArrayList<>();
List<PoiUIFilter> top = this.cacheTopStandardFilters;
if (top == null) {
top = new ArrayList<>();
// user defined
top.addAll(getUserDefinedPoiFilters(true));
if (getLocalWikiPOIFilter() != null) {
top.add(getLocalWikiPOIFilter());
}
// default
MapPoiTypes poiTypes = application.getPoiTypes();
for (AbstractPoiType t : poiTypes.getTopVisibleFilters()) {
PoiUIFilter f = new PoiUIFilter(t, application, "");
top.add(f);
}
cacheTopStandardFilters = top;
this.cacheTopStandardFilters = top;
}
List<PoiUIFilter> result = new ArrayList<>();
for (PoiUIFilter filter : cacheTopStandardFilters) {
for (PoiUIFilter filter : top) {
if (includeDeleted || !filter.isDeleted()) {
result.add(filter);
}
@ -462,7 +444,7 @@ public class PoiFiltersHelper {
}
boolean res = helper.addFilter(filter, helper.getWritableDatabase(), false, forHistory);
if (res) {
ArrayList<PoiUIFilter> copy = new ArrayList<>(cacheTopStandardFilters);
ArrayList<PoiUIFilter> copy = cacheTopStandardFilters != null ? new ArrayList<>(cacheTopStandardFilters) : new ArrayList<PoiUIFilter>();
copy.add(filter);
Collections.sort(copy);
cacheTopStandardFilters = copy;
@ -510,13 +492,17 @@ public class PoiFiltersHelper {
if (filter.isTopWikiFilter()) {
prepareTopWikiFilter(filter);
}
Set<PoiUIFilter> selectedPoiFilters = new TreeSet<>(this.selectedPoiFilters);
selectedPoiFilters.add(filter);
saveSelectedPoiFilters();
saveSelectedPoiFilters(selectedPoiFilters);
this.selectedPoiFilters = selectedPoiFilters;
}
public void removeSelectedPoiFilter(PoiUIFilter filter) {
Set<PoiUIFilter> selectedPoiFilters = new TreeSet<>(this.selectedPoiFilters);
selectedPoiFilters.remove(filter);
saveSelectedPoiFilters();
saveSelectedPoiFilters(selectedPoiFilters);
this.selectedPoiFilters = selectedPoiFilters;
}
public boolean isShowingAnyPoi(PoiUIFilter ... filtersToExclude) {
@ -524,6 +510,7 @@ public class PoiFiltersHelper {
}
public void clearSelectedPoiFilters(PoiUIFilter ... filtersToExclude) {
Set<PoiUIFilter> selectedPoiFilters = new TreeSet<>(this.selectedPoiFilters);
if (filtersToExclude != null && filtersToExclude.length > 0) {
Iterator<PoiUIFilter> it = selectedPoiFilters.iterator();
while (it.hasNext()) {
@ -544,7 +531,8 @@ public class PoiFiltersHelper {
} else {
selectedPoiFilters.clear();
}
saveSelectedPoiFilters();
saveSelectedPoiFilters(selectedPoiFilters);
this.selectedPoiFilters = selectedPoiFilters;
}
public String getFiltersName(Set<PoiUIFilter> filters) {
@ -591,7 +579,7 @@ public class PoiFiltersHelper {
if(!application.getPoiTypes().isInit()) {
return;
}
selectedPoiFilters = new TreeSet<>();
Set<PoiUIFilter> selectedPoiFilters = new TreeSet<>();
for (String f : application.getSettings().getSelectedPoiFilters()) {
PoiUIFilter filter = getFilterById(f);
if (filter != null) {
@ -601,6 +589,7 @@ public class PoiFiltersHelper {
selectedPoiFilters.add(filter);
}
}
this.selectedPoiFilters = selectedPoiFilters;
}
@Nullable
@ -630,7 +619,7 @@ public class PoiFiltersHelper {
}
}
private void saveSelectedPoiFilters() {
private void saveSelectedPoiFilters(Set<PoiUIFilter> selectedPoiFilters) {
Set<String> filters = new HashSet<>();
for (PoiUIFilter filter : selectedPoiFilters) {
filters.add(filter.filterId);

View file

@ -4,7 +4,6 @@ package net.osmand.plus.poi;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.CollatorStringMatcher;
import net.osmand.CollatorStringMatcher.StringMatcherMode;
@ -380,17 +379,23 @@ public class PoiUIFilter implements SearchPoiTypeFilter, Comparable<PoiUIFilter>
private AmenityNameFilter getNameFilterInternal(StringBuilder nmFilter,
final boolean allTime, final boolean open, final List<PoiType> poiAdditionals) {
final CollatorStringMatcher sm =
nmFilter.length() > 0 ?
final CollatorStringMatcher sm = nmFilter.length() > 0 ?
new CollatorStringMatcher(nmFilter.toString().trim(), StringMatcherMode.CHECK_CONTAINS) : null;
return new AmenityNameFilter() {
@Override
public boolean accept(Amenity a) {
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());
if (!sm.matches(lower)) {
boolean match = false;
for (String name : names) {
if (sm.matches(name)) {
match = true;
break;
}
}
if (!match) {
return false;
}
}

View file

@ -67,11 +67,13 @@ import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
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()));
}
}
Map<PoiCategory, Map<String, PoiType>> toAddPoiTypes = new HashMap<>();
for (AmenityIndexRepository repo : amenityRepositories.values()) {
Map<String, List<String>> categories = ((AmenityIndexRepositoryBinary) repo).getDeltaPoiCategories();
if (!categories.isEmpty()) {
for (Map.Entry<String, List<String>> entry : categories.entrySet()) {
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()) {
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");
if (files.size() > 0 && (!indCache.exists() || indCache.canWrite())) {
try {

View file

@ -448,7 +448,6 @@ public class AddPointBottomSheetDialog extends MenuBottomSheetDialogFragment {
break;
case TARGET:
targetPointsHelper.navigateToPoint(ll, true, -1, name);
OsmAndLocationProvider.requestFineLocationPermissionIfNeeded(mapActivity);
break;
case INTERMEDIATE:
targetPointsHelper.navigateToPoint(ll, true, targetPointsHelper.getIntermediatePoints().size(), name);

View file

@ -294,7 +294,6 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
break;
case TARGET:
targetPointsHelper.navigateToPoint(latLon, true, -1, pd);
OsmAndLocationProvider.requestFineLocationPermissionIfNeeded(mapActivity);
break;
case INTERMEDIATE:
targetPointsHelper.navigateToPoint(latLon, true, targetPointsHelper.getIntermediatePoints().size(), pd);

View file

@ -273,7 +273,7 @@ public class QuickSearchCustomPoiFragment extends DialogFragment implements OnFi
quickSearchDialogFragment.reloadCategories();
}
}
searchUICore.getSearchSettings().resetSearchTypes();
resetSearchTypes();
super.onDismiss(dialog);
}
@ -301,6 +301,10 @@ public class QuickSearchCustomPoiFragment extends DialogFragment implements OnFi
});
}
private void resetSearchTypes() {
searchUICore.updateSettings(searchUICore.getSearchSettings().resetSearchTypes());
}
private void updateCloseSearchIcon(boolean searching) {
AndroidUiHelper.updateVisibility(searchProgressBar, searching);
AndroidUiHelper.updateVisibility(searchCloseIcon, !searching);
@ -331,7 +335,7 @@ public class QuickSearchCustomPoiFragment extends DialogFragment implements OnFi
private void cancelSearchSubCategories() {
searchCancelled = true;
searchUICore.getSearchSettings().resetSearchTypes();
resetSearchTypes();
updateCloseSearchIcon(false);
}
@ -359,7 +363,7 @@ public class QuickSearchCustomPoiFragment extends DialogFragment implements OnFi
app.runInUIThread(new Runnable() {
@Override
public void run() {
searchUICore.getSearchSettings().resetSearchTypes();
resetSearchTypes();
if (!searchCancelled) {
subCategoriesAdapter.setSelectedItems(selectedSubCategories);
showSearchResults(results);

View file

@ -68,14 +68,12 @@ import net.osmand.osm.PoiCategory;
import net.osmand.osm.PoiType;
import net.osmand.plus.AppInitializer;
import net.osmand.plus.AppInitializer.AppInitializeListener;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.LockableViewPager;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmAndLocationProvider.OsmAndCompassListener;
import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
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.QuickSearchMoreListItem;
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.TopToolbarControllerType;
import net.osmand.search.SearchUICore;
@ -354,19 +354,18 @@ public class QuickSearchDialogFragment extends DialogFragment implements OsmAndC
} else if (searchPhrase.isNoSelectedType() || searchPhrase.isLastWord(POI_TYPE)) {
PoiUIFilter filter;
if (searchPhrase.isNoSelectedType()) {
AbstractPoiType uselectedPoiType = searchUICore.getUnselectedPoiType();
if (isOnlineSearch() && !Algorithms.isEmpty(searchPhrase.getFirstUnknownSearchWord())) {
app.getPoiFilters().resetNominatimFilters();
filter = app.getPoiFilters().getNominatimPOIFilter();
filter.setFilterByName(searchPhrase.getUnknownSearchPhrase());
filter.clearCurrentResults();
// TODO Alexey
// } else if (searchPhrase.hasUnknownSearchWordPoiType()) {
// AbstractPoiType pt = searchPhrase.getUnknownSearchWordPoiType();
// filter = new PoiUIFilter(pt, app, "");
// String customName = searchPhrase.getPoiNameFilter();
// if (!Algorithms.isEmpty(customName)) {
// filter.setFilterByName(customName);
// }
} else if (uselectedPoiType != null) {
filter = new PoiUIFilter(uselectedPoiType, app, "");
String customName = searchUICore.getCustomNameFilter();
if (!Algorithms.isEmpty(customName)) {
filter.setFilterByName(customName);
}
} else {
filter = app.getPoiFilters().getSearchByNamePOIFilter();
if (!Algorithms.isEmpty(searchPhrase.getFirstUnknownSearchWord())) {
@ -1249,7 +1248,7 @@ public class QuickSearchDialogFragment extends DialogFragment implements OsmAndC
@Override
public void onApplyPoiFiltersState(final ApplicationMode appMode, boolean stateChanged) {
if (stateChanged) {
searchHelper.refreshFilterOrders();
searchHelper.refreshCustomPoiFilters();
reloadCategoriesInternal();
}
View containerView = getView();
@ -1269,7 +1268,7 @@ public class QuickSearchDialogFragment extends DialogFragment implements OsmAndC
settings.POI_FILTERS_ORDER.setModeValue(mode, orders);
settings.INACTIVE_POI_FILTERS.setModeValue(mode, inactive);
}
searchHelper.refreshFilterOrders();
searchHelper.refreshCustomPoiFilters();
reloadCategoriesInternal();
}
});

View file

@ -111,15 +111,18 @@ public class QuickSearchHelper implements ResourceListener {
for (CustomSearchPoiFilter udf : poiFilters.getUserDefinedPoiFilters(false)) {
core.addCustomSearchPoiFilter(udf, 0);
}
PoiUIFilter localWikiPoiFilter = poiFilters.getLocalWikiPOIFilter();
if (localWikiPoiFilter != null) {
core.addCustomSearchPoiFilter(localWikiPoiFilter, 1);
PoiUIFilter topWikiPoiFilter = poiFilters.getTopWikiPoiFilter();
if (topWikiPoiFilter != null && topWikiPoiFilter.isActive()) {
core.addCustomSearchPoiFilter(topWikiPoiFilter, 1);
}
PoiUIFilter showAllPOIFilter = poiFilters.getShowAllPOIFilter();
if (showAllPOIFilter != null && showAllPOIFilter.isActive()) {
core.addCustomSearchPoiFilter(showAllPOIFilter, 1);
}
core.addCustomSearchPoiFilter(poiFilters.getShowAllPOIFilter(), 1);
refreshFilterOrders();
}
public void refreshFilterOrders() {
private void refreshFilterOrders() {
PoiFiltersHelper filtersHelper = app.getPoiFilters();
core.setActivePoiFiltersByOrder(filtersHelper.getPoiFilterOrders(true));
}
@ -201,7 +204,7 @@ public class QuickSearchHelper implements ResourceListener {
//sr.localeRelatedObjectName = app.getRegions().getCountryName(sr.location);
sr.relatedObject = selectedGpx.getGpxFile();
sr.preferredZoom = 17;
if (phrase.getFirstUnknownSearchWord().length() <= 1 && phrase.isNoSelectedType()) {
if (phrase.getFullSearchPhrase().length() <= 1 && phrase.isNoSelectedType()) {
resultMatcher.publish(sr);
} else if (phrase.getFirstUnknownNameStringMatcher().matches(sr.localeName)) {
resultMatcher.publish(sr);
@ -313,7 +316,7 @@ public class QuickSearchHelper implements ResourceListener {
continue;
}
}
if (phrase.getFirstUnknownSearchWord().length() <= 1
if (phrase.getFullSearchPhrase().length() <= 1
&& (phrase.isNoSelectedType() || phrase.isLastWord(ObjectType.FAVORITE_GROUP))) {
resultMatcher.publish(sr);
} else if (phrase.getFirstUnknownNameStringMatcher().matches(sr.localeName)) {
@ -457,7 +460,7 @@ public class QuickSearchHelper implements ResourceListener {
}
if (publish) {
sr.priority = SEARCH_HISTORY_OBJECT_PRIORITY + (p++);
if (phrase.getFirstUnknownSearchWord().length() <= 1 && phrase.isNoSelectedType()) {
if (phrase.getFullSearchPhrase().length() <= 1 && phrase.isNoSelectedType()) {
resultMatcher.publish(sr);
} else if (phrase.getFirstUnknownNameStringMatcher().matches(sr.localeName)) {
resultMatcher.publish(sr);

View file

@ -2362,6 +2362,7 @@ public class OsmandSettings {
VOICE_PROMPT_DELAY[3] = new IntPreference("voice_prompt_delay_3", 0).makeGlobal().cache(); /*AudioManager.STREAM_MUSIC*/
VOICE_PROMPT_DELAY[5] = new IntPreference("voice_prompt_delay_5", 0).makeGlobal().cache(); /*AudioManager.STREAM_NOTIFICATION*/
}
public final OsmandPreference<Boolean> DISPLAY_TTS_UTTERANCE = new BooleanPreference("display_tts_utterance", false).makeGlobal();
// this value string is synchronized with settings_pref.xml preference name
public final CommonPreference<Boolean> MAP_ONLINE_DATA = new BooleanPreference("map_online_data", false).makeProfile();

View file

@ -0,0 +1,156 @@
package net.osmand.plus.settings.bottomsheets;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.fragments.ApplyQueryType;
import net.osmand.plus.settings.fragments.OnConfirmPreferenceChange;
import net.osmand.plus.settings.preferences.SizePreference;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
import java.util.Arrays;
public class VehicleParametersBottomSheet extends BasePreferenceBottomSheet {
private static final Log LOG = PlatformUtil.getLog(VehicleParametersBottomSheet.class);
public static final String TAG = VehicleParametersBottomSheet.class.getSimpleName();
private String selectedItem;
private float currentValue;
@Override
public void createMenuItems(Bundle savedInstanceState) {
OsmandApplication app = getMyApplication();
if (app == null) {
return;
}
items.add(createBottomSheetItem(app));
}
private BaseBottomSheetItem createBottomSheetItem(OsmandApplication app) {
final SizePreference preference = (SizePreference) getPreference();
View mainView = UiUtilities.getMaterialInflater(app, nightMode)
.inflate(R.layout.bottom_sheet_item_edit_with_recyclerview, null);
String key = preference.getKey();
TextView title = mainView.findViewById(R.id.title);
title.setText(preference.getTitle().toString());
String parameterName = key.substring(key.lastIndexOf("_") + 1);
VehicleSizeAssets vehicleSizeAssets = VehicleSizeAssets.getAssets(parameterName);
if (vehicleSizeAssets != null) {
ImageView imageView = mainView.findViewById(R.id.image_view);
imageView.setImageDrawable(app.getUIUtilities()
.getIcon(!nightMode ? vehicleSizeAssets.getDayIconId() : vehicleSizeAssets.getNightIconId()));
TextView description = mainView.findViewById(R.id.description);
description.setText(app.getString(vehicleSizeAssets.getDescriptionRes()));
}
final HorizontalSelectionAdapter adapter = new HorizontalSelectionAdapter(app, nightMode);
final TextView metric = mainView.findViewById(R.id.metric);
metric.setText(app.getString(preference.getAssets().getMetricRes()));
final TextView text = mainView.findViewById(R.id.text_edit);
try {
currentValue = Float.parseFloat(preference.getValue());
} catch (NumberFormatException e) {
currentValue = 0.0f;
}
selectedItem = preference.getEntryFromValue(preference.getValue());
String currentValueStr = currentValue == 0.0f ? "" : String.valueOf(currentValue + 0.01f);
text.setText(currentValueStr);
text.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!Algorithms.isEmpty(s)) {
try {
currentValue = Float.parseFloat(s.toString()) - 0.01f;
} catch (NumberFormatException e) {
currentValue = 0.0f;
}
} else {
currentValue = 0.0f;
}
selectedItem = preference.getEntryFromValue(String.valueOf(currentValue));
adapter.setSelectedItem(selectedItem);
}
});
adapter.setItems(Arrays.asList(preference.getEntries()));
adapter.setListener(new HorizontalSelectionAdapter.HorizontalSelectionAdapterListener() {
@Override
public void onItemSelected(String item) {
selectedItem = item;
currentValue = preference.getValueFromEntries(selectedItem);
String currentValueStr = currentValue == 0.0f ? "" : String.valueOf(currentValue + 0.01f);
text.setText(currentValueStr);
adapter.notifyDataSetChanged();
}
});
RecyclerView recyclerView = mainView.findViewById(R.id.recycler_view);
recyclerView.setAdapter(adapter);
adapter.setSelectedItem(selectedItem);
return new BaseBottomSheetItem.Builder()
.setCustomView(mainView)
.create();
}
@Override
protected int getRightBottomButtonTextId() {
return R.string.shared_string_apply;
}
@Override
protected void onRightBottomButtonClick() {
Fragment target = getTargetFragment();
if (target instanceof OnConfirmPreferenceChange) {
((OnConfirmPreferenceChange) target).onConfirmPreferenceChange(
getPreference().getKey(), String.valueOf(currentValue), ApplyQueryType.SNACK_BAR);
}
dismiss();
}
public static void showInstance(@NonNull FragmentManager fm, String key, Fragment target,
boolean usedOnMap, @Nullable ApplicationMode appMode) {
try {
if (!fm.isStateSaved()) {
Bundle args = new Bundle();
args.putString(PREFERENCE_ID, key);
VehicleParametersBottomSheet fragment = new VehicleParametersBottomSheet();
fragment.setArguments(args);
fragment.setUsedOnMap(usedOnMap);
fragment.setAppMode(appMode);
fragment.setTargetFragment(target, 0);
fragment.show(fm, TAG);
}
} catch (RuntimeException e) {
LOG.error("showInstance", e);
}
}
}

View file

@ -0,0 +1,59 @@
package net.osmand.plus.settings.bottomsheets;
import net.osmand.plus.R;
import net.osmand.router.GeneralRouter;
public enum VehicleSizeAssets {
WIDTH(GeneralRouter.VEHICLE_WIDTH, R.drawable.img_help_width_limit_day, R.drawable.img_help_width_limit_night,
R.string.width_limit_description, R.string.shared_string_meters, R.string.m),
HEIGHT(GeneralRouter.VEHICLE_HEIGHT, R.drawable.img_help_height_limit_day, R.drawable.img_help_height_limit_night,
R.string.height_limit_description, R.string.shared_string_meters, R.string.m),
WEIGHT(GeneralRouter.VEHICLE_WEIGHT, R.drawable.img_help_weight_limit_day, R.drawable.img_help_weight_limit_night,
R.string.weight_limit_description, R.string.shared_string_tones, R.string.metric_ton);
String routerParameterName;
int dayIconId;
int nightIconId;
int descriptionRes;
int metricRes;
int metricShortRes;
VehicleSizeAssets(String routerParameterName, int dayIconId, int nightIconId, int descriptionRes, int metricRes,
int metricShortRes) {
this.routerParameterName = routerParameterName;
this.dayIconId = dayIconId;
this.nightIconId = nightIconId;
this.descriptionRes = descriptionRes;
this.metricRes = metricRes;
this.metricShortRes = metricShortRes;
}
public static VehicleSizeAssets getAssets(String parameterName) {
for (VehicleSizeAssets type : VehicleSizeAssets.values()) {
if (type.routerParameterName.equals(parameterName)) {
return type;
}
}
return null;
}
public int getDayIconId() {
return dayIconId;
}
public int getNightIconId() {
return nightIconId;
}
public int getDescriptionRes() {
return descriptionRes;
}
public int getMetricRes() {
return metricRes;
}
public int getMetricShortRes() {
return metricShortRes;
}
}

View file

@ -26,13 +26,9 @@ import net.osmand.PlatformUtil;
import net.osmand.data.LatLon;
import net.osmand.map.ITileSource;
import net.osmand.map.TileSourceManager;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.SQLiteTileSource;
import net.osmand.plus.settings.backend.SettingsHelper;
import net.osmand.plus.settings.backend.SettingsHelper.FileSettingsItem;
import net.osmand.plus.settings.backend.SettingsHelper.SettingsItem;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton;
@ -42,8 +38,12 @@ import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo;
import net.osmand.plus.poi.PoiUIFilter;
import net.osmand.plus.quickaction.QuickAction;
import net.osmand.plus.quickaction.QuickActionRegistry;
import net.osmand.plus.settings.fragments.ExportImportSettingsAdapter.Type;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.SettingsHelper;
import net.osmand.plus.settings.backend.SettingsHelper.FileSettingsItem;
import net.osmand.plus.settings.backend.SettingsHelper.SettingsItem;
import net.osmand.plus.settings.bottomsheets.BasePreferenceBottomSheet;
import net.osmand.plus.settings.fragments.ExportImportSettingsAdapter.Type;
import org.apache.commons.logging.Log;
@ -403,7 +403,7 @@ public class ExportProfileBottomSheet extends BasePreferenceBottomSheet {
try {
final Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.exported_osmand_profile, profile.toHumanString()));
sendIntent.putExtra(Intent.EXTRA_SUBJECT, profile.toHumanString() + IndexConstants.OSMAND_SETTINGS_FILE_EXT);
sendIntent.putExtra(Intent.EXTRA_STREAM, AndroidUtils.getUriForFile(getMyApplication(), file));
sendIntent.setType("*/*");
sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

View file

@ -103,6 +103,7 @@ public class TurnScreenOnFragment extends BaseSettingsFragment implements OnPref
turnScreenOnPowerButton.setDescription(R.string.turn_screen_on_power_button_descr);
turnScreenOnPowerButton.setIcon(getPersistentPrefIcon(R.drawable.ic_action_power_button));
turnScreenOnPowerButton.setChecked(enabled && settings.TURN_SCREEN_ON_POWER_BUTTON.getModeValue(appMode));
turnScreenOnPowerButton.setSummaryOff(enabled ? R.string.shared_string_disabled : R.string.turn_screen_on_power_button_disabled);
}
@Override

View file

@ -4,6 +4,7 @@ import android.content.Context;
import android.graphics.drawable.Drawable;
import android.widget.ImageView;
import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
@ -14,7 +15,10 @@ import net.osmand.plus.routing.RouteProvider.RouteService;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.bottomsheets.VehicleParametersBottomSheet;
import net.osmand.plus.settings.bottomsheets.VehicleSizeAssets;
import net.osmand.plus.settings.preferences.ListPreferenceEx;
import net.osmand.plus.settings.preferences.SizePreference;
import net.osmand.router.GeneralRouter;
import java.util.Map;
@ -78,17 +82,29 @@ public class VehicleParametersFragment extends BaseSettingsFragment implements O
String defValue = parameter.getType() == GeneralRouter.RoutingParameterType.NUMERIC ? ROUTING_PARAMETER_NUMERIC_DEFAULT : ROUTING_PARAMETER_SYMBOLIC_DEFAULT;
OsmandSettings.StringPreference pref = (OsmandSettings.StringPreference) app.getSettings().getCustomRoutingProperty(parameterId, defValue);
Object[] values = parameter.getPossibleValues();
String[] valuesStr = new String[values.length];
for (int i = 0; i < values.length; i++) {
valuesStr[i] = values[i].toString();
}
String[] entriesStr = parameter.getPossibleValueDescriptions().clone();
entriesStr[0] = app.getString(R.string.shared_string_none);
ListPreferenceEx listPreference = createListPreferenceEx(pref.getId(), parameter.getPossibleValueDescriptions(), valuesStr, title, R.layout.preference_with_descr);
listPreference.setDescription(description);
listPreference.setIcon(getPreferenceIcon(parameterId));
getPreferenceScreen().addPreference(listPreference);
Context ctx = getContext();
if (ctx == null) {
return;
}
SizePreference vehicleSizePref = new SizePreference(ctx);
vehicleSizePref.setKey(pref.getId());
vehicleSizePref.setAssets(VehicleSizeAssets.getAssets(parameterId));
vehicleSizePref.setDefaultValue(defValue);
vehicleSizePref.setTitle(title);
vehicleSizePref.setEntries(entriesStr);
vehicleSizePref.setEntryValues(valuesStr);
vehicleSizePref.setSummary(description);
vehicleSizePref.setIcon(getPreferenceIcon(parameterId));
vehicleSizePref.setLayoutResource(R.layout.preference_with_descr);
getPreferenceScreen().addPreference(vehicleSizePref);
}
private void setupDefaultSpeedPref() {
@ -130,6 +146,19 @@ public class VehicleParametersFragment extends BaseSettingsFragment implements O
return super.onPreferenceClick(preference);
}
@Override
public void onDisplayPreferenceDialog(Preference preference) {
if (preference instanceof SizePreference) {
FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager != null) {
VehicleParametersBottomSheet.showInstance(fragmentManager, preference.getKey(),
this, false, getSelectedAppMode());
}
} else {
super.onDisplayPreferenceDialog(preference);
}
}
@Override
public void onPreferenceChanged(String prefId) {
recalculateRoute();

View file

@ -0,0 +1,101 @@
package net.osmand.plus.settings.preferences;
import android.content.Context;
import androidx.preference.DialogPreference;
import net.osmand.plus.R;
import net.osmand.plus.settings.bottomsheets.VehicleSizeAssets;
public class SizePreference extends DialogPreference {
private String[] entries;
private String[] entryValues;
private String description;
private VehicleSizeAssets assets;
public VehicleSizeAssets getAssets() {
return assets;
}
public void setAssets(VehicleSizeAssets assets) {
this.assets = assets;
}
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
private String defaultValue;
public SizePreference(Context context) {
super(context);
}
public String[] getEntries() {
return entries;
}
public void setEntries(String[] entries) {
this.entries = entries;
}
public String[] getEntryValues() {
return entryValues;
}
public void setEntryValues(String[] entryValues) {
this.entryValues = entryValues;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getEntryFromValue(String value) {
for (int i = 0; i < entryValues.length; i++) {
if (entryValues[i].equals(value)) {
return entries[i];
}
}
return "";
}
public float getValueFromEntries(String item) {
String[] entries = getEntries();
for (int i = 0; i < entries.length; i++) {
if (entries[i].equals(item)) {
try {
return Float.parseFloat(entryValues[i]);
} catch (NumberFormatException e) {
return 0.0f;
}
}
}
return 0.0f;
}
@Override
public CharSequence getSummary() {
String summary = "-";
String persistedString = getValue();
if (!persistedString.equals(defaultValue)) {
try {
persistedString = String.valueOf(Float.parseFloat(persistedString) + 0.01f);
summary = String.format(getContext().getString(R.string.ltr_or_rtl_combine_via_space),
persistedString, getContext().getString(assets.getMetricShortRes()));
} catch (NumberFormatException e) {
summary = "-";
}
}
return summary;
}
public String getValue() {
return getPersistedString(defaultValue);
}
}

View file

@ -236,9 +236,9 @@ public class SRTMPlugin extends OsmandPlugin {
if (contourLinesProp != null) {
final OsmandSettings.CommonPreference<String> pref = app.getSettings().getCustomRenderProperty(contourLinesProp.getAttrName());
if (!Algorithms.isEmpty(pref.get())) {
contourLinesEnabled = !pref.get().equals(CONTOUR_LINES_DISABLED_VALUE);
contourLinesEnabled = !CONTOUR_LINES_DISABLED_VALUE.equals(pref.get());
} else {
contourLinesEnabled = !contourLinesProp.getDefaultValueDescription().equals(CONTOUR_LINES_DISABLED_VALUE);
contourLinesEnabled = !CONTOUR_LINES_DISABLED_VALUE.equals(contourLinesProp.getDefaultValueDescription());
}
}
return contourLinesEnabled;

View file

@ -1,28 +1,5 @@
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.content.ContentValues;
import android.database.Cursor;
@ -31,6 +8,29 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
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;
public class TerrainLayer extends MapTileLayer {
@ -86,10 +86,10 @@ public class TerrainLayer extends MapTileLayer {
new File(cacheDir, mode == HILLSHADE ? HILLSHADE_CACHE : SLOPE_CACHE).getPath(),
null, SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING
| SQLiteDatabase.CREATE_IF_NECESSARY );
if(sqliteDb.getVersion() == 0) {
if (sqliteDb.getVersion() == 0) {
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, SQLiteTileSource> rs = readFiles(app, tilesDir, fileModified);

View file

@ -147,6 +147,10 @@ public class TTSCommandPlayerImpl extends AbstractPrologCommandPlayer {
} else if (ctx != null && vrt.isMute()) {
// sendAlertToAndroidWear(ctx, bld.toString());
}
// #5966: TTS Utterance for debugging
if (ctx != null && ctx.getSettings().DISPLAY_TTS_UTTERANCE.get()) {
((OsmandApplication) ctx.getApplicationContext()).showToastMessage(bld.toString());
}
return execute;
}