diff --git a/.github/ISSUE_TEMPLATE/3-bug-report.md b/.github/ISSUE_TEMPLATE/3-bug-report.md
index ecf870be10..0fd8c3e5ff 100644
--- a/.github/ISSUE_TEMPLATE/3-bug-report.md
+++ b/.github/ISSUE_TEMPLATE/3-bug-report.md
@@ -3,69 +3,16 @@ name: "\U0001F41E Bug report"
about: Report a bug in OsmAnd
---
-
-
-# 🐞 bug report
-
-### Is this a regression?
-
-
- Yes, the previous version in which this bug was not present was: ....
-
### Description
-
-## 🔬 Minimal Reproduction
+### How to reproduce?
-
- 1. Open app, and click on ...
-## 🔥 Exception or Error
+### Your Environment
+OsmAnd Version:
+Android/iOS version:
+Device model:
-
-
-
-
-
-
-## 🌍 Your Environment
-
-**OsmAnd Version:**
-
-
-
-
-
-
-
-**Device and Android/iOS version:**
-
-**Maps used (online or offline):**
-
-
-
-- [ ] Offline maps offered within the OsmAnd app for download.
-
-- [ ] Online (tile / raster) maps
-
-**Anything else relevant?**
+**Maps used (online or offline):**
+If you have an issue related to offline maps, tell us the exact name of the map file where the issue occurs and its edition date.
diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/GeocodingUtilities.java b/OsmAnd-java/src/main/java/net/osmand/binary/GeocodingUtilities.java
index 77357bac9b..a372f12aa1 100644
--- a/OsmAnd-java/src/main/java/net/osmand/binary/GeocodingUtilities.java
+++ b/OsmAnd-java/src/main/java/net/osmand/binary/GeocodingUtilities.java
@@ -334,14 +334,16 @@ public class GeocodingUtilities {
boolean eqStreet = Algorithms.stringsEqual(gr1.streetName, gr2.streetName);
if (eqStreet) {
boolean sameObj = false;
- if (gr1.building != null && gr2.building != null) {
- if (Algorithms.stringsEqual(gr1.building.getName(), gr2.building.getName())) {
- // same building
+ if (gr1.city != null && gr2.city != null) {
+ if (gr1.building != null && gr2.building != null) {
+ if (Algorithms.stringsEqual(gr1.building.getName(), gr2.building.getName())) {
+ // same building
+ sameObj = true;
+ }
+ } else if (gr1.building == null && gr2.building == null) {
+ // same street
sameObj = true;
}
- } else if (gr1.building == null && gr2.building == null) {
- // same street
- sameObj = true;
}
if (sameObj) {
double cityDist1 = MapUtils.getDistance(gr1.searchPoint, gr1.city.getLocation());
diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java
index 089de43fcd..e31f8ef03b 100644
--- a/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java
+++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteSegmentResult.java
@@ -271,7 +271,7 @@ public class RouteSegmentResult implements StringExternalizable
bundle.putString("turnLanes", TurnType.lanesToString(turnLanes));
}
}
- bundle.putLong("id", object.id);
+ bundle.putLong("id", object.id >> 6); // OsmAnd ID to OSM ID
bundle.putArray("types", convertTypes(object.types, rules));
int start = Math.min(startPointIndex, endPointIndex);
@@ -327,22 +327,21 @@ public class RouteSegmentResult implements StringExternalizable
Location prevLocation = null;
for (int i = 0; i < length; i++) {
Location location = resources.getLocation(index);
- if (location == null) {
- continue;
- }
- double dist = 0;
- if (prevLocation != null) {
- dist = MapUtils.getDistance(prevLocation.getLatitude(), prevLocation.getLongitude(), location.getLatitude(), location.getLongitude());
- distance += dist;
- }
- prevLocation = location;
- object.pointsX[i] = MapUtils.get31TileNumberX(location.getLongitude());
- object.pointsY[i] = MapUtils.get31TileNumberY(location.getLatitude());
- if (location.hasAltitude() && object.heightDistanceArray.length > 0) {
- object.heightDistanceArray[i * 2] = (float) dist;
- object.heightDistanceArray[i * 2 + 1] = (float) location.getAltitude();
- } else {
- object.heightDistanceArray = new float[0];
+ if (location != null) {
+ double dist = 0;
+ if (prevLocation != null) {
+ dist = MapUtils.getDistance(prevLocation.getLatitude(), prevLocation.getLongitude(), location.getLatitude(), location.getLongitude());
+ distance += dist;
+ }
+ prevLocation = location;
+ object.pointsX[i] = MapUtils.get31TileNumberX(location.getLongitude());
+ object.pointsY[i] = MapUtils.get31TileNumberY(location.getLatitude());
+ if (location.hasAltitude() && object.heightDistanceArray.length > 0) {
+ object.heightDistanceArray[i * 2] = (float) dist;
+ object.heightDistanceArray[i * 2 + 1] = (float) location.getAltitude();
+ } else {
+ object.heightDistanceArray = new float[0];
+ }
}
if (plus) {
index++;
diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java
index 922e225855..3bfbaec0da 100644
--- a/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java
+++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutingContext.java
@@ -289,7 +289,8 @@ public class RoutingContext {
if(excludeNotAllowed != null && !excludeNotAllowed.contains(ro.getId())) {
ts.add(ro);
}
- } else if(excludeNotAllowed != null && ro.getId() > 0){
+ }
+ if(excludeNotAllowed != null && ro.getId() > 0){
excludeNotAllowed.add(ro.getId());
if(ts.excludedIds == null ){
ts.excludedIds = new TLongHashSet();
diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java
index 360fafbdf9..e5c791a780 100644
--- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java
+++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java
@@ -923,6 +923,7 @@ public class SearchCoreFactory {
public static class SearchAmenityByTypeAPI extends SearchBaseAPI {
private static final int BBOX_RADIUS = 10000;
+ private static final int BBOX_RADIUS_NEAREST = 1000;
private SearchAmenityTypesAPI searchAmenityTypesAPI;
private MapPoiTypes types;
private AbstractPoiType unselectedPoiType;
@@ -1007,7 +1008,14 @@ public class SearchCoreFactory {
}
this.nameFilter = nameFilter;
if (poiTypeFilter != null) {
- QuadRect bbox = phrase.getRadiusBBoxToSearch(BBOX_RADIUS);
+ int radius = BBOX_RADIUS;
+ if (phrase.getRadiusLevel() == 1 && poiTypeFilter instanceof CustomSearchPoiFilter) {
+ String name = ((CustomSearchPoiFilter) poiTypeFilter).getFilterId();
+ if ("std_null".equals(name)) {
+ radius = BBOX_RADIUS_NEAREST;
+ }
+ }
+ QuadRect bbox = phrase.getRadiusBBoxToSearch(radius);
List offlineIndexes = phrase.getOfflineIndexes();
Set searchedPois = new TreeSet<>();
for (BinaryMapIndexReader r : offlineIndexes) {
diff --git a/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingTest.java b/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingTest.java
index b4f343da62..06e6ef8fda 100644
--- a/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingTest.java
+++ b/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingTest.java
@@ -15,6 +15,7 @@ import java.util.TreeSet;
import net.osmand.binary.BinaryMapIndexReader;
+import net.osmand.data.LatLon;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -29,42 +30,52 @@ public class RouteTestingTest {
private TestEntry te;
- public RouteTestingTest(String name, TestEntry te) {
- this.te = te;
- }
+ public RouteTestingTest(String name, TestEntry te) {
+ this.te = te;
+ }
- @BeforeClass
- public static void setUp() throws Exception {
- RouteResultPreparation.PRINT_TO_CONSOLE_ROUTE_INFORMATION_TO_TEST = true;
- }
+ @BeforeClass
+ public static void setUp() throws Exception {
+ RouteResultPreparation.PRINT_TO_CONSOLE_ROUTE_INFORMATION_TO_TEST = true;
+ }
- @Parameterized.Parameters(name = "{index}: {0}")
- public static IterableNáuticoLocalización sen nomeTúnel adiante
- Túneis
+ TúnelesBaixa os artigos da Wikipedia de %1$s para lelos sen conexión.Baixar datos da WikipediaAbrir artigo en liña
@@ -2901,10 +2901,10 @@ Lon %2$s
TrocarAmosar máisPistas amosadas
- Amosar/agochar pistas GPX
- Un botón que amosa ou agocha as pistas GPX escollidas no mapa.
- Agochar pistas GPX
- Amosar pistas GPX
+ Amosar/agochar pistas
+ Un botón que amosa ou agocha as pistas escollidas no mapa.
+ Agochar pistas
+ Amosar pistas%1$d transferenciasEngadir orixe e destinoEngadir punto de comezo
@@ -3804,7 +3804,7 @@ Lon %2$s
\nEscolle %2$s. Todos os datos relacionados de radares de velocidade: alertas, notificacións e PDI serán eliminados até que o OsmAnd sexa reinstalado de xeito completo.
Manter activoDesinstalar
- É necesario reiniciar para eliminar de xeito completo os datos do radar de velocidade.
+ Reiniciar para eliminar todos os datos do radar de velocidade.As alertas de radares de velocidade nalgúns países están prohibidas por lei.Levando%1$s eliminado
@@ -3813,21 +3813,21 @@ Lon %2$s
Límite de lonxitudeEste dispositivo non ten radares de velocidade.Patíns en liña
- Activar para controlar o nivel de achegamento (zoom) do mapa cos botóns de volume do dispositivo.
+ Controlar o nivel de achegamento (zoom) do mapa cos botóns de volume do dispositivo.Os botóns de volume mudan o achegamentoFornece a lonxitude do teu vehículo. Algunhas restricións de ruta poden ser aplicadas a vehículos longos.
- Eliminar seguinte punto de destino
+ Eliminar punto de destino máis pretoFornece un nome para o puntoO punto de destino actual na ruta será eliminado. Se fora o destino, a navegación sería interrompida.Baixar mapas da Wikipedia
- Obter información sobre os puntos de interesse da Wikipédia. É o teu guía de peto sen conexión - só activar o complemento da Wikipédia e desfrutar dos artigos sobre os elementos ó teu redor.
+ Obter información sobre os puntos de interese da Wikipedia. É o teu guía de peto sen conexión - só activar o complemento da Wikipedia e desfrutar dos artigos sobre os elementos ó teu redor.EnduroScooterCadeira de rodasCadeira de rodas só cara adianteKartNota do OSM pechada
- Tes que definir os días laborais para continuar
+ Definir os días laborais para continuarRuta entre puntosPlanificar unha rutaEngadir a unha pista
@@ -3852,4 +3852,77 @@ Lon %2$s
está gardadoEngade polo menos dous puntos.Refacer
+ • Actualizouse a función \"Planificar ruta\": permite empregar diferentes tipos de navegación por segmento e o engadido de pistas
+\n
+\n • Novo menú coa aparencia das pistas: escoller a cor, o grosor, amosar as frechas de dirección e as iconas de comezo/final.
+\n
+\n • Melloras na visibilidade dos nós de bicicleta.
+\n
+\n • As pistas agora pódense premer, contén un menú con información básica.
+\n
+\n • Algoritmos de procura mellorados
+\n
+\n • Melloras nas opcións de seguimento da navegación
+\n
+\n • Solucionáronse os problemas da importación e exportación nos axustes dos perfís
+\n
+\n
+ Gravar a pista de xeito automático ó navegar
+ Última edición
+ Importar pista
+ Abrir pista existente
+ Crear nova ruta
+ Seleccionar un ficheiro de pista para abrir.
+ Feito
+ Substituír pista
+ Gardar coma nova pista
+ Ruta inversa
+ Recalcular toda a pista empregando o perfil escollido.
+ Recalcular só o seguinte segmento empregando o perfil escollido.
+ Marca de que xeito conectar os puntos, cunha liña recta ou calcular unha ruta entre eles como se detalla deseguido.
+ Pista enteira
+ Seguinte segmento
+ Deseguido, axusta a pista á estrada permitida máis preto cun perfil de navegación.
+ Distancia limiar
+ Perfil de navegación
+ Escolle un ficheiro de pista ó que se engadirá un novo segmento.
+ Imaxes a nivel de rúa
+ Pechar o plan de ruta sen gardar\?, desbotaranse todas as modificacións.
+ En caso de dirección inversa
+ Gardar coma novo ficheiro de pista
+ Engadir a un ficheiro de pistas
+ Pistas
+ Pistas
+ Pistas
+ Gardar pista en ficheiro GPX
+ Ruta da pista
+ Engadir ficheiros de pista
+ Importar ou gravar ficheiros de pista
+ Engadir punto de referencia da pista
+ Engadir punto de pasaxe da pista
+ Gravación da viaxe
+ Gardar coma ficheiro de pista
+ Seguir pista
+ Escoller o ficheiro da pista a seguir
+ Escoller o ficheiro da pista a seguir ou importar dende o dispositivo.
+ Escoller outra pista
+ Navegar dende a miña posición á pista
+ Punto da pista para navegar
+ Comezo da pista
+ Punto máis preto
+ Unir ás estradas
+ Eliminar enderezo
+ Engadir enderezo
+ Inserir o enderezo
+ Recurtar antes
+ Recurtar despois
+ Mudar o tipo de ruta anterior
+ Mudar o tipo de ruta seguinte
+ Pista simplificada
+ Só gravarase a liña da ruta, os puntos intermedios serán eliminados.
+ Nome do ficheiro
+ %s ficheiros de pista seleccionados
+ Gravar
+ A gravación da pista deterase ó pechar a aplicación (mediante aplicacións recentes). (A indicación de fondo do OsmAnd, desaparecerá da barra de notificacións do Android.)
+ Especifica o intre de gravación xeral para pistas (habilitado a través do trebello de gravación no mapa).
\ No newline at end of file
diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml
index 3133035da6..519a8cce66 100644
--- a/OsmAnd/res/values-hu/strings.xml
+++ b/OsmAnd/res/values-hu/strings.xml
@@ -213,7 +213,7 @@
A kijelölt nyelvet az Android TTS (text-to-speech, szövegfelolvasó) rendszere nem támogatja, helyette az előre beállított szövegfelolvasási nyelv lesz használatban. Keresen másik TTS rendszert a Play Áruházban\?Hiányzó adatÁtváltasz az áruházra a kiválasztott nyelv letöltéséhez?
- GPX irány megfordítása
+ Nyomvonal irányának megfordításaJelenlegi célpont használataVégig az egész útvonalonOffline vektoros térkép érhető el ezen a helyen.
diff --git a/OsmAnd/res/values-it/strings.xml b/OsmAnd/res/values-it/strings.xml
index 505d5ee27f..018ca3edb1 100644
--- a/OsmAnd/res/values-it/strings.xml
+++ b/OsmAnd/res/values-it/strings.xml
@@ -3816,15 +3816,15 @@
Seleziona larghezzaUltima modificataImporta una traccia
- Apri una traccia esistente
+ Apri traccia esistenteCrea un nuovo percorso
- Scegli il file di una traccia da aprire.
+ Scegli un file traccia da aprire.FattoProfilo di navigazionePoi approssima la traccia alle strade più vicine permesse da uno dei tuoi profili di navigazione per utilizzare questa opzione.
- Scegli come collegare i punti, con una linea retta, o calcolando un percorso che li colleghi utilizzando il profilo scelto.
+ Scegli come collegare i punti, con una linea retta, o calcolando un percorso che li colleghi come specificato sotto.Sovrascrivi traccia
- Salva come nuova Traccia
+ Salva come nuova tracciaInverti il percorsoSolo il nuovo segmento sarà ricalcolato utilizzando il profilo scelto.Tutta la traccia sarà ricalcolata utilizzando il profilo scelto.
@@ -3870,7 +3870,7 @@
Nome del file%s file traccia selezionatiMetterà in pausa la registrazione della traccia quando l\'applicazione viene terminata (attraverso le app recenti). (L\'indicazione di OsmAnd in background scomparirà dalla barra delle notifiche di Android.)
- Specifica l\'intervallo di registrazione per la registrazione delle tracce (abilitata attraverso il pulsante di Registrazione del viaggio sulla mappa).
+ Specifica l\'intervallo per la registrazione delle tracce (abilitata attraverso il pulsante di Registrazione del viaggio sulla mappa).Sospendi la registrazione del viaggioRiprendi la registrazione del viaggioPreimpostazioni di sistema
@@ -3881,7 +3881,7 @@
Tutti i segmenti successivi verranno ricalcolati con il profilo selezionato.Tutti i segmenti precedenti verranno ricalcolati con il profilo selezionato.Apri una traccia salvata
- è stato salvato
+ è salvatoPer favore aggiungi almeno due punti.Ripeti• Aggiornata la modalità Pianificazione dell\'Itinerario che permette l\'utilizzo di diversi profili di navigazione per ogni segmento e incolla le tracce alle strade
@@ -3890,7 +3890,7 @@
\n
\n • Migliorata la visibilità dei nodi ciclistici
\n
-\n • Menù contestuale con informazioni di base
+\n • Le tracce adesso sono tappabili, hanno un nuovo menù contestuale con informazioni di base
\n
\n • Migliorato l\'algoritmo di ricerca
\n
diff --git a/OsmAnd/res/values-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml
index 2971332a22..7f556c9926 100644
--- a/OsmAnd/res/values-iw/strings.xml
+++ b/OsmAnd/res/values-iw/strings.xml
@@ -400,7 +400,7 @@
השפה הנבחרת אינה נתמכת על ידי המנגנון של Android הממיר טקסט לדיבור (TTS) המותקן, ייעשה שימוש בשפת ההמרה במקום. לחפש מנוע המרה אחר של טקסט לדיבור בחנות\?חסרים נתוניםלגשת לחנות להוריד את השפה הנבחרת?
- היפוך כיוון ה־GPX
+ היפוך כיוון המסלולשימוש ביעד הנוכחילעבור לאורך דרך שלמהקיימת מפה וקטורית עבור מיקום זה.
@@ -3838,9 +3838,7 @@
כל המסלול יחושב מחדש באמצעות הפרופיל הנבחר.רק המקטע הבא יחושב מחודש באמצעות הפרופיל הנבחר.נא לבחור כיצד לחבר נקודות, בקו ישר, או לחבר מסלול ביניהן כפי שצוין להלן.
- כדי להשתמש באפשרות זו על OsmAnd להצמיד את המסלול שלך לדרכים שעל המפה.
-\n
-\n בשלב הבא יהיה עליך לבחור בפרופיל ניווט כדי לזהות את הדרכים המורשות ואת סף המרחק כדי להעריך את המסלול שלך ביחס לדרכים.
+ בשלב הבא עליך להצמיד את הדרך המורשית הקרובה ביותר לאחד מפרופילי הניווט שלך כדי להשתמש באפשרות הזו.תמונות ברמת רחובלהתעלם מהשינויים במסלול המתוכנן על ידי סגירתו\?במקרה של כיוון הפוך
@@ -3893,4 +3891,22 @@
נשמרנא להוסיף שתי נקודות לפחות.ביצוע מחדש
+ • פונקציית תכנון המסלול עודכנה: מאפשרת שימוש בסוגי ניווט שונים לפי מקטע והכללת מסלולית
+\n
+\n • תפריט מראה חדש למסלולים: ניתן לבחור צבע, עובי, להציג חצי כיוון, סמלי התחלה/סיום
+\n
+\n • אופן הצגת שבילי האופניים השתפר.
+\n
+\n • אפשר לגעת במסלולים, יש להם גם תפריט הקשר עם מידע בסיסי.
+\n
+\n • אלגוריתמי החיפוש השתפרו
+\n
+\n • אפשרות המעקב אחר המסלול בניווט השתפרה
+\n
+\n • תוקנו תקלות בייבוא/ייצוא הגדרות פרופיל
+\n
+\n
+ שינוי אחרון
+ שם: ת – א
+ שם: א – ת
\ No newline at end of file
diff --git a/OsmAnd/res/values-lv/strings.xml b/OsmAnd/res/values-lv/strings.xml
index 95f040be10..437c20e592 100644
--- a/OsmAnd/res/values-lv/strings.xml
+++ b/OsmAnd/res/values-lv/strings.xml
@@ -118,7 +118,7 @@
Mainīt maršruta iestatījumusGlobālie iestatījumiKartes faili
- "Lejupielādēt un pārraudzīt kartes daļas, balss pakas un vikipēdijas interešu punktus (POI)"
+ Lejupielādēt un pārvaldīt bezsaistes kartes failus, kas saglabāti jūsu ierīcē.Vispārīgie iestatījumiMainīt lietotnes iestatījumus.Globālie lietotnes iestatījumi
@@ -220,7 +220,7 @@
Atpako jaunos datus…Lai darbotos tiešsaistes navigācijas serviss, ir nepieciešams interneta savienojums.Valoda netiek atbalstīta
- Izvēlētā valoda nav atbalstīta instalētajā ierīces Android TTS (teksta izrunāšana) dzinējā. Vai vēlaties meklēt citu TTS dzinēju? Pretējā gadījumā tiks lietota iepriekš uzstādītā TTS valoda.
+ Izvēlētā valoda nav atbalstīta ierīces Android TTS (teksta izrunāšana) dzinējā, tāpēc tiks lietota instalētā TTS valoda. Vai meklēt Google Play veikalā citu TTS dzinēju\?Iztrūkst datiValodas dati nav instalēti. Vai atvērt Google Play veikalu, lai instalētu?Pretējs GPX virziens
@@ -327,7 +327,7 @@
Izvēlieties, kuru OsmAnd versiju instalētInstalācijas versijaGPS statusa lietotne nav instalēta. Meklēt Google Play veikalā\?
- "Nav pieejama balss vadība, lūdzu ejiet uz \'Iestatījumi\' → \'Vispārīgie Iestatījumi\' → \'Balss vadība\' un izvēlieties vai lejupielādējiet balss pakotni."
+ Nav pieejama balss vadība, lūdzu ejiet uz \'Iestatījumi\' → \'Vispārīgie Iestatījumi\' → \'Balss vadība\' un izvēlieties kādu vai lejupielādējiet balss pakotni.Nav izvēlēta balss vadībaDienaNakts
@@ -440,7 +440,7 @@
TurpinātVēlākLejupielādēt reģionus
- "Paldies, ka izvēlējāties OsmAnd. Lejupielādējiet reģiona datus bezsaistes lietošanai caur \'Izvēlne\' -> → \'Lejupielādes\'. Pēc tam jūs varēsiet skatīt kartes, atrast adreses, interešu punktus (POI), meklēt sabiedrisko transportu un vēl."
+ "Paldies, ka izvēlējāties OsmAnd. Lejupielādējiet reģiona datus bezsaistes lietošanai caur \'Izvēlne\' -> → \'Lejupielādes\', lai skatītu kartes, atrastu adreses, interešu punktus (POI), meklētu sabiedrisko transportu un vēl."Meklē signālu…Meklēt blakus kartes centramMeklēt tuvumā
@@ -544,7 +544,7 @@
Iestatiet valodu, lejupielādējiet/atjaunojiet datusDatiOSM labošana
- Automātiski mērogot karti atkarībā no pārvietošanās ātruma
+ Automātiski mērogot karti atkarībā no pārvietošanās ātruma.Automātiski mērogot kartiPapildus iestatījumiIestatījumi
@@ -663,11 +663,11 @@
Lietot tiešaistes kartes (lejuplādējot un kešojot bildes SD kartē)Tiešsaistes kartesKonfigurēt tiešaistes vai kešotās kartes bildes
- "Ar šo spraudni jūs varēsiet piekļūt dažādām tiešsaistes (t.s. bilžu vai rastru) kartēm, sākot no iepriekš definētām OpenStreetMap bildēm ( kā Mapnik) līdz satelītu fotoattēliem un īpašajiem klājumiem kā laikapstākļu kartes, klimata kartes, ğeoloğiskās kartes, kalnu reljefi u.t.t.
+ "Ar šo spraudni jūs varēsiet piekļūt dažādām tiešsaistes (t.s. bilžu vai rastru) kartēm, sākot no iepriekš definētām OpenStreetMap bildēm (kā Mapnik) līdz satelītu fotoattēliem un īpašajiem klājumiem kā laikapstākļu kartes, klimata kartes, ğeoloğiskās kartes, kalnu reljefi u.t.t.
\n
\nJebkuras no šīm kartēm var tik pielietotas kā pamata (bāzes) kartes vai kā virsklājs vai apakšklājs citai bāzes kartei (kā piemēram, OsmAnd standarta bezsaistes kartei). Lai apakšklāja kartes būtu labāk redzamas, noteiktus elementus no OsmAnd vektoru kartēm ir iespējams paslēpt caur kartes konfigurācijas izvēlni.
\n
-\nBilžu kartes var lietot no tiešsaistes avotiem vai sagatavot bezsaistes lietošanai (iekopējot OsmAnd datu mapē) kā SQLite databāzi, to izveidojot ar kādu no atsevišķi pieejamajām kartēšanas aplikācijām. "
+\nBilžu kartes var lietot no tiešsaistes avotiem vai sagatavot bezsaistes lietošanai (iekopējot OsmAnd datu mapē) kā SQLite databāzi, to izveidojot ar kādu no atsevišķi pieejamajām kartēšanas aplikācijām."Rāda iestatījumus navigācijas darbībai fonā (izslēgts ekrāns), periodiski ieslēdzot GPS.Rādīt iestatījumus atsevišķām pieejamības iespējām kā TTS runas ātrums, atrašanās vietas izruna, ekrāna mērogošana u.t.t.Rādīt izstrādes un atkļūdošanas iestatījumus, kā piemēram, animētā navigācija, renderēšanas izpildījuma attēlošana vai balss uzvednes. Šie iestatījumi ir paredzēti izstrādātājiem un nav vajadzīgi gala lietotājam.
@@ -762,7 +762,7 @@
Izvairīties no pārceltuvēmIzvairīties no…Rādīt signālus…
- Satiksmes ierobežojumus (ātruma limitus, stopzīmes, rampas), gājēju pārejas, fotoradarus, ceļa joslas
+ Iestatīt satiksmes brīdinājumus (ātruma limitus, apstāšanās vietas, ātrumvaļņus, tuneļus), foto radarus un ceļa joslas.Fluorescējošs maršrutsLineālsSkata virziens
@@ -860,9 +860,9 @@
Eiropa, Āzija, LatīņamerikaApvienotā Karaliste, Indija un citasPaziņot…
- Ielu nosaukumus, satiksmes brīdinājumus (stopzīmes, ceļa rampas), fotoradarus, ātruma ierobežojumus
+ Izrunāt ielu nosaukumus, satiksmes brīdinājumus (piespiedu apstāšanos, ātrumvaļņus), fotoradarus un ātruma ierobežojumus.Ielu nosaukumi (TTS)
- Ātruma ierrobežojums
+ Ātruma ierobežojumsFotoradariSatiksmes brīdinājumiLūdzu norādiet iestatījumos OSM lietotāja vārdu un paroli
@@ -900,7 +900,7 @@
Noņemt visus mērķusAtvērt GPX failuLūdzu uzgaidiet, kamēr tiks pabeigta patreizējā darbība
- "Samazina kompasa svārstības, palielinot inertumu"
+ Samazina kompasa svārstības, palielinot inertumu.Lietot Kalmana filtruLietot magnētisko sensoru orientācijas sensora vietā, lai noteiktu kompasa stāvokliLietot magnētisko sensoru
@@ -949,7 +949,7 @@
Mainīt kārtībuLūdzu apsveriet iespēju pirkt Contour Lines spraudni, lai atbalstītu tā tālāko attīstību.Kontūrlīniju spraudnis
- Atlasīt pēc pieprasījuma
+ Pēc pieprasījuma\?Ierakstīt videoIerakstīt audioIzvēlieties noklusēto logrīka darbību
@@ -996,7 +996,7 @@
Ceļu kartesRobežasNoņemt reģionālo robežu attēlošanu (admin līmeņi 5-9)
- Ātruma limiti
+ Ātruma ierobežojumiNav atrastas ēkas.Meklēt apdzīvotās vietas/pasta indeksusIzvēlieties, kad rādīt tikai ceļu tīkla kartes:
@@ -1204,9 +1204,9 @@
PersiešuNosaukumi kartē (ja valoda nebūs pieejama, tiks lietoti vietvārdi vai angļu valoda)Kartes pamatvaloda
- "Ar šo spraudni jūs varat manuāli saglabāt trekus, nospiežot GPX ieraksta logrīku uz kartes vai veikt automātisku visu maršrutu ierakstu GPX failā.
+ Ar šo spraudni jūs varat manuāli saglabāt trekus, nospiežot GPX ieraksta logrīku uz kartes vai veikt automātisku visu maršrutu ierakstu GPX failā.
\n
-\nIerakstītie treki vēlāk var tikt izmantoti treka analīzei, koplietošanai ar draugiem vai OSM izstrādei. Atlēti var izmantot trekus, lai monitorētu treniņus. Pamata treku analīze var tikt veikta tieši caur OsmAnd kā piemēram, apļu laiki, vidējais ātrums utt., bet paplašinātai analīzei trekus var atvērt citās programmās. "
+\nIerakstītie treki vēlāk var tikt izmantoti treka analīzei, koplietošanai ar draugiem vai OSM izstrādei. Atlēti var izmantot trekus, lai monitorētu treniņus. Pamata treku analīze var tikt veikta tieši caur OsmAnd kā piemēram, apļu laiki, vidējais ātrums utt., bet paplašinātai analīzei trekus var atvērt citās programmās.Ceļa ierakstshLaiks
@@ -1290,7 +1290,7 @@
Izvairīties no ceļiem…Vilciena maršrutiTramvaja maršruti
- "Kopīgot taksometru maršrutus"
+ Kopīgot taksometru maršrutusTrolejbusu maršrutiAutobusu maršrutiPaslēpt
@@ -1315,10 +1315,10 @@
Izlases vietas vārds tika pārdēvēts uz %1$s, lai varētu saglabāt kopu ar sejiņām failā.Printēt maršrutuŠāds vārds izlasē jau eksistē
- "Norādītais izlases vārds tika pārdēvēts uz %1$s lai izvairītos no dublēšanas."
+ "Izlases vārds tika nomainīts uz %1$s, lai izvairītos no dublikāta."Teksta lielums uz kartes.Teksta izmērs
- Ātruma robeža
+ Ātruma ierobežojumsRobežkontroleNodevu kabīneSTOP zīme
@@ -1529,7 +1529,9 @@
Daļa no jūsu ziedojuma tiks nosūtīta OSM lietotājiem, kas veic labojumus apgabala kartēAbonomenta iestatījumiLūdzu, vispirms nopērciet abonomentu OSM atjauninājumiem
- "Abonēšana nodrošina ik stundu karšu atjauninājumus no visas pasaules. Daļa no ienākumiem nonāk OSM kopienai par ieguldījumu OSM. Ja jums patīk OsmAnd un OSM un vēlaties tos atbalstīt, tad šis ir lielisks veids, kā to darīt."
+ Abonēšana nodrošina ik stundu karšu atjauninājumus no visas pasaules.
+\nDaļa ienākumu nonāk OSM kopienā un tiek izmaksāta par ieguldījumu OSM.
+\nJa jums patīk OsmAnd un OSM un vēlaties sniegt, kā arī saņemt atbalstu, šis ir lielisks veids, kā to izdarīt.Izvēlieties marķieriCiti marķieriAugšupielādēt anonīmi
@@ -1646,7 +1648,7 @@
Kontūrlīnijas ir deaktivizētasIzveidot jaunuIzvēlieties kategoriju
- Izvēlieties ātruma mērvienību
+ Izvēlieties ātruma mērvienību.Ātruma mērvienībasJūras jūdzeKilometri stundā
@@ -1721,7 +1723,7 @@
IzslēgtsKrāsas pēc infrastruktūras veidaKrāsas pēc OSMC simbola
- "Vai vēlaties izdzēst %1$d ierakstus?"
+ Vai vēlaties izdzēst %1$d ierakstus\?Slēpošanas trasesPārklājuma veidiIzvairīties no kāpnēm
@@ -1771,7 +1773,7 @@
Vai esiet pārliecināts?Izmaiņas netiks saglabātas. Vai turpināt?Ceļi
- "Lejupielādē - %1$d failu"
+ Lejupielādē - %1$d failuRādīt bezmaksas versijas banneriArī maksas versijā jūs varat redzēt bezmaksas versijas banneriLūdzu aktivizējiet jūras kartes spraudni
@@ -1857,7 +1859,7 @@ failu(s)?
Lūdzu, pievienojiet marķierus caur kartiNav atrasts neviens ceļa punktsPārskats
- "Lietotnei tika piešķirta atļauja rakstīt ārējā glabātuvē, tagad nepieciešams restartēt lietotni."
+ Lietotnei tika piešķirta atļauja rakstīt ārējā glabātuvē. Ir nepieciešams restartēt lietotni.Uz augšuUz lejuBeigt navigāciju
@@ -1925,7 +1927,7 @@ failu(s)?
Abonoments tiks apmaksāts automātiski katru mēnesi. Jūs varat atteikties no abonomenta Google Play jebkurā laikā.Ziedojums OpenStreetMap kopienaiDaļa no jūsu ziedojuma tiks OSM lietotājiem, kuri piedalās OpenStreetMaps kartes veidošanā. Abonomenta izmaksas paliek nemainīgas.
- "Abonoments iespējo ik stundu, dienu vai nedēļu atjauninājumus un neierobežotas lejupielādes visām pasaules kartēm."
+ Abonoments iespējo ik stundu, dienu vai nedēļu atjauninājumus un neierobežotas lejupielādes visām pasaules kartēm.SaņemtSaņemt par %1$sSaņemt neierobežotas karšu lejupielādes un atjauninājumus biežāk nekā reizi mēnesī: reizi stundā, dienā vai nedēļā.
@@ -2185,7 +2187,7 @@ Apraksta laukumu: %1$s x %2$sMeklēt IzlasēLai attēlotu reljefa griezumu kartē, ir nepieciešams lejupielādēt reljefa virsklāja karti šim reğionam.Lai attēlotu reljefa griezumu kartē, ir nepieciešams iegādāties un instalēt Kontūrlīniju spraudni
- "Lejupielādējiet \"Kontūrlīnijas\" karti šim reğionam."
+ Lejupielādējiet \"Kontūrlīnijas\" karti šim reğionam.SpraudnisLai redzētu kontūrlīnijas uz kartes, jums ir nepieciešams nopirkt un instalēt \"Kontūrlīniju\" spraudniKrāsu shēma
@@ -2213,17 +2215,17 @@ Apraksta laukumu: %1$s x %2$sRādīt/nerādīt OSM piezīmesAtļaut piekļūšanu privātajām teritorijām.Maršruta gaitā iespējot kartes pagriešanas animāciju no manas atrašanās vietas.
- Darbības pogas nospiešana ieslēdz vai izslēdz kartes auto mērogošanu pēc kustības ātruma.
+ Ieslēdz vai izslēdz automātisko tālummaiņu, atkarībā no kustības ātruma.Pievienot mērķiNomainīt mērķiPievienot pirmo starppunktuSpiežot šo darbības pogu, ekrāna centrs kļūst par galamērķi, bet iepriekš izvēlētais galamērķis par pēdējo starppunktu.
- "Spiežot šo darbības pogu, ekrāna centrs kļūst par jauno galamērķi, nomainot iepriekšējo (ja tāds bija)."
+ Poga ekrāna centra iestatīšanai par jauno galamērķi, nomainot iepriekšējo galamērķi (ja tāds bija).Spiežot šo darbības pogu, ekrāna centrs kļūst par pirmo starppunku maršrutā.Nav virsklājaNav apakšklājaKļūda
- "Pierakstieties epastu ziņojumiem par lietotnes atlaidēm un saņemiet 3 papildus lejupielādes kartēm!"
+ Pierakstieties ziņojumu sūtīšanai uz epastu par izdevīgiem lietotnes piedāvājumiem un saņemiet 3 papildus kartes lejupielādei!Kartes, kas satur jūras dziļuma kontūrlīnijas un punktus.Paldies par jūras dziļuma kontūrkaršu pirkumu!Jūras dziļuma kontūras
@@ -2475,7 +2477,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
Importēt failuIzvēlieties kā rādīt distanci un virzienu uz marķieriem kartē:Kartes orientācijas maiņa
- Izvēlieties zem kāda ātruma kartes orientācija pārslēgsies no \'kustības virzienā\' uz \'pēc kompasa\'.
+ Izvēlieties ātrumu, pie kura pārslēgsies kartes orientācija no \'kustības virzienā\' uz \'kompasa virzienā\'.Visi kartes marķieri ir pārvietoti uz vēsturiKartes marķieris ir pārvietots uz vēsturiKartes marķieris ir aktivizēts
@@ -2515,7 +2517,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
Ievadiet lietotājvārduSkatīt lietotāja bildesLietotājvārds
- "Filtrē bildes pēc iesūtītāja, datuma vai tipa. Filtri darbojas tikai tuvos mērogos."
+ Filtrē bildes pēc iesūtītāja, datuma vai tipa. Filtri darbojas tikai tuvos mērogos.Distance ir koriģētaTumši dzeltensCaurspīdīgs rozā
@@ -2555,7 +2557,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
ViensSpiežot darbības pogu, tiks pārslēgts dienas un nakts režīmsSmaiļošana pa upēm
- "Lūdzu veltiet 30 sekundes laika atsauksmēm un novērtējiet mūsu darbu Google Play."
+ Lūdzu veltiet 30 sekundes laika atsauksmēm un novērtējiet mūsu darbu Google Play.Privātuma politikaPalīdziet mums veidot OsmAnd labāku!OsmAnd lejupielādes serviss
@@ -2568,7 +2570,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
Mainīt noklusētā ātruma iestatījumusIestatīt min./maks. ātrumuJauns profils
- "Pēdējā OsmAnd palaišana beidzās ar avāriju. Palīdziet uzlabot OsmAnd, nosūtot kļūdas ziņojumu."
+ Pēdējā OsmAnd palaišana beidzās ar avāriju. Palīdziet uzlabot OsmAnd, nosūtot kļūdas ziņojumu.NLOSegwayMonoritenis
@@ -2586,7 +2588,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
Pamodināt pagriezienosIestatīt ekrāna pamošanās laiku.Lietot tuvuma sensoru
- "Novelciet ar roku pāri ekrāna augšmalai, lai ieslēgtu ekrānu navigācijas laikā."
+ pārvelkot roku pāri ierīcei, ekrāns ieslēgsies.Ziemas ceļiLedus ceļiZiemas un ledus ceļi
@@ -2610,8 +2612,9 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
Jūs pievienojāt %1$s punktus. Ievadiet faila vārdu un nospiediet \"Saglabāt\".Punkts %1$s izdzēstsPasaule
- Mēs nosūtīsim jūsu meklēšanas pieprasījumu: \"%1$s\", kā arī atrašanās vietas datus. \n
- \n" Personīgā informācija netiks iekļauta, šie dati tiks izmantoti vienīgi meklēšanas algoritma uzlabošanai. "
+ Mēs nosūtīsim jūsu meklēšanas pieprasījumu: \"%1$s\" kopā ar jūsu atrašanos vietu.
+\n
+\nPersonīgā informācija netiek iekļauta un iegūtie dati tiek izmantoti vienīgi meklēšanas pieredzes uzlabošanai.Sūtīt meklēšanas pieprasījumu\?Paldies par Jūsu atsauksmiVietu vai objektu nevar atrast.
@@ -2743,7 +2746,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
GrādiMiliradiāniAzimuts
- "Mainīt azimuta mērvienības."
+ Mainīt azimuta mērvienības.Nelietot tramvajusNelietot tramvajusNelietot autobusus
@@ -2817,7 +2820,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
Izvēlieties sākuma profiluBalstiet savu profilu uz vienu no noklusētajiem profiliem, kas definēs tādus pamata iestatījumus kā logrīku redzamību un attāluma vai ātruma mērvienības. Šie ir noklusētie lietotnes profili, kopā ar lietotāja veidotajiem profiliem tie var tikt paplašināti uz:Izvēlieties navigācijas veidu
- "Auto, kravas auto, motocikls"
+ Auto, kravas auto, motociklsMTB, mopēds, zirgsIešana kājām, pastaigas, skriešanaVisi sabiedriskie transporti
@@ -2986,8 +2989,8 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
DarītTikai WiFi tīklāLejupielādēt bildes
- "Rakstu bildes iespējams lejupielādēt arī bezsaistes lietošanai.
-\nIestatījums pieejams caur \"Pārlūkot\" → \"Iespējas\"."
+ Rakstu bildes iespējams lejupielādēt bezsaistes lietošanai.
+\nIestatījums pieejams caur \"Pārlūkot\" → \"Iespējas\".Tikai Wi-Fi tīklāIzvēlieties ceļojumu grāmatuCeļojumu grāmata
@@ -3045,12 +3048,12 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
Jūras navigācijas stils: bojas, bākas, upju ceļi, jūras līnijas un zīmes, tauvas joslas, pakalpojumi, dziļuma kontūras.Slēpošanas stils: rāda slēpošanas trases, pacēlājus un citus ar slēpošanu saistītus izcēlumus. Mazāk uzmanību novērsoši sekundārie objekti uz kartes.Vienkāršs un kontrastains stils auto navigācijai. Saudzējošs acīm nakts režīmā. Īpašības: kontūrlīnijas, kontrastējoši oranži ceļi, mazāk uzmanību novērsoši sekundārie objekti uz kartes.
- "Kontrastējošs stils pārgājieniem, trekingam un velo braukšanai brīvā dabā. Īpašības: kontrastējoši ceļi un dabas objekti, dažādi maršruti, kontūrlīnijas ar paplašinātiem iestatījumiem, vairāk detaļu mērogojot karti nekā noklusētajā stilā. Seguma integritātes opcija ļauj noteikt ceļa seguma kvalitāti. Nav nakts režīms."
+ Pārgājieniem, trekingam un velobraucieniem ārpus pilsētas. Vieglāk salasāms saulainā laikā, ar kontrastējošiem ceļiem un dabas objektiem, maršrutu tipiem, paplašinātiem iestatījumiem kontūrlīnijām, papildus detaļas. Ceļa seguma kvalitātes rādīšana. Bez nakts režīma.Vecāks \"Mapnik\" noklusētais stils. Īpašības: krāsu palete veidota \"Mapnik\" stilā.Vispārējas lietošanas stils. Vienkāršota caurskatāma renderēšana blīvi apdzīvotās vietās. Īpašības: kontūrlīnijas, maršruti, seguma kvalitāte, iebraukšanas ierobežojumi, ceļu numurācija, renderēšana pēc SAC skalas, ūdenssporta veidi.Palielināts detaļu daudzums tūristu vajadzībām. Iekļauj visas noklusētā stila konfigurēšanas opcijas, papildus: rāda pēc iespējas vairāk detaļu, īpaši ceļus, takas un pārējās iespējas pārvietoties. Vizuāli izceļ atšķirīgus ceļu veidus, līdzinoties tūristu kartēm. Augsta kontrasta krāsu palete lietošanai dienas un nakts režīmā.Grāmatzīme
- "Piemērots braukšanai bezceļa apstākļos, kā arī piemērots lietošanai kopā ar zaļās krāsas satelīta bildēm apakšklāja veidā. Īpašības: samazināts galveno ceļu biezums, palielināts taku, celiņu, veloceliņu u.c. maršrutu līniju biezums. Veidots \"Topo\" stilā."
+ Bezceļa braukšanai ar \'Topo\' stila karti un lietošanai kopā ar zaļajiem satelīta uzņēmumiem kā apakšklāju. Samazināts galvenu ceļu līniju biezums, izcelti treki, takas, velo celiņi u.c. maršruti.Starppunkta ierašanās laiksIerašanās laiksUzlabots kontrasts kājāmgājēju un velosipēdu celiņiem. Izmanto vecākas Mapnik krāsas.
@@ -3118,7 +3121,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
\n • Rāda azimutu iekš Mērīt Attālumu
\n
\n
- "• Lietotnes profili: veidojiet personisku profilu savām vajadzībām, izvēlieties ikonu un krāsu
+ • Lietotnes profili: veidojiet personisku profilu savām vajadzībām, izvēlieties ikonu un krāsu
\n
\n • Tagad mainiet katra profila noklusējumus un min/max ātrumus
\n
@@ -3138,7 +3141,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
\n
\n • Citi kļūdu labojumi
\n
-\n"
+\nVisi zemāk esošie iestatījumi attiecas tikai uz izvēlēto profilu.OsmAnd lieto UTM standarta formātu, kas ir līdzīgs, bet ne vienāds ar UTM NATO formātu.Piemērs
@@ -3269,7 +3272,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
AtjaunotRediģēt profilu sarakstuRediģēt profilus
- "OsmAnd pamata profilus nevar izdzēst, bet atspējot (no iepriekšējā ekrāna) vai pārkārtot uz leju."
+ OsmAnd pamata profilus nevar izdzēst, bet atspējot (uz iepriekšējā ekrāna) vai pārkārtot uz leju.Izvēlētais profilsNekas nav izvēlēts
\ No newline at end of file
diff --git a/OsmAnd/res/values-nb/phrases.xml b/OsmAnd/res/values-nb/phrases.xml
index 46c0e7a5e7..b7c1e63c18 100644
--- a/OsmAnd/res/values-nb/phrases.xml
+++ b/OsmAnd/res/values-nb/phrases.xml
@@ -1556,7 +1556,7 @@
RørNettverk for påfyll av drikkevannDrikkevannspåfylling: Nei
- Drikkevannspåfylling: Ja
+ JaVann-nivå: NedsenketHindringVann-nivå: Under vanlig vann-nivå
diff --git a/OsmAnd/res/values-nb/strings.xml b/OsmAnd/res/values-nb/strings.xml
index e52dad60d0..683e185d58 100644
--- a/OsmAnd/res/values-nb/strings.xml
+++ b/OsmAnd/res/values-nb/strings.xml
@@ -3705,14 +3705,12 @@
Velg en sporfil for åpning.Snu ruteOverskriv spor
- Hele sporet vil bli omregnet ved bruk av valgt profil.
- Velg hvordan punkter skal knyttes sammen, i rett linje, eller utregnet rute mellom dem med valgt profil.
- Kun neste segment vil bli omregnet ved bruk av valgt profil.
+ Hele sporet blir beregnet på nytt med den valgte profilen.
+ Velg hvordan punkter skal forbindes; med en rett linje, eller beregn en rute mellom dem som spesifisert nedenfor.
+ Kun det neste segmentet blir beregnet på nytt med den valgte profilen.Hele sporetNeste segment
- For å bruke dette valget må OsmAnd rute sporet ditt til kartveiene.
-\n
-\n På neste steg vil du måtte velge navigasjonsprofil for oppdagelse av tillatte veier, og terskeldistanse for å anslå sporet ditt til veier.
+ Deretter juster ditt spor til nærmeste tillatte vei med en av navigeringsprofilene for å bruke dette alternativet.Velg en sporfil å legge til det nye segmentet i.Lagre som nytt sporOpprett ny rute
@@ -3739,11 +3737,11 @@
Alle påfølgende segmenterAlle foregående segmenterForrige segment
- Kun valgt segment vil bli utregnet på ny i valgt profil.
- Alle påfølgende segmenter vil bli utregnet på ny i valgt profil.
- Alle tidligere segmenter vil bli utregnet på ny i valgt profil.
+ Kun det valgte segmentet blir beregnet på nytt med den valgte profilen.
+ Alle påfølgende segmenter blir beregnet på nytt med den valgte profilen.
+ Alle tidligere segmenter blir beregnet på nytt med den valgte profilen.Åpne lagret sporhar blitt lagretLegg til minst to punkter.
- Gjenta
+ Gjør om
\ 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 1182d20a65..4ce78f580e 100644
--- a/OsmAnd/res/values-pt-rBR/strings.xml
+++ b/OsmAnd/res/values-pt-rBR/strings.xml
@@ -1174,7 +1174,7 @@
O idioma selecionado não é suportado pelo mecanismo Android TTS (conversão de texto em fala) instalado; o idioma predefinido do TTS será usado. Procura outro mecanismo TTS no mercado\?Faltam dadosIr a loja para baixar o idioma selecionado\?
- Inverter direção GPX
+ Inverter direção da trilhaUsar destino atualPercorrer toda a trilhaMapa vetorial off-line presente para esse local.
@@ -3883,7 +3883,7 @@
Refazer"• Função de planejamento de rota atualizada: permite o uso de diferentes tipos de navegação por segmento e a inclusão de trilhas
\n
-\n • Novo menu de aparência para trilhas: selecione cor, espessura, setas de direção de exibição, ícones de início / término
+\n • Novo menu de aparência para trilhas: selecione cor, espessura, setas de direção de exibição, ícones de início / término
\n
\n • Melhor visibilidade dos nós da bicicleta.
\n
diff --git a/OsmAnd/res/values-pt/phrases.xml b/OsmAnd/res/values-pt/phrases.xml
index 0eb960c2f2..8d22b73dbe 100644
--- a/OsmAnd/res/values-pt/phrases.xml
+++ b/OsmAnd/res/values-pt/phrases.xml
@@ -3828,4 +3828,5 @@
Reabastecimento de água potávelPequenos aparelhos elétricosColmeia
+ Loja de nozes
\ No newline at end of file
diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml
index 49f1d72d9e..fe6c5d23b1 100644
--- a/OsmAnd/res/values-pt/strings.xml
+++ b/OsmAnd/res/values-pt/strings.xml
@@ -91,7 +91,7 @@
Reinicializar pesquisa de transporteVoz gravadaNenhum mapa vetorial foi carregado
- Caminho reverso
+ Inverter a direção do trilhoNenhum ficheiro GPX encontrado na pasta tracksNão foi possível ler os dados de GPX.Mapas vetoriais offline
diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml
index 211819502e..d77acfa3aa 100644
--- a/OsmAnd/res/values-ru/strings.xml
+++ b/OsmAnd/res/values-ru/strings.xml
@@ -66,15 +66,15 @@
Выберите улицув %1$sВведите адрес
- Введите город/населённый пункт/место
+ Город/место/районВведите почтовый индексБлижайшие городаВыберите городПоиск почтового индекса
- Записать аудио
- Записать видео
- Сделать фото
- Добавить заметку OSM
+ Аудиозаметка
+ Видеозаметка
+ Фотозаметка
+ OSM-заметкаФункции парковкиБлагодарим вас за покупку платной версии OsmAnd.Не показывать сообщения при запуске
@@ -99,13 +99,13 @@
Кнопка переключения автомасштабирования на основе скорости.Включение автомасштабаВыключение автомасштаба
- Добавить точку маршрута
+ Пункт назначенияЗаменить пункт назначения
- Добавить первую промежуточную точку
- Кнопка для установки центра экрана пунктом назначения маршрута, любой ранее выбранный пункт назначения станет последним промежуточным пунктом.
- Кнопка для установки центра экрана пунктом отправления. Затем будет предложено установить пункт назначения или запустить расчёт маршрута.
+ Первый промежуточный пункт
+ Установка центра экрана пунктом назначения; ранее выбранный пункт назначения станет последним промежуточным пунктом.
+ Кнопка для установки центра экрана пунктом отправления. Затем нужно будет выбрать пункт назначения или запустить расчёт маршрута.Кнопка для установки центра экрана пунктом назначения с заменой предыдущего (если был задан).
- Кнопка для установки центра экрана первой промежуточной точкой маршрута.
+ Установка центра экрана первой промежуточной точкой маршрута.Нет покрытияНет подложкиХолмистый
@@ -148,7 +148,7 @@
Переключатель, чтобы показать или скрыть избранные точки на карте.Переключатель, чтобы показать или скрыть POI на карте.Показать/скрыть избранные
- Добавить категорию
+ КатегорияДействияЕсли оставить это поле пустым, то оно будет автоматически заполнено адресом или названием места.Это сообщение будет добавлено в комментарий.
@@ -185,7 +185,7 @@
Старый поискПоказывать старый поискДобавить старый поиск в меню.
- Использовать автомагистрали
+ Разрешить автомагистралиРазрешает автомагистрали.Статьи Википедии рядомГород или регион
@@ -219,8 +219,8 @@
Тёмно-коричневыйЦветовая гамма горизонталейКачество дорожного покрытия
- Введите название города, адрес, POI
- Введите имя для нового фильтра. Вы сможете его найти в списке «Категории».
+ Город, адрес, POI
+ Введите имя для нового фильтра. Он добавится в список «Категории».Транслитерация если имя на %1$s отсутствуетТранслитерация названийРедактировать категории
@@ -233,7 +233,7 @@
Сохранить фильтрУдалить фильтрНовый фильтр
- Изменить положение
+ Изменить позициюТекущий путьНавигация OsmAnd LiveУровень заряда батареи
@@ -270,7 +270,7 @@
Адрес не определёнОколоМестоположение
- Редактировать POI
+ Изменить POIЗаметка OSM открыта сноваК заметке OSM добавлен комментарийЗаметка OSM создана
@@ -286,7 +286,7 @@
Удалённая OSM POIОтредактированная OSM POIСохранить локально
- Добавить заметку OSM
+ OSM-заметкаЦвет трека GPXТолщина трека GPXСкопировано в буфер обмена
@@ -309,16 +309,16 @@
Формат вывода видеоИспользовать системное приложение для записи видео.Использовать системную программу
- Установка настроек аудио и видео.
+ Параметры записи звука и видео.Ошибка записиКамера недоступна
- Аудио/видео записывается. Для остановки нажмите виждет AV.
+ Идёт запись медиа. Для остановки нажмите на виджет AV.Проигрывается аудио.\n%1$sОткрыть внешний проигрывательУдалить эту запись?недоступно
- Записать аудио
- Записать видео
+ Аудиозаметка
+ ВидеозаметкаСлой аудиозаписейЗапись не может быть воспроизведена.Удалить запись
@@ -330,8 +330,8 @@
Измерение расстоянийНажмите «Использовать местоположение…» чтобы добавить заметку к данному местоположению.Аудиозаметки
- Делайте аудио/фото/видеозаметки во время поездки, используя либо кнопку на карте, либо контекстное меню местоположения.
- Аудио/видеозаметки
+ Создавайте аудио-, видео- и фотозаметки в поездке, используя виджет или контекстное меню.
+ МедиазаметкичастейЛинии высотКонтурные линии
@@ -368,10 +368,10 @@
Использовать онлайн-карты (загрузка и кеширование на SD-карте).Онлайн-картыВыберите источник онлайн или кешированных растровых карт.
- Получение доступа ко множеству видов онлайн-карт (тайловых или растровых): от предопределённых тайловых OSM (как Mapnik), до спутниковых снимков и слоёв специального назначения, таких как карты погоды, климатические карты, геологические карты, слои затемнения высот и т. д.
-\n
-\n Любая из этих карт может быть использована в качестве основной (базовой) карты для отображения или в виде наложения или подложки к другой базовой карте (например стандартной локальной карте OsmAnd). Некоторые элементы векторной карты OsmAnd могут быть по желанию скрыты через меню «Настройки карты».
-\n
+ Доступ ко множеству онлайн-карт (т. н. тайловых или растровых): от встроенных OSM (как Mapnik), до спутниковых снимков и слоёв специального назначения, таких как карты погоды, климатические, геологические карты, затенения рельефа и др.
+\n
+\n Любая из этих карт может быть использована в качестве базовой либо как наложение или подложка к другой базовой карте (например стандартной локальной карте OsmAnd). Некоторые элементы векторной карты OsmAnd можно скрыть в меню «Настройки карты».
+\n
\n Карты можно загрузить непосредственно из интернета или подготовить для использования в автономном режиме (и вручную скопировать в папку данных OsmAnd) в виде базы данных sqlite, которая может быть создана с помощью различных инструментов подготовки карт сторонних производителей.Показывает настройки для включения фонового отслеживания и навигации путём периодического пробуждения устройства GPS (с выключенным экраном).Добавляет поддержку специальных возможностей устройства непосредственно в OsmAnd. Это облегчает, например, регулировку скорости речи для синтезированного голоса, настройку направленности экрана навигации, управление масштабом при помощи трекбола или использование голосовых команд обратной связи для автоматической аннотации вашего местоположения.
@@ -466,7 +466,7 @@
НеопределённоТекущий центр картыНачало:
- Искать рядом
+ Поиск рядомМаршрут успешно сохранён в «%1$s».Имя файла: Файл с таким именем уже существует.
@@ -515,7 +515,7 @@
Выбранный язык не поддерживается установленным движком Android TTS (text-to-speech или текст-в-речь), вместо него будет использоваться предустановленный язык TTS. Посмотреть в Google Play другой TTS\?Данные отсутствуютПерейти в маркет для загрузки выбранного языка?
- Обратное направление GPX
+ Обратное направление трекаИспользовать текущий пункт назначенияПройти весь путьДля этого региона доступны локальные векторные карты.
@@ -563,7 +563,7 @@
Координаты: %1$s\n%2$sЧтобы увидеть местоположение, перейдите по ссылке %1$s или Android-ссылке %2$sОтправить местоположение
- Поделиться местоположением
+ Отправка геопозицииПутевая точка GPX «{0}» добавленаДобавить точку в записанный трекАдминистративное
@@ -657,7 +657,7 @@
фильтроватьДисплей высокого разрешенияНе растягивать (с размытием) растровые карты на дисплеях высокого разрешения.
- Искать общественный транспорт
+ Поиск транспортаИскать транспорт на остановкеРезультат поиска транспорта (нет пункта назначения):Результат поиска транспорта (до пункта {0}):
@@ -691,7 +691,7 @@
POI…Источник картыСлои
- Искать POI
+ Поиск POIИспользовать трекбол для перемещения по карте.Использовать трекболУстанавливает максимально допустимое время ожидания для каждого фонового фиксирования местоположения.
@@ -738,7 +738,7 @@
Загрузить детальные карты регионовПоиск сигнала…Искать вокруг текущего центра карты
- Искать рядом
+ Поиск рядомПо умолчаниюПортретЛандшафт
@@ -768,7 +768,7 @@
В данной области нет локальных POIУвеличение масштаба позволяет обновить POIОбновить POI
- Вы хотите обновить локальные данные из интернета\?
+ Обновить локальные данные из интернета\?Город: {0}Улица: {0}, {1}Пересечение улиц: {0} x {1} в {2}
@@ -901,14 +901,14 @@
ДомПересечение улицОбновить карту
- Добавить POI
+ Создать POIДаОтменаНетНазвание точкиИзбраннаяТочка «{0}» была успешно добавлена к избранным.
- Редактировать место
+ ИзменитьУдалить из моихУдалить точку «%s» из избранных\?Точка {0} удалена.
@@ -1051,8 +1051,8 @@
Запись места и времени парковки вашего авто.
\nИ место, и время отображаются на панели управления или как виджет на карте. Можно добавить напоминание в календаре Android.Место парковки
- Отметить парковку
- Удалить метку места парковки
+ Место парковки
+ Удалить парковкуТочка отправления слишком далеко от ближайшей дороги.Общие местаСкорость моделирования маршрута:
@@ -1164,7 +1164,7 @@
Привязка к дорогеПромежуточный пункт %1$s слишком далеко от ближайшей дороги.Достигнут промежуточный пункт
- Добавить промежуточный пункт
+ Промежуточный пунктПромежуточный пунктКонец маршрута слишком далеко от ближайшей дороги.Добавить тег
@@ -1176,8 +1176,8 @@
ЖильёРестораныДостопримечательности
- Добавить последним промежуточным пунктом
- Добавить первым промежуточным пунктом
+ Последний промежуточный пункт
+ Первый промежуточный пунктДобавить последним промежуточным пунктомДобавить первым промежуточным пунктомЗаменить пункт назначения
@@ -1203,13 +1203,13 @@
ПросмотрСделать фотоСделать фото
- Синхронизация треков и видео/аудиозаметок с вашим аккаунтом Dropbox.
+ Синхронизация треков и медиазаметок с вашим аккаунтом Dropbox.Плагин DropboxПлагин обеспечивает наложение контурных линии и (рельефа) затемняющего слоя, которые будут отображаться поверх стандартных карт OsmAnd. Эта функция высоко оценится спортсменами, туристами, путешественниками и всеми, кто заинтересован в рельефной структуре ландшафта.
\n
\nГлобальные данные (между 70° на севере и 70° на юге) основываются на измерениях SRTM (Shuttle Radar Topography Mission) и ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), инструментом визуализации Terra, флагманского спутника Земли системы наблюдения NASA. ASTER является результатом совместных усилий NASA, министерства экономики Японии, торговли и промышленности (METI), космических систем Японии (J-spacesystems).Фото %1$s %2$s
- Аудио/видеоданные
+ МедиаданныеОстановить навигацию\?Вы уверены, что хотите удалить пункт назначения (и промежуточные пункты)?Точный маршрут (альфа)
@@ -1281,7 +1281,7 @@
Контурные линииЗагрузка…Создание маршрутов по нажатию на карте, а также использование или изменение существующих файлов GPX, планирование поездки и измерение расстояния между точками. Результаты могут быть сохранены в виде файла GPX, который впоследствии может быть использован для навигации.
- Сделать пунктом назначения
+ Пункт назначенияСначала установите город или улицуПункт назначения %1$sТип фокусировки камеры
@@ -1317,8 +1317,8 @@
СШАЕвропа, Азия, Латинская Америка и тому подобноеВеликобритания, Индия и др.
- Проложить маршрут
- Пункт отправления
+ Маршрут до этой точки
+ Маршрут от этой точкиКанадаВерсия:Время действия (в минутах): %1$s
@@ -1460,7 +1460,7 @@
Мировые пункты обмена bitcoinднейСоединение
- Сохранить данные как трек файл или импортировать путевые точки в избранные\?
+ Сохранить данные как файл трека или импортировать путевые точки в избранные\?РозовыйКоричневыйПустой файл GPX
@@ -1739,7 +1739,7 @@
Отменить выбор всехПоделитьсяМои места
- Избранные
+ ТочкиТрекиТекущий трекПоделиться заметкой
@@ -1766,7 +1766,7 @@
Посетить доТуристическая картапросрочено
- Укажите время задержки на экране планирования маршрута.
+ Укажите время ожидания на экране планирования маршрута.Начать пошаговое ведение через…ПоехалиРасширяет возможности OsmAnd, делая доступными морские карты для катания на лодках, парусного спорта и других видов спорта.
@@ -2005,7 +2005,7 @@
Как загрузить карты, установить основные настройки.Настройки навигации.Планирование поездки
- Введите название страны
+ СтранаНовая версияПервые шаги с OsmAndВозможности
@@ -2027,7 +2027,7 @@
Кнопка меню открывает панель управления, а не менюДоступ с картыУдалить путевую точку GPX\?
- Редактировать путевую точку GPX
+ Изменить путевую точку GPXБез лестницИзбегать ступеней и лестницБез пересечений границ
@@ -2137,7 +2137,7 @@
Исключить из маршрутаПубличное имяПоддерживаемый регион
- Пожалуйста, введите публичное имя
+ Введите публичное имяПредлагается выбрать, прежде всего, управление приложением через гибкую панель управления или статическое меню. Ваш выбор всегда может быть изменён в настройках панели управления.ПросмотрДобавьте маркеры на карте
@@ -2185,7 +2185,7 @@
Поиск по координатамРасширенный поиск по координатамВернуться в поиск
- Удалить выбранные элементы из «Истории»\?
+ Удалить выбранные элементы из истории\?Показать %1$s на картеИскать за %1$s от местоположения поделились через OsmAnd
@@ -2257,15 +2257,15 @@
Китайский (Гонконг)Быстрое действиеДействие %d
- Добавить маркер
- Добавить POI
+ Маркер
+ POIИзменить стиль картыСтиль карты изменён на «%s».
- Добавить место парковки
+ Место парковкиДобавить действиеРедактировать действие
- Добавить в избранные
- Добавить действие
+ В избранные
+ ДобавитьУдалить действиеВы уверены, что хотите удалить действие «%s»\?Показать избранные
@@ -2384,7 +2384,7 @@
Экспорт маркеров в следующий файл GPX:МаркерыИзменить заметку
- Изменить заметку OSM
+ Править OSM-заметкуДобавить пункт отправления в качестве пункта назначения.Сделать маршрут круговымИспользовать местоположение
@@ -2403,20 +2403,20 @@
ДорогаПоказывать направляющие линииТёмно-жёлтый
- OsmAnd — это активно развивающийся проект с открытым исходным кодом. Благодаря открытости каждый может внести свой вклад в приложение сообщая об ошибках, улучшая перевод или кодируя новые функции. Проект находится в оживлённом состоянии непрерывного совершенствования всеми этими формами взаимодействия разработчиков и пользователей. Прогресс проекта также зависит от денежных взносов для финансирования написания и тестирования новых функций.
-\n Примерная карта покрытия и качество:
-\n • Западная Европа: ****
-\n • Восточная Европа: ***
-\n • Россия: ***
-\n • Северная Америка: ***
-\n • Южная Америка: **
-\n • Азия **
-\n • Япония и Корея: ***
-\n • Ближний Восток: **
-\n • Африка: **
-\n • Антарктида:
-\n Большинство стран по всему миру доступны для скачивания!
-\n Получите надёжный навигатор в вашей стране — будь то Франция, Германия, Мексика, Великобритания, Испания, Нидерланды, США, Россия, Бразилия или любая другая.
+ OsmAnd — это активно развивающийся проект с открытым исходным кодом. Благодаря открытости, каждый может внести свой вклад в приложение, сообщая об ошибках, совершенствуя перевод или разрабатывая новые возможности. Кроме того, проект финансируется за счет денежных взносов с целью разработки и тестирования новых функций.
+\nПримерное покрытие и качество карт:
+\n • Западная Европа: ****
+\n • Восточная Европа: ***
+\n • Россия: ***
+\n • Северная Америка: ***
+\n • Южная Америка: **
+\n • Азия **
+\n • Япония и Корея: ***
+\n • Ближний Восток: **
+\n • Африка: **
+\n • Антарктида:
+\nДля скачивания доступно большинство стран мира!
+\n Получите надежный навигатор в своей стране — будь то Франция, Германия, Мексика, Великобритания, Испания, Нидерланды, США, Россия, Бразилия или любая другая.Примерная карта покрытия и качество:
\n • Западная Европа: ****
\n • Восточная Европа: ***
@@ -2433,15 +2433,15 @@
\nВременной буфер для онлайн-слеженияУкажите временной буфер для хранения местоположений при отсутствии подключения к сети
- Кнопка для добавления маркера карты в центр экрана.
- Кнопка для добавления путевой точки GPX в центре экрана.
+ Добавление в центре экрана маркера на карту.
+ Добавление в центре экрана путевой точки GPX.Кнопка для добавления аудиозаметки в центре экрана.Кнопка для добавления видеозаметки в центре экрана.Кнопка для добавления фотозаметки в центре экрана.
- Кнопка для добавления заметки OSM в центре экрана.
- Кнопка для добавления POI в центре экрана.
+ Добавление в центре экрана OSM-заметки.
+ Добавление POI в центре экрана.Переключатель, чтобы включить или выключить голосовые подсказки во время навигации.
- Кнопка для добавления парковочного места в центре экрана.
+ Добавление в центре экрана места парковки.Показывать промежуточный диалогФотографии Mapillary доступны только онлайн.Неправильный формат
@@ -2577,7 +2577,7 @@
" сохранено в "ПовторитьДобавить точки маршрута
- Добавить путевую точку
+ Путевая точкаДобавить линиюСохранить путевую точку GPXСохранить точку маршрута
@@ -2624,7 +2624,7 @@
Нажатие на маркер на карте переместит его на первое место в списке активных маркеров, не открывая контекстное меню.Активация одним нажатиемДелайте заметки!
- Добавьте аудио-, видео- или фотозаметку в любую точку на карте, используя виджет или контекстное меню.
+ Добавьте аудио-, видео- или фотозаметки в любую точку на карте, используя виджет или контекстное меню.Заметки по датеПо датеПо типу
@@ -2758,7 +2758,7 @@
Скачайте путеводители Викигида для просмотра статей о местах по всему миру без подключения к интернету.Доступно обновлениеСкачать файл
- Свободный всемирный путеводитель, который может редактировать каждый.
+ Бесплатный путеводитель по всему миру, который может редактировать каждый.В настоящее время путеводители основаны на Викигиде. Проверьте бесплатно все функции во время открытого бета-тестирования. Впоследствии путеводители будут доступны подписчикам OsmAnd Unlimited и владельцам OsmAnd+.Вы можете изменять любую статью Викигида, более того, ваше участие в нашем проекте всячески приветствуется! Делитесь знаниями, опытом, талантами и своим вниманием.Начать редактирование
@@ -2861,7 +2861,7 @@
Оставить пройденные маркеры на картеБольше транспорта доступно от этой остановки.Удалить маркер «%s»\?
- Редактировать маркер
+ ИзменитьСтороннее приложениеПлан и ценыЕжемесячно
@@ -3061,7 +3061,7 @@
Нет, спасибоРазрешитьИмя профиля
- Тип навигации
+ Режим навигацииТаксиМетроЛошадь
@@ -3071,8 +3071,8 @@
ЛыжиТип: %sБазовый профиль
- Выберите тип навигации
- Выберите тип навигации для нового профиля
+ Выберите режим навигации
+ Выберите режим навигации для нового профиляВведите имя профиляСначала необходимо указать имя профиля.Уже есть профиль с таким именем
@@ -3087,7 +3087,7 @@
Вы действительно хотите удалить профиль «%s»Выберите профиль для началаОсновывайте свой пользовательский профиль на одном из профилей приложения по умолчанию, это определяет базовые настройки, такие как видимость виджетов по умолчанию и выбор единиц измерения скорости и расстояния. Ниже перечислены профили приложений по умолчанию, а также примеры пользовательских профилей, на которые они могут быть расширены:
- Выберите тип навигации
+ Выберите режим навигацииАвтомобиль, грузовик, мотоциклГорный велосипед, мопед, лошадьПрогулки, пеший туризм, бег
@@ -3231,14 +3231,14 @@
Включить экранКарта во время навигацииКарта во время навигации
- Вес, высота, длина, скорость
- Параметры автомобиля
+ Скорость движения, размеры, масса транспортного средства
+ Физические параметрыГолосовые оповещения происходят только во время навигации.Навигационные инструкции и объявленияГолосовые подсказкиЭкранные оповещенияНастройка параметров маршрута
- Параметры маршрута
+ МаршрутизацияБуфер LogcatНастройки плагиновЯзык и вывод
@@ -3349,7 +3349,7 @@
Выберите цветВы не можете удалить стандартные профили OsmAnd, но вы можете отключить их на предыдущем экране или переместить вниз.Редактировать профили
- «Тип навигации» определяет способ расчета маршрутов.
+ Режим навигации определяет правила расчета маршрутов.Внешний вид профиляЗначок, цвет и имяРедактировать список профилей
@@ -3687,7 +3687,7 @@
\n • Исправлены ошибки для языков, пишущихся справа налево
\n
\n
- Доступ к этим действиям можно получить, нажав кнопку «%1$s».
+ Функции, доступные при нажатии кнопки «%1$s».Скрыть общественный транспортПоказать общественный транспортПоказать/скрыть общественный транспорт
@@ -3803,7 +3803,7 @@
Добавить к трекуУстановите рабочие дни, чтобы продолжитьМаршрут между точками
- План маршрута
+ Составить маршрутВыберите нужный вариант разбиения: по времени или по расстоянию.Интервал между метками расстояния или времени на треке.Своё
@@ -3828,13 +3828,11 @@
Профиль будет применён только к следующему сегменту.Следующий сегментВесь трек
- Для использования данной возможности OsmAnd необходимо привязать ваш трек по дорогам.
-\n
-\nНа следующем шаге необходимо выбрать профиль навигации для определения разрешенных дорог и пороговое расстояние, чтобы приблизительно привязать маршрут к дорогам.
+ Далее необходимо выбрать профиль навигации для определения порогового расстояния и привязки маршрута к ближайшей разрешённой дороге.Выберите способ соединения точек прямой линией или рассчитайте маршрут между ними, как указано ниже.При обратном направлении
- Все изменения будут утеряны. Закрыть план маршрута\?
- Съёмка уличного уровня
+ Все изменения будут утеряны.
+ Уличная фотосъёмкаСохранить как новый файл трекаДобавить в файл трекаТреки
@@ -3845,8 +3843,8 @@
Маршрут трекаДобавить файлы трековИмпортируйте или запишите файлы треков
- Добавить точку
- Добавить точку к треку
+ Путевая точка
+ Путевая точкаЗапись поездкиСохранить как файл трекаСледовать по маршруту
@@ -3870,7 +3868,7 @@
Будет сохранена только линия маршрута, путевые точки будут удалены.Имя файлаВыбрано файлов треков: %s
- Укажите интервал общей записи трека (включается через виджет «Запись GPX» на карте).
+ Укажите интервал общей записи трека (включается через виджет «Запись поездки» на карте).Остановить записьВозобновить запись поездкиПо выбору системы
@@ -3885,9 +3883,9 @@
сохраненДобавьте хотя бы две точки.ПОВТОРИТЬ
- • Обновленный режим планирования маршрута позволяет использовать разные типы навигации для каждого сегмента и прикрепляет любой трек к дорогам
+ • Обновлённый режим планирования маршрута позволяет использовать разные типы навигации для каждого сегмента и прикрепляет любой трек к дорогам
\n
-\n • Новые параметры внешнего вида для треков: выберите цвет, толщину, включите стрелки направления и отметки начала/окончания
+\n • Новые параметры внешнего вида для треков: можно выбрать цвет, толщину, включите стрелки направления и отметки начала/окончания
\n
\n • Улучшена видимость велосипедных узлов
\n
diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml
index 454bf3203b..379b112de9 100644
--- a/OsmAnd/res/values-sk/strings.xml
+++ b/OsmAnd/res/values-sk/strings.xml
@@ -281,7 +281,7 @@
Zvolený jazyk nie je podporovaný nainštalovaným TTS (text-to-speech) modulom v Androide. Bude použitý jeho prednastavený TTS jazyk. Nájsť iný TTS modul v obchode\?Chýbajúce údajePrejsť do obchodu pre stiahnutie zvoleného jazyka?
- Obrátiť GPX smerovanie
+ Obrátiť smer stopyPoužiť aktuálny cieľový bodPrejsť pozdĺž celej trasyPre túto oblasť je dostupná offline vektorová mapa.
diff --git a/OsmAnd/res/values-tr/phrases.xml b/OsmAnd/res/values-tr/phrases.xml
index b4f98a709f..76b5305843 100644
--- a/OsmAnd/res/values-tr/phrases.xml
+++ b/OsmAnd/res/values-tr/phrases.xml
@@ -2364,7 +2364,7 @@
MegalitBasınçİçme suyu doldurma: hayır
- İçme suyu doldurma: evet
+ Evetİçme suyu doldurma şebekesiMalzeme: kompozitMalzeme: mermer
@@ -2398,4 +2398,22 @@
Mobilet: evetMobiletŞehir
+ Petroglif
+ Nekropol
+ Yuvarlak kulübe kalıntısı
+ Yerleşim yeri
+ İstihkam
+ Küçük elektrikli aletler
+ Kalkış bilgileri panosu
+ İçme suyu doldurma
+ İstihkam türü: dairesel hendek
+ İstihkam türü: küçük set
+ İstihkam türü: limes
+ İstihkam türü: tepe kalesi
+ Megalit türü: geçit mezar
+ Megalit türü: taş çember
+ Megalit türü: nuraghe
+ Megalit türü: dolmen
+ Megalit türü: menhir
+ Toprak işi
\ No newline at end of file
diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml
index 1498c8591c..9713a69b10 100644
--- a/OsmAnd/res/values-tr/strings.xml
+++ b/OsmAnd/res/values-tr/strings.xml
@@ -937,7 +937,7 @@
Düşük yakınlaştırma seviyelerinde tüm dünyayı kapsayan bir genel bakış elde etmek için ana dünya haritasını indirin.%1$s\'a öğe yokSeçilen dil yüklü Android TTS (metinden konuşmaya) motoru tarafından desteklenmemektedir, bunun yerine önceden ayarlanmış TTS dili kullanılacak. Mağazada başka bir TTS motoru aramak ister misiniz\?
- GPX yönünü tersine çevir
+ İzlenen yol yönünü tersine çevirBu konum için çevrim dışı vektör haritası.
\n\t
\n\tKullanmak için \'Menü\' → \'Harita Katmanları\' → \'Harita Kaynağı…\' → \'Çevrim dışı vektör haritalar\'.
@@ -1440,7 +1440,7 @@
Değişiklik listesi kapatılıyor…Düğüm işleniyor …Yerel/İngilizce isimler dönüştürülüyor…
- Son Osmand çalıştırmak çöktü. Log dosya {0} olduğunu. Sorunu bildirmek ve günlük dosyasını ekleyiniz.
+ Son OsmAnd çalıştırması çöktü. Günlük kaydı dosyası {0} konumunda. Lütfen sorunu bildirin ve günlük kaydı dosyasını ekleyin.OSM gönderimleri için gereken OpenStreetMap.org (OSM) ayarlarını belirtin.Sayfaya kiremitÇalışma saatleri biçimi değiştirilemez.
@@ -3827,4 +3827,36 @@
Sadece seçili bölüm, seçilen profil kullanılarak yeniden hesaplanacaktır.Sonraki tüm bölümler, seçilen profil kullanılarak yeniden hesaplanacaktır.Önceki tüm bölümler, seçilen profil kullanılarak yeniden hesaplanacaktır.
+ Yol güzergahı
+ Yolu takip et
+ Takip edilecek yol dosyasını seçin
+ Takip etmek için yol dosyasını seçin veya cihazınızdan içe aktarın.
+ Başka bir yol seç
+ Konumumdan yola git
+ Gezinilecek yolun noktası
+ İzlenen yolun başlangıcı
+ Yollara ekle
+ Öncesinde kırp
+ Sonrasında kırp
+ Öncesinde güzergah türünü değiştir
+ Sonrasında güzergah türünü değiştir
+ Basitleştirilmiş yol
+ • Güzergah planlama işlevi güncellendi: her bölüm için farklı navigasyon türlerinin kullanılmasına ve izlenen yolların dahil edilmesine izin veriliyor
+\n
+\n • İzlenen yollar için yeni görünüm menüsü: renk ve kalınlık seçimi, yön oklarının gösterilmesi, başlangıç/bitiş simgeleri
+\n
+\n • Bisiklet düğümlerinin görünürlüğü iyileştirildi.
+\n
+\n • İzlenen yollar artık dokunulabilir, temel bilgiler bulunan içerik menüsüne sahip.
+\n
+\n • Arama algoritmaları iyileştirildi
+\n
+\n • Navigasyonda yol izleme seçenekleri iyileştirildi
+\n
+\n • Profil ayarlarının içe/dışa aktarımıyla ilgili sorunlar düzeltildi
+\n
+\n
+ Son değiştirme
+ İsim: Z – A
+ İsim: A – Z
\ No newline at end of file
diff --git a/OsmAnd/res/values-uk/phrases.xml b/OsmAnd/res/values-uk/phrases.xml
index 79fb238aee..4375b43720 100644
--- a/OsmAnd/res/values-uk/phrases.xml
+++ b/OsmAnd/res/values-uk/phrases.xml
@@ -793,7 +793,7 @@
Релігійне землекористуванняПридорожній хрестПридорожня святиня
- Інформація
+ ВідомостіГодинникТурагентствоМісце з хорошим видом
diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml
index 678d5dfc72..367b37541e 100644
--- a/OsmAnd/res/values-uk/strings.xml
+++ b/OsmAnd/res/values-uk/strings.xml
@@ -257,7 +257,7 @@
Новий пошукВиберіть розмір шрифту для позначень на мапі:Розмір тексту
- Налагоджувальні відомості про відмалювання
+ Відомості для зневадження про відмальовуванняВідображає плідність відмалювання.Розпаковуються нові дані…Вибрано мережеву службу навігації, але ви не підключені до Інтернету.
@@ -265,7 +265,7 @@
Вибрана мова не підтримується встановленим двигуном Android TTS (текстовим мовленням), замість цього буде використана його попередньо налаштована мова TTS. Шукаєте інший двигун TTS\?Дані відсутніПерейти в магазин для завантаження обраної мови?
- Зворотній напрямок GPX
+ Зворотний напрямок трекуВикористовувати поточний пункт призначенняПройдіть по усьому трекуДля цього регіону доступні автономні векторні мапи
@@ -1031,7 +1031,7 @@
Очистити проміжні точкиВи вже задали проміжні точки.Маршрут до
- Напрямки від
+ Напрямок відДо:Оголошувати…Налаштувати оголошення назв вулиць, дорожніх обмежень (вимушені зупинки, долішні (лежачі) поліцейські), попередження про камери контролю швидкості, обмеження швидкості.
@@ -1687,7 +1687,7 @@
Запис подорожіНавігаціяПрацює у фоновому режимі
- Відомості по закладці
+ Відомості про закладкиЗупинити симуляцію Вашої позиції.Пошук адресиМісця
@@ -3846,7 +3846,7 @@
Додати шляхову точку трекуЗаписування подорожіЗберегти як файл треку
- Стежити за треком
+ Навігація за трекомВиберіть файл треку для переглядуВиберіть файл треку для перегляду або імпортуйте його з пристрою.Обрати інший трек
@@ -3887,7 +3887,7 @@
\n
\n• Покращено оглядовість велосипедних вузлів
\n
-\n• На треки тепер можна натискати, є контекстне меню з основною інформацією.
+\n• На треки тепер можна натискати, є контекстне меню з основними подробицями.
\n
\n• Вдосконалено алгоритми пошуку
\n
diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml
index 33b644b362..c55a555aff 100644
--- a/OsmAnd/res/values-zh-rTW/strings.xml
+++ b/OsmAnd/res/values-zh-rTW/strings.xml
@@ -429,7 +429,7 @@
選定的語言未被已安裝的 Android TTS(文字轉語音)引擎支援,其將會使用預先設定的 TTS 語言。要在市集中尋找其他 TTS 引擎嗎?資料遺失要轉到商店下載所選擇的語言嗎?
- 反轉 GPX 方向
+ 反轉軌跡方向使用目前的目的地沿著整條軌跡往前此位置目前有向量地圖可以使用。
diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index c497ffda36..14e08c0176 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -11,6 +11,9 @@
Thx - Hardy
-->
+ Name: A – Z
+ Name: Z – A
+ Last modified
• Updated "Plan a route" function: allows using different navigation types per segment and the inclusion of tracks\n\n
• New "Appearance" menu for tracks: select color, thickness, display direction arrows, start/finish icons\n\n
diff --git a/OsmAnd/res/values/styles.xml b/OsmAnd/res/values/styles.xml
index e52dbdfd56..ea305b19d2 100644
--- a/OsmAnd/res/values/styles.xml
+++ b/OsmAnd/res/values/styles.xml
@@ -355,12 +355,12 @@
-
-
diff --git a/OsmAnd/src/net/osmand/AndroidUtils.java b/OsmAnd/src/net/osmand/AndroidUtils.java
index 3dea16fb15..740c826ab5 100644
--- a/OsmAnd/src/net/osmand/AndroidUtils.java
+++ b/OsmAnd/src/net/osmand/AndroidUtils.java
@@ -55,6 +55,7 @@ import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
@@ -162,6 +163,10 @@ public class AndroidUtils {
return src;
}
+ public static String addColon(OsmandApplication app, @StringRes int stringRes) {
+ return app.getString(R.string.ltr_or_rtl_combine_via_colon, app.getString(stringRes), "").trim();
+ }
+
public static Uri getUriForFile(Context context, File file) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
return Uri.fromFile(file);
diff --git a/OsmAnd/src/net/osmand/FileUtils.java b/OsmAnd/src/net/osmand/FileUtils.java
index 59fb36c88d..426c5c10c2 100644
--- a/OsmAnd/src/net/osmand/FileUtils.java
+++ b/OsmAnd/src/net/osmand/FileUtils.java
@@ -9,6 +9,7 @@ import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import net.osmand.plus.GpxSelectionHelper;
@@ -19,6 +20,7 @@ import net.osmand.plus.SQLiteTileSource;
import net.osmand.util.Algorithms;
import java.io.File;
+import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.regex.Pattern;
@@ -121,33 +123,54 @@ public class FileUtils {
return null;
}
- public static File renameGpxFile(OsmandApplication ctx, File source, String newName, boolean dirAllowed,
- RenameCallback callback) {
- File dest = checkRenamePossibility(ctx, source, newName, dirAllowed);
+ public static File renameGpxFile(@NonNull OsmandApplication app, @NonNull File source,
+ @NonNull String newName, boolean dirAllowed, @Nullable RenameCallback callback) {
+ File dest = checkRenamePossibility(app, source, newName, dirAllowed);
if (dest == null) {
return null;
}
+ File res = renameGpxFile(app, source, dest);
+ if (res != null) {
+ if (callback != null) {
+ callback.renamedTo(res);
+ }
+ } else {
+ Toast.makeText(app, R.string.file_can_not_be_renamed, Toast.LENGTH_LONG).show();
+ }
+ return res;
+ }
+
+ public static File renameGpxFile(@NonNull OsmandApplication app, @NonNull File src, @NonNull File dest) {
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
- if (source.renameTo(dest)) {
- GpxSelectionHelper helper = ctx.getSelectedGpxHelper();
- SelectedGpxFile selected = helper.getSelectedFileByPath(source.getAbsolutePath());
- ctx.getGpxDbHelper().rename(source, dest);
+ if (src.renameTo(dest)) {
+ GpxSelectionHelper helper = app.getSelectedGpxHelper();
+ SelectedGpxFile selected = helper.getSelectedFileByPath(src.getAbsolutePath());
+ app.getGpxDbHelper().rename(src, dest);
if (selected != null && selected.getGpxFile() != null) {
selected.getGpxFile().path = dest.getAbsolutePath();
helper.updateSelectedGpxFile(selected);
}
- if (callback != null) {
- callback.renamedTo(dest);
- }
return dest;
- } else {
- Toast.makeText(ctx, R.string.file_can_not_be_renamed, Toast.LENGTH_LONG).show();
}
return null;
}
+ public static boolean removeGpxFile(@NonNull OsmandApplication app, @NonNull File file) {
+ if (file.exists()) {
+ GpxSelectionHelper helper = app.getSelectedGpxHelper();
+ SelectedGpxFile selected = helper.getSelectedFileByPath(file.getAbsolutePath());
+ file.delete();
+ app.getGpxDbHelper().remove(file);
+ if (selected != null && selected.getGpxFile() != null) {
+ helper.selectGpxFile(selected.getGpxFile(), false, false);
+ }
+ return true;
+ }
+ return false;
+ }
+
public static File checkRenamePossibility(OsmandApplication ctx, File source, String newName, boolean dirAllowed) {
if (Algorithms.isEmpty(newName)) {
Toast.makeText(ctx, R.string.empty_filename, Toast.LENGTH_LONG).show();
@@ -178,6 +201,23 @@ public class FileUtils {
return uniqueFileName;
}
+ public static File backupFile(@NonNull OsmandApplication app, @NonNull File src) {
+ if (!src.exists()) {
+ return null;
+ }
+ File tempDir = app.getAppPath(IndexConstants.TEMP_DIR);
+ if (!tempDir.exists()) {
+ tempDir.mkdirs();
+ }
+ File dest = new File(tempDir, src.getName());
+ try {
+ Algorithms.fileCopy(src, dest);
+ } catch (IOException e) {
+ return null;
+ }
+ return dest;
+ }
+
public interface RenameCallback {
void renamedTo(File file);
}
diff --git a/OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java b/OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java
index a50a345aa3..cbbd36162f 100644
--- a/OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java
+++ b/OsmAnd/src/net/osmand/plus/CurrentPositionHelper.java
@@ -25,7 +25,6 @@ import org.apache.commons.logging.Log;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutorService;
@@ -154,7 +153,7 @@ public class CurrentPositionHelper {
// single synchronized method
private synchronized void processGeocoding(@NonNull Location loc,
- @Nullable ResultMatcher geoCoding,
+ @Nullable final ResultMatcher geoCoding,
boolean storeFound,
boolean allowEmptyNames,
@Nullable final ResultMatcher result,
@@ -164,6 +163,21 @@ public class CurrentPositionHelper {
boolean cancelPreviousSearch) {
if (cancelPreviousSearch && request != requestNumber.get()) {
+ if (geoCoding != null) {
+ app.runInUIThread(new Runnable() {
+ @Override
+ public void run() {
+ geoCoding.publish(null);
+ }
+ });
+ } else if (result != null) {
+ app.runInUIThread(new Runnable() {
+ @Override
+ public void run() {
+ result.publish(null);
+ }
+ });
+ }
return;
}
@@ -172,9 +186,18 @@ public class CurrentPositionHelper {
if (storeFound) {
lastAskedLocation = loc;
lastFound = gr == null || gr.isEmpty() ? null : gr.get(0).point.getRoad();
- } else if(geoCoding != null) {
- justifyResult(gr, geoCoding);
- } else if(result != null) {
+ } else if (geoCoding != null) {
+ try {
+ justifyResult(gr, geoCoding);
+ } catch (Exception e) {
+ app.runInUIThread(new Runnable() {
+ @Override
+ public void run() {
+ geoCoding.publish(null);
+ }
+ });
+ }
+ } else if (result != null) {
app.runInUIThread(new Runnable() {
@Override
public void run() {
diff --git a/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java b/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java
index ad0eb9d359..6ebdaea6b4 100644
--- a/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java
+++ b/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java
@@ -129,6 +129,7 @@ public class FavouritesDbHelper {
}
}
+ @Nullable
public Drawable getColoredIconForGroup(String groupName) {
String groupIdName = FavoriteGroup.convertDisplayNameToGroupIdName(context, groupName);
FavoriteGroup favoriteGroup = getGroup(groupIdName);
diff --git a/OsmAnd/src/net/osmand/plus/UiUtilities.java b/OsmAnd/src/net/osmand/plus/UiUtilities.java
index a435bd975e..5af06d9f23 100644
--- a/OsmAnd/src/net/osmand/plus/UiUtilities.java
+++ b/OsmAnd/src/net/osmand/plus/UiUtilities.java
@@ -93,8 +93,8 @@ public class UiUtilities {
}
public enum CustomRadioButtonType {
- LEFT,
- RIGHT,
+ START,
+ END,
}
public UiUtilities(OsmandApplication app) {
@@ -459,26 +459,35 @@ public class UiUtilities {
? R.color.text_color_primary_dark
: R.color.text_color_primary_light);
int radius = AndroidUtils.dpToPx(app, 4);
+ boolean isLayoutRtl = AndroidUtils.isLayoutRtl(app);
- TextView leftButtonText = buttonsView.findViewById(R.id.left_button);
- View leftButtonContainer = buttonsView.findViewById(R.id.left_button_container);
- TextView rightButtonText = buttonsView.findViewById(R.id.right_button);
- View rightButtonContainer = buttonsView.findViewById(R.id.right_button_container);
+ TextView startButtonText = buttonsView.findViewById(R.id.left_button);
+ View startButtonContainer = buttonsView.findViewById(R.id.left_button_container);
+ TextView endButtonText = buttonsView.findViewById(R.id.right_button);
+ View endButtonContainer = buttonsView.findViewById(R.id.right_button_container);
GradientDrawable background = new GradientDrawable();
background.setColor(UiUtilities.getColorWithAlpha(activeColor, 0.1f));
background.setStroke(AndroidUtils.dpToPx(app, 1), UiUtilities.getColorWithAlpha(activeColor, 0.5f));
- if (buttonType == CustomRadioButtonType.LEFT) {
- background.setCornerRadii(new float[]{radius, radius, 0, 0, 0, 0, radius, radius});
- rightButtonContainer.setBackgroundColor(Color.TRANSPARENT);
- rightButtonText.setTextColor(activeColor);
- leftButtonContainer.setBackgroundDrawable(background);
- leftButtonText.setTextColor(textColor);
+ if (buttonType == CustomRadioButtonType.START) {
+ if (isLayoutRtl) {
+ background.setCornerRadii(new float[]{0, 0, radius, radius, radius, radius, 0, 0});
+ } else {
+ background.setCornerRadii(new float[]{radius, radius, 0, 0, 0, 0, radius, radius});
+ }
+ endButtonContainer.setBackgroundColor(Color.TRANSPARENT);
+ endButtonText.setTextColor(activeColor);
+ startButtonContainer.setBackgroundDrawable(background);
+ startButtonText.setTextColor(textColor);
} else {
- background.setCornerRadii(new float[]{0, 0, radius, radius, radius, radius, 0, 0});
- rightButtonContainer.setBackgroundDrawable(background);
- rightButtonText.setTextColor(textColor);
- leftButtonContainer.setBackgroundColor(Color.TRANSPARENT);
- leftButtonText.setTextColor(activeColor);
+ if (isLayoutRtl) {
+ background.setCornerRadii(new float[]{radius, radius, 0, 0, 0, 0, radius, radius});
+ } else {
+ background.setCornerRadii(new float[]{0, 0, radius, radius, radius, radius, 0, 0});
+ }
+ endButtonContainer.setBackgroundDrawable(background);
+ endButtonText.setTextColor(textColor);
+ startButtonContainer.setBackgroundColor(Color.TRANSPARENT);
+ startButtonText.setTextColor(activeColor);
}
}
diff --git a/OsmAnd/src/net/osmand/plus/activities/HelpActivity.java b/OsmAnd/src/net/osmand/plus/activities/HelpActivity.java
index da95de3931..5cecc7b7ab 100644
--- a/OsmAnd/src/net/osmand/plus/activities/HelpActivity.java
+++ b/OsmAnd/src/net/osmand/plus/activities/HelpActivity.java
@@ -141,8 +141,8 @@ public class HelpActivity extends OsmandActionBarActivity implements AdapterView
"feature_articles/map-markers.html"));
contextMenuAdapter.addItem(createItem(R.string.travel_item, NULL_ID,
"feature_articles/travel.html"));
- contextMenuAdapter.addItem(createItem(R.string.measure_distance_item, NULL_ID,
- "feature_articles/measure-distance.html"));
+ contextMenuAdapter.addItem(createItem(R.string.plan_a_route, NULL_ID,
+ "feature_articles/plan-route.html"));
contextMenuAdapter.addItem(createItem(R.string.radius_ruler_item, NULL_ID,
"feature_articles/ruler.html"));
contextMenuAdapter.addItem(createItem(R.string.quick_action_item, NULL_ID,
diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java
index 5414b9c0f7..dbd0f133fa 100644
--- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java
+++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java
@@ -525,9 +525,7 @@ public class MapActivityActions implements DialogProvider {
TargetPointsHelper tg = mapActivity.getMyApplication().getTargetPointsHelper();
tg.clearStartPoint(false);
Location finishLoc = ps.get(ps.size() - 1);
- PointDescription point = new PointDescription(PointDescription.POINT_TYPE_LOCATION, result.path, "");
- point.setName(PointDescription.getSearchAddressStr(mapActivity));
- tg.navigateToPoint(new LatLon(finishLoc.getLatitude(), finishLoc.getLongitude()), false, -1, point);
+ tg.navigateToPoint(new LatLon(finishLoc.getLatitude(), finishLoc.getLongitude()), false, -1);
}
}
}
diff --git a/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java b/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java
index 4f2c3fa11f..de3453550f 100644
--- a/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java
+++ b/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java
@@ -1430,22 +1430,24 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
getMapActivity().getMyApplication().runInUIThread(new Runnable() {
@Override
public void run() {
- if (!autofocus) {
- cam.takePicture(null, null, new JpegPhotoHandler());
- } else {
- cam.autoFocus(new Camera.AutoFocusCallback() {
- @Override
- public void onAutoFocus(boolean success, Camera camera) {
- try {
- cam.takePicture(null, null, new JpegPhotoHandler());
- } catch (Exception e) {
- logErr(e);
- closeRecordingMenu();
- closeCamera();
- finishRecording();
+ if (cam != null) {
+ if (!autofocus) {
+ cam.takePicture(null, null, new JpegPhotoHandler());
+ } else {
+ cam.autoFocus(new Camera.AutoFocusCallback() {
+ @Override
+ public void onAutoFocus(boolean success, Camera camera) {
+ try {
+ cam.takePicture(null, null, new JpegPhotoHandler());
+ } catch (Exception e) {
+ logErr(e);
+ closeRecordingMenu();
+ closeCamera();
+ finishRecording();
+ }
}
- }
- });
+ });
+ }
}
}
}, 200);
diff --git a/OsmAnd/src/net/osmand/plus/base/OsmandExpandableListFragment.java b/OsmAnd/src/net/osmand/plus/base/OsmandExpandableListFragment.java
index 1db87051fa..90aabfac7c 100644
--- a/OsmAnd/src/net/osmand/plus/base/OsmandExpandableListFragment.java
+++ b/OsmAnd/src/net/osmand/plus/base/OsmandExpandableListFragment.java
@@ -88,10 +88,14 @@ public abstract class OsmandExpandableListFragment extends BaseOsmAndFragment
public MenuItem createMenuItem(Menu m, int id, int titleRes, int iconId, int menuItemType,
boolean flipIconForRtl) {
+ int color = isLightActionBar() ? R.color.active_buttons_and_links_text_light : R.color.active_buttons_and_links_text_dark;
+ return createMenuItem(m, id, titleRes, iconId, menuItemType, false, color);
+ }
+
+ public MenuItem createMenuItem(Menu m, int id, int titleRes, int iconId, int menuItemType,
+ boolean flipIconForRtl, int iconColor) {
OsmandApplication app = requireMyApplication();
- Drawable d = iconId == 0 ? null : app.getUIUtilities().getIcon(iconId, isLightActionBar() ?
- R.color.active_buttons_and_links_text_light :
- R.color.active_buttons_and_links_text_dark);
+ Drawable d = iconId == 0 ? null : app.getUIUtilities().getIcon(iconId, iconColor);
MenuItem menuItem = m.add(0, id, 0, titleRes);
if (d != null) {
if (flipIconForRtl) {
diff --git a/OsmAnd/src/net/osmand/plus/dialogs/RasterMapMenu.java b/OsmAnd/src/net/osmand/plus/dialogs/RasterMapMenu.java
index 44d50db194..534c334aec 100644
--- a/OsmAnd/src/net/osmand/plus/dialogs/RasterMapMenu.java
+++ b/OsmAnd/src/net/osmand/plus/dialogs/RasterMapMenu.java
@@ -149,6 +149,7 @@ public class RasterMapMenu {
@Override
public boolean onIntegerValueChangedListener(int newValue) {
mapTransparencyPreference.set(newValue);
+ mapActivity.getMapLayers().getMapControlsLayer().updateTransparencySlider();
mapActivity.getMapView().refreshMap();
return false;
}
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/FavouritePointMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/FavouritePointMenuController.java
index a6a84bee67..d5a484f68f 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/FavouritePointMenuController.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/FavouritePointMenuController.java
@@ -5,6 +5,7 @@ import android.graphics.drawable.Drawable;
import android.text.SpannableString;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
@@ -180,8 +181,8 @@ public class FavouritePointMenuController extends MenuController {
OsmandApplication app = mapActivity.getMyApplication();
FavouritesDbHelper helper = app.getFavorites();
String group = fav.getCategory();
- if (helper.getGroup(group) != null) {
- Drawable line2icon = helper.getColoredIconForGroup(group);
+ Drawable line2icon = helper.getGroup(group) != null ? helper.getColoredIconForGroup(group) : null;
+ if (line2icon != null) {
GravityDrawable gravityIcon = new GravityDrawable(line2icon);
gravityIcon.setBoundsFrom(line2icon);
return gravityIcon;
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/GpxData.java b/OsmAnd/src/net/osmand/plus/measurementtool/GpxData.java
index 754964ea57..a59efe63dc 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/GpxData.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/GpxData.java
@@ -25,6 +25,13 @@ public class GpxData {
this.trkSegment = trkSegment;
}
+ public GpxData(GPXFile gpxFile, GpxData gpxData) {
+ this.gpxFile = gpxFile;
+ this.rect = gpxData.rect;
+ this.actionType = gpxData.actionType;
+ this.trkSegment = gpxData.trkSegment;
+ }
+
public GPXFile getGpxFile() {
return gpxFile;
}
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java
index dd3295b2c2..c8e0ff043b 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java
@@ -250,8 +250,14 @@ public class MeasurementEditingContext {
RoadSegmentData data = this.roadSegmentData.get(pair);
if (data == null) {
if (appMode != MeasurementEditingContext.DEFAULT_APP_MODE || !pair.first.lastPoint || !pair.second.firstPoint) {
- distance += MapUtils.getDistance(pair.first.getLatitude(), pair.first.getLongitude(),
+ double localDist = MapUtils.getDistance(pair.first.getLatitude(), pair.first.getLongitude(),
pair.second.getLatitude(), pair.second.getLongitude());
+ if(!Double.isNaN(pair.first.ele) && !Double.isNaN(pair.second.ele) &&
+ pair.first.ele != 0 && pair.second.ele != 0) {
+ double h = Math.abs(pair.first.ele - pair.second.ele);
+ localDist = Math.sqrt(localDist * localDist + h * h);
+ }
+ distance += localDist;
}
} else {
distance += data.getDistance();
@@ -468,6 +474,10 @@ public class MeasurementEditingContext {
List segments = routeImporter.importRoute();
List routePoints = gpxData.getGpxFile().getRoutePoints();
int prevPointIndex = 0;
+ if (routePoints.isEmpty() && points.size() > 1) {
+ routePoints.add(points.get(0));
+ routePoints.add(points.get(points.size() - 1));
+ }
for (int i = 0; i < routePoints.size() - 1; i++) {
Pair pair = new Pair<>(routePoints.get(i), routePoints.get(i + 1));
int startIndex = pair.first.getTrkPtIndex();
@@ -517,47 +527,90 @@ public class MeasurementEditingContext {
roadSegmentData.clear();
List routePoints = new ArrayList<>();
List gpxPoints = gpxApproximation.finalPoints;
- for (int i = 0; i < gpxPoints.size() - 1; i++) {
- GpxPoint rp1 = gpxPoints.get(i);
- GpxPoint rp2 = gpxPoints.get(i + 1);
- WptPt p1 = new WptPt();
- p1.lat = rp1.loc.getLatitude();
- p1.lon = rp1.loc.getLongitude();
- p1.setProfileType(mode.getStringKey());
- if (i == 0) {
- routePoints.add(p1);
- }
- WptPt p2 = new WptPt();
- p2.lat = rp2.loc.getLatitude();
- p2.lon = rp2.loc.getLongitude();
- p2.setProfileType(mode.getStringKey());
- routePoints.add(p2);
- Pair pair = new Pair<>(p1, p2);
+ for (int i = 0; i < gpxPoints.size(); i++) {
+ GpxPoint gp1 = gpxPoints.get(i);
+ boolean lastGpxPoint = isLastGpxPoint(gpxPoints, i);
List points = new ArrayList<>();
List segments = new ArrayList<>();
- for (RouteSegmentResult seg : rp1.routeToTarget) {
- segments.add(seg);
- int ind = seg.getStartPointIndex();
- boolean plus = seg.isForwardDirection();
- float[] pf = seg.getObject().calculateHeightArray();
- while (ind != seg.getEndPointIndex()) {
- LatLon l = seg.getPoint(ind);
- WptPt pt = new WptPt();
- if (pf != null && pf.length > ind * 2 + 1) {
- pt.ele = pf[ind * 2 + 1];
-
- }
- pt.lat = l.getLatitude();
- pt.lon = l.getLongitude();
- points.add(pt);
- ind = plus ? ind + 1 : ind - 1;
+ for (int k = 0; k < gp1.routeToTarget.size(); k++) {
+ RouteSegmentResult seg = gp1.routeToTarget.get(k);
+ if (seg.getStartPointIndex() != seg.getEndPointIndex()) {
+ segments.add(seg);
}
}
- roadSegmentData.put(pair, new RoadSegmentData(appMode, pair.first, pair.second, points, segments));
+ for (int k = 0; k < segments.size(); k++) {
+ RouteSegmentResult seg = segments.get(k);
+ fillPointsArray(points, seg, lastGpxPoint && k == segments.size() - 1);
+ }
+ if (!points.isEmpty()) {
+ WptPt wp1 = new WptPt();
+ wp1.lat = gp1.loc.getLatitude();
+ wp1.lon = gp1.loc.getLongitude();
+ wp1.setProfileType(mode.getStringKey());
+ routePoints.add(wp1);
+ WptPt wp2 = new WptPt();
+ if (lastGpxPoint) {
+ wp2.lat = points.get(points.size() - 1).getLatitude();
+ wp2.lon = points.get(points.size() - 1).getLongitude();
+ routePoints.add(wp2);
+ } else {
+ GpxPoint gp2 = gpxPoints.get(i + 1);
+ wp2.lat = gp2.loc.getLatitude();
+ wp2.lon = gp2.loc.getLongitude();
+ }
+ wp2.setProfileType(mode.getStringKey());
+ Pair pair = new Pair<>(wp1, wp2);
+ roadSegmentData.put(pair, new RoadSegmentData(appMode, pair.first, pair.second, points, segments));
+ }
+ if (lastGpxPoint) {
+ break;
+ }
}
addPoints(routePoints);
}
+ private boolean isLastGpxPoint(List gpxPoints, int index) {
+ if (index == gpxPoints.size() - 1) {
+ return true;
+ } else {
+ for (int i = index + 1; i < gpxPoints.size(); i++) {
+ GpxPoint gp = gpxPoints.get(i);
+ for (int k = 0; k < gp.routeToTarget.size(); k++) {
+ RouteSegmentResult seg = gp.routeToTarget.get(k);
+ if (seg.getStartPointIndex() != seg.getEndPointIndex()) {
+ return false;
+ }
+ }
+
+ }
+ }
+ return true;
+ }
+
+ private void fillPointsArray(List points, RouteSegmentResult seg, boolean includeEndPoint) {
+ int ind = seg.getStartPointIndex();
+ boolean plus = seg.isForwardDirection();
+ float[] heightArray = seg.getObject().calculateHeightArray();
+ while (ind != seg.getEndPointIndex()) {
+ addPointToArray(points, seg, ind, heightArray);
+ ind = plus ? ind + 1 : ind - 1;
+ }
+ if (includeEndPoint) {
+ addPointToArray(points, seg, ind, heightArray);
+ }
+ }
+
+ private void addPointToArray(List points, RouteSegmentResult seg, int index, float[] heightArray) {
+ LatLon l = seg.getPoint(index);
+ WptPt pt = new WptPt();
+ if (heightArray != null && heightArray.length > index * 2 + 1) {
+ pt.ele = heightArray[index * 2 + 1];
+ }
+ pt.lat = l.getLatitude();
+ pt.lon = l.getLongitude();
+ points.add(pt);
+ }
+
private int findPointIndex(WptPt point, List points, int firstIndex) {
double minDistance = Double.MAX_VALUE;
int index = 0;
@@ -700,7 +753,7 @@ public class MeasurementEditingContext {
return params;
}
- public List getDistinctRoutePoints() {
+ public List getRoutePoints() {
List res = new ArrayList<>();
List points = new ArrayList<>(before.points);
points.addAll(after.points);
@@ -710,9 +763,6 @@ public class MeasurementEditingContext {
RoadSegmentData data = this.roadSegmentData.get(pair);
if (data != null) {
res.addAll(data.points);
- if (i < size - 2) {
- res.remove(res.size() - 1);
- }
}
}
return res;
@@ -740,10 +790,7 @@ public class MeasurementEditingContext {
}
locations.add(l);
}
- pair.second.setTrkPtIndex(locations.size() - 1);
- if (i < size - 2 && !locations.isEmpty()) {
- locations.remove(locations.size() - 1);
- }
+ pair.second.setTrkPtIndex(i < size - 1 ? locations.size() : locations.size() - 1);
route.addAll(data.segments);
}
}
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java
index 8c6693a8b6..7d6818a9d6 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java
@@ -136,8 +136,13 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
private boolean wasCollapseButtonVisible;
private boolean progressBarVisible;
private boolean pointsListOpened;
- private boolean planRouteMode = false;
- private boolean directionMode = false;
+
+ private static final int PLAN_ROUTE_MODE = 0x1;
+ private static final int DIRECTION_MODE = 0x2;
+ private static final int FOLLOW_TRACK_MODE = 0x4;
+ private static final int UNDO_MODE = 0x8;
+ private int modes = 0x0;
+
private boolean approximationApplied = false;
private boolean portrait;
private boolean nightMode;
@@ -166,12 +171,30 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
this.initialPoint = initialPoint;
}
- private void setPlanRouteMode(boolean planRouteMode) {
- this.planRouteMode = planRouteMode;
+ private void setMode(int mode, boolean on) {
+ int modes = this.modes;
+ if (on) {
+ modes |= mode;
+ } else {
+ modes &= ~mode;
+ }
+ this.modes = modes;
}
- private void setDirectionMode(boolean directionMode) {
- this.directionMode = directionMode;
+ private boolean isPlanRouteMode() {
+ return (this.modes & PLAN_ROUTE_MODE) == PLAN_ROUTE_MODE;
+ }
+
+ private boolean isDirectionMode() {
+ return (this.modes & DIRECTION_MODE) == DIRECTION_MODE;
+ }
+
+ private boolean isFollowTrackMode() {
+ return (this.modes & FOLLOW_TRACK_MODE) == FOLLOW_TRACK_MODE;
+ }
+
+ private boolean isUndoMode() {
+ return (this.modes & UNDO_MODE) == UNDO_MODE;
}
@Override
@@ -441,7 +464,11 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
toolBarController.setOnSaveViewClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- saveChanges(FinalSaveAction.SHOW_SNACK_BAR_AND_CLOSE, false);
+ if (isFollowTrackMode()) {
+ startTrackNavigation();
+ } else {
+ saveChanges(FinalSaveAction.SHOW_SNACK_BAR_AND_CLOSE, false);
+ }
}
});
updateToolbar();
@@ -470,7 +497,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
});
snapToRoadBtn.setVisibility(View.VISIBLE);
- initMeasurementMode(gpxData);
+ initMeasurementMode(gpxData, savedInstanceState == null);
if (savedInstanceState == null) {
if (fileName != null) {
@@ -486,7 +513,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
}
public boolean isInEditMode() {
- return !planRouteMode && !editingCtx.isNewData() && !directionMode;
+ return !isPlanRouteMode() && !editingCtx.isNewData() && !isDirectionMode() && !isFollowTrackMode();
}
public void setFileName(String fileName) {
@@ -503,18 +530,20 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
updateSnapToRoadControls();
}
- private void initMeasurementMode(GpxData gpxData) {
+ private void initMeasurementMode(GpxData gpxData, boolean addPoints) {
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
editingCtx.getCommandManager().setMeasurementLayer(mapActivity.getMapLayers().getMeasurementToolLayer());
enterMeasurementMode();
updateSnapToRoadControls();
- if (gpxData != null) {
- List points = gpxData.getGpxFile().getRoutePoints();
- if (!points.isEmpty()) {
- ApplicationMode snapToRoadAppMode = ApplicationMode.valueOfStringKey(points.get(points.size() - 1).getProfileType(), null);
- if (snapToRoadAppMode != null) {
- setAppMode(snapToRoadAppMode);
+ if (gpxData != null && addPoints) {
+ if (!isUndoMode()) {
+ List points = gpxData.getGpxFile().getRoutePoints();
+ if (!points.isEmpty()) {
+ ApplicationMode snapToRoadAppMode = ApplicationMode.valueOfStringKey(points.get(points.size() - 1).getProfileType(), null);
+ if (snapToRoadAppMode != null) {
+ setAppMode(snapToRoadAppMode);
+ }
}
}
ActionType actionType = gpxData.getActionType();
@@ -524,6 +553,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
displaySegmentPoints();
}
}
+ setMode(UNDO_MODE, false);
}
}
@@ -628,7 +658,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
toolBarController.setTitle(getString(R.string.route_between_points));
mapActivity.refreshMap();
- if (editingCtx.isNewData() || editingCtx.hasRoutePoints() || editingCtx.hasRoute() || editingCtx.getPointsCount() < 2) {
+ if (editingCtx.isNewData() || editingCtx.hasRoutePoints() || editingCtx.hasRoute() || editingCtx.getPointsCount() <= 2) {
RouteBetweenPointsBottomSheetDialogFragment.showInstance(mapActivity.getSupportFragmentManager(),
this, RouteBetweenPointsDialogType.WHOLE_ROUTE_CALCULATION,
editingCtx.getLastCalculationMode() == CalculationMode.NEXT_SEGMENT
@@ -669,7 +699,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
switch (resultCode) {
case SnapTrackWarningFragment.CANCEL_RESULT_CODE:
toolBarController.setSaveViewVisible(true);
- directionMode = false;
+ setMode(DIRECTION_MODE, false);
exitApproximationMode();
updateToolbar();
break;
@@ -735,7 +765,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
targetPointsHelper.clearAllPoints(false);
mapActions.enterRoutePlanningModeGivenGpx(gpx, appMode, null, null, true, true, MenuState.HEADER_ONLY);
} else {
- directionMode = true;
+ setMode(DIRECTION_MODE, true);
enterApproximationMode(mapActivity);
}
}
@@ -749,16 +779,23 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
private void runNavigation(final GPXFile gpx, final ApplicationMode appMode) {
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
- if (mapActivity.getMyApplication().getRoutingHelper().isFollowingMode()) {
- mapActivity.getMapActions().stopNavigationActionConfirm(new Runnable() {
- @Override
- public void run() {
- MapActivity mapActivity = getMapActivity();
- if (mapActivity != null) {
- mapActivity.getMapActions().enterRoutePlanningModeGivenGpx(gpx, appMode, null, null, true, true, MenuState.HEADER_ONLY);
+ OsmandApplication app = mapActivity.getMyApplication();
+ if (app.getRoutingHelper().isFollowingMode()) {
+ if (isFollowTrackMode()) {
+ mapActivity.getMapActions().setGPXRouteParams(gpx);
+ app.getTargetPointsHelper().updateRouteAndRefresh(true);
+ app.getRoutingHelper().recalculateRouteDueToSettingsChange();
+ } else {
+ mapActivity.getMapActions().stopNavigationActionConfirm(new Runnable() {
+ @Override
+ public void run() {
+ MapActivity mapActivity = getMapActivity();
+ if (mapActivity != null) {
+ mapActivity.getMapActions().enterRoutePlanningModeGivenGpx(gpx, appMode, null, null, true, true, MenuState.HEADER_ONLY);
+ }
}
- }
- });
+ });
+ }
} else {
mapActivity.getMapActions().stopNavigationWithoutConfirm();
mapActivity.getMapActions().enterRoutePlanningModeGivenGpx(gpx, appMode, null, null, true, true, MenuState.HEADER_ONLY);
@@ -768,7 +805,11 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
@Override
public void saveChangesOnClick() {
- saveChanges(FinalSaveAction.SHOW_TOAST, true);
+ if (isFollowTrackMode()) {
+ startTrackNavigation();
+ } else {
+ saveChanges(FinalSaveAction.SHOW_TOAST, true);
+ }
}
@Override
@@ -1010,20 +1051,29 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
}
public void addNewGpxData(GPXFile gpxFile) {
- QuadRect rect = gpxFile.getRect();
- TrkSegment segment = gpxFile.getNonEmptyTrkSegment();
- ActionType actionType = segment == null ? ActionType.ADD_ROUTE_POINTS : ActionType.EDIT_SEGMENT;
- GpxData gpxData = new GpxData(gpxFile, rect, actionType, segment);
- editingCtx.setGpxData(gpxData);
- initMeasurementMode(gpxData);
- QuadRect qr = gpxData.getRect();
+ GpxData gpxData = setupGpxData(gpxFile);
+ initMeasurementMode(gpxData, true);
MapActivity mapActivity = getMapActivity();
- if (mapActivity != null) {
+ if (mapActivity != null && gpxData != null) {
+ QuadRect qr = gpxData.getRect();
mapActivity.getMapView().fitRectToMap(qr.left, qr.right, qr.top, qr.bottom,
(int) qr.width(), (int) qr.height(), 0);
}
}
+ @Nullable
+ private GpxData setupGpxData(@Nullable GPXFile gpxFile) {
+ GpxData gpxData = null;
+ if (gpxFile != null) {
+ QuadRect rect = gpxFile.getRect();
+ TrkSegment segment = gpxFile.getNonEmptyTrkSegment();
+ ActionType actionType = segment == null ? ActionType.ADD_ROUTE_POINTS : ActionType.EDIT_SEGMENT;
+ gpxData = new GpxData(gpxFile, rect, actionType, segment);
+ }
+ editingCtx.setGpxData(gpxData);
+ return gpxData;
+ }
+
private void removePoint(MeasurementToolLayer measurementLayer, int position) {
if (measurementLayer != null) {
editingCtx.getCommandManager().execute(new RemovePointCommand(measurementLayer, position));
@@ -1156,7 +1206,9 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
if (gpx != null) {
List points = gpx.getRoutePoints();
if (measurementLayer != null) {
- editingCtx.addPoints(points);
+ if (!isUndoMode()) {
+ editingCtx.addPoints(points);
+ }
adapter.notifyDataSetChanged();
updateDistancePointsText();
}
@@ -1166,7 +1218,9 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
private void displaySegmentPoints() {
MeasurementToolLayer measurementLayer = getMeasurementLayer();
if (measurementLayer != null) {
- editingCtx.addPoints();
+ if (!isUndoMode()) {
+ editingCtx.addPoints();
+ }
adapter.notifyDataSetChanged();
updateDistancePointsText();
}
@@ -1494,7 +1548,8 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
new AsyncTask() {
private ProgressDialog progressDialog;
- private File toSave;
+ private File backupFile;
+ private File outFile;
private GPXFile savedGpxFile;
@Override
@@ -1519,14 +1574,14 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
TrkSegment before = editingCtx.getBeforeTrkSegmentLine();
TrkSegment after = editingCtx.getAfterTrkSegmentLine();
if (gpxFile == null) {
- toSave = new File(dir, fileName);
+ outFile = new File(dir, fileName);
String trackName = fileName.substring(0, fileName.length() - GPX_FILE_EXT.length());
GPXFile gpx = new GPXFile(Version.getFullVersion(app));
if (measurementLayer != null) {
if (saveType == SaveType.LINE) {
TrkSegment segment = new TrkSegment();
if (editingCtx.hasRoute()) {
- segment.points.addAll(editingCtx.getDistinctRoutePoints());
+ segment.points.addAll(editingCtx.getRoutePoints());
} else {
segment.points.addAll(before.points);
segment.points.addAll(after.points);
@@ -1545,23 +1600,24 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
gpx.addRoutePoints(points);
}
}
- Exception res = GPXUtilities.writeGpxFile(toSave, gpx);
- gpx.path = toSave.getAbsolutePath();
+ Exception res = GPXUtilities.writeGpxFile(outFile, gpx);
+ gpx.path = outFile.getAbsolutePath();
savedGpxFile = gpx;
if (showOnMap) {
- app.getSelectedGpxHelper().selectGpxFile(gpx, true, false);
+ showGpxOnMap(app, gpx, true);
}
return res;
} else {
GPXFile gpx = gpxFile;
- toSave = new File(gpx.path);
- String trackName = Algorithms.getFileNameWithoutExtension(toSave);
+ outFile = new File(gpx.path);
+ backupFile = FileUtils.backupFile(app, outFile);
+ String trackName = Algorithms.getFileNameWithoutExtension(outFile);
if (measurementLayer != null) {
- if (planRouteMode) {
+ if (isPlanRouteMode()) {
if (saveType == SaveType.LINE) {
TrkSegment segment = new TrkSegment();
if (editingCtx.hasRoute()) {
- segment.points.addAll(editingCtx.getDistinctRoutePoints());
+ segment.points.addAll(editingCtx.getRoutePoints());
} else {
segment.points.addAll(before.points);
segment.points.addAll(after.points);
@@ -1619,21 +1675,25 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
}
Exception res = null;
if (!gpx.showCurrentTrack) {
- res = GPXUtilities.writeGpxFile(toSave, gpx);
+ res = GPXUtilities.writeGpxFile(outFile, gpx);
}
savedGpxFile = gpx;
if (showOnMap) {
- SelectedGpxFile sf = app.getSelectedGpxHelper().selectGpxFile(gpx, true, false);
- if (sf != null) {
- if (actionType == ActionType.ADD_SEGMENT || actionType == ActionType.EDIT_SEGMENT) {
- sf.processPoints(getMyApplication());
- }
- }
+ showGpxOnMap(app, gpx, false);
}
return res;
}
}
+ private void showGpxOnMap(OsmandApplication app, GPXFile gpx, boolean isNewGpx) {
+ SelectedGpxFile sf = app.getSelectedGpxHelper().selectGpxFile(gpx, true, false);
+ if (sf != null && !isNewGpx) {
+ if (actionType == ActionType.ADD_SEGMENT || actionType == ActionType.EDIT_SEGMENT) {
+ sf.processPoints(getMyApplication());
+ }
+ }
+ }
+
@Override
protected void onPostExecute(Exception warning) {
onGpxSaved(warning);
@@ -1649,7 +1709,6 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
}
mapActivity.refreshMap();
if (warning == null) {
- editingCtx.setChangesSaved();
if (editingCtx.isNewData() && savedGpxFile != null) {
QuadRect rect = savedGpxFile.getRect();
TrkSegment segment = savedGpxFile.getNonEmptyTrkSegment();
@@ -1658,30 +1717,66 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
updateToolbar();
}
if (isInEditMode()) {
+ editingCtx.setChangesSaved();
dismiss(mapActivity);
} else {
switch (finalSaveAction) {
case SHOW_SNACK_BAR_AND_CLOSE:
final WeakReference mapActivityRef = new WeakReference<>(mapActivity);
snackbar = Snackbar.make(mapActivity.getLayout(),
- MessageFormat.format(getString(R.string.gpx_saved_sucessfully), toSave.getName()),
+ MessageFormat.format(getString(R.string.gpx_saved_sucessfully), outFile.getName()),
Snackbar.LENGTH_LONG)
- .setAction(R.string.shared_string_rename, getRenameListener(mapActivityRef));
+ .setAction(R.string.shared_string_undo, new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ MapActivity mapActivity = mapActivityRef.get();
+ if (mapActivity != null) {
+ if (outFile != null) {
+ OsmandApplication app = mapActivity.getMyApplication();
+ FileUtils.removeGpxFile(app, outFile);
+ if (backupFile != null) {
+ FileUtils.renameGpxFile(app, backupFile, outFile);
+ GPXFile gpx = GPXUtilities.loadGPXFile(outFile);
+ setupGpxData(gpx);
+ if (showOnMap) {
+ showGpxOnMap(app, gpx, false);
+ }
+ } else {
+ setupGpxData(null);
+ }
+ }
+ setMode(UNDO_MODE, true);
+ MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(),
+ editingCtx, modes);
+ }
+ }
+ })
+ .addCallback(new Snackbar.Callback() {
+ @Override
+ public void onDismissed(Snackbar transientBottomBar, int event) {
+ if (event != DISMISS_EVENT_ACTION) {
+ editingCtx.setChangesSaved();
+ }
+ super.onDismissed(transientBottomBar, event);
+ }
+ });
snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_action)
.setAllCaps(false);
UiUtilities.setupSnackbar(snackbar, nightMode);
snackbar.show();
- dismiss(mapActivity);
+ dismiss(mapActivity, false);
break;
case SHOW_IS_SAVED_FRAGMENT:
+ editingCtx.setChangesSaved();
SavedTrackBottomSheetDialogFragment.showInstance(mapActivity.getSupportFragmentManager(),
- toSave.getName());
+ outFile.getAbsolutePath());
dismiss(mapActivity);
break;
case SHOW_TOAST:
+ editingCtx.setChangesSaved();
if (!savedGpxFile.showCurrentTrack) {
Toast.makeText(mapActivity,
- MessageFormat.format(getString(R.string.gpx_saved_sucessfully), toSave.getAbsolutePath()),
+ MessageFormat.format(getString(R.string.gpx_saved_sucessfully), outFile.getAbsolutePath()),
Toast.LENGTH_LONG).show();
}
}
@@ -1690,22 +1785,6 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
Toast.makeText(mapActivity, warning.getMessage(), Toast.LENGTH_LONG).show();
}
}
-
- private OnClickListener getRenameListener(final WeakReference mapActivityRef) {
- return new OnClickListener() {
- @Override
- public void onClick(View view) {
- MapActivity mapActivity = mapActivityRef.get();
- String parentFolder = toSave.getParentFile().getName();
- if (GPX_INDEX_DIR.equals(parentFolder + File.separator)) {
- parentFolder = null;
- }
- SaveAsNewTrackBottomSheetDialogFragment.showInstance(
- mapActivity.getSupportFragmentManager(), null, parentFolder,
- AndroidUtils.trimExtension(toSave.getName()), false, showOnMap);
- }
- };
- }
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
@@ -1843,7 +1922,15 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
cancelAddPointBeforeOrAfterMode();
return;
}
- showQuitDialog(hidePointsListFirst);
+ if (isFollowTrackMode()) {
+ MapActivity mapActivity = getMapActivity();
+ if (mapActivity != null) {
+ mapActivity.getMapLayers().getMapControlsLayer().showRouteInfoControlDialog();
+ dismiss(mapActivity);
+ }
+ } else {
+ showQuitDialog(hidePointsListFirst);
+ }
}
private void showQuitDialog(boolean hidePointsListFirst) {
@@ -1862,9 +1949,15 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
}
}
- private void dismiss(MapActivity mapActivity) {
+ private void dismiss(@NonNull MapActivity mapActivity) {
+ dismiss(mapActivity, true);
+ }
+
+ private void dismiss(@NonNull MapActivity mapActivity, boolean clearContext) {
try {
- editingCtx.clearSegments();
+ if (clearContext) {
+ editingCtx.clearSegments();
+ }
if (pointsListOpened) {
hidePointsList();
}
@@ -1890,30 +1983,29 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
public static boolean showInstance(FragmentManager fragmentManager, LatLon initialPoint) {
MeasurementToolFragment fragment = new MeasurementToolFragment();
fragment.setInitialPoint(initialPoint);
- fragment.setPlanRouteMode(true);
+ fragment.setMode(PLAN_ROUTE_MODE, true);
return showFragment(fragment, fragmentManager);
}
public static boolean showInstance(FragmentManager fragmentManager, String fileName) {
MeasurementToolFragment fragment = new MeasurementToolFragment();
fragment.setFileName(fileName);
- fragment.setPlanRouteMode(true);
+ fragment.setMode(PLAN_ROUTE_MODE, true);
return showFragment(fragment, fragmentManager);
}
public static boolean showInstance(FragmentManager fragmentManager, GPXFile gpxFile) {
MeasurementToolFragment fragment = new MeasurementToolFragment();
fragment.addNewGpxData(gpxFile);
- fragment.setPlanRouteMode(true);
+ fragment.setMode(PLAN_ROUTE_MODE, true);
return showFragment(fragment, fragmentManager);
}
public static boolean showInstance(FragmentManager fragmentManager, MeasurementEditingContext editingCtx,
- boolean planRoute, boolean directionMode) {
+ boolean followTrackMode) {
MeasurementToolFragment fragment = new MeasurementToolFragment();
fragment.setEditingCtx(editingCtx);
- fragment.setPlanRouteMode(planRoute);
- fragment.setDirectionMode(directionMode);
+ fragment.setMode(FOLLOW_TRACK_MODE, followTrackMode);
return showFragment(fragment, fragmentManager);
}
@@ -1925,7 +2017,14 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
public static boolean showInstance(FragmentManager fragmentManager) {
MeasurementToolFragment fragment = new MeasurementToolFragment();
- fragment.setPlanRouteMode(true);
+ fragment.setMode(PLAN_ROUTE_MODE, true);
+ return showFragment(fragment, fragmentManager);
+ }
+
+ private static boolean showInstance(FragmentManager fragmentManager, MeasurementEditingContext editingCtx, int modes) {
+ MeasurementToolFragment fragment = new MeasurementToolFragment();
+ fragment.setEditingCtx(editingCtx);
+ fragment.modes = modes;
return showFragment(fragment, fragmentManager);
}
@@ -2010,23 +2109,27 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
exitApproximationMode();
doAddOrMovePointCommonStuff();
updateSnapToRoadControls();
- if (directionMode) {
- directionMode = false;
- MapActivity mapActivity = getMapActivity();
- if (mapActivity != null) {
- if (editingCtx.hasRoute()) {
- String trackName = getSuggestedFileName();
- GPXFile gpx = editingCtx.exportRouteAsGpx(trackName);
- if (gpx != null) {
- ApplicationMode appMode = editingCtx.getAppMode();
- dismiss(mapActivity);
- runNavigation(gpx, appMode);
- } else {
- Toast.makeText(mapActivity, getString(R.string.error_occurred_saving_gpx), Toast.LENGTH_SHORT).show();
- }
+ if (isDirectionMode() || isFollowTrackMode()) {
+ setMode(DIRECTION_MODE, false);
+ startTrackNavigation();
+ }
+ }
+
+ private void startTrackNavigation() {
+ MapActivity mapActivity = getMapActivity();
+ if (mapActivity != null) {
+ if (editingCtx.hasRoute()) {
+ String trackName = getSuggestedFileName();
+ GPXFile gpx = editingCtx.exportRouteAsGpx(trackName);
+ if (gpx != null) {
+ ApplicationMode appMode = editingCtx.getAppMode();
+ dismiss(mapActivity);
+ runNavigation(gpx, appMode);
} else {
Toast.makeText(mapActivity, getString(R.string.error_occurred_saving_gpx), Toast.LENGTH_SHORT).show();
}
+ } else {
+ Toast.makeText(mapActivity, getString(R.string.error_occurred_saving_gpx), Toast.LENGTH_SHORT).show();
}
}
}
@@ -2035,7 +2138,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
public void onCancelGpxApproximation() {
editingCtx.getCommandManager().undo();
exitApproximationMode();
- directionMode = false;
+ setMode(DIRECTION_MODE, false);
updateSnapToRoadControls();
updateToolbar();
}
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/RouteBetweenPointsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/RouteBetweenPointsBottomSheetDialogFragment.java
index 77f3909e62..8feb1ecf5c 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/RouteBetweenPointsBottomSheetDialogFragment.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/RouteBetweenPointsBottomSheetDialogFragment.java
@@ -27,8 +27,8 @@ import org.apache.commons.logging.Log;
import java.util.ArrayList;
import java.util.List;
-import static net.osmand.plus.UiUtilities.CustomRadioButtonType.LEFT;
-import static net.osmand.plus.UiUtilities.CustomRadioButtonType.RIGHT;
+import static net.osmand.plus.UiUtilities.CustomRadioButtonType.START;
+import static net.osmand.plus.UiUtilities.CustomRadioButtonType.END;
import static net.osmand.plus.measurementtool.MeasurementEditingContext.DEFAULT_APP_MODE;
import static net.osmand.plus.measurementtool.SelectFileBottomSheet.BOTTOM_SHEET_HEIGHT_DP;
@@ -136,7 +136,7 @@ public class RouteBetweenPointsBottomSheetDialogFragment extends BottomSheetBeha
public void updateModeButtons() {
UiUtilities.updateCustomRadioButtons(getMyApplication(), customRadioButton, nightMode,
- defaultDialogMode == RouteBetweenPointsDialogMode.SINGLE ? LEFT : RIGHT);
+ defaultDialogMode == RouteBetweenPointsDialogMode.SINGLE ? START : END);
btnDescription.setText(getButtonDescr(defaultDialogMode));
}
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java
index 07c447f3d1..231182be8b 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java
@@ -88,8 +88,7 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial
R.layout.track_name_edit_text, null);
nameTextBox = editNameView.findViewById(R.id.name_text_box);
nameTextBox.setBoxBackgroundColorResource(highlightColorId);
- nameTextBox.setHint(app.getString(R.string.ltr_or_rtl_combine_via_colon,
- app.getString(R.string.shared_string_file_name), "").trim());
+ nameTextBox.setHint(AndroidUtils.addColon(app, R.string.shared_string_file_name));
ColorStateList colorStateList = ColorStateList.valueOf(ContextCompat
.getColor(app, nightMode ? R.color.text_color_secondary_dark : R.color.text_color_secondary_light));
nameTextBox.setDefaultHintTextColor(colorStateList);
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/SavedTrackBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/SavedTrackBottomSheetDialogFragment.java
index 12f2be4cc8..29d48411fb 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/SavedTrackBottomSheetDialogFragment.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/SavedTrackBottomSheetDialogFragment.java
@@ -1,21 +1,26 @@
package net.osmand.plus.measurementtool;
import android.app.Activity;
+import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
+import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
+import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
+import net.osmand.plus.activities.TrackActivity;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemButton;
import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
+import net.osmand.util.Algorithms;
public class SavedTrackBottomSheetDialogFragment extends MenuBottomSheetDialogFragment {
@@ -34,7 +39,7 @@ public class SavedTrackBottomSheetDialogFragment extends MenuBottomSheetDialogFr
View mainView = View.inflate(UiUtilities.getThemedContext(getMyApplication(), nightMode),
R.layout.measure_track_is_saved, null);
TextView fileNameView = mainView.findViewById(R.id.file_name);
- fileNameView.setText(fileName);
+ fileNameView.setText(Algorithms.getFileWithoutDirs(fileName));
items.add(new SimpleBottomSheetItem.Builder()
.setCustomView(mainView)
.create());
@@ -51,10 +56,13 @@ public class SavedTrackBottomSheetDialogFragment extends MenuBottomSheetDialogFr
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- Activity activity = getActivity();
- if (activity instanceof MapActivity) {
- MeasurementToolFragment.showInstance(((MapActivity) activity).getSupportFragmentManager(),
- fileName);
+ FragmentActivity activity = getActivity();
+ if (activity != null && !Algorithms.isEmpty(fileName)) {
+ OsmandApplication app = ((OsmandApplication) activity.getApplication());
+ Intent newIntent = new Intent(activity, app.getAppCustomization().getTrackActivity());
+ newIntent.putExtra(TrackActivity.TRACK_FILE_NAME, fileName);
+ newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ activity.startActivity(newIntent);
}
dismiss();
}
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/SelectFileBottomSheet.java b/OsmAnd/src/net/osmand/plus/measurementtool/SelectFileBottomSheet.java
index 2bb0c2e7c5..cd84845584 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/SelectFileBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/SelectFileBottomSheet.java
@@ -1,8 +1,12 @@
package net.osmand.plus.measurementtool;
import android.content.Context;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
import android.view.View;
+import android.widget.ImageButton;
import android.widget.TextView;
import androidx.annotation.StringRes;
@@ -22,20 +26,24 @@ import net.osmand.plus.helpers.GpxTrackAdapter.OnItemClickListener;
import net.osmand.plus.helpers.GpxUiHelper.GPXInfo;
import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter;
import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter.HorizontalSelectionAdapterListener;
+import net.osmand.plus.widgets.IconPopupMenu;
import java.io.File;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static net.osmand.plus.helpers.GpxUiHelper.getSortedGPXFilesInfo;
+import static net.osmand.plus.settings.backend.OsmandSettings.*;
import static net.osmand.util.Algorithms.collectDirs;
public class SelectFileBottomSheet extends BottomSheetBehaviourDialogFragment {
enum Mode {
- OPEN_TRACK(R.string.plan_route_open_existing_track, R.string.plan_route_select_track_file_for_open),
+ OPEN_TRACK(R.string.shared_string_gpx_tracks, R.string.sort_by),
ADD_TO_TRACK(R.string.add_to_a_track, R.string.route_between_points_add_track_desc);
int title;
@@ -65,6 +73,7 @@ public class SelectFileBottomSheet extends BottomSheetBehaviourDialogFragment {
private Mode fragmentMode;
private String selectedFolder;
private String allFilesFolder;
+ TracksSortByMode tracksSortBy = TracksSortByMode.BY_DATE;
public void setFragmentMode(Mode fragmentMode) {
this.fragmentMode = fragmentMode;
@@ -75,18 +84,54 @@ public class SelectFileBottomSheet extends BottomSheetBehaviourDialogFragment {
}
@Override
- public void createMenuItems(Bundle savedInstanceState) {
+ public void createMenuItems(final Bundle savedInstanceState) {
final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
Context context = requireContext();
- OsmandApplication app = requiredMyApplication();
+ final OsmandApplication app = requiredMyApplication();
mainView = View.inflate(new ContextThemeWrapper(context, themeRes),
R.layout.bottom_sheet_plan_route_select_file, null);
TextView titleView = mainView.findViewById(R.id.title);
titleView.setText(fragmentMode.title);
- TextView descriptionView = mainView.findViewById(R.id.description);
+ final TextView descriptionView = mainView.findViewById(R.id.description);
descriptionView.setText(fragmentMode.description);
final RecyclerView filesRecyclerView = mainView.findViewById(R.id.gpx_track_list);
filesRecyclerView.setLayoutManager(new LinearLayoutManager(context));
+ if (fragmentMode == Mode.OPEN_TRACK) {
+ titleView.setText(AndroidUtils.addColon(app, fragmentMode.title));
+ updateDescription(descriptionView);
+ final ImageButton sortButton = mainView.findViewById(R.id.sort_button);
+ Drawable background = app.getUIUtilities().getIcon(R.drawable.bg_dash_line_dark,
+ nightMode
+ ? R.color.inactive_buttons_and_links_bg_dark
+ : R.color.inactive_buttons_and_links_bg_light);
+ AndroidUtils.setBackground(sortButton, background);
+ sortButton.setImageResource(tracksSortBy.getIconId());
+ sortButton.setVisibility(View.VISIBLE);
+ sortButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ IconPopupMenu popup = new IconPopupMenu(v.getContext(), v);
+ final Menu menu = popup.getMenu();
+ MenuItem mi;
+ for (final TracksSortByMode mode : TracksSortByMode.values()) {
+ mi = createMenuItem(app, menu, mode.getNameId(), mode.getNameId(), mode.getIconId(),
+ MenuItem.SHOW_AS_ACTION_ALWAYS, false, R.color.icon_color_default_light);
+ mi.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ tracksSortBy = mode;
+ sortButton.setImageResource(mode.getIconId());
+ updateDescription(descriptionView);
+ sortFileList();
+ adapter.notifyDataSetChanged();
+ return false;
+ }
+ });
+ }
+ popup.show();
+ }
+ });
+ }
List dirs = new ArrayList<>();
final File gpxDir = app.getAppPath(IndexConstants.GPX_INDEX_DIR);
@@ -149,21 +194,66 @@ public class SelectFileBottomSheet extends BottomSheetBehaviourDialogFragment {
@Override
public void onItemSelected(String item) {
selectedFolder = item;
- updateFileList(item, folderAdapter);
+ updateFileList(folderAdapter);
}
});
items.add(new BaseBottomSheetItem.Builder().setCustomView(mainView).create());
- updateFileList(selectedFolder, folderAdapter);
+ updateFileList(folderAdapter);
}
- private void updateFileList(String folderName, HorizontalSelectionAdapter folderAdapter) {
- List gpxInfoList = gpxInfoMap.get(folderName);
+ private void updateDescription(TextView descriptionView) {
+ String string = getString(tracksSortBy.getNameId());
+ descriptionView.setText(String.format(getString(R.string.ltr_or_rtl_combine_via_space),
+ getString(fragmentMode.description),
+ Character.toLowerCase(string.charAt(0)) + string.substring(1)));
+ }
+
+ public MenuItem createMenuItem(OsmandApplication app, Menu m, int id, int titleRes, int iconId, int menuItemType,
+ boolean flipIconForRtl, int iconColor) {
+ Drawable d = iconId == 0 ? null : app.getUIUtilities().getIcon(iconId, iconColor);
+ MenuItem menuItem = m.add(0, id, 0, titleRes);
+ if (d != null) {
+ if (flipIconForRtl) {
+ d = AndroidUtils.getDrawableForDirection(app, d);
+ }
+ menuItem.setIcon(d);
+ }
+ return menuItem;
+ }
+
+ private void updateFileList(HorizontalSelectionAdapter folderAdapter) {
+ sortFileList();
adapter.setShowFolderName(showFoldersName());
- adapter.setGpxInfoList(gpxInfoList != null ? gpxInfoList : new ArrayList());
adapter.notifyDataSetChanged();
folderAdapter.notifyDataSetChanged();
}
+ private void sortFileList() {
+ List gpxInfoList = gpxInfoMap.get(selectedFolder);
+ sortSelected(gpxInfoList);
+ adapter.setGpxInfoList(gpxInfoList != null ? gpxInfoList : new ArrayList());
+ }
+
+ public void sortSelected(List gpxInfoList) {
+ Collections.sort(gpxInfoList, new Comparator() {
+ @Override
+ public int compare(GPXInfo i1, GPXInfo i2) {
+ if (tracksSortBy == TracksSortByMode.BY_NAME_ASCENDING) {
+ return i1.getFileName().toLowerCase().compareTo(i2.getFileName().toLowerCase());
+ } else if (tracksSortBy == TracksSortByMode.BY_NAME_DESCENDING) {
+ return -i1.getFileName().toLowerCase().compareTo(i2.getFileName().toLowerCase());
+ } else {
+ long time1 = i1.getLastModified();
+ long time2 = i2.getLastModified();
+ if (time1 == time2) {
+ return i1.getFileName().toLowerCase().compareTo(i2.getFileName().toLowerCase());
+ }
+ return -((time1 < time2) ? -1 : ((time1 == time2) ? 0 : 1));
+ }
+ }
+ });
+ }
+
private boolean showFoldersName() {
return allFilesFolder.equals(selectedFolder);
}
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/command/ApplyGpxApproximationCommand.java b/OsmAnd/src/net/osmand/plus/measurementtool/command/ApplyGpxApproximationCommand.java
index 99488a753e..5198faedc3 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/command/ApplyGpxApproximationCommand.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/command/ApplyGpxApproximationCommand.java
@@ -45,6 +45,7 @@ public class ApplyGpxApproximationCommand extends MeasurementModeCommand {
if (command instanceof ApplyGpxApproximationCommand) {
ApplyGpxApproximationCommand approxCommand = (ApplyGpxApproximationCommand) command;
approximation = approxCommand.approximation;
+ mode = approxCommand.mode;
applyApproximation();
refreshMap();
return true;
diff --git a/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java
index 8432080bc8..ef184307e6 100644
--- a/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java
+++ b/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java
@@ -19,6 +19,7 @@ import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
@@ -37,7 +38,6 @@ import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
-import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
@@ -63,6 +63,7 @@ import net.osmand.plus.GpxDbHelper.GpxDataItemCallback;
import net.osmand.plus.GpxSelectionHelper;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
+import net.osmand.plus.GpxSelectionHelper.SelectGpxTaskListener;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.OsmAndConstants;
import net.osmand.plus.OsmAndFormatter;
@@ -82,6 +83,7 @@ import net.osmand.plus.mapmarkers.CoordinateInputDialogFragment;
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
import net.osmand.plus.osmedit.OsmEditingPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
+import net.osmand.plus.settings.backend.OsmandSettings.TracksSortByMode;
import java.io.File;
import java.text.Collator;
@@ -133,13 +135,13 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
private View footerView;
private boolean importing = false;
private View emptyView;
- private GpxSelectionHelper.SelectGpxTaskListener gpxTaskListener;
- private boolean sortByName;
+ private SelectGpxTaskListener gpxTaskListener;
+ private TracksSortByMode sortByMode;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- gpxTaskListener = new GpxSelectionHelper.SelectGpxTaskListener() {
+ gpxTaskListener = new SelectGpxTaskListener() {
@Override
public void gpxSelectionInProgress() {
allGpxAdapter.notifyDataSetInvalidated();
@@ -160,13 +162,13 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
}
@Override
- public void onAttach(Context activity) {
+ public void onAttach(@NonNull Context activity) {
super.onAttach(activity);
this.app = (OsmandApplication) getActivity().getApplication();
- sortByName = app.getSettings().SORT_TRACKS_BY_NAME.get();
+ sortByMode = app.getSettings().TRACKS_SORT_BY_MODE.get();
final Collator collator = Collator.getInstance();
collator.setStrength(Collator.SECONDARY);
- currentRecording = new GpxInfo(getMyApplication().getSavingTrackHelper().getCurrentGpx(), getString(R.string.shared_string_currently_recording_track));
+ currentRecording = new GpxInfo(app.getSavingTrackHelper().getCurrentGpx(), getString(R.string.shared_string_currently_recording_track));
currentRecording.currentlyRecordingTrack = true;
asyncLoader = new LoadGpxTask();
selectedGpxHelper = ((OsmandApplication) activity.getApplicationContext()).getSelectedGpxHelper();
@@ -434,10 +436,10 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
}
@Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
menu.clear();
- MenuItem mi = createMenuItem(menu, SEARCH_ID, R.string.search_poi_filter, R.drawable.ic_action_search_dark, MenuItem.SHOW_AS_ACTION_ALWAYS
- | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
+ MenuItem mi = createMenuItem(menu, SEARCH_ID, R.string.search_poi_filter, R.drawable.ic_action_search_dark,
+ MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
SearchView searchView = new SearchView(getActivity());
FavoritesActivity.updateSearchView(getActivity(), searchView);
mi.setActionView(searchView);
@@ -473,6 +475,26 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
}
});
+ menu.addSubMenu(Menu.NONE, R.string.shared_string_sort, Menu.NONE, R.string.shared_string_sort);
+ final SubMenu sortMenu = menu.findItem(R.string.shared_string_sort).getSubMenu();
+ mi = sortMenu.getItem();
+ mi.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+ final int iconColorId = isLightActionBar() ? R.color.active_buttons_and_links_text_light
+ : R.color.active_buttons_and_links_text_dark;
+ mi.setIcon(getIcon(sortByMode.getIconId(), iconColorId));
+ for (final TracksSortByMode mode : TracksSortByMode.values()) {
+ mi = createMenuItem(sortMenu, mode.getNameId(), mode.getNameId(), mode.getIconId(),
+ MenuItem.SHOW_AS_ACTION_ALWAYS, false, R.color.icon_color_default_light);
+ mi.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ updateTracksSort(mode);
+ sortMenu.setIcon(getIcon(mode.getIconId(), iconColorId));
+ return false;
+ }
+ });
+ }
+
if (AndroidUiHelper.isOrientationPortrait(getActivity())) {
menu = ((FavoritesActivity) getActivity()).getClearToolbar(true).getMenu();
} else {
@@ -502,8 +524,6 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
addTrack();
}else if (itemId == R.string.coordinate_input) {
openCoordinatesInput();
- } else if (itemId == R.string.shared_string_sort) {
- updateTracksSort();
}
return true;
}
@@ -521,8 +541,6 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
.setIcon(R.drawable.ic_action_delete_dark).setListener(listener).createItem());
optionsMenuAdapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.shared_string_refresh, getActivity())
.setIcon(R.drawable.ic_action_refresh_dark).setListener(listener).createItem());
- optionsMenuAdapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.shared_string_sort, getActivity())
- .setIcon(getSortIconId(!sortByName)).setListener(listener).createItem());
OsmandPlugin.onOptionsMenuActivity(getActivity(), this, optionsMenuAdapter);
for (int j = 0; j < optionsMenuAdapter.length(); j++) {
final MenuItem item;
@@ -547,11 +565,6 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
}
}
- @DrawableRes
- private int getSortIconId(boolean sortByName) {
- return sortByName ? R.drawable.ic_action_sort_by_name : R.drawable.ic_action_list_sort;
- }
-
public void doAction(int actionResId) {
if (actionResId == R.string.shared_string_delete) {
operationTask = new DeleteGpxTask();
@@ -571,9 +584,6 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
ContextMenuItem contextMenuItem = optionsMenuAdapter.getItem(i);
if (itemId == contextMenuItem.getTitleId()) {
contextMenuItem.getItemClickListener().onContextMenuClick(null, itemId, i, false, null);
- if (itemId == R.string.shared_string_sort) {
- item.setIcon(getSortIconId(!sortByName));
- }
return true;
}
}
@@ -584,9 +594,9 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
((FavoritesActivity) getActivity()).addTrack();
}
- private void updateTracksSort() {
- sortByName = !sortByName;
- app.getSettings().SORT_TRACKS_BY_NAME.set(sortByName);
+ private void updateTracksSort(TracksSortByMode sortByMode) {
+ this.sortByMode = sortByMode;
+ app.getSettings().TRACKS_SORT_BY_MODE.set(sortByMode);
reloadTracks();
}
@@ -973,14 +983,16 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
Arrays.sort(listFiles, new Comparator() {
@Override
public int compare(File f1, File f2) {
- if (sortByName) {
+ if (sortByMode == TracksSortByMode.BY_NAME_ASCENDING) {
+ return f1.getName().compareTo(f2.getName());
+ } else if (sortByMode == TracksSortByMode.BY_NAME_DESCENDING) {
return -f1.getName().compareTo(f2.getName());
} else {
// here we could guess date from file name '2017-08-30 ...' - first part date
if (f1.lastModified() == f2.lastModified()) {
return -f1.getName().compareTo(f2.getName());
}
- return -Long.compare(f1.lastModified(), f2.lastModified());
+ return -((f1.lastModified() < f2.lastModified()) ? -1 : ((f1.lastModified() == f2.lastModified()) ? 0 : 1));
}
}
});
@@ -1078,15 +1090,20 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
Collections.sort(selected, new Comparator() {
@Override
public int compare(GpxInfo i1, GpxInfo i2) {
- if (sortByName) {
+ if (sortByMode == TracksSortByMode.BY_NAME_ASCENDING) {
return i1.getName().toLowerCase().compareTo(i2.getName().toLowerCase());
+ } else if (sortByMode == TracksSortByMode.BY_NAME_DESCENDING) {
+ return -i1.getName().toLowerCase().compareTo(i2.getName().toLowerCase());
} else {
+ if (i1.file == null || i2.file == null) {
+ return i1.getName().toLowerCase().compareTo(i2.getName().toLowerCase());
+ }
long time1 = i1.file.lastModified();
long time2 = i2.file.lastModified();
if (time1 == time2) {
return i1.getName().toLowerCase().compareTo(i2.getName().toLowerCase());
}
- return -Long.compare(time1, time2);
+ return -((time1 < time2) ? -1 : ((time1 == time2) ? 0 : 1));
}
}
});
diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java
index 4884fe616c..ee2bf6b38e 100644
--- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java
+++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java
@@ -63,6 +63,7 @@ import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.views.layers.MapControlsLayer;
+import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
@@ -185,8 +186,18 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
setupTracksCard();
} else {
- File file = new File(gpxFile.path);
- GPXInfo gpxInfo = new GPXInfo(gpxFile.path, file.lastModified(), file.length());
+ String fileName = null;
+ File file = null;
+ if (!Algorithms.isEmpty(gpxFile.path)) {
+ file = new File(gpxFile.path);
+ fileName = file.getName();
+ } else if (!Algorithms.isEmpty(gpxFile.tracks)) {
+ fileName = gpxFile.tracks.get(0).name;
+ }
+ if (Algorithms.isEmpty(fileName)) {
+ fileName = app.getString(R.string.shared_string_gpx_track);
+ }
+ GPXInfo gpxInfo = new GPXInfo(fileName, file != null ? file.lastModified() : 0, file != null ? file.length() : 0);
TrackEditCard importTrackCard = new TrackEditCard(mapActivity, gpxInfo);
importTrackCard.setListener(this);
cardsContainer.addView(importTrackCard.build(mapActivity));
@@ -207,7 +218,7 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
reverseTrackCard.setListener(this);
cardsContainer.addView(reverseTrackCard.build(mapActivity));
}
- if (!gpxFile.hasRtePt()) {
+ if (!gpxFile.hasRtePt() && !gpxFile.hasRoute()) {
cardsContainer.addView(buildDividerView(cardsContainer, true));
AttachTrackToRoadsCard attachTrackCard = new AttachTrackToRoadsCard(mapActivity);
@@ -349,7 +360,9 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
@Override
public void onDestroyView() {
super.onDestroyView();
- exitTrackAppearanceMode();
+ if (!editingTrack) {
+ exitTrackAppearanceMode();
+ }
onDismiss();
}
@@ -542,7 +555,7 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
if (useAppMode) {
editingContext.setAppMode(app.getRoutingHelper().getAppMode());
}
- MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), editingContext, true, true);
+ MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), editingContext, true);
}
}
diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java
index f0216f1c9d..69bed394cc 100644
--- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java
+++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java
@@ -1760,8 +1760,13 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
if (routeParams != null) {
TargetPoint target = app.getTargetPointsHelper().getPointToNavigate();
if (target != null) {
- PointDescription pointDescription = target.getOriginalPointDescription();
- return pointDescription != null && routeParams.getFile().path.equals(pointDescription.getTypeName());
+ List points = routeParams.getPoints(app);
+ if (!Algorithms.isEmpty(points)) {
+ Location loc = points.get(points.size() - 1);
+ LatLon latLon = new LatLon(loc.getLatitude(), loc.getLongitude());
+ LatLon targetLatLon = new LatLon(target.getLatitude(), target.getLongitude());
+ return latLon.equals(targetLatLon);
+ }
}
}
}
diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/NavigateTrackOptionsCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/NavigateTrackOptionsCard.java
index 4e3adfa29e..b2b819d269 100644
--- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/NavigateTrackOptionsCard.java
+++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/NavigateTrackOptionsCard.java
@@ -11,8 +11,8 @@ import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.LocalRoutingParameter;
import static net.osmand.plus.UiUtilities.CustomRadioButtonType;
-import static net.osmand.plus.UiUtilities.CustomRadioButtonType.LEFT;
-import static net.osmand.plus.UiUtilities.CustomRadioButtonType.RIGHT;
+import static net.osmand.plus.UiUtilities.CustomRadioButtonType.START;
+import static net.osmand.plus.UiUtilities.CustomRadioButtonType.END;
public class NavigateTrackOptionsCard extends BaseCard {
@@ -45,7 +45,7 @@ public class NavigateTrackOptionsCard extends BaseCard {
TextView description = parameterView.findViewById(R.id.description);
boolean enabled = passWholeRoute.isSelected(app.getSettings());
- CustomRadioButtonType buttonType = enabled ? LEFT : RIGHT;
+ CustomRadioButtonType buttonType = enabled ? START : END;
UiUtilities.updateCustomRadioButtons(app, buttonsView, nightMode, buttonType);
leftButton.setText(R.string.start_of_the_track);
@@ -56,7 +56,7 @@ public class NavigateTrackOptionsCard extends BaseCard {
@Override
public void onClick(View v) {
if (!passWholeRoute.isSelected(app.getSettings())) {
- applyParameter(parameterView, passWholeRoute, LEFT, true);
+ applyParameter(parameterView, passWholeRoute, START, true);
}
}
});
@@ -64,7 +64,7 @@ public class NavigateTrackOptionsCard extends BaseCard {
@Override
public void onClick(View v) {
if (passWholeRoute.isSelected(app.getSettings())) {
- applyParameter(parameterView, passWholeRoute, RIGHT, false);
+ applyParameter(parameterView, passWholeRoute, END, false);
}
}
});
@@ -81,14 +81,14 @@ public class NavigateTrackOptionsCard extends BaseCard {
rightButton.setText(app.getRoutingHelper().getAppMode().toHumanString());
boolean enabled = navigationType.isSelected(app.getSettings());
- CustomRadioButtonType buttonType = enabled ? RIGHT : LEFT;
+ CustomRadioButtonType buttonType = enabled ? END : START;
UiUtilities.updateCustomRadioButtons(app, buttonsView, nightMode, buttonType);
leftButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (navigationType.isSelected(app.getSettings())) {
- applyParameter(parameterView, navigationType, LEFT, false);
+ applyParameter(parameterView, navigationType, START, false);
}
}
});
@@ -96,7 +96,7 @@ public class NavigateTrackOptionsCard extends BaseCard {
@Override
public void onClick(View v) {
if (!navigationType.isSelected(app.getSettings())) {
- applyParameter(parameterView, navigationType, RIGHT, true);
+ applyParameter(parameterView, navigationType, END, true);
}
}
});
diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java
index df6a6eaafa..a6dcc20fca 100644
--- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java
+++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java
@@ -356,17 +356,6 @@ public class RouteCalculationResult {
}
lastHeight = h;
}
- // FIXME: investigate gpx file
- if (s.getObject().getPoint31XTile(i) == 0 && s.getObject().getPoint31YTile(i) == 0) {
- if (locations.size() > 0) {
- Location prev = locations.get(locations.size() - 1);
- n.setLatitude(prev.getLatitude());
- n.setLongitude(prev.getLongitude());
- if (prev.hasAltitude()) {
- n.setAltitude(prev.getAltitude());
- }
- }
- }
locations.add(n);
attachAlarmInfo(alarms, s, i, locations.size());
segmentsToPopulate.add(s);
diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java
index a860d4c65c..e41c7d58df 100644
--- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java
+++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java
@@ -2506,6 +2506,7 @@ public class OsmandSettings {
public final OsmandPreference SHOW_COORDINATES_WIDGET = new BooleanPreference("show_coordinates_widget", false).makeProfile().cache();
public final CommonPreference NOTES_SORT_BY_MODE = new EnumStringPreference<>("notes_sort_by_mode", NotesSortByMode.BY_DATE, NotesSortByMode.values());
+ public final CommonPreference TRACKS_SORT_BY_MODE = new EnumStringPreference<>("tracks_sort_by_mode", TracksSortByMode.BY_DATE, TracksSortByMode.values());
public final OsmandPreference ANIMATE_MY_LOCATION = new BooleanPreference("animate_my_location", true).makeProfile().cache();
@@ -3936,9 +3937,6 @@ public class OsmandSettings {
public final CommonPreference FAVORITES_TAB =
new IntPreference("FAVORITES_TAB", 0).makeGlobal().cache();
- public final CommonPreference SORT_TRACKS_BY_NAME
- = new BooleanPreference("sort_tracks_by_name", true).makeGlobal().cache();
-
public final CommonPreference OSMAND_THEME =
new IntPreference("osmand_theme", OSMAND_LIGHT_THEME) {
@Override
@@ -4105,6 +4103,38 @@ public class OsmandSettings {
}
}
+ public enum TracksSortByMode {
+ BY_DATE(R.string.sort_last_modified, R.drawable.ic_action_time_start),
+ BY_NAME_ASCENDING(R.string.sort_name_ascending, R.drawable.ic_action_sort_by_name_ascending),
+ BY_NAME_DESCENDING(R.string.sort_name_descending, R.drawable.ic_action_sort_by_name_descending);
+
+ private final int iconId;
+ private final int nameId;
+
+ TracksSortByMode(int nameId, int iconId) {
+ this.nameId = nameId;
+ this.iconId = iconId;
+ }
+
+ public boolean isByName() {
+ return this == BY_NAME_ASCENDING || this == BY_NAME_DESCENDING;
+ }
+
+ public boolean isByDate() {
+ return this == BY_DATE;
+ }
+
+ @StringRes
+ public int getNameId() {
+ return nameId;
+ }
+
+ @DrawableRes
+ public int getIconId() {
+ return iconId;
+ }
+ }
+
public enum MapMarkersMode {
TOOLBAR(R.string.shared_string_topbar),
WIDGETS(R.string.shared_string_widgets),
diff --git a/OsmAnd/src/net/osmand/plus/settings/preferences/SizePreference.java b/OsmAnd/src/net/osmand/plus/settings/preferences/SizePreference.java
index 67120bf7c6..d950b56ed5 100644
--- a/OsmAnd/src/net/osmand/plus/settings/preferences/SizePreference.java
+++ b/OsmAnd/src/net/osmand/plus/settings/preferences/SizePreference.java
@@ -7,6 +7,9 @@ import androidx.preference.DialogPreference;
import net.osmand.plus.R;
import net.osmand.plus.settings.bottomsheets.VehicleSizeAssets;
+import org.apache.commons.lang3.StringUtils;
+
+import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
@@ -87,10 +90,13 @@ public class SizePreference extends DialogPreference {
public CharSequence getSummary() {
String summary = entries[0];
String persistedString = getValue();
- if (!persistedString.equals(defaultValue)) {
+ if (StringUtils.isBlank(persistedString)) {
+ return summary;
+ }
+ if (!isPersistedStringEqualsZero(persistedString)) {
try {
final DecimalFormat df = new DecimalFormat("#.####", new DecimalFormatSymbols(Locale.US));
- persistedString = df.format(Float.parseFloat(persistedString) + 0.01f);
+ persistedString = df.format(Double.parseDouble(persistedString) + 0.01d);
summary = String.format(getContext().getString(R.string.ltr_or_rtl_combine_via_space),
persistedString, getContext().getString(assets.getMetricShortRes()));
} catch (NumberFormatException e) {
@@ -100,7 +106,11 @@ public class SizePreference extends DialogPreference {
return summary;
}
- public String getValue() {
+ private boolean isPersistedStringEqualsZero(String persistedString) {
+ return BigDecimal.ZERO.compareTo(new BigDecimal(persistedString)) == 0;
+ }
+
+ public String getValue () {
return getPersistedString(defaultValue);
}
}
diff --git a/OsmAnd/src/net/osmand/plus/srtmplugin/TerrainFragment.java b/OsmAnd/src/net/osmand/plus/srtmplugin/TerrainFragment.java
index f1517bbaea..b613d2ba13 100644
--- a/OsmAnd/src/net/osmand/plus/srtmplugin/TerrainFragment.java
+++ b/OsmAnd/src/net/osmand/plus/srtmplugin/TerrainFragment.java
@@ -291,9 +291,9 @@ public class TerrainFragment extends BaseOsmAndFragment implements View.OnClickL
private void adjustModeButtons(TerrainMode mode) {
if (mode == SLOPE) {
- UiUtilities.updateCustomRadioButtons(app, customRadioButton, nightMode, RIGHT);
+ UiUtilities.updateCustomRadioButtons(app, customRadioButton, nightMode, END);
} else {
- UiUtilities.updateCustomRadioButtons(app, customRadioButton, nightMode, LEFT);
+ UiUtilities.updateCustomRadioButtons(app, customRadioButton, nightMode, START);
}
}
diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java
index 21277e2426..f1c3c1f13a 100644
--- a/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java
@@ -1068,6 +1068,17 @@ public class MapControlsLayer extends OsmandMapLayer {
}
}
+ public void updateTransparencySlider () {
+ LayerTransparencySeekbarMode seekbarMode = settings.LAYER_TRANSPARENCY_SEEKBAR_MODE.get();
+ if (OsmandPlugin.getEnabledPlugin(OsmandRasterMapsPlugin.class) != null) {
+ if (seekbarMode == LayerTransparencySeekbarMode.OVERLAY && settings.MAP_OVERLAY.get() != null) {
+ transparencySlider.setValue(settings.MAP_OVERLAY_TRANSPARENCY.get());
+ } else if (seekbarMode == LayerTransparencySeekbarMode.UNDERLAY && settings.MAP_UNDERLAY.get() != null) {
+ transparencySlider.setValue(settings.MAP_TRANSPARENCY.get());
+ }
+ }
+ }
+
public void showTransparencyBar(CommonPreference transparenPreference,
boolean isTransparencyBarEnabled) {
this.isTransparencyBarEnabled = isTransparencyBarEnabled;