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 Iterable data() throws IOException { - String fileName = "/test_routing.json"; - Reader reader = new InputStreamReader(RouteTestingTest.class.getResourceAsStream(fileName)); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - TestEntry[] testEntries = gson.fromJson(reader, TestEntry[].class); - ArrayList arrayList = new ArrayList<>(); - for(TestEntry te : testEntries) { - if(te.isIgnore()) { - continue; - } - arrayList.add(new Object[] {te.getTestName(), te}); - } - reader.close(); - return arrayList; + @Parameterized.Parameters(name = "{index}: {0}") + public static Iterable data() throws IOException { + String fileName = "/test_routing.json"; + Reader reader = new InputStreamReader(RouteTestingTest.class.getResourceAsStream(fileName)); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + TestEntry[] testEntries = gson.fromJson(reader, TestEntry[].class); + ArrayList arrayList = new ArrayList<>(); + for (TestEntry te : testEntries) { + if (te.isIgnore()) { + continue; + } + arrayList.add(new Object[]{te.getTestName(), te}); + } + reader.close(); + return arrayList; - } + } - @Test + @Test public void testRouting() throws Exception { String fl = "src/test/resources/Routing_test.obf"; RandomAccessFile raf = new RandomAccessFile(fl, "r"); RoutePlannerFrontEnd fe = new RoutePlannerFrontEnd(); - BinaryMapIndexReader[] binaryMapIndexReaders = { new BinaryMapIndexReader(raf, new File(fl)) }; + BinaryMapIndexReader[] binaryMapIndexReaders;// = { new BinaryMapIndexReader(raf, new File(fl)) }; RoutingConfiguration.Builder builder = RoutingConfiguration.getDefault(); Map params = te.getParams(); + if (params.containsKey("map")) { + String fl1 = "src/test/resources/" + params.get("map"); + RandomAccessFile raf1 = new RandomAccessFile(fl1, "r"); + binaryMapIndexReaders = new BinaryMapIndexReader[]{ + new BinaryMapIndexReader(raf1, new File(fl1)), + new BinaryMapIndexReader(raf, new File(fl)) + }; + } else { + binaryMapIndexReaders = new BinaryMapIndexReader[]{new BinaryMapIndexReader(raf, new File(fl))}; + } RoutingConfiguration config = builder.build(params.containsKey("vehicle") ? params.get("vehicle") : "car", RoutingConfiguration.DEFAULT_MEMORY_LIMIT * 3, params); RoutingContext ctx = fe.buildRoutingContext(config, null, binaryMapIndexReaders, @@ -102,6 +113,4 @@ public class RouteTestingTest { } - - } diff --git a/OsmAnd-telegram/res/values-fr/strings.xml b/OsmAnd-telegram/res/values-fr/strings.xml index bc2bbd3d99..4397948508 100644 --- a/OsmAnd-telegram/res/values-fr/strings.xml +++ b/OsmAnd-telegram/res/values-fr/strings.xml @@ -266,4 +266,5 @@ Cacher les contacts qui ne se sont pas déplacés depuis un temps donné. Définissez l\'heure à laquelle les contacts et groupes sélectionnés verront votre position en temps réel. OsmAnd connect + depuis \ No newline at end of file diff --git a/OsmAnd/build.gradle b/OsmAnd/build.gradle index c67ed0f3b8..3633e5342e 100644 --- a/OsmAnd/build.gradle +++ b/OsmAnd/build.gradle @@ -526,7 +526,7 @@ dependencies { implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.gridlayout:gridlayout:1.0.0' implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.2.1' implementation 'androidx.browser:browser:1.0.0' implementation 'androidx.preference:preference:1.1.0' diff --git a/OsmAnd/res/layout/bottom_sheet_plan_route_select_file.xml b/OsmAnd/res/layout/bottom_sheet_plan_route_select_file.xml index 362dacf2c6..10de9cb667 100644 --- a/OsmAnd/res/layout/bottom_sheet_plan_route_select_file.xml +++ b/OsmAnd/res/layout/bottom_sheet_plan_route_select_file.xml @@ -6,33 +6,59 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + android:orientation="horizontal"> - + + + + + + + + + اللغة المحددة غير مدعومة من قبل محرك أندرويد لتحويل النص إلى كلام (TTS). ستُستخدم اللغة السابقة في المحرك ، هل تريد البحث عن محركات أخرى في السوق؟ البيانات ناقصة لا توجد بيانات مُثبّتة للغة المحددة. هل تريد أن تذهب إلى السوق لتثبيتها؟ - عكس المسار + عكس اتجاه المسار استخدم الوجهة الحالية يمر على طول المسار باكمله خريطة التنقل المتوفرة حاليا لهذا الموقع. diff --git a/OsmAnd/res/values-be/phrases.xml b/OsmAnd/res/values-be/phrases.xml index b801ecedb5..f96eaef3ab 100644 --- a/OsmAnd/res/values-be/phrases.xml +++ b/OsmAnd/res/values-be/phrases.xml @@ -3843,4 +3843,5 @@ Затрымка Маленькія электрапрыборы Вулей + Крама арэхаў \ No newline at end of file diff --git a/OsmAnd/res/values-be/strings.xml b/OsmAnd/res/values-be/strings.xml index c80bd4dfe0..0696333fe4 100644 --- a/OsmAnd/res/values-be/strings.xml +++ b/OsmAnd/res/values-be/strings.xml @@ -657,7 +657,7 @@ Абраная мова не падтрымліваецца Android TTS (пераўтварэнне тэксту ў гук), таму будзе выкарыстоўвацца прадвызначаная мова TTS. Пашукаць іншы TTS у краме\? Даныя адсутнічаюць Перайсці ў краму, каб спампаваць абраную мову\? - Развярнуць кірунак GPX + Развярнуць кірунак следу Выкарыстоўваць дзейны пункт прызначэння Прайсці ўвесь шлях Для гэтага рэгіёну даступныя лакальныя вектарныя мапы. diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index 4ae94a57c7..ce8fda7ac6 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -3806,7 +3806,7 @@ Abasta l\'àrea: %1$s x %2$s Afegeix a un fitxer de traces Traces Enregistra el trajecte a un fitxer GPX - Navegua des de la meva ubicació fins a la traça + Navega des de la meva ubicació fins a la traça Afegeix una adreça Nom del fitxer REC @@ -3815,4 +3815,8 @@ Abasta l\'àrea: %1$s x %2$s Traça simplificada Només es desarà la línia del trajecte, les fites s\'esborraran. %s arxius de traces seleccionats + Desa en un nou fitxer de traces + Traces + Importa o enregistra fitxers de traces + Trieu un fitxer de traces a seguir o importeu-lo des del dispositiu. \ No newline at end of file diff --git a/OsmAnd/res/values-cs/phrases.xml b/OsmAnd/res/values-cs/phrases.xml index 6c95767d54..e63732cdc6 100644 --- a/OsmAnd/res/values-cs/phrases.xml +++ b/OsmAnd/res/values-cs/phrases.xml @@ -983,7 +983,7 @@ Rozcestník Kuchyně Síranová - Charakteristika vody: bahnitá + Bahno Minerální Bez čerpadla Poháněné @@ -1156,7 +1156,7 @@ Ano Bez značení pro nevidomé Ano - Ne + Zvuk: ne Pouze pokud je chůze povolena Záchranná stanice Odpočívadlo se službami @@ -1258,7 +1258,7 @@ Vyzvednutí balíků Mléko Žvýkačky - Parkovací lístky; lístky na veřejnou dopravu + Parkovací lístky a lístky na veřejnou dopravu Káva Automat na mýto Hračky @@ -1588,13 +1588,13 @@ Žádné opravy Opravy elektrických vozidel Ano - Bez samoobsluhy + Ne Ano Neautomatizované Všechny služby Ano Bez kartáčů: ne - Automyčka: ne + Ne Veřejná sprcha Muži Zakázané pro muže @@ -1955,7 +1955,7 @@ Plány veřejné dopravy Pobočka Stéla - Ve tvaru kříže + Tvar kříže Kameny zmizelých Stúpa Tuf @@ -2005,7 +2005,7 @@ Palivo 100LL LPG Palivo tryskové A-1 - Palivo AdBlue + Dieselové kapalné aditivum Palivo: dřevo Palivo: dřevěné uhlí Palivo: uhlí @@ -3804,7 +3804,44 @@ Výška vody: nad střední hladinou Výška vody: pod střední hladinou Překážka - Doplňování pitné vody: ano + Ano Doplňování pitné vody: ne Sít doplňování pitné vody + Včelí úl + Data v reálném čase + Ano + Výtah + Městská část + Obchod se suchými plody + Jízdní řád + Zpoždění + Odjezdová tabule: ne + Městský blok + Darovací místo + Šipka: ne + Ano + Ano + Vibrace: ne + Stav pumpy: chybí rukojeť + Sání + Pod tlakem + Podzemní voda + Roura + Internetový přístup: zdarma pro zákazníky + Typ klášteru: řeholnický + Typ klášteru: poustevnický + Typ klášteru: kanovnický + Typ klášteru: mnišský + Výběr hotovosti: u samoobslužné pokladny + Výběr hotovosti: u pokladny + Poplatek + Taxi kancelář + Polní hořák; fléra + Dosahující k moři + Malá elektrická zařízení + Odjezdová tabule + Doplňování pitné vody + Šipka + Vibrace + Tlak \ No newline at end of file diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index 14173b1d76..d091dc7fd5 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -3845,4 +3845,6 @@ Anzeige der Abreisezeiten Nachfüllen von Trinkwasser Bienenstock + Kleine Elektrogeräte + Nussladen \ No newline at end of file diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 730f97c489..ba12de339b 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -3780,7 +3780,7 @@ Blitzer-Warnungen sind in einigen Ländern gesetzlich verboten. Peilung %1$s gelöscht - Ein Neustart ist erforderlich, um Blitzerdaten vollständig zu löschen. + Starten Sie die Anwendung neu, um alle Blitzerdaten zu löschen. Deinstallieren und neu starten In einigen Ländern oder Regionen ist die Verwendung von Blitzer-Warneinrichtungen gesetzlich verboten. \n @@ -3793,26 +3793,26 @@ Längenbegrenzung Diese App hat keine Informationen zu Blitzern. Inline-Skates - Aktivieren Sie die Steuerung der Zoomstufe der Karte mit den Lautstärketasten des Geräts. + Steuern Sie die Zoomstufen der Karte mit den Lautstärketasten des Geräts. Lautstärketasten als Zoom Bitte geben Sie Ihre Fahrzeuglänge an. Für lange Fahrzeuge könnten einige Streckenabschnitte nicht befahrbar sein. - Nächsten Zielpunkt löschen + Nächstgelegenen Zielpunkt löschen Bitte geben Sie einen Namen für das Profil an Der aktuelle Punkt auf der Route wird gelöscht. Wenn es das Ziel ist, wird die Navigation gestoppt. Wikipedia-Karten herunterladen - Informationen über Sehenswürdigkeiten erhalten Sie bei Wikipedia. Es ist Ihr Offline-Wegweiser für die Hosentasche - aktivieren Sie einfach das Wikipedia-Modul und genießen Sie Artikel über Objekte in Ihrer Umgebung. + Info über Sehenswürdigkeiten erhalten Sie bei Wikipedia. Es ist Ihr Offline-Wegweiser für die Hosentasche - aktivieren Sie einfach das Wikipedia-Modul und genießen Sie Artikel über Objekte in Ihrer Umgebung. Enduro Motorroller Rollstuhl Go-Kart Geschlossene OSM-Notiz Rollstuhl vorwärts - Zum Fortfahren müssen die Arbeitstage gesetzt sein + Zum Fortfahren bitte Arbeitstage auswählen Route zwischen Punkten Eine Route planen Zu einem Track hinzufügen Der hinzugefügte Punkt wird auf der Karte nicht sichtbar sein, da die ausgewählte Gruppe ausgeblendet ist, Sie können ihn in \"%s\" finden. - Start-Ziel-Symbole anzeigen + Start- und Ziel-Symbole anzeigen Breite auswählen Wählen Sie das Intervall, in dem Markierungen mit Abstand oder Zeit auf dem Track angezeigt werden. Wählen Sie die gewünschte Aufteilungsoption: nach Zeit oder nach Entfernung. @@ -3831,7 +3831,7 @@ Route umkehren Der gesamte Track wird mit dem ausgewählten Profil neu berechnet. Nur das nächste Segment wird mit dem ausgewählten Profil neu berechnet. - Wählen Sie, wie Punkte mit einer geraden Linie verbunden werden sollen, oder berechnen Sie eine Route zwischen ihnen mit dem ausgewählten Profil. + Wählen Sie, wie Punkte verbunden werden sollen; durch eine gerade Linie, oder eine berechnete Route zwischen ihnen, wie unten angegeben. Ganzer Track Nächstes Segment Navigationsprofil @@ -3841,7 +3841,7 @@ Adresse hinzufügen Adresse eingeben Bilder auf Straßenebene - Sind Sie sicher, die Routenplanung ohne speichern beenden zu wollen\? Sie werden alle Änderungen verlieren. + Sind Sie sicher, dass Sie alle Änderungen an der geplanten Route verwerfen wollen, indem Sie sie schließen\? Routentyp davor ändern Routentyp danach ändern Davor trimmen @@ -3854,7 +3854,7 @@ Track-Wegpunkt hinzufügen Streckenaufzeichnung Track folgen - Von meinem Standort zum Track navigieren + Von meiner Position zum Track navigieren Startpunkt des Tracks Auf Straßen einrasten Vereinfachter Track @@ -3873,7 +3873,7 @@ wird gespeichert Während der Navigation automatisch Track aufzeichnen Track Route - Track Datei zum Folgen auswählen, oder importieren. + Track Datei zum Folgen auswählen, oder vom Gerät importieren. Die GPX-Aufzeichnung wird angehalten, wenn OsmAnd beendet wird (über „zuletzt verwendete Apps“). (Die Hintergrunddienst-Anzeige verschwindet aus der Android-Benachrichtigungsleiste.) Aufzeichnungsintervall für die generelle Track-Aufzeichnung festlegen (via Schaltfläche \'GPX\' auf dem Kartenbildschirm). Um diese Option nutzen zu können, muss OsmAnd den Track auf die Straßen der Karte einrasten. @@ -3892,4 +3892,19 @@ Track-Punkt, zu dem navigiert werden soll Nächstgelegener Punkt Wiederholen + • Aktualisierte Funktion zum Planen einer Route: erlaubt die Verwendung verschiedener Navigationstypen pro Segment und die Einbeziehung von Tracks +\n +\n • Neues Menü zum Erscheinungsbild von Tracks: Wählen Sie Farbe, Dicke, Richtungspfeile, Start-/Ziel-Symbole +\n +\n • Verbesserte Darstellung von Fahrradknotenpunkten. +\n +\n • Tracks sind jetzt antippbar und haben ein Kontextmenü mit grundlegenden Informationen. +\n +\n • Verbesserte Suchalgorithmen +\n +\n • Verbesserte Trackverfolgungsoptionen in der Navigation +\n +\n • Probleme beim Import/Export von Profileinstellungen behoben +\n +\n \ No newline at end of file diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml index cc31985829..ac3f84fe04 100644 --- a/OsmAnd/res/values-eo/phrases.xml +++ b/OsmAnd/res/values-eo/phrases.xml @@ -831,7 +831,7 @@ Rostilo Laborejo de agrokulturaj maŝinoj Laborejo de korbisto - Abelistejo + Abelejo Forĝejo Bierfarejo Boat-konstruejo @@ -849,7 +849,7 @@ Poŝ-horloĝistejo Varmizolaĵistejo Laborejo de juvelisto - Seruristejo + Laborejo de seruristo Ŝlosil-kopiistejo Laborejo de metal-konstruaĵisto Okulvitristejo @@ -1852,7 +1852,7 @@ Oficejo de konsilado Oficejo de kunlaborado Oficejo de arbarkultivo - Oficejo de provizarto + Oficejo de ekspedo Oficejo de paroĥo Oficejo de eldonisto benzino 91-oktannombra senplumba @@ -3031,7 +3031,7 @@ Bestonutrejo Okazaĵaj-provizoj-vendejo Elektraĵ-vendejo - Seruristejo + Laborejo de seruristo Prilumigad-aparata vendejo Loteri-bileta kiosko Hazardludejo @@ -3719,7 +3719,7 @@ Bakejo (ne vendejo) Laborejo de meblisto Pago - Dombesta beligejo + Hejmbesta beligejo Bankaŭtomato: jes Elpago de mono Elpago de mono: jes diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index 6b55481e6e..99f789d362 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -1129,7 +1129,7 @@ El idioma elegido es incompatible con el motor TTS (texto a voz) instalado en Android, se usará el idioma TTS predefinido. ¿Buscar otro motor TTS en la tienda de aplicaciones\? Faltan datos ¿Ir a la tienda de aplicaciones para descargar el idioma elegido? - Invertir la dirección GPX + Invertir la dirección de la traza Usar destino actual Pasar a lo largo de la traza completa Mapa vectorial presente para esta ubicación. @@ -3904,4 +3904,7 @@ \n • Se han solucionado los problemas de la importación y exportación en los ajustes de los perfiles \n \n + Último modificado + Nombre: Z – A + Nombre: A – Z \ No newline at end of file diff --git a/OsmAnd/res/values-et/phrases.xml b/OsmAnd/res/values-et/phrases.xml index dc8cbbac79..6d72d50576 100644 --- a/OsmAnd/res/values-et/phrases.xml +++ b/OsmAnd/res/values-et/phrases.xml @@ -3,7 +3,7 @@ Pood Hädaabi Transport - Käsitsi tehtud + Rajatis Haridus Administratiiv Tervishoid diff --git a/OsmAnd/res/values-et/strings.xml b/OsmAnd/res/values-et/strings.xml index fea216bce3..f05f7fbf4c 100644 --- a/OsmAnd/res/values-et/strings.xml +++ b/OsmAnd/res/values-et/strings.xml @@ -811,7 +811,7 @@ Ärka pöördel Reguleeri kui kaua ekraan peaks olema sisse lülitatud. Kasuta lähedusandurit - Liiguta oma kätt üle ekraani ülaosa selle navigeerimise ajal sisse lülitamiseks. + Käe liigutamine üle ekraani lülitab selle sisse. 1. järk 2. järk 3. järk @@ -879,7 +879,7 @@ Analüütika Kuva navigeerimise ajal lukustuskuval kaarti. Marsruutimise seaded valitud profiilis \"%1$s\". - Ärkamisaeg + Aegumine peale ärkamist Ühikud ja formaadid Välimus Kaardi välimus @@ -1200,11 +1200,11 @@ Raja salvestamine Rajalõigud Rajapunktid - Selle lisaga saad ligipääsu mitut liiki veebikaartidele (nn paanid või rasterkaardid), alates eelnevalt määratletud OpenStreetMap-i paanidest (nagu Mapnik) kuni satelliidipiltide ja eriotstarbeliste kihtideni nagu ilmakaardid, kliimakaardid, geoloogilised kaardid, künklikihi kihid jne. -\n -\nKõiki neid kaarte saab kasutada kas peamise (põhi) kaardina, mida kuvatakse OsmAnd kaardil, või ülekattena või aluskihina mõnele muule põhikaardile (nagu OsmAndi standardsed võrguühenduseta kaardid). Mis tahes aluskihi paremini nähtavamaks muutmiseks saab OsmAndi vektorkaartide teatud elemente soovi korral hõlpsalt peita menüü \'Kaardi seadistamine\' abil. -\n -\nPlaatide kaarte saab hankida otse veebiallikatest või neid saab võrguühenduseta kasutamiseks ette valmistada (ja käsitsi kopeerida OsmAndi andmekataloogi) SQLite andmebaasina, mida saab toota mitmesuguste kolmandate osapoolte kaardi ettevalmistamise tööriistade abil. + Selle lisaga saad ligipääsu mitut liiki veebikaartidele (nn paanid või rasterkaardid), alates eelnevalt määratletud OpenStreetMap-i paanidest (nagu Mapnik) kuni satelliidipiltide ja eriotstarbeliste kihtideni nagu ilmakaardid, kliimakaardid, geoloogilised kaardid, künklikihi kihid jne. +\n +\nKõiki neid kaarte saad kasutada kas peamise (põhi) kaardina, mida kuvatakse OsmAnd kaardil, või ülekattena või aluskihina mõnele muule põhikaardile (nagu OsmAndi standardsed võrguühenduseta kaardid). Mis tahes aluskihi paremini nähtavamaks muutmiseks saad OsmAndi vektorkaartide teatud elemente soovi korral hõlpsalt peita menüü „Kaardi seadistamine“ abil. +\n +\nKaardipaane saad hankida otse veebiallikatest või neid saad võrguühenduseta kasutamiseks ette valmistada (ja käsitsi kopeerida OsmAndi andmekataloogi) SQLite andmebaasina, mida võid luua mitmesuguste kolmandate osapoolte kaardi ettevalmistamise tööriistade abil. Kõrgusjoonte lisa OsmAnd lisa võrguühenduseta kõrgusjoontele Kõrgusjooned @@ -1511,14 +1511,14 @@ Maailma aluskaart Versioon: Versiooni info, litsentsid, projekti liikmed - Suurendab laetud: %1$s - Aegub (minutit): %1$s + Allalaetud suumitasemed: %1$s + Aegumine (minutites): %1$s Alla laetav: %1$s Maksimaalne suurendus: %1$s Minimaalne suurendus: %1$s - Elliptiline merkator + Mercatori elliptiline projektsioon Maksimaalne suurendus - Aegumine (minutit) + Aegumine (minutites) Minimaalne suurendus URL Vali olemasolev… @@ -1529,7 +1529,7 @@ Ameerika Ühendriigid Kanada Euroopa, Aasia, Ladina-Ameerika ja sarnased - UK, India, Austraalia ja sarnased + Suurbritannia, India, Austraalia ja sarnased Teata… Tänavanimed (TTS) Kiiruspiirang @@ -2018,7 +2018,7 @@ Mittetoetatud keel Puuduvad andmed Mine turule valitud keele alla laadimiseks\? - Vastupidine GPX suund + Raja vastupidine suund Kasuta olemasoleva sihtkohta Mööda kogu rada Hääljuhiste väljund @@ -2417,7 +2417,7 @@ Vajalik kaartide alla laadimiseks. Asukoha otsing… Vaba ruum - OsmAnd andmekasutus (kaardid, GPX failid, jne.): %1$s. + OsmAnd\'i andmekasutus (kaardid, rajafailid, jne.): %1$s. Anna luba Anna ligipääs asukohale Hangi juhiseid ja avasta uusi kohti ilma internetiühenduseta @@ -2468,10 +2468,10 @@ Salvesta Andmed puuduvad Lülita sisse kiire salvestamine - Kuva teekonna salvestamist lubav süsteemi märguanne. + Kuva teekonna salvestamise algust lubav süsteemi märguanne. Märguanded - Sul pole veel ühtegi GPX faili - Võid lisada kausta ka GPX faile + Sul pole veel ühtegi rajafaili + Võid lisada kausta ka rajafaile Lisa veel… Välimus Peen @@ -2674,9 +2674,9 @@ Määra teedel lubatud sõiduki laius. Simuleeri oma asukohta kasutades salvestatud GPX rada. Nupp ekraani keskkoha lähtekohaks muutmiseks. Seejärel on kas võimalik valida sihtkohta või alustada teekonna arvutamist. - See lisa aktiveerib radade salvestamise funktsionaalsuse, puudutades käsitsi kaardil GPX logimisvidinat või logides automaatselt kõik oma navigeerimise marsruudid GPX faili. + See lisa aktiveerib radade salvestamise funktsionaalsuse, puudutades käsitsi kaardil GPX logimisvidinat või logides automaatselt kõik oma teekonnad GPX faili. \n -\nSalvestatud radu saab jagada oma sõpradega või kasutada OSM kaastöödeks. Sportlased saavad kasutada salvestatud radu oma treeningute jälgimiseks. Mõningast raja põhianalüüsi saab teha otse OsmAnd sees, näiteks ringiajad, keskmine kiirus jne. Lisaks muidugi saab radu hiljem analüüsia ka spetsiaalsetete 3. osapoolte analüüsitööriistadega. +\nSalvestatud radu saad jagada oma sõpradega või kasutada OSM kaastöödeks. Sportlased saavad kasutada salvestatud radu oma treeningute jälgimiseks. Mõningast raja põhianalüüsi saad teha otse OsmAnd sees, näiteks ringiajad, keskmine kiirus jne. Lisaks muidugi saad radu hiljem analüüsida ka spetsiaalsetete kolmandate osapoolte analüüsitööriistadega. See lisa pakub nii kõrgusjoonte ülekatte kui ka (reljeefse) künkavarjutuse kihi, mida kuvatakse OsmAnd standardkaartidel. Seda funktsionaalsust hindavad sportlased, matkajad, rändajad ja kõik teised, kes on huvitatud maastiku reljeefstruktuurist. \n \nGlobaalsed andmed (vahemikus 70 ° põhja ja 70 ° lõuna) põhinevad mõõtmistel, mille on teinud SRTM (süstiku radari topograafiamissioon) ja ASTER (täiustatud kosmose termilise kiirguse ja peegelduse radiomeeter), NASA maavaatlussatelliitide süsteemi lipulaeva Terra pardal olev pildistamisinstrument. ASTER on NASA, Jaapani majandus-, kaubandus- ja tööstusministeeriumi (METI) ja Jaapani kosmosesüsteemide (J-kosmosesüsteemid) koostöö. @@ -2707,9 +2707,9 @@ \nNii asukoht kui aeg on nähtavad nii OsmAnd armatuurlaual kui kaardi vidinas. Meeldetuletust saab lisada Androidi kalendrisse. Muuda kauguse mõõtmise ühikuid. Selleks, et reise kavandada ja punktide vahelist kaugust mõõta, loo teekondi kaardil koputades või olemasolevaid GPX-faile kasutades, Tulemusi saad salvestada GPX-failina, mida on hiljem võimalik juhendamiseks kasutada. - See lisa teeb seadme erivajadusega kasutajatele mõeldud funktsioonid otse OsmAndis kättesaadavaks. See lihtsustab nt. kõnesünteesi häälte kõnekiiruse reguleerimist, ekraanil navigeerimise suuna seadistamist, rulliku kasutamist suurenduse juhtimiseks või kõnesünteesi tagasisidet, näiteks oma asukoha automaatseks teatamiseks. - See lisa võimaldab OsmAnd abil OSM kaastöid teha, näiteks OSM huvipunkte luua või muuta, OSM märkmeid avada või kommenteerida ning salvestatud GPX faile lisada. OSM on kogukonna juhitud globaalne üldkasutatav kaardistamisprojekt. Üksikasju leiad https://openstreetmap.org. Aktiivset osalemist hinnatakse ja panust saab teha otse OsmAnd rakendusest, kui seadistada rakenduses oma isiklikud OSM kasutajatunnused. - See lisa kuvab arendus- ja silumisfunktsioonide sätteid nagu teekonna arvutamine, renderdamise jõudlus või hääljuhiste testimine ja simuleerimine. Need seaded on mõeldud arendajatele ja pole tavakasutaja jaoks vajalikud. + Teeb seadme erivajadusega kasutajatele mõeldud funktsioonid otse OsmAndis kättesaadavaks. See lihtsustab näiteks kõnesünteesi häälte kõnekiiruse reguleerimist, ekraanil navigeerimise suuna seadistamist, rulliku kasutamist suurenduse juhtimiseks või kõnesünteesi tagasisidet, näiteks oma asukoha automaatseks teatamiseks. + Tee OsmAnd\'i abil OSM\'i kaastöid, näiteks loo või muuda OSM\'i huvipunkte, ava või kommenteeri OSM\'i märkmeid ning lisa salvestatud GPX faile. Selleks sisesta oma OSM\'i kasutajanimi ja salasõna. OSM on kogukonna juhitud globaalne vaba litsentsi alusel avaldatud kaardistamisprojekt. + Arendus- ja silumisfunktsioonide seadistused, nagu teekonna simulatsioon, renderdamise jõudlus või hääljuhiste testimine. Need seaded on mõeldud arendajatele ja pole tavakasutaja jaoks vajalikud. Vali alternatiivne teekond, valides välditavad teed Kasuta riistvarakiirendatud OpenGL tuge (võib kasutada rohkem akut või mitte töötada väga vanades seadmetes). %1$s vajab seda luba ekraani välja lülitamiseks energiasäästu nimel. @@ -3226,7 +3226,7 @@ \n Enamik maailma riike üle on allalaadimiseks saadaval! \n Hangi oma riigis usaldusväärne navigaator - olgu see siis Prantsusmaa, Saksamaa, Mehhiko, UK, Hispaania, Holland, USA, Venemaa, Brasiilia või mõni muu. OsmAnd + (OSM automatiseeritud navigeerimisjuhised) on kaardi- ja navigatsioonirakendus, millel on juurdepääs tasuta, ülemaailmsetele ja kvaliteetsetele OpenStreetMap (OSM) andmetele. -\n Naudi hääl- ja optilist navigeerimist, HP-de (huvipunktide) vaatamist, GPX radade loomist ja haldamist, kasutades kõrgusjoonte visuaalset kuvamist ja kõrgusteavet, valikut autosõidu, jalgrattasõidu, jalakäijate režiimide, OSM redigeerimise ja palju muu vahel. +\n Naudi hääl- ja optilist navigeerimist, HP-de (huvipunktide) vaatamist, GPX radade loomist ja haldamist, kasutades kõrgusjoonte visuaalset kuvamist ja kõrgusteavet, valikut autosõidu, jalgrattasõidu, jalakäijate režiimide, OSM\'i andmete muutmuise ja palju muu vahel. \n \n OsmAnd+ on rakenduse tasuline versioon. Selle ostmisega toetad projekti, rahastad uute funktsioonide arendamist ja saad kõige värskemaid uuendusi. \n @@ -3267,19 +3267,19 @@ \n • Valikuline reisi salvestamine ka taustrežiimis (kui seade on puhkeolekus) \n OsmAnd on aktiivselt arendatud avatud lähtekoodiga tarkvara. Kõik saavad rakendusse panustada, teatades vigadest, parandades tõlkeid või kodeerides uusi funktsioone. Lisaks toetub projekt rahalisele toetusele koodide kodeerimiseks ja uute funktsioonide testimiseks. \n - Ligikaudne kaardi leviala ja kvaliteet: -\n • Lääne-Euroopa: **** -\n • Ida-Euroopa: *** -\n • Venemaa: *** -\n • Põhja-Ameerika: *** -\n • Lõuna-Ameerika: ** -\n • Aasia: ** -\n • Jaapan ja Korea: *** -\n • Lähis-Ida: ** -\n • Aafrika: ** -\n • Antarktika: * -\n Enamik riike kogu maailmas on saadaval alla laadimiseks -\n Afganistanist Zimbabweni, Austraaliast USA-ni. Argentiina, Brasiilia, Kanada, Prantsusmaa, Saksamaa, Mehhiko, UK, Hispaania, … + Ligikaudne kaardi leviala ja kvaliteet: +\n • Lääne-Euroopa: **** +\n • Ida-Euroopa: *** +\n • Venemaa: *** +\n • Põhja-Ameerika: *** +\n • Lõuna-Ameerika: ** +\n • Aasia: ** +\n • Jaapan ja Korea: *** +\n • Lähis-Ida: ** +\n • Aafrika: ** +\n • Antarktika: * +\n Enamike riikide andmed üle maailma on saadaval allalaadimiseks +\n Afganistanist Zimbabweni, Austraaliast Ameerika Ühendriikideni. Argentina, Brasiilia, Kanada, Prantsusmaa, Saksamaa, Mehhiko, Suurbritannia, Hispaania, … \n Nimi sisaldab liiga palju suurtähti. Jätkata\? Proovi uuesti @@ -3753,4 +3753,6 @@ \n • Parandatud on profiili seadistuste impordi ja ekspordiga seotud vead \n \n + Peata teekonna salvestamine + Jätka teekonna salvestamist \ No newline at end of file diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index b116563f71..bfe4fe6318 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -147,7 +147,7 @@ La langue sélectionnée n\'est pas disponible dans le moteur de synthèse vocale installé. Souhaitez-vous rechercher d\'autres moteurs de synthèse vocale sur Google Play \? Sinon la langue par défaut sera utilisée. Données manquantes Souhaitez-vous installer la langue sélectionnée depuis Google Play ? - Inverser l\'itinéraire GPX + Inverser le sens de la trace Utiliser la destination en cours Suivre l\'ensemble de la trace Cartes vectorielles hors-lignes disponibles pour cette position. @@ -3880,4 +3880,7 @@ Modifier le type d’itinéraire après Seule la ligne d\'itinéraire sera enregistrée, les points de passage seront supprimés. Rétablir + Dernière modification + Nom : Z – A + Nom : A – Z \ No newline at end of file diff --git a/OsmAnd/res/values-gl/phrases.xml b/OsmAnd/res/values-gl/phrases.xml index 88f562e0ac..82048f8ed6 100644 --- a/OsmAnd/res/values-gl/phrases.xml +++ b/OsmAnd/res/values-gl/phrases.xml @@ -36,7 +36,7 @@ Tenda de telefonía móbil Tenda de motos Instrumentos musicais - Axencia de xornalismo + Venda de prensa Produtos ecolóxicos Tenda de pinturas Tenda de animais @@ -3800,7 +3800,7 @@ Incorrecto Rede de recarga de auga potábel Recarga de auga potábel: non - Recarga de auga potábel: si + Si Obstrución Nivel da auga: por debaixo do nivel medio da auga Nivel da auga: por encima do nivel medio da auga @@ -3825,4 +3825,16 @@ Caixa de distribución Predio Concello + Froitos secos + Colmea + Horarios + Tempo real + Atraso + Si + Taboleiro de saídas: non + Ascensor + Frecha: non + Pequenos aparellos eléctricos + Taboleiro de saídas + Recarga de auga potábel \ No newline at end of file diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml index 9b411b0d7f..18e88d4dab 100644 --- a/OsmAnd/res/values-gl/strings.xml +++ b/OsmAnd/res/values-gl/strings.xml @@ -13,7 +13,7 @@ Favorito renomeado a \'%1$s\' para gardar a cadea que contén emoticonas nun ficheiro. Imprimir o itinerario Favorito especificado con nome duplicado - Lomba + Redutor de velocidade Aviso do tráfico Avisos de tráfico O servizo en segundo plano do OsmAnd aínda está en execución. Desexas detelo tamén\? @@ -897,7 +897,7 @@ A lingua escollida é incompatíbel co motor TTS (texto lido a voz) instalado no Android, empregarase a lingua TTS predefinida. Procurar outro motor TTS na tenda de aplicacións\? faltan datos Ir á tenda de aplicacións para baixar a lingua escollida\? - Inverter a dirección do GPX + Inverter dirección da pista Empregar o destino actual Percorrer toda a pista Hai un mapa vectorial sen conexión para este sitio. @@ -1878,8 +1878,8 @@ Lon %2$s Colla a %1$d saída e siga Enviar PDI Cálculo da ruta - Aínda non tes ningún ficheiro GPX - Tamén podes engadir ficheiros GPX ó cartafol + Aínda non tes ningún ficheiro de pistas + Tamén podes engadir ficheiros de pistas ó cartafol Engadir máis… Aparencia Activar a gravación rápida @@ -1931,7 +1931,7 @@ Lon %2$s Localización non atopada Non hai conexión á Internet Espazo baleiro - Almacenamento dos datos do OsmAnd (para mapas, ficheiros GPX, etc.): %1$s. + Almacenamento dos datos do OsmAnd (para mapas, ficheiros de pistas, etc.): %1$s. Fornecer permiso Permitir acceso á localización Obtén indicacións e descobre lugares novos sen conexión á Internet @@ -2708,7 +2708,7 @@ Lon %2$s Náutico Localización sen nome Túnel adiante - Túneis + Túneles Baixa os artigos da Wikipedia de %1$s para lelos sen conexión. Baixar datos da Wikipedia Abrir artigo en liña @@ -2901,10 +2901,10 @@ Lon %2$s Trocar Amosar máis Pistas 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 transferencias Engadir orixe e destino Engadir 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 activo Desinstalar - É 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 lonxitude Este 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 achegamento Fornece 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 preto Fornece un nome para o punto O 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. Enduro Scooter Cadeira de rodas Cadeira de rodas só cara adiante Kart Nota do OSM pechada - Tes que definir os días laborais para continuar + Definir os días laborais para continuar Ruta entre puntos Planificar unha ruta Engadir a unha pista @@ -3852,4 +3852,77 @@ Lon %2$s está gardado Engade 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ása Jelenlegi célpont használata Végig az egész útvonalon Offline 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 larghezza Ultima modificata Importa una traccia - Apri una traccia esistente + Apri traccia esistente Crea un nuovo percorso - Scegli il file di una traccia da aprire. + Scegli un file traccia da aprire. Fatto Profilo di navigazione Poi 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 traccia Inverti il percorso Solo 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 selezionati Metterà 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 viaggio Riprendi la registrazione del viaggio Preimpostazioni 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 + è salvato Per 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ījumus Globālie iestatījumi Kartes 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ījumi Mainī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 dati Valodas 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ēt Instalācijas versija GPS 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ība Diena Nakts @@ -440,7 +440,7 @@ Turpināt Vēlāk Lejupielā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 centram Meklēt tuvumā @@ -544,7 +544,7 @@ Iestatiet valodu, lejupielādējiet/atjaunojiet datus Dati OSM 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 karti Papildus iestatījumi Iestatījumi @@ -663,11 +663,11 @@ Lietot tiešaistes kartes (lejuplādējot un kešojot bildes SD kartē) Tiešsaistes kartes Konfigurē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ēm Izvairī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šruts Lineāls Skata virziens @@ -860,9 +860,9 @@ Eiropa, Āzija, Latīņamerika Apvienotā Karaliste, Indija un citas Paziņ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žojums Fotoradari Satiksmes brīdinājumi Lūdzu norādiet iestatījumos OSM lietotāja vārdu un paroli @@ -900,7 +900,7 @@ Noņemt visus mērķus Atvērt GPX failu Lū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 filtru Lietot magnētisko sensoru orientācijas sensora vietā, lai noteiktu kompasa stāvokli Lietot magnētisko sensoru @@ -949,7 +949,7 @@ Mainīt kārtību Lū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 video Ierakstīt audio Izvēlieties noklusēto logrīka darbību @@ -996,7 +996,7 @@ Ceļu kartes Robežas Noņemt reģionālo robežu attēlošanu (admin līmeņi 5-9) - Ātruma limiti + Ātruma ierobežojumi Nav atrastas ēkas. Meklēt apdzīvotās vietas/pasta indeksus Izvēlieties, kad rādīt tikai ceļu tīkla kartes: @@ -1204,9 +1204,9 @@ Persiešu Nosaukumi 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 ieraksts h Laiks @@ -1290,7 +1290,7 @@ Izvairīties no ceļiem… Vilciena maršruti Tramvaja maršruti - "Kopīgot taksometru maršrutus" + Kopīgot taksometru maršrutus Trolejbusu maršruti Autobusu maršruti Paslē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žojums Robežkontrole Nodevu kabīne STOP 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ījumi Lū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ķieri Citi marķieri Augšupielādēt anonīmi @@ -1646,7 +1648,7 @@ Kontūrlīnijas ir deaktivizētas Izveidot jaunu Izvēlieties kategoriju - Izvēlieties ātruma mērvienību + Izvēlieties ātruma mērvienību. Ātruma mērvienības Jūras jūdze Kilometri stundā @@ -1721,7 +1723,7 @@ Izslēgts Krāsas pēc infrastruktūras veida Krāsas pēc OSMC simbola - "Vai vēlaties izdzēst %1$d ierakstus?" + Vai vēlaties izdzēst %1$d ierakstus\? Slēpošanas trases Pārklājuma veidi Izvairī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 failu Rādīt bezmaksas versijas banneri Arī maksas versijā jūs varat redzēt bezmaksas versijas banneri Lūdzu aktivizējiet jūras kartes spraudni @@ -1857,7 +1859,7 @@ failu(s)? Lūdzu, pievienojiet marķierus caur karti Nav atrasts neviens ceļa punkts Pā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šu Uz leju Beigt 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 kopienai Daļ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ņemt Saņemt par %1$s Saņ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$s Meklē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. Spraudnis Lai redzētu kontūrlīnijas uz kartes, jums ir nepieciešams nopirkt un instalēt \"Kontūrlīniju\" spraudni Krāsu shēma @@ -2213,17 +2215,17 @@ Apraksta laukumu: %1$s x %2$s Rādīt/nerādīt OSM piezīmes Atļ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ķi Nomainīt mērķi Pievienot pirmo starppunktu Spiež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āja Nav apakšklāja Kļū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 failu Izvē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ēsturi Kartes marķieris ir pārvietots uz vēsturi Kartes 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ārdu Skatīt lietotāja bildes Lietotā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ģēta Tumši dzeltens Caurspīdīgs rozā @@ -2555,7 +2557,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Viens Spiežot darbības pogu, tiks pārslēgts dienas un nakts režīms Smaiļ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 politika Palī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ījumus Iestatīt min./maks. ātrumu Jauns 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. NLO Segway Monoritenis @@ -2586,7 +2588,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Pamodināt pagriezienos Iestatī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ļi Ledus ceļi Ziemas 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ēsts Pasaule - 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 atsauksmi Vietu 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ādi Miliradiāni Azimuts - "Mainīt azimuta mērvienības." + Mainīt azimuta mērvienības. Nelietot tramvajus Nelietot tramvajus Nelietot 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 profilu Balstiet 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, motocikls MTB, mopēds, zirgs Iešana kājām, pastaigas, skriešana Visi sabiedriskie transporti @@ -2986,8 +2989,8 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Darīt Tikai 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āmatu Ceļ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 laiks Ierašanās laiks Uzlabots 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" +\n Visi 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 Atjaunot Rediģēt profilu sarakstu Rediģē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 profils Nekas 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ør Nettverk for påfyll av drikkevann Drikkevannspåfylling: Nei - Drikkevannspåfylling: Ja + Ja Vann-nivå: Nedsenket Hindring Vann-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 rute Overskriv 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 sporet Neste 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 spor Opprett ny rute @@ -3739,11 +3737,11 @@ Alle påfølgende segmenter Alle foregående segmenter Forrige 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 spor har blitt lagret Legg 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 dados Ir a loja para baixar o idioma selecionado\? - Inverter direção GPX + Inverter direção da trilha Usar destino atual Percorrer toda a trilha Mapa 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ável Pequenos aparelhos elétricos Colmeia + 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 transporte Voz gravada Nenhum mapa vetorial foi carregado - Caminho reverso + Inverter a direção do trilho Nenhum ficheiro GPX encontrado na pasta tracks Nã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 údaje Prejsť do obchodu pre stiahnutie zvoleného jazyka? - Obrátiť GPX smerovanie + Obrátiť smer stopy Použiť aktuálny cieľový bod Prejsť pozdĺž celej trasy Pre 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 @@ Megalit Basınç İçme suyu doldurma: hayır - İçme suyu doldurma: evet + Evet İçme suyu doldurma şebekesi Malzeme: kompozit Malzeme: mermer @@ -2398,4 +2398,22 @@ Mobilet: evet Mobilet Ş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 yok Seç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 çevir Bu 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;