diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java index c8f84796b9..f9015ec48d 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java @@ -696,6 +696,7 @@ public class BinaryMapIndexReader { private void readMapIndex(MapIndex index, boolean onlyInitEncodingRules) throws IOException { int defaultId = 1; int oldLimit; + int encodingRulesSize = 0; while (true) { int t = codedIS.readTag(); int tag = WireFormat.getTagFieldNumber(t); @@ -712,10 +713,14 @@ public class BinaryMapIndexReader { break; case OsmandOdb.OsmAndMapIndex.RULES_FIELD_NUMBER : if (onlyInitEncodingRules) { + if(encodingRulesSize == 0) { + encodingRulesSize = codedIS.getTotalBytesRead(); + } int len = codedIS.readInt32(); oldLimit = codedIS.pushLimit(len); readMapEncodingRule(index, defaultId++); codedIS.popLimit(oldLimit); + index.encodingRulesSizeBytes = (codedIS.getTotalBytesRead() - encodingRulesSize); } else { skipUnknownField(t); } @@ -1829,10 +1834,13 @@ public class BinaryMapIndexReader { public int onewayReverseAttribute = -1; public TIntHashSet positiveLayers = new TIntHashSet(2); public TIntHashSet negativeLayers = new TIntHashSet(2); + public int encodingRulesSizeBytes; // to speed up comparision private MapIndex referenceMapIndex; + + public Integer getRule(String t, String v) { Map m = encodingRules.get(t); if (m != null) { diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java index c98ec6396f..8431df7244 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java @@ -292,6 +292,7 @@ public class BinaryMapRouteReaderAdapter { public static class RouteRegion extends BinaryIndexPart { public int regionsRead; public List routeEncodingRules = new ArrayList(); + public int routeEncodingRulesBytes = 0; public Map decodingRules = null; List subregions = new ArrayList(); List basesubregions = new ArrayList(); @@ -614,6 +615,7 @@ public class BinaryMapRouteReaderAdapter { protected void readRouteIndex(RouteRegion region) throws IOException { int routeEncodingRule = 1; + int routeEncodingRulesSize = 0; while(true){ int t = codedIS.readTag(); int tag = WireFormat.getTagFieldNumber(t); @@ -626,10 +628,13 @@ public class BinaryMapRouteReaderAdapter { break; case OsmandOdb.OsmAndRoutingIndex.RULES_FIELD_NUMBER: { int len = codedIS.readInt32(); + if(routeEncodingRulesSize == 0) { + routeEncodingRulesSize = codedIS.getTotalBytesRead(); + } int oldLimit = codedIS.pushLimit(len); readRouteEncodingRule(region, routeEncodingRule++); - codedIS.skipRawBytes(codedIS.getBytesUntilLimit()); codedIS.popLimit(oldLimit); + region.routeEncodingRulesBytes = codedIS.getTotalBytesRead() - routeEncodingRulesSize; } break; case OsmandOdb.OsmAndRoutingIndex.ROOTBOXES_FIELD_NUMBER : case OsmandOdb.OsmAndRoutingIndex.BASEMAPBOXES_FIELD_NUMBER :{ diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/MapRenderingTypes.java b/OsmAnd-java/src/main/java/net/osmand/osm/MapRenderingTypes.java index 22121c301d..a27cba56ec 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/MapRenderingTypes.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/MapRenderingTypes.java @@ -4,6 +4,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -153,6 +154,34 @@ public abstract class MapRenderingTypes { return a; } + protected MapRulType checkOrCreateTextRule(String targetTag, MapRulType ref) { + MapRulType mt = types.get(constructRuleKey(targetTag, null)); + if (mt == null) { + MapRulType ct = MapRulType.createText(targetTag, ref); + mt = registerRuleType(ct); + } + return mt; + } + + protected MapRulType checkOrMainRule(String tag, String value, int minzoom) { + MapRulType mt = types.get(constructRuleKey(tag, value)); + if (mt == null) { + mt = registerRuleType(MapRulType.createMainEntity(tag, value)); + mt.minzoom = minzoom; + mt.maxzoom = 21; + } + return mt; + } + + protected MapRulType checkOrCreateAdditional(String tag, String value, MapRulType ref) { + MapRulType mt = types.get(constructRuleKey(tag, value)); + if (mt == null) { + MapRulType ct = MapRulType.createAdditional(tag, value, ref); + mt = registerRuleType(ct); + } + return mt; + } + protected MapRulType getRuleType(String tag, String val, boolean poi, boolean map) { Map types = getEncodingRuleTypes(); tag = lc(tag); @@ -171,7 +200,6 @@ public abstract class MapRenderingTypes { rType.map = parent.map; rType.poi = parent.poi; rType.onlyPoint = parent.onlyPoint; - rType.namePrefix = parent.namePrefix; rType = registerRuleType(rType); } return rType; @@ -264,38 +292,105 @@ public abstract class MapRenderingTypes { rtype.category = parentCategory == null ? null : parentCategory.category; rtype.onlyPoint = Boolean.parseBoolean(parser.getAttributeValue("", "point")); //$NON-NLS-1$ rtype.relation = Boolean.parseBoolean(parser.getAttributeValue("", "relation")); //$NON-NLS-1$ - rtype.relationGroup = Boolean.parseBoolean(parser.getAttributeValue("", "relationGroup")); //$NON-NLS-1$ - if (rtype.isMain()) { - rtype.namePrefix = parser.getAttributeValue("", "namePrefix"); //$NON-NLS-1$ - if (rtype.namePrefix == null) { - rtype.namePrefix = ""; + if (rtype.isMain()) { + if (rtype.relation) { + MapRulType mrt = MapRulType.createMainEntity(tag + "_" + value, null); + mrt.order = rtype.order; + mrt.category = rtype.category; + mrt.poi = rtype.poi; + mrt.map = rtype.map; + registerMapRule(parser, mrt); } - - String v = parser.getAttributeValue("", "nameTags"); - if (v != null) { - String[] names = v.split(","); - rtype.names = new MapRulType[names.length * (langs.length + 1)]; - int j = 0; - for (int i = 0; i < names.length; i++) { - String tagName = names[i]; - if (rtype.namePrefix.length() > 0) { - tagName = rtype.namePrefix + tagName; - } - MapRulType mt = MapRulType.createText(tagName); - mt = registerRuleType(mt); - rtype.names[j++] = mt; - for(String lng : langs) { - mt = MapRulType.createText(tagName + ":" + lng); - mt = registerRuleType(mt); - rtype.names[j++] = mt; + + String groupSort = parser.getAttributeValue("", "relationGroupSort"); + if (groupSort != null) { + rtype.relationSortTags = new LinkedHashMap>(); + String[] ls = groupSort.split(";"); + for(String l : ls) { + int sp = l.indexOf('='); + String key = l; + String[] values = new String[0]; + if(sp >= 0) { + key = l.substring(0, sp); + values = l.substring(sp +1).split(","); } + rtype.relationSortTags.put(key, Arrays.asList(values)); } } + + String additionalTags = parser.getAttributeValue("", "additionalTags"); + String additionalPrefix = parser.getAttributeValue("", "additionalPrefix"); + if (additionalTags != null) { + rtype.additionalTags = new LinkedHashMap(); + for(String tg : additionalTags.split(",")) { + String targetTag = tg; + if(!Algorithms.isEmpty(additionalPrefix)) { + targetTag = additionalPrefix + tg; + } + rtype.additionalTags.put(tg, targetTag); + } + } + rtype.relationGroupPrefix = parser.getAttributeValue("", "relationGroupPrefix"); //$NON-NLS-1$ + String relationGroupAdditionalTags = parser.getAttributeValue("", "relationGroupAdditionalTags"); + if (relationGroupAdditionalTags != null) { + rtype.relationGroupAdditionalTags = new LinkedHashMap(); + for(String tg : relationGroupAdditionalTags.split(",")) { + rtype.relationGroupAdditionalTags.put(tg, tg); + } + } + + String nmts = parser.getAttributeValue("", "nameTags"); + if(nmts != null) { + String namePrefix = parser.getAttributeValue("", "namePrefix"); //$NON-NLS-1$ + if (namePrefix == null) { + namePrefix = ""; + } + rtype.relationNames = new LinkedHashMap(); + putNameTags(nmts, rtype.relationNames, namePrefix); + } + String rnmts = parser.getAttributeValue("", "relationGroupNameTags"); + if (rnmts != null) { + rtype.relationGroupNameTags = new LinkedHashMap(); + putNameTags(rnmts, rtype.relationGroupNameTags, ""); + } } return rtype; } + private void putNameTags(String namesList, Map names, String namePrefix) { + if (namesList != null) { + String[] nameSplit = namesList.split(","); + for (int i = 0; i < nameSplit.length; i++) { + String tagName = nameSplit[i]; + String tagTargetName = tagName; + if (namePrefix.length() > 0) { + tagTargetName = namePrefix + tagName; + } + names.put(tagName, tagTargetName); + for (String lng : langs) { + names.put(tagName + ":" + lng, tagTargetName + ":" + lng); + } + } + } + } + + protected void registerMapRule(XmlPullParser parser, MapRulType rtype) { + String val = parser.getAttributeValue("", "minzoom"); //$NON-NLS-1$ + if (rtype.isMain()) { + rtype.minzoom = 15; + } + if (val != null) { + rtype.minzoom = Integer.parseInt(val); + } + val = parser.getAttributeValue("", "maxzoom"); //$NON-NLS-1$ + rtype.maxzoom = 31; + if (val != null) { + rtype.maxzoom = Integer.parseInt(val); + } + registerRuleType(rtype); + } + protected MapRulType registerRuleType(MapRulType rt) { String tag = rt.tagValuePattern.tag; String val = rt.tagValuePattern.value; @@ -422,7 +517,14 @@ public abstract class MapRenderingTypes { } public static class MapRulType { - protected MapRulType[] names; + // relation part + protected Map relationNames; + protected Map additionalTags; + protected Map> relationSortTags; + protected String relationGroupPrefix; + protected Map relationGroupNameTags; + protected Map relationGroupAdditionalTags; + protected TagValuePattern tagValuePattern; protected boolean additional; protected boolean additionalText; @@ -431,7 +533,6 @@ public abstract class MapRenderingTypes { protected String category = null; protected boolean relation; - protected boolean relationGroup; // creation of only section protected boolean map = true; protected boolean poi = true; @@ -440,7 +541,6 @@ public abstract class MapRenderingTypes { protected int minzoom; protected int maxzoom; protected boolean onlyPoint; - protected String namePrefix =""; // inner id @@ -452,6 +552,16 @@ public abstract class MapRenderingTypes { private MapRulType(){ } + + private void copyMetadata(MapRulType ref) { + minzoom = ref.minzoom; + maxzoom = ref.maxzoom; + order = ref.order; + category = ref.category; + onlyPoint = ref.onlyPoint; + } + + public boolean isPOI(){ return poi; } @@ -471,24 +581,37 @@ public abstract class MapRenderingTypes { return rt; } - public static MapRulType createText(String tag) { + public static MapRulType createText(String tag, MapRulType ref) { MapRulType rt = new MapRulType(); - rt.additionalText = true; rt.minzoom = 2; rt.maxzoom = 31; - rt.tagValuePattern = new TagValuePattern(tag, null); + if (ref != null) { + rt.copyMetadata(ref); + } + rt.additionalText = true; + rt.tagValuePattern = new TagValuePattern(tag, null); return rt; } - public static MapRulType createAdditional(String tag, String value) { + public static MapRulType createAdditional(String tag, String value, MapRulType ref) { MapRulType rt = new MapRulType(); - rt.additional = true; rt.minzoom = 2; rt.maxzoom = 31; + if (ref != null) { + rt.copyMetadata(ref); + } + rt.additional = true; rt.tagValuePattern = new TagValuePattern(tag, value); return rt; } + public static MapRulType createText(String tag) { + return createText(tag, null); + } + + public static MapRulType createAdditional(String tag, String value) { + return createAdditional(tag, value, null); + } public String getTag() { return tagValuePattern.tag; @@ -549,14 +672,6 @@ public abstract class MapRenderingTypes { return onlyPoint; } - public boolean isRelation() { - return relation; - } - - public boolean isRelationGroup() { - return relationGroup; - } - public int getFreq() { return freq; diff --git a/OsmAnd-telegram/res/values-uk/strings.xml b/OsmAnd-telegram/res/values-uk/strings.xml index 28e088080f..1ff2bebb09 100644 --- a/OsmAnd-telegram/res/values-uk/strings.xml +++ b/OsmAnd-telegram/res/values-uk/strings.xml @@ -251,7 +251,7 @@ Збережені повідомлення Оберіть часовий пояс щоб відобразити повідомлення у вашому розташуванні. Часовий пояс - Одиниця вимірювання та формати + Одиниці виміру й формати Одиниці вимірювання довжини Змінити одиницю вимірювання відстані. Визначити одиницю швидкості. diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 56c85c305b..881455e2d9 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -1185,7 +1185,7 @@ حدد حد السرعة المسموح به لتلقي تنبيه صوتي إذا ما تجاوزته. مراقبة الحدود كشك الرسوم - تخفيف الازدحام + مطب كاميرا مراقبة السرعة تنبيه مروري نقاط الاهتمام المجاورة diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index f54da11034..c6aa61825e 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -3839,4 +3839,10 @@ Benutzerdefiniert Richtungspfeile Ausgefüllt + Zuletzt bearbeitet + Track importieren + Vorhandenen Track öffnen + Neue Route erstellen + Wählen Sie eine Trackdatei zum Öffnen aus. + Fertig \ No newline at end of file diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index 212a456e53..fad71be324 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -3815,4 +3815,7 @@ Por favor, proporcione un nombre para el punto El punto de destino actual de la ruta será borrado. Si se trata del destino, la navegación se detendrá. Descargar mapas de Wikipedia + Abrir la pista existente + Crea una nueva ruta + Planea una ruta \ No newline at end of file diff --git a/OsmAnd/res/values-et/phrases.xml b/OsmAnd/res/values-et/phrases.xml index 3351abbc5a..658605c00c 100644 --- a/OsmAnd/res/values-et/phrases.xml +++ b/OsmAnd/res/values-et/phrases.xml @@ -326,7 +326,7 @@ Rehvid Sõiduki tehnoülevaatus Autopesula - Bensiinijaam; Bensiinijaam; Tankla; Bensiinijaam + Tankla; Bensiinijaam Sõiduki kaldtee Suruõhk Parkimine @@ -634,7 +634,7 @@ Parvlaev 91UL kütus 100LL kütus - AdBlue kütus + Diiselväljalaske vedelik (AdBlue) Kütus: puit Kütus: puusüsi Kütus: kivisüsi @@ -678,7 +678,7 @@ Traavivõistlused Uisutamine Jäävaru - Korfbal + Korfball Orienteerumine Mõlatennis Paraliuglemine @@ -1311,7 +1311,7 @@ Tehisjõul Pump puudub Mineraal - Vee omadus: muda + Muda Väävelhape Veepunkt Liigid @@ -1354,7 +1354,7 @@ Jah Ilma kombatava sillutiseta Jah - Ei + Heli: ei Ainult kui kõndimine on lubatud Raskeveokite teemaks Päästejaam @@ -1639,7 +1639,7 @@ Elektrisõidukite remont Mootorrataste remont Jah - Iseteenindust ei ole + Ei Jah Mitteautomaatne Täisteenus @@ -1663,7 +1663,7 @@ Mähkmevahetuslaud Mähkmevahetuslaud puudub Mähkmevahetustuba - Autopesu: ei + Ei Parkimisaja piir Parkimispiletid Sigaretid @@ -1709,7 +1709,7 @@ Koshinto Sinine tahvel Jizo - Ristikujuline + Risti kuju Sõiduk Obelisk Pealdis @@ -3800,4 +3800,18 @@ Veetase: üleujutatud Veetase: kaetud Veetase: veega kaetud + Linnaosa + Vald + Annetuskast + Teeviit + Jah + Jah + Vibreerimine: ei + Pumba olek: kiir puudub + Imatav + Hüdrant + Pinnavesi + Toru + Värin + Surve \ No newline at end of file diff --git a/OsmAnd/res/values-et/strings.xml b/OsmAnd/res/values-et/strings.xml index 8b422cc796..b13ac9510c 100644 --- a/OsmAnd/res/values-et/strings.xml +++ b/OsmAnd/res/values-et/strings.xml @@ -903,7 +903,7 @@ Kaart navigeerimise ajal Kaart navigeerimise ajal Muu - Kaal, kõrgus, kiirus + Kaal, kõrgus, pikkus, kiirus Sõiduki parameetrid Häälteated toimuvad ainult navigeerimise ajal. Navigeerimisjuhised ja teated @@ -1124,7 +1124,7 @@ Haiti Galiitsia Eesti - Cebuano + Sebu Sul on vana ja kokkusobimatu Vikipeedia andmestik. Arhiveerida see\? Laadida täiendavaid andmeid Vikipeediast (%1$s MB)\? Asukohateenus on välja lülitatud. Lülitada sisse\? @@ -1457,7 +1457,7 @@ Portugali Rumeenia Vene - Sardiinia + Sardi Serbia (kirillitsa) Slovaki Sloveenia @@ -2399,7 +2399,7 @@ Praegu avatud Postiindeks Kategooriad - Sorbia (ülem) + Ülemsorbi jagatud OsmAnd kaudu Kuva %1$s kaardil Otsi %1$s kauguses @@ -2439,7 +2439,7 @@ Tellimus võimaldab uuendused igas tunnis, päevas või nädalas ja piiramatu kogu maailma kaartide alla laadimise. Miilid/jalad Austraalia - Kabyle + Kabiili Filtrid Rakenda filtrid Salvesta filter @@ -3478,4 +3478,51 @@ Ei saanud lugeda %1$s. Ei saanud kirjutada %1$s. Ei saanud importida %1$s. + Kõik Vikipeedia artiklid ei pruugi olla saadaval sinu valitud keeles. + Kantoni + Lõunamini + Joruba + Varai + Usbeki + Urdu + Tatari + Tadžiki + Šoti + Sitsiilia + Pandžabi + Nepali + Napoli + Kirgiisi + Birma + Mongoli + Minangkabau + Malagassi + Kasahhi + Jaava + Gudžarati + Tšuvaši + Tšetšeeni + Baieri + Baškiiri + Aragoni + Lombardi + Kohandatud värv + Jätkamiseks pead valima tööpäevad + Teekond punktide vahel + Kavanda teekonda + Lisa rajale + Näita alguse ja lõpu ikoone + Vali laius + Kohandatud + Suunanooled + Viimati muudetud + Impordi rada + Ava olemasolev rada + Vali avatav rajafail. + Loo uus marsruut + Valmis + Keeled + Keel + Kõik keeled + Antarktis \ No newline at end of file diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 68a92d07e8..e11944f900 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -3814,4 +3814,10 @@ Afficher les icônes de départ et d\'arrivée Sélectionner la largeur Flèches de direction + Dernière modification + Importer une trace + Ouvrir une trace existante + Créer un nouvel itinéraire + Sélectionnez un fichier de trace à ouvrir. + Terminé \ No newline at end of file diff --git a/OsmAnd/res/values-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml index 6249b4e58d..2daaed73c7 100644 --- a/OsmAnd/res/values-iw/strings.xml +++ b/OsmAnd/res/values-iw/strings.xml @@ -1515,7 +1515,7 @@ ביקורת גבולות עמדת תשלום סימן עצור - מיתון תנועה + פסי האטה מצלמת מהירות אזהרת תנועה מועדפים בסביבה @@ -3840,4 +3840,10 @@ התאמה אישית חצי כיוון אחיד + עריכה אחרונה + ייבוא מסלול + פתיחת מסלול קיים + יצירת מסלול חדש + נא לבחור קובץ מסלול לפתיחה. + בוצע \ No newline at end of file diff --git a/OsmAnd/res/values-lt/phrases.xml b/OsmAnd/res/values-lt/phrases.xml index caf31f7a1c..cfb73ccf2b 100644 --- a/OsmAnd/res/values-lt/phrases.xml +++ b/OsmAnd/res/values-lt/phrases.xml @@ -1,409 +1,415 @@ -Parduotuvė - Maisto parduotuvė ir supermarketas - Pagalbos tarnybos - Transportas - Kelio kliūtis - Degalinė - Asmeninis transportas - Viešasis transportas - Oro transportas - Vandens transportas - Dviračių transportas - Lynų keltuvai - Pėsčiųjų žygių/dviračių maršrutų mazgai - Pėsčiųjų žygių maršrutai - Eismo valdymas - Dribtinės kilmės - Transporto konstrukcija - Vandens tiekimas - Elektros energija - Komunikacija - Šiukšlių šalinimas - Žemėtvarka - Švietimas - Administraciniai objektai - Sveikatos paslaugos - Biuras - Sportas - Turizmas - Lankytini objektai - Nakvynė - Interneto prieiga - Laisvalaikis - Klubas - Maistas - Kavinė ir restoranas - Paslaugos - Rankdarbiai - Finansai - Gamta - Laivyba - Kariniai objektai - Vikipedija - Nustatyta naudotojo - - Paleontologinis objektas - - Kepykla - Alkoholio parduotuvė - Sūrio parduotuvė - Šokolado parduotuvė - Kavos parduotuvė - Parduotuvėlė - Prekybos centras - Gėrimų parduotuvė - Mėsos turgus - Gurmaniško maisto parduotuvė - Ūkininko parduotuvė - Daržovių parduotuvė - Jūros gėrybių parduotuvė - Konditerija - Ledainė - Prekybos centras - Arbatos parduotuvė - Pastos parduotuvė - Knygynas - Dviračių parduotuvė - Antikvariatas - Meno dirbinių parduotuvė - Prekės kūdikiams - Vonios kambario įranga - Fotoaparatai ir objektyvai - Kilimų parduotuvė - Rūbų parduotuvė - Rūbai vaikams - Batų parduotuvė - Kompiuterių parduotuvė - Užuolaidų parduotuvė - Nardymo įranga - Durys - Seks parduotuvė - Gėlių parduotuvė - Rėmelių parduotuvė - Baldų parduotuvė - Sodo baldų parduotuvė - Suskystintų dujų parduotuvė - Konditerija - Pieno parduotuvė - Prekybos automatas - Vyno parduotuvė - Anime parduotuvė - Krepšių parduotuvė - Patalynės parduotuvė - Butikas - Labdaros parduotuvė - Vaistinė - Žvakių parduotuvė - Kopijavimas - Audinių parduotuvė -Statybinių prekių parduotuvė - Rūbų parduotuvė - Žvejybos reikmenys - Laisvo kritimo skrydžio prekės - Šildymo prekės - Sodo prekės - Parduotuvė - Dovanų parduotuvė - Stiklo parduotuvė - Įrankių parduotuvė - Klausos aparatai - Žolelių parduotuvė - Garso aparatūros parduotuvė - Namų apyvokos daiktai - Mokėjimo tipas - Kuro kortelės - Degalų tipas - Kuro tipas (avia) - Interneto prieigos tipas - Tipas - Dviračių aptarnavimas - Tipas - Tipas - Vandens šaltinis - Mokėjimo tipas - Tipas - Paslauga - Savitarna - Automatizuotas - Tipas - Metro stotis - Krovinys - Tipas - Šildymas - Siurblys - Tipas - Tipas - Tipas - Sostinė - Specializacija - Tipas - Religija - Tipas - Turinys - Papildomai - Skautų stovykla - Tipas - Trasos sudėtingumas - Žanras - Mokamas - Rūkymas - Pristatymas - Išsinešti - Kokteiliai - Paslauga - Tipas - Tipas - Laužavietė - Sezoniškumas - Paviršius - Nudizmas - -Juvelyrinė parduotuvė - Kioskas - Papildomas - Pardavimų tipas - Vieta - Garsas - Taktilinė danga - Bekontaktis - Dengtas - Dviračių transportas - Žymėjimas - Išdavimas - Sąvybės - Žvaigždučių kiekis - Tikyba - Užmiestis - Trasų tvarkymas - Sėdimos vietos lauke - Klientų aptarnavimas automobiliuose - Klientų aptarnavimas automobiliuose - Smulki alaus darykla - Priimamos šiukšlės - Vandens sąvybės - Medžioklės įranga - Vidaus dekoro parduotuvė - Virtuvės baldai - Odos parduotuvė - Medicinos priemonės - Masažo tipas - Skalbyklė - Valgiai - Tipas - Tikslinė grupė - Dulkių siurblys - Sporto prekės - Biuro prekės - Turgus - Pirotechnika - Ginklai - Gaisrinė - Gesintuvas - Smėlio dėžė - Brasta - Vartai - Miesto siena - Pasienio kontrolė - Padangos - Automobilių plovykla - Degalinė - Dyzelinas - Biodyzelinas - Suskystintos dujos - Gamtinės dujos - Etanolis - Metanolis - E10 - E20 - E85 - Biodujos - Suskystintas vandenilis - Elektra - Įkrovimo stotelė - Oro pompa - Garažai - - Visuomeninio transporto stotelė - Autobusų stotelė - Troleibusų stotelė - Autobuso stotelė - Tramvajaus stotelė - Viešojo transporto stotis - Autobusų stotis - Geležinkelio stotis - Geležinkelio platforma - Įėjimas į metro - Taip - Oro uostas - Pakilimo juosta - Oro uosto terminalas - Kelto prieplauka - Švyturys - - Dviračių nuoma - Tunelis - Tiltas - - Greičio kamera - Poilsio zona - - Šulinys - Valymo įrenginiai - Vandens bokštas - Damba - Vandens malūnas - Bangolaužis - Pastotė - Transformatorius - Elektrinė - Generatorius - - Stulpas - - Paštas - Pašto dėžutė - Telefonas - Foto studija - -Spaudos kioskas - Bilietai - Rūkalai - Muzikos parduotuvė - Muzikos instrumentai - Žaislų parduotuvė - Universalinė parduotuvė - Automobilių dalys - Policija - Apžvalgos bokštas - Konteineris - Stiklas - Popierius - Rūbai - Skardinės - Stikliniai buteliai - Plastikas - Metalo laužas - Baterijos - Plastikiniai buteliai - Plastikinė tara - Laikraščiai - Žurnalai - Pakavimo popierius - Mediena - Knygos - Apavas - Aliuminis - Metalas - Variklio alyva - Plastikiniai maišeliai - Pavojingos atliekos - Mobilūs telefonai - Gyvsidabris - Kompiuteriai - Padangos - Televizoriai, monitoriai - Kompaktinės plokštelės - Buteliai - Dažai - Vaistai - Kompostas - Poliesteris - Šaldytuvai ir šaldikliai - Baldai - Sauskelnės - Akumuliatoriai - Automobiliai - Dviračiai - - Branduolinės atliekos - Šiukšlių dėžė - - Gyvenamasis rajonas - Karjeras - Sodas - Sodai - Pieva - Kanalas - Observatorija - Bokštas - Radaras - Kranas - Statybvietė - Vėjo malūnas - Koledžas - Vairavimo mokykla - Vaikų darželis - Mokykla - Universitetas - - Teismo rūmai - Kalėjimas - Valstybinė įmonė - Prokuratūra - Migracijos tarnyba - Mokesčių inspekcija - Muitinė - Šalis - Miestas - Taip - Miestelis - Kaimas - Vienkiemis - Ūkis - - - Vaistinė - Ligoninė - Gydytojai - Sanatorija - Kraujo bankas - Prichoterapeutas - Logopedas - Pediatras - - Nekilnojamo turto agentūra - Visuomeninė organizacija - Dieta - Medicininė specializacija - Palapinės - Automobilių priekabos - Elektros energijos šaltinis - Medicininė sistema - Namų aplankymas - Mokėjimo tipas (transportas) - Suspaustas oras - Charakteristika - Valgykla - Tipas - Paslaugos - Motociklo tipas - -Avarinė infrastruktūra - Mobilių telefonų parduotuvė - Motociklų parduotuvė - Optika - Ekologiški maisto produktai - Aktyvaus poilsio prekių parduotuvė - Dažų parduotuvė - Gyvūnų parduotuvė - Foto parduotuvė - Radijo technikos parduotuvė - Naudotų daiktų parduotuvė - Nardymo prekių parduotuvė - Laivų aptrūpinimo agentas - Stalo įrankių parduotuvė - Turgelis - Padangų parduotuvė - Tikslas - Nuomojamos valtys - Eksploatacinė būklė - Vandens tiekimo tipas - Vandens valymas - Dulkių siurblių parduotuvė - Video parduotuvė - Elektronikos parduotuvė - Automobilių pardavėjas - Kosmetika - Laikrodžių parduotuvė - \ No newline at end of file + + Parduotuvė + Maisto parduotuvė ir supermarketas + Pagalbos tarnybos + Transportas + Kelio kliūtis + Degalinė + Asmeninis transportas + Viešasis transportas + Oro transportas + Vandens transportas + Dviračių transportas + Lynų keltuvai + Pėsčiųjų žygių/dviračių maršrutų mazgai + Pėsčiųjų žygių maršrutai + Eismo valdymas + Dribtinės kilmės + Transporto konstrukcija + Vandens tiekimas + Elektros energija + Komunikacija + Šiukšlių šalinimas + Žemėtvarka + Švietimas + Administraciniai objektai + Sveikatos paslaugos + Biuras + Sportas + Turizmas + Lankytini objektai + Nakvynė + Interneto prieiga + Laisvalaikis + Klubas + Maistas + Kavinė ir restoranas + Paslaugos + Rankdarbiai + Finansai + Gamta + Laivyba + Kariniai objektai + Vikipedija + Nustatyta naudotojo + Paleontologinis objektas + Kepykla + Alkoholio parduotuvė + Sūrio parduotuvė + Šokolado parduotuvė + Kavos parduotuvė + Parduotuvėlė + Prekybos centras + Gėrimų parduotuvė + Mėsos turgus + Gurmaniško maisto parduotuvė + Ūkininko parduotuvė + Daržovių parduotuvė + Jūros gėrybių parduotuvė + Konditerija + Ledainė + Prekybos centras + Arbatos parduotuvė + Pastos parduotuvė + Knygynas + Dviračių parduotuvė + Antikvariatas + Meno dirbinių parduotuvė + Prekės kūdikiams + Vonios kambario įranga + Fotoaparatai ir objektyvai + Kilimų parduotuvė + Rūbų parduotuvė + Rūbai vaikams + Batų parduotuvė + Kompiuterių parduotuvė + Užuolaidų parduotuvė + Nardymo įranga + Durys + Seks parduotuvė + Gėlių parduotuvė + Rėmelių parduotuvė + Baldų parduotuvė + Sodo baldų parduotuvė + Suskystintų dujų parduotuvė + Konditerija + Pieno parduotuvė + Prekybos automatas + Vyno parduotuvė + Anime parduotuvė + Krepšių parduotuvė + Patalynės parduotuvė + Butikas + Labdaros parduotuvė + Vaistinė + Žvakių parduotuvė + Kopijavimas + Audinių parduotuvė + Statybinių prekių parduotuvė + Rūbų parduotuvė + Žvejybos reikmenys + Laisvo kritimo skrydžio prekės + Šildymo prekės + Sodo prekės + Parduotuvė + Dovanų parduotuvė + Stiklo parduotuvė + Įrankių parduotuvė + Klausos aparatai + Žolelių parduotuvė + Garso aparatūros parduotuvė + Namų apyvokos daiktai + Mokėjimo tipas + Kuro kortelės + Degalų tipas + Kuro tipas (avia) + Interneto prieigos tipas + Tipas + Dviračių aptarnavimas + Tipas + Tipas + Vandens šaltinis + Mokėjimo tipas + Tipas + Paslauga + Savitarna + Automatizuotas + Tipas + Metro stotis + Krovinys + Tipas + Šildymas + Siurblys + Tipas + Tipas + Tipas + Sostinė + Specializacija + Tipas + Religija + Tipas + Turinys + Papildomai + Skautų stovykla + Tipas + Trasos sudėtingumas + Žanras + Mokamas + Rūkymas + Pristatymas + Išsinešti + Kokteiliai + Paslauga + Tipas + Tipas + Laužavietė + Sezoniškumas + Paviršius + Nudizmas + Juvelyrinė parduotuvė + Kioskas + Papildomas + Pardavimų tipas + Vieta + Garsas + Taktilinė danga + Bekontaktis + Dengtas + Dviračių transportas + Žymėjimas + Išdavimas + Sąvybės + Žvaigždučių kiekis + Tikyba + Užmiestis + Trasų tvarkymas + Sėdimos vietos lauke + Klientų aptarnavimas automobiliuose + Klientų aptarnavimas automobiliuose + Smulki alaus darykla + Priimamos šiukšlės + Vandens sąvybės + Medžioklės įranga + Vidaus dekoro parduotuvė + Virtuvės baldai + Odos parduotuvė + Medicinos priemonės + Masažo tipas + Skalbyklė + Valgiai + Tipas + Tikslinė grupė + Dulkių siurblys + Sporto prekės + Biuro prekės + Turgus + Pirotechnika + Ginklai + Gaisrinė + Gesintuvas + Smėlio dėžė + Brasta + Vartai + Miesto siena + Pasienio kontrolė + Padangos + Automobilių plovykla + Degalinė;Degalinė;Degalinė;Degalinė + Dyzelinas + Biodyzelinas + Suskystintos dujos + Gamtinės dujos + Etanolis + Metanolis + E10 + E20 + E85 + Biodujos + Suskystintas vandenilis + Elektra + Įkrovimo stotelė + Oro pompa + Garažai + Visuomeninio transporto stotelė + Autobusų stotelė + Troleibusų stotelė + Autobuso stotelė + Tramvajaus stotelė + Viešojo transporto stotis + Autobusų stotis + Geležinkelio stotis + Geležinkelio platforma + Įėjimas į metro + Taip + Oro uostas + Pakilimo juosta + Oro uosto terminalas + Kelto prieplauka + Švyturys + Dviračių nuoma + Tunelis + Tiltas + Greičio kamera + Poilsio zona + Šulinys + Valymo įrenginiai + Vandens bokštas + Damba + Vandens malūnas + Bangolaužis + Pastotė + Transformatorius + Elektrinė + Generatorius + + Stulpas + Paštas + Pašto dėžutė + Telefonas + Foto studija + Spaudos kioskas + Bilietai + Rūkalai + Muzikos parduotuvė + Muzikos instrumentai + Žaislų parduotuvė + Universalinė parduotuvė + Automobilių dalys + Policija + Apžvalgos bokštas + Konteineris + Stiklas + Popierius + Rūbai + Skardinės + Stikliniai buteliai + Plastikas + Metalo laužas + Baterijos + Plastikiniai buteliai + Plastikinė tara + Laikraščiai + Žurnalai + Pakavimo popierius + Mediena + Knygos + Apavas + Aliuminis + Metalas + Variklio alyva + Plastikiniai maišeliai + Pavojingos atliekos + Mobilūs telefonai + Gyvsidabris + Kompiuteriai + Padangos + Televizoriai, monitoriai + Kompaktinės plokštelės + Buteliai + Dažai + Vaistai + Kompostas + Poliesteris + Šaldytuvai ir šaldikliai + Baldai + Sauskelnės + Akumuliatoriai + Automobiliai + Dviračiai + Branduolinės atliekos + Šiukšlių dėžė + Gyvenamasis rajonas + Karjeras + Sodas + Sodai + Pieva + Kanalas + Observatorija + Bokštas + Radaras + Kranas + Statybvietė + Vėjo malūnas + Koledžas + Vairavimo mokykla + Vaikų darželis + Mokykla + Universitetas + Teismo rūmai + Kalėjimas + Valstybinė įmonė + Prokuratūra + Migracijos tarnyba + Mokesčių inspekcija + Muitinė + Šalis + Miestas + Taip + Miestelis + Kaimas + Vienkiemis + Ūkis + Vaistinė + Ligoninė + Gydytojai + Sanatorija + Kraujo bankas + Prichoterapeutas + Logopedas + Pediatras + Nekilnojamo turto agentūra + Visuomeninė organizacija + Dieta + Medicininė specializacija + Palapinės + Automobilių priekabos + Elektros energijos šaltinis + Medicininė sistema + Namų aplankymas + Mokėjimo tipas (transportas) + Suspaustas oras + Charakteristika + Valgykla + Tipas + Paslaugos + Motociklo tipas + Avarinė infrastruktūra + Mobilių telefonų parduotuvė + Motociklų parduotuvė + Optika + Ekologiški maisto produktai + Aktyvaus poilsio prekių parduotuvė + Dažų parduotuvė + Gyvūnų parduotuvė + Foto parduotuvė + Radijo technikos parduotuvė + Naudotų daiktų parduotuvė + Nardymo prekių parduotuvė + Laivų aptrūpinimo agentas + Stalo įrankių parduotuvė + Turgelis + Padangų parduotuvė + Tikslas + Nuomojamos valtys + Eksploatacinė būklė + Vandens tiekimo tipas + Vandens valymas + Dulkių siurblių parduotuvė + Video parduotuvė + Elektronikos parduotuvė + Automobilių pardavėjas + Kosmetika + Laikrodžių parduotuvė + Sodininkas + Elektrikas + Bitininkas + Taip + Ne + Statusas + Tipas + Tipas + Rodyklė + Vibracija + Slėgis + Vaizdo medžiaga + SMS + Privažiavimas autobusu + Privažiavimas sniego motociklu + Taip + Autoservisas + Denotacija + Knygos + Tipas + Gyvūnai priimami + \ No newline at end of file diff --git a/OsmAnd/res/values-lt/strings.xml b/OsmAnd/res/values-lt/strings.xml index 1e8c0895ce..ef952e3795 100644 --- a/OsmAnd/res/values-lt/strings.xml +++ b/OsmAnd/res/values-lt/strings.xml @@ -2557,17 +2557,17 @@ Tai yra puikus būdas paremti OsmAnd ir OSM, jei jie jums patinka. Sutaupyk %1$s %1$.2f %2$s Pirmiausiai parinkite miestą - Vengti tramvajų + Be tramvajų Vengti tramvajų - Vengti autobusų + Be autobusų Vengti autobusų ir troleibusų - Vengti dalinimosi taksi + Be dalinimosi taksi Vengti dalinimosi taksi - Vengti traukinių + Be traukinių Vengti traukinių - Vengti metro + Be metro Vengti metro ir lengvojo geležinkelio - Vengti keltų + Be keltų Vengti keltų • Rodyti laiką tarp persėdimų viešajame transporte \n @@ -2656,7 +2656,7 @@ Tai yra puikus būdas paremti OsmAnd ir OSM, jei jie jums patinka. Pėsčiomis Kelias Kemperis - Rodyti mažos taršos zonas. Tai neturi įtakos maršrutizavimui. + Rodyti mažos taršos zonas. Tai neturi įtakos maršruto generavimui. Rodyti mažos taršos zonas Įvertinti laikinus apribojimus Numatytasis @@ -2680,18 +2680,116 @@ Tai yra puikus būdas paremti OsmAnd ir OSM, jei jie jums patinka. Nutraukti prenumeratą Pavyzdys "UTM Standartas" - Pakeisti numatytuosius nustatymus + Pakeisti nustatymą Kalba ir išvestis Atstatyti numatytąsias reikšmes Kurti, importuoti, redaguoti profilius - „OsmAnd“ nustatymai + OsmAnd nustatymai Kopijuoti iš kito profilio Įjungti ekraną Kita - Svoris, aukštis, greitis + Svoris, aukštis, ilgis ir greitis Transporto priemonės parametrai Navigacijos instrukcijos ir pranešimai Balso pranešimai Ekrano įspėjimai Maršruto parametrai + Jus galite redaguoti bet kokį straipsnį Wikivoyage sistemoje. Pasidalink žiniomis, patirtimi, talentu ir savo dėmesiu su kitais. + Šie elementai yra paslėpti nuo meniu, bet juos reprezentuojantis nustatymai ar papildai veiks toliau. + Maršrutai į pačius įdomiausius objektus planetoje, panaudojant OsmAnd nereikalingas interneto ryšis. + Ekstremalus + Ekspertas + Pažengęs + Vidutinis + Lengvas + Šiaurėtiškas + Slidžių turas + Ryšys + Rogės + Aplankas… + Statistika + Švelnus + Lygumas + Paviršius + Papūga + Klaviatūra + Niekas + Bekelė + Paspirtukas + NSO + Avarija + Piktograma + Rogės + Geokodinimas + Slidinėti + Slidinėjimas + Slidinėjimas + Sraigtasparnis + Arklys + Metro + Taksi + Leisti + Įvertinti + Paslauga + Suplotas + Žvyras + Posūkis-po-posūkio + Pakeisti + Perkėlimai + Paleisti + Prenumerata + Juodas + Ne + Turinys + Viduje + Atkurti + Ieškoti gatvės + Matuoti atstumą + Rodyti/paslėpti viešąjį transportą + Paslėpti viešąjį transportą + Rodyti viešąjį transportą + Pridėti profilį + Nepalaikomas tipas + Įjungimo/išjungimo mygtukas + Palikti ekraną įjungta + Palikti ekraną išjungta + Vienas nuotraukos failas per skiltį + SQLiteDB failas + Ar ištrinti viską\? + Palikti aktyvų + Išinstaliuoti + Naktinis žemėlapis + metrai + Rodyti Mapillary + Ilgio limitas + Guolis + %1$s ištrinta + Perkrovimas reikalingas kad būtų galima ištrinti greičio kamerų duomenis. + Išinstaliuoti ir perkrauti + Šis įrenginys neturi greičio kamerų. + dailiojo čiuožimo pačiūžos + Ištrinti sekančio atvykimo tašką + Leisti kontroliuoti žemėlapio mastelį naudojant įrenginio garsumo mygtukus. + Garsumo mygtukai mastelio keitimui + Prašome taškui suteikti pavadinimą + Atsisiųsti Vikipedijos žemėlapius + Enduro motociklas + Motorinis paspirtukas + Vežimėlis + Uždarytas OSM Note + Jums reikia nustatyti darbo dienas kad galėtumėte tęsti + Maršrutas tarp taškų + Planuoti maršrutą + Pridėti į maršrutą + Rodyti starto finišo piktogramas + Pasirinkti plotį + Pasirinktinis + Krypčių rodyklės + Solidus + Paskutinį kartą redaguota + Importuoti trasą + Atidaryti egzistuojančia trasą + Sukurti naują maršrutą + Pasirinkite trasos failą kurį norite atidaryti + Padaryta \ No newline at end of file diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index fc1d70f6fd..eef7882af8 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -3832,4 +3832,16 @@ Wybierz szerokość Wybierz żądaną opcję podziału: według czasu lub odległości. Stałe + OsmAnd GPX nie jest dobrze uformowany, prosimy o kontakt z zespołem wsparcia technicznego w celu dalszego zbadania sprawy. + Wybierz limit czasu ekranu po przebudzeniu. (\"%1$s\" nie powoduje przekroczenia limitu czasu). + Pokaż ikony rozpoczęcia i zakończenia + Wybierz przedział czasowy, w którym będą wyświetlane znaki z dystansem lub czasem na torze. + Niestandardowy + Strzałki kierunkowe + Ostatnio edytowane + Importuj ścieżkę + Otwórz istniejącą ścieżkę + Utwórz nową trasę + Wybierz plik ścieżki do otwarcia. + Wykonane \ No newline at end of file diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index 013cf289b6..27021aa6e9 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -299,7 +299,7 @@ Alfândega Pedágio Placa de pare - Moderador de tráfego + Lombada Aviso de tráfego POIs próximos Moderadores de tráfego @@ -428,7 +428,8 @@ Tempo em movimento: %1$s %1$s pontos Ponto %1$s - %1$s ↵\nPontos de Rota %2$s + %1$s↵ +\nPontos de Rota %2$s %1$s↵\nPontos %1$s \nTrilha %2$s @@ -607,8 +608,8 @@ \n - Sem acesso offline a POIs da Wikipedia \n \n OsmAnd está sendo desenvolvido ativamente e o nosso projeto e seu progresso contínuo depende de contribuições financeiras para o desenvolvimento e teste de novas funcionalidades. Por favor, considere adquirir OsmAnd+, ou financiar novas funcionalidades específicas ou fazer uma doação geral em https://osmand.net. - Nascer do Sol: %1$s -Pôr do Sol: %2$s + Nascer do sol: %1$s +\nPôr do sol: %2$s Sem estradas não pavimentadas Ativar\n modo segundo plano Radares @@ -3819,4 +3820,10 @@ Pôr do Sol: %2$s Personalizados Setas de direção Sólido + Última edição + Importar trilha + Abrir trilha existente + Criar nova rota + Selecione um arquivo de faixa para abrir. + Concluído \ No newline at end of file diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml index db7fad15b5..2994d515d2 100644 --- a/OsmAnd/res/values-pt/strings.xml +++ b/OsmAnd/res/values-pt/strings.xml @@ -917,13 +917,11 @@ Curvas de nível Foto %1$s de %2$s Capture uma foto - Este suplemento disponibiliza \'Curvas de Nível\' e \'Sombras de relevo\', que podem ser aplicadas nos mapas standard do OsmAnd. -\nEstas funcionalidades podem ser apreciadas por atletas, caminhantes, e qualquer pessoa interessada na informação de relevo de uma paisagem. -\n + Este suplemento disponibiliza \'Curvas de Nível\' e \'Sombras de relevo\', que podem ser aplicadas nos mapas padrão do OsmAnd. +\nEstas funcionalidades podem ser apreciadas por atletas, caminhantes e qualquer pessoa interessada na informação de relevo de uma paisagem. \n -\nOs dados globais (entre as latitudes 70° norte e 70° sul) são baseados nas medições do SRTM (Shuttle Radar Topography Mission) e do ASTER (Advanced Spaceborn Thermal Emission and Reflection Radiometer), um instrumento de imagens no \'Terra\', o satélite principal do Sistema de Observação da Terra da NASA. O ASTER é um esforço conjunto da NASA, do Ministério da Economia, Comércio e Indústria do Japão e do Sistema Espacial Japonês (J-spacesystems). - Este suplemento disponibiliza \'Curvas de Nível\' e \'Sombras de relevo\', que podem ser aplicadas nos mapas padrão do OsmAnd. -\nEstas funcionalidades podem ser apreciadas por atletas, caminhantes, e qualquer pessoa interessada na informação de relevo de uma paisagem. +\n Os dados globais (entre as latitudes 70° norte e 70° sul) são baseados nas medições do SRTM (Shuttle Radar Topography Mission) e do ASTER (Advanced Spaceborn Thermal Emission and Reflection Radiometer), um instrumento de imagens no \'Terra\', o satélite principal do Sistema de Observação da Terra da NASA. O ASTER é um esforço conjunto da NASA, do Ministério da Economia, Comércio e Indústria do Japão e do Sistema Espacial Japonês (J-spacesystems). + Este suplemento disponibiliza \'Curvas de Nível\' e \'Sombras de relevo\', que podem ser aplicadas nos mapas padrão do OsmAnd. Estas funcionalidades podem ser apreciadas por atletas, caminhantes, e qualquer pessoa interessada na informação de relevo de uma paisagem. \n \nOs dados globais (entre as latitudes 70° norte e 70° sul) são baseados nas medições do SRTM (Shuttle Radar Topography Mission) e do ASTER (Advanced Spaceborn Thermal Emission and Reflection Radiometer), um instrumento de imagens no \'Terra\', o satélite principal do Sistema de Observação da Terra da NASA. O ASTER é um esforço conjunto da NASA, do Ministério da Economia, Comércio e Indústria do Japão e do Sistema Espacial Japonês (J-spacesystems). Curvas de nível @@ -2633,13 +2631,14 @@ \nOsmAnd+ é a versão paga da aplicação. Ao comprá-lo, está a apoiar o projeto, a financiar o desenvolvimento de novas funcionalidades e a receber as últimas atualizações. \n \nAlgumas das características principais: - Navegação + Navegação \n• Funciona on-line (rápido) ou off-line (sem custos de roaming quando estiver no estrangeiro) \n• Orientação por voz passo a passo (vozes gravadas e sintetizadas) \n• Orientação de trajetos opcionais, visualização do nome da rua e tempo estimado de chegada \n• Suporta pontos intermediários do seu itinerário \n• Correção automática da rota sempre que sair da rota -\n• Procure lugares por endereço, pelo tipo (por exemplo: restaurante, hotel, posto de gasolina, museu...) ou por coordenadas geográficas +\n• Procure lugares por endereço, pelo tipo (por exemplo: restaurante, hotel, posto de gasolina, museu...) ou por coordenadas geográficas +\n Visualização de mapa \n • Veja a sua posição e orientação. \n • Oriente opcionalmente o ecrã de acordo com a bússola ou a direção do seu movimento. @@ -3840,4 +3839,10 @@ Personalizado Setas de direção Sólido + Última edição + Importar trilho + Abrir trilho existente + Selecione um ficheiro de trilho para abrir. + Criar rota + Pronto \ No newline at end of file diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml index 87523247bf..c758a23f9c 100644 --- a/OsmAnd/res/values-sc/strings.xml +++ b/OsmAnd/res/values-sc/strings.xml @@ -3828,4 +3828,16 @@ Annanghe a una rasta Personalizadu Fritzas de diretzione + Su puntu annànghidu no at a èssere visìbile in sa mapa, ca su grupu ischertadu est cuadu. Lu podes agatare in \"%s\". + Ammustra sas iconas de incumintzu e acabu + Ischerta sa largària + Ischerta s\'intervallu in ue sos sinnos cun distàntzia o oràriu in sa mapa ant a èssere ammustrados. + Ischerta s\'optzione de partzidura chi cheres: pro tempus o pro distàntzia. + Sòlidu + Ùrtima modìfica + Aberi una rasta chi esistit giai + Importa una rasta + Crea un\'àndala noa + Ischerta unu documentu de rasta de abèrrere. + Fatu \ No newline at end of file diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml index 1c81c4d8ce..be5ff4790f 100644 --- a/OsmAnd/res/values-sk/strings.xml +++ b/OsmAnd/res/values-sk/strings.xml @@ -286,7 +286,9 @@ Obrátiť GPX smerovanie Použiť aktuálny cieľový bod Prejsť pozdĺž celej trasy - Pre túto oblasť je dostupná offline vektorová mapa.\n\t\n\tNa jej použitie aktivujte Menu → Zobrazenie → Zdroj mapy… → Vektorové OSM mapy. + Pre túto oblasť je dostupná offline vektorová mapa. +\n\t +\n\tNa jej použitie aktivujte \'Menu\' → \'Zobrazenie\' → \'Zdroj mapy…\' → \'Vektorové OSM mapy\'. Výstup hlasových pokynov Vybrať reproduktor pre hlasové pokyny. Zvuk telefónneho hovoru (preruší Bluetooth stereo v aute) @@ -3830,4 +3832,10 @@ Vlastné Smerové šípky Plné + Naposledy upravené + Importovať stopu + Otvoriť existujúcu stopu + Vytvoriť novú trasu + Zvoľte súbor so stopou na otvorenie. + Hotovo \ No newline at end of file diff --git a/OsmAnd/res/values-sr/strings.xml b/OsmAnd/res/values-sr/strings.xml index 8d723fb154..78c2cc5853 100644 --- a/OsmAnd/res/values-sr/strings.xml +++ b/OsmAnd/res/values-sr/strings.xml @@ -684,7 +684,7 @@ Није означено h min - Смиривање саобраћаја + Лежећи полицајац Упозорења о гужвама у саобраћају Позадинске услуге OsmAnd-а су и даље покренуте. Прекинути и њих? Прекинути позадински режим GPS-а? @@ -3829,4 +3829,10 @@ Чврст Додата тачка неће бити видљива на мапи, пошто је одабрана група сакривена, можете је пронаћи у „%s“. Прикажи почетно крајне иконе + Последње измењена + Увези путању + Отвори постојећу путању + Креирај нову руту + Изаберите фајл путање за отварање. + Завршено \ No newline at end of file diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 711551c34e..460f321ae1 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -1632,9 +1632,12 @@ Bölüm %1$s nokta Nokta%1$s - %1$s\nRota%2$s işaret - %1$s\nPoints - %1$s\nParça%2$s + %1$s +\nGüzergah noktaları %2$s + %1$s +\nNoktalar + %1$s +\nYol %2$s Boş GPX dosyası Ekran rengi Günler @@ -1761,7 +1764,7 @@ Sık Kullanılan, yinelemeyi önlemek için %1$s olarak yeniden adlandırıldı. Sınır denetimi Gişe - Trafik-hızı-yavaşlatıcı-düzenek + Hız tümseği GPS arka plan modunu durdur? Dur (Haritadaki GPX kayıt widget\'ı aracılığıyla etkinleştirilen) genel rota kaydı için kayıt aralığını belirtin. @@ -3787,4 +3790,10 @@ Özel Yön okları Koyu + Son düzenleme + Yolu içe aktar + Mevcut yolu aç + Yeni güzergah oluştur + Açmak için bir yol dosyası seçin. + Bitti \ No newline at end of file diff --git a/OsmAnd/res/values-uk/phrases.xml b/OsmAnd/res/values-uk/phrases.xml index 3c309cdf27..f4bfb6bed9 100644 --- a/OsmAnd/res/values-uk/phrases.xml +++ b/OsmAnd/res/values-uk/phrases.xml @@ -1384,7 +1384,7 @@ Хворі Мінеральні Діти та підлітки - Характеристика води: брудна + Брудна Філармонія Сірчана Музичний @@ -2429,7 +2429,7 @@ Дорожнє дзеркало Міжнародна Оплата через Яндекс.Гроші не приймається - У вигляді хреста + Хрестоподібна Прокат Розведення відкритого вогню дозволено Пристрій @@ -2732,7 +2732,7 @@ Доставка DVD-диск Поверхня: бруківка - Паливо AdBlue + Рідина для очищення вихлопу дизелів Тайський Вид вибуху: атмосферний, скидання з літака Послуги надаються немовлятам: так diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index 41f145794f..7f83659cd2 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -30,7 +30,7 @@ Основна мапа, необхідна для забезпечення основних можливостей, знаходиться у черзі завантаження. Нічого не знайдено. Якщо Ви не знайшли свій регіон, Ви можете створити його самостійно (див. https://osmand.net). Мережеві та кешовані растрові мапи - Стандартні мапи (векторні) + Звичайні мапи (векторні) Завантаження, перегляд подробиць та керування локальними мапами. Увімкніть втулок \'Мережеві мапи\', щоб вибирати різні джерела мап Мережеві мапи (растрові) @@ -158,7 +158,7 @@ Файл з раніше імпортованими Закладками вже існує. Замінити його? Налаштування профілю Усталений профіль - Вид мапи й налаштування навігації зберігаються для кожного окремого профілю. Встановіть Ваш типовий профіль. + Вид мапи й налаштування навігації зберігаються для кожного окремого профілю. Встановіть ваш типовий профіль. Навігація Визначити налаштування навігації. Загальні налаштування @@ -167,7 +167,7 @@ Налаштуйте відображення та загальні параметри застосунку. Загальні налаштування Ім\'я користувача OSM - Потрібно для подань на openstreetmap.org. + Потрібно для входу на openstreetmap.org. Пароль Фоновий режим OsmAnd працює у фоновому режимі з вимкненим екраном. @@ -177,7 +177,7 @@ Прозора тема Вбудована бібліотека не підтримується на цьому пристрої. Ініціалізація рідної бібліотеки… - Самоосереднення мапи + Автоцентрування мапи Час, через який мапа повернеться до поточної позиції. Автоцентрування мапи тільки під час навігації Повертати мапу в поточну позицію тільки при навігації за маршрутом. @@ -270,7 +270,9 @@ Зворотній напрямок GPX Використовувати поточний пункт призначення Пройдіть по усьому треку - Для цього регіону доступні оффлайн векторні мапи\n\t\n\tДля їх використання виберіть пункт меню \'Налаштування Мапи\' → \'Джерело мапи…\' → \'Локальні векторні мапи\'. + Для цього регіону доступні автономні векторні мапи +\n\t +\n\tДля користування ними виберіть пункт меню \'Налаштування Мапи\' → \'Джерело мапи…\' → \'Локальні векторні мапи\'. Вивід голосових вказівок Виберіть канал для голосових вказівок. Голосовий канал (перервати звук з динаміків автомобіля) @@ -798,10 +800,10 @@ Використовувати системний записувач Використовувати системний застосунок для світлин. недоступно - Стоп + Зупинити Почати Звуко/відео-нотатки - Плагін OsmAnd для показу горизонталей в автономному режимі + Втулок OsmAnd для показу горизонталей в автономному режимі Використовувати програму Камера Налаштування аудіо/відео запису. Налаштування аудіо/відео @@ -917,7 +919,7 @@ OsmAnd Мапи і Навігація OsmAnd+ Мапи і Навігація Шар рельєфа місцевості - Стандартна мапа + Звичайна мапа OsmAnd (OSM Automated Navigation Directions) \n \n OsmAnd — навігаційне програмне забезпечення з відкритим кодом з доступом до різноманітних картографічних даних від OSM. Всі землеписні дані (векторні та растрові) можуть бути збережені на карті пам’яті телефону для подальшого автономного користування. Також пропонується функція маршрутизації в автономному режимі та в мережевому режимі, включно з покроковими голосовими підказками. @@ -1025,7 +1027,7 @@ Збільшення глибини різкості Фокус встановлюється на нескінченність Відтворювати звук затвору камери - Програвання звуку затвора камери. + Відтворення звуку затвора камери. Всі локальні дані зі старого встановленого застосунку будуть підтримуватися новим, але Закладки потрібно експортувати зі старого застосунку та імпортувати в новий. Обмеження швидкості Камери детектування швидкості @@ -1145,7 +1147,8 @@ Відрізок %1$s точок Точка %1$s - %1$s ↵\nМаршрутних точок %2$s + %1$s↵ +\nМаршрутних точок %2$s %1$s \nТочок %1$s @@ -1273,7 +1276,7 @@ Дрібніше Місце призначення Голосові підказки призупиняють відтворення музики. - Призупинити музику + Призупиняти музику Поділитись маршрутом за допомоги файлу GPX Маршрут наданий через OsmAnd Оголошення про прибуття @@ -1369,7 +1372,7 @@ Прикордонний контроль Збирання плати за проїзд Знак СТОП - Зниження швидкості + Штучна дорожня нерівність Камера контролю швидкості Попередження на дорозі Натисніть на будь-який наявний елемент для перегляду додаткових відомостей, довго утримуйте, щоб знедіяти або вилучити. Наявні дані на пристрої (%1$s вільно): @@ -1602,7 +1605,7 @@ Завантажити додаткові дані з Вікіпедії (%1$s Мб)\? Служба визначення місцезнаходження вимкнена. Увімкнути? Запобігти самостійному логуваню - Логування GPX буде призупинено коли застосунок буде закрито (через недавні додатки). (Фоновий індикатор OsmAnd зникне з панелі сповіщень Android\'а) + Запис GPX буде зупинено після припинення роботи застосунку через меню з переліком нещодавно запущених застосунків. (Індикатор, який інформує про роботу OsmAnd в фоні зникне з панелі сповіщень в Android) Імпортувати до OsmAnd Читати повну статтю (мережево) Вікіпедія @@ -1699,7 +1702,7 @@ Зупинити симуляцію Вашої позиції. Пошук адреси Місця - Плагіни + Втулки Уник. приміських поїздів Уникати приміських поїздів Небезпека @@ -1818,7 +1821,7 @@ Виберіть дороги, які потрібно уникнути під час навігації. Звук POI буде вилучено після того, як Ви вивантажите Ваші зміни - Мапа виключно доріг не потрібна, оскільки у вас є стандартна (повна) мапа. Все одно завантажити? + Мапа виключно доріг не потрібна, оскільки у вас є звичайна (повна) мапа. Все одно завантажити\? OsmAnd не має дозволу на використання карти пам\'яті Останнє оновлення: %s Остання зміна мапи: %s @@ -2189,13 +2192,13 @@ Відкритий код розташування (OLC) Нова аудіонотатка Нова відеонотатка - Нова світлино-нотатка + Нова фотонотатка Найменування Кнопка для додавання позначки мапи посередині екрану. Натискання на цю кнопку додасть маршрутну точку GPX посередині екрану. Натискання цієї кнопки додає аудіонотатку посередині екрану. Натискання цієї кнопки додає відеонотатку посередині екрану. - Натискання цієї кнопки додає світлинонотатку посередині екрану. + Натискання цієї кнопки додає фотонотатку посередині екрану. Натискання цієї кнопки додає OSM-нотатку посередині екрану. Натискання цієї кнопки додає POI посередині екрану. Перемикач, щоб вимкнути або увімкнути голосові підказки під час навігації. @@ -2241,7 +2244,7 @@ Відсортоване за відстанню Пошук у закладках Для того, щоб відобразити затінення рельєфу, потрібно завантажити спеціальну мапу для цієї області. - Щоб побачити рельєф місцевості на мапі, вам потрібно придбати та встановити плагін \'Горизонталі\' (\'Contour Lines\'). + Щоб побачити рельєф місцевості на мапі, вам потрібно придбати та встановити втулок \'Горизонталі\' (\'Contour Lines\'). Приховати від рівня масштабування Завантажте мапу \'Горизонталі\' (\'Contour Line\') для використання у цій області. Втулок @@ -2463,7 +2466,7 @@ Мін/макс Напівпрозорий рожевий Призупинити/відновити навігацію - Кнопка для призупинення чм відновлення навігації. + Кнопка для призупинення чи відновлення навігації. Показати діалог завершення навігації Почати/зупинити навігацію Натисніть цю кнопку, щоб почати або закінчити навігацію. @@ -2610,7 +2613,7 @@ Натискання на позначку на мапі перемістить її на перше місце в списку задіяних позначок, не відкриваючи контекстне меню. Задіювання одним натисненням Робіть нотатки! - Додайте аудіо, відео або світлино-нотатку в будь-яку точку на мапі, використовуючи віджет або контекстне меню. + Додайте аудіо, відео або фотонотатку в будь-яку точку на мапі, використовуючи віджет або контекстне меню. Примітки за датою За датою За типом @@ -2778,13 +2781,13 @@ Лише через WiFi Вибрати щоденник подорожей Щоденник подорожей - Сторінка доступна лише в мережі. Відкрити у веббраузері\? + Сторінка доступна лише в мережі. Відкрити у браузері\? Кеш зображень Вилучити історію пошуку Завантаження зображень Туристичні путівники Вікімандри - Стаття вилучена + Статтю видалено Пошук: країна, місто, регіон Читати Збережені статті @@ -3229,14 +3232,14 @@ %1$s • Заощадити %2$s Налаштування для профілю: Приклад - UTM Стандарт + Стандарт UTM Змінити налаштування Відхилити зміну Застосувати тільки до: %1$s Застосувати до всіх профілів Початкове повідомлення Аналітика - Одиниця вимірювання та формати + Одиниці виміру й формати Зовнішній вигляд Вигляд мапи Вигляд мапи @@ -3274,7 +3277,7 @@ Впливає на весь застосунок Навігаційні вказівки та оголошення Буфер logcat - Налаштування плагіна + Налаштування втулка Усталено Розраховує час прибуття для невідомих типів доріг і обмежує швидкість для всіх доріг (може вплинути на маршрутизацію) Завантажте докладну мапу %s, щоб переглянути цю область. @@ -3436,7 +3439,7 @@ Ви можете знайти всі записи в %1$s або в теці OsmAnd за допомогою файлового провідника. Ваші нотатки OSM знаходяться в %1$s. Відеонотатки - Світлинонотатки + Фотонотатки Перерахунок маршруту Оголошення Ім\'я користувача і пароль @@ -3521,7 +3524,7 @@ Впорядкувати за категоріями Укажіть назву профілю Відкрити налаштування - Плагін вимкнено + Втулок вимкнено Цей втулок є окремою програмою, якщо ви не плануєте користуватися ним надалі, його потрібно буде видалити окремо. \n \nВін залишиться на пристрої після видалення OsmAnd. @@ -3570,7 +3573,7 @@ \nЦе може зайняти деякий час. Елементи додано Імпорт завершено - Усі дані з %1$s імпортовано, ви можете користуватися іншими кнопками, щоби відкрити потрібну частину програми для керування нею. + Усі дані з %1$s імпортовано, ви можете користуватися іншими кнопками, щоб відкрити потрібну частину програми для керування нею. Маршрут буде перераховано, якщо відстань від маршруту до поточного місця розташування перевищує вибране значення. Виберіть відстань, після якого маршрут буде перераховано. Перерахунок маршруту у випадку відхилення @@ -3614,9 +3617,9 @@ Мова Усі мови Для перегляду POI Вікіпедії на мапі потрібні додаткові мапи. - Встановлення кількості елементів меню \"Скринька\", \"Налаштувати мапу\" та \"Контекстне меню\". -\n -\nВимкніть непотрібні втулки, щоби приховати всі їхні елементи керування %1$s. + Встановлення кількості елементів меню \"Скринька\", \"Налаштувати мапу\" та \"Контекстне меню\". +\n +\nВимкніть непотрібні втулки, щоб приховати всі їхні елементи керування %1$s. Елементи скриньки, контекстне меню Налаштування інтерфейсу Скринька @@ -3625,7 +3628,7 @@ Дільник Елементи нижче цієї точки розділені дільником. Приховано - Ці елементи приховані з меню, але встановлені параметри або плагіни продовжать роботу. + Ці елементи приховані з меню, але встановлені параметри або втулки продовжать роботу. Приховування налаштувань призведе до скидання до їхнього початкового стану. Має лише 4 кнопки. Основні дії @@ -3757,7 +3760,7 @@ \nОдин тиждень - 10 080 хвилин. \nОдин місяць - 43 829 хвилин. Виберіть спосіб зберігання завантажених плиток. - Усталений час очікування екрану + Типовий час до вимкнення екрану Ви можете експортувати або імпортувати швидкі дії з профілями застосунку. Видалити все\? Ви дійсно бажаєте безповоротно видалити %d швидких дій\? @@ -3771,15 +3774,15 @@ Вкажіть висоту автомобіля, для великих транспортних засобів можуть застосовуватися обмеження на деяких маршрутах. Вимкнено. Потребує \'Тримати екран увімкненим\' у розділі \'Час очікування після пробудження\'. Додати мережеве джерело - Застосування цих змін очистить кешовані дані для цього джерела плиток + Застосування цих змін очистить дані, збережені з цього джерела тайлів Встановити висоту судна Ви можете встановити висоту судна, щоб уникнути низьких мостів. Майте на увазі, якщо міст рухомий, використовуватиметься його висота у відкритому стані. Встановіть висоту судна, щоб уникнути низьких мостів. Майте на увазі, якщо міст рухомий, використовуватиметься його висота у відкритому стані. Встановіть ширину судна, щоб уникнути вузьких мостів Увімкнути/вимкнути Mapillary Вимкнути Mapillary - Увімкнення шару Mapillary - Перемикач увімкнення або вимкнення шару Mapillary на мапі. + Показати Mapillary + Перемикач показує/приховує шар Mapillary на мапі. Видалити камери контролю швидкості Законодавство POI камер контролю швидкості @@ -3795,7 +3798,7 @@ Попередження про камери контролю швидкості в деяких країнах заборонено законом. Орієнтація %1$s видалено - Потрібен перезапуск для повного видалення даних камер контролю швидкості. + Для вилучення даних про камери контролю швидкості потрібен перезапуск. Видалити та перезапустити Вкажіть довжину транспортного засобу для розрахунку маршрутів. Обмеження довжини @@ -3808,11 +3811,29 @@ Вкажіть назву пункту Поточну точку призначення на маршруті буде видалено. Якщо це буде місце призначення, навігація припиниться. Завантажити мапи Вікіпедії - Отримайте відомості про визначні місця у Вікіпедії. Це ваш кишеньковий посібник без мережі - просто ввімкніть втулок \"Вікіпедія\" і насолоджуйтесь статтями про об\'єкти навколо вас. + Отримайте відомості про визначні місця у Вікіпедії. Це ваш автономний кишеньковий посібник - просто ввімкніть втулок \"Вікіпедія\" і насолоджуйтеся статтями про об\'єкти навколо вас. Моторолер легкий мотоцикл Інвалідне крісло Інвалідне крісло попереду - у мапу + Картинг Закрита нотатка OSM + Власне + Додану точку не буде показано на мапі, вся вибрана група є прихованою, ви можете побачити її в \"%s\". + Зазначте робочі дні, щоб продовжити + Маршрут між точками + Планування маршруту + Додати до треку + Показувати старт та фініш + Встановити ширину + Виберіть інтервал показу міток часу або відстані для показу поверх треку. + Виберіть власний варіант поділу: за часом чи відстанню. + Стрілки напрямку + Суцільний + В останнє змінено + Імпортувати трек + Переглянути наявний трек + Створити новий маршрут + Оберіть файл з треком для перегляду. + Готово \ No newline at end of file diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index aa1224c044..c261ef837c 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -434,7 +434,9 @@ 反轉 GPX 方向 使用目前的目的地 沿著整條軌跡往前 - 指定以離線向量地圖顯示\n\t\n\t啟用方式\'選單\' -> \'組態地圖\' -> \'地圖來源…\' -> \'離線向量圖\'。 + 此位置目前有向量地圖可以使用。 +\n\t +\n\t想要使用,請從「選單」→「設定地圖」→「地圖來源……」→「離線向量地圖」。 語音導航輸出 選取要播放語音導航的揚聲器。 通話音訊(會中斷汽車藍牙音效) @@ -1285,7 +1287,7 @@ 邊境管制 收費站 停車標誌 - 交通寧靜區 + 減速丘 測速照相 交通流量警示 輕點任何現有的項目,查看更詳細的資訊,長按則停用或刪除。裝置上目前的資料有 (%1$s 可用): @@ -3827,4 +3829,10 @@ 自訂 方向箭頭 密實 + 最後編輯 + 匯入軌跡 + 開啟既有的軌跡 + 建立新路線 + 選取要開啟的軌跡檔。 + 完成 \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 6ca8722b5e..a31be91aa8 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,7 @@ Thx - Hardy --> + Overwrite track Done Select a track file for open. Create new route @@ -2161,7 +2162,7 @@ Border control Toll booth Stop sign - Traffic calming + Speed bump Speed camera Traffic warning Favorites nearby diff --git a/OsmAnd/src/net/osmand/data/FavouritePoint.java b/OsmAnd/src/net/osmand/data/FavouritePoint.java index 052949a28f..72cde20159 100644 --- a/OsmAnd/src/net/osmand/data/FavouritePoint.java +++ b/OsmAnd/src/net/osmand/data/FavouritePoint.java @@ -371,8 +371,13 @@ public class FavouritePoint implements Serializable, LocationPoint { } public static FavouritePoint fromWpt(@NonNull WptPt pt, @NonNull Context ctx) { + return fromWpt(pt, ctx, null); + } + + public static FavouritePoint fromWpt(@NonNull WptPt pt, @NonNull Context ctx, String category) { String name = pt.name; - String categoryName = pt.category != null ? pt.category : ""; + String categoryName = category != null ? category : + (pt.category != null ? pt.category : ""); if (name == null) { name = ""; } diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index 273d69d831..360c13e781 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -517,15 +517,10 @@ public class MapActivityActions implements DialogProvider { mapActivity.getRoutingHelper().setGpxParams(params); settings.FOLLOW_THE_GPX_ROUTE.set(result.path); if (!ps.isEmpty()) { - Location startLoc = ps.get(0); - Location finishLoc = ps.get(ps.size() - 1); TargetPointsHelper tg = mapActivity.getMyApplication().getTargetPointsHelper(); + tg.clearStartPoint(false); + Location finishLoc = ps.get(ps.size() - 1); tg.navigateToPoint(new LatLon(finishLoc.getLatitude(), finishLoc.getLongitude()), false, -1); - if (startLoc != finishLoc) { - tg.setStartPoint(new LatLon(startLoc.getLatitude(), startLoc.getLongitude()), false, null); - } else { - tg.clearStartPoint(false); - } } } } diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsNavigationActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsNavigationActivity.java index b3db4562d8..1686d0fb56 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsNavigationActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsNavigationActivity.java @@ -767,8 +767,8 @@ public class SettingsNavigationActivity extends SettingsBaseActivity { minValue[0] = Math.round(Math.min(minSpeedValue, settingsDefaultSpeed) * ratio[0]); maxValue[0] = Math.round(Math.max(maxSpeedValue, settingsDefaultSpeed) * ratio[0]); - min = Math.round(Math.min(router.getMinSpeed(), settingsDefaultSpeed) * ratio[0] / 2f); - max = Math.round(Math.max(router.getMaxSpeed(), settingsDefaultSpeed) * ratio[0] * 1.5f); + min = Math.round(Math.min(minValue[0], router.getMinSpeed() * ratio[0] / 2f)); + max = Math.round(Math.max(maxValue[0], router.getMaxSpeed() * ratio[0] * 1.5f)); } boolean nightMode = !app.getSettings().isLightContentForMode(mode); diff --git a/OsmAnd/src/net/osmand/plus/base/BottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/base/BottomSheetDialogFragment.java index adc82783a6..c33b183b65 100644 --- a/OsmAnd/src/net/osmand/plus/base/BottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/base/BottomSheetDialogFragment.java @@ -48,7 +48,7 @@ public abstract class BottomSheetDialogFragment extends DialogFragment { public abstract View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState); @Override - public void onAttach(Context context) { + public void onAttach(@NonNull Context context) { super.onAttach(context); if (context instanceof OnDialogFragmentResultListener) { dialogFragmentResultListener = (OnDialogFragmentResultListener) context; @@ -82,10 +82,10 @@ public abstract class BottomSheetDialogFragment extends DialogFragment { } @Nullable - protected Drawable getIcon(@DrawableRes int drawableRes, @ColorRes int color) { + protected Drawable getIcon(@DrawableRes int drawableRes, @ColorRes int colorRes) { OsmandApplication app = getMyApplication(); if (app != null) { - return app.getUIUtilities().getIcon(drawableRes, color); + return app.getUIUtilities().getIcon(drawableRes, colorRes); } else { return null; } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/SelectedGpxMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/SelectedGpxMenuController.java index 7d0e0661d7..26e2a136c8 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/SelectedGpxMenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/SelectedGpxMenuController.java @@ -1,15 +1,19 @@ package net.osmand.plus.mapcontextmenu.controllers; import android.app.ProgressDialog; +import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.AsyncTask; import androidx.annotation.NonNull; import net.osmand.AndroidUtils; import net.osmand.GPXUtilities; +import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.WptPt; +import net.osmand.data.LatLon; import net.osmand.data.PointDescription; import net.osmand.plus.GpxSelectionHelper; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; @@ -20,7 +24,10 @@ import net.osmand.plus.activities.TrackActivity; import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.mapcontextmenu.MenuController; import net.osmand.plus.mapcontextmenu.builders.SelectedGpxMenuBuilder; +import net.osmand.plus.myplaces.SaveCurrentTrackTask; import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener; +import net.osmand.util.Algorithms; import java.io.File; import java.lang.ref.WeakReference; @@ -196,6 +203,48 @@ public class SelectedGpxMenuController extends MenuController { return getIcon(R.drawable.ic_action_polygom_dark, color); } + @Override + public void share(LatLon latLon, String title, String address) { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null && selectedGpxPoint != null) { + final GPXFile gpxFile = selectedGpxPoint.getSelectedGpxFile().getGpxFile(); + if (gpxFile != null) { + if (Algorithms.isEmpty(gpxFile.path)) { + SaveGpxListener saveGpxListener = new SaveGpxListener() { + @Override + public void gpxSavingStarted() { + + } + + @Override + public void gpxSavingFinished(Exception errorMessage) { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + shareGpx(mapActivity, gpxFile.path); + } + } + }; + new SaveCurrentTrackTask(mapActivity.getMyApplication(), gpxFile, saveGpxListener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } else { + shareGpx(mapActivity, gpxFile.path); + } + } + } else { + super.share(latLon, title, ""); + } + } + + private void shareGpx(@NonNull Context context, @NonNull String path) { + final Uri fileUri = AndroidUtils.getUriForFile(context, new File(path)); + final Intent sendIntent = new Intent(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_STREAM, fileUri); + sendIntent.setType("application/gpx+xml"); + sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + if (AndroidUtils.isIntentSafe(context, sendIntent)) { + context.startActivity(sendIntent); + } + } + public static class SelectedGpxPoint { private final WptPt selectedPoint; diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java index 4de36e90c3..dd8e64825c 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java @@ -148,7 +148,13 @@ public class TrackDetailsMenu { LatLon latLon = tb.getLatLonFromPixel(mx, my); gpxItem.locationOnMap = GPXLayer.createProjectionPoint(points.first, points.second, latLon); float pos = (float) (gpxItem.locationOnMap.distance / ((OrderedLineDataSet) ds.get(0)).getDivX()); - float nextVisibleX = chart.getLowestVisibleX() + (pos - gpxItem.chartHighlightPos); + float lowestVisibleX = chart.getLowestVisibleX(); + float highestVisibleX = chart.getHighestVisibleX(); + float nextVisibleX = lowestVisibleX + (pos - gpxItem.chartHighlightPos); + float oneFourthDiff = (highestVisibleX - lowestVisibleX) / 4f; + if (pos > oneFourthDiff) { + nextVisibleX = pos - oneFourthDiff; + } gpxItem.chartHighlightPos = pos; chart.moveViewToX(nextVisibleX); diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/NewGpxData.java b/OsmAnd/src/net/osmand/plus/measurementtool/NewGpxData.java index 9da060fdee..e5325da933 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/NewGpxData.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/NewGpxData.java @@ -1,7 +1,8 @@ package net.osmand.plus.measurementtool; +import net.osmand.GPXUtilities.GPXFile; +import net.osmand.GPXUtilities.TrkSegment; import net.osmand.data.QuadRect; -import net.osmand.GPXUtilities; public class NewGpxData { @@ -12,19 +13,19 @@ public class NewGpxData { OVERWRITE_SEGMENT } - private GPXUtilities.GPXFile gpxFile; - private GPXUtilities.TrkSegment trkSegment; + private GPXFile gpxFile; + private TrkSegment trkSegment; private QuadRect rect; private ActionType actionType; - public NewGpxData(GPXUtilities.GPXFile gpxFile, QuadRect rect, ActionType actionType, GPXUtilities.TrkSegment trkSegment) { + public NewGpxData(GPXFile gpxFile, QuadRect rect, ActionType actionType, TrkSegment trkSegment) { this.gpxFile = gpxFile; this.rect = rect; this.actionType = actionType; this.trkSegment = trkSegment; } - public GPXUtilities.GPXFile getGpxFile() { + public GPXFile getGpxFile() { return gpxFile; } @@ -36,7 +37,7 @@ public class NewGpxData { return actionType; } - public GPXUtilities.TrkSegment getTrkSegment() { + public TrkSegment getTrkSegment() { return trkSegment; } } diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/OptionsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/OptionsBottomSheetDialogFragment.java index 9c6168767c..264e958d50 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/OptionsBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/OptionsBottomSheetDialogFragment.java @@ -95,7 +95,7 @@ public class OptionsBottomSheetDialogFragment extends MenuBottomSheetDialogFragm BaseBottomSheetItem saveAsNewSegmentItem = new SimpleBottomSheetItem.Builder() .setIcon(getContentIcon(R.drawable.ic_action_polygom_dark)) - .setTitle("Overwrite GPX") + .setTitle(getString(R.string.overwrite_track)) .setLayoutId(R.layout.bottom_sheet_item_simple) .setOnClickListener(new View.OnClickListener() { @Override diff --git a/OsmAnd/src/net/osmand/plus/myplaces/SaveCurrentTrackTask.java b/OsmAnd/src/net/osmand/plus/myplaces/SaveCurrentTrackTask.java new file mode 100644 index 0000000000..84959d17f7 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/myplaces/SaveCurrentTrackTask.java @@ -0,0 +1,70 @@ +package net.osmand.plus.myplaces; + +import android.os.AsyncTask; + +import androidx.annotation.NonNull; + +import net.osmand.GPXUtilities; +import net.osmand.GPXUtilities.GPXFile; +import net.osmand.IndexConstants; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.activities.SavingTrackHelper; +import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener; + +import java.io.File; +import java.util.Map; + +public class SaveCurrentTrackTask extends AsyncTask { + + private final OsmandApplication app; + private final GPXFile gpx; + + private final SaveGpxListener saveGpxListener; + + public SaveCurrentTrackTask(@NonNull OsmandApplication app, @NonNull GPXFile gpx, @NonNull SaveGpxListener listener) { + this.app = app; + this.gpx = gpx; + saveGpxListener = listener; + } + + @Override + protected void onPreExecute() { + if (saveGpxListener != null) { + saveGpxListener.gpxSavingStarted(); + } + } + + @Override + protected Boolean doInBackground(Void... params) { + SavingTrackHelper savingTrackHelper = app.getSavingTrackHelper(); + Map files = savingTrackHelper.collectRecordedData(); + File dir; + boolean shouldClearPath = false; + if (gpx.path.isEmpty()) { + dir = app.getCacheDir(); + shouldClearPath = true; + } else { + dir = app.getAppCustomization().getTracksDir(); + } + if (!dir.exists()) { + dir.mkdir(); + } + for (final String f : files.keySet()) { + File fout = new File(dir, f + IndexConstants.GPX_FILE_EXT); + GPXUtilities.writeGpxFile(fout, gpx); + } + return shouldClearPath; + } + + @Override + protected void onPostExecute(Boolean shouldClearPath) { + if (gpx != null) { + if (saveGpxListener != null) { + saveGpxListener.gpxSavingFinished(null); + } + if (shouldClearPath) { + gpx.path = ""; + } + } + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/myplaces/SaveGpxAsyncTask.java b/OsmAnd/src/net/osmand/plus/myplaces/SaveGpxAsyncTask.java deleted file mode 100644 index a3e2ab051d..0000000000 --- a/OsmAnd/src/net/osmand/plus/myplaces/SaveGpxAsyncTask.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.osmand.plus.myplaces; - -import android.os.AsyncTask; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import net.osmand.GPXUtilities; -import net.osmand.GPXUtilities.GPXFile; - -import java.io.File; - -public class SaveGpxAsyncTask extends AsyncTask { - - private final GPXFile gpx; - private final SaveGpxListener saveGpxListener; - - public SaveGpxAsyncTask(@NonNull GPXFile gpx, - @Nullable SaveGpxListener saveGpxListener) { - this.gpx = gpx; - this.saveGpxListener = saveGpxListener; - } - - @Override - protected void onPreExecute() { - if (saveGpxListener != null) { - saveGpxListener.gpxSavingStarted(); - } - } - - @Override - protected Exception doInBackground(Void... params) { - return GPXUtilities.writeGpxFile(new File(gpx.path), gpx); - } - - @Override - protected void onPostExecute(Exception errorMessage) { - if (saveGpxListener != null) { - saveGpxListener.gpxSavingFinished(errorMessage); - } - } - - public interface SaveGpxListener { - - void gpxSavingStarted(); - - void gpxSavingFinished(Exception errorMessage); - } -} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java index 5f206edabb..480229a945 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java @@ -46,7 +46,6 @@ import net.osmand.Collator; import net.osmand.GPXUtilities; import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.WptPt; -import net.osmand.IndexConstants; import net.osmand.OsmAndCollator; import net.osmand.data.FavouritePoint; import net.osmand.data.LatLon; @@ -59,7 +58,6 @@ import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType; import net.osmand.plus.MapMarkersHelper; import net.osmand.plus.MapMarkersHelper.MapMarkersGroup; 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.activities.MapActivity; @@ -67,10 +65,12 @@ import net.osmand.plus.activities.OsmandActionBarActivity; import net.osmand.plus.activities.OsmandBaseExpandableListAdapter; import net.osmand.plus.activities.SavingTrackHelper; import net.osmand.plus.activities.TrackActivity; -import net.osmand.plus.base.PointImageDrawable; import net.osmand.plus.base.OsmandExpandableListFragment; +import net.osmand.plus.base.PointImageDrawable; import net.osmand.plus.mapmarkers.CoordinateInputDialogFragment; import net.osmand.plus.myplaces.TrackBitmapDrawer.TrackBitmapDrawerListener; +import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener; import net.osmand.plus.widgets.TextViewEx; import net.osmand.util.Algorithms; @@ -303,10 +303,24 @@ public class TrackPointFragment extends OsmandExpandableListFragment implements } private void shareItems() { - GPXFile gpxFile = getGpx(); - if (gpxFile != null) { - if (gpxFile.path.isEmpty() && getTrackActivity() != null) { - new SaveAndShareTask(this, gpxFile).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + final GPXFile gpxFile = getGpx(); + if (gpxFile != null && getTrackActivity() != null) { + if (Algorithms.isEmpty(gpxFile.path)) { + SaveGpxListener saveGpxListener = new SaveGpxListener() { + @Override + public void gpxSavingStarted() { + showProgressBar(); + } + + @Override + public void gpxSavingFinished(Exception errorMessage) { + if (isResumed()) { + hideProgressBar(); + shareGpx(gpxFile.path); + } + } + }; + new SaveCurrentTrackTask(app, gpxFile, saveGpxListener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { shareGpx(gpxFile.path); } @@ -622,7 +636,8 @@ public class TrackPointFragment extends OsmandExpandableListFragment implements FavouritesDbHelper fdb = app.getFavorites(); for (GpxDisplayItem i : getSelectedItems()) { if (i.locationStart != null) { - FavouritePoint fp = FavouritePoint.fromWpt(i.locationStart, app); + FavouritePoint fp = FavouritePoint.fromWpt( + i.locationStart, app, editText.getText().toString()); if (!Algorithms.isEmpty(i.description)) { fp.setDescription(i.description); } @@ -1235,62 +1250,6 @@ public class TrackPointFragment extends OsmandExpandableListFragment implements } } - public static class SaveAndShareTask extends AsyncTask { - private final GPXFile gpx; - private final OsmandApplication app; - private final WeakReference fragmentRef; - - SaveAndShareTask(@NonNull TrackPointFragment fragment, @NonNull GPXFile gpx) { - this.gpx = gpx; - fragmentRef = new WeakReference<>(fragment); - app = fragment.getMyApplication(); - } - - @Override - protected void onPreExecute() { - TrackPointFragment fragment = fragmentRef.get(); - if (fragment != null) { - fragment.showProgressBar(); - } - } - - @Override - protected Boolean doInBackground(Void... params) { - SavingTrackHelper savingTrackHelper = app.getSavingTrackHelper(); - Map files = savingTrackHelper.collectRecordedData(); - File dir; - boolean shouldClearPath = false; - if (gpx.path.isEmpty()) { - dir = app.getCacheDir(); - shouldClearPath = true; - } else { - dir = app.getAppCustomization().getTracksDir(); - } - if (!dir.exists()) { - dir.mkdir(); - } - for (final String f : files.keySet()) { - File fout = new File(dir, f + IndexConstants.GPX_FILE_EXT); - GPXUtilities.writeGpxFile(fout, gpx); - } - return shouldClearPath; - } - - @Override - protected void onPostExecute(Boolean shouldClearPath) { - TrackPointFragment fragment = fragmentRef.get(); - if (gpx != null) { - if (fragment != null && fragment.isResumed()) { - fragment.hideProgressBar(); - fragment.shareGpx(gpx.path); - } - if (shouldClearPath) { - gpx.path = ""; - } - } - } - } - private static class DeletePointsTask extends AsyncTask { private OsmandApplication app; diff --git a/OsmAnd/src/net/osmand/plus/osmedit/EditPoiData.java b/OsmAnd/src/net/osmand/plus/osmedit/EditPoiData.java index e081c60c59..27a25bfc1c 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/EditPoiData.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/EditPoiData.java @@ -51,6 +51,8 @@ public class EditPoiData { category = type; tagValues.put(POI_TYPE_TAG, ""); changedTags.add(POI_TYPE_TAG); + removeCurrentTypeTag(); + currentPoiType=null; } } diff --git a/OsmAnd/src/net/osmand/plus/osmedit/ExportOptionsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/osmedit/ExportOptionsBottomSheetDialogFragment.java index 93345a81c7..0b1086bfc5 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/ExportOptionsBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/ExportOptionsBottomSheetDialogFragment.java @@ -58,7 +58,7 @@ public class ExportOptionsBottomSheetDialogFragment extends MenuBottomSheetDialo BaseBottomSheetItem osmNotesItem = new BottomSheetItemWithDescription.Builder() .setDescription(String.valueOf(osmNotesCount)) - .setIcon(getContentIcon(R.drawable.ic_action_osm_note_add)) + .setIcon(getContentIcon(R.drawable.ic_action_osm_note)) .setTitle(getString(R.string.osm_notes)) .setLayoutId(R.layout.bottom_sheet_item_with_right_descr) .setDisabled(!(osmNotesCount > 0)) diff --git a/OsmAnd/src/net/osmand/plus/parkingpoint/ParkingPositionPlugin.java b/OsmAnd/src/net/osmand/plus/parkingpoint/ParkingPositionPlugin.java index 213b84d585..b910ca75e0 100644 --- a/OsmAnd/src/net/osmand/plus/parkingpoint/ParkingPositionPlugin.java +++ b/OsmAnd/src/net/osmand/plus/parkingpoint/ParkingPositionPlugin.java @@ -21,30 +21,33 @@ import net.osmand.data.FavouritePoint; import net.osmand.data.FavouritePoint.SpecialPointType; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; -import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuAdapter.ItemClickListener; import net.osmand.plus.ContextMenuItem; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; -import net.osmand.plus.settings.backend.OsmandSettings; -import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.dashboard.tools.DashFragmentData; import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.quickaction.QuickActionType; +import net.osmand.plus.settings.backend.ApplicationMode; +import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference; import net.osmand.plus.views.AnimateDraggingMapThread; import net.osmand.plus.views.MapInfoLayer; import net.osmand.plus.views.OsmandMapLayer.DrawSettings; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.mapwidgets.widgets.TextInfoWidget; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; +import java.util.Date; import java.util.List; +import java.util.Locale; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_MARK_AS_PARKING_LOC; @@ -523,18 +526,13 @@ public class ParkingPositionPlugin extends OsmandPlugin { } String getFormattedTime(long timeInMillis) { - StringBuilder timeStringBuilder = new StringBuilder(); Time time = new Time(); time.set(timeInMillis); - timeStringBuilder.append(time.hour); - timeStringBuilder.append(":"); - int minute = time.minute; - timeStringBuilder.append(minute < 10 ? "0" + minute : minute); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm dd.MM.yyyy", Locale.getDefault()); if (!DateFormat.is24HourFormat(app)) { - timeStringBuilder.append(time.hour >= 12 ? app.getString(R.string.osmand_parking_pm) : app - .getString(R.string.osmand_parking_am)); + sdf = new SimpleDateFormat("hh:mm a dd.MM.yyyy", Locale.getDefault()); } - return timeStringBuilder.toString(); + return sdf.format(new Date(time.toMillis(false))); } String getFormattedTimeInterval(long timeInMillis, Activity ctx) { diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/TracksCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/TracksCard.java index b04cfb77aa..78bd52085e 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/TracksCard.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/TracksCard.java @@ -117,7 +117,6 @@ public class TracksCard extends BaseCard { public void onClick(View v) { mapActivity.getMapActions().setGPXRouteParams(item.file); app.getTargetPointsHelper().updateRouteAndRefresh(true); - app.getRoutingHelper().recalculateRouteDueToSettingsChange(); } }); tracks.addView(v); diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java index a458b281e9..9af8b04641 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java @@ -302,37 +302,6 @@ public class RouteCalculationResult { return list; } - public List getRoute(int startIndex) { - if (segments.size() == 0) { - return null; - } - List list = new ArrayList(); - int skippedPoints = 0; - for (int i = 1; i <= startIndex; i++) { - RouteSegmentResult seg = segments.get(i - 1); - if (seg != segments.get(i)) { - skippedPoints += Math.abs(seg.getEndPointIndex() - seg.getStartPointIndex()); - } - } - list.add(segments.get(startIndex++)); - for (int i = startIndex; i < segments.size(); i++) { - if (segments.get(i - 1) != segments.get(i)) { - list.add(segments.get(i)); - } - } - if (!list.isEmpty()) { - RouteSegmentResult seg = list.get(0); - if (seg.isForwardDirection()) { - int index = seg.getStartPointIndex() + startIndex - skippedPoints; - seg.setStartPointIndex(index); - } else { - int index = seg.getEndPointIndex() + startIndex - skippedPoints; - seg.setEndPointIndex(index); - } - } - return list; - } - /** * PREPARATION */ diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index 66985df348..bcad053301 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -309,7 +309,7 @@ public class RouteProvider { return loc; } - public RouteCalculationResult calculateRouteImpl(RouteCalculationParams params){ + public RouteCalculationResult calculateRouteImpl(RouteCalculationParams params) { long time = System.currentTimeMillis(); if (params.start != null && params.end != null) { if(log.isInfoEnabled()){ @@ -369,25 +369,31 @@ public class RouteProvider { private RouteCalculationResult calculateGpxRoute(RouteCalculationParams routeParams) throws IOException { // get the closest point to start and to end GPXRouteParams gpxParams = routeParams.gpxRoute; + boolean calcWholeRoute = routeParams.gpxRoute.passWholeRoute && (routeParams.previousToRecalculate == null || !routeParams.onlyStartPointChanged); + boolean calculateOsmAndRouteParts = gpxParams.calculateOsmAndRouteParts; List gpxRouteResult = routeParams.gpxRoute.route; if (!Algorithms.isEmpty(gpxRouteResult)) { - boolean calculateOsmAndRouteParts = gpxParams.calculateOsmAndRouteParts; - if (routeParams.gpxRoute.passWholeRoute && !calculateOsmAndRouteParts) { + if (calcWholeRoute && !calculateOsmAndRouteParts) { return new RouteCalculationResult(gpxRouteResult, routeParams.start, routeParams.end, routeParams.intermediates, routeParams.ctx, routeParams.leftSide, null, null, routeParams.mode, true); } RouteCalculationResult result = new RouteCalculationResult(gpxRouteResult, routeParams.start, routeParams.end, - routeParams.intermediates, routeParams.ctx, routeParams.leftSide, null, null, routeParams.mode, false); + routeParams.intermediates, routeParams.ctx, routeParams.leftSide, null, null, routeParams.mode, false); List gpxRouteLocations = result.getImmutableAllLocations(); - int gpxNextIndex = routeParams.gpxRoute.passWholeRoute ? 0 : findStartIndexFromRoute(gpxRouteLocations, routeParams.start, calculateOsmAndRouteParts); - Location gpxNextLocation; + int gpxNextIndex = calcWholeRoute ? 0 : findStartIndexFromRoute(gpxRouteLocations, routeParams.start, calculateOsmAndRouteParts); + Location gpxNextLocation = null; List firstSegmentRoute = null; List gpxRoute; if (gpxNextIndex > 0) { gpxNextLocation = gpxRouteLocations.get(gpxNextIndex); - gpxRoute = result.getRoute(gpxNextIndex); + gpxRoute = result.getOriginalRoute(gpxNextIndex); + if (gpxRoute.size() > 0) { + gpxRoute.remove(0); + } } else { - gpxNextLocation = gpxRouteLocations.get(0); + if (!gpxRouteLocations.isEmpty()) { + gpxNextLocation = gpxRouteLocations.get(0); + } gpxRoute = result.getOriginalRoute(); } if (calculateOsmAndRouteParts @@ -405,43 +411,21 @@ public class RouteProvider { routeParams.intermediates, routeParams.ctx, routeParams.leftSide, null, null, routeParams.mode, true); } - if(routeParams.gpxRoute.useIntermediatePointsRTE){ + if (routeParams.gpxRoute.useIntermediatePointsRTE) { return calculateOsmAndRouteWithIntermediatePoints(routeParams, gpxParams.points); } + List gpxRoute ; int[] startI = new int[]{0}; - int[] endI = new int[]{gpxParams.points.size()}; - if (routeParams.gpxRoute.passWholeRoute) { + int[] endI = new int[]{gpxParams.points.size()}; + if (calcWholeRoute) { gpxRoute = gpxParams.points; - if (routeParams.previousToRecalculate != null && routeParams.onlyStartPointChanged) { - List routeLocations = routeParams.previousToRecalculate.getRouteLocations(); - if (routeLocations != null && routeLocations.size() >= 1) { - gpxRoute = new ArrayList<>(); - Location trackStart = routeLocations.get(0); - Location realStart = routeParams.start; - //insert gpxRouteResult segment from current location to next gpxRouteResult location if user deviated from gpxRouteResult - if (realStart != null && trackStart != null - && realStart.distanceTo(trackStart) > MIN_DISTANCE_FOR_INSERTING_ROUTE_SEGMENT - && !gpxParams.calculateOsmAndRouteParts) { - LatLon nextRouteLocation = new LatLon(trackStart.getLatitude(), trackStart.getLongitude()); - RouteCalculationResult newRes = findOfflineRouteSegment(routeParams, realStart, nextRouteLocation); - if (newRes != null && newRes.isCalculated()) { - gpxRoute.addAll(0, newRes.getImmutableAllLocations()); - } else { - gpxRoute.add(0, realStart); - } - } - gpxRoute.addAll(new ArrayList<>(routeLocations)); - endI = new int[]{gpxRoute.size()}; - } - } } else { gpxRoute = findStartAndEndLocationsFromRoute(gpxParams.points, routeParams.start, routeParams.end, startI, endI); } final List inputDirections = gpxParams.directions; List gpxDirections = calcDirections(startI, endI, inputDirections); - boolean calculateOsmAndRouteParts = gpxParams.calculateOsmAndRouteParts; insertInitialSegment(routeParams, gpxRoute, gpxDirections, calculateOsmAndRouteParts); insertFinalSegment(routeParams, gpxRoute, gpxDirections, calculateOsmAndRouteParts); diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 78524a4d74..7d1c9696d2 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -857,10 +857,9 @@ public class RoutingHelper { l.newRouteIsCalculated(newRoute, showToast); } } - if (showToast.value && OsmandPlugin.isDevelopment()) { + if (showToast.value && newRoute && OsmandPlugin.isDevelopment()) { String msg = app.getString(R.string.new_route_calculated_dist_dbg, OsmAndFormatter.getFormattedDistance(res.getWholeDistance(), app), - ((int)res.getRoutingTime()) + " sec", res.getCalculateTime(), res.getVisitedSegments(), res.getLoadedTiles()); app.showToastMessage(msg); diff --git a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java index 941ec45469..3d3cd27f2a 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java @@ -32,6 +32,7 @@ import androidx.core.view.ViewPropertyAnimatorListener; import com.google.android.material.slider.Slider; import net.osmand.AndroidUtils; +import net.osmand.GPXUtilities.GPXFile; import net.osmand.Location; import net.osmand.core.android.MapRendererContext; import net.osmand.data.LatLon; @@ -52,6 +53,7 @@ import net.osmand.plus.dashboard.DashboardOnMap.DashboardType; import net.osmand.plus.dialogs.DirectionsDialogs; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.mapcontextmenu.MapContextMenu; +import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.SelectedGpxPoint; import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin; import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu; import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu.PointType; @@ -448,7 +450,7 @@ public class MapControlsLayer extends OsmandMapLayer { public void navigateButton() { if (!OsmAndLocationProvider.isLocationPermissionAvailable(mapActivity)) { ActivityCompat.requestPermissions(mapActivity, - new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, + new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_FOR_NAVIGATION_FAB_PERMISSION); } else { final MapContextMenu menu = mapActivity.getContextMenu(); @@ -457,43 +459,48 @@ public class MapControlsLayer extends OsmandMapLayer { menu.hide(); final TargetPointsHelper targets = mapActivity.getMyApplication().getTargetPointsHelper(); RoutingHelper routingHelper = mapActivity.getMyApplication().getRoutingHelper(); - if (routingHelper.isFollowingMode() || routingHelper.isRoutePlanningMode()) { - DirectionsDialogs.addWaypointDialogAndLaunchMap(mapActivity, latLon.getLatitude(), - latLon.getLongitude(), pointDescription); - } else if (targets.getIntermediatePoints().isEmpty()) { - startRoutePlanningWithDestination(latLon, pointDescription, targets); + + Object object = menu.getObject(); + if (object instanceof SelectedGpxPoint && !((SelectedGpxPoint) object).getSelectedGpxFile().isShowCurrentTrack()) { + GPXFile gpxFile = ((SelectedGpxPoint) object).getSelectedGpxFile().getGpxFile(); + mapActivity.getMapActions().enterRoutePlanningModeGivenGpx(gpxFile, null, null, true, true, MenuState.HEADER_ONLY); + routingHelper.recalculateRouteDueToSettingsChange(); menu.close(); } else { - AlertDialog.Builder bld = new AlertDialog.Builder(mapActivity); - bld.setTitle(R.string.new_directions_point_dialog); - final int[] defaultVls = new int[]{0}; - bld.setSingleChoiceItems(new String[]{ - mapActivity.getString(R.string.clear_intermediate_points), - mapActivity.getString(R.string.keep_intermediate_points) - }, 0, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - defaultVls[0] = which; - } - }); - bld.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { + if (routingHelper.isFollowingMode() || routingHelper.isRoutePlanningMode()) { + DirectionsDialogs.addWaypointDialogAndLaunchMap(mapActivity, latLon.getLatitude(), + latLon.getLongitude(), pointDescription); + } else if (targets.getIntermediatePoints().isEmpty()) { + startRoutePlanningWithDestination(latLon, pointDescription, targets); + menu.close(); + } else { + AlertDialog.Builder bld = new AlertDialog.Builder(mapActivity); + bld.setTitle(R.string.new_directions_point_dialog); + final int[] defaultVls = new int[] {0}; + bld.setSingleChoiceItems(new String[] { + mapActivity.getString(R.string.clear_intermediate_points), + mapActivity.getString(R.string.keep_intermediate_points) + }, 0, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + defaultVls[0] = which; + } + }); + bld.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (defaultVls[0] == 0) { - targets.removeAllWayPoints(false, true); - targets.navigateToPoint(latLon, true, -1, pointDescription); - mapActivity.getMapActions().enterRoutePlanningModeGivenGpx(null, null, null, true, true, MenuState.HEADER_ONLY); - menu.close(); - } else { + @Override + public void onClick(DialogInterface dialog, int which) { + if (defaultVls[0] == 0) { + targets.removeAllWayPoints(false, true); + } targets.navigateToPoint(latLon, true, -1, pointDescription); mapActivity.getMapActions().enterRoutePlanningModeGivenGpx(null, null, null, true, true, MenuState.HEADER_ONLY); menu.close(); } - } - }); - bld.setNegativeButton(R.string.shared_string_cancel, null); - bld.show(); + }); + bld.setNegativeButton(R.string.shared_string_cancel, null); + bld.show(); + } } } }