diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java index c8f84796b9..f9015ec48d 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java @@ -696,6 +696,7 @@ public class BinaryMapIndexReader { private void readMapIndex(MapIndex index, boolean onlyInitEncodingRules) throws IOException { int defaultId = 1; int oldLimit; + int encodingRulesSize = 0; while (true) { int t = codedIS.readTag(); int tag = WireFormat.getTagFieldNumber(t); @@ -712,10 +713,14 @@ public class BinaryMapIndexReader { break; case OsmandOdb.OsmAndMapIndex.RULES_FIELD_NUMBER : if (onlyInitEncodingRules) { + if(encodingRulesSize == 0) { + encodingRulesSize = codedIS.getTotalBytesRead(); + } int len = codedIS.readInt32(); oldLimit = codedIS.pushLimit(len); readMapEncodingRule(index, defaultId++); codedIS.popLimit(oldLimit); + index.encodingRulesSizeBytes = (codedIS.getTotalBytesRead() - encodingRulesSize); } else { skipUnknownField(t); } @@ -1829,10 +1834,13 @@ public class BinaryMapIndexReader { public int onewayReverseAttribute = -1; public TIntHashSet positiveLayers = new TIntHashSet(2); public TIntHashSet negativeLayers = new TIntHashSet(2); + public int encodingRulesSizeBytes; // to speed up comparision private MapIndex referenceMapIndex; + + public Integer getRule(String t, String v) { Map m = encodingRules.get(t); if (m != null) { diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java index c98ec6396f..8431df7244 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java @@ -292,6 +292,7 @@ public class BinaryMapRouteReaderAdapter { public static class RouteRegion extends BinaryIndexPart { public int regionsRead; public List routeEncodingRules = new ArrayList(); + public int routeEncodingRulesBytes = 0; public Map decodingRules = null; List subregions = new ArrayList(); List basesubregions = new ArrayList(); @@ -614,6 +615,7 @@ public class BinaryMapRouteReaderAdapter { protected void readRouteIndex(RouteRegion region) throws IOException { int routeEncodingRule = 1; + int routeEncodingRulesSize = 0; while(true){ int t = codedIS.readTag(); int tag = WireFormat.getTagFieldNumber(t); @@ -626,10 +628,13 @@ public class BinaryMapRouteReaderAdapter { break; case OsmandOdb.OsmAndRoutingIndex.RULES_FIELD_NUMBER: { int len = codedIS.readInt32(); + if(routeEncodingRulesSize == 0) { + routeEncodingRulesSize = codedIS.getTotalBytesRead(); + } int oldLimit = codedIS.pushLimit(len); readRouteEncodingRule(region, routeEncodingRule++); - codedIS.skipRawBytes(codedIS.getBytesUntilLimit()); codedIS.popLimit(oldLimit); + region.routeEncodingRulesBytes = codedIS.getTotalBytesRead() - routeEncodingRulesSize; } break; case OsmandOdb.OsmAndRoutingIndex.ROOTBOXES_FIELD_NUMBER : case OsmandOdb.OsmAndRoutingIndex.BASEMAPBOXES_FIELD_NUMBER :{ diff --git a/OsmAnd/res/drawable/ic_action_import_to.xml b/OsmAnd/res/drawable/ic_action_import_to.xml new file mode 100644 index 0000000000..14f6451032 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_import_to.xml @@ -0,0 +1,12 @@ + + + + diff --git a/OsmAnd/res/layout/fragment_show_all_routes.xml b/OsmAnd/res/layout/fragment_show_all_routes.xml index 86ac60d4c5..e15df6947f 100644 --- a/OsmAnd/res/layout/fragment_show_all_routes.xml +++ b/OsmAnd/res/layout/fragment_show_all_routes.xml @@ -249,51 +249,14 @@ - - - - - - - - - - - - - + android:layout_marginLeft="@dimen/fab_margin_right" + android:layout_marginEnd="@dimen/fab_margin_right" + android:layout_marginRight="@dimen/fab_margin_right" /> \ No newline at end of file diff --git a/OsmAnd/res/layout/map_hud_bottom.xml b/OsmAnd/res/layout/map_hud_bottom.xml index acdcc33e56..1fbe5167b0 100644 --- a/OsmAnd/res/layout/map_hud_bottom.xml +++ b/OsmAnd/res/layout/map_hud_bottom.xml @@ -145,94 +145,18 @@ tools:src="@drawable/ic_action_remove_dark" android:contentDescription="@string/snap_to_road" /> - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/map_ruler.xml b/OsmAnd/res/layout/map_ruler.xml new file mode 100644 index 0000000000..62f2b1cca4 --- /dev/null +++ b/OsmAnd/res/layout/map_ruler.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/track_appearance.xml b/OsmAnd/res/layout/track_appearance.xml index a302486a39..0afdd53155 100644 --- a/OsmAnd/res/layout/track_appearance.xml +++ b/OsmAnd/res/layout/track_appearance.xml @@ -90,6 +90,17 @@ + + تخصيص اتجاه الأسهم صلب + التعديل الأخير + استيراد المسار + فتح المسار الموجود + إنشاء مسار جديد + حدد ملف المسار للفتح. + تم \ No newline at end of file diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml index d4f0b2a6e7..808f6ce1e1 100644 --- a/OsmAnd/res/values-eo/phrases.xml +++ b/OsmAnd/res/values-eo/phrases.xml @@ -1192,7 +1192,7 @@ sen pumpilo jes minerala - Akvospeco: sediment-riĉa + sediment-riĉa sulfat(VI)-oza Akvoĉerpejo Vojmontrilo @@ -1859,7 +1859,7 @@ benzino 100-oktannombra plumba naftogaso likva (LPG) por aviadiloj Jet A-1 brulaĵo - AdBlue (akvosolvaĵo de ureo) aldonaĵo + AdBlue (akvosolvaĵo de ureo) Brulaĵo: ligno Brulaĵo: lignokarbo Brulaĵo: karbo @@ -3029,7 +3029,7 @@ Manĝaĵo Benzinejo por boatoj Bestonutrejo - Provizadoj por aranĝoj + Okazaĵaj-provizoj-vendejo Elektraĵ-vendejo Seruristejo Prilumigad-aparata vendejo @@ -3780,7 +3780,7 @@ Fantombiciklo Farbopafado Stacio de montara savservo - Vendejo de sekuriloj + Sekuril-vendejo Kegloludejo Referenc‑numero de skivojo bazo de ĉasistoj diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index 4d47baaff2..abc772d98d 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -3820,4 +3820,22 @@ Rulseĝo (klinita) Gokarto Fermita OSM‑rimarko + La aldonita punkto ne estos videbla sur la mapo, ĉar la elektita grupo estas kaŝita, vi povas trovi ĝin en “%s”. + Necesas enigi tagojn de malfermo por pluigi + Kurso inter punktoj + Plani kurson + Aldoni al spuro + Montri markojn de komenco/fino + Elekti larĝon + Antaŭaj + Elektu tempon/distancon je kiu markoj sur la spuro estos montrataj. + Elektu preferatan manieron de divido: laŭ tempo aŭ laŭ distanco. + Propra + Sagetoj de direkto + Plena + Enporti spuron + Malfermi ekzistan spuron + Krei novan kurson + Elekti dosieron de spuro por malfermi. + Farita \ No newline at end of file diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml index 5e9d8b5c82..a4f25135f7 100644 --- a/OsmAnd/res/values-es-rAR/phrases.xml +++ b/OsmAnd/res/values-es-rAR/phrases.xml @@ -69,7 +69,7 @@ Colchonería;Muebles de dormitorio Boutique de moda Alfombras - Negocio benéfico + Tienda de caridad Higiene personal y del hogar Tienda de ropa Infantil @@ -1175,7 +1175,7 @@ Automática Sin bomba Mineralizada - Característica del agua: lodosa + Lodazal Sulfúrica Toma de agua Especie @@ -1868,7 +1868,7 @@ 100LL (con plomo, para aviones) Autogas (Etanol libre de plomo) Jet A-1 (diésel) - AdBlue + Aditivo para escapes de Diesel (AdBlue) Combustible: madera Combustible: carbón vegetal Combustible: carbón diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index 12950a51a5..6a4d446d06 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -3095,10 +3095,10 @@ Geocodificación Línea recta BRouter (sin conexión) - Enrutamiento de OsmAnd - Perfil de enrutamiento personalizado - Enrutamiento especial - Enrutamiento de terceros + Navegación de OsmAnd + Perfil de navegación personalizado + Navegación especial + Navegación de terceros Perfiles que serán visibles en la aplicación. Perfiles de la aplicación Cambia el zoom del mapa desplazando la rueda hacia arriba y abajo. La tecla «Escape» retrocede a la aplicación WunderLINQ. @@ -3346,13 +3346,13 @@ \n \n • Arreglos en el modo nocturno \n -\n • Se corrigieron algunos problemas de enrutamiento en todo el mundo +\n • Se corrigieron algunos problemas de navegación en todo el mundo \n \n • Se ha actualizado el mapa base con más detalles en la red de caminos. \n \n • Se corrigieron las zonas inundadas en todo el mundo \n -\n • Enrutamiento de esquí: perfil de elevación y complejidad de la ruta añadidos a los detalles de la ruta +\n • Navegación de esquí: perfil de elevación y complejidad de la ruta añadidos a los detalles de la ruta \n \n • Otras correcciones de errores \n @@ -3534,7 +3534,7 @@ \nEl complemento permanecerá en el dispositivo después de desinstalar OsmAnd. Menú %1$s → %2$s → %3$s - Enrutamiento + Navegación Incluir datos adicionales El perfil importado contiene datos adicionales. Pulsa en «Importar» para importar sólo datos de perfil o marca datos adicionales. Puedes marcar datos adicionales para exportar junto con el perfil. @@ -3829,4 +3829,12 @@ Ruta entre puntos Crear una ruta Añadir a una traza + El punto añadido no será visible en el mapa, ya que el grupo elegido está oculto, se puede encontrar en «%s». + Mostrar los iconos de inicio y fin + Elegir la anchura + Marca el intervalo en el que se mostrarán las marcas con distancia o tiempo en la traza. + Marca la opción de división deseada: por tiempo o por distancia. + Personalizado + Flechas de dirección + Sólido \ No newline at end of file diff --git a/OsmAnd/res/values-es-rUS/phrases.xml b/OsmAnd/res/values-es-rUS/phrases.xml index 7f0a081326..20402278df 100644 --- a/OsmAnd/res/values-es-rUS/phrases.xml +++ b/OsmAnd/res/values-es-rUS/phrases.xml @@ -69,7 +69,7 @@ Colchonería;Muebles de dormitorio Boutique de moda Alfombras - Negocio benéfico + Tienda de caridad Higiene personal y del hogar Tienda de ropa Infantil @@ -1175,7 +1175,7 @@ Automática Sin bomba Mineralizada - Característica del agua: lodosa + Lodazal Sulfúrica Toma de agua Especie @@ -1868,7 +1868,7 @@ 100LL (con plomo, para aviones) Autogas (Etanol libre de plomo) Jet A-1 (diésel) - AdBlue + Aditivo para escapes de Diesel (AdBlue) Combustible: madera Combustible: carbón vegetal Combustible: carbón diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml index 0f3ef1ff1b..9f1df61511 100644 --- a/OsmAnd/res/values-es-rUS/strings.xml +++ b/OsmAnd/res/values-es-rUS/strings.xml @@ -2078,7 +2078,7 @@ Grabar Sin datos Activar la grabación rápida - Muestra una notificación del sistema que permite la grabación del viaje. + Muestra una notificación del sistema que permite iniciar la grabación del viaje. Notificaciones Sin archivos GPX aún También puedes añadir archivos GPX a la carpeta @@ -2644,7 +2644,7 @@ Archivo GPX con coordenadas y datos de todas las notas. Acciones Marcador - \'%1$s ediciones, suman %2$s mBTC\' + %1$s ediciones, suman %2$s mBTC Destinatarios de OSM Total de donaciones Sin nombre @@ -3095,10 +3095,10 @@ Geocodificación Línea recta BRouter (sin conexión) - Enrutamiento de OsmAnd - Perfil de enrutamiento personalizado - Enrutamiento especial - Enrutamiento de terceros + Navegación de OsmAnd + Perfil de navegación personalizado + Navegación especial + Navegación de terceros Perfiles que serán visibles en la aplicación. Perfiles de la aplicación Cambia el zoom del mapa desplazando la rueda hacia arriba y abajo. La tecla «Escape» retrocede a la aplicación WunderLINQ. @@ -3346,16 +3346,16 @@ \n \n • Arreglos en el modo nocturno \n -\n • Se corrigieron algunos problemas de enrutamiento en todo el mundo +\n • Se corrigieron algunos problemas de navegación en todo el mundo \n \n • Se ha actualizado el mapa base con más detalles en la red de caminos. \n \n • Se corrigieron las zonas inundadas en todo el mundo \n -\n • Enrutamiento de esquí: perfil de elevación y complejidad de la ruta añadidos a los detalles de la ruta -\n -\n • Otras correcciones de errores +\n • Navegación de esquí: perfil de elevación y complejidad de la ruta añadidos a los detalles de la ruta \n +\n • Otras correcciones de errores +\n \n Puedes aplicar este cambio a todos los perfiles o sólo al marcado. Compartido @@ -3534,7 +3534,7 @@ \nEl complemento permanecerá en el dispositivo después de desinstalar OsmAnd. Menú %1$s → %2$s → %3$s - Enrutamiento + Navegación Incluir datos adicionales El perfil importado contiene datos adicionales. Pulsa en «Importar» para importar sólo datos de perfil o marca datos adicionales. Puedes marcar datos adicionales para exportar junto con el perfil. @@ -3818,4 +3818,20 @@ Proporciona la longitud del vehículo, se pueden aplicar algunas restricciones de rutas para vehículos largos. Motoneta (motor) Motocicleta de enduro + Mostrar los iconos de inicio y fin + Sólido + Personalizado + Debes definir los días laborales para continuar + Elegir la anchura + Ruta entre puntos + Crear una ruta + Nota de OSM cerrada + Marca la opción de división deseada: por tiempo o por distancia. + Marca el intervalo en el que se mostrarán las marcas con distancia o tiempo en la traza. + Flechas de dirección + Silla de ruedas (hacia adelante) + Silla de ruedas + Go-kart + Añadir a una traza + El punto añadido no será visible en el mapa, ya que el grupo elegido está oculto, se puede encontrar en «%s». \ No newline at end of file diff --git a/OsmAnd/res/values-fa/phrases.xml b/OsmAnd/res/values-fa/phrases.xml index 492377da9a..eba643a4f9 100644 --- a/OsmAnd/res/values-fa/phrases.xml +++ b/OsmAnd/res/values-fa/phrases.xml @@ -1451,4 +1451,5 @@ دسترسی کاروان دسترسی اتوبوس بله + منطقهٔ حفاظت‌شده \ No newline at end of file diff --git a/OsmAnd/res/values-gl/phrases.xml b/OsmAnd/res/values-gl/phrases.xml index 355af7af55..88f562e0ac 100644 --- a/OsmAnd/res/values-gl/phrases.xml +++ b/OsmAnd/res/values-gl/phrases.xml @@ -1739,7 +1739,7 @@ Dispensa receitas médicas Campamento de exploradores Acampada libre - Conducir por dentro + Compra dende o coche Servizo no automóbil Cervexaría artesanal Estacional @@ -1996,7 +1996,7 @@ Peixes Respaldo: non Sen saída - Trazos da auga: lama + Lama Marcaxe do camiño Marcaxe de ruta Portaxe ou peaxe para camións @@ -2382,7 +2382,7 @@ Combustíbel 100LL Autogas Combustíbel Jet A-1 - Combustíbel AdBlue + Aditivo para escapes de diesel Combustíbel: madeira Combustíbel: carbón vexetal Combustíbel: carbón diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml index 7a3b144f51..ea17f33034 100644 --- a/OsmAnd/res/values-gl/strings.xml +++ b/OsmAnd/res/values-gl/strings.xml @@ -3851,4 +3851,12 @@ Lon %2$s Ruta entre puntos Planificar unha ruta Engadir a unha pista + O punto engadido non será visíbel no mapa, xa que o grupo escollido está agochado, pódese atopar en \"%s\". + Amosar iconas de comezo e final + Seleccionar largura + Selecciona o intre no cal as marcas con distancia ou tempo na pista serán amosadas. + Selecciona a opción de división desexada: por tempo ou por distancia. + Personalizado + Frechas de dirección + Sólido \ No newline at end of file diff --git a/OsmAnd/res/values-it/strings.xml b/OsmAnd/res/values-it/strings.xml index 1eb7abb563..e9439c7af2 100644 --- a/OsmAnd/res/values-it/strings.xml +++ b/OsmAnd/res/values-it/strings.xml @@ -2984,7 +2984,7 @@ \n Attiva le modifiche al trasporto pubblico in tempo reale con OsmAnd Live. In %1$s - Scendi a + Esci a Sali alla fermata Inverti Questo pulsante mostra o nasconde le tracce GPX selezionate sulla mappa @@ -3765,7 +3765,7 @@ Lombardo Colori personalizzati Cerca in base al PDI - Puoi Esportare o importare le azioni veloci con i profili dell\'applicazione. + Puoi esportare o importare le azioni veloci con i profili dell\'applicazione. Cancellare tutto\? Sei sicuro di volere cancellare definitivamente %d le azioni rapide\? Tempo del blocco schermo @@ -3778,13 +3778,13 @@ Mappa notturna toni Aggiungi sorgente online - Applicando questi cambiamenti i dati memorizzati nella cache verranno cancellati per questa sorgente di mattonelle + Applicando questi cambiamenti, i dati memorizzati nella cache verranno cancellati per questa sorgente di mattonelle Imposta l\'altezza dell\'imbarcazione Puoi mpostare l\'altezza dell\'imbarcazione per evitare ponti bassi. Ricorda che, se il ponte è mobile, useremo la sua altezza da aperto. Imposta l\'altezza dell\'imbarcazione per evitare ponti bassi. Ricorda che, se il ponte è mobile, useremo la sua altezza da aperto. Imposta la larghezza della\"imbarcazione per evitare i ponti stretti Mostra/nascondi Mapillary - Nascondi Mapilly + Nascondi Mapillary Mostra Mapillary Un pulsante per visualizzare nella mappa o nascondere il livello Mapillary . Fornisci la lunghezza del tuo veicolo, alcune restrizioni di percorso potrebbero essere applicate per veicoli. @@ -3800,10 +3800,10 @@ \nScegliendo %2$s. Tutti i dati relativi agli autovelox: avvisi, notifiche, PDI saranno cancellati fino a che OsmAnd non sarà completamente reinstallato. Mantieni attivo Disinstalla - Gli avvisi sulla presenza di autovelox in alcuni paesi è proibita dalla legge. + Gli avvisi sulla presenza di autovelox in alcuni paesi sono proibiti dalla legge. Specifica la lunghezza del veicolo permessa nei percorsi. Lunghezza massima - Bussola + Direzione %1$s cancellato Il riavvio è necessario per cancellare completamente i dati degli autovelox. Disinstalla e Riavvia @@ -3821,5 +3821,23 @@ Sedia a rotelle Go-kart Chiudi la nota OSM - Sedia a rotelle + Sedia a rotelle in avanti + Il punto aggiunto non sarà visibile sulla mappa, dato che il gruppo selezionato è nascosto, puoi trovarlo in \"%s\". + Percorso tra i punti + Mostra le icone di inizio e fine + Personalizzato + Solido + Devi impostare i giorni lavorativi per continuare + Pianifica un percorso + Aggiungi ad una Traccia + Seleziona l\'intervallo a cui i segnaposti con distanza o orario sulla traccia verranno mostrati. + Seleziona l\'opzione desiderata per la divisione: per tempo o per distanza. + Frecce delle direzioni + Seleziona larghezza + Ultima modificata + Importa una traccia + Apri una traccia esistente + Crea un nuovo percorso + Scegli il file di una traccia da aprire. + Fatto \ No newline at end of file diff --git a/OsmAnd/res/values-lv/strings.xml b/OsmAnd/res/values-lv/strings.xml index 33b8d8415a..a837a8252b 100644 --- a/OsmAnd/res/values-lv/strings.xml +++ b/OsmAnd/res/values-lv/strings.xml @@ -594,7 +594,7 @@ Izvēlieties reģionu Izvēlēties krustojumu Tuvākie pakalpojumi - Atvērt karti + Skatīt karti Auto Velobraucējs Gājējs @@ -1014,7 +1014,7 @@ Lietotāja režīmi Izvēlētos lietotāja režīmus varēs lietot aplikācijā Iet kājām - Ūdens transports + Peldlīdzekļi Tiks izdzēsti %1$d osm labojumi. Vai turpināt? Nav automātiskais mērogs OpenMaps Eiropa @@ -1037,7 +1037,7 @@ Atskaņot skaņu fotografējot Izvēlieties vai atskaņot skaņu, nospiežot fotografēšanas pogu Bojas - Aviācija + Lidošana Derīgums (minūtēs): %1$s Attēlu dati: %1$s Attēlu avots %1$s ir saglabāts @@ -1220,7 +1220,7 @@ Braucieni Visi Ceļapunkti - Atvērt karti + Skatīt karti Auto Velobraucējs Gājējs @@ -1311,7 +1311,7 @@ Labā puse Kreisā puse Rādīt - Kartes detaļas + Kartes detalizācija Anonīms lietotājs Anonīms lietotājs nevar: - izveidot grupas @@ -1642,7 +1642,7 @@ QR-kods Karte ir lejupielādēta %1$s karte ir lejupielādēta un gatava lietošanai. - Atvērt karti + Kartes pārlūks Liek aplikācijai palaisties kā pirmo reizi pēc instalācijas, saglabājot visus iestatījumus. Simulēt pirmo palaišanu ģeo: @@ -2480,7 +2480,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl OsmAnd apvienos punktus ar maršrutiem izvēlētajam profilam. Saglabā punktus kā maršruta punktus vai kā līniju. Pārlūkojiet karti un pievienojiet punktus - Mērīt attālumu + Attāluma mērīšana Pieskāriens uz kartes ieslēdz pogas un logrīkus. Pilnekrāna režīms Atzīmēt izietos @@ -2596,9 +2596,9 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Bezceļa Profila iestatīšana Katram profilam ir atsevišķi iestatījumi - Iestatiet noklusētās kartes opcijas profilam - Iestatiet noklusētās ekrāna opcijas profilam - Iestatiet noklusētos navigācijas iestatījumus profilam + izvēlieties kartes iestatījumus profilam + Izvēlieties ekrāna iestatījumus profilam + Izvēlieties navigācijas iestatījumus profilam Norādiet maksimālo daudzumu izmaiņām Izmaiņu daudzums Pamodināt pagriezienos @@ -2820,19 +2820,19 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Lietotāja režīms, iegūts no: %s Slēpes Veids: %s - Pamata profils + Bāzes profils Izvēlieties navigācijas veidu Lūdzu izvēlieties navigācijas veidu jaunajam lietotnes profilam Ievadiet profila vārdu Profila vārds nedrīkst būt tukšs! Dublikāts Šāds profils jau eksistē - Jūs nevarat izdzēst OsmAnd pamata profilus + Jūs nevarat dzēst OsmAnd bāzes profilus Saglabāt izmaiņas Pirms turpināšanas vispirms saglabājiet izmaiņas profilā Izdzēst profilu Vai esiet pārliecināts, ka vēlaties izdzēst %s profilu - Atzīmējiet pamata profilu + Izvēlieties sākuma profilu Balstiet savu profilu uz vienu no noklusētajiem profiliem, kas definēs tādus pamata iestatījumus kā logrīku redzamību un attāluma vai ātruma mērvienības. Šie ir noklusētie lietotnes profili, kopā ar lietotāja veidotajiem profiliem tie var tikt paplašināti uz: Izvēlieties navigācijas veidu "Auto, kravas auto, motocikls" @@ -2861,7 +2861,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Savienot pārrāvumus Treileris Autofurgons - Ņemt vērā īslaicīgus ierobežojumus + Ņemt vērā īslaicīgos ierobežojumus Standarta Pikaps Diena @@ -3186,7 +3186,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Mainīt profilu Valoda un izvade Atiestatīt uz noklusējumiem - Veidot, importēt un labot profilus + Veidot, importēt un rediģēt profilus Pārvaldīt lietotnes profilus… Ietekmē visu aplikāciju OsmAnd iestatījumi @@ -3285,4 +3285,10 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Pievienot profilu, atverot tā failu ar OsmAnd. %1$s importēšanas kļūda: %2$s %1$s importēti. + Atjaunot + Rediģēt profilu sarakstu + Rediģēt profilus + "OsmAnd pamata profilus nevar izdzēst, bet atspējot (no iepriekšējā ekrāna) vai pārkārtot uz leju." + Izvēlētais profils + Nekas nav izvēlēts \ No newline at end of file diff --git a/OsmAnd/res/values-pt-rBR/phrases.xml b/OsmAnd/res/values-pt-rBR/phrases.xml index e8061944ee..f976e9d9d7 100644 --- a/OsmAnd/res/values-pt-rBR/phrases.xml +++ b/OsmAnd/res/values-pt-rBR/phrases.xml @@ -66,7 +66,7 @@ Loja de roupa de cama Butique Loja de tapetes - Brechó beneficente + Loja de caridade Drogaria Loja de roupas Vestuário infantil @@ -1171,7 +1171,7 @@ Elétrica Sem bomba Mineral - Característica d\'água: barrenta + Lama Sulfurosa Ponto de água Torre de resfriamento @@ -1881,7 +1881,7 @@ Combustível 100LL Autogás (GPL) Combustível Jet A-1 - Combustível AdBlue + Fluido de escape diesel Cultivo: grama Cultivo: milho Cultivo: cereais diff --git a/OsmAnd/res/values-pt/phrases.xml b/OsmAnd/res/values-pt/phrases.xml index eb9e32712b..ddfebf39c0 100644 --- a/OsmAnd/res/values-pt/phrases.xml +++ b/OsmAnd/res/values-pt/phrases.xml @@ -286,7 +286,7 @@ Taxa Fumar Entrega - Drive - in + Drive-in Drive - through Serviço de take-away Cocktails @@ -1386,7 +1386,7 @@ Sem bomba Sim Mineral - Característica d\'água: barrenta + Lama Sulfurosa Ponto de água Poste com direções @@ -1785,7 +1785,7 @@ Koshinto Placa azul Jizo - Cruzeiro + Em forma cruzada Veículo Stolpersteine Obelisco @@ -2069,7 +2069,7 @@ Combustível 100LL Autogás (GPL) Combustível Jet A-1 - Combustível AdBlue + Fluido de escape diesel Combustível: madeira Combustível: carvão vegetal Combustível: carvão @@ -3814,4 +3814,7 @@ Vibração: não Seta Vibração + Quarteirão + Bairro + Give-box \ No newline at end of file diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml index 13a9737fe6..db7fad15b5 100644 --- a/OsmAnd/res/values-pt/strings.xml +++ b/OsmAnd/res/values-pt/strings.xml @@ -41,15 +41,15 @@ Lendo cache de imagens… O índice \'\'{0}\'\' não coube na memória A versão do índice \'\'{0}\'\' não é suportada - Não existe orientação vocal disponível, aceda a \"Definições\" → \"Definições de navegação\" → \"Orientação vocal\" e selecione ou descarregue um pacote de instruções vocais. - Nenhum dado de voz especificado + Não existe orientação vocal disponível, aceda a \"Definições\" → \"Definições de navegação\", selecione o perfil → \"Orientação vocal\" e selecione ou descarregue um pacote de instruções vocais. + Selecione um pacote de avisos de voz Mostrar o desempenho da renderização. Mostrar velocidade de renderização Dia Noite Nascer/Pôr-do-Sol Sensor de luz - Selecione a lógica para alternar entre o modo nocturno e diurno. + Ajuste alternar entre o modo noturno e diurno. Modo Dia/Noite Gostaria de descarregar {0} ficheiros ({1} MB)\? {0} objetos estão selecionados @@ -66,17 +66,17 @@ Ativar para calcular a rota mais rápida ou desativar para a rota de poupança de combustível. Ampliação {0}: descarregar {1} quadrículas ({2} MB) Descarregar mapa - Zoom máximo para decarregar + Ampliação máxima a pré-carregar Não é possível descarregar este mapa Processamento contínuo Mostrar processamento contínuo ao invés de imagem inteira de uma vez. - Não foi possível desenhar a área selecionada + Não foi possível desenhar a área selecionada. Não há memória suficiente para mostrar a área selecionada Usar localização… O motor de renderização foi carregado - Não foi possível carregar o renderizador + Não foi possível carregar o renderizador. Renderizadores de vetor - Escolha a aparência dos mapas vetoriais. + Escolha a aparência de renderização Veja o site do POI Mostrar o número de telefone do POI Site @@ -94,7 +94,7 @@ Caminho reverso Nenhum ficheiro GPX encontrado na pasta tracks Ficheiros GPX… - Não foi possível ler dados GPX + Não foi possível ler os dados de GPX. Mapas vetoriais offline Procurar transporte na paragem Modificar POI @@ -102,7 +102,7 @@ Direção da bússola Direção de movimento Sem rotação (norte sempre para cima) - Selecione como o mapa deve ser girado. + Alinhamento do mapa: Rotação do mapa Mostrar rota Favoritos importados @@ -110,7 +110,7 @@ Favoritos guardados em {0} Nenhum ponto favorito para guardar Importar - Erro ao carregar o ficheiro GPX + Não foi possível carregar o GPX. Enviar o relatório Não foi possível encontrar mapas descarregados no cartão de memória. Digite para encontrar um POI @@ -123,7 +123,7 @@ Sobreposição de POI… Fonte dos mapas… Camada de mapa - Encontre um Ponto de Interesse + Busca por POI Utilize um aparelho trackball para mover o mapa. Use o cursor Definir o tempo limite para determinar a localização. @@ -134,9 +134,9 @@ GPS segundos min. - Escolha um intervalo de atualização da sua posição no serviço em segundo plano. + Intervalo de ativar usado pelo serviço de fundo: Intervalo de posição GPS - Escolha um provedor de localização para o serviço em segundo plano. + Método de localização utilizado pelo serviço de fundo: Provedor de localização Rastreia a sua posição enquanto o ecrã está desligado. Executar OsmAnd em segundo plano @@ -153,7 +153,7 @@ Inicializando dados de voz… Os dados de voz utilizam uma versão não suportada Dados de voz corrompidos - Dados de voz selecionados não estão acessíveis + O pacote de avisos de voz selecionado não está acessível O cartão de memória está inacessível. \nSerá impossível ver mapas ou procurar coisas. Cartão de memória está disponível só para leitura. @@ -178,7 +178,7 @@ Paisagem Orientação do mapa Retrato, paisagem ou aparelho. - O formato do horário de abertura não pode ser alterado + Não é possível alterar o formato do horário de abertura. Adicionar uma nova regra Rotas Paragem @@ -197,8 +197,8 @@ Mostrar paragens de transportes públicos Aplicação de navegação OsmAnd Atualização dos dados de POI ({0} foram carregados) - Não foi possível atualizar a lista de POIs locais - Não foi possível carregar dados do servidor + Não foi possível atualizar a lista de POIs locais. + Não foi possível carregar dados do servidor. Não há dados offline para esta região A ampliação permite-lhe atualizar os POIs Atualizar pontos de interesse @@ -222,9 +222,9 @@ Nível de zoom máx Não navegar em mapas on-line para níveis de ampliação além deste. Distância total %1$s, tempo de viagem %2$d h %3$d min. - Escolha um serviço de navegação online ou offline. + Serviço de navegação on-line ou off-line. Serviço de navegação - A pasta de armazenamento de dados no cartão de memória não está acessível! + A pasta de armazenamento não está acessível no cartão de memória! Quer descarregar {0} - {1} \? Já existem dados offline para {0} ({1}). Atualizá-los ({2})\? Endereço @@ -238,7 +238,7 @@ Mostrar rota Iniciar orientação Meio de transporte: - Por favor, primeiro selecione um destino + Por favor, define o destino primeiro Navegação A aplicação do estado do GPS não está instalada. Pesquisar na loja de aplicações\? Horas de abertura @@ -254,14 +254,14 @@ Carregando ruas… Carregando cidades… POI - Não foi possível guardar o ficheiro GPX - Não foi possível calcular a rota - Não foi possível calcular a rota - A rota calculada está vazia + Não foi possível gravar o ficheiro GPX. + Não foi possível calcular a rota. + Não foi possível calcular a rota. + A rota calculada está vazia. Nova rota calculada, distância - Chegou ao seu destino + Chegou. Coordenadas inválidas - Voltar ao mapa do OsmAnd + Voltar ao mapa Fechar Carregando dados… Lendo dados locais… @@ -271,7 +271,7 @@ Utilize a Internet para calcular uma rota. Utilizar navegação online A sua palavra-passe no OSM - Especifique as configurações de OpenStreetMap.org (OSM) necessárias para envios OSM. + Especifique as configurações de OpenStreetMap.org (OSM) necessárias para envios ao OSM. Especifique o idioma, descarregar/enviar dados. Dados OSM @@ -283,7 +283,7 @@ Configurações Guardar agora o trilho atual num ficheiro GPX. Guardar o trilho atual - Escolher o intervaloentre posições nas trilhas durante a navegação. + Escolher o intervalo entre posições nas trilhas durante a navegação Intervalo de gravação durante a navegação O trilho GPX é guardado automaticamente na pasta \'tracks\' durante a navegação. Gravar trilha durante a navegação @@ -304,7 +304,7 @@ Mostrar ângulo de visão Ativar a visualização em 3D do mapa. Visualização em 3D - Mostrar a camada superior últimamente selecionada de POI no mapa. + Mostrar a sobreposição ultimamente selecionada do POI. Mostrar camada superior de POI Escolha a fonte de imagens de mapa online ou offline. Fonte de imagens @@ -322,9 +322,9 @@ Pesquisa progressiva de cidade. Para encontrar cidades/código postal, insira pelo menos os três primeiros caracteres Pesquisa progressiva das ruas Pesquisa progressiva dos edificios - Escolher uma região na lista - Escolher a rua transversal - Locais mais próximos + Selecione a região da lista + Selecione a rua transversal + Comodidades mais próximas Explorar mapa Condução Ciclismo @@ -335,7 +335,7 @@ Latitude Longitude Mostrar no mapa - Escolher endereço + Endereço Região Cidade Rua @@ -359,14 +359,14 @@ Mensagem Autor Comentário adicionado - Não foi possível adicionar um comentário + Não foi possível adicionar um comentário. Editar POI Criar POI Nó não pode ser encontrado ou POI não é um único nó Eliminar {0} (comentário)\? Eliminar POI Apagar - POI eliminado + Eliminado Adicionar Modificar Ação {0} sucedida. @@ -381,9 +381,9 @@ Apagar Filtro Guardar como - Eliminar o filtro selecionado\? + Eliminar este filtro\? Filtro %1$s eliminado - Filtro %1$s foi criado + Filtro \'%1$s\' foi criado Informação de Percurso Format Pesquisar POI (ponto de interesse) @@ -394,7 +394,7 @@ Navegação OsmAnd offline está temporariamente indisponível. Circulação pela esquerda Para países onde as pessoas conduzem do lado esquerdo da estrada. - O ponto de partida ainda não foi determinado + O ponto de partida ainda não foi determinado. Definir a transparência (0 - transparente, 255 - opaco) Cancelar o descarregamento\? O mapa base, necessário para fornecer funcionalidade básica, está na fila de descarregamentos. @@ -615,7 +615,7 @@ Preparando novos dados… A navegação online não funciona offline. Idioma não suportado - O idioma selecionado não é suportado pelo mecanismo Android TTS (texto para voz) instalado. Quer procurar outro mecanismo TTS na loja de aplicações\? Caso contrário, será usado o idioma predefinido do TTS. + O idioma selecionado não é suportado pelo motor TTS (text-to-speech) do Android instalado, o TTS predefinido do seu idioma será utilizado no seu lugar. Procure por outro motor TTS no mercado\? Faltam dados de voz TTS Ir ao mercado para descarregar o idioma selecionado\? Usar destino atual @@ -623,22 +623,22 @@ Mapa vetorial Offline disponível para esta localização. \n\t\n\t Para usar, ative \'Menu\' -> \'Definir Vista\' -> \'Origem de Mapa…\' -> \'Mapas Vetoriais Offline\'. Saída para orientação por voz - Selecione o narrador para reproduzir as instruções de voz. - Áudio de chamada telefônica (para interromper os aparelhos de som BT do carro) + Selecione o altifalante para orientação por voz. + Áudio de chamada telefónica (para interromper os aparelhos de som Bluetooth do carro) Áudio de Notificação - Áudio de Media/GPS + Áudio de mídia/navegação A aplicação não conseguiu descarregar a camada do mapa %1$s, se a tornar a instalar pode resolver o problema. - Modificar a transparência da sobreposição. + Ajustar a transparência da sobreposição. Transparência da Sobreposição - Modificar a transparência do mapa base. + Ajustar a transparência do mapa base. Transparência do mapa base Mapa de camada inferior… Mapa de camada inferior - Escolha a mapa da camada inferior. + Escolha o mapa da sub-camada Mapa da camada superior… Nenhum Mapa da camada superior - Escolha o mapa da camada superior. + Escolha o mapa da sobreposição Mapa previamente instalado, as \"Configurações\" serão atualizadas. Selecione (telhas de) mapas para instalar ou atualizar. Não é possível executar a operação sem uma conexão com a Internet. @@ -649,7 +649,7 @@ Não foi possível executar a pesquisa offline. Pesquisa por localização geográfica Sistema - Selecione o idioma de visualização (surte efeito só de pois de reiniciar o OsmAnd). + Idioma de exibição da aplicação (usado após OsmAnd ser reiniciado). Linguagem Próximo Anterior @@ -673,7 +673,7 @@ Navegação OsmAnd off-line ainda é uma função experimental e não funciona em distâncias superiores a cerca de 20 km. \n \nO serviço de navegação está temporariamente mudado para CloudMade on-line. - Não é possível encontrar a pasta especificada. + Não foi possível encontrar a pasta especificada. Local de armazenamento Todos os dados offline na aplicação instalada antiga serão suportados pela nova aplicação, mas os pontos Favoritos devem ser exportados da aplicação antiga e depois importados na nova aplicação. Build {0} foi instalado ({1}). @@ -681,11 +681,11 @@ Instalar OsmAnd - {0} de {1} {2} MB \? A busca da lista de OsmAnd builds falhou Carregando OsmAnd builds… - Selecione uma compilação OsmAnd para instalar + Selecione a compilação OsmAnd para instalar Instalar versão - DDD.DD - DDD MM.MM - DDD MM SS.SS + GGG.GGGGG + GGG MM.MMM + GGG MM SS.S Fazer todas as características de terreno no mapa transparente. Polígonos Modo de Visualização @@ -763,8 +763,8 @@ Definir intervalo para ativar: Toque no ícone de cadeado para desbloquear Desbloquear - Desligar - modo oculto + Executar +\n a app em segundo plano Parar \n modo segundo plano Mostrar alertas… @@ -865,7 +865,7 @@ Formato de saída de vídeo Usar gravador externo Definir configurações de áudio e vídeo. - "Definições de áudio e vídeo " + Definições de áudio e vídeo A gravação falhou Câmara não disponível Áudio/vídeo está a ser gravado. Para parar toque no AV widget. @@ -920,10 +920,11 @@ Este suplemento disponibiliza \'Curvas de Nível\' e \'Sombras de relevo\', que podem ser aplicadas nos mapas standard do OsmAnd. \nEstas funcionalidades podem ser apreciadas por atletas, caminhantes, e qualquer pessoa interessada na informação de relevo de uma paisagem. \n +\n \nOs dados globais (entre as latitudes 70° norte e 70° sul) são baseados nas medições do SRTM (Shuttle Radar Topography Mission) e do ASTER (Advanced Spaceborn Thermal Emission and Reflection Radiometer), um instrumento de imagens no \'Terra\', o satélite principal do Sistema de Observação da Terra da NASA. O ASTER é um esforço conjunto da NASA, do Ministério da Economia, Comércio e Indústria do Japão e do Sistema Espacial Japonês (J-spacesystems). Este suplemento disponibiliza \'Curvas de Nível\' e \'Sombras de relevo\', que podem ser aplicadas nos mapas padrão do OsmAnd. \nEstas funcionalidades podem ser apreciadas por atletas, caminhantes, e qualquer pessoa interessada na informação de relevo de uma paisagem. -\n +\n \nOs dados globais (entre as latitudes 70° norte e 70° sul) são baseados nas medições do SRTM (Shuttle Radar Topography Mission) e do ASTER (Advanced Spaceborn Thermal Emission and Reflection Radiometer), um instrumento de imagens no \'Terra\', o satélite principal do Sistema de Observação da Terra da NASA. O ASTER é um esforço conjunto da NASA, do Ministério da Economia, Comércio e Indústria do Japão e do Sistema Espacial Japonês (J-spacesystems). Curvas de nível Outros mapas @@ -1020,18 +1021,18 @@ GPX Mapas OsmAnd & Navegação Mapas OsmAnd+ & Navegação - A descarregar + A descarregar… Palavra-passe no OSM (opcional) Tipo de focagem da câmara - Selecione o tipo de focagem da câmara interna. - Auto foco + Modo de focagem da câmara: + Auto-foco Foco hiperfocal Profundidade de visão estendida - Foco está definido no infinito + O foco está definido como infinito Foco Macro (close-up) A câmara tenta focar continuadamente - Emita som ao tirar foto - Escolha se pretende reproduzir um som ao tirar fotografias. + Reproduzir o som do obturador da câmara + Definir som ou silêncio para o obturador de fotos. Canadá Versão: Sobre @@ -1138,7 +1139,7 @@ Sem estradas com portagem Evita estradas com portagem Sem estradas não pavimentadas - Evita estradas não pavimentadas. + Evita estradas não pavimentadas Sem balsas Evita balsas Sem autoestradas @@ -1237,7 +1238,7 @@ Iniciar a orientação passo a passo automaticamente selecionado Intervalo de divisão - "ponto de rota: %1$s " + Ponto de rota: %1$s Distância: %1$s (%2$s pontos ) Hora de início: %1$tF, %1$tT Hora de fim: %1$tF, %1$tT @@ -1269,7 +1270,6 @@ Rotas de autocarros e tróleibus Este suplemento ativa a funcionalidade para gravar e guardar os seus trajetos manualmente, tocando no widget de gravação GPX no ecrã do mapa, ou fazendo também automaticamente o registo de todas as suas rotas de navegação para um ficheiro GPX. \n -\n \nOs trajetos gravados podem ser partilhados com os seus amigos, ou serem usados para contribuições no OpenStreetMap. Os atletas podem usar trajetos gravados para controlar os seus treinos. Podem ser feitas algumas análises básicas do trajeto diretamente no OsmAnd, como tempos de volta, velocidade média, etc. E claro, os trajetos também podem ser analisados mais tarde em ferramentas externas. Gravação de viagem h @@ -1322,7 +1322,7 @@ Rotas Detalhes Elementos restantes - Tem de estar conectado à Internet para instalar este suplemento. + Tem de estar on-line para instalar esta extensão. Para refletir corretamente seus sinais e regras de trânsito, por favor, selecione a região onde conduz: Números de porta Mover os ficheiros de dados OsmAnd para o novo destino\? @@ -1427,8 +1427,8 @@ Pistas de esqui Livre %1$s Memória do aparelho - Para mostrar mapas de esqui, tem de descarregar o mapa offline especial - Para mostrar mapas náuticos, tem de descarregar o mapa offline especial + Para mostrar mapas de esqui, tem de descarregar o mapa off-line especial. + Para mostrar mapas náuticos, tem de descarregar o mapa off-line especial. Editar grupo Vaga de estacionamento Compilações @@ -1547,7 +1547,7 @@ Ficheiro GPX com posições. Localizações Extensões - Evitar transporte de comboio + Sem transporte de comboio Evitar usar transporte de comboio Perigo Contorno em negrito @@ -1642,7 +1642,7 @@ Utilizador anónimo Ligado como %1$s Não selecionado - Escolha Mês e País + Mês e país: Tamanho das atualizações Modificar edição OSM Usar painel de controlo @@ -1696,7 +1696,7 @@ Nome público Não mostrar o meu nome nos relatórios Região de suporte - Nome do ficheiro contém um carácter inválido + O nome do ficheiro contém um carácter inválido Relatório para Número de colaboradores Número de edições @@ -2511,7 +2511,7 @@ Excursões Todos Descarregar mapas que faltam %1$s (%2$d MB)\? - "Explorar o mapa " + Explorar o mapa Carro Bicicleta A pé @@ -2555,7 +2555,7 @@ Sérvio (latino) Chinês (simplificado) Chinês (Hong Kong) - "Chinês (tradicional) " + Chinês (tradicional) Sem escadas Evita escadas Sem passagens por fronteiras @@ -2634,12 +2634,12 @@ \n \nAlgumas das características principais: Navegação -\n• Funciona on-line (rápido) ou off-line (sem custos de roaming quando estiver no estrangeiro). -\n• Orientação por voz passo a passo (vozes gravadas e sintetizadas). -\n• Orientação de trajetos opcionais, visualização do nome da rua e tempo estimado de chegada. -\n• Suporta pontos intermediários do seu itinerário. -\n• Correção automática da rota sempre que sair da rota. -\n• Procure lugares por endereço, pelo tipo (por exemplo: restaurante, hotel, posto de gasolina, museu...) ou por coordenadas geográficas. +\n• Funciona on-line (rápido) ou off-line (sem custos de roaming quando estiver no estrangeiro) +\n• Orientação por voz passo a passo (vozes gravadas e sintetizadas) +\n• Orientação de trajetos opcionais, visualização do nome da rua e tempo estimado de chegada +\n• Suporta pontos intermediários do seu itinerário +\n• Correção automática da rota sempre que sair da rota +\n• Procure lugares por endereço, pelo tipo (por exemplo: restaurante, hotel, posto de gasolina, museu...) ou por coordenadas geográficas Visualização de mapa \n • Veja a sua posição e orientação. \n • Oriente opcionalmente o ecrã de acordo com a bússola ou a direção do seu movimento. @@ -2649,13 +2649,13 @@ \n • Veja opcionalmente nomes de lugares em inglês, na língua local ou grafia fonética. \n Use dados do OpenStretMap e da Wikipédia -\n • Informações de alta qualidade dos melhores projetos colaborativos do mundo. -\n • Dados do OSM disponíveis por país ou região. -\n • POIs da Wikipédia, ótimo para passeios turísticos. -\n • Descarregamentos grátis ilimitados, diretamente da aplicação. -\n • Mapas offline vetoriais compactos e atualizados mensalmente -\n -\n • Escolha entre região completa ou apenas a rede rodoviária (exemplo: o Japão inteiro tem 700 MB e a rede rodoviária tem apenas 200 MB). +\n • Informações de alta qualidade dos melhores projetos colaborativos do mundo +\n • Dados do OSM disponíveis por país ou região +\n • POIs da Wikipédia, ótimo para passeios turísticos +\n • Descarregamentos grátis ilimitados, diretamente da aplicação +\n • Mapas off-line vetoriais compactos e atualizados mensalmente +\n +\n • Escolha entre região completa ou apenas a rede rodoviária (exemplo: o Japão inteiro tem 700 MB e a rede rodoviária tem apenas 200 MB) Recursos de segurança \n• Mudança da visualização automática para dia/noite opcional \n• Visualização do limite de velocidade (opcional), com lembrete se o ultrapassar @@ -2700,22 +2700,22 @@ Europa - Países Baixos Outros Lançado - Instruções de voz + Avisos de voz Adicionar Favorito eliminar Reabrir Tamanho da foto - Selecionar tamanho de imagem da foto. + Definir o tamanho da imagem da câmara Obter Recálculo de rota inteligente Recalcular apenas a parte inicial da rota para viagens longas. Está a gostar do OsmAnd\? - A sua opinião e o seu comentário são importantes para nós. + A sua opinião e o seu feedback são importantes. Avalie esta aplicação Por favor, avalie o OsmAnd no Google Play Diga-nos porquê. - Por favor, diga-nos o que gostaria de alterar nesta aplicação. - Falha no envio + Por favor, envie-nos as suas sugestões. + Não foi possível enviar Eliminar alteração Enviado {0}/{1} Tentar novamente @@ -2778,22 +2778,22 @@ Tem a certeza de que quer eliminar a ação \"%s\"\? Mostrar diálogo Favoritos Nome do preset - Tocar no botão de ação adicionará um marcador de mapa no local do centro do ecrã. - Tocar no botão de ação adicionará um ponto de rota GPX no local do centro do ecrã. - Tocar no botão de ação adicionará uma notificação de áudio no local do centro do ecrã. - Tocar no botão de ação adicionará uma notificação de vídeo no local do centro do ecrã. - Tocar no botão de ação adicionará uma notificação de foto no local do centro do ecrã. - Tocar no botão de ação adicionará uma notificação OSM no local do centro do ecrã. - Tocar no botão de ação adicionará um POI no local do centro do ecrã. - Tocar no botão de ação irá ativar ou desativar a orientação por voz durante a navegação. - Tocar no botão de ação adicionará um lugar de estacionamento no local do centro do ecrã. + O botão é para adicionar um marcador de mapa no local do centro do ecrã. + Um botão para adicionar um ponto de rota GPX no local do centro do ecrã. + Um botão para adicionar uma notificação de áudio no local do centro do ecrã. + Um botão para adicionar uma notificação de vídeo no local do centro do ecrã. + Um botão para adicionar uma notificação de foto no local do centro do ecrã. + Um botão para adicionar uma notificação OSM no local do centro do ecrã. + Um botão para adicionar um POI no local do centro do ecrã. + Um botão para ativar ou desativar a orientação por voz durante a navegação. + Um botão para adicionar um lugar de estacionamento no local do centro do ecrã. Mostrar um diálogo intermediário - " está guardado em " + " gravado para " Lugar - Nome de ação rápida especificada já está em uso, foi mudado para %1$s para evitar uma duplicação. + Ação rápida renomeada para %1$s para evitar duplicação. Nome de ação rápida duplicado - Tocar neste botão de ação mostra ou esconde os pontos favoritos no mapa. - Tocar neste botão de ação mostra ou esconde POIs no mapa. + Uma alternância para mostrar ou ocultar os pontos favoritos no mapa. + Uma alternância para mostrar ou ocultar PIs no mapa. Mostrar/esconder favoritos Mostrar Favoritos Esconder favoritos @@ -2807,19 +2807,19 @@ Deixe em branco para automaticamente usar o endereço ou nome de lugar. Esta mensagem está incluída no campo de comentário. Mensagem - Selecione a categoria onde guardar o favorito. - Selecione uma categoria opcional. + Categoria para a qual gravar o Favorito: + Escolhe uma categoria opcional. Lista de POIs Adicione uma ou mais categorias de POI para mostrar no mapa. - Tocar no botão de ação irá percorrer a lista abaixo. + Um botão para percorrer a lista abaixo. Adicionar um estilo de mapa Parâmetros não podem ficar em branco Estilos de mapa Mudar camada superior de mapa Camada superior de mapa Adicionar sobreposição - A camada superior de mapa foi alterada para \"%s\". - A camada inferior de mapa foi alterada para \"%s\". + A sobreposição de mapa foi alterada para \"%s\". + A sub-camada de mapa foi alterada para \"%s\". Mudar camada inferior de mapa Camadas inferiores de mapa Adicionar camada inferior @@ -2830,19 +2830,19 @@ Mudar posição do botão Segure e arraste o botão para mudar a sua posição no ecrã. Nome da ação - Tem de estar conectado à Internet para ver as fotos do Mapillary. + As fotos do Mapillary só estão disponíveis on-line. Repetir Adicionar Pontos de Rota Adicionar Ponto de Passagem Adicionar Linha Guardar ponto de passagem GPX - Guardar ponto de rota + Gravar ponto de rota Ponto de Passagem 1 Ponto de Rota 1 Adicione ficheiros GPX Importe ficheiros GPX ou grave trilhas. Adicione Favoritos - Importe Favoritos ou adicione novos marcando pontos do mapa. + Importe Favoritos ou adicione-os marcando pontos do mapa. Importar ficheiro GPX Ficheiro %1$s não possui pontos de rota, importe-o como uma trilha\? Mover Ponto @@ -2853,7 +2853,7 @@ Inverno e esqui Vista de turismo Náutico - Copiar nome de Ponto/POI + Copiar local/nome de POI Local sem nome Túnel à frente Túneis @@ -2865,17 +2865,17 @@ Procurando o artigo wiki correspondente Artigo não encontrado Como se abre artigos da Wikipédia\? - Toque num botão e ouça a correspondente voz de comando para identificar os comandos faltantes ou com falha. + Toque num botão e ouça a mensagem de voz dele correspondente para ouvir se está ausente ou avariado Por OsmAnd Código de localização aberto Assinaturas Mostrar apenas imagens de 360° Lançar Guarani - Tocar neste botão de ação alterna entre os modos Dia e Noite para OsmAnd - Modo de Dia - Modo Nocturno - Mudar de modo Dia/Nocturno + Uma alternância para alternar entre os modos Dia e Noite para OsmAnd. + Modo de dia + Modo noturno + Mudar modo de dia/noturno Está a usar o mapa {0} que funciona com o OsmAnd. Quer abrir a versão completa do OsmAnd\? Lançar OsmAnd\? @@ -3021,8 +3021,8 @@ Superfície Lisura Inclinação - Evitar paralelepípedo - Evitar paralelepípedo + Sem paralelepípedos ou pavimentos + Evita paralelepípedo e pavimentos Enviar registo Embarque na paragem %1$d ficheiros movidos (%2$s). @@ -3088,12 +3088,12 @@ Selecionar o perfil para começar Basê seu perfil personalizado num dos perfis de app predefinido, para definir a configuração básica, como a visibilidade predefinida de widgets e unidades de velocidade e distância. Estes são os perfis de app predefinidos, juntamente com exemplos de perfis personalizados para os quais eles podem ser estendidos: Selecione o tipo de navegação - Carro, caminhão, motocicleta + Carro, camião, motocicleta Mountain bike, ciclomotor, cavalo Andar, caminhar, correr Categorias de transportes públicos Navio, remar, navegar - Avião, asa-Delta + Avião, asa-delta Geocodificação Linha reta BRouter (offline) @@ -3105,7 +3105,7 @@ Perfis de app Alterar o zoom do mapa deslocando a roda para cima e para baixo. Escapar devolve-o à aplicação WunderLINQ. Usar WunderLINQ para controle - Você deve adicionar pelo menos um Item para listar nas Configurações de Ação Rápida + Adicione pelo menos um item à lista nas configurações de \'Ação rápida\' Esqui alpino/downhill Pistas para esqui alpino ou downhill e acesso a teleféricos de esqui. Cross Country/esqui nórdico @@ -3127,7 +3127,7 @@ Dificuldade preferida Preferir rotas desta dificuldade, embora o roteamento sobre pistas mais difíceis ou mais fáceis ainda seja possível se for mais curto. Fora de pista - Freerides e fora da pista são rotas e passagens não oficiais. Tipicamente sem serem preparados, sem maquiagem pelos funcionários e não verificados à noite. Entrar por conta e risco próprios. + \'Freerides\' e \'fora da pista\' são rotas e passagens não oficiais. Tipicamente sem serem preparados, sem manutenção e não verificados à noite. Entre por conta e risco próprios. Serviço de descarregamento OsmAnd Magenta Ícone @@ -3723,7 +3723,7 @@ Pressionando o botão de ligar o aparelho ligará o ecrã com OsmAnd acima do ecrã de bloqueio. Botão de ligar Sensor de proximidade - Selecione o tempo limite do ecrã após acordar. (\"%1$s\" não aplica tempo limite). + Selecione o tempo limite do ecrã após acordar. (\"%1$s\" não aplica tempo limite.) Manter o ecrã ligado Manter o ecrã desligado Se \"%1$s\" está ativado, o tempo da atividade vai depender dele. @@ -3832,4 +3832,12 @@ Rota entre pontos Planejar uma rota Adicionar ao trilho + O ponto adicionado não será visível no mapa, já que o grupo selecionado está escondido, pode encontrá-lo em \"%s\". + Mostrar ícones de início e fim + Selecione a largura + Selecione o intervalo em que as marcas com distância ou tempo no trilho serão exibidas. + Selecione a opção de divisão desejada: por tempo ou por distância. + Personalizado + Setas de direção + Sólido \ No newline at end of file diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml index 977539c77f..da85dfc64a 100644 --- a/OsmAnd/res/values-ru/phrases.xml +++ b/OsmAnd/res/values-ru/phrases.xml @@ -626,7 +626,7 @@ Заповедник Пролив Остров - Остров (небольшой) + Островок Якорная стоянка Якорный причал Бакен diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index 9c2b30c752..644216cf35 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -227,7 +227,7 @@ Подкатегории Выбранные категории Создать настраиваемый фильтр - Настроить поиск + Настраиваемый поиск Фильтры Применить фильтры Сохранить фильтр @@ -2366,7 +2366,7 @@ Редактировать линию Добавить точку перед Добавить точку после - Функции + Опции OsmAnd соединит точки с маршрутом для выбранного профиля. Сохранить точки, как точки маршрута или как линию. Выберите профиль навигации @@ -3831,4 +3831,10 @@ Выберите ширину Стрелки направления Сплошной + Последнее изменение + Импортировать трек + Открыть существующий трек + Создать новый маршрут + Выберите файл трека для открытия. + Готово \ No newline at end of file diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml index 4c1a4284c8..1c81c4d8ce 100644 --- a/OsmAnd/res/values-sk/strings.xml +++ b/OsmAnd/res/values-sk/strings.xml @@ -3822,4 +3822,12 @@ Trasa medzi bodmi Naplánovať trasu Pridať do stopy + Pridaný bod nebude viditeľný na mape, pretože zvolená skupina je skrytá. Môžete ho nájsť v \"%s\". + Zobraziť ikony štartu a cieľa + Zvoľte šírku + Zvoľte interval, po ktorom budú na stope zobrazené značky so vzdialenosťou alebo časom. + Zvoľte spôsob rozdeľovania: podľa času alebo podľa vzdialenosti. + Vlastné + Smerové šípky + Plné \ No newline at end of file diff --git a/OsmAnd/res/values-sr/phrases.xml b/OsmAnd/res/values-sr/phrases.xml index 7502639336..0cfea8d9e7 100644 --- a/OsmAnd/res/values-sr/phrases.xml +++ b/OsmAnd/res/values-sr/phrases.xml @@ -27,7 +27,7 @@ Накнада Пушење Достава - Драјв ин + Драјв-ин За понети Коктели Микропивара @@ -1034,7 +1034,7 @@ Без пумпе Да Минерална - Карактеристика воде: муљ + Блато Сумпорна Карта Канцеларија @@ -1337,7 +1337,7 @@ Стела Биста Кошинто - Крст + Крстолик Возило Камен спотицања Обелиск @@ -2097,7 +2097,7 @@ 100ЛЛ гориво Аутогас Авионско А-1 гориво - Едблу гориво + Адитив дизел гасова Гориво: дрво Гориво: ћумур Гориво: угаљ diff --git a/OsmAnd/res/values-sr/strings.xml b/OsmAnd/res/values-sr/strings.xml index 75c9b5a7d8..8d723fb154 100644 --- a/OsmAnd/res/values-sr/strings.xml +++ b/OsmAnd/res/values-sr/strings.xml @@ -3821,4 +3821,12 @@ Рута између тачака Планирај руту Додајте стази + Изаберите ширину + Изаберите интервал на коме ће се приказивати ознаке са раздаљином или временом на стази. + Изаберите жељену опцију поделе: по времену или по удаљености. + Прилагођен + Стрелице смера + Чврст + Додата тачка неће бити видљива на мапи, пошто је одабрана група сакривена, можете је пронаћи у „%s“. + Прикажи почетно крајне иконе \ No newline at end of file diff --git a/OsmAnd/res/values-zh-rCN/strings.xml b/OsmAnd/res/values-zh-rCN/strings.xml index 6b996b4940..eaa040c241 100644 --- a/OsmAnd/res/values-zh-rCN/strings.xml +++ b/OsmAnd/res/values-zh-rCN/strings.xml @@ -70,7 +70,7 @@ 连续 要解锁屏幕按锁图标 配置屏幕 - 锁屏 + 锁定 我在哪里 指南针 重置为默认 @@ -81,8 +81,8 @@ 海拔 剩余时间 下一个转弯 - 锁屏 - 解锁屏幕 + 锁定 + 解锁 屏幕被锁定 高速摄像机 交通警示 @@ -125,17 +125,17 @@ 北北东 东北 - 东 - 北 - 东 + 东北东 - 东 - 南 - 东 + 东南东 东南 - 南 - 南 - 东 + 南南东 - 南 - 南 - 西 + 南南西 西南 - 西 - 南 - 西 + 西南西 西部 - 西 - 北西 + 西北西 西北 北北西 @@ -237,7 +237,7 @@ 营养 旅游 运输 - I / O错误发生 + I/O错误 千米 公里/小时 @@ -286,9 +286,9 @@ 此前路线 完成搜索 确定 - + 收藏 全部清除 - 下载成功 + 已下载 更换 显示路线 开始导航 @@ -306,7 +306,7 @@ 使用在线导航 ,指定Openstreetmap.org(OSM)OSM提交所需的设置 数据 - OSM编辑 + OpenStreetMap 编辑 保存当前轨迹 导航时自动记录轨迹 启用3D的地图视图 @@ -324,7 +324,7 @@ 底部 纬度 经度 - 选择地址 + 地址 地区 城市 街道 @@ -420,7 +420,7 @@ 选择应用程序主题 应用程序主题 可用性选项 - 选择地址 + 指定地址 选择收藏 OSM 改动 更多动作 @@ -451,7 +451,7 @@ OsmAnd 的离线等高线插件 距离测量 等高线 - 等高线插件 + 等高线 仅包含道路的地图 不显示区域(行政区划级别5-9)的边界。 选择何时显示仅包含道路的地图: @@ -768,7 +768,7 @@ 搜索更多 从列表中选择区域 用选中的格式输入纬度和经度(D - 度,M - 分,S - 秒) - DDD.DD + DDD.DDDDD DDD MM.MM DDD MM SS.SS 在地图上显示 @@ -784,7 +784,7 @@ OSM 密码 (可选) 消息 作者名称 - 评论添加成功 + 评论已添加 发生异常:备注未能添加 编辑兴趣点 创建兴趣点 @@ -802,7 +802,7 @@ 是否删除选中的过滤器? 过滤器 %1$s 已被删除 过滤器 %1$s 已创建 - 自动聚焦 + 自动对焦 清除中途点 保持中途点 您已经有中途点集了。 @@ -820,8 +820,8 @@ 请通过地图添加地图标记 未发现路径点 报告 - 上移 - 下移 + 上移 ↑ + 下移 ↓ 导航完成 避开道路 共享内存 @@ -933,7 +933,7 @@ 已创建 OSM 兴趣点 QR码 地图已下载 - 返回地图 + 显示地图 模拟首次启动应用 地理: 分享位置 @@ -957,14 +957,14 @@ 分钟/公里 分钟/英里 海里/小时 (节) - 浬里/时 - + + 分钟每米 分/公里 米/秒 导航 在后台运行 GPS 唤醒间隔 - 我的最爱信息 + 收藏信息 停止模拟您的位置。 使用计算得到的路线或者一条 GPX 记录模拟您的位置。 查询地址 @@ -1006,7 +1006,7 @@ 书面挪威语 阿根廷西班牙语 泰卢固语 - 新挪威语 (尼诺斯克语) + 新挪威语 马来西亚语 海地语 加利西亚语 @@ -1073,8 +1073,8 @@ 已选择 已选择 总不 - - + + 在地图上选择 取消选中 全部取消 @@ -1481,9 +1481,9 @@ 火车 当前轨迹 移动地图要更改标记的位置 - 方向的音频反馈 + 音频方向 通过声音指示目标点方向。 - 方向触觉反馈 + 触觉方向 由振动指示目标点方向。 启用导航时由 OsmAnd 实时服务提供的更新。 未设置目的地 @@ -1513,7 +1513,7 @@ 排序 已选择 %s GPX 文件 精细 - 细的 + 中等 加粗 匿名用户不能: @@ -1680,7 +1680,7 @@ 有轨电车线路 分享出租车线路 无轨电车线路 - + 运输 剩余的元素 之间 选择速限容许余裕界限,超过时您将会收到语音警告。 @@ -1694,7 +1694,7 @@ 交通稳静化 测速摄像机 交通警告 - 附近的收藏夹 + 收藏附近 附近的 POI 交通警告 停止 GPS 背景模式吗? @@ -1849,7 +1849,7 @@ 拉脱维亚语 立陶宛语 马拉地语 - 挪威语 + 书面挪威语 波斯语 波兰语 葡萄牙语 @@ -1893,7 +1893,7 @@ 汽车导航时禁用双阶段路线 禁用复杂路线 航标 - 在应用程序中选择使用的配置文件 + 选择显示的配置文件 应用程序配置文件 徒步 摩托车 @@ -1920,7 +1920,7 @@ 使用磁传感器来确定罗盘值而不是方向传感器。 使用磁传感器 透过周期性的唤醒 GPS 设备,在背景模式下(屏幕关闭)显示设置,以启用追踪与导航。 - 在请求时选择 + 根据要求? 使用系统录音机 从已指定的录音开始播放音频。 \n%1$s @@ -2248,7 +2248,7 @@ 每周 早上 晚上 - 选择月份和国家 + 月份和国家 贡献者人数 编辑次数 报告 @@ -2592,7 +2592,7 @@ 编辑活动 你增加了%1$s 个目标。输入文件名后点击\"保存\"。 请在允许OsmAnd获取定位信息后继续。 - 光滑度 + 平顺度 坡度 更改默认风格以突出显示人行道和非机动车道,使用旧版Mapnik配色。 你正在使用基于 OsmAnd 的 {0}。是否启动完整版 OsmAnd? @@ -2865,7 +2865,7 @@ 正轴等角圆柱投影 储存格式 删除所有\? - 卸载测速摄像 + 卸载测速摄像头 合法 测速摄像兴趣点 卸载 @@ -2920,4 +2920,193 @@ 公共交通类型 在地图上显示低排放区。不影响路线规划。 显示低排放区 + 冰路 + 语音提示 + 放弃更改 + 切换配置文件 + 偏好难度 + 等级 5 + 等级 4 + 等级 3 + 等级 2 + 等级 1 + 个人运输工具 + 新配置文件 + 已搜集资料 + 滑雪旅游 + 应用程序配置文件 + 第三方路线规划 + 特殊路线规划 + OsmAnd 路线规划 + 直线 + 飞机、滑翔 + 删除配置文件 + 重复的名称 + 基本配置文件 + 模式:%s + 选择图标 + 配置文件名称 + 已下载地图 + 旅行指南 + 旅游指南 + 旅行指南 + GPX 文件 + 中转时间 + 有更新可用 + 选择规划 + 图片缓存 + 已删除文章 + 已存书签文章 + 群组已删除 + 激流运动 + 旅游风景 + OSM 收件人 + 重命名标记 + 已经过标记 + 往返行程 + 路线已计算 + 暗黄色 + 规划路线 + 隐藏已经过 + 显示已经过 + 添加线路 + 编辑线路 + 航点 1 + 添加航点 + 正在准备 + 南极洲 + 路线 + 点对点 + %1$s/%2$s + 通知 + OSM + 公告 + 个人 + 还原 + 共享 + 地图 + 图块 + 空中航线 + 未定义 + 极端 + 自由滑雪 + 专家 + 高级 + 中等 + 简单 + 新手 + 北欧风 + 下坡 + 道路 + 转移 + 瓜拉尼语 + 启动 + 查看 + + 内容 + 读取 + 探索 + 结果 + 总是 + 恢复 + 收藏 + 约鲁巴语 + 乌兹别克语 + 乌尔都语 + 鞑靼语 + 塔吉克语 + 苏格兰语 + 西西里语 + 旁遮普语 + 尼泊尔语 + 那不勒斯语 + 缅甸语 + 蒙古语 + 米南卡保语 + 马达加斯加语 + 柯尔克孜语 + 哈萨克语 + 爪哇语 + 古吉拉特语 + 楚瓦什语 + 车臣语 + 巴伐利亚语 + 巴什基尔语 + 阿拉贡语 + 伦巴第语 + 滑雪旅行 + 分隔符 + 已隐藏 + 项目 + 地形阴影 + 坡度 + 正在导入 + 个人资料 + 度度.度度度度度° + 度度°分分.分分分分\' + 度度°分分.分分分\' + 连接 + 远足 + 雪橇 + 分析 + 示例 + + + + + + + + + + + + 旅行车 + 露营车 + 松软 + 键盘 + + 越野 + 踏板车 + 单轮 + UFO + 图标 + 越野滑雪 + 雪橇 + 地理编码 + 评分 + 切换 + 度度.度度度度度度° + 度度°分分′秒秒″ + 航海 + 关闭 + 老挝语 + 标记 + 完成 + 新增 + 群组 + 列表 + 线路 + 若“%1$s”开启,活动时间将取决于它。 + 默认屏幕超时 + 色调 + + 夜晚地图 + 应用这些更改将清除此图块源的缓存数据 + 指定路线上允许的车辆长度。 + 长度限制 + 方向 + 轮椅向前 + 添加到轨迹 + 显示开始于结束图标 + 选择宽度 + 屏幕超时 + 耐力赛摩托车 + 小型摩托车 + 卡丁车 + 找不到任何内容: + 保持活跃 + 方向箭头 + 自定义 + \ No newline at end of file diff --git a/OsmAnd/res/values-zh-rTW/phrases.xml b/OsmAnd/res/values-zh-rTW/phrases.xml index d3dc318221..48e5cb5654 100644 --- a/OsmAnd/res/values-zh-rTW/phrases.xml +++ b/OsmAnd/res/values-zh-rTW/phrases.xml @@ -1178,7 +1178,7 @@ 動力泵浦 無泵浦 礦泉水 - 水的特質:泥漿 + 泥漿 硫酸 供水點 美食 @@ -1868,7 +1868,7 @@ 100LL 燃料 液化石油氣 Jet A-1 燃料 - AdBlue 燃料 + 柴油排氣液 燃料:木材 燃料:木炭 燃料:煤 diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 3119eb2fcc..aa1224c044 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -2891,7 +2891,7 @@ 切換日間/夜間模式 道路類型 路面 - 光滑度 + 平順度 坡度 新增住家 新增工作地點 diff --git a/OsmAnd/src/net/osmand/plus/GPXDatabase.java b/OsmAnd/src/net/osmand/plus/GPXDatabase.java index 5403c814ca..c010b2964e 100644 --- a/OsmAnd/src/net/osmand/plus/GPXDatabase.java +++ b/OsmAnd/src/net/osmand/plus/GPXDatabase.java @@ -188,7 +188,7 @@ public class GPXDatabase { private boolean showAsMarkers; private boolean joinSegments; private boolean showArrows; - private boolean showStartFinish; + private boolean showStartFinish = true; public GpxDataItem(File file, GPXTrackAnalysis analysis) { this.file = file; diff --git a/OsmAnd/src/net/osmand/plus/UiUtilities.java b/OsmAnd/src/net/osmand/plus/UiUtilities.java index 2da7cbaac2..f3d4089040 100644 --- a/OsmAnd/src/net/osmand/plus/UiUtilities.java +++ b/OsmAnd/src/net/osmand/plus/UiUtilities.java @@ -134,12 +134,13 @@ public class UiUtilities { public Drawable getLayeredIcon(@DrawableRes int bgIconId, @DrawableRes int foregroundIconId, @ColorRes int bgColorId, @ColorRes int foregroundColorId) { - Drawable b = getDrawable(bgIconId, bgColorId); - Drawable f = getDrawable(foregroundIconId, foregroundColorId); - Drawable[] layers = new Drawable[2]; - layers[0] = b; - layers[1] = f; - return new LayerDrawable(layers); + Drawable background = getDrawable(bgIconId, bgColorId); + Drawable foreground = getDrawable(foregroundIconId, foregroundColorId); + return getLayeredIcon(background, foreground); + } + + public static Drawable getLayeredIcon(Drawable... icons) { + return new LayerDrawable(icons); } public Drawable getThemedIcon(@DrawableRes int id) { @@ -214,13 +215,11 @@ public class UiUtilities { @ColorInt public static int getColorWithAlpha(@ColorInt int color, float ratio) { - int newColor = 0; int alpha = Math.round(Color.alpha(color) * ratio); int r = Color.red(color); int g = Color.green(color); int b = Color.blue(color); - newColor = Color.argb(alpha, r, g, b); - return newColor; + return Color.argb(alpha, r, g, b); } @ColorInt diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index adee1d5417..77753d691c 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -1244,6 +1244,8 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven mapRouteInfoMenu.updateMenu(); MapRouteInfoMenu.showLocationOnMap(this, latLonToShow.getLatitude(), latLonToShow.getLongitude()); } else if (toShow instanceof GPXFile) { + hideContextAndRouteInfoMenues(); + Bundle args = new Bundle(); args.putString(TRACK_FILE_PATH, ((GPXFile) toShow).path); args.putInt(ContextMenuFragment.MENU_STATE_KEY, MenuController.MenuState.HALF_SCREEN); diff --git a/OsmAnd/src/net/osmand/plus/base/BottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/base/BottomSheetDialogFragment.java index adc82783a6..c33b183b65 100644 --- a/OsmAnd/src/net/osmand/plus/base/BottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/base/BottomSheetDialogFragment.java @@ -48,7 +48,7 @@ public abstract class BottomSheetDialogFragment extends DialogFragment { public abstract View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState); @Override - public void onAttach(Context context) { + public void onAttach(@NonNull Context context) { super.onAttach(context); if (context instanceof OnDialogFragmentResultListener) { dialogFragmentResultListener = (OnDialogFragmentResultListener) context; @@ -82,10 +82,10 @@ public abstract class BottomSheetDialogFragment extends DialogFragment { } @Nullable - protected Drawable getIcon(@DrawableRes int drawableRes, @ColorRes int color) { + protected Drawable getIcon(@DrawableRes int drawableRes, @ColorRes int colorRes) { OsmandApplication app = getMyApplication(); if (app != null) { - return app.getUIUtilities().getIcon(drawableRes, color); + return app.getUIUtilities().getIcon(drawableRes, colorRes); } else { return null; } diff --git a/OsmAnd/src/net/osmand/plus/helpers/AndroidUiHelper.java b/OsmAnd/src/net/osmand/plus/helpers/AndroidUiHelper.java index 2ed487f736..45f5fe3ff4 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/AndroidUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/AndroidUiHelper.java @@ -8,6 +8,7 @@ import android.util.Log; import android.view.Surface; import android.view.View; +import androidx.annotation.IdRes; import androidx.annotation.NonNull; import net.osmand.PlatformUtil; @@ -92,6 +93,15 @@ public class AndroidUiHelper { } return false; } + + public static void setVisibility(@NonNull Activity activity, int visibility, @IdRes int... widgets) { + for (int widget : widgets) { + View view = activity.findViewById(widget); + if (view != null && view.getVisibility() != visibility) { + view.setVisibility(visibility); + } + } + } public static boolean isXLargeDevice(@NonNull Activity ctx) { int lt = (ctx.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK); diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java index 8050da14d9..8cdee993c1 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java @@ -38,13 +38,11 @@ import net.osmand.TspAnt; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; import net.osmand.data.RotatedTileBox; -import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.MapMarkersHelper; import net.osmand.plus.MapMarkersHelper.MapMarker; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.TargetPointsHelper; import net.osmand.plus.TargetPointsHelper.TargetPoint; @@ -57,6 +55,8 @@ import net.osmand.plus.mapmarkers.adapters.MapMarkersListAdapter; import net.osmand.plus.measurementtool.SnapToRoadBottomSheetDialogFragment; import net.osmand.plus.measurementtool.SnapToRoadBottomSheetDialogFragment.SnapToRoadFragmentListener; import net.osmand.plus.routing.RoutingHelper; +import net.osmand.plus.settings.backend.ApplicationMode; +import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.views.MapMarkersLayer; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory; @@ -623,11 +623,11 @@ public class PlanRouteFragment extends BaseOsmAndFragment implements OsmAndLocat markersLayer.setInPlanRouteMode(true); mapActivity.disableDrawer(); - mark(portrait ? View.INVISIBLE : View.GONE, + AndroidUiHelper.setVisibility(mapActivity, portrait ? View.INVISIBLE : View.GONE, R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info); - mark(View.GONE, + AndroidUiHelper.setVisibility(mapActivity, View.GONE, R.id.map_route_info_button, R.id.map_menu_button, R.id.map_compass_button, @@ -694,7 +694,7 @@ public class PlanRouteFragment extends BaseOsmAndFragment implements OsmAndLocat mapActivity.hideTopToolbar(toolbarController); } - mark(View.VISIBLE, + AndroidUiHelper.setVisibility(mapActivity, View.VISIBLE, R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info, @@ -778,18 +778,6 @@ public class PlanRouteFragment extends BaseOsmAndFragment implements OsmAndLocat } } - private void mark(int status, int... widgets) { - MapActivity mapActivity = getMapActivity(); - if (mapActivity != null) { - for (int widget : widgets) { - View v = mapActivity.findViewById(widget); - if (v != null) { - v.setVisibility(status); - } - } - } - } - private void showHideMarkersList() { MapActivity mapActivity = getMapActivity(); if (mapActivity != null && portrait) { diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java index 965c43b3b5..89b3319334 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java @@ -1138,7 +1138,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { mapActivity.showTopToolbar(toolBarController); } markGeneralComponents(enable ? View.GONE : View.VISIBLE); - mark(enable ? View.VISIBLE : View.GONE, + AndroidUiHelper.setVisibility(mapActivity, enable ? View.VISIBLE : View.GONE, R.id.move_point_text, R.id.move_point_controls); mainIcon.setImageDrawable(getActiveIcon(enable @@ -1158,7 +1158,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { mapActivity.showTopToolbar(toolBarController); } markGeneralComponents(enable ? View.GONE : View.VISIBLE); - mark(enable ? View.VISIBLE : View.GONE, + AndroidUiHelper.setVisibility(mapActivity,enable ? View.VISIBLE : View.GONE, R.id.add_point_before_after_text, R.id.add_point_before_after_controls); if (!enable) { @@ -1167,12 +1167,15 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { } private void markGeneralComponents(int status) { - mark(status, - R.id.measurement_distance_text_view, - R.id.measurement_points_text_view, - R.id.distance_to_center_text_view, - R.id.up_down_button, - R.id.measure_mode_controls); + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + AndroidUiHelper.setVisibility(mapActivity, status, + R.id.measurement_distance_text_view, + R.id.measurement_points_text_view, + R.id.distance_to_center_text_view, + R.id.up_down_button, + R.id.measure_mode_controls); + } } private void addInitialPoint() { @@ -1649,11 +1652,11 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { mapActivity.refreshMap(); mapActivity.disableDrawer(); - mark(portrait ? View.INVISIBLE : View.GONE, + AndroidUiHelper.setVisibility(mapActivity, portrait ? View.INVISIBLE : View.GONE, R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info); - mark(View.GONE, + AndroidUiHelper.setVisibility(mapActivity, View.GONE, R.id.map_route_info_button, R.id.map_menu_button, R.id.map_compass_button, @@ -1683,7 +1686,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { measurementLayer.setInMeasurementMode(false); mapActivity.enableDrawer(); - mark(View.VISIBLE, + AndroidUiHelper.setVisibility(mapActivity, View.VISIBLE, R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info, @@ -1703,18 +1706,6 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { } } - private void mark(int status, int... widgets) { - MapActivity mapActivity = getMapActivity(); - if (mapActivity != null) { - for (int widget : widgets) { - View v = mapActivity.findViewById(widget); - if (v != null) { - v.setVisibility(status); - } - } - } - } - public void quit(boolean hidePointsListFirst) { if (editingCtx.getOriginalPointToMove() != null) { cancelMovePointMode(); diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/NewGpxData.java b/OsmAnd/src/net/osmand/plus/measurementtool/NewGpxData.java index 9da060fdee..e5325da933 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/NewGpxData.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/NewGpxData.java @@ -1,7 +1,8 @@ package net.osmand.plus.measurementtool; +import net.osmand.GPXUtilities.GPXFile; +import net.osmand.GPXUtilities.TrkSegment; import net.osmand.data.QuadRect; -import net.osmand.GPXUtilities; public class NewGpxData { @@ -12,19 +13,19 @@ public class NewGpxData { OVERWRITE_SEGMENT } - private GPXUtilities.GPXFile gpxFile; - private GPXUtilities.TrkSegment trkSegment; + private GPXFile gpxFile; + private TrkSegment trkSegment; private QuadRect rect; private ActionType actionType; - public NewGpxData(GPXUtilities.GPXFile gpxFile, QuadRect rect, ActionType actionType, GPXUtilities.TrkSegment trkSegment) { + public NewGpxData(GPXFile gpxFile, QuadRect rect, ActionType actionType, TrkSegment trkSegment) { this.gpxFile = gpxFile; this.rect = rect; this.actionType = actionType; this.trkSegment = trkSegment; } - public GPXUtilities.GPXFile getGpxFile() { + public GPXFile getGpxFile() { return gpxFile; } @@ -36,7 +37,7 @@ public class NewGpxData { return actionType; } - public GPXUtilities.TrkSegment getTrkSegment() { + public TrkSegment getTrkSegment() { return trkSegment; } } diff --git a/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java index 44d2c259eb..92eb175ffc 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java @@ -474,7 +474,7 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement } ((FavoritesActivity) getActivity()).updateListViewFooter(footerView); - // TODO Rewrite without ContextMenuAdapter + // To do Rewrite without ContextMenuAdapter optionsMenuAdapter = new ContextMenuAdapter(app); ItemClickListener listener = new ContextMenuAdapter.ItemClickListener() { @Override @@ -746,7 +746,6 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement private void collectDirs(File dir, List dirs, File exclDir) { File[] listFiles = dir.listFiles(); if (listFiles != null) { - Arrays.sort(listFiles); for (File f : listFiles) { if (f.isDirectory()) { if (!exclDir.equals(f)) { @@ -922,7 +921,8 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement for (GpxInfo v : values) { allGpxAdapter.addLocalIndexInfo(v); } - allGpxAdapter.sort(); + // disable sort + // allGpxAdapter.sort(); allGpxAdapter.notifyDataSetChanged(); } @@ -933,7 +933,8 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement for (GpxInfo v : result) { allGpxAdapter.addLocalIndexInfo(v); } - allGpxAdapter.sort(); + // disable sort + // allGpxAdapter.sort(); allGpxAdapter.refreshSelected(); allGpxAdapter.notifyDataSetChanged(); onPostExecute(result); @@ -957,7 +958,18 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement if (listFiles == null) { return new File[0]; } - Arrays.sort(listFiles); + // This file could be sorted in different way for folders + // now folders are also sorted by last modified date + Arrays.sort(listFiles, new Comparator() { + @Override + public int compare(File f1, File f2) { + // here we could guess date from file name '2017-08-30 ...' - first part date + if (f1.lastModified() == f2.lastModified()) { + return -f1.getName().compareTo(f2.getName()); + } + return -Long.compare(f1.lastModified(), f2.lastModified()); + } + }); return listFiles; } @@ -1115,6 +1127,7 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement data.get(category.get(found)).add(info); } + // disable sort public void sort() { Collections.sort(category, new Comparator() { @Override @@ -1622,7 +1635,8 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement for (GpxInfo i : ((List) results.values)) { allGpxAdapter.addLocalIndexInfo(i); } - allGpxAdapter.sort(); + // disable sort + // allGpxAdapter.sort(); allGpxAdapter.refreshSelected(); } allGpxAdapter.notifyDataSetChanged(); diff --git a/OsmAnd/src/net/osmand/plus/myplaces/TrackActivityFragmentAdapter.java b/OsmAnd/src/net/osmand/plus/myplaces/TrackActivityFragmentAdapter.java index 504686054e..66b212960d 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/TrackActivityFragmentAdapter.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/TrackActivityFragmentAdapter.java @@ -53,17 +53,21 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.TrackActivity; +import net.osmand.plus.dialogs.GpxAppearanceAdapter; import net.osmand.plus.measurementtool.NewGpxData; -import net.osmand.plus.track.SplitTrackAsyncTask; -import net.osmand.plus.track.SplitTrackAsyncTask.SplitTrackListener; import net.osmand.plus.myplaces.TrackBitmapDrawer.TrackBitmapDrawerListener; import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference; import net.osmand.plus.track.GpxSplitType; +import net.osmand.plus.track.SplitIntervalCard; +import net.osmand.plus.track.SplitTrackAsyncTask; +import net.osmand.plus.track.SplitTrackAsyncTask.SplitTrackListener; import net.osmand.plus.widgets.tools.CropCircleTransformation; import net.osmand.plus.wikipedia.WikiArticleHelper; import net.osmand.plus.wikivoyage.WikivoyageUtils; import net.osmand.plus.wikivoyage.article.WikivoyageArticleDialogFragment; import net.osmand.plus.wikivoyage.data.TravelArticle; +import net.osmand.render.RenderingRulesStorage; import java.util.ArrayList; import java.util.List; @@ -71,6 +75,8 @@ import java.util.Map; import gnu.trove.list.array.TIntArrayList; +import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR; + public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener { private OsmandApplication app; @@ -308,9 +314,9 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener { } }); + splitColorView.setVisibility(View.GONE); if (showMapOnly) { splitIntervalView.setVisibility(View.GONE); - splitColorView.setVisibility(View.GONE); appearanceView.setVisibility(View.GONE); divider.setVisibility(View.GONE); bottomDivider.setVisibility(View.VISIBLE); @@ -354,17 +360,16 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener { } }); appearanceView.setVisibility(View.VISIBLE); - splitColorView.setVisibility(View.VISIBLE); divider.setVisibility(View.VISIBLE); } else { appearanceView.setVisibility(View.GONE); - splitColorView.setVisibility(View.GONE); divider.setVisibility(View.GONE); } } + updateTrackColor(); } - private void showTemporaryObjectOnMap(Object toShow){ + private void showTemporaryObjectOnMap(Object toShow) { TrackActivity activity = getTrackActivity(); GpxDataItem gpxDataItem = getGpxDataItem(); GPXFile gpx = getGpx(); @@ -708,6 +713,27 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener { return Math.max(position, 0); } + private void updateTrackColor() { + int color = getGpxDataItem() != null ? getGpxDataItem().getColor() : 0; + GPXFile gpxFile = getGpx(); + if (color == 0 && gpxFile != null) { + if (gpxFile.showCurrentTrack) { + color = app.getSettings().CURRENT_TRACK_COLOR.get(); + } else { + color = gpxFile.getColor(0); + } + } + if (color == 0) { + RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer(); + CommonPreference prefColor = app.getSettings().getCustomRenderProperty(CURRENT_TRACK_COLOR_ATTR); + color = GpxAppearanceAdapter.parseTrackColor(renderer, prefColor.get()); + } + TrackBitmapDrawer trackDrawer = getTrackBitmapDrawer(); + if (trackDrawer != null) { + trackDrawer.setTrackColor(color); + } + } + public List flatten(List groups) { ArrayList list = new ArrayList<>(); for (GpxDisplayGroup g : groups) { @@ -756,7 +782,7 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener { if (activity != null && gpxSplitType != null && gpxFile != null) { int timeSplit = 0; double distanceSplit = 0; - if (!gpxFile.showCurrentTrack) { + if (gpxSplitType != GpxSplitType.NO_SPLIT && !gpxFile.showCurrentTrack) { timeSplit = this.timeSplit.get(selectedSplitInterval); distanceSplit = this.distanceSplit.get(selectedSplitInterval); } @@ -804,20 +830,14 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener { if (model.size() > 0) { if (distance) { double dvalue = OsmAndFormatter.calculateRoundedDist(value, app); - options.add(OsmAndFormatter.getFormattedDistance((float) dvalue, app)); + options.add(SplitIntervalCard.getFormattedDistanceInterval(app, value)); distanceSplit.add(dvalue); timeSplit.add(-1); if (Math.abs(model.get(0).getSplitDistance() - dvalue) < 1) { selectedSplitInterval = distanceSplit.size() - 1; } } else { - if (value < 60) { - options.add(value + " " + app.getString(R.string.int_seconds)); - } else if (value % 60 == 0) { - options.add((value / 60) + " " + app.getString(R.string.int_min)); - } else { - options.add((value / 60f) + " " + app.getString(R.string.int_min)); - } + options.add(SplitIntervalCard.getFormattedTimeInterval(app, value)); distanceSplit.add(-1d); timeSplit.add(value); if (model.get(0).getSplitTime() == value) { diff --git a/OsmAnd/src/net/osmand/plus/osmedit/ExportOptionsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/osmedit/ExportOptionsBottomSheetDialogFragment.java index 93345a81c7..0b1086bfc5 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/ExportOptionsBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/ExportOptionsBottomSheetDialogFragment.java @@ -58,7 +58,7 @@ public class ExportOptionsBottomSheetDialogFragment extends MenuBottomSheetDialo BaseBottomSheetItem osmNotesItem = new BottomSheetItemWithDescription.Builder() .setDescription(String.valueOf(osmNotesCount)) - .setIcon(getContentIcon(R.drawable.ic_action_osm_note_add)) + .setIcon(getContentIcon(R.drawable.ic_action_osm_note)) .setTitle(getString(R.string.osm_notes)) .setLayoutId(R.layout.bottom_sheet_item_with_right_descr) .setDisabled(!(osmNotesCount > 0)) diff --git a/OsmAnd/src/net/osmand/plus/parkingpoint/ParkingPositionPlugin.java b/OsmAnd/src/net/osmand/plus/parkingpoint/ParkingPositionPlugin.java index 1b51b80e19..a6ea74f36d 100644 --- a/OsmAnd/src/net/osmand/plus/parkingpoint/ParkingPositionPlugin.java +++ b/OsmAnd/src/net/osmand/plus/parkingpoint/ParkingPositionPlugin.java @@ -21,30 +21,33 @@ import net.osmand.data.FavouritePoint; import net.osmand.data.FavouritePoint.SpecialPointType; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; -import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuAdapter.ItemClickListener; import net.osmand.plus.ContextMenuItem; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; -import net.osmand.plus.settings.backend.OsmandSettings; -import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.dashboard.tools.DashFragmentData; import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.quickaction.QuickActionType; +import net.osmand.plus.settings.backend.ApplicationMode; +import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference; import net.osmand.plus.views.AnimateDraggingMapThread; import net.osmand.plus.views.MapInfoLayer; import net.osmand.plus.views.OsmandMapLayer.DrawSettings; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.mapwidgets.TextInfoWidget; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; +import java.util.Date; import java.util.List; +import java.util.Locale; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_MARK_AS_PARKING_LOC; @@ -523,18 +526,13 @@ public class ParkingPositionPlugin extends OsmandPlugin { } String getFormattedTime(long timeInMillis) { - StringBuilder timeStringBuilder = new StringBuilder(); Time time = new Time(); time.set(timeInMillis); - timeStringBuilder.append(time.hour); - timeStringBuilder.append(":"); - int minute = time.minute; - timeStringBuilder.append(minute < 10 ? "0" + minute : minute); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm dd.MM.yyyy", Locale.getDefault()); if (!DateFormat.is24HourFormat(app)) { - timeStringBuilder.append(time.hour >= 12 ? app.getString(R.string.osmand_parking_pm) : app - .getString(R.string.osmand_parking_am)); + sdf = new SimpleDateFormat("hh:mm a dd.MM.yyyy", Locale.getDefault()); } - return timeStringBuilder.toString(); + return sdf.format(new Date(time.toMillis(false))); } String getFormattedTimeInterval(long timeInMillis, Activity ctx) { diff --git a/OsmAnd/src/net/osmand/plus/quickaction/CreateEditActionDialog.java b/OsmAnd/src/net/osmand/plus/quickaction/CreateEditActionDialog.java index d82ace3da6..81476161f9 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/CreateEditActionDialog.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/CreateEditActionDialog.java @@ -31,6 +31,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.osmedit.AddPOIAction; import java.util.List; @@ -232,6 +233,10 @@ public class CreateEditActionDialog extends DialogFragment @Override public void onClick(View view) { + if (action instanceof AddPOIAction) { + saveFirstTagWithEmptyValue(); + } + if (action.fillParams(((ViewGroup) root.findViewById(R.id.container)).getChildAt(0), (MapActivity) getActivity())) { if (quickActionRegistry.isNameUnique(action, getContext())) { @@ -272,6 +277,10 @@ public class CreateEditActionDialog extends DialogFragment Toast.makeText(getContext(), R.string.quick_action_empty_param_error, Toast.LENGTH_SHORT).show(); } } + + private void saveFirstTagWithEmptyValue() { + ((ViewGroup) root.findViewById(R.id.container)).getChildAt(0).requestFocus(); + } }); } diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index f9d43df2d2..66985df348 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -253,10 +253,10 @@ public class RouteProvider { } if (OSMAND_ROUTER_V2.equals(file.author)) { route = parseOsmAndGPXRoute(points, file); - addMissingTurns = false; + addMissingTurns = route.isEmpty(); } else if (file.isCloudmadeRouteFile() || OSMAND_ROUTER.equals(file.author)) { directions = parseOsmAndGPXRoute(points, file, OSMAND_ROUTER.equals(file.author), builder.leftSide, 10); - if (OSMAND_ROUTER.equals(file.author)) { + if (OSMAND_ROUTER.equals(file.author) && file.hasRtePt()) { // For files generated by OSMAND_ROUTER use directions contained unaltered addMissingTurns = false; } diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 78524a4d74..7d1c9696d2 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -857,10 +857,9 @@ public class RoutingHelper { l.newRouteIsCalculated(newRoute, showToast); } } - if (showToast.value && OsmandPlugin.isDevelopment()) { + if (showToast.value && newRoute && OsmandPlugin.isDevelopment()) { String msg = app.getString(R.string.new_route_calculated_dist_dbg, OsmAndFormatter.getFormattedDistance(res.getWholeDistance(), app), - ((int)res.getRoutingTime()) + " sec", res.getCalculateTime(), res.getVisitedSegments(), res.getLoadedTiles()); app.showToastMessage(msg); diff --git a/OsmAnd/src/net/osmand/plus/track/DirectionArrowsCard.java b/OsmAnd/src/net/osmand/plus/track/DirectionArrowsCard.java index f7ce7bacc6..0fa14c14c4 100644 --- a/OsmAnd/src/net/osmand/plus/track/DirectionArrowsCard.java +++ b/OsmAnd/src/net/osmand/plus/track/DirectionArrowsCard.java @@ -42,6 +42,11 @@ public class DirectionArrowsCard extends BaseCard { compoundButton.setChecked(checked); trackDrawInfo.setShowArrows(checked); mapActivity.refreshMap(); + + CardListener listener = getListener(); + if (listener != null) { + listener.onCardPressed(DirectionArrowsCard.this); + } } }); } diff --git a/OsmAnd/src/net/osmand/plus/track/SplitIntervalBottomSheet.java b/OsmAnd/src/net/osmand/plus/track/SplitIntervalBottomSheet.java index e062483739..e8728d6003 100644 --- a/OsmAnd/src/net/osmand/plus/track/SplitIntervalBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/track/SplitIntervalBottomSheet.java @@ -1,6 +1,5 @@ package net.osmand.plus.track; -import android.os.AsyncTask; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -27,7 +26,6 @@ import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.LongDescriptionItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; import net.osmand.plus.helpers.AndroidUiHelper; -import net.osmand.plus.track.SplitTrackAsyncTask.SplitTrackListener; import org.apache.commons.logging.Log; @@ -190,7 +188,7 @@ public class SplitIntervalBottomSheet extends MenuBottomSheetDialogFragment { private void addDistanceOptionSplit(int value, @NonNull List displayGroups) { if (displayGroups.size() > 0) { double dvalue = OsmAndFormatter.calculateRoundedDist(value, app); - String formattedDist = OsmAndFormatter.getFormattedDistance((float) dvalue, app); + String formattedDist = SplitIntervalCard.getFormattedDistanceInterval(app, value); distanceSplitOptions.put(formattedDist, dvalue); if (Math.abs(displayGroups.get(0).getSplitDistance() - dvalue) < 1) { selectedDistanceSplitInterval = distanceSplitOptions.size() - 1; @@ -200,14 +198,7 @@ public class SplitIntervalBottomSheet extends MenuBottomSheetDialogFragment { private void addTimeOptionSplit(int value, @NonNull List model) { if (model.size() > 0) { - String time; - if (value < 60) { - time = value + " " + getString(R.string.int_seconds); - } else if (value % 60 == 0) { - time = (value / 60) + " " + getString(R.string.int_min); - } else { - time = (value / 60f) + " " + getString(R.string.int_min); - } + String time = SplitIntervalCard.getFormattedTimeInterval(app, value); timeSplitOptions.put(time, value); if (model.get(0).getSplitTime() == value) { selectedTimeSplitInterval = timeSplitOptions.size() - 1; @@ -311,24 +302,10 @@ public class SplitIntervalBottomSheet extends MenuBottomSheetDialogFragment { int timeSplit = new ArrayList<>(timeSplitOptions.values()).get(selectedTimeSplitInterval); double distanceSplit = new ArrayList<>(distanceSplitOptions.values()).get(selectedDistanceSplitInterval); - SplitTrackListener splitTrackListener = new SplitTrackListener() { - - @Override - public void trackSplittingStarted() { - - } - - @Override - public void trackSplittingFinished() { - if (selectedGpxFile != null) { - List groups = getDisplayGroups(); - selectedGpxFile.setDisplayGroups(groups, app); - } - } - }; - List groups = getDisplayGroups(); - new SplitTrackAsyncTask(app, selectedSplitType, groups, splitTrackListener, trackDrawInfo.isJoinSegments(), - timeSplit, distanceSplit).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + Fragment target = getTargetFragment(); + if (target instanceof TrackAppearanceFragment) { + ((TrackAppearanceFragment) target).applySplit(selectedSplitType, timeSplit, distanceSplit); + } } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/track/SplitIntervalCard.java b/OsmAnd/src/net/osmand/plus/track/SplitIntervalCard.java index 44b4d75b0c..377185e714 100644 --- a/OsmAnd/src/net/osmand/plus/track/SplitIntervalCard.java +++ b/OsmAnd/src/net/osmand/plus/track/SplitIntervalCard.java @@ -1,19 +1,31 @@ package net.osmand.plus.track; +import android.graphics.Typeface; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.style.ForegroundColorSpan; import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; +import net.osmand.AndroidUtils; +import net.osmand.plus.OsmAndFormatter; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.helpers.FontCache; import net.osmand.plus.routepreparationmenu.cards.BaseCard; +import net.osmand.plus.widgets.style.CustomTypefaceSpan; public class SplitIntervalCard extends BaseCard { - public SplitIntervalCard(@NonNull MapActivity mapActivity) { + private TrackDrawInfo trackDrawInfo; + + public SplitIntervalCard(@NonNull MapActivity mapActivity, @NonNull TrackDrawInfo trackDrawInfo) { super(mapActivity); + this.trackDrawInfo = trackDrawInfo; } @Override @@ -28,6 +40,17 @@ public class SplitIntervalCard extends BaseCard { TextView titleView = view.findViewById(R.id.title); titleView.setText(R.string.gpx_split_interval); + Typeface typeface = FontCache.getFont(app, app.getString(R.string.font_roboto_medium)); + int secondaryTextColor = AndroidUtils.getColorFromAttr(view.getContext(), R.attr.active_color_basic); + + String splitInterval = getSplitInterval(); + SpannableStringBuilder spannableSplitInterval = new SpannableStringBuilder(splitInterval); + spannableSplitInterval.setSpan(new ForegroundColorSpan(secondaryTextColor), 0, spannableSplitInterval.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + spannableSplitInterval.setSpan(new CustomTypefaceSpan(typeface), 0, spannableSplitInterval.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + + TextView descriptionView = view.findViewById(R.id.description); + descriptionView.setText(spannableSplitInterval); + view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -38,4 +61,32 @@ public class SplitIntervalCard extends BaseCard { } }); } + + private String getSplitInterval() { + String intervalStr = ""; + int splitInterval = (int) trackDrawInfo.getSplitInterval(); + if (splitInterval == 0) { + intervalStr = GpxSplitType.NO_SPLIT.getHumanString(app); + } else if (trackDrawInfo.getSplitType() == GpxSplitType.DISTANCE.getType()) { + intervalStr = getFormattedDistanceInterval(app, trackDrawInfo.getSplitInterval()); + } else if (trackDrawInfo.getSplitType() == GpxSplitType.TIME.getType()) { + intervalStr = getFormattedTimeInterval(app, splitInterval); + } + return intervalStr; + } + + public static String getFormattedTimeInterval(OsmandApplication app, double interval) { + if (interval < 60) { + return interval + " " + app.getString(R.string.int_seconds); + } else if (interval % 60 == 0) { + return (interval / 60) + " " + app.getString(R.string.int_min); + } else { + return (interval / 60f) + " " + app.getString(R.string.int_min); + } + } + + public static String getFormattedDistanceInterval(OsmandApplication app, double interval) { + double roundedDist = OsmAndFormatter.calculateRoundedDist(interval, app); + return OsmAndFormatter.getFormattedDistance((float) roundedDist, app); + } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java index ef578f90f2..faaa96cf52 100644 --- a/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java +++ b/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java @@ -1,5 +1,7 @@ package net.osmand.plus.track; +import android.Manifest; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Build; @@ -9,29 +11,41 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; +import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import net.osmand.AndroidUtils; import net.osmand.GPXUtilities.GPXFile; +import net.osmand.Location; import net.osmand.PlatformUtil; +import net.osmand.data.QuadRect; +import net.osmand.data.RotatedTileBox; import net.osmand.plus.GPXDatabase.GpxDataItem; import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; +import net.osmand.plus.OsmAndLocationProvider; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities.DialogButtonType; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.base.ContextMenuFragment; +import net.osmand.plus.base.ContextMenuFragment.ContextMenuFragmentListener; import net.osmand.plus.dialogs.GpxAppearanceAdapter; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.routepreparationmenu.cards.BaseCard; import net.osmand.plus.routepreparationmenu.cards.BaseCard.CardListener; import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.track.SplitTrackAsyncTask.SplitTrackListener; +import net.osmand.plus.views.OsmandMapTileView; import net.osmand.render.RenderingRulesStorage; import net.osmand.util.Algorithms; @@ -42,9 +56,11 @@ import java.util.ArrayList; import java.util.List; import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR; +import static net.osmand.plus.dialogs.GpxAppearanceAdapter.TRACK_WIDTH_BOLD; +import static net.osmand.plus.dialogs.GpxAppearanceAdapter.TRACK_WIDTH_MEDIUM; import static net.osmand.plus.track.TrackDrawInfo.TRACK_FILE_PATH; -public class TrackAppearanceFragment extends ContextMenuFragment implements CardListener { +public class TrackAppearanceFragment extends ContextMenuFragment implements CardListener, ContextMenuFragmentListener { public static final String TAG = TrackAppearanceFragment.class.getName(); @@ -57,12 +73,15 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card private SelectedGpxFile selectedGpxFile; private List displayGroups; - private ImageView appearanceIcon; - private int menuTitleHeight; private long modifiedTime = -1; private TrackWidthCard trackWidthCard; + private SplitIntervalCard splitIntervalCard; + + private ImageView appearanceIcon; + private View zoomButtonsView; + private ImageButton myLocButtonView; @Override public int getMainLayoutId() { @@ -136,6 +155,7 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card View view = super.onCreateView(inflater, container, savedInstanceState); if (view != null) { appearanceIcon = view.findViewById(R.id.appearance_icon); + setListener(this); if (isPortrait()) { updateCardsLayout(); @@ -149,6 +169,8 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card params.gravity = Gravity.BOTTOM | Gravity.START; view.findViewById(R.id.control_buttons).setLayoutParams(params); } + buildZoomButtons(view); + enterTrackAppearanceMode(); runLayoutListener(); } return view; @@ -174,6 +196,21 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card updateStatusBarColor(); } + @Override + public void onContextMenuYPosChanged(@NonNull ContextMenuFragment fragment, int y, boolean needMapAdjust, boolean animated) { + updateZoomButtonsPos(fragment, y, animated); + } + + @Override + public void onContextMenuStateChanged(@NonNull ContextMenuFragment fragment, int menuState) { + updateZoomButtonsVisibility(menuState); + } + + @Override + public void onContextMenuDismiss(@NonNull ContextMenuFragment fragment) { + + } + @Override public void onResume() { super.onResume(); @@ -192,6 +229,40 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card } } + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + adjustMapPosition(getHeight()); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + exitTrackAppearanceMode(); + } + + private void enterTrackAppearanceMode() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + boolean portrait = AndroidUiHelper.isOrientationPortrait(mapActivity); + AndroidUiHelper.setVisibility(mapActivity, portrait ? View.INVISIBLE : View.GONE, + R.id.map_left_widgets_panel, + R.id.map_right_widgets_panel, + R.id.map_center_info); + } + } + + private void exitTrackAppearanceMode() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + AndroidUiHelper.setVisibility(mapActivity, View.VISIBLE, + R.id.map_left_widgets_panel, + R.id.map_right_widgets_panel, + R.id.map_center_info, + R.id.map_search_button); + } + } + @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); @@ -240,6 +311,10 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card if (trackWidthCard != null) { trackWidthCard.updateItems(); } + } else if (card instanceof TrackWidthCard) { + updateAppearanceIcon(); + } else if (card instanceof DirectionArrowsCard) { + updateAppearanceIcon(); } } } @@ -249,11 +324,183 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card } + @Override + protected int applyPosY(int currentY, boolean needCloseMenu, boolean needMapAdjust, int previousMenuState, int newMenuState, int dZoom, boolean animated) { + int y = super.applyPosY(currentY, needCloseMenu, needMapAdjust, previousMenuState, newMenuState, dZoom, animated); + if (needMapAdjust) { + adjustMapPosition(y); + } + return y; + } + + private void buildZoomButtons(@NonNull View view) { + OsmandApplication app = requireMyApplication(); + this.zoomButtonsView = view.findViewById(R.id.map_hud_controls); + ImageButton zoomInButtonView = (ImageButton) view.findViewById(R.id.map_zoom_in_button); + ImageButton zoomOutButtonView = (ImageButton) view.findViewById(R.id.map_zoom_out_button); + AndroidUtils.updateImageButton(app, zoomInButtonView, R.drawable.ic_zoom_in, R.drawable.ic_zoom_in, + R.drawable.btn_circle_trans, R.drawable.btn_circle_night, isNightMode()); + AndroidUtils.updateImageButton(app, zoomOutButtonView, R.drawable.ic_zoom_out, R.drawable.ic_zoom_out, + R.drawable.btn_circle_trans, R.drawable.btn_circle_night, isNightMode()); + zoomInButtonView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + doZoomIn(); + } + }); + zoomOutButtonView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + doZoomOut(); + } + }); + + myLocButtonView = (ImageButton) view.findViewById(R.id.map_my_location_button); + myLocButtonView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + if (OsmAndLocationProvider.isLocationPermissionAvailable(mapActivity)) { + mapActivity.getMapViewTrackingUtilities().backToLocationImpl(); + } else { + ActivityCompat.requestPermissions(mapActivity, + new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, + OsmAndLocationProvider.REQUEST_LOCATION_PERMISSION); + } + } + } + }); + updateMyLocation(); + + zoomButtonsView.setVisibility(View.VISIBLE); + } + + private void updateMyLocation() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity == null) { + return; + } + OsmandApplication app = mapActivity.getMyApplication(); + Location lastKnownLocation = app.getLocationProvider().getLastKnownLocation(); + boolean enabled = lastKnownLocation != null; + boolean tracked = mapActivity.getMapViewTrackingUtilities().isMapLinkedToLocation(); + + ImageButton myLocButtonView = this.myLocButtonView; + if (myLocButtonView != null) { + if (!enabled) { + myLocButtonView.setImageDrawable(getIcon(R.drawable.ic_my_location, R.color.icon_color_default_light)); + AndroidUtils.setBackground(app, myLocButtonView, isNightMode(), R.drawable.btn_circle, R.drawable.btn_circle_night); + myLocButtonView.setContentDescription(mapActivity.getString(R.string.unknown_location)); + } else if (tracked) { + myLocButtonView.setImageDrawable(getIcon(R.drawable.ic_my_location, R.color.color_myloc_distance)); + AndroidUtils.setBackground(app, myLocButtonView, isNightMode(), R.drawable.btn_circle, R.drawable.btn_circle_night); + } else { + myLocButtonView.setImageResource(R.drawable.ic_my_location); + AndroidUtils.setBackground(app, myLocButtonView, isNightMode(), R.drawable.btn_circle_blue, R.drawable.btn_circle_blue); + myLocButtonView.setContentDescription(mapActivity.getString(R.string.map_widget_back_to_loc)); + } + if (app.accessibilityEnabled()) { + myLocButtonView.setClickable(enabled && !tracked && app.getRoutingHelper().isFollowingMode()); + } + } + } + + public void updateZoomButtonsPos(@NonNull ContextMenuFragment fragment, int y, boolean animated) { + View zoomButtonsView = this.zoomButtonsView; + if (zoomButtonsView != null) { + int zoomY = y - getZoomButtonsHeight(); + if (animated) { + fragment.animateView(zoomButtonsView, zoomY); + } else { + zoomButtonsView.setY(zoomY); + } + } + } + + private int getZoomButtonsHeight() { + View zoomButtonsView = this.zoomButtonsView; + return zoomButtonsView != null ? zoomButtonsView.getHeight() : 0; + } + + public void doZoomIn() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + OsmandMapTileView map = mapActivity.getMapView(); + if (map.isZooming() && map.hasCustomMapRatio()) { + mapActivity.changeZoom(2, System.currentTimeMillis()); + } else { + mapActivity.changeZoom(1, System.currentTimeMillis()); + } + } + } + + public void doZoomOut() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + mapActivity.changeZoom(-1, System.currentTimeMillis()); + } + } + + private void updateZoomButtonsVisibility(int menuState) { + View zoomButtonsView = this.zoomButtonsView; + if (zoomButtonsView != null) { + if (menuState == MenuState.HEADER_ONLY) { + if (zoomButtonsView.getVisibility() != View.VISIBLE) { + zoomButtonsView.setVisibility(View.VISIBLE); + } + } else { + if (zoomButtonsView.getVisibility() == View.VISIBLE) { + zoomButtonsView.setVisibility(View.INVISIBLE); + } + } + } + } + private void updateAppearanceIcon() { - Drawable icon = getPaintedContentIcon(R.drawable.ic_action_gpx_width_bold, trackDrawInfo.getColor()); + Drawable icon = getTrackIcon(app, trackDrawInfo.getWidth(), trackDrawInfo.isShowArrows(), trackDrawInfo.getColor()); appearanceIcon.setImageDrawable(icon); } + private void adjustMapPosition(int y) { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null && mapActivity.getMapView() != null) { + GPXFile gpxFile = selectedGpxFile.getGpxFile(); + QuadRect r = gpxFile.getRect(); + + RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy(); + int tileBoxWidthPx = 0; + int tileBoxHeightPx = 0; + + if (!isPortrait()) { + tileBoxWidthPx = tb.getPixWidth() - getWidth(); + } else { + int fHeight = getViewHeight() - y - AndroidUtils.getStatusBarHeight(mapActivity); + tileBoxHeightPx = tb.getPixHeight() - fHeight; + } + if (r.left != 0 && r.right != 0) { + mapActivity.getMapView().fitRectToMap(r.left, r.right, r.top, r.bottom, tileBoxWidthPx, tileBoxHeightPx, 0); + } + } + } + + public Drawable getTrackIcon(OsmandApplication app, String widthAttr, boolean showArrows, @ColorInt int color) { + int widthIconId = getWidthIconId(widthAttr); + Drawable widthIcon = app.getUIUtilities().getPaintedIcon(widthIconId, color); + + int strokeIconId = getStrokeIconId(widthAttr); + int strokeColor = UiUtilities.getColorWithAlpha(Color.BLACK, 0.7f); + Drawable strokeIcon = app.getUIUtilities().getPaintedIcon(strokeIconId, strokeColor); + + Drawable arrows = null; + if (showArrows) { + int arrowsIconId = getArrowsIconId(widthAttr); + int contrastColor = UiUtilities.getContrastColor(app, color, false); + arrows = app.getUIUtilities().getPaintedIcon(arrowsIconId, contrastColor); + } + return UiUtilities.getLayeredIcon(widthIcon, strokeIcon, arrows); + } + private void updateCardsLayout() { View mainView = getMainView(); if (mainView != null) { @@ -289,7 +536,10 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card @Override public void onClick(View v) { discardChanges(); - dismiss(); + FragmentActivity activity = getActivity(); + if (activity != null) { + activity.onBackPressed(); + } } }); @@ -336,27 +586,38 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card if (splitType == null) { splitType = GpxSplitType.NO_SPLIT; } - SplitTrackAsyncTask.SplitTrackListener splitTrackListener = new SplitTrackAsyncTask.SplitTrackListener() { - - @Override - public void trackSplittingStarted() { - - } - - @Override - public void trackSplittingFinished() { - if (selectedGpxFile != null) { - List groups = getGpxDisplayGroups(); - selectedGpxFile.setDisplayGroups(groups, app); - } - } - }; - List groups = getGpxDisplayGroups(); - new SplitTrackAsyncTask(app, splitType, groups, splitTrackListener, trackDrawInfo.isJoinSegments(), - timeSplit, distanceSplit).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + applySplit(splitType, timeSplit, distanceSplit); } } + void applySplit(GpxSplitType splitType, int timeSplit, double distanceSplit) { + if (splitIntervalCard != null) { + splitIntervalCard.updateContent(); + } + SplitTrackListener splitTrackListener = new SplitTrackListener() { + + @Override + public void trackSplittingStarted() { + + } + + @Override + public void trackSplittingFinished() { + if (selectedGpxFile != null) { + List groups = getGpxDisplayGroups(); + selectedGpxFile.setDisplayGroups(groups, app); + } + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null && AndroidUtils.isActivityNotDestroyed(mapActivity)) { + mapActivity.refreshMap(); + } + } + }; + List groups = getGpxDisplayGroups(); + new SplitTrackAsyncTask(app, splitType, groups, splitTrackListener, trackDrawInfo.isJoinSegments(), + timeSplit, distanceSplit).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + private void saveGpx(final GPXFile gpxFile) { new SaveGpxAsyncTask(gpxFile, new SaveGpxAsyncTask.SaveGpxListener() { @Override @@ -379,11 +640,12 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card ViewGroup cardsContainer = getCardsContainer(); cardsContainer.removeAllViews(); - SplitIntervalCard splitIntervalCard = new SplitIntervalCard(mapActivity); + splitIntervalCard = new SplitIntervalCard(mapActivity, trackDrawInfo); splitIntervalCard.setListener(this); cardsContainer.addView(splitIntervalCard.build(mapActivity)); DirectionArrowsCard directionArrowsCard = new DirectionArrowsCard(mapActivity, trackDrawInfo); + directionArrowsCard.setListener(this); cardsContainer.addView(directionArrowsCard.build(mapActivity)); TrackColoringCard trackColoringCard = new TrackColoringCard(mapActivity, trackDrawInfo); @@ -391,6 +653,7 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card cardsContainer.addView(trackColoringCard.build(mapActivity)); trackWidthCard = new TrackWidthCard(mapActivity, trackDrawInfo); + trackWidthCard.setListener(this); cardsContainer.addView(trackWidthCard.build(mapActivity)); } } @@ -433,4 +696,34 @@ public class TrackAppearanceFragment extends ContextMenuFragment implements Card return false; } } + + public static int getWidthIconId(String widthAttr) { + if (TRACK_WIDTH_BOLD.equals(widthAttr)) { + return R.drawable.ic_action_track_line_bold_color; + } else if (TRACK_WIDTH_MEDIUM.equals(widthAttr)) { + return R.drawable.ic_action_track_line_medium_color; + } else { + return R.drawable.ic_action_track_line_thin_color; + } + } + + public static int getStrokeIconId(String widthAttr) { + if (TRACK_WIDTH_BOLD.equals(widthAttr)) { + return R.drawable.ic_action_track_line_bold_stroke; + } else if (TRACK_WIDTH_MEDIUM.equals(widthAttr)) { + return R.drawable.ic_action_track_line_medium_stroke; + } else { + return R.drawable.ic_action_track_line_thin_stroke; + } + } + + public static int getArrowsIconId(String widthAttr) { + if (TRACK_WIDTH_BOLD.equals(widthAttr)) { + return R.drawable.ic_action_track_line_bold_direction; + } else if (TRACK_WIDTH_MEDIUM.equals(widthAttr)) { + return R.drawable.ic_action_track_line_medium_direction; + } else { + return R.drawable.ic_action_track_line_thin_direction; + } + } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/track/TrackWidthCard.java b/OsmAnd/src/net/osmand/plus/track/TrackWidthCard.java index 65ccad6b73..7dc668e3d6 100644 --- a/OsmAnd/src/net/osmand/plus/track/TrackWidthCard.java +++ b/OsmAnd/src/net/osmand/plus/track/TrackWidthCard.java @@ -195,6 +195,11 @@ public class TrackWidthCard extends BaseCard { updateHeader(); updateCustomWidthSlider(); + + CardListener listener = getListener(); + if (listener != null) { + listener.onCardPressed(TrackWidthCard.this); + } } }); } @@ -207,7 +212,7 @@ public class TrackWidthCard extends BaseCard { iconId = R.drawable.ic_action_settings; color = AndroidUtils.getColorFromAttr(holder.itemView.getContext(), R.attr.active_color_basic); } else { - iconId = GpxAppearanceAdapter.getWidthIconId(item.getValue()); + iconId = TrackAppearanceFragment.getWidthIconId(item.getValue()); } holder.icon.setImageDrawable(app.getUIUtilities().getPaintedIcon(iconId, color)); } diff --git a/OsmAnd/src/net/osmand/plus/views/ContextMenuLayer.java b/OsmAnd/src/net/osmand/plus/views/ContextMenuLayer.java index ea5cf50027..848ad6ec3e 100644 --- a/OsmAnd/src/net/osmand/plus/views/ContextMenuLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/ContextMenuLayer.java @@ -57,6 +57,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivityActions; +import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.mapcontextmenu.controllers.TransportStopController; import net.osmand.plus.mapcontextmenu.other.MapMultiSelectionMenu; @@ -454,7 +455,7 @@ public class ContextMenuLayer extends OsmandMapLayer { mInGpxDetailsMode = true; activity.disableDrawer(); - mark(View.INVISIBLE, R.id.map_ruler_layout, + AndroidUiHelper.setVisibility(activity, View.INVISIBLE, R.id.map_ruler_layout, R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info); View collapseButton = activity.findViewById(R.id.map_collapse_button); @@ -469,7 +470,7 @@ public class ContextMenuLayer extends OsmandMapLayer { public void exitGpxDetailsMode() { mInGpxDetailsMode = false; activity.enableDrawer(); - mark(View.VISIBLE, R.id.map_ruler_layout, + AndroidUiHelper.setVisibility(activity, View.VISIBLE, R.id.map_ruler_layout, R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info); View collapseButton = activity.findViewById(R.id.map_collapse_button); @@ -480,7 +481,7 @@ public class ContextMenuLayer extends OsmandMapLayer { private void quitMovingMarker() { mInChangeMarkerPositionMode = false; - mark(View.VISIBLE, R.id.map_ruler_layout, + AndroidUiHelper.setVisibility(activity, View.VISIBLE, R.id.map_ruler_layout, R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info); View collapseButton = activity.findViewById(R.id.map_collapse_button); @@ -491,7 +492,7 @@ public class ContextMenuLayer extends OsmandMapLayer { public void quitAddGpxPoint() { mInAddGpxPointMode = false; - mark(View.VISIBLE, R.id.map_ruler_layout, + AndroidUiHelper.setVisibility(activity, View.VISIBLE, R.id.map_ruler_layout, R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info); View collapseButton = activity.findViewById(R.id.map_collapse_button); @@ -508,7 +509,7 @@ public class ContextMenuLayer extends OsmandMapLayer { mInAddGpxPointMode = true; mAddGpxPointBottomSheetHelper.show(newGpxPoint); - mark(View.INVISIBLE, R.id.map_ruler_layout, + AndroidUiHelper.setVisibility(activity, View.INVISIBLE, R.id.map_ruler_layout, R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info); View collapseButton = activity.findViewById(R.id.map_collapse_button); @@ -541,7 +542,7 @@ public class ContextMenuLayer extends OsmandMapLayer { mInChangeMarkerPositionMode = true; mMoveMarkerBottomSheetHelper.show(menu.getRightIcon()); - mark(View.INVISIBLE, R.id.map_ruler_layout, + AndroidUiHelper.setVisibility(activity, View.INVISIBLE, R.id.map_ruler_layout, R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info); View collapseButton = activity.findViewById(R.id.map_collapse_button); @@ -555,15 +556,6 @@ public class ContextMenuLayer extends OsmandMapLayer { view.refreshMap(); } - private void mark(int status, int... widgets) { - for (int widget : widgets) { - View v = activity.findViewById(widget); - if (v != null) { - v.setVisibility(status); - } - } - } - public void cancelMovingMarker() { cancelApplyingNewMarkerPosition = true; quitMovingMarker(); diff --git a/OsmAnd/src/net/osmand/plus/views/GPXLayer.java b/OsmAnd/src/net/osmand/plus/views/GPXLayer.java index 1f77a5e52f..922fbba961 100644 --- a/OsmAnd/src/net/osmand/plus/views/GPXLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/GPXLayer.java @@ -94,6 +94,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM private Drawable startPointIcon; private Drawable finishPointIcon; + private Drawable startAndFinishIcon; private LayerDrawable selectedPoint; private TrackDrawInfo trackDrawInfo; private TrackChartPoints trackChartPoints; @@ -190,6 +191,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM UiUtilities iconsCache = view.getApplication().getUIUtilities(); startPointIcon = iconsCache.getIcon(R.drawable.map_track_point_start); finishPointIcon = iconsCache.getIcon(R.drawable.map_track_point_finish); + startAndFinishIcon = iconsCache.getIcon(R.drawable.map_track_point_start_finish); contextMenuLayer = view.getLayerByClass(ContextMenuLayer.class); @@ -545,8 +547,12 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM WptPt start = segment.points.get(0); WptPt end = segment.points.get(segment.points.size() - 1); - drawPoint(canvas, tileBox, start, startPointIcon); - drawPoint(canvas, tileBox, end, finishPointIcon); + if (start.equals(end)) { + drawPoint(canvas, tileBox, start, startAndFinishIcon); + } else { + drawPoint(canvas, tileBox, start, startPointIcon); + drawPoint(canvas, tileBox, end, finishPointIcon); + } } } } diff --git a/OsmAnd/src/net/osmand/plus/views/MapQuickActionLayer.java b/OsmAnd/src/net/osmand/plus/views/MapQuickActionLayer.java index 18aaa84bf2..97e9f64f2d 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapQuickActionLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapQuickActionLayer.java @@ -311,7 +311,7 @@ public class MapQuickActionLayer extends OsmandMapLayer implements QuickActionRe view.setLatLon(lat, lon); inMovingMarkerMode = true; - mark(View.INVISIBLE, R.id.map_ruler_layout, + AndroidUiHelper.setVisibility(mapActivity, View.INVISIBLE, R.id.map_ruler_layout, R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info); View collapseButton = mapActivity.findViewById(R.id.map_collapse_button); @@ -349,7 +349,7 @@ public class MapQuickActionLayer extends OsmandMapLayer implements QuickActionRe } inMovingMarkerMode = false; - mark(View.VISIBLE, R.id.map_ruler_layout, + AndroidUiHelper.setVisibility(mapActivity, View.VISIBLE, R.id.map_ruler_layout, R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info); View collapseButton = mapActivity.findViewById(R.id.map_collapse_button); @@ -359,15 +359,6 @@ public class MapQuickActionLayer extends OsmandMapLayer implements QuickActionRe view.refreshMap(); } - private void mark(int status, int... widgets) { - for (int widget : widgets) { - View v = mapActivity.findViewById(widget); - if (v != null) { - v.setVisibility(status); - } - } - } - @Override public boolean onSingleTap(PointF point, RotatedTileBox tileBox) { if (isInMovingMarkerMode() && !pressedQuickActionWidget(point.x, point.y)) { diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java index 5b209060f5..30b73e7299 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java @@ -1275,6 +1275,7 @@ public class MapInfoWidgetsFactory { public boolean updateInfo() { boolean visible = settings.SHOW_COORDINATES_WIDGET.get() && map.getContextMenu().shouldShowTopControls() && map.getMapRouteInfoMenu().shouldShowTopControls() && !map.isTopToolbarActive() + && !map.getMapLayers().getGpxLayer().isInTrackAppearanceMode() && !MapRouteInfoMenu.chooseRoutesVisible && !MapRouteInfoMenu.waypointsVisible; updateVisibility(visible); diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java index 4f1ebd953d..1ddd521fc9 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java @@ -191,6 +191,7 @@ public class MapMarkersWidgetsFactory { || addressTopBar.getVisibility() == View.VISIBLE || map.isTopToolbarActive() || !map.getContextMenu().shouldShowTopControls() + || map.getMapLayers().getGpxLayer().isInTrackAppearanceMode() || map.getMapLayers().getMapMarkersLayer().isInPlanRouteMode()) { updateVisibility(false); return;