diff --git a/OsmAnd-java/build.gradle b/OsmAnd-java/build.gradle index 2c5415a84f..d461ea8aff 100644 --- a/OsmAnd-java/build.gradle +++ b/OsmAnd-java/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'java' apply plugin: 'maven-publish' +apply plugin: 'ivy-publish' configurations { android @@ -85,12 +86,22 @@ artifacts { } publishing { + repositories { + ivy { + url = System.getenv("OSMAND_BINARIES_IVY_ROOT") ?: "./" + } + } publications { maven(MavenPublication) { artifactId "osmand-base" from components.java } - } + ivyJava(IvyPublication) { + artifact androidJar { + classifier 'android' + } + } + } } dependencies { diff --git a/OsmAnd/.gitignore b/OsmAnd/.gitignore index 8bfbd5b688..b8c08a2225 100644 --- a/OsmAnd/.gitignore +++ b/OsmAnd/.gitignore @@ -2,7 +2,7 @@ gradle gradlew gradlew.bat - +/net.osmand aarDependencies libs/android*.jar libs/com.*.jar diff --git a/OsmAnd/build.gradle.lib b/OsmAnd/build.gradle.lib index 419f7dd801..bcb0999e91 100644 --- a/OsmAnd/build.gradle.lib +++ b/OsmAnd/build.gradle.lib @@ -1,4 +1,5 @@ apply plugin: 'com.android.library' +apply plugin: 'ivy-publish' task printc { configurations.each { if(it.isCanBeResolved()) println it.name } @@ -338,75 +339,47 @@ task appStart(type: Exec) { // commandLine 'cmd', '/c', 'adb', 'shell', 'am', 'start', '-n', 'net.osmand.plus/net.osmand.plus.activities.MapActivity' } -artifacts { - archives(file("../OsmAnd-java/build/libs/OsmAnd-java-android-1.0.jar")) { - classifier "OsmAnd-java-android" - name 'OsmAnd' - type "jar" - } - archives(file("$buildDir/outputs/aar/OsmAnd-legacy-x86-debug.aar")) { - classifier 'legacyX86Debug' - name 'OsmAnd' - extension 'aar' - } - archives(file("$buildDir/outputs/aar/OsmAnd-legacy-x86-release.aar")) { - classifier 'legacyX86Release' - name 'OsmAnd' - extension 'aar' - } - archives(file("$buildDir/outputs/aar/OsmAnd-legacy-arm64-debug.aar")) { - classifier 'legacyArm64Debug' - name 'OsmAnd' - extension 'aar' - } - archives(file("$buildDir/outputs/aar/OsmAnd-legacy-arm64-release.aar")) { - classifier 'legacyArm64Release' - name 'OsmAnd' - extension 'aar' - } - archives(file("$buildDir/outputs/aar/OsmAnd-legacy-armonly-debug.aar")) { - classifier 'legacyArmonlyDebug' - name 'OsmAnd' - extension 'aar' - } - archives(file("$buildDir/outputs/aar/OsmAnd-legacy-armonly-release.aar")) { - classifier 'legacyArmonlyRelease' - name 'OsmAnd' - extension 'aar' - } - archives(file("$buildDir/outputs/aar/OsmAnd-legacy-armv7-debug.aar")) { - classifier 'legacyArmv7Debug' - name 'OsmAnd' - extension 'aar' - } - archives(file("$buildDir/outputs/aar/OsmAnd-legacy-armv7-release.aar")) { - classifier 'legacyArmv7Release' - name 'OsmAnd' - extension 'aar' - } - archives(file("$buildDir/outputs/aar/OsmAnd-legacy-fat-debug.aar")) { - classifier 'legacyFatDebug' - name 'OsmAnd' - extension 'aar' - } - archives(file("$buildDir/outputs/aar/OsmAnd-legacy-fat-release.aar")) { - classifier 'legacyFatRelease' - name 'OsmAnd' - extension 'aar' - } -} - -// Uploading artifacts to local path -group = 'net.osmand' -uploadArchives { - repositories.ivy { - // credentials { - // username "" - // password "" - // } - - url = System.getenv("OSMAND_BINARIES_IVY_ROOT") ?: "./" - version = "1.0-SNAPSHOT" +project.afterEvaluate { + publishing { + repositories { + ivy { + url = System.getenv("OSMAND_BINARIES_IVY_ROOT") ?: "./" + } + } + publications { + aar(IvyPublication) { + artifact bundleLegacyX86DebugAar { + classifier 'legacyX86Debug' + } + artifact bundleLegacyX86ReleaseAar { + classifier 'legacyX86Release' + } + artifact bundleLegacyArm64DebugAar { + classifier 'legacyArm64Debug' + } + artifact bundleLegacyArm64ReleaseAar { + classifier 'legacyArm64Release' + } + artifact bundleLegacyArmonlyDebugAar { + classifier 'legacyArmonlyDebug' + } + artifact bundleLegacyArmonlyReleaseAar { + classifier 'legacyArmonlyRelease' + } + artifact bundleLegacyArmv7DebugAar { + classifier 'legacyArmv7Debug' + } + artifact bundleLegacyArmv7ReleaseAar { + classifier 'legacyArmv7Release' + } + artifact bundleLegacyFatDebugAar { + classifier 'legacyFatDebug' + } + artifact bundleLegacyFatReleaseAar { + classifier 'legacyFatRelease' + } + } + } } } diff --git a/OsmAnd/res/layout/custom_radio_btn_text_item.xml b/OsmAnd/res/layout/custom_radio_btn_text_item.xml new file mode 100644 index 0000000000..3bd1efbfc1 --- /dev/null +++ b/OsmAnd/res/layout/custom_radio_btn_text_item.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/fragment_measurement_tool.xml b/OsmAnd/res/layout/fragment_measurement_tool.xml index 2fe4dc1416..982f0840b3 100644 --- a/OsmAnd/res/layout/fragment_measurement_tool.xml +++ b/OsmAnd/res/layout/fragment_measurement_tool.xml @@ -130,25 +130,32 @@ tools:text="@string/add_point_after"/> - + android:layout_height="wrap_content"> - - - + android:layout_height="@dimen/measurement_tool_button_height" + android:layout_marginStart="@dimen/content_padding" + android:layout_marginEnd="@dimen/content_padding" + android:layout_marginBottom="@dimen/measurement_tool_content_padding_medium" /> - + - + + + + android:visibility="invisible" /> - - \ No newline at end of file diff --git a/OsmAnd/res/layout/fragment_measurement_tool_points_list.xml b/OsmAnd/res/layout/measurement_tool_points_card.xml similarity index 91% rename from OsmAnd/res/layout/fragment_measurement_tool_points_list.xml rename to OsmAnd/res/layout/measurement_tool_points_card.xml index a0684707ea..47e8bd9d4b 100644 --- a/OsmAnd/res/layout/fragment_measurement_tool_points_list.xml +++ b/OsmAnd/res/layout/measurement_tool_points_card.xml @@ -3,7 +3,7 @@ xmlns:osmand="http://schemas.android.com/apk/res-auto" android:id="@+id/points_list_container" android:layout_width="match_parent" - android:layout_height="@dimen/measurement_tool_points_list_container_height" + android:layout_height="wrap_content" android:background="?attr/activity_background_color"> استخدم dev.openstreetmap.org لا يمكن تحميل الصورة، من فضلك، حاول مرة أخرى في وقت لاحق تحديد صورة + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index 7205f99cb0..2132e2152a 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -233,7 +233,7 @@ Velocitat de simulació de la ruta: Mitjà de transport: Edició fora de línia - Utilitza sempre l\'edició fora de línia. + "En desconnexió la edició està activada però llavors els canvis es desen d\'entrada localment i es pujaran quan es demani; altrament els canvis s\'actualitzen immediatament." Edició asincrònica de l\'OSM: Activa les funcions per a usuaris amb discapacitats. Els canvis realitzats en els PDI a l\'aplicació no afecten els fitxers de mapa baixats, els canvis es desen en un fitxer local. @@ -393,7 +393,7 @@ \n- Indicacions de carril, velocitat màxima permesa, veus enregistrades i sintetitzades \n Seleccioneu el nivell mínim de zoom per mostrar el mapa si està disponible. Caldrà el fitxer SRTM separat: - Aquest connector mostra la configuració de característiques per al desenvolupament i depuració com la verificació o simulació de rutes, el rendiment del renderitzat o les indicacions de veu. Aquestes configuracions s\'adrecen a desenvolupadors i no són d\'utilitat per a un usuari normal. + Configuració de característiques per al desenvolupament i depuració, com simulació de navegació, rendiment de renderitzat o les indicacions de veu. Adreçat a desenvolupadorsimés que a usuaris normals de l\'aplicació. En consonància amb la configuració del sistema Android El nivell de zoom és Trieu l\'estil per indicar direccions relatives mentre s\'està en moviment @@ -1872,8 +1872,8 @@ No hi ha prou espai! \nCalen {3} MB temporalment i {1} MB de permanents. \n(Només es disposa de {2} MB). - Voleu baixar {0} fitxer(s)\? -\nS\'utilitzen {3} MB temporalment i {1} MB permanentment. (De {2} MB). + Voleu baixar {0} fitxer(s)\? +\nS\'utilitzaran {3} MB temporalment i {1} MB permanentment. (De {2} MB). Puja ↑ Baixa ↓ Evita la via @@ -2151,7 +2151,7 @@ Canvia l\'origen del mapa Orígens de mapa Afegeix origen del mapa - L\'origen del mapa s\'ha canviat al de \"%s\". + L\'origen del mapa s\'ha canviat a \"%s\". Modifica la posició del botó Si premeu i arrossegueu alhora, el botó canvia la seva posició a la pantalla. Mostra un diàleg provisional @@ -2364,7 +2364,8 @@ \n• Representació i navegació a mida per ciclistes i vianants \n• Indicació opcional de les parades del transport públic (autobús, tramvia, tren), incloent-hi noms de línia \n• Enregistrament opcional del trajecte en un fitxer GPX local o a un servei a la xarxa -\n• Indicació opcional de la velocitat i l\'altitud • Visualització de corbes de nivell i ombrejat de relleu (requereix connector) +\n• Indicació opcional de la velocitat i l\'altitud +\n• Visualització de corbes de nivell i ombrejat de relleu (requereix connector addicional) Col·laboreu directament a OSM \n• Notifiqueu errors en les dades \n• Pugeu traces GPX directament a OSM des de l\'aplicació @@ -3163,7 +3164,7 @@ Grau 4 Grau 5 Dispositius d\'entrada externs - Seleccioneu un aparell com a teclat genèric o WunderLINQ per a controls externs. + Seleccioneu un aparell de control extern, com un teclat o un WunderLINQ. Cap Teclat WunderLINQ @@ -3869,4 +3870,37 @@ Proporcioneu la llargada del vostre vehicle, pot haver-hi rutes restringides als vehicles llargs. No s\'ha generat correctament l\'arxiu GPX. Indiqueu-ho a l\'equip de suport per continuar investigant. Enregistra automàticament la traça durant la navegació + Cal afegir almenys dos punts + Canvieu per utilitzar dev.openstreetmap.org en lloc d\'openstreetmap.org en provar la pujada de nota OSM / PDI / GPX. + Tanca la nota d\'OSM + Comentari de la nota d\'OSM + Podeu iniciar la sessió mitjançant el mètode segur OAuth o fer servir el vostre usuari i contrasenya. + Afegeix foto + Registreu-vos a +\nOpenPlaceReviews.org + Les fotos les proporciona el projecte OpenPlaceReviews.org de dades obertes. Per poder pujar les vostres fotos, cal que us registreu al lloc web. + Crea un compte nou + ja tinc un compte + Historial de cerques + Caiac + Llanxa motora + No es pot carregar la imatge, torneu-ho a provar més tard + Seleccioneu la imatge + Recursos + Mida aproximada del fitxer + Seleccioneu les dades a exportar cap el fitxer. + Necessari per a la importació + El vostre dispositiu només té %1$s lliures. Allibereu espai o desseleccioneu alguns articles per exportar. + No hi ha prou espai + Seleccioneu els grups que s\'importaran. + Seleccioneu els elements que s\'importaran. + Afegeix a Mapillary + Afegeix-ho a OpenPlaceReviews + Utilitza dev.openstreetmap.org + OsmAnd mostra fotos de diverses fonts: +\nOpenPlaceReviews - fotos de PDIs; +\nMapillary: imatges a nivell de carrer; +\nWeb / Wikimedia: fotos dels PDIs especificats a les dades d\'OpenStreetMap. + %1$s * %2$s + Equipament \ No newline at end of file diff --git a/OsmAnd/res/values-cs/strings.xml b/OsmAnd/res/values-cs/strings.xml index 4c4069ba02..e4b9250390 100644 --- a/OsmAnd/res/values-cs/strings.xml +++ b/OsmAnd/res/values-cs/strings.xml @@ -117,9 +117,8 @@ Služba na pozadí OsmAnd běží na pozadí i při vypnuté obrazovce. Nedostatek místa pro stažení %1$s MB dat (volné: %2$s). - Stáhnout {0} soubor(ů)? - V úložišti je zapotřebí {1} MB. - (Aktuálně je k dispozici {2} MB.) + Stáhnout {0} soubor(ů)\? +\nBude použito {1} MB (z {2} MB). Transparentní téma Android native library není podporovaná na tomto zařízení. Probíhá inicializace Android native library… @@ -535,14 +534,14 @@ Určete nastavení OpenStreetMap.org (OSM) potřebné pro přispívání. Volba jazyka, stažení a aktualizace dat. Data - Editace OSM + Editace OpenStreetMap Zvětšení podle rychlosti pohybu (když je mapa synchronizována s aktuální pozicí). Automatické zvětšení mapy Další nastavení Nastavení Uložit aktuální trasu jako soubor GPX. Uložit aktuální trasu - Vyberte interval pro ukládání trasy během navigace. + Zadejte interval pro ukládání trasy během navigace Interval ukládání trasy během navigace Během navigace budou GPX trasy automaticky ukládány do adresáře s trasami. Aktualizovat mapu @@ -615,7 +614,7 @@ Hlášení Jméno autora Komentář přidán - Nepodařilo se přidat komentář + Nepodařilo se přidat komentář. Upravit POI Vytvořit POI Uzel nelze nalézt nebo vybavení sestává z několika uzlů, které ještě nejsou podporovány. @@ -651,18 +650,18 @@ Používat on-line mapy (ukládat dlaždice do mezipaměti na paměťové kartě). On-line mapy Nastavení rastrových překryvných nebo podkresových map. - S tímto modulem můžete použít mnoho druhů on-line map (tzv. dlaždicové nebo rastrové mapy), od předdefinovaných OpenStreetMap dlaždic (jako Mapnik) až po satelitní snímky a speciální vrstvy jako mapy počasí, klimatické mapy, geologické mapy, stínované vrstvy, atd. + Získejte přístup k mnoha druhům on-line map (tzv. dlaždicové nebo rastrové mapy), od předdefinovaných OpenStreetMap dlaždic (jako Mapnik) až po satelitní snímky a speciální vrstvy jako mapy počasí, klimatické mapy, geologické mapy, stínované svahy, atd. \n -\nVšechny tyto mapy mohou být použity jako hlavní (základní) mapa na obrazovce OsmAnd nebo jako překryvná popř. podkladová mapa k jiné základní mapě (např. standardní OsmAnd off-line mapě). Pro zlepšení viditelnosti podkladových map je možné vypnout některé objekty z vektorových map OsmAnd, přes menu \'Nastavení mapy\'. +\n Všechny tyto mapy mohou být použity jako hlavní (základní) mapa na obrazovce OsmAnd nebo jako překryvná popř. podkladová mapa k jiné základní mapě (např. standardní OsmAnd off-line mapě). Pro zlepšení viditelnosti podkladových map je možné vypnout některé objekty z vektorových map OsmAnd, přes menu \'Nastavení mapy\'. \n -\nDlaždicové mapy můžete získat přímo z on-line zdrojů nebo si je můžete připravit pro off-line použití (zkopírovat ručně do datového adresáře OsmAnd) jako SQLite databázi, která může být vytvořena mnoha programy pro přípravu map. +\n Dlaždicové mapy můžete získat přímo z on-line zdrojů nebo si je můžete připravit pro off-line použití (zkopírovat ručně do datového adresáře OsmAnd) jako SQLite databázi, která může být vytvořena mnoha programy pro přípravu map. Zobrazí nastavení pro zapnutí záznamu trasy a navigace na pozadí s pravidelným probouzením GPS zařízení (s vypnutou obrazovkou). - Tento modul zobrazí nastavení pro speciální funkce ulehčení přístupu přímo v OsmAnd. Například je možné měnit rychlost TTS hlasu, použít trackball na přibližování nebo například použít hlasové předčítání pro oznamování polohy. - Tento modul zobrazí nastavení vývojových a ladících funkcí, jako jsou simulace navigace, informace o rychlosti vykreslování nebo hlasová oznámení. Tato nastavení jsou určené pro vývojáře a nejsou potřebné pro běžné použití. + Zobrazí funkce usnadnění přístupu přímo v OsmAnd. Například je možné měnit rychlost TTS hlasu, nastavit navigování pomocí D-padu, použít trackball na přibližování nebo použít hlasové předčítání pro oznamování polohy. + Nastavení funkcí pro vývoj a ladění, jako jsou simulace navigace, informace o rychlosti vykreslování nebo hlasová oznámení. Tato nastavení jsou určená pro vývojáře a nejsou potřebná pro běžné použití. Správce modulů Moduly umožňují zapnout pokročilé nastavení a přídavné funkce. Moduly - Pomocí tohoto modulu může být OsmAnd použit na přispívání do OSM, například vytvářením nebo úpravami POI, vytvářením nebo komentováním OSM poznámek a přispíváním zaznamenanými GPX soubory. OSM je celosvětový komunitní projekt mapování. Pro více detailů se podívejte na https://openstreetmap.org. Aktivní účast je vítaná a příspěvky mohou být vytvářené přímo v OsmAnd, jestliže zadáte své osobní přihlašovací údaje do OSM. + Po zadání svých přihlašovacích údajů můžete přispívat do OSM - například vytvářením nebo úpravami bodů zájmu, otevíráním nebo komentováním OSM poznámek a přidáváním zaznamenanými GPX soubory. OSM je celosvětový komunitní projekt mapování. Akcelerace vykreslování pomocí \'Android native\' knihovny. Vektorové mapy se zpravidla vykreslují rychleji, pokud je tato možnost zaškrtnuta. Avšak na některých zařízeních tato funkce nemusí fungovat. Přehrát hlasové pokyny zvoleným hlasem Vývoj a ladění OsmAnd @@ -715,7 +714,8 @@ odpoledne dopoledne Místo parkování - Modul Parkovací místo umožňuje zaznamenání, kde jste zaparkovali své auto, a v případě časově omezeného parkování také kolik času zbývá. Parkovací místo a čas parkování můžete najít na panelu aktuální mapy. Je také možné přidat upomínku do kalendáře, pokud chcete být upozorněni. + Umožňuje zaznamenat, kde jste zaparkovali své auto, včetně zbývajícího času parkování. +\n Místo i čas jsou zobrazené na hlavním panelu i na mapovém widgetu. Je také možné přidat upomínku do kalendáře Android. Parkovací místo Označit jako místo parkování Smazat místo parkování @@ -880,7 +880,7 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).Přehrát Zvukové/video poznámky Měření vzdálenosti - Modul Audio/video poznámek poskytuje funkce k vytváření záznamů zvukových/fotografických/video poznámek během cesty, buď tlačítkem na mapové obrazovce nebo přímo v kontextovém menu bodu na mapě. + Vytvářejte zvukové/fotografické/video poznámky během cesty, buď tlačítkem na mapové obrazovce nebo v kontextovém menu bodu na mapě. části Nahrát video Nahrát zvuk @@ -908,9 +908,9 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).Modul Vrstevnice Zastavit Modul Dropbox vám umožňuje synchronizovat trasy, audio a video poznámky s vaším účtem Dropbox. - Tento modul poskytuje zobrazení vrstevnic a vrstvy stínování kopců, které mohou být zobrazené na standardních OsmAnd mapách. Tato funkce je vhodná především pro sportovce, turisty, chodce a vůbec všechny, které zajímá profil terénu. -\n -\nCelosvětová výšková data (mezi 70° severní šířky a 70° jižní šířky) se zakládají na měřeních SRTM (Shuttle Radar Topography Mission) a ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), snímkovací přístroj na palubě satelitu Terra, vlajkového satelitu Systému pozorování Země NASA. ASTER je společným projektem NASA, japonského ministerstva hospodářství, obchodu a průmyslu (METI) a Japan Space Systems (J-spacesystems). + Tento modul poskytuje zobrazení vrstevnic a vrstvy stínování kopců, které mohou být zobrazené na standardních OsmAnd mapách. Tato funkce je vhodná především pro sportovce, turisty, chodce a vůbec všechny, které zajímá profil terénu. +\n +\nCelosvětová výšková data (mezi 70° severní šířky a 70° jižní šířky) se zakládají na měřeních SRTM (Shuttle Radar Topography Mission) a ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), snímkovacího přístroje na palubě satelitu Terra, vlajkového satelitu Systému pozorování Země NASA. ASTER je společným projektem NASA, japonského ministerstva hospodářství, obchodu a průmyslu (METI) a Japan Space Systems (J-spacesystems). Opravdu chcete zastavit navigaci? Opravdu chcete smazat svůj cíl (a mezicíle)? Zobrazit @@ -951,7 +951,7 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).Vybrat Oblíbené Editace OSM Další akce - Konfigurace záznamů vašich cest. + Nastavte, jak se budou zaznamenávat vaše cesty. Instalovat plnou verzi Ukončit navigaci Sníží šum v hodnotách z kompasu, ale zpomalí změny směru. @@ -962,7 +962,7 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).Zrušit trasu Smazat cíl Vrstevnice - Stahování + Stahování… Ostatní Soubor se změnami mapy OSM vytvořen %1$s Nezdařilo se zálohovat změny mapy OSM @@ -986,7 +986,7 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).Začít novou podtrasu Vymazat všechny body Otevřít soubor GPX - Tento modul poskytuje nástroj na vytvoření trasy klikáním na mapu nebo úpravu stávajících GPX souborů pro plánování výletů a měření vzdálenosti mezi body. Výsledek je možné uložit jako GPX a použito později jako pomůcku. + Vytvářejte cesty klikáním na mapu nebo úpravou stávajících GPX souborů pro plánování výletů a měření vzdálenosti mezi body. Výsledek je možné uložit jako GPX a později použít pro navádění. Cíl %1$s Nastavit jako cíl Zvolte nejprve město nebo ulici @@ -1036,21 +1036,21 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).Vybrat existující… Ke stažení: %1$s Vytvořit/Upravit… - Doba platnosti (min) + Doba platnosti (v minutách) Vyberte dopravní oblast: USA, Evropa, Británie, Asie a další. Dopravní oblast - Doba platnosti (minut): %1$s + Doba platnosti (v minutách): %1$s Snímků za sekundu (ladění) - Eliptický mercator + Elipsoidní Mercatorovo zobrazení Základní mapa světa Lupa mapy Bez automatického přibližování Malé přiblížení Velké přiblížení Střední přiblížení - Stažené přiblížení: %1$s + Stažené úrovně přiblížení: %1$s Data dlaždic: %1$s - Zdroj dlaždic %1$s byl uložen + Zdroj dlaždic %1$s uložen Zapamatovat si volbu a nebo @@ -1058,37 +1058,37 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).Simulovat pomocí vypočítané trasy Simulovat pomocí GPX trasy Odstranit vše - Chystáte se odstranit %1$d změn OSM. Jste si jisti? + Opravdu chcete odstranit %1$d OSM změn\? Turistika Motocykl Loď Letadlo Vykreslování mapy - Vyberte profily, které se zobrazí v aplikaci. + Vyberte profily, které budou viditelné. Profily aplikace Mořská značka Přidat jako další cíl Vybrat GPX… Použít zobrazenou trasu pro navigaci\? - Vybrat cíl + Zadat cíl Vybrat na mapě Oblíbené Předvolby trasy Informace trasy Upřednostňovat dálnice Upřednostňovat dálnice - Vyhnout se placeným silnicím - Vyhnout se placeným silnicím - Vyhnout se nezpevněným cestám - Povede trasu mimo nezpevněné cesty. - Vyhnout se trajektům - Vyhnout se trajektům - Vyhnout se dálnicím - Vyhnout se dálnicím + Žádné placené silnice + Vyhne se placeným silnicím + Žádné nezpevněné cesty + Vyhne se nezpevněným cestám + Žádné trajekty + Vyhne se trajektům + Žádné dálnice + Vyhne se dálnicím Hmotnostní omezení Zadejte povolenou hmotnost vozidla na trase. - Od verze Androidu 4.4 (KitKat) není možné stahovat a aktualizovat mapy ve starém adresáři (%s). Zkopírovat všechny soubory aplikace OsmAnd do nového umístění\? -\n Poznámka 1: Původní soubory zůstanou nedotčeny (ale mohou být smazány ručně). + Od verze Androidu 4.4 (KitKat) není starý adresář (%s) podporovaný. Zkopírovat všechny soubory aplikace OsmAnd do nového umístění\? +\n Poznámka 1: Původní soubory zůstanou nedotčeny (ale mohou být smazány ručně). \n Poznámka 2: V novém úložišti nebude možné sdílet soubory mezi OsmAnd a OsmAnd+. Kopírování souboru (%s) do nového umístění… Kopírování datových souborů OsmAnd do nového umístění (%s)… @@ -1210,7 +1210,7 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB). Uložit jako skupinu Oblíbených - Vybrat cíle + Určete cíle Překryvné popisky bodů On-line OSM klasifikace map s obrázky. @@ -1218,9 +1218,9 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).Zobrazit tlačítka lupy Třídit podle vzdálenosti Třídit podle jména - Vybrat k zobrazení + Vyberte stopu Nic ke stažení nebylo nalezeno, prosím zkontrolujte své připojení k Internetu. - Nebyl vybrán soubor GPX. Vyberte podržením. + Dlouhým stisknutím vyberte GPX soubor. Budovy Text Lesy a křoviny @@ -1236,7 +1236,7 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).Preferovaný jazyk pro nápisy na mapě (pokud není dostupný, budou použity anglické nebo lokální názvy). Preferovaný jazyk mapy Lokální názvy - Pokud je zapnutý záznam GPX trasy, odesílat data trasování určené webové službě. + Odesílat trasovací data určené webové službě, pokud je zapnutý záznam GPX. On-line sledování (vyžaduje GPX) Spustit on-line sledování Zastavit on-line sledování @@ -1279,9 +1279,9 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).Stáhnout chybějící mapy %1$s (%2$d MB)? Interval ukládání trasy Autobusy, trolejbusy a kyvadlová doprava - Tento modul zapne funkci záznamu a uložení vašich tras stisknutím tlačítka GPX na panelu mapové obrazovky nebo také automatického ukládání všech vašich navigačních tras do GPX souboru. + Tento modul zapne funkci záznamu a uložení vašich stop stisknutím tlačítka GPX na panelu mapové obrazovky. Taktéž umožňuje nastavit automatické ukládání vašich navigačních tras do GPX souboru. \n -\nZaznamenávané trasy můžete sdílet se svými přáteli nebo mohou být použity jako příspěvek do OSM. Sportovci mohou použít zaznamenané trasy k sledování svých tréninků. Základní analýza může být provedena již přímo v OsmAnd, například čas okruhu, průměrná rychlost, apod. Trasy mohou být samozřejmě analyzovány později speciálními programy třetích stran. +\n Zaznamenávané stopy můžete sdílet se svými přáteli nebo mohou být použity jako příspěvek do OSM. Sportovci mohou použít zaznamenané trasy k sledování svých tréninků. Základní analýza může být provedena přímo v OsmAnd, například čas okruhu, průměrná rychlost, apod. Trasy mohou být samozřejmě analyzovány později speciálními programy třetích stran. Záznam cesty h Trvání @@ -1292,24 +1292,24 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).Dopravní varování Blízké Oblíbené body Blízké body zájmu POI - Záznam do GPX souboru může být zapnut nebo vypnut pomocí widgetu Záznam trasy na mapové obrazovce. + Záznam do GPX souboru může být zapnut nebo vypnut pomocí widgetu Záznam trasy na mapě. Vždy se zeptat Globální interval záznamu Rychlostní limit Hraniční kontrola Mýtná stanice Značka STOP - Zpomalovací prvek + Zklidňování dopravy Rychlostní radar/kamera Dopravní varování Cíl Stiskněte existující položku k zobrazení více detailů, podržte pro vypnutí nebo smazání. V zařízení je %1$s volného místa: Velikost písma Nastavit velikost písma na mapě. - Název oblíbeného bodu je již použit - Název Oblíbeného bodu již existuje, byl změněn na %1$s, aby nevznikla duplicita. + Duplicitní název oblíbeného bodu + Oblíbený bod přejmenován na %1$s, aby nevznikla duplicita. Vytisknout trasu - Název oblíbeného bodu byl změněn na %1$s, protože není možné ukládat do souboru řetězce s emotikony. + Oblíbený bod přejmenován na %1$s, protože není možné ukládat do souboru řetězce s emotikony. Tolerance překročení rychlosti Zvolte toleranci překročení povolené rychlosti, po které uslyšíte hlasové varování. Anonymní uživatel nemůže: @@ -1392,20 +1392,20 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).Povolit HTTP proxy Nastavit HTTP proxy pro veškeré síťové požadavky. Host proxy - Nastavit hostname proxy (např. 127.0.0.1). + Zadejte hostname proxy serveru (např. 127.0.0.1). Port proxy - Nastavit číslo portu proxy (např. 8118). + Zadejte číslo portu proxy serveru (např. 8118). Parkovací místo ODSTRANIT ZNAČKU Zakázán Povolen Upravit skupinu - Pro zobrazování plavebních map je třeba stáhnout speciální mapu - Pro zobrazování lyžařských map je třeba stáhnout speciální mapu + Stáhněte si speciální offline mapu pro zobrazení námořních detailů. + Stáhněte si speciální offline mapu pro zobrazení lyžařských objektů. Lyžařský mapový pohled Plavební mapový pohled Sdílet poznámku - Poznámky + A/V poznámky On-line mapa Pouze cesty Lyžařské svahy @@ -1460,10 +1460,10 @@ Délka %2$s Navštívit po Navštívit před Vyčistit historii\? - Požadujete nahrát %1$d změn do OSM. Jste si jisti? + Opravdu chcete nahrát %1$d změn do OSM\? Sbalit Info o A-GPS - Datum posledního stažení A-GPS dat: %1$s + Datum stažení A-GPS dat: %1$s Zpráva Stáhnout mapy Vítejte @@ -1517,7 +1517,7 @@ Délka %2$s Úložiště map Kopírovat Popisná čísla domů - Nepřekračovat hranice země + Vyhne se překročení hranic státu Výškové omezení Zadejte výšku vozidla, která musí být povolena na cestách. Inteligentní přepočítávání trasy @@ -1532,7 +1532,7 @@ Délka %2$s Vypnuto Zbarvení podle příslušnosti k síti Zbarvení podle turistické značky OSMC - Chystáte se smazat %1$d poznámek. Jste si jisti? + Opravdu chcete smazat %1$d poznámek\? Wikipedie Červená Výchozí (13) @@ -1544,7 +1544,7 @@ Délka %2$s Světlemodrá Modrá Fialová - Restartujte aplikaci pro aplikování všech změn. + Pro aplikování všech změn je potřeba restartovat aplikaci. Světlý Tmavý Výchozí (průsvitná modrozelená) @@ -1558,8 +1558,8 @@ Délka %2$s Průsvitná fialová Piemontština Máte zastaralá nekompatibilní data Wikipedie. Archivovat je\? - Stáhnout dodatečná Wikipedia data (%1$s MB) \? - Služba zjištění polohy není zapnuta. Aktivovat\? + Stáhnout dodatečná data Wikipedie (%1$s MB)\? + Služba zjištění polohy je vypnuta. Aktivovat\? Zabránit samostatnému logování Okamžité aktualizace Nejsou dostupné žádné aktualizace @@ -1582,8 +1582,8 @@ Délka %2$s Moduly GPX soubor s umístěními. Umístění - Vyhnout se autovlaku - Vyhnout se použití autovlaků + Žádný autovlak + Vyhne se použití autovlaků Latina smazat Nepodařilo se odeslat @@ -1691,7 +1691,7 @@ Délka %2$s Nastavit příznak označující první spuštění aplikace, ostatní nastavení ponechat nezměněná. Silniční mapa není nutná, protože máte standardní (plnou) mapu. I přesto stáhnout? Zvolte, kam chcete uložit mapové a ostatní datové soubory. - „Vypnout“ spouští přímo obrazovku s mapou. + \'Vypnuto\' spouští přímo obrazovku s mapou. Základní mapa světa (pokrývající celý svět při malých úrovních detailů) chybí nebo je zastaralá. Prosím zvažte její stažení pro celkový přehled. QR kód Mapa stažena @@ -1749,9 +1749,9 @@ Délka %2$s Znovuotevřít poznámku Uzavřít poznámku Poznámka vytvořena - Nepodařilo se vytvořit poznámku + Nepodařilo se vytvořit poznámku. Poznámka uzavřena - Nepodařilo se uzavřít poznámku + Nepodařilo se uzavřít poznámku. Odeslat Odstranit bod GPX? Upravit bod GPX @@ -1765,9 +1765,9 @@ Délka %2$s Použít menu Domovská obrazovka nebo menu Na výběr je možnost ovládání aplikace přes flexibilní domovskou obrazovku nebo statické menu. Svůj výběr můžete kdykoliv změnit v nastavení domovské obrazovky. - Vyhnout se schodům - Vyhnout se schodům - Vyhnout se hraničním přechodům + Žádné schody + Vyhne se schodům + Žádné hraniční přechody Nedaleko Skrýt Nejnižší kvalita @@ -1784,9 +1784,9 @@ Délka %2$s Čas: Stezka pro koně Stahovat jen přes WiFi - Aplikace nemá povolen přístup k poloze. - Aplikace nemá povolen přístup k fotoaparátu. - Aplikace nemá povolen přístup k mikrofonu. + Udělit oprávnění pro přístup k poloze. + Udělit oprávnění pro přístup k fotoaparátu. + Udělit oprávnění pro přístup k mikrofonu. Aktualizovat každých Okamžité aktualizace Aktualizovat nyní @@ -1843,32 +1843,32 @@ Délka %2$s Nahrát anonymně Zobrazit posuvník průhlednosti Nedostatek místa! - V úložišti je zapotřebí dočasně {3} MB a trvale {1} MB. - Aktuálně je k dispozici pouze {2} MB. +\nV úložišti je zapotřebí dočasně {3} MB a trvale {1} MB. +\n(Aktuálně je k dispozici pouze {2} MB.) Nahrát OSM poznámku Nahrajte OSM poznámku anonymně, nebo prostřednictvím svého účtu OpenStreetMap.org. Posunout ↑ Posunout ↓ Dokončit navigaci Vyhnout se cestě - Přepnuto do interní paměti, protože aktuálně vybraná složka je pouze pro čtení. Prosím zvolte složku v zapisovatelné paměti. + Přepnuto do interní paměti, protože aktuálně vybraná složka je chráněna proti zápisu. Prosím zvolte složku v zapisovatelné paměti. Sdílená paměť Horní panel Celý výpis Výpis Přepočítat trasu - OpenStreetMap uživatelské jméno a heslo + Uživatelské jméno a heslo pro OSM Příspěvky Počet příjemců Počet úprav %1$s, pořadí %2$s, celkový počet úprav %3$s - Pořadí OSM editorů + Pořadí mezi editory OSM Předplatné OsmAnd Live Předplatit - Nutné, abychom vás mohli informovat o příspěvcích. + Nutné, abychom vás mohli informovat o vašich příspěvcích. Veřejné jméno Nezobrazovat mé jméno v hlášeních Oblast podpory - Měsíční cena + Cena za měsíc Měsíční poplatek Aktivní Neaktivní @@ -1879,10 +1879,11 @@ Délka %2$s Část vašeho příspěvku bude zaslána uživatelům OSM, kteří upravují mapu ve zvolené oblasti. Nastavení předplatného Nejprve prosím zakupte předplatné OsmAnd Live - Předplatné umožní hodinové aktualizace pro všechny mapy světa. Část příjmu jde zpět do OSM komunity a za každý příspěvek do OSM je vyplacena odměna. Pokud máte rádi OsmAnd a OSM, chcete je podpořit a být podporováni, toto je výborný způsob, jak to udělat. - Stáhnout {0} soubor(ů)? - V úložišti je zapotřebí dočasně {3} MB a trvale {1} MB. - (Aktuálně je k dispozici {2} MB.) + Předplatné umožní hodinové aktualizace pro všechny mapy světa. +\n Část příjmu jde zpět do OSM komunity a za každý příspěvek do OSM je vyplacena odměna. +\n Pokud máte rádi OsmAnd a OSM, chcete je podpořit a být podporováni, toto je výborný způsob, jak to udělat. + Stáhnout {0} soubor(ů)\? +\nV úložišti je zapotřebí dočasně {3} MB a trvale {1} MB. (Z {2} MB.) První mapová značka Druhá mapová značka Panel nástrojů @@ -1971,7 +1972,7 @@ Délka %2$s Rozšířené hledání souřadnic %1$s zastávek před Přeskočit stahování map - Nemáte nainstalovanou žádnou mapu. Můžete si vybrat mapu ze seznamu, nebo stáhnout mapy později přes \'Menu - %1$s\'. + Nemáte nainstalovanou žádnou offline mapu. Můžete si vybrat mapu ze seznamu, nebo stáhnout mapy později přes \'Menu - %1$s\'. Vybrat jinou oblast Hledání map… Povolit OsmAndu určit vaši polohu a navrhnout mapy pro tuto oblast. @@ -1980,7 +1981,7 @@ Délka %2$s Vyžadováno pro stažení map. Hledání polohy… Volné místo - Úložiště dat OsmAnd (pro mapy, GPX atd.): %1$s. + Úložiště dat OsmAnd (pro mapy, soubory stop atd.): %1$s. Udělit oprávnění Povolit přístup k poloze Nechejte se navigovat a objevte nová místa bez nutnosti připojení k Internetu @@ -1995,21 +1996,21 @@ Délka %2$s Nadzemní objekty Změnit Začít - Předplatné je strháváno měsíčně. Můžete jej kdykoliv zrušit přes Google Play. - Příspěvek komunitě OpenStreetMap - Část peněz z Vašeho příspěvku je zaslána přímo uživatelům, kteří provádějí změny v databázi OpenStreetMap. Cena předplatného pro Vás však zůstává stejná. + Předplatné je strháváno za zvolené období. Můžete jej kdykoliv zrušit přes Google Play. + Příspěvek komunitě OSM + Část peněz z vašeho příspěvku je zaslána přispěvatelům do OSM. Cena předplatného zůstává stejná. Předplatné umožňuje hodinové, denní, týdenní aktualizace a neomezené stahování map celého světa. Získat Získat za %1$s - Získejte neomezené stahování map a aktualizace více než jednou za měsíc: týdenní, denní nebo každou hodinu. + Získejte neomezené stahování map a aktualizace každý týden, den nebo dokonce hodinu. Neomezené stahování map, aktualizací a modul Wikipedie. Míle/metry Hornolužická srbština Nemáte zatím žádné soubory stop - Do složky můžete také přidat GPX soubory + Do složky můžete přidat také soubory stop Přidat další… Vzhled - Povolit rychlé spuštění záznamu + Zapnout rychlý záznam Zobrazit systémové oznámení, které umožňuje spustit nahrávání. Oznámení Pokračovat @@ -2027,8 +2028,8 @@ Délka %2$s Minimální přesnost záznamu Filtr: Nezaznamenávat, dokud není dosažena tato přesnost. Vánoční POI - Před Vánoci a Novým rokem můžete zobrazit POI spojené s Vánoci: vánoční stromky, trhy atd. - Zobrazit vánoční POI? + Jako přípravu na Vánoce a Nový rok si můžete zapnout zobrazení tematických bodů zájmu, jako vánočních stromků, trhů atd. + Zobrazit vánoční body zájmu\? Světle hnědá Tmavě hnědá Barevné schéma vrstevnic @@ -3893,12 +3894,12 @@ Zobrazená oblast: %1$s x %2$s Tato nastavení jsou globální a platí pro všechny profily Přihlásit se do OpenStreetMap Přihlásit se do OpenStreetMap.org - Přihlásit se do OpenStreetMap + Zaregistrovat se do OpenStreetMap Můžete zobrazit své dosud neodeslané změny či chyby v OSM v %1$s. Odeslané body se již v OsmAnd nezobrazují. - Přihlaste se, abyste mohli odesílat nová nebo změněná data, + Abyste mohli odesílat nová nebo změněná data, musíte se přihlásit. \n -\nbuď pomocí bezpečné metody OAuth, nebo pomocí jména a hesla. - Přihlásit se pomocí jména a hesla +\nPřihlásit se můžete pomocí bezpečné metody OAuth nebo jménem a heslem. + Použít jméno a heslo Účet Uživatelské jméno Historie značek @@ -3910,11 +3911,11 @@ Zobrazená oblast: %1$s x %2$s \"Identifikovatelná\" znamená, že trasa bude veřejně dostupná ve vašich GPS trasách a veřejných seznamech GPS tras, tzn. ostatní uživatelé si budou moci stáhnout nezpracovanou trasu a propojit ji s vaším uživatelským jménem. Veřejná data bodů trasy s časovými razítky poskytnutá prostřednictvím GPS API se budou odkazovat na vaši původní stránku s trasou. Zavřít OSM poznámku Komentovat OSM poznámku - Přihlaste se bezpečnou metodou OAuth nebo použijte své přihlašovací jméno a heslo. + Můžete se přihlásit bezpečnou metodou OAuth nebo použít své přihlašovací jméno a heslo. Přidat fotku Zaregistrovat na \nOpenPlaceReviews.org - Přihlaste se na webových stránkách open source projektu OpenPlaceReviews.org a budete moci odesílat ještě více fotografií. + Fotografie poskytuje open source projekt OpenPlaceReviews.org. Abyste mohli nahrát své fotografie, musíte se přihlásit na webové stránce. Vytvořit nový účet Už mám účet %1$s: %2$s @@ -3962,4 +3963,9 @@ Zobrazená oblast: %1$s x %2$s Není zde dostatek místa Vyberte skupiny, které se mají importovat. Vyberte položky, které se mají importovat. + Nepodařilo se odeslat obrázek, zkuste to prosím později + Vyberte obrázek + Přepnout na dev.openstreetmap.org místo openstreetmap.org pro otestování odesílání OSM poznámek, bodů zájmu a GPX stop. + Použít dev.openstreetmap.org + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 6c824c4e78..a29f18e979 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -3957,13 +3957,13 @@ OsmAnd Live Abonnement ist abgelaufen OsmAnd Live Abonnement wurde ausgesetzt OsmAnd Live Abonnement liegt auf Eis - Anmeldung für OpenStreetMap - Anmeldung für OpenStreetMap.org + Bei OpenStreetMap anmelden + Bei OpenStreetMap.org anmelden Anmelden mit OpenStreetMap - Melden Sie sich an, um Änderungen hochzuladen, + Sie müssen sich anmelden, um Änderungen hochzuladen. \n -\nentweder mit OAuth oder mit Ihrem Benutzernamen und Passwort. - Anmelden mit Benutzername und Passwort +\nSie können sich mit der sicheren OAuth-Methode anmelden oder Ihren Benutzernamen und Ihr Passwort verwenden. + Benutzername und Passwort verwenden Konto Benutzername Historie der Marker @@ -3975,11 +3975,11 @@ \"Verfolgbar\" bedeutet, dass die Spur nicht in öffentlichen Auflistungen auftaucht, aber verarbeitete Trackpunkte mit Zeitstempeln davon (die nicht direkt mit Ihnen in Verbindung gebracht werden können) durch Downloads von der öffentlichen GPS API. OSM Notiz schließen OSM Notiz kommentieren - Melden Sie sich mit der sicheren OAuth-Methode an oder verwenden Sie Ihren Benutzernamen und Ihr Passwort. + Sie können sich mit der sicheren OAuth-Methode anmelden oder Ihren Benutzernamen und Ihr Passwort verwenden. Foto hinzufügen Registrieren bei \nOpenPlaceReviews.org - Melden Sie sich auf der Open Data Website OpenPlaceReviews.org an, um noch mehr Fotos hochzuladen. + Fotos werden vom offenen Datenprojekt OpenPlaceReviews.org zur Verfügung gestellt. Um Ihre Fotos hochladen zu können, müssen Sie sich auf der Website anmelden. Neues Konto erstellen Ich habe bereits ein Konto Suchverlauf @@ -4001,4 +4001,7 @@ Wählen Sie Elemente aus, die importiert werden sollen. Wechseln Sie zu dev.openstreetmap.org anstelle von openstreetmap.org, um das Hochladen von OSM-Hinweisen / POI / GPX zu testen. dev.openstreetmap.org verwenden + Bild kann nicht hochgeladen werden, bitte versuchen Sie es später erneut + Bild auswählen + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index b85578312f..2d58674ff2 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -3998,4 +3998,5 @@ Uzi dev.openstreetmap.org Ne povas alŝuti la bildon, reprovu poste Elektu bildon + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-et/strings.xml b/OsmAnd/res/values-et/strings.xml index 3db38e3311..2445b43d8d 100644 --- a/OsmAnd/res/values-et/strings.xml +++ b/OsmAnd/res/values-et/strings.xml @@ -459,7 +459,7 @@ POI sildid Avaneb homme kell Kuva suletud teated - Kuva/peida OSM teated kaardil. + Kuva või peida OSM teated kaardil. OSC - sobib andmete laadimiseks OpenStreetMap\'i andmebaasi. OSC fail Vali faililiik @@ -1012,7 +1012,7 @@ Vaheta %1$s ja %2$s Lähtepunkt Rada salvestatud - Faili nimi on tühi + Faili nimi on puudu Ennista Kuva sõlmevõrgu rattateekonnad Tühjenda %1$s\? @@ -2653,9 +2653,9 @@ Lemmikute või GPX-teekonnapunktide grupina lisatud markerid, mis on märgitud läbituks, jäävad kaardile. Kui grupp pole aktiivne, kaovad markerid kaardilt. Käivita Guaraani - Alpisuusatamine/laskumine + Alpisuusatamine ja mäesuusatamine Nõlvad alpisuusatamisks või laskumiseks ja ligipääs suusatõstukitele. - Murdmaa/põhjamaa suusatamine + Murdmaasuusatamine ja põhja suusaalad Murdmaa või põhjamaa suusatamise rajad. Suusamatkad Suusamatkarajad. @@ -3774,7 +3774,7 @@ \nTellimust saad hallata ja tühistada AppGallery seadistustest. Arveldame tellimuse eest valitud ajavahemiku alusel. Seda saad sa vabalt valitud ajal tühistada AppGallery\'s. Keeruka teekonna koostamine - Väljalogimine õnnestus + Väljalogitud Arendus Kustuta OpenStreetMap\'i OAuth\'i pääsuluba Logi sisse OAuth abil @@ -3809,7 +3809,7 @@ Pruugi kasutajanime ja salasõna Täienduste või muudatuste üleslaadimiseks pead sisse logima. \n -\nSa võid selleks kasutada mõnd turvalust OAuth võimalust või oma kasutajanime ning salasõna. +\nSa võid selleks kasutada mõnd turvalist OAuth võimalust või oma kasutajanime ning salasõna. Kasutajakonto Saada GPX fail OpenStreetMappi Sulge OSM märkus @@ -3821,4 +3821,25 @@ Fotode allikaks on OpenPlaceReviews.org veebisait. Oma fotode üleslaadimiseks peaksid liituma selle veebisaidi kasutajaks. Loo uus kasutajakonto Mul juba on kasutajakonto olemas + Otsinguajalugu + Süst (merekajak) + Mootorpaat + Pildi üleslaadimine ei õnnestunud, palun proovi hiljem uuesti + Vali pilt + Ressursid + Faili ligikaudne suurus + Vali faili eksporditavad andmed. + Importimiseks vajalik + Sinu nutiseadmes on vaba ruumi vaid %1$s. Palun tee ruumi juurde või jäta osa kirjetest eksportimata. + Pole piisavalt ruumi + Vali imporditavad grupid. + Vali imporditavad kirjed. + Lisa Mapillary saiti + Lisa OpenPlaceReviews saiti + Tavasaidi openstreetmap.org asemel kasuta OSM märkuste, huvipunktide või GPX-failide üleslaadimise katsetamiseks arendussaiti dev.openstreetmap.org. + Kasuta dev.openstreetmap.org saiti + OsmAnd kuvam fotosid mitmetest allikatest: +\nOpenPlaceReviews - huvipunkti fotod; +\nMapillary - tänavavaated; +\nWikimedia või veeb - OpenStreetMap\'i andmetes kirjeldatud fotod. \ No newline at end of file diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index ac27f7a76e..9e64844dfd 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -3952,7 +3952,7 @@ \n \nsoit avec OAuth soit avec votre identifiant et mot de passe. Vous pouvez vous connecter avec la méthode sécurisée OAuth ou avec votre identifiant et votre mot de passe. - Connectez-vous au site web du projet OpenPlaceReviews.org pour ajouter des photos. + Les photos sont fournies par le projet OpenPlaceReviews.org. Vous devez vous connecter au site web pour envoyer vos photos. Historique de recherche Kayak Votre appareil n\'a que %1$s disponible. Veuillez libérer de l\'espace ou désélectionner l\'export pour certains éléments. @@ -3975,4 +3975,5 @@ Sélectionnez les objets à importer. Impossible d\'envoyer l\'image, veuillez réessayer plus tard Sélectionnez une image + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml index c83b2f6df1..148c7fe98c 100644 --- a/OsmAnd/res/values-gl/strings.xml +++ b/OsmAnd/res/values-gl/strings.xml @@ -4023,4 +4023,5 @@ Lon %2$s \nOpenPlaceReviews - imaxes POI; \nMapillary - maxes a nivel de rúa; \nWeb / Wikimedia - imaxes POI especificadas nos datos do OpenStreetMap. + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-it/strings.xml b/OsmAnd/res/values-it/strings.xml index a8c2b32d25..c83c5e1385 100644 --- a/OsmAnd/res/values-it/strings.xml +++ b/OsmAnd/res/values-it/strings.xml @@ -3997,4 +3997,5 @@ Utilizza dev.openstreetmap.org Impossibile caricare l\'immagine, riprovare in seguito Scegli la foto + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-large/sizes.xml b/OsmAnd/res/values-large/sizes.xml index 7bb27b3f90..6427534974 100644 --- a/OsmAnd/res/values-large/sizes.xml +++ b/OsmAnd/res/values-large/sizes.xml @@ -78,7 +78,7 @@ 12dp 18dp 12dp - 330dp + 330dp 48dp 18dp 24dp diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index aa23de4b3a..5a6b16d427 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -3994,4 +3994,5 @@ Usar dev.openstreetmap.org Não é possível carregar a imagem, por favor, tente novamente mais tarde Selecione a foto + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml index d18f8ccd4a..24862b4584 100644 --- a/OsmAnd/res/values-pt/strings.xml +++ b/OsmAnd/res/values-pt/strings.xml @@ -1682,7 +1682,7 @@ Nome público Não mostrar o meu nome nos relatórios Região de suporte - O nome do ficheiro contém um carácter inválido + Carácter inválido no nome do ficheiro Relatório para Número de colaboradores Número de edições @@ -2301,7 +2301,7 @@ Adiciona paragem inicial Mover o destino para cima e criá-lo Mostrar anotações fechadas - Mostrar/esconder anotações do OSM no mapa. + Mostrar ou ocultar anotações do OSM no mapa. GPX - adequado para exportar para o JOSM ou outros editores do OSM. OSC - adequado para exportar para o OSM. Ficheiro GPX @@ -3084,9 +3084,9 @@ Alterar o zoom do mapa deslocando a roda para cima e para baixo. Escapar devolve-o à aplicação WunderLINQ. Usar WunderLINQ para controle Adicione pelo menos um item à lista nas configurações de \'Ação rápida\' - Esqui alpino/downhill + Esqui alpino e downhill Pistas para esqui alpino ou downhill e acesso a teleféricos de esqui. - Cross Country/esqui nórdico + Cross Country e esqui nórdico Trilhas para esqui nórdico ou cross-country. Passeios de esqui Rotas para excursões de esqui. @@ -3425,7 +3425,7 @@ Sombras de relevo %1$s de %2$s Pistas - Mostrar / ocultar terreno + Mostrar ou ocultar terrenos Ocultar terreno Mostrar terreno Um botão para mostrar ou esconder a camada do terreno no mapa. @@ -3676,11 +3676,11 @@ Combinar categorias de POI de categorias diferentes. Toque em trocar para selecionar tudo, toque no lado esquerdo para seleção da categoria. Ocultar o transporte público Mostrar transporte público - Mostrar/ocultar transporte público + Mostrar ou ocultar transportes públicos Botão que mostra ou oculta o transporte público no mapa. - Criar / Editar POI + Criar ou editar um POI Posições de estacionamento - Adicionar / Editar Favorito + Adicionar ou editar um favorito Restaurar ordem de itens padrão Voltar à edição O botão de ação alterna entre os perfis selecionados. @@ -3869,7 +3869,7 @@ Adicionar ponto de passagem de trilha Gravação de viagem REC - Especifique o intervalo de registo para a gravação geral da faixa (ativado através do widget de gravação Trip no mapa). + Especifique o intervalo de registo para a gravação geral do trilho (ligado através do widget de \'gravação de viagem\' no mapa). Pausar a gravação da viagem Retomar a gravação da viagem Predefinição do sistema @@ -3890,7 +3890,7 @@ Vai pausar o registo de faixas quando a app for morta (através de apps recentes). (indicação de fundo de OsmAnd desaparece da barra de notificação do Android.) - Função atualizada de Planear uma rota: permite utilizar diferentes tipos de navegação por segmento e a inclusão de faixas \n -\n - Novo menu Aparência para trilhos: selecionar cor, espessura, setas de direção de visualização, ícones de início/fim +\n - Novo menu Aparência para trilhos: selecionar cor, espessura, setas de direção de visualização, ícones de início e fim \n \n - Melhoria da visibilidade dos nós da bicicleta. \n @@ -3906,7 +3906,7 @@ Última modificação Nome: Z – A Nome: A – Z - Ícones de início/fim + Ícones de início e fim Obrigado por comprar \'Curvas de nível\' Assinatura cobrada por período selecionado. Cancele-a na AppGallery a qualquer momento. O pagamento será debitado na sua conta AppGallery no momento da confirmação da compra. @@ -3924,10 +3924,10 @@ Roteamento em duas fases para a navegação automotiva. Desenvolvimento nativos de transportes públicos Mudar para Cálculo de rotas de transporte público Java (seguro) - Realize um login OAuth para usar as funcionalidades do osmedit + Entre com o OAuth para usar os recursos do osmedit Fazer login via OAuth Limpar token do OpenStreetMap OAuth - Logout bem sucedido + Saiu O ficheiro já é importado em OsmAnd Usar algoritmo de roteamento de 2 fases A* Para a condução de motos de neve com estradas e pistas dedicadas. @@ -3961,15 +3961,15 @@ Fazer login ao OpenStreetMap Entrar com OpenStreetMap.org Entrar com OpenStreetMap - Usar nome do utilizador e palavra-passe + Usar o nome do utilizador e palavra-passe Conta Entrar Histórico de marcadores Enviar ficherio de GPX ao OpenStreetMap Insira etiquetas separadas por vírgula. - Público significa que o rastreamento será mostrado publicamente nos Seus traços de GPS e em listas públicas de rastreamento de GPS. Os dados servidos através da API não fazem referência à sua página de rastreamento. As marcas temporais dos pontos de rastreamento não estão disponíveis através da API pública do GPS e os pontos não estão ordenados cronologicamente. No entanto, outros utilizadores ainda são capazes de descarregar o rastreamento bruto da lista pública de rastreamento e de quaisquer carimbos de tempo contidos nela. - Privado significa que o rastreamento não aparecerá em nenhuma listagem pública, mas os pontos de rastreamento dele ainda estarão disponíveis através da API pública do GPS sem carimbos de tempo, mas não serão ordenados cronologicamente. - Identificável significa que o rastreamento será mostrado publicamente nos Seus traços de GPS e em listas públicas de rastreamento de GPS, ou seja, outros utilizadores serão capazes de descarregar o rastreamento bruto e associá-lo ao seu nome de utilizador. Os dados servidos através da API dos pontos de rastreamento referenciarão à sua página de rastreamento original. As marcas de tempo dos pontos de rastreamento estão disponíveis através da API pública do GPS. + \"Público\" significa que o rastreamento é mostrado publicamente em Seus traços de GPS e em listas públicas de rastreamento de GPS, e na lista pública de rastreamento com carimbos de data e hora na forma bruta. Os dados servidos através da API não fazem referência à sua página de rastreamento. Os marcadores de ponto de rastreamento não estão disponíveis através da API de GPS pública, e os pontos de rastreamento não estão ordenados cronologicamente. + \"Privado\" significa que o rastreamento não aparece em nenhuma listagem pública, mas os pontos de rastreamento dela em ordem não cronológica estão disponíveis através da API pública do GPS sem carimbos de tempo. + \"Identificável\" significa que o rastreamento será mostrado publicamente em Seus traços de GPS e em listas públicas de rastreamento de GPS, ou seja, outros utilizadoes serão capazes de descarregar o rastreamento bruto e associá-lo ao seu nome de utilizador. Os dados públicos de pontos de rastreamento marcados com a hora da API do GPS servidos através da API de pontos de rastreamento farão referência à sua página de rastreamento original. \"Rastreável\" significa que o rastreamento não aparece em nenhuma listagem pública, mas pontos de rastreamento processados com carimbos de tempo a partir dele (que não podem ser associados diretamente a si) fazem através de descarregadas da API pública do GPS. Fechar nota do OSM Comentário de nota do OSM @@ -4001,4 +4001,5 @@ Não é possível enviar a imagem, por favor, tente novamente mais tarde Selecione a imagem Mude para usar dev.openstreetmap.org ao invés de openstreetmap.org para testar enviar uma OSM Nota / POI / GPX. + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml index fb1dc5e65d..8f3eba7cf1 100644 --- a/OsmAnd/res/values-ru/phrases.xml +++ b/OsmAnd/res/values-ru/phrases.xml @@ -3864,4 +3864,8 @@ Неиммиграционные визы Связь Посольство + Субнациональный + Консульское агентство + Раздел интересов + Консульство \ No newline at end of file diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index 1ae090253b..25e450c5d3 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -3480,7 +3480,7 @@ Заменить все Оставить оба Импортированные элементы будут добавлены с префиксом - В OsmAnd уже есть элементы с теми же именами, что и импортированные. + В OsmAnd уже есть элементы с такими же именами, как у импортированных. \n \nВыберите действие. Некоторые элементы уже существуют @@ -3992,4 +3992,5 @@ Невозможно отправить изображение, попробуйте позже Выбор изображения Каяк + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml index dd4ed9cf6b..8d461da61d 100644 --- a/OsmAnd/res/values-sc/strings.xml +++ b/OsmAnd/res/values-sc/strings.xml @@ -3996,4 +3996,5 @@ Imprea dev.openstreetmap.org Impossìbile carrigare s\'immàgine, torra a proare prus a tardu Ischerta un\'immàgine + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml index 264a62d5fb..840c817c8e 100644 --- a/OsmAnd/res/values-sk/strings.xml +++ b/OsmAnd/res/values-sk/strings.xml @@ -3993,4 +3993,6 @@ Zvoľte položky, ktoré budú importované. Prepnúť na dev.openstreetmap.org namiesto openstreetmap.org pre otestovanie odosielania OSM poznámok / bodov záujmu / GPX stôp. Použiť dev.openstreetmap.org + + \ No newline at end of file diff --git a/OsmAnd/res/values-sr/strings.xml b/OsmAnd/res/values-sr/strings.xml index c96a4e09e4..734562aaca 100644 --- a/OsmAnd/res/values-sr/strings.xml +++ b/OsmAnd/res/values-sr/strings.xml @@ -257,7 +257,7 @@ Језик није подржан Недостају подаци Отићи до продавнице да скинете изабрани језик? - Обрни GPX смер + Обрни смер стазе Излаз гласовног навођења Звук долазног позива (прекида и блутут у колима) Звучно обавештење @@ -964,8 +964,8 @@ Одреди %1$d излаз и иди Отпреми тачку од интереса Прорачун путање - Још увек немате ниједан GPX фајл - Такође, можете додати GPX фајлове у фасциклу + Још увек немате ниједну датотеку стаза + Такође, можете додати фајлове стаза у фасциклу Додај још… Изглед Укључи брзо снимање @@ -1024,7 +1024,7 @@ Захтеване за преузимање. Претражујем положај… Слободно место складишта - OsmAnd складиште података (за карте, GPX фајлове итд.): %1$s. + OsmAnd складиште података (за карте, фајлове стаза итд.): %1$s. Дајте дозволе Омогућите приступ одређивању положаја Узми упутства и откриј нова места, и без интернета @@ -1244,7 +1244,7 @@ Омогућава брзи допринос Мапилару. Отвори Мапилар Мрежне слике улица за све. Откријте места, сарађујте, освојите свет. - Слике на нивоу улице + Мапилари Мрежне слике улица за све. Откријте места, сарађујте, освојите свет. Ваше одредиште се налази на приватном поседу. Дозволити коришћење приватних путева на овом путовању\? Препокрени претрагу @@ -1579,7 +1579,7 @@ Тренутна Додаје пролазно стајање Додаје прво стајање - Прикажи/сакриј ОСМ белешке на карти. + Прикажи или сакриј ОСМ белешке на карти. GPX фајл • Ново: Подршка за глобалне туристичке водиче без потребе за интернет конекцијом. Референтни положаји су повезани на карти. Иницијални подаци са сајта Wikivoyage. \n @@ -1781,7 +1781,7 @@ У последњих пар метара Обавештење о доласку Колико брзо желите да добијете обавештење о пристизању? - Користи уређивање без мреже. + Ако је омогућено уређивање ван мреже, тада ће се промене прво сачувати локално и отпремити по захтеву, у супротном ће се промене одмах отпремити. Отпремам… {0} тачака од интереса/белешки отпремљено Отпреми све @@ -1812,7 +1812,7 @@ Опште Опште поставке апликације Ваше ОСМ корисничко име - Ваша ОСМ лозинка + Лозинка Прозирна тема Обриши %1$s? Засеок @@ -2156,7 +2156,7 @@ Морате имати интернет да бисте инсталирали овај додатак. Преузми Пмаетно прерачунавање пута - За дужа путовања, прерачунавај само први део пута. + Прерачунава само почетни део руте. Може се користити за дуга путовања. Да ли Вам се OsmAnd свиђа? Важно нам је да чујемо Ваше мишљење. Оцените ову апликацију @@ -2216,7 +2216,7 @@ Ујутро Број сарадника Број измена - Име фајла садржи недозвољене карактере + Недозвољен знак у имену датотеке Брзе радње Радња %d Екран %d @@ -2954,10 +2954,10 @@ Прикажи још Приказане путање Укрцавање на стајању - Прикажи/сакриј GPX путање - Дугме које приказује или сакрива одабране GPX путање са карте. - Сакриј GPX путање - Прикажи GPX путање + Прикажи/сакриј путање + Дугме које приказује или сакрива одабране путање са карте. + Сакриј путање + Прикажи путање Омогући јавни превоз на OsmAnd Live изменама. OsmAnd Live јавни превоз Калдрма @@ -3136,9 +3136,9 @@ Сакриј лењир компас Базирајте Ваш произвољни профил на једном од подразумеваних профила, овим се одређују основне поставке као што су подразуемвана видљивост справица или јединице брзине и даљине. Ово су подразумевани апликативни профили, заједно са примерима произвољних профила којима се може проширити: Додајте бар једну ставку на поставкама у „Брзим радњама“ - Алпско/спуст скијање + Алпско и спуст скијање Падине алпског скијања или спуста и приступ ски лифтовима. - Крос-кантри/нордијско скијање + Крос-кантри и нордијско скијање Путеви за нордијско или крос-кантри скијање. Ски туре Путање ски тура. @@ -3363,7 +3363,7 @@ Замени %1$s и %2$s Почетна тачка Стаза сачувана - Име фајла је празно + Празно име датотеке Поврати Дугме које центар екрана узима за тачку поласка. После пита да одаберете одредиште или рачуна пут до одредишта. Прикажи чворове мреже бициклистичких путева @@ -3425,9 +3425,9 @@ Прерачунавање пута Објави Корисничко име и лозинка - Ове поставке се примењују на све профиле. + Ова подешавања додатака су глобална и примењују се на све профиле OSM уређивање - Погледајте Ваше измене или OSM грешке које још нису отпремљене у %1$s. Отпремљене тачке се више неће приказивати. + Све своје још увек не отпремљене измене или ОСМ белешке можете погледати у %1$s. Отпремљене тачке се не приказују у ОсмАнду. OSM Иконица која се приказује за време навођења или померања. Иконица која се приказује у мировању. @@ -3547,7 +3547,7 @@ Поврати све поставке профила\? Чувам нови профил Не могу да направим резервну копију профила. - Прикажи / сакриј терен + Прикажи или сакриј терен Сакриј терен Прикажи терен Дугме да прикаже или сакрите слој терена на карти. @@ -3570,8 +3570,8 @@ Сви језици Не може се наћи такав профил. Светска општа мапа (детаљна) - Креирај / Уреди ПОИ - Додај / Уреди фаворит + Направите или измените ПОИ + Додајте или измените омиљено Повратак уређивању Додај профил Промени профил апликације @@ -3590,7 +3590,7 @@ Профили навођења Сакриј јавни превоз Прикажи јавни превоз - Прикажи/сакриј јавни превоз + Прикажи или сакриј јавни превоз Дугме које приказује или скрива јавни превоз на карти. Паркинг позиције Поврати подразумевани поредак ставки @@ -3642,12 +3642,12 @@ Можете подесити висину пловила да избегнете ниске мостове. Имајте на уму да, уколико мост може да се помера, користићемо његову висину када је отворен. Подесите висину пловила да избегнете ниске мостове. Имајте на уму да, уколико мост може да се помера, користићемо његову висину када је отворен. Подесите ширину пловила и избегните уске мостове - Укључите да омогућите контролу нивоа увећања са дугмићима за јачину звука. + Контролишите ниво зумирања на мапи помоћу дугмића за јачину звука на уређају. Дугмићи за јачину звука за зумирање Деинсталирај и поново покрени Овај уређај нема радаре. Ролери - Поновно покретање је потребно да се потпуно избришу подаци о радарима. + Поново покрените апликацију да бисте избрисали све податке брзинских камера. %1$s обрисано Лимит дужине Курс @@ -3744,14 +3744,14 @@ Додатне мапе су потребне да бисте видели нагибе на мапи. Можете прочитати више о нагибима у %1$s. Омогућите да би видели сенке брда или мапе нагиба. Можете прочитати више о овим врстама карта на нашем сајту. - Сви подаци %1$S су увезени, можете да употребите дугмад испод да би сте отворили неопходни део апликације ради управљања њима. - Османд проверава %1$S постојање дупликата са постојећим елементима у апликацији. + Сви подаци из %1$s су увезени, можете да употребите дугмад испод да би сте отворили неопходни део апликације ради управљања њима. + Османд проверава %1$s постојање дупликата са постојећим елементима у апликацији. \n \nТо може да потраје неко време. Нагиби Прилагодите количину елемената у \"Фиоци\", \"Подешавању мапе\" и \"Контекст менију\". \n -\nОнемогућите некоришћене додатке да сакријете све њихове контроле. %1$е. +\nОнемогућите некоришћене додатке да сакријете све њихове контроле. %1$s. Елементи Фиоке, Контекст мени Акције Контекст менија Наплатом ће бити оптерећен ваш Гугл Плеј налог при потврди куповине. @@ -3787,18 +3787,18 @@ \n \n%2$s: су нивои при којима ће оригиналне плочице бити видљиве, а умањење или увећање биће изван ових вредности. Унесите дужину возила, нека ограничења пута могу бити примењена за дужа возила. - Обриши следећу одредишну тачку + Обриши најближу одредишну тачку Молимо одредите име тачке Тренутна одредишна тачка биће уклоњена. Ако је она одредишна, стопираће се навигација. Преузмите мапе Википедије - Информације о тачкама од интереса потражите од Википедије. То је ваш џепни ванмрежни водич - само омогућите додатак Википедиа и уживајте у чланцима о објектима око вас. + Информације о тачкама од интереса потражите на Википедији. То је ваш џепни ванмрежни водич - само укључите додатак Википедија и уживајте у чланцима о објектима око вас. Ендуро скутер Скутер Инвалидска колица Инвалидска колица напред Корпа Затворена ОСМ белешка - За наставак морате да одредите радне дане + За наставак одредите радне дане Рута између тачака Планирај руту Додајте стази @@ -3809,7 +3809,7 @@ Стрелице смера Чврст Додата тачка неће бити видљива на мапи, пошто је одабрана група сакривена, можете је пронаћи у „%s“. - Прикажи почетно крајне иконе + Прикажи почетне и крајне иконе Последње измењена Увези путању Отвори постојећу путању @@ -3820,25 +3820,23 @@ Сачувај као нову стазу Обрнута рута Читава стаза ће се прерачунати користећи одабрани профил. - Само ће се следећи сегмент прерачунати користећи одабрани профил. - Изаберите како повезати тачке, са правом линијом, или израчунајте руту између њих са одабраним профилом. + Само ће следећи сегмент бити прерачунат користећи одабрани профил. + Изаберите како повезати тачке, по правој линији, или израчунајте руту између њих како је доле назначено. Цела стаза Следећи сегмент - Да бисте користили ову опцију, ОсмАнд мора да прилагоди вашу стазу путевима на мапи. -\n -\n На следећем кораку мора ћете одабрати навигацијски профил како бисте открили дозвољене путеве и праг удаљености и тиме приближили вашу стазу путевима. + Затим помоћу једног од ваших навигационих профила прислоните стазу на најближи дозвољени пут да бисте користили ову опцију. Праг удаљености Навигацијски профил Изаберите датотеку записа којој ће се додати нови сегмент. Слике на нивоу улице - Јесте ли сигурни да желите затворити План руте без чувања\? Изгуби ћете све промене. + Да ли сте сигурни да желите да одбаците све промене на планираној рути затварањем\? У случају обрнутог правца Сачувај као нову датотеку стазе Додај у датотеку стазе Путање Путање Путање - GPX + РЕК Уписуј путању у GPX фајл Траса руте Додајте датотеке стаза @@ -3849,9 +3847,9 @@ Сачувај као датотеку стазе Следи стазу Изаберите датотеку стазе ради праћења - Изаберите датотеку стазе ради праћења или увоза са уређаја. + Изаберите датотеку стазе ради праћења или увоза са вашег уређаја. Изаберите другу стазу - Наводите од моје локације до стазе + Наводите од моје позиције до стазе Тачка стазе за навигацију Почетак стазе Најближа тачка @@ -3865,20 +3863,20 @@ Промените врсту руте након Шта је ново Име фајла - + %s изабраних датотека стаза Паузирај снимање пута Додајте бар две тачке. - Одјава успешна + Одјављен „Приватно“ значи да се траг не појављује ни на једној јавној листи, али су тачке праћења у њему у нехронолошком редоследу доступне путем јавног ГПС АПИ-ја без временских ознака. „Могуће је идентификовати“ значи да ће се траг јавно приказати у вашим ГПС траговима и у јавним списковима ГПС трагова, тј. други корисници ће моћи да преузму необрађени траг и повежу га са вашим корисничким именом. Јавни подаци о временским тачкама трага из ГПС АПИ-ја који се сервирају путем АПИ-ја за тачке праћења имаће референцу на вашу оригиналну страницу праћења. „Следљиво“ значи да се траг не приказује нигде на јавним листама, али обрађене тачке праћења са временским ознакама у њима (које не могу бити директно повезане са вама) иду кроз преузимања са јавног ГПС АПИ-ја. Затвори ОСМ белешку Коментар ОСМ напомене - Пријавите се помоћу сигурне методе ОАутх или користите своје корисничко име и лозинку. + Можете се пријавити користећи безбедан ОАут метод или користити своје корисничко име и лозинку. Додај фотографију Региструјте се на -\nOpenPlaceReviews. - Пријавите се на веб локацију пројекта отворених података OpenPlaceReviews.орг да бисте отпремили још више фотографија. +\nOpenPlaceReviews.org + Фотографије пружа пројекат отворених података OpenPlaceReviews.org. Да бисте поставили своје фотографије, морате се пријавити на веб страницу. Направите нови налог Већ имам Претрага @@ -3896,4 +3894,103 @@ Потребно за увоз Уређај има слободно само %1$s. Ослободите мало простора или поништите одабир неких предмета за извоз. Нема довољно простора + Иконе за почетак и завршетак + МГРС + За вожњу моторних санки са наменским путевима и стазама. + МГРС + ОсмАнд користи МГРС, који је сличан УТМ НАТО формату. + Поједностављена стаза + Само линија руте ће бити сачувана, а путне тачке ће бити избрисане. + Паузираће евидентирање стазе када се апликација убије (преко скорашњих програма). (Индикатор рада OsmAnd-а у позадини тада нестаје из обавештајне траке.) + Наведите интервал евидентирања за опште снимање стаза (укључено помоћу виџета „Снимање путовања“ на мапи). + Наставите снимање путовања + Системско подразумевана + Сви наредни сегменти + Претходни сегмент + Сви претходни сегменти + Само изабрани сегмент ће се поново израчунати помоћу изабраног профила. + Сви наредни сегменти ће се поново израчунати помоћу изабраног профила. + Сви претходни сегменти ће се поново израчунати помоћу изабраног профила. + Отвори сачувану + је сачувано + Понови + • Ажурирано Функција планирања руте: омогућава употребу различитих типова навигације по сегменту и укључивање стаза +\n +\n • Нови мени Изглед за стазе: одаберите боју, дебљину, стрелице смера приказа, иконе почетка и завршетка +\n +\n • Побољшана видљивост бициклистичких чворова. +\n +\n • Стазе се сада могу додирнути, имају контекстуални мени са основним информацијама. +\n +\n • Побољшани алгоритми претраге +\n +\n • Побољшане опције праћења стаза у Навигацији +\n +\n • Решени проблеми са увозом / извозом подешавања профила +\n +\n + Последња измена + Име: З - А + Име: А - З + Хвала вам што сте купили „Контурне линије“ + Претплата се наплаћује по изабраном периоду. Откажите га у АппГалери у било ком тренутку. + Уплата ће бити наплаћена са вашег рачуна АппГалери при потврди куповине. +\n +\nПретплата се аутоматски обнавља уколико није отказана пре датума обнове. Ваш рачун ће бити задужен за период обнове (месец / три месеца / година) само на датум обнове. +\n +\nПретплатама можете управљати и отказати их тако што ћете отићи у подешавања апликације АппГалери. + Избегавајте пешачке стазе + Избегавајте пешачке стазе + Развој + ОсмАнд лајв подаци + ОсмАнд лајв подаци + Двофазно усмеравање за аутомобилску навигацију. + Развој матичног јавног превоза + Пребаците се на Јава (безбедан) прорачун рутирања јавног превоза + Пријавите се помоћу ОАут-а да бисте користили осм уређивачке функције + Пријавите се преко ОАут-а + Обришите ОпенСтритМап ОАут токен + Датотека је већ увезена у ОсмАнд + Користите двофазни алгоритам усмеравања А* + Графикон + %1$s подаци доступни само на путевима, морате израчунати руту користећи „Рута између тачака“ да бисте је добили. + Сачекајте поновно израчунавање руте. +\nГрафикон ће бити доступан након поновног израчунавања. + Локалне мапе + %1$s — %2$s + Размак + Аменити + Специал + Превоз + Услуга + Симболи + Спорт + Хитна помоћ + Путовање + Треба да додате најмање две тачке + Пријавите се на OpenStreetMap.org + Пријавите се на OpenStreetMap.org + Пријавите се помоћу ОпенСтритМап + Морате се пријавити да бисте отпремили нове или измењене промене. +\n +\nМожете се пријавити користећи безбедан ОАут метод или користите своје корисничко име и лозинку. + Користите корисничко име и лозинку + Налог + Пријавите се + Управљајте претплатом + Постоји проблем са вашом претплатом. Кликните на дугме да бисте отворили подешавања претплате за Гугле Плеј и да бисте поправили начин плаћања. + Претплата на ОсмАнд лајв је истекла + Претплата на ОсмАнд лајв је паузирана + Претплата на ОсмАнд лајв је на чекању + Историја маркера + Пошаљите ГПКС датотеку на ОпенСтритМап + Унесите ознаке одвојене зарезом. + „Јавно“ значи да је траг јавно приказан у вашим ГПС траговима и на јавним ГПС траговима, као и на јавном списку трагова са временским ознакама у сировом облику. Подаци који се приказују путем АПИ-ја не упућују на вашу страницу трагова. Временске ознаке праћења нису доступне путем јавног ГПС АПИ-ја и тачке праћења нису хронолошки поређане. + Није могуће отпремити слику, покушајте поново касније + Изаберите слику + Изаберите групе које ће бити увезене. + Изаберите ставке које ће бити увезене. + Пређите на употребу dev.openstreetmap.org уместо на openstreetmap.org да бисте тестирали отпремање ОСМ белешке / ПОИ / ГПКС. + Употреби dev.openstreetmap.org + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index a9a6d024db..3e9e76b023 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -3995,4 +3995,5 @@ Використовувати dev.openstreetmap.org Не вдається завантажити зображення, повторіть спробу пізніше Вибрати зображення + %1$s * %2$s \ No newline at end of file diff --git a/OsmAnd/res/values/sizes.xml b/OsmAnd/res/values/sizes.xml index f91581adf6..a086849297 100644 --- a/OsmAnd/res/values/sizes.xml +++ b/OsmAnd/res/values/sizes.xml @@ -257,7 +257,7 @@ 12dp 4dp 8dp - 220dp + 220dp 60dp 52dp 8dp diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 2a704b8798..18c24109e3 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,7 @@ Thx - Hardy --> + You can use Elevation data for consideration of Ascent / Descent for your trip %1$s * %2$s OsmAnd shows photos from several sources:\nOpenPlaceReviews - POI photos;\nMapillary - street-level imagery;\nWeb / Wikimedia - POI photos specified in OpenStreetMap data. Use dev.openstreetmap.org diff --git a/OsmAnd/src/net/osmand/AndroidUtils.java b/OsmAnd/src/net/osmand/AndroidUtils.java index af0d934083..69b55a95f4 100644 --- a/OsmAnd/src/net/osmand/AndroidUtils.java +++ b/OsmAnd/src/net/osmand/AndroidUtils.java @@ -10,6 +10,7 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PointF; @@ -319,6 +320,20 @@ public class AndroidUtils { ); } + public static ColorStateList createColorStateList(Context ctx, boolean night) { + return new ColorStateList( + new int[][] { + new int[] {-android.R.attr.state_enabled}, // disabled + new int[] {android.R.attr.state_checked}, + new int[] {} + }, + new int[] { + Color.GRAY, + ContextCompat.getColor(ctx, night? R.color.active_color_primary_dark : R.color.active_color_primary_light), + Color.GRAY} + ); + } + public static StateListDrawable createCheckedStateListDrawable(Drawable normal, Drawable checked) { return createStateListDrawable(normal, checked, android.R.attr.state_checked); } diff --git a/OsmAnd/src/net/osmand/plus/importfiles/ImportHelper.java b/OsmAnd/src/net/osmand/plus/importfiles/ImportHelper.java index 09d2064284..c7cad00b0c 100644 --- a/OsmAnd/src/net/osmand/plus/importfiles/ImportHelper.java +++ b/OsmAnd/src/net/osmand/plus/importfiles/ImportHelper.java @@ -34,6 +34,7 @@ import net.osmand.plus.dialogs.ImportGpxBottomSheetDialogFragment; import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper.GPXInfo; import net.osmand.plus.measurementtool.MeasurementToolFragment; +import net.osmand.plus.settings.backend.ExportSettingsType; import net.osmand.plus.settings.backend.backup.SettingsHelper; import net.osmand.plus.settings.backend.backup.SettingsItem; import net.osmand.plus.views.OsmandMapTileView; @@ -67,6 +68,8 @@ import static net.osmand.IndexConstants.WPT_CHART_FILE_EXT; import static net.osmand.data.FavouritePoint.DEFAULT_BACKGROUND_TYPE; import static net.osmand.plus.myplaces.FavoritesActivity.GPX_TAB; import static net.osmand.plus.myplaces.FavoritesActivity.TAB_ID; +import static net.osmand.plus.settings.backend.backup.SettingsHelper.REPLACE_KEY; +import static net.osmand.plus.settings.backend.backup.SettingsHelper.SETTINGS_TYPE_LIST_KEY; /** * @author Koen Rabaey @@ -203,10 +206,11 @@ public class ImportHelper { } } + @Nullable public static String getNameFromContentUri(OsmandApplication app, Uri contentUri) { try { String name; - Cursor returnCursor = app.getContentResolver().query(contentUri, new String[] {OpenableColumns.DISPLAY_NAME}, null, null, null); + Cursor returnCursor = app.getContentResolver().query(contentUri, new String[]{OpenableColumns.DISPLAY_NAME}, null, null, null); if (returnCursor != null && returnCursor.moveToFirst()) { int columnIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); if (columnIndex != -1) { @@ -257,18 +261,32 @@ public class ImportHelper { } private void handleOsmAndSettingsImport(Uri intentUri, String fileName, Bundle extras, CallbackWithObject> callback) { - if (extras != null && extras.containsKey(SettingsHelper.SETTINGS_VERSION_KEY) && extras.containsKey(SettingsHelper.SETTINGS_LATEST_CHANGES_KEY)) { + if (extras != null + && extras.containsKey(SettingsHelper.SETTINGS_VERSION_KEY) + && extras.containsKey(SettingsHelper.SETTINGS_LATEST_CHANGES_KEY)) { int version = extras.getInt(SettingsHelper.SETTINGS_VERSION_KEY, -1); String latestChanges = extras.getString(SettingsHelper.SETTINGS_LATEST_CHANGES_KEY); - handleOsmAndSettingsImport(intentUri, fileName, latestChanges, version, callback); + boolean replace = extras.getBoolean(REPLACE_KEY); + ArrayList settingsTypeKeys = extras.getStringArrayList(SETTINGS_TYPE_LIST_KEY); + List settingsTypes = null; + if (settingsTypeKeys != null) { + settingsTypes = new ArrayList<>(); + for (String key : settingsTypeKeys) { + settingsTypes.add(ExportSettingsType.valueOf(key)); + } + } + handleOsmAndSettingsImport(intentUri, fileName, settingsTypes, replace, latestChanges, version, callback); } else { - handleOsmAndSettingsImport(intentUri, fileName, null, -1, callback); + handleOsmAndSettingsImport(intentUri, fileName, null, false, null, -1, + callback); } } - protected void handleOsmAndSettingsImport(Uri uri, String name, String latestChanges, int version, - CallbackWithObject> callback) { - executeImportTask(new SettingsImportTask(activity, uri, name, latestChanges, version, callback)); + protected void handleOsmAndSettingsImport(Uri uri, String name, final List settingsTypes, + final boolean replace, String latestChanges, int version, + CallbackWithObject> callback) { + executeImportTask(new SettingsImportTask(activity, uri, name, settingsTypes, replace, latestChanges, version, + callback)); } protected void handleXmlFileImport(Uri intentUri, String fileName, CallbackWithObject routingCallback) { diff --git a/OsmAnd/src/net/osmand/plus/importfiles/SettingsImportTask.java b/OsmAnd/src/net/osmand/plus/importfiles/SettingsImportTask.java index 991d8a83c4..75c8d55015 100644 --- a/OsmAnd/src/net/osmand/plus/importfiles/SettingsImportTask.java +++ b/OsmAnd/src/net/osmand/plus/importfiles/SettingsImportTask.java @@ -11,38 +11,50 @@ import net.osmand.AndroidUtils; import net.osmand.CallbackWithObject; import net.osmand.FileUtils; import net.osmand.IndexConstants; +import net.osmand.plus.AppInitializer; import net.osmand.plus.CustomOsmandPlugin; import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; import net.osmand.plus.base.BaseLoadAsyncTask; +import net.osmand.plus.settings.backend.ExportSettingsType; +import net.osmand.plus.settings.backend.backup.SettingsHelper; import net.osmand.plus.settings.backend.backup.SettingsHelper.CheckDuplicatesListener; import net.osmand.plus.settings.backend.backup.PluginSettingsItem; import net.osmand.plus.settings.backend.backup.ProfileSettingsItem; import net.osmand.plus.settings.backend.backup.SettingsHelper.SettingsCollectListener; import net.osmand.plus.settings.backend.backup.SettingsHelper.SettingsImportListener; import net.osmand.plus.settings.backend.backup.SettingsItem; +import net.osmand.plus.settings.fragments.ImportCompleteFragment; import net.osmand.plus.settings.fragments.ImportSettingsFragment; import net.osmand.util.Algorithms; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Map; import static net.osmand.plus.AppInitializer.loadRoutingFiles; +import static net.osmand.plus.settings.backend.backup.SettingsHelper.getSettingsToOperate; class SettingsImportTask extends BaseLoadAsyncTask { private Uri uri; private String name; + private List settingsTypes; + private boolean replace; private String latestChanges; private int version; private CallbackWithObject> callback; public SettingsImportTask(@NonNull FragmentActivity activity, @NonNull Uri uri, - @NonNull String name, String latestChanges, int version, - CallbackWithObject> callback) { + @NonNull String name, List settingsTypes, + boolean replace, String latestChanges, int version, + CallbackWithObject> callback) { super(activity); this.uri = uri; this.name = name; + this.settingsTypes = settingsTypes; + this.replace = replace; this.latestChanges = latestChanges; this.version = version; this.callback = callback; @@ -60,7 +72,8 @@ class SettingsImportTask extends BaseLoadAsyncTask { File tempDir = FileUtils.getTempDir(app); final File file = new File(tempDir, name); if (error == null && file.exists()) { - app.getSettingsHelper().collectSettings(file, latestChanges, version, new SettingsCollectListener() { + final SettingsHelper settingsHelper = app.getSettingsHelper(); + settingsHelper.collectSettings(file, latestChanges, version, new SettingsCollectListener() { @Override public void onSettingsCollectFinished(boolean succeed, boolean empty, @NonNull List items) { hideProgress(); @@ -78,10 +91,16 @@ class SettingsImportTask extends BaseLoadAsyncTask { handlePluginImport(pluginItem, file); } if (!pluginIndependentItems.isEmpty()) { - FragmentActivity activity = activityRef.get(); - if (activity != null) { - FragmentManager fragmentManager = activity.getSupportFragmentManager(); - ImportSettingsFragment.showInstance(fragmentManager, pluginIndependentItems, file); + if (settingsTypes == null) { + FragmentActivity activity = activityRef.get(); + if (activity != null) { + FragmentManager fragmentManager = activity.getSupportFragmentManager(); + ImportSettingsFragment.showInstance(fragmentManager, pluginIndependentItems, file); + } + } else { + Map> allSettingsMap = getSettingsToOperate(pluginIndependentItems, false); + List settingsList = settingsHelper.getFilteredSettingsItems(allSettingsMap, settingsTypes); + settingsHelper.checkDuplicates(file, settingsList, settingsList, getDuplicatesListener(file, replace)); } } } else if (empty) { @@ -95,6 +114,42 @@ class SettingsImportTask extends BaseLoadAsyncTask { } } + private CheckDuplicatesListener getDuplicatesListener(final File file, final boolean replace) { + return new CheckDuplicatesListener() { + @Override + public void onDuplicatesChecked(@NonNull List duplicates, List items) { + if (replace) { + for (SettingsItem item : items) { + item.setShouldReplace(true); + } + } + app.getSettingsHelper().importSettings(file, items, "", 1, getImportListener(file)); + } + }; + } + + private SettingsImportListener getImportListener(final File file) { + return new SettingsImportListener() { + @Override + public void onSettingsImportFinished(boolean succeed, @NonNull List items) { + if (succeed) { + app.getRendererRegistry().updateExternalRenderers(); + app.getPoiFilters().loadSelectedPoiFilters(); + AppInitializer.loadRoutingFiles(app, null); + FragmentActivity activity = activityRef.get(); + if (activity instanceof MapActivity) { + ((MapActivity) activity).getMapLayers().getMapWidgetRegistry().updateVisibleWidgets(); + ((MapActivity) activity).updateApplicationModeSettings(); + } + if (file != null && activity != null) { + FragmentManager fm = activity.getSupportFragmentManager(); + ImportCompleteFragment.showInstance(fm, items, file.getName()); + } + } + } + }; + } + private void handlePluginImport(final PluginSettingsItem pluginItem, final File file) { FragmentActivity activity = activityRef.get(); final ProgressDialog progress; diff --git a/OsmAnd/src/net/osmand/plus/importfiles/ZipImportTask.java b/OsmAnd/src/net/osmand/plus/importfiles/ZipImportTask.java index e9bac73258..afdb7a32f2 100644 --- a/OsmAnd/src/net/osmand/plus/importfiles/ZipImportTask.java +++ b/OsmAnd/src/net/osmand/plus/importfiles/ZipImportTask.java @@ -85,7 +85,8 @@ public class ZipImportTask extends BaseLoadAsyncTask { importHelper.handleKmzImport(uri, name + GPX_FILE_EXT, save, useImportDir); } else if (importType == ImportType.SETTINGS) { String name = createUniqueFileName(app, "settings", TEMP_DIR, OSMAND_SETTINGS_FILE_EXT); - importHelper.handleOsmAndSettingsImport(uri, name + OSMAND_SETTINGS_FILE_EXT, null, -1, null); + importHelper.handleOsmAndSettingsImport(uri, name + OSMAND_SETTINGS_FILE_EXT, + null, false, null, -1, null); } } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/HorizontalSelectionAdapter.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/HorizontalSelectionAdapter.java index 06783d6f50..2299a62c7a 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/HorizontalSelectionAdapter.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/HorizontalSelectionAdapter.java @@ -63,6 +63,8 @@ public class HorizontalSelectionAdapter extends RecyclerView.Adapter 0 && editingCtx.getSelectedPointPosition() == -1) { - expandAdditionalInfoView(); - } else { - collapseAdditionalInfoView(); + public void onClick(View v) { + if (portrait) { + if (infoExpanded) { + collapseInfoView(); + } else if (setInfoType(InfoType.POINTS)) { + infoTypeBtn.setSelectedItem(pointsBtn); + } } } }); View applyMovePointButton = mainView.findViewById(R.id.apply_move_point_button); - UiUtilities.setupDialogButton(nightMode, applyMovePointButton, UiUtilities.DialogButtonType.PRIMARY, - R.string.shared_string_apply); + UiUtilities.setupDialogButton(nightMode, applyMovePointButton, + UiUtilities.DialogButtonType.PRIMARY, R.string.shared_string_apply); + applyMovePointButton.setMinimumWidth(btnWidth); applyMovePointButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { @@ -349,8 +343,9 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route View applyPointBeforeAfterButton = mainView.findViewById(R.id.apply_point_before_after_point_button); - UiUtilities.setupDialogButton(nightMode, applyPointBeforeAfterButton, UiUtilities.DialogButtonType.PRIMARY, - R.string.shared_string_apply); + UiUtilities.setupDialogButton(nightMode, applyPointBeforeAfterButton, + UiUtilities.DialogButtonType.PRIMARY, R.string.shared_string_apply); + applyPointBeforeAfterButton.setMinimumWidth(btnWidth); applyPointBeforeAfterButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { @@ -359,8 +354,9 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route }); View addPointBeforeAfterButton = mainView.findViewById(R.id.add_point_before_after_button); - UiUtilities.setupDialogButton(nightMode, addPointBeforeAfterButton, UiUtilities.DialogButtonType.PRIMARY, - R.string.shared_string_add); + UiUtilities.setupDialogButton(nightMode, addPointBeforeAfterButton, + UiUtilities.DialogButtonType.PRIMARY, R.string.shared_string_add); + addPointBeforeAfterButton.setMinimumWidth(btnWidth); addPointBeforeAfterButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { @@ -408,8 +404,9 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route }); View addPointButton = mainView.findViewById(R.id.add_point_button); - UiUtilities.setupDialogButton(nightMode, addPointButton, UiUtilities.DialogButtonType.PRIMARY, - R.string.shared_string_add); + UiUtilities.setupDialogButton(nightMode, addPointButton, + UiUtilities.DialogButtonType.PRIMARY, R.string.shared_string_add); + addPointButton.setMinimumWidth(btnWidth); addPointButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { @@ -425,9 +422,6 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route @Override public void onSelectPoint(int selectedPointPos) { - if (additionalInfoExpanded) { - collapseAdditionalInfoView(); - } if (selectedPointPos != -1) { openSelectedPointMenu(mapActivity); } @@ -449,9 +443,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route measurementLayer.setOnEnterMovePointModeListener(new MeasurementToolLayer.OnEnterMovePointModeListener() { @Override public void onEnterMovePointMode() { - if (additionalInfoExpanded) { - collapseAdditionalInfoView(); - } + collapseInfoViewIfExpanded(); switchMovePointMode(true); } }); @@ -529,37 +521,90 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route return view; } - private void changeAdditionalInfoType(@NonNull AdditionalInfoType type) { - if (!additionalInfoExpanded || !isCurrentAdditionalInfoType(type)) { - MapActivity ma = getMapActivity(); - if (ma == null) return; - - OsmandApplication app = ma.getMyApplication(); - if (AdditionalInfoType.POINTS == type) { - visibleCard = pointsCard; - UiUtilities.updateCustomRadioButtons(app, customRadioButton, nightMode, START); - } else if (AdditionalInfoType.GRAPH == type) { - visibleCard = graphsCard; - UiUtilities.updateCustomRadioButtons(app, customRadioButton, nightMode, END); + private OnRadioItemClickListener getInfoTypeBtnListener(@NonNull final InfoType type) { + return new OnRadioItemClickListener() { + @Override + public boolean onRadioItemClick(RadioItem radioItem, View view) { + if (isCurrentInfoType(type)) { + collapseInfoView(); + return false; + } + return setInfoType(type); } - cardsContainer.removeAllViews(); - View cardView = visibleCard.getView() != null ? visibleCard.getView() : visibleCard.build(ma); - cardsContainer.addView(cardView); + }; + } - currentAdditionalInfoType = type; - additionalInfoExpanded = true; + private boolean setInfoType(@NonNull InfoType type) { + OsmandApplication app = getMyApplication(); + if ((!infoExpanded || !isCurrentInfoType(type)) && app != null) { + if (editingCtx.getPointsCount() > 0 && editingCtx.getSelectedPointPosition() == -1) { + expandInfoView(); + currentInfoType = type; + if (InfoType.POINTS == type) { + visibleCard = pointsCard; + } else if (InfoType.GRAPH == type) { + visibleCard = graphsCard; + } + cardsContainer.removeAllViews(); + View cardView = visibleCard.getView() != null ? visibleCard.getView() : visibleCard.build(app); + cardsContainer.addView(cardView); + return true; + } else { + collapseInfoView(); + } + } + return false; + } + + private void expandInfoView() { + if (portrait) { + infoExpanded = true; + cardsContainer.setVisibility(View.VISIBLE); + setMapPosition(portrait + ? OsmandSettings.MIDDLE_TOP_CONSTANT + : OsmandSettings.LANDSCAPE_MIDDLE_RIGHT_CONSTANT); updateUpDownBtn(); } } - private void updateAdditionalInfoView() { - updateAdditionalInfoView(pointsCard); - updateAdditionalInfoView(graphsCard); + private void collapseInfoViewIfExpanded() { + if (infoExpanded) { + collapseInfoView(); + } } - private void updateAdditionalInfoView(OnUpdateAdditionalInfoListener listener) { + private void collapseInfoView() { + if (portrait) { + infoExpanded = false; + currentInfoType = null; + infoTypeBtn.setSelectedItem(null); + cardsContainer.setVisibility(View.GONE); + setDefaultMapPosition(); + updateUpDownBtn(); + } + } + + private void collapseInfoIfNotEnoughPoints() { + MeasurementToolLayer measurementLayer = getMeasurementLayer(); + if (measurementLayer != null) { + int pointsCount = editingCtx.getPointsCount(); + if (isCurrentInfoType(InfoType.GRAPH) && pointsCount < 2) { + collapseInfoView(); + } else if (pointsCount < 1) { + disable(upDownBtn); + collapseInfoViewIfExpanded(); + } + } + } + + private void updateInfoView() { + updateInfoView(pointsCard); + updateInfoView(graphsCard); + } + + private void updateInfoView(OnUpdateInfoListener listener) { if (listener != null) { - listener.onUpdateAdditionalInfo(); + listener.onUpdateInfo(); } } @@ -576,11 +621,11 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route } private void updateUndoRedoCommonStuff() { - collapseAdditionalInfoIfNoPointsEnough(); + collapseInfoIfNotEnoughPoints(); if (editingCtx.getPointsCount() > 0) { enable(upDownBtn); } - updateAdditionalInfoView(); + updateInfoView(); updateDistancePointsText(); updateSnapToRoadControls(); } @@ -638,9 +683,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route super.onDestroyView(); cancelModes(); exitMeasurementMode(); - if (additionalInfoExpanded) { - collapseAdditionalInfoView(); - } + collapseInfoViewIfExpanded(); MeasurementToolLayer layer = getMeasurementLayer(); if (layer != null) { layer.setOnSingleTapListener(null); @@ -891,9 +934,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route MeasurementToolLayer measurementLayer = getMeasurementLayer(); editingCtx.getCommandManager().execute(new ClearPointsCommand(measurementLayer, ALL)); editingCtx.cancelSnapToRoad(); - if (additionalInfoExpanded) { - collapseAdditionalInfoView(); - } + collapseInfoViewIfExpanded(); updateUndoRedoButton(false, redoBtn); disable(upDownBtn); updateDistancePointsText(); @@ -907,9 +948,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route if (points.size() > 1) { MeasurementToolLayer measurementLayer = getMeasurementLayer(); editingCtx.getCommandManager().execute(new ReversePointsCommand(measurementLayer)); - if (additionalInfoExpanded) { - collapseAdditionalInfoView(); - } + collapseInfoViewIfExpanded(); updateUndoRedoButton(false, redoBtn); updateUndoRedoButton(true, undoBtn); updateDistancePointsText(); @@ -976,9 +1015,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route private void trimRoute(ClearCommandMode before) { MeasurementToolLayer measurementLayer = getMeasurementLayer(); editingCtx.getCommandManager().execute(new ClearPointsCommand(measurementLayer, before)); - if (additionalInfoExpanded) { - collapseAdditionalInfoView(); - } + collapseInfoViewIfExpanded(); editingCtx.setSelectedPointPosition(-1); editingCtx.splitSegments(editingCtx.getBeforePoints().size() + editingCtx.getAfterPoints().size()); updateUndoRedoButton(false, redoBtn); @@ -1130,11 +1167,11 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route private void removePoint(MeasurementToolLayer measurementLayer, int position) { if (measurementLayer != null) { editingCtx.getCommandManager().execute(new RemovePointCommand(measurementLayer, position)); - updateAdditionalInfoView(); + updateInfoView(); updateUndoRedoButton(true, undoBtn); updateUndoRedoButton(false, redoBtn); updateDistancePointsText(); - collapseAdditionalInfoIfNoPointsEnough(); + collapseInfoIfNotEnoughPoints(); } } @@ -1159,9 +1196,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route @Override public void onItemClick(int position) { if (mapActivity != null && measurementLayer != null) { - if (additionalInfoExpanded) { - collapseAdditionalInfoView(); - } + collapseInfoViewIfExpanded(); if (portrait) { setMapPosition(OsmandSettings.MIDDLE_TOP_CONSTANT); } @@ -1182,7 +1217,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route toPosition = holder.getAdapterPosition(); if (toPosition >= 0 && fromPosition >= 0 && toPosition != fromPosition) { editingCtx.getCommandManager().execute(new ReorderPointCommand(measurementLayer, fromPosition, toPosition)); - updateAdditionalInfoView(); + updateInfoView(); updateUndoRedoButton(false, redoBtn); updateDistancePointsText(); mapActivity.refreshMap(); @@ -1248,7 +1283,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route if (!isUndoMode()) { editingCtx.addPoints(); } - updateAdditionalInfoView(); + updateInfoView(); updateDistancePointsText(); } } @@ -1406,7 +1441,9 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route R.id.measurement_points_text_view, R.id.distance_to_center_text_view, R.id.up_down_button, - R.id.measure_mode_controls); + R.id.measure_mode_controls, + R.id.info_type_buttons_container, + R.id.bottom_panel_divider); } } @@ -1444,46 +1481,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route updateUndoRedoButton(true, undoBtn); updateUndoRedoButton(false, redoBtn); updateDistancePointsText(); - updateAdditionalInfoView(); - } - - private void expandAdditionalInfoView() { - if (portrait) { - MapActivity mapActivity = getMapActivity(); - if (mapActivity != null) { - additionalInfoContainer.setVisibility(View.VISIBLE); - AdditionalInfoType typeToShow = currentAdditionalInfoType == null - ? AdditionalInfoType.POINTS : currentAdditionalInfoType; - changeAdditionalInfoType(typeToShow); - setMapPosition(portrait - ? OsmandSettings.MIDDLE_TOP_CONSTANT - : OsmandSettings.LANDSCAPE_MIDDLE_RIGHT_CONSTANT); - } - } - } - - private void collapseAdditionalInfoView() { - if (portrait) { - additionalInfoExpanded = false; - updateUpDownBtn(); - additionalInfoContainer.setVisibility(View.GONE); - setDefaultMapPosition(); - } - } - - private void collapseAdditionalInfoIfNoPointsEnough() { - MeasurementToolLayer measurementLayer = getMeasurementLayer(); - if (measurementLayer != null) { - int pointsCount = editingCtx.getPointsCount(); - if (isCurrentAdditionalInfoType(AdditionalInfoType.GRAPH) && pointsCount < 2) { - collapseAdditionalInfoView(); - } else if (pointsCount < 1) { - disable(upDownBtn); - if (additionalInfoExpanded) { - collapseAdditionalInfoView(); - } - } - } + updateInfoView(); } private void setDefaultMapPosition() { @@ -1510,13 +1508,13 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route } private void updateUpDownBtn() { - Drawable icon = getContentIcon(additionalInfoExpanded + Drawable icon = getContentIcon(infoExpanded ? R.drawable.ic_action_arrow_down : R.drawable.ic_action_arrow_up); upDownBtn.setImageDrawable(icon); } - private boolean isCurrentAdditionalInfoType(@NonNull AdditionalInfoType type) { - return type.equals(currentAdditionalInfoType); + private boolean isCurrentInfoType(@NonNull InfoType type) { + return Algorithms.objectEquals(currentInfoType, type); } public boolean hasVisibleGraph() { @@ -1600,7 +1598,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route switch (finalSaveAction) { case SHOW_SNACK_BAR_AND_CLOSE: final WeakReference mapActivityRef = new WeakReference<>(mapActivity); - snackbar = Snackbar.make(mapActivity.getLayout(), + Snackbar snackbar = Snackbar.make(mapActivity.getLayout(), MessageFormat.format(getString(R.string.gpx_saved_sucessfully), outFile.getName()), Snackbar.LENGTH_LONG) .setAction(R.string.shared_string_undo, new OnClickListener() { @@ -1778,7 +1776,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route } } - public void quit(boolean hidePointsListFirst) { + public void quit(boolean hideInfoViewFirst) { if (editingCtx.getOriginalPointToMove() != null) { cancelMovePointMode(); return; @@ -1793,16 +1791,16 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route dismiss(mapActivity); } } else { - showQuitDialog(hidePointsListFirst); + showQuitDialog(hideInfoViewFirst); } } - private void showQuitDialog(boolean hidePointsListFirst) { + private void showQuitDialog(boolean hideInfoViewFirst) { final MapActivity mapActivity = getMapActivity(); MeasurementToolLayer measurementLayer = getMeasurementLayer(); if (mapActivity != null && measurementLayer != null) { - if (additionalInfoExpanded && hidePointsListFirst) { - collapseAdditionalInfoView(); + if (infoExpanded && hideInfoViewFirst) { + collapseInfoView(); return; } if (!editingCtx.hasChanges()) { @@ -1822,9 +1820,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route if (clearContext) { editingCtx.clearSegments(); } - if (additionalInfoExpanded) { - collapseAdditionalInfoView(); - } + collapseInfoViewIfExpanded(); resetAppMode(); hideSnapToRoadIcon(); if (isInEditMode()) { @@ -1961,9 +1957,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route if (!approximationMode || !editingCtx.getCommandManager().update(command)) { editingCtx.getCommandManager().execute(command); } - if (additionalInfoExpanded) { - collapseAdditionalInfoView(); - } + collapseInfoViewIfExpanded(); updateSnapToRoadControls(); } } @@ -2036,7 +2030,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route return nightMode; } - public interface OnUpdateAdditionalInfoListener { - void onUpdateAdditionalInfo(); + public interface OnUpdateInfoListener { + void onUpdateInfo(); } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/PointsCard.java b/OsmAnd/src/net/osmand/plus/measurementtool/PointsCard.java index f3b55473bc..4507fe5270 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/PointsCard.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/PointsCard.java @@ -7,12 +7,12 @@ import androidx.recyclerview.widget.RecyclerView; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; -import net.osmand.plus.measurementtool.MeasurementToolFragment.OnUpdateAdditionalInfoListener; +import net.osmand.plus.measurementtool.MeasurementToolFragment.OnUpdateInfoListener; import net.osmand.plus.measurementtool.adapter.MeasurementToolAdapter; import net.osmand.plus.routepreparationmenu.cards.BaseCard; import net.osmand.plus.views.controls.ReorderItemTouchHelperCallback; -public class PointsCard extends BaseCard implements OnUpdateAdditionalInfoListener { +public class PointsCard extends BaseCard implements OnUpdateInfoListener { private MeasurementToolAdapter adapter; private MeasurementToolFragment fragment; @@ -23,7 +23,7 @@ public class PointsCard extends BaseCard implements OnUpdateAdditionalInfoListen } @Override - public void onUpdateAdditionalInfo() { + public void onUpdateInfo() { if (adapter != null) { adapter.notifyDataSetChanged(); } @@ -31,7 +31,7 @@ public class PointsCard extends BaseCard implements OnUpdateAdditionalInfoListen @Override public int getCardLayoutId() { - return R.layout.fragment_measurement_tool_points_list; + return R.layout.measurement_tool_points_card; } @Override diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java index d18537bfb8..4c54fa47b0 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java @@ -45,16 +45,22 @@ import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.TimeConditional import net.osmand.plus.routing.RouteProvider; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.settings.backend.ApplicationMode; +import net.osmand.plus.settings.backend.CommonPreference; import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.settings.bottomsheets.ElevationDateBottomSheet; import net.osmand.plus.settings.fragments.BaseSettingsFragment; import net.osmand.router.GeneralRouter; +import net.osmand.router.GeneralRouter.RoutingParameter; import net.osmand.util.Algorithms; import java.io.File; import java.util.Arrays; import java.util.List; +import java.util.Map; import static net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.DRIVING_STYLE; +import static net.osmand.plus.settings.fragments.RouteParametersFragment.RELIEF_SMOOTHNESS_FACTOR; +import static net.osmand.router.GeneralRouter.USE_HEIGHT_OBSTACLES; public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { @@ -68,13 +74,16 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { @ColorRes private int selectedModeColorId; private boolean currentMuteState; + private boolean currentUseHeightState; private MapActivity mapActivity; - StateChangedListener voiceMuteChangeListener; + private CommonPreference useHeightPref; + private StateChangedListener voiceMuteChangeListener; + private StateChangedListener useHeightChangeListener; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - app = getMyApplication(); + app = requiredMyApplication(); settings = app.getSettings(); routingHelper = app.getRoutingHelper(); routingOptionsHelper = app.getRoutingOptionsHelper(); @@ -87,16 +96,13 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { updateWhenMuteChanged(); } }; - } - - public void updateWhenMuteChanged() { - if (app != null) { - boolean changedState = app.getSettings().VOICE_MUTE.getModeValue(applicationMode); - if (changedState != currentMuteState) { - currentMuteState = changedState; - updateParameters(); + useHeightChangeListener = new StateChangedListener() { + @Override + public void stateChanged(Boolean change) { + updateWhenUseHeightChanged(); } - } + }; + useHeightPref = settings.getCustomRoutingBooleanProperty(USE_HEIGHT_OBSTACLES, false); } @Override @@ -139,12 +145,17 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { itemWithCompoundButton.setChecked(itemWithCompoundButton.isChecked()); } } + currentUseHeightState = useHeightPref.getModeValue(applicationMode); + currentMuteState = app.getSettings().VOICE_MUTE.getModeValue(applicationMode); + + useHeightPref.addListener(useHeightChangeListener); app.getSettings().VOICE_MUTE.addListener(voiceMuteChangeListener); } @Override public void onPause() { super.onPause(); + useHeightPref.removeListener(useHeightChangeListener); app.getSettings().VOICE_MUTE.removeListener(voiceMuteChangeListener); } @@ -167,6 +178,24 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { } } + public void updateWhenMuteChanged() { + boolean changedState = app.getSettings().VOICE_MUTE.getModeValue(applicationMode); + if (changedState != currentMuteState) { + currentMuteState = changedState; + updateParameters(); + updateMenu(); + } + } + + public void updateWhenUseHeightChanged() { + boolean changedState = useHeightPref.getModeValue(applicationMode); + if (changedState != currentUseHeightState) { + currentUseHeightState = changedState; + updateParameters(); + updateMenu(); + } + } + private BaseBottomSheetItem createMuteSoundItem(final LocalRoutingParameter optionsItem) { boolean active = !routingHelper.getVoiceRouter().isMuteForMode(applicationMode); int selectedModeColor = ContextCompat.getColor(app, selectedModeColorId); @@ -432,22 +461,21 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { builder.setLayoutId(R.layout.bottom_sheet_item_with_switch_56dp); if (parameter.routingParameter != null && parameter.routingParameter.getId().equals(GeneralRouter.USE_SHORTEST_WAY)) { // if short route settings - it should be inverse of fast_route_mode - builder.setChecked(!settings.FAST_ROUTE_MODE.getModeValue(routingHelper.getAppMode())); + builder.setChecked(!settings.FAST_ROUTE_MODE.getModeValue(applicationMode)); } else { builder.setChecked(parameter.isSelected(settings)); } builder.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - routingOptionsHelper.addNewRouteMenuParameter(applicationMode, parameter); - boolean selected = !parameter.isSelected(settings); - routingOptionsHelper.applyRoutingParameter(parameter, selected); - item[0].setChecked(selected); - int iconId = selected ? parameter.getActiveIconId() : parameter.getDisabledIconId(); - if (iconId != -1) { - item[0].setIcon(getContentIcon(iconId)); + if (USE_HEIGHT_OBSTACLES.equals(parameter.getKey()) && hasReliefParameters()) { + FragmentManager fm = getFragmentManager(); + if (fm != null) { + ElevationDateBottomSheet.showInstance(fm, applicationMode, RouteOptionsBottomSheet.this, false); + } + } else { + applyParameter(item[0], parameter); } - updateMenu(); } }); } @@ -459,6 +487,29 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { } } + private boolean hasReliefParameters() { + Map parameters = app.getRouter(applicationMode).getParameters(); + for (Map.Entry e : parameters.entrySet()) { + RoutingParameter routingParameter = e.getValue(); + if (RELIEF_SMOOTHNESS_FACTOR.equals(routingParameter.getGroup())) { + return true; + } + } + return false; + } + + private void applyParameter(BottomSheetItemWithCompoundButton bottomSheetItem, LocalRoutingParameter parameter) { + routingOptionsHelper.addNewRouteMenuParameter(applicationMode, parameter); + boolean selected = !parameter.isSelected(settings); + routingOptionsHelper.applyRoutingParameter(parameter, selected); + bottomSheetItem.setChecked(selected); + int iconId = selected ? parameter.getActiveIconId() : parameter.getDisabledIconId(); + if (iconId != -1) { + bottomSheetItem.setIcon(getContentIcon(iconId)); + } + updateMenu(); + } + private void updateMenu() { MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java index 430cf122a6..d34144cbdc 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java @@ -542,8 +542,8 @@ public class RoutingOptionsHelper { rp.disabledIconId = R.drawable.ic_action_fuel; break; case GeneralRouter.USE_HEIGHT_OBSTACLES: - rp.activeIconId = R.drawable.ic_action_elevation; - rp.disabledIconId = R.drawable.ic_action_elevation; + rp.activeIconId = R.drawable.ic_action_altitude_average; + rp.disabledIconId = R.drawable.ic_action_altitude_average; break; case GeneralRouter.AVOID_FERRIES: rp.activeIconId = R.drawable.ic_action_fuel; diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomization.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomization.java index 8a43f650ee..742d9b26e1 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomization.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomization.java @@ -287,20 +287,17 @@ public class OsmAndAppCustomization { if (!connectedAppDir.exists()) { connectedAppDir.mkdirs(); } - OutputStream fout = new FileOutputStream(new File(connectedAppDir, iconName)); + OutputStream fout = null; + if (!Algorithms.isEmpty(iconName)) { + fout = new FileOutputStream(new File(connectedAppDir, iconName)); + } try { - Algorithms.streamCopy(is, fout); + if (fout != null) { + Algorithms.streamCopy(is, fout); + } } finally { - try { - is.close(); - } catch (IOException e) { - LOG.error(e); - } - try { - fout.close(); - } catch (IOException e) { - LOG.error(e); - } + Algorithms.closeStream(is); + Algorithms.closeStream(fout); } JSONObject json = new JSONObject(); json.put("", connectedAppDirPath + "/" + iconName); @@ -406,8 +403,7 @@ public class OsmAndAppCustomization { return set.contains(appMode); } - public boolean setNavDrawerLogoWithParams(String imageUri, @Nullable String packageName, - @Nullable String intent) { + public boolean setNavDrawerLogoWithParams(String imageUri, @Nullable String packageName, @Nullable String intent) { return setNavDrawerLogo(imageUri, packageName, intent); } diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java index 065fd2113a..90c63d3334 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java @@ -97,7 +97,7 @@ public class OsmandSettings { private static String CUSTOM_SHARED_PREFERENCES_NAME; private static final String RENDERER_PREFERENCE_PREFIX = "nrenderer_"; - private static final String ROUTING_PREFERENCE_PREFIX = "prouting_"; + public static final String ROUTING_PREFERENCE_PREFIX = "prouting_"; /// Settings variables private final OsmandApplication ctx; diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/backup/SettingsHelper.java b/OsmAnd/src/net/osmand/plus/settings/backend/backup/SettingsHelper.java index babb91a140..6c3cf25178 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/backup/SettingsHelper.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/backup/SettingsHelper.java @@ -481,24 +481,19 @@ public class SettingsHelper { return getFilteredSettingsItems(typesMap, settingsTypes); } - public List getFilteredSettingsItems(Map> additionalData, - List settingsTypes) { + public List getFilteredSettingsItems(Map> allSettingsMap, + List settingsTypes) { List settingsItems = new ArrayList<>(); for (ExportSettingsType settingsType : settingsTypes) { - List settingsDataObjects = additionalData.get(settingsType); + List settingsDataObjects = allSettingsMap.get(settingsType); if (settingsDataObjects != null) { - for (Object object : settingsDataObjects) { - if (object instanceof ApplicationModeBean) { - settingsItems.add(new ProfileSettingsItem(app, null, (ApplicationModeBean) object)); - } - } - settingsItems.addAll(prepareAdditionalSettingsItems(new ArrayList<>(settingsDataObjects))); + settingsItems.addAll(prepareSettingsItems(new ArrayList<>(settingsDataObjects))); } } return settingsItems; } - public Map getAdditionalData(boolean globalExport) { + public Map getSettingsByCategory(boolean globalExport) { Map dataList = new LinkedHashMap<>(); Map> settingsItems = getSettingsItems(globalExport); @@ -692,7 +687,7 @@ public class SettingsHelper { return files; } - public List prepareAdditionalSettingsItems(List data) { + public List prepareSettingsItems(List data) { List settingsItems = new ArrayList<>(); List quickActions = new ArrayList<>(); List poiUIFilters = new ArrayList<>(); @@ -754,10 +749,7 @@ public class SettingsHelper { } if (!appModeBeans.isEmpty()) { for (ApplicationModeBean modeBean : appModeBeans) { - ApplicationMode mode = ApplicationMode.valueOfStringKey(modeBean.stringKey, null); - if (mode != null) { - settingsItems.add(new ProfileSettingsItem(app, mode)); - } + settingsItems.add(new ProfileSettingsItem(app, null, modeBean)); } } if (!osmNotesPointList.isEmpty()) { diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/BooleanPreferenceBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/BooleanPreferenceBottomSheet.java index 3730833d4d..98c4397327 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/BooleanPreferenceBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/BooleanPreferenceBottomSheet.java @@ -9,21 +9,22 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; -import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.settings.backend.BooleanPreference; -import net.osmand.plus.settings.backend.OsmandPreference; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; +import net.osmand.plus.settings.backend.ApplicationMode; +import net.osmand.plus.settings.backend.BooleanPreference; +import net.osmand.plus.settings.backend.OsmandPreference; import net.osmand.plus.settings.fragments.ApplyQueryType; import net.osmand.plus.settings.fragments.OnConfirmPreferenceChange; import net.osmand.plus.settings.fragments.OnPreferenceChanged; @@ -39,7 +40,7 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { @Override public void createMenuItems(Bundle savedInstanceState) { - OsmandApplication app = getMyApplication(); + final OsmandApplication app = getMyApplication(); if (app == null) { return; } @@ -72,7 +73,7 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { .setChecked(checked) .setTitle(checked ? on : off) .setTitleColorId(checked ? activeColor : disabledColor) - .setCustomView(getCustomButtonView(checked)) + .setCustomView(getCustomButtonView(app, getAppMode(), checked, nightMode)) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -91,7 +92,7 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { preferenceBtn[0].setTitle(newValue ? on : off); preferenceBtn[0].setChecked(newValue); preferenceBtn[0].setTitleColorId(newValue ? activeColor : disabledColor); - updateCustomButtonView(v, newValue); + updateCustomButtonView(app, getAppMode(), v, newValue, nightMode); if (targetFragment instanceof OnPreferenceChanged) { ((OnPreferenceChanged) targetFragment).onPreferenceChanged(switchPreference.getKey()); @@ -121,25 +122,24 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { return R.string.shared_string_cancel; } - protected View getCustomButtonView(boolean checked) { - View customView = UiUtilities.getInflater(getContext(), nightMode).inflate(R.layout.bottom_sheet_item_preference_switch, null); - updateCustomButtonView(customView, checked); + protected static View getCustomButtonView(OsmandApplication app, ApplicationMode mode, boolean checked, boolean nightMode) { + View customView = UiUtilities.getInflater(app, nightMode).inflate(R.layout.bottom_sheet_item_preference_switch, null); + updateCustomButtonView(app, mode, customView, checked, nightMode); return customView; } - protected void updateCustomButtonView(View customView, boolean checked) { - OsmandApplication app = requiredMyApplication(); + protected static void updateCustomButtonView(OsmandApplication app, ApplicationMode mode, View customView, boolean checked, boolean nightMode) { Context themedCtx = UiUtilities.getThemedContext(app, nightMode); View buttonView = customView.findViewById(R.id.button_container); - int colorRes = getAppMode().getIconColorInfo().getColor(nightMode); - int color = checked ? getResolvedColor(colorRes) : AndroidUtils.getColorFromAttr(themedCtx, R.attr.divider_color_basic); + int colorRes = mode.getIconColorInfo().getColor(nightMode); + int color = checked ? ContextCompat.getColor(themedCtx, colorRes) : AndroidUtils.getColorFromAttr(themedCtx, R.attr.divider_color_basic); int bgColor = UiUtilities.getColorWithAlpha(color, checked ? 0.1f : 0.5f); int selectedColor = UiUtilities.getColorWithAlpha(color, checked ? 0.3f : 0.5f); + int bgResId = R.drawable.rectangle_rounded_right; if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { - int bgResId = R.drawable.rectangle_rounded_right; int selectableResId = R.drawable.ripple_rectangle_rounded_right; Drawable bgDrawable = app.getUIUtilities().getPaintedIcon(bgResId, bgColor); @@ -147,7 +147,6 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { Drawable[] layers = {bgDrawable, selectable}; AndroidUtils.setBackground(buttonView, new LayerDrawable(layers)); } else { - int bgResId = R.drawable.rectangle_rounded_right; Drawable bgDrawable = app.getUIUtilities().getPaintedIcon(bgResId, bgColor); AndroidUtils.setBackground(buttonView, bgDrawable); } @@ -158,8 +157,8 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { } public static void showInstance(@NonNull FragmentManager fm, String prefId, Fragment target, boolean usedOnMap, - @Nullable ApplicationMode appMode, ApplyQueryType applyQueryType, - boolean profileDependent) { + @Nullable ApplicationMode appMode, ApplyQueryType applyQueryType, + boolean profileDependent) { try { if (fm.findFragmentByTag(BooleanPreferenceBottomSheet.TAG) == null) { Bundle args = new Bundle(); diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java new file mode 100644 index 0000000000..14b0e7eacd --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java @@ -0,0 +1,234 @@ +package net.osmand.plus.settings.bottomsheets; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; + +import net.osmand.AndroidUtils; +import net.osmand.PlatformUtil; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.base.MenuBottomSheetDialogFragment; +import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.LongDescriptionItem; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; +import net.osmand.plus.settings.backend.ApplicationMode; +import net.osmand.plus.settings.backend.CommonPreference; +import net.osmand.plus.settings.fragments.ApplyQueryType; +import net.osmand.plus.settings.fragments.BaseSettingsFragment; +import net.osmand.plus.settings.fragments.OnConfirmPreferenceChange; +import net.osmand.router.GeneralRouter.RoutingParameter; + +import org.apache.commons.logging.Log; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static net.osmand.AndroidUtils.createColorStateList; +import static net.osmand.plus.settings.bottomsheets.BooleanPreferenceBottomSheet.getCustomButtonView; +import static net.osmand.plus.settings.bottomsheets.BooleanPreferenceBottomSheet.updateCustomButtonView; +import static net.osmand.plus.settings.fragments.BaseSettingsFragment.APP_MODE_KEY; +import static net.osmand.plus.settings.fragments.RouteParametersFragment.RELIEF_SMOOTHNESS_FACTOR; +import static net.osmand.plus.settings.fragments.RouteParametersFragment.getRoutingParameterTitle; +import static net.osmand.plus.settings.fragments.RouteParametersFragment.isRoutingParameterSelected; +import static net.osmand.plus.settings.fragments.RouteParametersFragment.updateSelectedParameters; +import static net.osmand.router.GeneralRouter.USE_HEIGHT_OBSTACLES; + +public class ElevationDateBottomSheet extends MenuBottomSheetDialogFragment { + + public static final String TAG = ElevationDateBottomSheet.class.getSimpleName(); + private static final Log LOG = PlatformUtil.getLog(ElevationDateBottomSheet.class); + + private OsmandApplication app; + private ApplicationMode appMode; + private List parameters; + private CommonPreference useHeightPref; + + private BottomSheetItemWithCompoundButton useHeightButton; + private List reliefFactorButtons = new ArrayList<>(); + + private int selectedEntryIndex = -1; + + private String on; + private String off; + private int activeColor; + private int disabledColor; + private int appModeColor; + + @Override + public void onCreate(Bundle savedInstanceState) { + app = requiredMyApplication(); + if (savedInstanceState != null) { + appMode = ApplicationMode.valueOfStringKey(savedInstanceState.getString(APP_MODE_KEY), null); + } + super.onCreate(savedInstanceState); + + Map routingParameterMap = app.getRouter(appMode).getParameters(); + RoutingParameter parameter = routingParameterMap.get(USE_HEIGHT_OBSTACLES); + if (parameter != null) { + useHeightPref = app.getSettings().getCustomRoutingBooleanProperty(parameter.getId(), parameter.getDefaultBoolean()); + } else { + useHeightPref = app.getSettings().getCustomRoutingBooleanProperty(USE_HEIGHT_OBSTACLES, false); + } + parameters = getReliefParametersForMode(routingParameterMap); + for (int i = 0; i < parameters.size(); i++) { + if (isRoutingParameterSelected(app.getSettings(), appMode, parameters.get(i))) { + selectedEntryIndex = i; + } + } + } + + @Override + public void createMenuItems(Bundle savedInstanceState) { + Context themedCtx = UiUtilities.getThemedContext(requireContext(), nightMode); + + on = getString(R.string.shared_string_enable); + off = getString(R.string.shared_string_disable); + appModeColor = appMode.getIconColorInfo().getColor(nightMode); + activeColor = AndroidUtils.resolveAttribute(themedCtx, R.attr.active_color_basic); + disabledColor = AndroidUtils.resolveAttribute(themedCtx, android.R.attr.textColorSecondary); + + items.add(new TitleItem(getString(R.string.routing_attr_height_obstacles_name))); + + createUseHeightButton(themedCtx); + + int contentPaddingSmall = getResources().getDimensionPixelSize(R.dimen.content_padding_small); + items.add(new DividerSpaceItem(app, contentPaddingSmall)); + items.add(new LongDescriptionItem(getString(R.string.elevation_data))); + items.add(new DividerSpaceItem(app, contentPaddingSmall)); + + createReliefFactorButtons(themedCtx); + } + + private void createUseHeightButton(Context context) { + boolean checked = useHeightPref.getModeValue(appMode); + useHeightButton = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() + .setCompoundButtonColorId(appModeColor) + .setChecked(checked) + .setTitle(checked ? on : off) + .setTitleColorId(checked ? activeColor : disabledColor) + .setCustomView(getCustomButtonView(app, appMode, checked, nightMode)) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean newValue = !useHeightPref.getModeValue(appMode); + Fragment target = getTargetFragment(); + if (target instanceof OnConfirmPreferenceChange) { + OnConfirmPreferenceChange confirmInterface = (OnConfirmPreferenceChange) target; + if (confirmInterface.onConfirmPreferenceChange(useHeightPref.getId(), newValue, ApplyQueryType.NONE)) { + updateUseHeightButton(useHeightButton, newValue); + + if (target instanceof BaseSettingsFragment) { + ((BaseSettingsFragment) target).updateSetting(useHeightPref.getId()); + } + } + } else { + useHeightPref.setModeValue(appMode, newValue); + updateUseHeightButton(useHeightButton, newValue); + } + } + }).create(); + items.add(useHeightButton); + } + + private void updateUseHeightButton(BottomSheetItemWithCompoundButton button, boolean newValue) { + enableDisableReliefButtons(newValue); + button.setTitle(newValue ? on : off); + button.setChecked(newValue); + button.setTitleColorId(newValue ? activeColor : disabledColor); + updateCustomButtonView(app, appMode, button.getView(), newValue, nightMode); + } + + private void createReliefFactorButtons(Context context) { + for (int i = 0; i < parameters.size(); i++) { + RoutingParameter parameter = parameters.get(i); + final BottomSheetItemWithCompoundButton[] preferenceItem = new BottomSheetItemWithCompoundButton[1]; + preferenceItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() + .setChecked(i == selectedEntryIndex) + .setButtonTintList(createColorStateList(context, nightMode)) + .setTitle(getRoutingParameterTitle(app, parameter)) + .setLayoutId(R.layout.bottom_sheet_item_with_radio_btn_left) + .setTag(i) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + selectedEntryIndex = (int) preferenceItem[0].getTag(); + if (selectedEntryIndex >= 0) { + RoutingParameter parameter = parameters.get(selectedEntryIndex); + updateSelectedParameters(app, appMode, parameters, parameter.getId()); + } + updateReliefButtons(); + } + }).create(); + items.add(preferenceItem[0]); + reliefFactorButtons.add(preferenceItem[0]); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putString(APP_MODE_KEY, appMode.getStringKey()); + } + + @Override + public void onResume() { + super.onResume(); + updateReliefButtons(); + enableDisableReliefButtons(useHeightButton.isChecked()); + } + + @Override + protected boolean isNightMode(@NonNull OsmandApplication app) { + if (usedOnMap) { + return app.getDaynightHelper().isNightModeForMapControlsForProfile(appMode); + } else { + return !app.getSettings().isLightContentForMode(appMode); + } + } + + private List getReliefParametersForMode(Map parameters) { + List reliefParameters = new ArrayList<>(); + for (RoutingParameter routingParameter : parameters.values()) { + if (RELIEF_SMOOTHNESS_FACTOR.equals(routingParameter.getGroup())) { + reliefParameters.add(routingParameter); + } + } + return reliefParameters; + } + + private void updateReliefButtons() { + for (BottomSheetItemWithCompoundButton item : reliefFactorButtons) { + item.setChecked(item.getTag().equals(selectedEntryIndex)); + } + } + + private void enableDisableReliefButtons(boolean enable) { + for (BaseBottomSheetItem item : reliefFactorButtons) { + item.getView().setEnabled(enable); + item.getView().findViewById(R.id.compound_button).setEnabled(enable); + } + } + + public static void showInstance(FragmentManager fm, ApplicationMode appMode, Fragment target, boolean usedOnMap) { + try { + if (!fm.isStateSaved() && fm.findFragmentByTag(ElevationDateBottomSheet.TAG) == null) { + ElevationDateBottomSheet fragment = new ElevationDateBottomSheet(); + fragment.appMode = appMode; + fragment.setUsedOnMap(usedOnMap); + fragment.setTargetFragment(target, 0); + fragment.show(fm, ScreenTimeoutBottomSheet.TAG); + } + } catch (RuntimeException e) { + LOG.error("showInstance", e); + } + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java index d2679564a8..99fb5fa73a 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java @@ -111,7 +111,7 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot .setCompoundButtonColorId(appModeColorId) .setTitle(enabled ? on : off) .setTitleColorId(enabled ? activeColor : disabledColor) - .setCustomView(getCustomButtonView(enabled)) + .setCustomView(getCustomButtonView(app, getAppMode(), enabled, nightMode)) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -123,7 +123,7 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot preferenceBtn[0].setChecked(enabled); getDefaultValue(); updateSliderView(); - updateCustomButtonView(v, enabled); + updateCustomButtonView(app, getAppMode(), v, enabled, nightMode); Fragment target = getTargetFragment(); float newValue = enabled ? DEFAULT_MODE : DISABLE_MODE; if (target instanceof OnConfirmPreferenceChange) { diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SingleSelectPreferenceBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SingleSelectPreferenceBottomSheet.java index c7ee2da9df..dc673207b2 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SingleSelectPreferenceBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SingleSelectPreferenceBottomSheet.java @@ -26,7 +26,7 @@ public class SingleSelectPreferenceBottomSheet extends BasePreferenceBottomSheet public static final String TAG = SingleSelectPreferenceBottomSheet.class.getSimpleName(); - private static final String SELECTED_ENTRY_INDEX_KEY = "selected_entry_index_key"; + public static final String SELECTED_ENTRY_INDEX_KEY = "selected_entry_index_key"; private static final String USE_COLLAPSIBLE_DESCRIPTION = "use_collapsible_description"; private static final int COLLAPSED_DESCRIPTION_LINES = 4; diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/ExportItemsBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/fragments/ExportItemsBottomSheet.java index 0a310e5c16..3ced930a17 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/ExportItemsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/ExportItemsBottomSheet.java @@ -276,7 +276,7 @@ public class ExportItemsBottomSheet extends MenuBottomSheetDialogFragment { String profileName = modeBean.userProfileName; if (Algorithms.isEmpty(profileName)) { ApplicationMode appMode = ApplicationMode.valueOfStringKey(modeBean.stringKey, null); - profileName = getString(appMode.getNameKeyResource()); + profileName = appMode.toHumanString(); } builder.setTitle(profileName); diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/ExportSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/ExportSettingsFragment.java index af954db7c5..ad4e23aa11 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/ExportSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/ExportSettingsFragment.java @@ -43,12 +43,9 @@ public class ExportSettingsFragment extends BaseSettingsListFragment { public static final String TAG = ImportSettingsFragment.class.getSimpleName(); public static final Log LOG = PlatformUtil.getLog(ImportSettingsFragment.class.getSimpleName()); - private static final String EXPORT_SETTINGS_TAG = "import_settings_tag"; private static final String GLOBAL_EXPORT_KEY = "global_export_key"; private static final String EXPORT_START_TIME_KEY = "export_start_time_key"; private static final String EXPORTING_STARTED_KEY = "exporting_started_key"; - private static final String INCLUDE_ADDITIONAL_DATA_KEY = "include_additional_data_key"; - private static final String INCLUDE_GLOBAL_SETTINGS_KEY = "include_global_settings_key"; private static final String PROGRESS_MAX_KEY = "progress_max_key"; private static final String PROGRESS_VALUE_KEY = "progress_value_key"; @@ -76,7 +73,7 @@ public class ExportSettingsFragment extends BaseSettingsListFragment { progressValue = savedInstanceState.getInt(PROGRESS_VALUE_KEY); } exportMode = true; - dataList = app.getSettingsHelper().getAdditionalData(globalExport); + dataList = app.getSettingsHelper().getSettingsByCategory(globalExport); } @Nullable @@ -132,7 +129,7 @@ public class ExportSettingsFragment extends BaseSettingsListFragment { showExportProgressDialog(); File tempDir = FileUtils.getTempDir(app); String fileName = getFileName(); - List items = app.getSettingsHelper().prepareAdditionalSettingsItems(adapter.getData()); + List items = app.getSettingsHelper().prepareSettingsItems(adapter.getData()); progress.setMax(getMaxProgress(items)); app.getSettingsHelper().exportSettings(tempDir, fileName, getSettingsExportListener(), items, true); } diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/ProfileAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/ProfileAppearanceFragment.java index 8e4dfc14c0..0374a4a42f 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/ProfileAppearanceFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/ProfileAppearanceFragment.java @@ -40,6 +40,7 @@ import androidx.recyclerview.widget.RecyclerView; import net.osmand.AndroidUtils; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; +import net.osmand.plus.activities.MapActivity; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.R; import net.osmand.plus.settings.backend.backup.ProfileSettingsItem; @@ -873,6 +874,10 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment { private void customProfileSaved() { FragmentActivity activity = getActivity(); if (activity != null) { + if (activity instanceof MapActivity) { + ((MapActivity) activity).getMapLayers().getMapWidgetRegistry().updateVisibleWidgets(); + ((MapActivity) activity).updateApplicationModeSettings(); + } FragmentManager fragmentManager = activity.getSupportFragmentManager(); if (!fragmentManager.isStateSaved()) { fragmentManager.popBackStack(); diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java index b688d5dab4..f763d99896 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java @@ -38,6 +38,7 @@ import net.osmand.plus.settings.backend.BooleanPreference; import net.osmand.plus.settings.backend.CommonPreference; import net.osmand.plus.settings.backend.OsmandPreference; import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.settings.bottomsheets.ElevationDateBottomSheet; import net.osmand.plus.settings.bottomsheets.RecalculateRouteInDeviationBottomSheet; import net.osmand.plus.settings.preferences.ListPreferenceEx; import net.osmand.plus.settings.preferences.MultiSelectBooleanPreference; @@ -54,6 +55,8 @@ import java.util.Map; import java.util.Set; import static net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.DRIVING_STYLE; +import static net.osmand.plus.settings.backend.OsmandSettings.ROUTING_PREFERENCE_PREFIX; +import static net.osmand.router.GeneralRouter.USE_HEIGHT_OBSTACLES; public class RouteParametersFragment extends BaseSettingsFragment implements OnPreferenceChanged { @@ -63,7 +66,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP private static final String PREFER_ROUTING_PARAMETER_PREFIX = "prefer_"; private static final String ROUTE_PARAMETERS_INFO = "route_parameters_info"; private static final String ROUTE_PARAMETERS_IMAGE = "route_parameters_image"; - private static final String RELIEF_SMOOTHNESS_FACTOR = "relief_smoothness_factor"; + public static final String RELIEF_SMOOTHNESS_FACTOR = "relief_smoothness_factor"; private static final String ROUTING_SHORT_WAY = "prouting_short_way"; private static final String ROUTING_RECALC_DISTANCE = "routing_recalc_distance"; private static final String ROUTING_RECALC_WRONG_DIRECTION = "disable_wrong_direction_recalc"; @@ -87,13 +90,13 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP booleanRoutingPrefListener = new StateChangedListener() { @Override public void stateChanged(Boolean change) { - recalculateRoute(); + recalculateRoute(app, getSelectedAppMode()); } }; customRoutingPrefListener = new StateChangedListener() { @Override public void stateChanged(String change) { - recalculateRoute(); + recalculateRoute(app, getSelectedAppMode()); } }; } @@ -275,12 +278,6 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP MultiSelectBooleanPreference preferRouting = createRoutingBooleanMultiSelectPref(PREFER_ROUTING_PARAMETER_PREFIX, title, "", preferParameters); screen.addPreference(preferRouting); } - if (reliefFactorParameters.size() > 0) { - ListPreferenceEx reliefFactorRouting = createRoutingBooleanListPreference(RELIEF_SMOOTHNESS_FACTOR, reliefFactorParameters); - reliefFactorRouting.setDescription(R.string.relief_smoothness_factor_descr); - - screen.addPreference(reliefFactorRouting); - } for (RoutingParameter p : otherRoutingParameters) { String title = AndroidUtils.getRoutingStringPropertyName(app, p.getId(), p.getName()); String description = AndroidUtils.getRoutingStringPropertyDescription(app, p.getId(), p.getDescription()); @@ -390,6 +387,12 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP if (fragmentManager != null) { RecalculateRouteInDeviationBottomSheet.showInstance(getFragmentManager(), preference.getKey(), this, false, getSelectedAppMode()); } + } else if (!reliefFactorParameters.isEmpty() && preference.getKey().equals(ROUTING_PREFERENCE_PREFIX + USE_HEIGHT_OBSTACLES)) { + FragmentManager fragmentManager = getFragmentManager(); + if (fragmentManager != null) { + ApplicationMode appMode = getSelectedAppMode(); + ElevationDateBottomSheet.showInstance(fragmentManager, appMode, this, false); + } } else { super.onDisplayPreferenceDialog(preference); } @@ -531,14 +534,8 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP @Override public void onApplyPreferenceChange(String prefId, boolean applyToAllProfiles, Object newValue) { if ((RELIEF_SMOOTHNESS_FACTOR.equals(prefId) || DRIVING_STYLE.equals(prefId)) && newValue instanceof String) { - ApplicationMode appMode = getSelectedAppMode(); - String selectedParameterId = (String) newValue; List routingParameters = DRIVING_STYLE.equals(prefId) ? drivingStyleParameters : reliefFactorParameters; - for (RoutingParameter p : routingParameters) { - String parameterId = p.getId(); - setRoutingParameterSelected(settings, appMode, parameterId, p.getDefaultBoolean(), parameterId.equals(selectedParameterId)); - } - recalculateRoute(); + updateSelectedParameters(app, getSelectedAppMode(), routingParameters, (String) newValue); } else if (ROUTING_SHORT_WAY.equals(prefId) && newValue instanceof Boolean) { applyPreference(ROUTING_SHORT_WAY, applyToAllProfiles, newValue); applyPreference(settings.FAST_ROUTE_MODE.getId(), applyToAllProfiles, !(Boolean) newValue); @@ -565,7 +562,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP @Override public void onPreferenceChanged(String prefId) { if (AVOID_ROUTING_PARAMETER_PREFIX.equals(prefId) || PREFER_ROUTING_PARAMETER_PREFIX.equals(prefId)) { - recalculateRoute(); + recalculateRoute(app, getSelectedAppMode()); } } @@ -629,9 +626,9 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP return multiSelectPref; } - private void recalculateRoute() { + private static void recalculateRoute(OsmandApplication app, ApplicationMode mode) { RoutingHelper routingHelper = app.getRoutingHelper(); - if (getSelectedAppMode().equals(routingHelper.getAppMode()) + if (mode.equals(routingHelper.getAppMode()) && (routingHelper.isRouteCalculated() || routingHelper.isRouteBeingCalculated())) { routingHelper.recalculateRouteDueToSettingsChange(); } @@ -645,11 +642,11 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP otherRoutingParameters.clear(); } - private String getRoutingParameterTitle(Context context, RoutingParameter parameter) { + public static String getRoutingParameterTitle(Context context, RoutingParameter parameter) { return AndroidUtils.getRoutingStringPropertyName(context, parameter.getId(), parameter.getName()); } - private boolean isRoutingParameterSelected(OsmandSettings settings, ApplicationMode mode, RoutingParameter parameter) { + public static boolean isRoutingParameterSelected(OsmandSettings settings, ApplicationMode mode, RoutingParameter parameter) { CommonPreference property = settings.getCustomRoutingBooleanProperty(parameter.getId(), parameter.getDefaultBoolean()); if (mode != null) { return property.getModeValue(mode); @@ -658,8 +655,17 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP } } - private void setRoutingParameterSelected(OsmandSettings settings, ApplicationMode mode, - String parameterId, boolean defaultBoolean, boolean isChecked) { + public static void updateSelectedParameters(OsmandApplication app, ApplicationMode mode, + List parameters, String selectedParameterId) { + for (RoutingParameter p : parameters) { + String parameterId = p.getId(); + setRoutingParameterSelected(app.getSettings(), mode, parameterId, p.getDefaultBoolean(), parameterId.equals(selectedParameterId)); + } + recalculateRoute(app, mode); + } + + private static void setRoutingParameterSelected(OsmandSettings settings, ApplicationMode mode, + String parameterId, boolean defaultBoolean, boolean isChecked) { CommonPreference property = settings.getCustomRoutingBooleanProperty(parameterId, defaultBoolean); if (mode != null) { property.setModeValue(mode, isChecked); @@ -678,9 +684,9 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP Drawable disabled = getContentIcon(R.drawable.ic_action_avoid_motorways); Drawable enabled = getActiveIcon(R.drawable.ic_action_motorways); return getPersistentPrefIcon(enabled, disabled); - case GeneralRouter.USE_HEIGHT_OBSTACLES: + case USE_HEIGHT_OBSTACLES: case RELIEF_SMOOTHNESS_FACTOR: - return getPersistentPrefIcon(R.drawable.ic_action_elevation); + return getPersistentPrefIcon(R.drawable.ic_action_altitude_average); case AVOID_ROUTING_PARAMETER_PREFIX: return getPersistentPrefIcon(R.drawable.ic_action_alert); case DRIVING_STYLE: diff --git a/OsmAnd/src/net/osmand/plus/widgets/MultiStateToggleButton.java b/OsmAnd/src/net/osmand/plus/widgets/MultiStateToggleButton.java new file mode 100644 index 0000000000..3bd4c29631 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/widgets/MultiStateToggleButton.java @@ -0,0 +1,183 @@ +package net.osmand.plus.widgets; + +import android.graphics.Color; +import android.graphics.drawable.GradientDrawable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; + +import net.osmand.AndroidUtils; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class MultiStateToggleButton { + + private List items = new ArrayList<>(); + private OsmandApplication app; + private List buttons = new ArrayList<>(); + private List dividers = new ArrayList<>(); + private RadioItem selectedItem; + + private LinearLayout container; + private boolean nightMode; + + public MultiStateToggleButton(OsmandApplication app, LinearLayout container, boolean nightMode) { + this.app = app; + this.container = container; + this.nightMode = nightMode; + } + + public void setItems(RadioItem firstBtn, RadioItem secondBtn, RadioItem ... other) { + items.clear(); + items.add(firstBtn); + items.add(secondBtn); + if (other != null && other.length > 0) { + items.addAll(Arrays.asList(other)); + } + initView(); + } + + private void initView() { + buttons.clear(); + dividers.clear(); + container.removeAllViews(); + for (int i = 0; i < items.size(); i++) { + createBtn(items.get(i)); + if (!isLastItem(i)) { + createDivider(); + } + } + updateView(); + } + + private boolean isLastItem(int index) { + return index == items.size() - 1; + } + + private void createBtn(@NonNull final RadioItem item) { + LayoutInflater inflater = UiUtilities.getInflater(app, nightMode); + ViewGroup button = (ViewGroup) inflater.inflate( + R.layout.custom_radio_btn_text_item, container, false); + TextView title = button.findViewById(R.id.title); + title.setText(item.getTitle()); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + OnRadioItemClickListener l = item.getListener(); + if (l != null && l.onRadioItemClick(item, container)) { + setSelectedItem(item); + } + } + }); + buttons.add(button); + container.addView(button); + } + + private void createDivider() { + int dividerColor = nightMode ? + R.color.stroked_buttons_and_links_outline_dark : + R.color.stroked_buttons_and_links_outline_light; + int width = AndroidUtils.dpToPx(app, 1.0f); + View divider = new View(app); + divider.setLayoutParams(new ViewGroup.LayoutParams(width, ViewGroup.LayoutParams.MATCH_PARENT)); + divider.setBackgroundColor(ContextCompat.getColor(app, dividerColor)); + dividers.add(divider); + container.addView(divider); + } + + public void setSelectedItem(RadioItem selectedItem) { + this.selectedItem = selectedItem; + updateView(); + } + + private void updateView() { + int activeColor = ContextCompat.getColor(app, nightMode + ? R.color.active_color_primary_dark + : R.color.active_color_primary_light); + int textColor = ContextCompat.getColor(app, nightMode + ? R.color.text_color_primary_dark + : R.color.text_color_primary_light); + int radius = AndroidUtils.dpToPx(app, 4); + float[] leftBtnRadii = new float[]{radius, radius, 0, 0, 0, 0, radius, radius}; + float[] rightBtnRadii = new float[]{0, 0, radius, radius, radius, radius, 0, 0}; + float[] centerBtnRadii = new float[]{0, 0, 0, 0, 0, 0, 0, 0}; + boolean isLayoutRtl = AndroidUtils.isLayoutRtl(app); + + GradientDrawable background = new GradientDrawable(); + background.setColor(UiUtilities.getColorWithAlpha(activeColor, 0.1f)); + background.setStroke(AndroidUtils.dpToPx(app, 1), UiUtilities.getColorWithAlpha(activeColor, 0.5f)); + + showAllDividers(); + for (int i = 0; i < items.size(); i++) { + RadioItem item = items.get(i); + ViewGroup container = buttons.get(i); + TextView tvTitle = (TextView) container.findViewById(R.id.title); + if (selectedItem == item) { + if (i == 0) { + background.setCornerRadii(isLayoutRtl ? rightBtnRadii : leftBtnRadii); + hideDividers(0); + } else if (i == items.size() - 1) { + background.setCornerRadii(isLayoutRtl ? leftBtnRadii : rightBtnRadii); + hideDividers(dividers.size() - 1); + } else { + background.setCornerRadii(centerBtnRadii); + hideDividers(i - 1, i); + } + container.setBackgroundDrawable(background); + tvTitle.setTextColor(textColor); + } else { + container.setBackgroundColor(Color.TRANSPARENT); + tvTitle.setTextColor(activeColor); + } + } + } + + private void showAllDividers() { + for (View divider : dividers) { + divider.setVisibility(View.VISIBLE); + } + } + + private void hideDividers(int ... dividerIndexes) { + for (int dividerIndex : dividerIndexes) { + if (dividerIndex >= 0 && dividerIndex < dividers.size()) { + dividers.get(dividerIndex).setVisibility(View.GONE); + } + } + } + + public static class RadioItem { + private String title; + private OnRadioItemClickListener listener; + + public RadioItem(String title) { + this.title = title; + } + + public void setOnClickListener(OnRadioItemClickListener listener) { + this.listener = listener; + } + + public String getTitle() { + return title; + } + + public OnRadioItemClickListener getListener() { + return listener; + } + } + + public interface OnRadioItemClickListener { + boolean onRadioItemClick(RadioItem radioItem, View view); + } +} diff --git a/build.gradle b/build.gradle index a64480346c..6ab4f7a02b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.3.11' + ext.kotlin_version = '1.4.10' repositories { google() mavenCentral() @@ -10,8 +10,8 @@ buildscript { } dependencies { //classpath 'com.android.tools.build:gradle:2.+' - classpath 'com.android.tools.build:gradle:3.2.1' - classpath 'com.google.gms:google-services:3.0.0' + classpath 'com.android.tools.build:gradle:4.1.1' + classpath 'com.google.gms:google-services:4.3.4' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" if (gradle.startParameter.taskNames.toString().contains("huawei")) { @@ -27,7 +27,7 @@ allprojects { repositories { ivy { name = "OsmAndBinariesIvy" - url = "http://builder.osmand.net" + url = "https://builder.osmand.net" layout "pattern", { artifact "ivy/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bf3de21830..622ab64a3c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists