Merge pull request #10469 from osmandapp/master

update test branch
This commit is contained in:
Hardy 2020-12-25 01:09:48 +01:00 committed by GitHub
commit d53e0c2cfb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
106 changed files with 2529 additions and 1820 deletions

Binary file not shown.

Binary file not shown.

View file

@ -89,23 +89,22 @@ public abstract class MapObject implements Comparable<MapObject> {
names.putAll(name);
}
}
public Map<String, String> getNamesMap(boolean includeEn) {
if (!includeEn || Algorithms.isEmpty(enName)) {
if (names == null) {
return Collections.emptyMap();
}
return names;
if ((!includeEn || Algorithms.isEmpty(enName)) && names == null) {
return Collections.emptyMap();
}
Map<String, String> mp = new HashMap<String, String>();
if (names != null) {
Iterator<Entry<String, String>> it = mp.entrySet().iterator();
while(it.hasNext()) {
Iterator<Entry<String, String>> it = names.entrySet().iterator();
while (it.hasNext()) {
Entry<String, String> e = it.next();
mp.put(e.getKey(), unzipContent(e.getValue()));
}
}
mp.put("en", unzipContent(enName));
if (includeEn && !Algorithms.isEmpty(enName)) {
mp.put("en", unzipContent(enName));
}
return mp;
}
@ -115,7 +114,7 @@ public abstract class MapObject implements Comparable<MapObject> {
l.add(unzipContent(enName));
}
if (names != null) {
for(String nm : names.values()) {
for (String nm : names.values()) {
l.add(unzipContent(nm));
}
}

View file

@ -4005,4 +4005,5 @@
\n</string>
<string name="profile_type_osmand_string">ملف تعريف أوسماند</string>
<string name="profile_type_user_string">ملف تعريف المستخدم</string>
<string name="reverse_all_points">عكس جميع النقاط</string>
</resources>

View file

@ -1044,7 +1044,7 @@
<string name="shared_string_about">Quant a</string>
<string name="about_settings_descr">Informació de la versió, llicències, membres del projecte</string>
<string name="local_index_tile_data_zooms">Escalats baixats: %1$s</string>
<string name="local_index_tile_data_expire">Expira (minuts): %1$s</string>
<string name="local_index_tile_data_expire">Marge de caducitat (minuts): %1$s</string>
<string name="local_index_tile_data_downloadable">Baixable: %1$s</string>
<string name="local_index_tile_data_maxzoom">Escalat màxim: %1$s</string>
<string name="local_index_tile_data_minzoom">Escalat mínim: %1$s</string>
@ -1069,7 +1069,7 @@
<string name="complex_route_calculation_failed">El càlcul ràpid de ruta ha fallat (%s), retorn al mètode lent.</string>
<string name="disable_complex_routing_descr">Desactiva el càlcul de ruta en dues fases per navegació amb cotxe.</string>
<string name="disable_complex_routing">Desactiva el càlcul complex de la ruta</string>
<string name="edit_tilesource_successfully">El proveïdor de tessel·les %1$s estava desat</string>
<string name="edit_tilesource_successfully">Proveïdor de tessel·les %1$s desat</string>
<string name="edit_tilesource_choose_existing">Selecciona existent…</string>
<string name="map_widget_fps_info">Info depuració FPS</string>
<string name="intermediate_items_sort_return">Ordre optimitzat de les fites de la ruta fins a la destinació.</string>
@ -1728,7 +1728,7 @@
<string name="faq_item">PMF</string>
<string name="faq_item_description">Preguntes més freqüents</string>
<string name="map_viewing_item">Visualització del mapa</string>
<string name="search_on_the_map_item">Buscant el mapa</string>
<string name="search_on_the_map_item">Buscant al mapa</string>
<string name="instalation_troubleshooting_item">Instal·lació i solució de problemes</string>
<string name="techical_articles_item">Articles tècnics</string>
<string name="versions_item">Versions</string>
@ -1944,7 +1944,7 @@
<string name="access_autoannounce_period">Freqüència dels recordatoris</string>
<string name="access_autoannounce_period_descr">Interval mínim de temps entre anuncis.</string>
<string name="map_widget_bearing">Desviació relativa</string>
<string name="access_no_destination">No s\'ha fixat la destinació</string>
<string name="access_no_destination">Connector d\'accessibilitat: No s\'ha establert destinació</string>
<string name="map_widget_magnetic_bearing">Desviació respecte el Nord magnètic</string>
<string name="use_osm_live_routing_description">Activa la navegació pels canvis a OsmAnd Live.</string>
<string name="use_osm_live_routing">Navegació OsmAnd Live</string>
@ -2386,7 +2386,7 @@
<string name="show_from_zoom_level">Mostra començant pel nivell d\'escala</string>
<string name="routing_attr_allow_private_name">Permet l\'accés privat</string>
<string name="routing_attr_allow_private_description">Permet l\'accés a zones privades.</string>
<string name="hillshade_menu_download_descr">Baixeu el mapa \'Ombrejat de relleu\' per veure ombrejat segons alçada.</string>
<string name="hillshade_menu_download_descr">Baixeu el mapa de superposició \'Ombrejat de relleu\' per veure ombrejat segons alçada.</string>
<string name="hillshade_purchase_header">Instal·leu el connector \'Corbes de nivell\' per veure àrees graduades verticalment.</string>
<string name="shared_string_plugin">Connector</string>
<string name="srtm_purchase_header">Compreu i instal·leu el connector \'Corbes de nivell\' per visualitzar una gradació vertical d\'àrees.</string>
@ -3171,7 +3171,7 @@
<string name="sett_parrot_ext_input">Parrot</string>
<string name="routing_attr_piste_type_skitour_name">Esquí de ruta</string>
<string name="routing_attr_piste_type_skitour_description">Itineraris d\'esquí de ruta.</string>
<string name="routing_attr_freeride_policy_description">Camp a través i fora pistes són vies no oficials. Normalment so estan condicionades ni mantingudes per treballadors ni revisades per la nit. Si hi entreu en sereu responsables del que passi.</string>
<string name="routing_attr_freeride_policy_description">\'Camp a través\' i \'Fora pistes\' són vies no oficials. Normalment no estan regulades ni mantingudes ni revisades de nit. Entrant-hi, sereu responsables del que passi.</string>
<string name="turn_screen_on_router">Activa pantalla si cal maniobrar</string>
<string name="turn_on_profile_desc">Per utilitzar aquest paràmetre heu d\'activar almenys un perfil d\'aplicació.</string>
<string name="rendering_attr_winter_road_name">Carretera sobre la neu</string>
@ -3676,7 +3676,7 @@
<string name="shared_string_meters">metres</string>
<string name="quick_action_remove_next_destination">Suprimeix la fita més propera</string>
<string name="please_provide_point_name_error">Proporcioneu un nom per al punt</string>
<string name="quick_action_remove_next_destination_descr">La propera fita de la ruta s\'esborrarà. Si es tractés de la Destinació final, la navegació s\'aturaria.</string>
<string name="quick_action_remove_next_destination_descr">Esborra la propera fita de la vostra ruta. Si aquesta fos la Destinació, la navegació s\'aturaria.</string>
<string name="search_download_wikipedia_maps">Baixa mapes de la Viquipèdia</string>
<string name="plugin_wikipedia_description">Obteniu informació de punts d\'interès des la Viquipèdia. Serà la vostra guia de butxaca en desconnexió - només cal que activeu el connector Viquipèdia i fruireu dels articles que tracten de les coses que us rodegen.</string>
<string name="gpx_split_interval_none_descr">Seleccioneu el criteri limitant desitjat: temps o distància.</string>
@ -3710,7 +3710,7 @@
<string name="reverse_route">Ruta inversa</string>
<string name="route_between_points_whole_track_button_desc">La ruta sencera serà recalculada fent ús del perfil seleccionat.</string>
<string name="route_between_points_next_segment_button_desc">Només el següent segment serà recalculat fent ús del perfil seleccionat.</string>
<string name="whole_track">Ruta sencera</string>
<string name="whole_track">Pista sencera</string>
<string name="next_segment">Següent segment</string>
<string name="threshold_distance">Llindar de distància</string>
<string name="navigation_profile">Perfil de navegació</string>
@ -3788,7 +3788,7 @@
<string name="shared_string_redo">Torna a fer</string>
<string name="keep_screen_off">Manté la pantalla desactivada</string>
<string name="app_mode_enduro_motorcycle">Moto enduro</string>
<string name="plan_route_exit_dialog_descr">Esteu segur que voleu descartar totes les modificacions de la ruta planificada en tancar-la\?</string>
<string name="plan_route_exit_dialog_descr">Segur que voleu descartar totes les modificacions de la ruta planificada\?</string>
<string name="add_segment_to_the_track">Afegeix a un fitxer de traces</string>
<string name="layer_gpx_layer">Traces</string>
<string name="save_track_to_gpx_globally">Enregistra el trajecte a un fitxer GPX</string>
@ -3796,7 +3796,7 @@
<string name="add_address">Afegeix una adreça</string>
<string name="shared_string_file_name">Nom del fitxer</string>
<string name="monitoring_control_start">REC</string>
<string name="disable_recording_once_app_killed_descrp">Aturarà l\'enregistrament de traces quan es mati l\'aplicació (mitjançant aplicacions recents). (La indicació de fons OsmAnd desapareix de la barra de notificacions d\'Android.)</string>
<string name="disable_recording_once_app_killed_descrp">L\'enregistrament de traces s\'aturarà quan es mati l\'aplicació (mitjançant aplicacions recents). (Les indicacions en segon pla d\'OsmAnd desapareixeran de la barra de notificacions Android.)</string>
<string name="save_global_track_interval_descr">Trieu l\'interval d\'enregistrament general dels desplaçaments (s\'activa mitjançant el giny del mapa \'Enregistrament de ruta\').</string>
<string name="simplified_track">Traça simplificada</string>
<string name="simplified_track_description">Només es desarà la línia del trajecte, les fites s\'esborraran.</string>
@ -3878,7 +3878,7 @@
<string name="shared_string_add_photo">Afegeix foto</string>
<string name="register_on_openplacereviews">Registreu-vos a
\nOpenPlaceReviews.org</string>
<string name="register_on_openplacereviews_desc">Les fotos les proporciona el projecte OpenPlaceReviews.org de dades obertes. Per poder pujar les vostres fotos, cal que us registreu al lloc web.</string>
<string name="register_on_openplacereviews_desc">Les fotos les proporciona el projecte de dades obertes OpenPlaceReviews.org. Per poder pujar les vostres fotos, cal que us registreu al lloc web.</string>
<string name="register_opr_create_new_account">Crea un compte nou</string>
<string name="register_opr_have_account">ja tinc un compte</string>
<string name="shared_string_search_history">Historial de cerques</string>
@ -3900,10 +3900,10 @@
<string name="add_photos_descr">OsmAnd mostra fotos de diverses fonts:
\nOpenPlaceReviews - fotos de PDIs;
\nMapillary: imatges a nivell de carrer;
\nWeb / Wikimedia: fotos dels PDIs especificats a les dades d\'OpenStreetMap.</string>
\nWeb / Wikimedia: fotos dels PDIs d\'OpenStreetMap.</string>
<string name="ltr_or_rtl_combine_via_star">%1$s * %2$s</string>
<string name="icon_group_amenity">Equipament</string>
<string name="elevation_data">Podeu utilitzar les dades delevació per tenir en compte l\'ascens / descens de la vostra ruta</string>
<string name="elevation_data">Podeu utilitzar les dades delevació per acumular l\'ascens/descens de la vostra ruta</string>
<string name="app_mode_light_aircraft">Avioneta</string>
<string name="gpx_upload_identifiable_visibility_descr">\"Identificable\" vol dir que la traça es mostrarà públicament a les vostres traces GPS i als llistats públics de traces GPS, és a dir, els altres usuaris la podran baixar en brut i associada al vostre usuari. Les dades cronològiques de pas per les fites de lAPI GPS que es publiquen mitjançant lAPI de fites faran referència a la pàgina de la vostra traça original.</string>
<string name="gpx_upload_private_visibility_descr">\"Privada\" vol dir que la traça no es mostra a cap llistat públic, però les fites que conté estan disponibles a través de l\'API pública GPS, desordenades i sense enregistraments temporals.</string>
@ -3911,4 +3911,18 @@
<string name="plan_route_split_before">Separa abans</string>
<string name="plan_route_split_after">Separa després</string>
<string name="plan_route_add_new_segment">Afegeix un segment nou</string>
<string name="lang_de_casual">Alemany (col·loquial)</string>
<string name="what_is_new">Novetats</string>
<string name="profile_type_osmand_string">Perfil OsmAnd</string>
<string name="profile_type_user_string">Perfil d\'usuari</string>
<string name="release_3_9">• S\'ha afegit una opció per exportar i importar totes les dades, incloent configuracions, recursos i preferits
\n
\n • Planificació de la ruta: gràfics per segments de traçat de la ruta i s\'afegeix la possibilitat de crear i editar diversos segments de la traça alhora
\n
\n • S\'ha afegit el mètode d\'autenticació OAuth per a OpenStreetMap i s\'ha millorat la interfície d\'usuari dels diàlegs OSM
\n
\n • S\'admeten colors personalitzats per a llocs preferits i fites
\n
\n</string>
<string name="reverse_all_points">Revertir tots els punts</string>
</resources>

View file

@ -557,7 +557,7 @@
<string name="poi_craft_upholsterer">Tapezierer</string>
<string name="poi_vacuum_cleaner">Staubsaugergeschäft</string>
<string name="poi_variety_store">Kleinkaufhaus</string>
<string name="poi_vehicle_inspection">Fahrzeugkontrolle</string>
<string name="poi_vehicle_inspection">Fahrzeugprüfstelle</string>
<string name="poi_vehicle_ramp">Fahrzeugrampe</string>
<string name="poi_vending_machine">Verkaufsautomat</string>
<string name="poi_veterinary">Tierarzt</string>

View file

@ -4023,4 +4023,6 @@
<string name="profile_type_osmand_string">OsmAnd-Profil</string>
<string name="profile_type_user_string">Benutzerprofil</string>
<string name="reverse_all_points">Alle Punkte umkehren</string>
<string name="profile_by_default_description">Wählen Sie das Profil, das beim Start der Anwendung verwendet werden soll.</string>
<string name="shared_string_last_used">Zuletzt verwendet</string>
</resources>

View file

@ -3889,4 +3889,6 @@
<string name="poi_water_source_tube_well">puto tuba (abisena)</string>
<string name="poi_weightbridge">Pezilo por aŭtomobiloj</string>
<string name="poi_ranger_station">Oficejo de naturrezervejo</string>
<string name="poi_lavoir">Vestaĵ-lavejo (ĉe rivero)</string>
<string name="poi_waste_transfer_station">Stacio de rubmastrumado</string>
</resources>

View file

@ -4017,4 +4017,5 @@
\n</string>
<string name="profile_type_osmand_string">OsmAndprofilo</string>
<string name="profile_type_user_string">Profilo de uzanto</string>
<string name="reverse_all_points">Inversigi ĉiujn punktojn</string>
</resources>

View file

@ -3857,4 +3857,27 @@
<string name="poi_mobile_money_agent">Mobiiliraha müügikoht</string>
<string name="poi_ranger_station">Pargivahi maja</string>
<string name="poi_weightbridge">Autokaal</string>
<string name="poi_liaison_subnational">Riigiülesed</string>
<string name="poi_liaison_representative_office">Esindus</string>
<string name="poi_liaison_liaison_office">Kontor</string>
<string name="poi_consulate_honorary_consul">Aukonsulaat</string>
<string name="poi_consulate_consulate_general">Peakonsulaat</string>
<string name="poi_consulate_consular_office">Konsulaaresindus</string>
<string name="poi_consulate_consular_agency">Konsulaarasutus</string>
<string name="poi_consulate_yes">Juhib konsul</string>
<string name="poi_embassy_mission">Missioon</string>
<string name="poi_embassy_interests_section">Huvide jaotis</string>
<string name="poi_embassy_high_commission">Kõrge komisjonitasu</string>
<string name="poi_embassy_delegation">Delegatsioon</string>
<string name="poi_embassy_branch_embassy">Filiaal</string>
<string name="poi_embassy_yes">Juhib suursaadik</string>
<string name="poi_diplomatic_liaison">Sidepidamine</string>
<string name="poi_diplomatic_services_citizen_services_filter">Kodanike teenused</string>
<string name="poi_diplomatic_services_immigrant_visas_filter">Immigrandi viisad</string>
<string name="poi_diplomatic_services_non_immigrant_visas_filter">Mitteimmigrandi viisad</string>
<string name="poi_liaison_filter">Sidepidamine</string>
<string name="poi_diplomatic_services_non_immigrant_visas_yes">Jah</string>
<string name="poi_diplomatic_services_non_immigrant_visas_no">Ei</string>
<string name="poi_waste_transfer_station">Jäätmejaam</string>
<string name="poi_lavoir">Avalik pesumaja</string>
</resources>

View file

@ -7,8 +7,8 @@
<string name="shared_string_skip">Jäta vahele</string>
<string name="poi_action_add">lisa</string>
<string name="shared_string_message">Sõnum</string>
<string name="agps_data_last_downloaded">A-GPS andmed on allalaetud: %1$s</string>
<string name="welmode_download_maps">Kaartide allalaadimine</string>
<string name="agps_data_last_downloaded">A-GPS andmed on alla laaditud: %1$s</string>
<string name="welmode_download_maps">Laadi kaarte</string>
<string name="welcome_header">Tere tulemast</string>
<string name="mark_to_delete">Märgi kustutamiseks</string>
<string name="confirmation_to_clear_history">Tühjendada ajalugu\?</string>
@ -46,9 +46,9 @@
<string name="shared_string_do_not_show_again">Ära enam näita</string>
<string name="shared_string_remember_my_choice">Mäleta valikut</string>
<string name="shared_string_refresh">Värskenda</string>
<string name="shared_string_download">Lae alla</string>
<string name="shared_string_download">Laadi alla</string>
<string name="shared_string_downloading">Allalaadimine…</string>
<string name="shared_string_download_successful">Alla laetud</string>
<string name="shared_string_download_successful">Alla laaditud</string>
<string name="shared_string_close">Sulge</string>
<string name="shared_string_exit">Välju</string>
<string name="shared_string_show">Näita</string>
@ -109,7 +109,7 @@
<string name="current_track">Valitud lugu</string>
<string name="use_osm_live_routing_description">Aktiveeri OsmAnd Live muutuste navigeerimine.</string>
<string name="use_osm_live_routing">OsmAnd Live navigeerimine</string>
<string name="access_no_destination">Sihtkoht määramata</string>
<string name="access_no_destination">Juurdepääsetavuse pistikprogramm: sihtkoht määramata</string>
<string name="map_widget_magnetic_bearing">Asimuut</string>
<string name="map_widget_bearing">Suhteline kurss</string>
<string name="access_disable_offroute_recalc">Ära otsi uut teekonda kui eelmiselt lahkuti</string>
@ -154,7 +154,7 @@
<string name="shared_string_add_photos">Lisa fotosid</string>
<string name="mapillary_widget">Mapillary vidin</string>
<string name="shared_string_reset">Lähtesta</string>
<string name="shared_string_reload">Lae uuesti</string>
<string name="shared_string_reload">Laadi uuesti</string>
<string name="wrong_user_name">Vale kasutajanimi</string>
<string name="mapillary_menu_title_dates">Kuupäev</string>
<string name="mapillary_menu_edit_text_hint">Sisesta kasutajatunnus</string>
@ -186,7 +186,7 @@
<string name="open_wikipedia_link_online_description">Link avatakse veebilehitsejas.</string>
<string name="how_to_open_link">Kuidas link avada?</string>
<string name="read_wikipedia_offline">Loe Wikipediat ilma võrguühenduseta</string>
<string name="download_all">Lae kõik alla</string>
<string name="download_all">Laadi kõik alla</string>
<string name="shared_string_restart">Rakenduse taaskäivitamine</string>
<string name="show_images">Näita pilte</string>
<string name="maps_you_need">Kaardid, mida vajad</string>
@ -195,7 +195,7 @@
<string name="paid_app">Makstud rakendus</string>
<string name="paid_plugin">Makstud lisa</string>
<string name="update_is_available">Uuendus saadaval</string>
<string name="download_file">Lae fail alla</string>
<string name="download_file">Laadi fail alla</string>
<string name="start_editing">Alusta muutmist</string>
<string name="get_unlimited_access">Hangi piiramatu ligipääs</string>
<string name="monthly_map_updates">Igakuised kaardiuuendused</string>
@ -271,7 +271,7 @@
<string name="empty_route_calculated">Arvutatud teekond on tühi.</string>
<string name="use_online_routing_descr">Kasuta internetti teekonna arvutamiseks.</string>
<string name="use_fast_recalculation">Tark teekonna arvutamine</string>
<string name="use_fast_recalculation_desc">Arvuta uuesti ainult teekonna algusosa. Seda võid kasutada pikemate vahemaade korral.</string>
<string name="use_fast_recalculation_desc">Arvutab ümber ainult teekonna algosa, mis on kasulik pikkade reiside korral.</string>
<string name="simulate_your_location_descr">Simuleeri arvutatud või salvestatud GPX teekonda.</string>
<string name="hillshade_layer_disabled">Künkavarjutuse kiht keelatud</string>
<string name="rendering_attr_horseRoutes_name">Ratsutamisteed</string>
@ -312,7 +312,7 @@
<string name="show_from_zoom_level">Kuva alates suurenduse tasemest</string>
<string name="routing_attr_allow_private_name">Luba eramaad</string>
<string name="shared_string_plugin">Lisand</string>
<string name="hillshade_menu_download_descr">Lae alla \'Künkavarjutuse ülekatte\' kaart vertikaalse varjutuse kuvamiseks.</string>
<string name="hillshade_menu_download_descr">Vertikaalse varjutuse kuvamiseks laadi alla „Künkavarjutuse ülekatte“ kaart.</string>
<string name="hillshade_purchase_header">Paigalda \'Kõrgusjoonte\' laiendus astmestatud vertikaalsete alade kuvamiseks.</string>
<string name="hide_from_zoom_level">Peida alates suurenduse tasemest</string>
<string name="sorted_by_distance">Sorteeritud kauguse järgi</string>
@ -513,13 +513,13 @@
<string name="shared_string_dont">Ära</string>
<string name="shared_string_do">Tee</string>
<string name="shared_string_only_with_wifi">Ainult Wi-Fi ühendusega</string>
<string name="wikivoyage_download_pics">Lae pildid alla</string>
<string name="wikivoyage_download_pics_descr">Artikli pilte saab laadida alla võrguühenduseta kasutamiseks.
<string name="wikivoyage_download_pics">Laadi pildid alla</string>
<string name="wikivoyage_download_pics_descr">Artikli pilte saad laadida alla võrguühenduseta kasutamiseks.
\nAlati saadaval menüüs \'Avasta\' → \'Valikud\'.</string>
<string name="shared_string_wifi_only">Ainult Wi-Fi ühendusega</string>
<string name="select_travel_book">Vali reisikiri</string>
<string name="shared_string_travel_book">Reisikiri</string>
<string name="download_images">Lae pildid alla</string>
<string name="download_images">Laadi pildid alla</string>
<string name="purchase_dialog_title">Vali plaan</string>
<string name="purchase_dialog_subtitle">Vali sobiv toode</string>
<string name="in_app_purchase_desc_ex">Ostmise järel on sulle püsivalt kasutatav.</string>
@ -528,11 +528,11 @@
<string name="wikipedia_offline">Vikipeedia võrguühenduseta</string>
<string name="unlock_all_features">Ava kõik OsmAnd funktsioonid</string>
<string name="travel_card_update_descr">Uued Wikivoyage andmed saadaval, uuenda nautimiseks.</string>
<string name="travel_card_download_descr">Lae alla Wikivoyage reisijuhid, et vaadata artikleid kohtadest üle maailma ilma internetiühenduseta.</string>
<string name="travel_card_download_descr">Laadi alla Wikivoyage reisijuhid, et vaadata artikleid kohtadest üle maailma ilma internetiühenduseta.</string>
<string name="start_editing_card_image_text">Tasuta ülemaailmne kõigi poolt täiendatav reisijuht.</string>
<string name="welcome_to_open_beta">Tere tulemast avatud beetasse</string>
<string name="contour_lines_hillshade_maps">Kõrgusjooned &amp; künkavarjutusega kaardid</string>
<string name="maps_you_need_descr">Sinu järjehoidjatesse lisatud artiklite alusel on soovitatav laadida alla järgmised kaardid:</string>
<string name="contour_lines_hillshade_maps">Kõrgusjooned ja künkavarjutusega kaardid</string>
<string name="maps_you_need_descr">Sinu järjehoidjatesse lisatud artiklite alusel on soovitame alla laadida järgmised kaardid:</string>
<string name="purchase_cancelled_dialog_title">Oled tühistanud oma OsmAnd Live tellimuse</string>
<string name="purchase_cancelled_dialog_descr">Uuenda tellimust kõigi funktsioonide kasutamise jätkamiseks:</string>
<string name="read_wikipedia_offline_description">Hangi OsmAnd Live tellimus, et lugeda Vikipeedia ja Wikivoyage artikleid ilma võrguühenduseta.</string>
@ -702,7 +702,7 @@
\n
\nSeadista mis tahes ajal menüüst \'Seaded\' → \'Privaatsus ja turvalisus\'.</string>
<string name="choose_data_to_share">Vali, millist liiki andmeid soovid jagada:</string>
<string name="downloaded_maps">Alla laetud kaardid</string>
<string name="downloaded_maps">Allalaaditud kaardid</string>
<string name="visited_screens">Külastatud ekraanid</string>
<string name="collected_data_descr">Määra, milliseid andmeid OsmAnd võib jagada.</string>
<string name="downloaded_maps_collect_descr">Aita meil mõista riikide ja piirkondade kaartide populaarsust.</string>
@ -913,7 +913,7 @@
<string name="logcat_buffer">Logcati puhver</string>
<string name="plugins_settings">Laienduse seaded</string>
<string name="shared_string_by_default">Vaikimisi</string>
<string name="download_detailed_map">Selle ala vaatlemiseks lae alla üksikasjalik %s kaart.</string>
<string name="download_detailed_map">Selle ala vaatlemiseks laadi alla üksikasjalik %s kaart.</string>
<string name="change_data_storage_full_description">Teisaldada OsmAnd andmefailid uude sihtkohta\?
\n%1$s &gt; %2$s</string>
<string name="data_storage_preference_summary">%1$s • %2$s</string>
@ -1033,7 +1033,7 @@
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_comma">%1$s, %2$s</string>
<string name="personal_category_name">Isiklik</string>
<string name="shared_string_downloading_formatted">Allalaadimine %s</string>
<string name="shared_string_downloading_formatted">Laadin alla %s</string>
<string name="rendering_value_thick_name">Jäme</string>
<string name="desert_render_descr">Kõrbete ja muude hõredalt asustatud piirkondade jaoks. Üksikasjalikum.</string>
<string name="select_navigation_icon">Liikumisel kuvatav asukohaikoon</string>
@ -1124,7 +1124,7 @@
<string name="lang_et">Eesti</string>
<string name="lang_ceb">Sebu</string>
<string name="archive_wikipedia_data">Sul on vana ja kokkusobimatu Vikipeedia andmestik. Arhiveerida see\?</string>
<string name="download_wikipedia_files">Laadida täiendavaid andmeid Vikipeediast (%1$s MB)\?</string>
<string name="download_wikipedia_files">Kas laadime täiendavaid andmeid Vikipeediast (%1$s MB)\?</string>
<string name="gps_network_not_enabled">Asukohateenus on välja lülitatud. Lülitada sisse\?</string>
<string name="disable_recording_once_app_killed">Väldi iseseisvat logimist</string>
<string name="shared_string_import2osmand">OsmAnd import</string>
@ -1239,9 +1239,9 @@
<string name="rendering_value_americanRoadAtlas_name">Ameerika teede atlas</string>
<string name="routing_attr_no_new_routing_name">Puuduvad v1.9 teekonna arvutuse reeglid</string>
<string name="routing_attr_no_new_routing_description">Ära kasuta v1.9 teekonna arvutuse reegleid.</string>
<string name="dash_download_msg_none">Laadida alla võrguühenduseta kaarte\?</string>
<string name="dash_download_msg_none">Kas laadime alla võrguühenduseta kaarte\?</string>
<string name="dash_download_msg">Oled laadinud alla %1$s kaarti</string>
<string name="dash_download_new_one">Lae alla uus kaart</string>
<string name="dash_download_new_one">Laadi alla uus kaart</string>
<string name="dash_download_manage">Halda</string>
<string name="map_locale">Kaardi keel</string>
<string name="rendering_attr_transportStops_name">Peatuskohad</string>
@ -1323,7 +1323,7 @@
<string name="distance">Kaugus</string>
<string name="index_tours">Ringkäik</string>
<string name="shared_string_all">Kõik</string>
<string name="download_additional_maps">Laadida alla puuduvad kaardid %1$s (%2$d MB)\?</string>
<string name="download_additional_maps">Kas laadime alla puuduvad kaardid %1$s (%2$d MB)\?</string>
<string name="rendering_value_browse_map_name">Sirvi kaarti</string>
<string name="rendering_value_car_name">Auto</string>
<string name="rendering_value_bicycle_name">Jalgratas</string>
@ -1511,9 +1511,9 @@
<string name="base_world_map">Maailma aluskaart</string>
<string name="about_version">Versioon:</string>
<string name="about_settings_descr">Versiooni info, litsentsid, projekti liikmed</string>
<string name="local_index_tile_data_zooms">Allalaetud suumitasemed: %1$s</string>
<string name="local_index_tile_data_zooms">Allalaaditud suumitasemed: %1$s</string>
<string name="local_index_tile_data_expire">Aegumine (minutites): %1$s</string>
<string name="local_index_tile_data_downloadable">Alla laetav: %1$s</string>
<string name="local_index_tile_data_downloadable">Alla laaditav: %1$s</string>
<string name="local_index_tile_data_maxzoom">Maksimaalne suurendus: %1$s</string>
<string name="local_index_tile_data_minzoom">Minimaalne suurendus: %1$s</string>
<string name="edit_tilesource_elliptic_tile">Mercatori elliptiline projektsioon</string>
@ -1570,7 +1570,7 @@
<string name="use_magnetic_sensor">Kasuta magnetandurit</string>
<string name="other_location">Muu</string>
<string name="files_limit">%1$d faili järel</string>
<string name="available_downloads_left">%1$d faili veel alla laadida</string>
<string name="available_downloads_left">Veel %1$d faili on jäänud alla laadida</string>
<string name="install_paid">Täisversioon</string>
<string name="cancel_navigation">Lõpeta navigeerimine</string>
<string name="clear_destination">Eemalda sihtpunkt</string>
@ -1697,37 +1697,37 @@
<string name="interrupt_music_descr">Hääljuhised peatavad muusika esitamise.</string>
<string name="interrupt_music">Peata muusika</string>
<string name="osmand_play_title_30_chars">OsmAnd kaardid ja navigeerimine</string>
<string name="osmand_long_description_1000_chars">OsmAnd (OSM automatiseeritud navigeerimisjuhised)
\n
\n OsmAnd on avatud lähtekoodiga tarkvara navigeerimisrakendus, millel on juurdepääs mitmesugustele ülemaailmsetele OpenStreetMap (OSM) andmetele. Kõiki kaardiandmeid (vektor- või paanikaarte) saab salvestada telefoni mälukaardile võrguühenduseta kasutamiseks. Pakutakse ka võrguühenduseta ja veebipõhist teekonna leidmise funktsiooni, sealhulgas pöörangupõhiseid hääljuhiseid.
\n
\n Mõned põhifunktsioonid:
\n - Täielik võrguühenduseta funktsioon (salvestage alla laetud vektor- või paanikaardid seadme mällu)
\n - Saadaval on kompaktsed võrguühenduseta vektorkaardid üle kogu maailma
\n - Riigi või piirkonna kaardid on alla laetavad otse rakendusest
\n - Võimalik on mitme kaardikihi ülekatmine, näiteks GPX või navigeerimisrajad, huvipunktid, eelistused, kõrgusjooned, ühistranspordi peatused, täiendavad kaardid kohandatava läbipaistvusega
\n - Aadresside ja kohtade (huvipunktide) otsing ilma võrguühenduseta
\n - Võrguühenduseta teekonna leidmine keskmise vahemaa jaoks
\n - Auto-, jalgratta- ja jalakäijarežiim valikuliselt:
\n - Automatiseeritud päeva/öö vaate vahetamine
\n - Kiirusest sõltuv kaardi suurendusaste
\n - Kaardi joondamine vastavalt kompassile või liikumissuunale
\n - Teekonnal juhtimine, kiiruspiirangu kuvamine, salvestatud ja kõnesünteesitud hääljuhised
\n
\n Selle tasuta OsmAnd versiooni piirangud:
\n - Kaardi allalaadimiste arv on piiratud
\n - Vikipeedia huvipunktidele puudub võrguühenduseta juurdepääs
\n
<string name="osmand_long_description_1000_chars">OsmAnd (OSM automatiseeritud navigeerimisjuhised)
\n
\n OsmAnd on avatud lähtekoodiga tarkvara navigeerimisrakendus, millel on juurdepääs mitmesugustele ülemaailmsetele OpenStreetMap (OSM) andmetele. Kõiki kaardiandmeid (vektor- või paanikaarte) saad salvestada telefoni mälukaardile võrguühenduseta kasutamiseks. Olemas on ka võrguühenduseta ja veebipõhised teekonna leidmise funktsioonid, sealhulgas pöörangupõhiseid hääljuhiseid.
\n
\n Mõned põhifunktsioonid:
\n - Täielik võrguühenduseta funktsioon (salvestades allalaaditud vektor- või paanikaardid seadme mällu)
\n - Saadaval on kompaktsed võrguühenduseta vektorkaardid üle kogu maailma
\n - Riigi või piirkonna kaardid on alla laaditavad otse rakendusest
\n - Võimalik on mitme kaardikihi ülekatmine, näiteks GPX või navigeerimisrajad, huvipunktid, eelistused, kõrgusjooned, ühistranspordi peatused, täiendavad kaardid kohandatava läbipaistvusega
\n - Aadresside ja kohtade (huvipunktide) otsing ilma võrguühenduseta
\n - Võrguühenduseta teekonna leidmine keskmise vahemaa jaoks
\n - Auto-, jalgratta- ja jalakäijarežiim valikuliselt:
\n - Automatiseeritud päeva/öö vaate vahetamine
\n - Kiirusest sõltuv kaardi suurendusaste
\n - Kaardi joondamine vastavalt kompassile või liikumissuunale
\n - Teekonnal juhtimine, kiiruspiirangu kuvamine, salvestatud ja kõnesünteesitud hääljuhised
\n
\n Selle tasuta OsmAnd versiooni piirangud:
\n - Kaardi allalaadimiste arv on piiratud
\n - Vikipeedia huvipunktidele puudub võrguühenduseta juurdepääs
\n
\n OsmAnd on aktiivselt arendamisel ning meie projekt ja selle jätkuv edasiminek sõltub rahalisest toetusest uute funktsioonide väljatöötamiseks ja testimiseks. Palun kaalu OsmAnd+ ostmist või konkreetsete uute funktsioonide rahastamist või üldise annetuse tegemist leheküljel https://osmand.net.</string>
<string name="osmand_plus_play_title_30_chars">OsmAnd+ kaardid ja navigeerimine</string>
<string name="osmand_plus_long_description_1000_chars">OsmAnd+ (OSM automatiseeritud navigeerimisjuhised)
\n
\n OsmAnd+ on avatud lähtekoodiga tarkvara navigeerimisrakendus, millel on juurdepääs paljudele globaalsetele OpenStreetMap (OSM) andmetele. Kõiki kaardiandmeid (vektor- ja paanikaarte) saab salvestada telefoni mälukaardile võrguühenduseta kasutamiseks. Võimalik on nii võrguühenduseta kui ka -ühendusega teekonna leidmise funktsioon, milles on ka hääljuhiseid.
\n OsmAnd+ on avatud lähtekoodiga tarkvara navigeerimisrakendus, millel on juurdepääs paljudele globaalsetele OpenStreetMap (OSM) andmetele. Kõiki kaardiandmeid (vektor- ja paanikaarte) saad salvestada telefoni mälukaardile võrguühenduseta kasutamiseks. Võimalik on nii võrguühenduseta kui ka -ühendusega teekonna leidmise funktsioon, milles on ka hääljuhiseid.
\n
\n OsmAnd+ on rakenduse tasuline versioon, mida ostes toetate projekti, rahastate uute funktsioonide arendamist ja saate kõige värskemaid uuendusi.
\n OsmAnd+ on rakenduse tasuline versioon, mida ostes toetad projekti, rahastad uute funktsioonide arendamist ja saad kõige värskemaid uuendusi.
\n
\n Mõned põhifunktsioonid:
\n - Täielik võrguühenduseta funktsioon (salvestage alla laetud vektor- ja paanikaardid seadme mällu)
\n - Täielik võrguühenduseta funktsioon (salvesta alla laaditud vektor- ja paanikaardid seadme mällu)
\n - Saadaval on kompaktsed kogu maailma vektorkaardid (võrguühenduseta režiim)
\n - Riigi või piirkonna kaartide piiramatu allalaadimine otse rakendusest
\n - Võrguühenduseta Vikipeedia funktsioon (laadige Vikipeedia huvipunktid alla), sobib suurepäraselt vaatamisväärsustega tutvumiseks
@ -1832,11 +1832,11 @@
<string name="unknown_from_location">Lähtepunkt on veel määramata.</string>
<string name="unknown_location">Asukoht ei ole veel teada.</string>
<string name="modify_transparency">Määra läbipaistvus (0 - läbipaistev, 255 - läbipaistmatu)</string>
<string name="confirm_interrupt_download">Tühistada allalaadimine\?</string>
<string name="basemap_was_selected_to_download">Põhifunktsionaalsuse pakkumiseks vajaliku aluskaardi alla laadimine on järjekorras.</string>
<string name="confirm_interrupt_download">Tühistame allalaadimise\?</string>
<string name="basemap_was_selected_to_download">Põhifunktsionaalsuse pakkumiseks vajaliku aluskaardi allalaadimine on järjekorras.</string>
<string name="local_indexes_cat_map">Standardkaardid (vektor)</string>
<string name="map_online_plugin_is_not_installed">Luba \'Internetikaardid\' lisa erinevate kaardiallikate valimiseks</string>
<string name="map_online_data_descr">Kasuta internetikaarte (lae alla ja puhverda paanid mälukaardil).</string>
<string name="map_online_data_descr">Kasuta internetikaarte (laadi alla ja puhverda paanid mälukaardil).</string>
<string name="online_map_settings_descr">Vali veebipõhised või puhverdatud paanikaartide allikad.</string>
<string name="plugins_screen">Lisad</string>
<string name="prefs_plugins">Lisad</string>
@ -1901,11 +1901,11 @@
<string name="arrival_distance_descr">Kui vara soovid kohale jõudmise teavitust\?</string>
<string name="use_fluorescent_overlays">Helkivad ülekatted</string>
<string name="offline_edition">Võrguühenduseta muutmine</string>
<string name="offline_edition_descr">Kui võrguühenduseta muutmine on kasutusel, siis muudatused salvestatakse esmalt kohalikus nutiseadmes ning laetakse üles eraldi päringuga. Muul juhul laetakse muudatused üles koheselt.</string>
<string name="offline_edition_descr">Kui võrguühenduseta muutmine on kasutusel, siis muudatused salvestatakse esmalt kohalikus nutiseadmes ning laaditakse üles eraldi päringuga. Muul juhul laaditakse muudatused üles koheselt.</string>
<string name="local_openstreetmap_uploading">Üles laadimine…</string>
<string name="local_openstreetmap_were_uploaded">{0} huvipunkti/märget üles laetud</string>
<string name="local_openstreetmap_uploadall">Lae kõik üles</string>
<string name="local_openstreetmap_upload">Lae muudatus OSM-i üles</string>
<string name="local_openstreetmap_were_uploaded">{0} huvipunkti/märget üles laaditud</string>
<string name="local_openstreetmap_uploadall">Laadi kõik üles</string>
<string name="local_openstreetmap_upload">Laadi muudatus OSM-i üles</string>
<string name="local_openstreetmap_delete">Kustuta muudatus</string>
<string name="local_openstreetmap_descr_title">Asünkroonne OSM muutmine:</string>
<string name="local_openstreetmap_settings">OSM huvipunktid/märkmed salvestatud seadmes</string>
@ -1946,7 +1946,7 @@
<string name="user_password">Salasõna</string>
<string name="osmand_service">Taustarežiim</string>
<string name="osmand_service_descr">OsmAnd töötab taustal, ekraan välja lülitatud.</string>
<string name="download_files_question_space">Kas laeme alla {0} fail(i)\?
<string name="download_files_question_space">Kas laadime alla {0} fail(i)\?
\n{1} MB (kokku {2} MB-st) võetakse kasutusse.</string>
<string name="use_transparent_map_theme">Läbipaistev teema</string>
<string name="choose_auto_follow_route">Kaardivaade automaatselt keskele</string>
@ -1981,7 +1981,7 @@
<string name="context_menu_item_search">Otsi lähedusest</string>
<string name="filename_input">Failinimi:</string>
<string name="file_with_name_already_exist">Sama nimega fail on juba olemas.</string>
<string name="local_index_items_uploaded">%1$d / %2$d ühik(ut) üles laetud.</string>
<string name="local_index_items_uploaded">%1$d / %2$d ühik(ut) üles laaditud.</string>
<string name="local_index_mi_upload_gpx">Saada OSM-i</string>
<string name="show_more_map_detail">Kuva kaardil rohkem üksikasju</string>
<string name="favourites_delete_multiple_succesful">Lemmikpunktid kustutatud.</string>
@ -2017,7 +2017,7 @@
<string name="internet_connection_required_for_online_route">Veebipõhine navigeerimine ei tööta ilma võrguühenduseta.</string>
<string name="tts_language_not_supported_title">Mittetoetatud keel</string>
<string name="tts_missing_language_data_title">Puuduvad andmed</string>
<string name="tts_missing_language_data">Mine turule valitud keele alla laadimiseks\?</string>
<string name="tts_missing_language_data">Kas läheme valitud keele alla laadimiseks rakendusepoodi\?</string>
<string name="gpx_option_reverse_route">Raja vastupidine suund</string>
<string name="gpx_option_destination_point">Kasuta olemasoleva sihtkohta</string>
<string name="gpx_option_from_start_point">Mööda kogu rada</string>
@ -2105,16 +2105,16 @@
<string name="daynight_mode_auto">Päikesetõus/loojang</string>
<string name="daynight_mode_sensor">Valgusandur</string>
<string name="daynight">Päeva/öö režiim</string>
<string name="download_files_question">Laadida alla {0} fail(s) ({1} MB)\?</string>
<string name="download_files_question">Kas laadime alla {0} fail(i) ({1} MB)\?</string>
<string name="items_were_selected">{0} ühik(ut) valitud</string>
<string name="filter_existing_indexes">Alla laetud</string>
<string name="shared_string_download_map">Lae kaart alla</string>
<string name="filter_existing_indexes">Alla laaditud</string>
<string name="shared_string_download_map">Laadi kaart alla</string>
<string name="continuous_rendering">Jätkuv kuvamine</string>
<string name="continuous_rendering_descr">Jätkuv kuvamine pilt-pildi haaval kuvamise asemel.</string>
<string name="rendering_exception">Valitud piirkonna joonistamine ebaõnnestus.</string>
<string name="show_point_options">Kasuta asukohta…</string>
<string name="renderer_load_sucess">Kuvaja laetud</string>
<string name="renderer_load_exception">Kuvaja laadimine ebaõnnestus.</string>
<string name="renderer_load_sucess">Visualiseerija laetud</string>
<string name="renderer_load_exception">Visualiseerija laadimine ebaõnnestus.</string>
<string name="renderers">Vektorkuvaja</string>
<string name="renderers_descr">Vali kuvamise välimus</string>
<string name="poi_context_menu_website">Kuva huvipunkti veebileht</string>
@ -2128,7 +2128,7 @@
<string name="transport_search_again">Lähtesta transpordi otsing</string>
<string name="voice">Salvestatud hääl</string>
<string name="voices">Hääljuhised</string>
<string name="no_vector_map_loaded">Vektorkaarte ei laetud</string>
<string name="no_vector_map_loaded">Vektorkaarte ei laaditud</string>
<string name="error_reading_gpx">GPX andmete laadimine ebaõnnestus.</string>
<string name="vector_data">Võrguühenduseta vektorkaardid</string>
<string name="transport_context_menu">Otsi transporti peatuses</string>
@ -2166,7 +2166,7 @@
<string name="max_level_download_tile_descr">Ära sirvi veebikaartide paane sellest suuremate suumitasemete korral.</string>
<string name="router_service_descr">Veebipõhine või võrguühenduseta navigeerimisteenus.</string>
<string name="update_existing">Asenda</string>
<string name="loading_streets_buildings">Tänavate/hoonete laadimine</string>
<string name="loading_streets_buildings">Laadin tänavaid/hooneid</string>
<string name="use_online_routing">Kasuta veebipõhist navigeerimist</string>
<string name="update_tile">Uuenda kaart</string>
<string name="choose_building">Vali hoone</string>
@ -2219,14 +2219,14 @@
<string name="share_menu_location">Jaga asukohta</string>
<string name="shared_string_send">Saada</string>
<string name="show_on_start_description">\'Väljas\' käivitab kaardi otse.</string>
<string name="map_downloaded">Kaart alla laetud</string>
<string name="map_downloaded">Kaart on allalaaditud</string>
<string name="map_downloaded_descr">%1$s kaart on kasutusvalmis.</string>
<string name="go_to_map">Kuva kaart</string>
<string name="shared_string_qr_code">QR kood</string>
<string name="world_map_download_descr">Maailma aluskaart (katab kogu maailma madalal suurendustasemel) puudub või on aegunud. Palun kaalu selle allalaadimist üldise ülevaate saamiseks.</string>
<string name="world_map_download_descr">Maailma aluskaart (katab kogu maailma madalal suurendustasemel) puudub või on aegunud. Üldise ülevaate saamiseks palun kaalu selle allalaadimist.</string>
<string name="shared_string_about">Rakenduse teave</string>
<string name="osm_edit_created_poi">OSM huvipunkt loodud</string>
<string name="shared_string_upload">Lae üles</string>
<string name="shared_string_upload">Laadi üles</string>
<string name="shared_string_update">Uuenda</string>
<string name="rendering_attr_hideProposed_name">Välja pakutud objektid</string>
<string name="read_more">Loe lisa</string>
@ -2288,7 +2288,7 @@
<string name="impassable_road_desc">Vali teed, mida soovid navigeerimise ajal vältida.</string>
<string name="shared_string_sound">Heli</string>
<string name="select_voice_provider">Vali hääljuhendamine</string>
<string name="select_voice_provider_descr">Vali või lae alla hääljuhendamine omas keeles.</string>
<string name="select_voice_provider_descr">Vali või laadi alla hääljuhendamine omas keeles.</string>
<string name="live_updates">Reaalajas uuendused</string>
<string name="available_maps">Saadaolevad kaardid</string>
<string name="last_update">Viimane uuendus: %s</string>
@ -2309,7 +2309,7 @@
<string name="rendering_attr_hideIcons_name">Huvipunktide ikoonid</string>
<string name="switch_start_finish">Vaheta omavahel lähte- ja sihkoht</string>
<string name="shared_string_select">Vali</string>
<string name="clear_updates_proposition_message">Eemalda alla laetud uuendused ja taasta kaardi algversioon</string>
<string name="clear_updates_proposition_message">Eemalda allalaaditud uuendused ja taasta kaardi algversioon</string>
<string name="add_time_span">Lisa ajavahe</string>
<string name="road_blocked">Tee on kinni</string>
<string name="shared_string_remove">Eemalda</string>
@ -2341,10 +2341,10 @@
<string name="download_files_error_not_enough_space">Pole piisavalt ruumi!
\n{3} MB on vajalik ajutiselt ning {1} MB püsivalt.
\n(Ainult {2} MB saadaval.)</string>
<string name="download_files_question_space_with_temp">Kas laeme alla {0} fail(i)\?
<string name="download_files_question_space_with_temp">Kas laadime alla {0} fail(i)\?
\n{3} MB kasutatakse ajutiselt, {1} MB püsivalt. (Kokku {2} MB-st.)</string>
<string name="upload_osm_note">Lae üles OSM märge</string>
<string name="upload_anonymously">Lae üles anonüümselt</string>
<string name="upload_osm_note">Laadi üles OSM märkus</string>
<string name="upload_anonymously">Laadi üles anonüümselt</string>
<string name="select_map_marker">Vali kaardimarker</string>
<string name="map_markers_other">Teised markerid</string>
<string name="show_transparency_seekbar">Kuva läbipaistev otsinguriba</string>
@ -2407,14 +2407,14 @@
<string name="clear_tile_data">Eemalda kõik paanid</string>
<string name="update_all_maps_now">Uuendada kohe kõik kaardid\?</string>
<string name="search_my_location">Leia minu asukoht</string>
<string name="skip_map_downloading">Jäta kaartide alla laadimine vahele</string>
<string name="skip_map_downloading">Jäta kaartide allalaadimine vahele</string>
<string name="skip_map_downloading_desc">Sul ei ole võrguühenduseta kaarte paigaldatud. Võid valida kaardi nimekirjast või kaardid hiljem alla laadida \'Menüü - %1$s\' kaudu.</string>
<string name="search_another_country">Vali mõni teine piirkond</string>
<string name="search_map">Kaartide otsing…</string>
<string name="first_usage_wizard_desc">Las OsmAnd määrab sinu asukoha ja soovitab selle piirkonna jaoks alla laetavaid kaarte.</string>
<string name="first_usage_wizard_desc">Las OsmAnd määrab sinu asukoha ja soovitab selle piirkonna jaoks alla laaditavaid kaarte.</string>
<string name="location_not_found">Asukohta ei leitud</string>
<string name="no_inet_connection">Internetiühendus puudub</string>
<string name="no_inet_connection_desc_map">Vajalik kaartide alla laadimiseks.</string>
<string name="no_inet_connection_desc_map">Vajalik kaartide allalaadimiseks.</string>
<string name="search_location">Asukoha otsing…</string>
<string name="storage_free_space">Vaba ruum</string>
<string name="storage_place_description">OsmAnd\'i andmekasutus (kaardid, rajafailid, jne.): %1$s.</string>
@ -2423,13 +2423,13 @@
<string name="first_usage_greeting">Hangi juhiseid ja avasta uusi kohti ilma internetiühenduseta</string>
<string name="si_mi_meters">Miilid/meetrid</string>
<string name="get_for">Hangi %1$s ajaks</string>
<string name="osm_live_banner_desc">Hangi piiramatu kaartide alla laadimine, lisades uuendused iga nädal, päev või isegi tund.</string>
<string name="osm_live_banner_desc">Hangi võimalus kaarte piiramatult alla laadida, lisades uuendusi kord nädalas, päevas või isegi iga tund.</string>
<string name="osmand_plus_banner_desc">Piiramatud kaartide allalaadimised, uuendused ja Vikipeedia laiendus.</string>
<string name="get_it">Hangi see</string>
<string name="osm_live_payment_desc">Tellimustasu võetakse valitud ajavahemiku kohaselt. Saad sellest Google Play kaudu igal ajal loobuda.</string>
<string name="donation_to_osm">Annetus OSM kogukonnale</string>
<string name="donation_to_osm_desc">Osa Sinu annetusest saadetakse OSM\'i kaastöötajatele. Tellimuse hind jääb samaks.</string>
<string name="osm_live_subscription_desc">Tellimus võimaldab uuendused igas tunnis, päevas või nädalas ja piiramatu kogu maailma kaartide alla laadimise.</string>
<string name="osm_live_subscription_desc">Tellimus võimaldab uuendusi kord tunnis, päevas või nädalas ja piiramatu arvu terve maailma kaartide allalaadimise.</string>
<string name="si_mi_feet">Miilid/jalad</string>
<string name="driving_region_australia">Austraalia</string>
<string name="lang_kab">Kabiili</string>
@ -2475,10 +2475,10 @@
<string name="gpx_add_track">Lisa veel…</string>
<string name="shared_string_appearance">Välimus</string>
<string name="rendering_value_fine_name">Peen</string>
<string name="upload_poi">Lae üles huvipunkt</string>
<string name="upload_poi">Laadi üles huvipunkt</string>
<string name="search_map_hint">Linn või piirkond</string>
<string name="wiki_around">Lähedalasuvad Vikipeedia artiklid</string>
<string name="upload_osm_note_description">Lae üles oma OSM märge anonüümselt või kasutades oma OpenStreetMap.org profiili.</string>
<string name="upload_osm_note_description">Laadi üles oma OSM märge anonüümselt või kasutades oma OpenStreetMap.org profiili.</string>
<string name="routing_attr_allow_motorway_name">Kasuta kiirteid</string>
<string name="routing_attr_allow_motorway_description">Lubab kiirteed.</string>
<string name="lang_sr_latn">Serbia (ladina)</string>
@ -2544,20 +2544,20 @@
<string name="full_version_thanks">Täname OsmAnd tasulise versiooni ostmise eest.</string>
<string name="parking_options">Parkimisvalikud</string>
<string name="do_not_send_anonymous_app_usage">Ära saada anonüümset rakenduse kasutamise statistikat</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd kogub teavet selle kohta, milliseid rakenduse osi te avate. Teie asukohta ei saadeta kunagi, ega ka midagi, mida rakendusse sisestate ega üksikasju piirkondade kohta, mida vaatate, otsite või alla laete.</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd kogub teavet selle kohta, milliseid rakenduse osi sa avad. Sinu asukohta ei saadeta kunagi, ega ka midagi, mida rakendusse sisestad ega üksikasju piirkondade kohta, mida vaatad, otsid või laadid alla.</string>
<string name="do_not_show_startup_messages">Ära kuva käivitusteateid</string>
<string name="do_not_show_startup_messages_desc">Ära kuva rakenduse allahindlusi ega kohalike sündmuste teateid.</string>
<string name="osmand_extended_description_part2">GPS-navigeerimine
\n • Valige võrguühenduseta (välismaal viibides rändlustasudeta) või võrgus (kiirem) vahel
\n • Hääljuhised pöörangupõhisel suunamisel juhatavad teid mööda teed (salvestatud ja sünteesitud hääled)
\n • Teekond arvutatakse sellest kõrvale kaldudes alati ümber
\n • Teeäärsed juhised, tänavanimed ja eeldatav saabumisaeg on abiks teel olles
\n • Reisi turvalisemaks muutmiseks lülitatakse päeval/öösel ekraani režiim automaatselt ümber
\n • Näidake kiiruspiiranguid ja saate selle ületamise korral meeldetuletusi
\n • Kaardi suurendustaset kohandatakse vastavalt teie kiirusele
\n • Otsige sihtkohti aadressi, liigi (nt parkimine, restoran, hotell, bensiinijaam, muuseum) või geograafiliste koordinaatide järgi
\n • Toetab teekonna vahepunkte
\n • Salvestage oma andmed või laadige üles GPX rada ja liikuge mööda seda
<string name="osmand_extended_description_part2">GPS-navigeerimine
\n • Vali võrguühenduseta (välismaal viibides rändlustasudeta) või võrgus (kiirem) vahel
\n • Hääljuhised pöörangupõhisel suunamisel juhatavad sind mööda teed (salvestatud ja sünteesitud hääled)
\n • Teekond arvutatakse sellest kõrvale kaldudes alati ümber
\n • Teeäärsed juhised, tänavanimed ja eeldatav saabumisaeg on teel olles abiks
\n • Reisi turvalisemaks muutmiseks lülitatakse päeval/öösel ekraani režiim automaatselt ümber
\n • Näitame kiiruspiiranguid ja saad selle ületamise korral meeldetuletusi
\n • Kaardi suurendustaset kohandame vastavalt sinu kiirusele
\n • Otsi sihtkohti aadressi, liigi (nt parkimine, restoran, hotell, bensiinijaam, muuseum) või geograafiliste koordinaatide järgi
\n • Toetab teekonna vahepunkte
\n • Salvesta oma andmed või laadi üles GPX rada ja liigu mööda seda
\n</string>
<string name="osmand_plus_extended_description_part2">Navigeerimine
\n • Töötab võrgus (kiire) või võrguühenduseta (välismaal viibides puuduvad rändlustasud)
@ -2568,14 +2568,14 @@
\n • Otsige kohti aadressi, tüübi (nt restoran, hotell, bensiinijaam, muuseum) või geograafiliste koordinaatide järgi
\n</string>
<string name="analyze_on_map">Analüüsi kaardil</string>
<string name="subscribe_email_desc">Liitu meie meililistiga rakenduse allahindluste kohta teabe saamiseks ja saate veel 3 kaardi allalaadimist!</string>
<string name="subscribe_email_desc">Rakenduse allahindluste kohta teabe saamiseks liitu meie postiloendiga ja saad veel 3 kaardi allalaadimist!</string>
<string name="quick_action_add_destination_desc">Nupp ekraani keskkoha teekonna sihtkohaks muutmiseks; ühest varem valitud sihtkohast saab viimane vahesihtkoht.</string>
<string name="quick_action_replace_destination_desc">Nupp, mille vajutamine muudab ekraani keskkoha uueks teekonna sihtkohaks, asendades eelnevalt valitud sihtkoha (kui olemas).</string>
<string name="quick_action_add_first_intermediate_desc">Nupp ekraani keskkoha esimeseks vahesihtkohaks muutmiseks.</string>
<string name="quick_action_auto_zoom_desc">Nupp, mis lülitab automaatse kiirusetundliku suumimise sisse või välja.</string>
<string name="shared_string_paused">Peatatud</string>
<string name="animate_my_location_desc">Lülita sisse animeeritud oma asukohas kaardi panoraamimine navigeerimise ajal.</string>
<string name="srtm_menu_download_descr">Lae alla \'Kõrgusjoonte\' kaart selles piirkonnas kasutamiseks.</string>
<string name="srtm_menu_download_descr">Selles piirkonnas kasutamiseks laadi alla „Kõrgusjoonte“ kaart.</string>
<string name="srtm_purchase_header">Osta ja paigalda \'Kõrgusjoonte\' lisa astmestatud vertikaalsete alade kuvamiseks.</string>
<string name="quick_action_showhide_osmbugs_descr">Nupp, mis lülitab OSM märkmete kaardil kuvamise sisse või välja.</string>
<string name="private_access_routing_req">Sinu sihtkoht asub eramaal. Luba kasutada erateid sellel teekonnal\?</string>
@ -2585,7 +2585,7 @@
<string name="plugin_mapillary_descr">Tänavataseme fotod kõigile. Avasta kohti, tee kaastööd, jäädvusta maailma.</string>
<string name="improve_coverage_mapillary">Paranda foto katvust Mapillary abil</string>
<string name="mapillary_menu_filter_description">Piltide filtreerimine lähetaja, kuupäeva või liigi alusel. Aktiivne ainult lähivaate suurenduse korral.</string>
<string name="mapillary_menu_descr_tile_cache">Ajakohaste andmete nägemiseks lae paanid uuesti.</string>
<string name="mapillary_menu_descr_tile_cache">Ajakohaste andmete nägemiseks laadi paanid uuesti.</string>
<string name="store_tracks_in_monthly_directories">Salvesta salvestatud rajad kuude kaupa kaustades</string>
<string name="store_tracks_in_monthly_directories_descrp">Salvesta salvestatud rajad salvsetamise kuu kohastes alamkataloogides (näiteks 2018-01).</string>
<string name="average">Keskmine</string>
@ -2680,10 +2680,10 @@
<string name="osmand_srtm_long_description_1000_chars">See lisa pakub nii kõrgusjoonte ülekatte kui ka (reljeefse) künkavarjutuse kihi, mida kuvatakse OsmAnd standardkaartidel. Seda funktsionaalsust hindavad sportlased, matkajad, rändajad ja kõik teised, kes on huvitatud maastiku reljeefstruktuurist.
\n
\nGlobaalsed andmed (vahemikus 70 ° põhja ja 70 ° lõuna) põhinevad mõõtmistel, mille on teinud SRTM (süstiku radari topograafiamissioon) ja ASTER (täiustatud kosmose termilise kiirguse ja peegelduse radiomeeter), NASA maavaatlussatelliitide süsteemi lipulaeva Terra pardal olev pildistamisinstrument. ASTER on NASA, Jaapani majandus-, kaubandus- ja tööstusministeeriumi (METI) ja Jaapani kosmosesüsteemide (J-kosmosesüsteemid) koostöö.</string>
<string name="srtm_plugin_description">See laiendus pakub nii kõrgusjoonte ülekatte kui ka (reljeefse) künkavarjutuse kihi, mida kuvatakse OsmAnd standardkaartidel. Seda funktsionaalsust hindavad sportlased, matkajad, rändajad ja kõik teised, kes on huvitatud maastiku reljeefstruktuurist. (Pange tähele, et kõrgusjoonte ja/või reljeefi andmed on eraldi, pärast laienduse aktiveerimist on saadaval täiendavald alla laetavad failid.)
<string name="srtm_plugin_description">See laiendus pakub nii kõrgusjoonte ülekatte kui ka (reljeefse) künkavarjutuse kihi, mida kuvatakse OsmAnd standardkaartidel. Seda funktsionaalsust hindavad sportlased, matkajad, rändajad ja kõik teised, kes on huvitatud maastiku reljeefstruktuurist. (Pange tähele, et kõrgusjoonte ja/või reljeefi andmed on eraldi, pärast laienduse aktiveerimist on saadaval täiendavad allalaaditavad failid.)
\n
\nGlobaalsed andmed (vahemikus 70 ° põhja ja 70 ° lõuna) põhinevad mõõtmistel, mille on teinud SRTM (süstiku radari topograafiamissioon) ja ASTER (täiustatud kosmose termilise kiirguse ja peegelduse radiomeeter), NASA maavaatlussatelliitide süsteemi lipulaeva Terra pardal olev pildistamisinstrument. ASTER on NASA, Jaapani majandus-, kaubandus- ja tööstusministeeriumi (METI) ja Jaapani kosmosesüsteemide (J-kosmosesüsteemid) koostöö.</string>
<string name="plugin_touringview_descr">Selle vaate aktiveerimine muudab OsmAndi kaardistiili \'Reisivaateks\'. See on reisijatele ja kutselistele autojuhtidele mõeldud eriline kõrglahutusega vaade.
<string name="plugin_touringview_descr">Selle vaate aktiveerimine muudab OsmAndi kaardistiili „Reisivaateks“. See on reisijatele ja kutselistele autojuhtidele mõeldud eriline kõrglahutusega vaade.
\n
\nSee vaade pakub igal kaardi suurendamisel maksimaalse hulga kaardiandmetes saada olevaid reisiandmeid (eriti teed, rajad ja orientatsioonimärgid).
\n
@ -2693,7 +2693,7 @@
\n
\nSpetsiaalset kaardi allalaadimist pole vaja, vaade on loodud meie tavalistest kaartidest.
\n
\nSelle vaate saab tagasi lülitada, aktiveerides selle siin uuesti või muutes vastavalt vajadusele jaotises \'Kaardi seadistamine\' \'Kaardistiil\'.</string>
\nSelle vaate saad tagasi lülitada, aktiveerides selle siin uuesti või muutes vastavalt vajadusele jaotises „Kaardi seadistamine“ „Kaardistiil“.</string>
<string name="plugin_nautical_descr">See lisa rikastab OsmAnd kaardi ja navigatsioonirakendust, et toota ka merekaarte paadisõiduks, purjetamiseks ja muud tüüpi veespordi jaoks.
\n
\nSpetsiaalne OsmAnd kaardi lisamoodul pakub kõiki merenavigatsioonimärke ja kaardisümboleid nii sisemaal kui ka rannikul navigeerimiseks. Iga navigatsioonimärgi kirjeldus sisaldab nende identifitseerimiseks vajalikke üksikasju ja tähendust (kategooria, kuju, värv, järjestus, viide jne).
@ -2732,7 +2732,7 @@
\n * Pikk puudutus punktil kirjelduse vaatamiseks ja lisamiseks.
\n * Puuduta mõõtmisvidinat täpsemate tegevuste nägemiseks.</string>
<string name="use_magnetic_sensor_descr">Kompassi lugemiseks kasuta orientatsioonianduri asemel magnetilist andurit.</string>
<string name="download_using_mobile_internet">WiFi ühendus puudub. Kas kasutada allalaadimiseks praegust internetiühendust\?</string>
<string name="download_using_mobile_internet">WiFi ühendus puudub. Kas kasutame allalaadimiseks praegust internetiühendust\?</string>
<string name="osmand_background_plugin_description">Kuvab taustajälgimise ja navigeerimise sisselülitamise sätteid GPS-seadet perioodiliselt äratades (välja lülitatud ekraaniga).</string>
<string name="clear_dest_confirm">Oled kindel, et soovid sihtkoha (ja vahepealsed sihtkohad) tühjendada\?</string>
<string name="dropbox_plugin_description">Sünkrooni salvestatud radasid ja heli- või videomärkmeid oma Dropboxi kontole.</string>
@ -2756,45 +2756,45 @@
<string name="rendering_attr_appMode_description">Optimeeri kaarti</string>
<string name="rendering_attr_contourLines_description">Kuva alates suurendustasemest (vajab kõrgusandmeid):</string>
<string name="local_index_description">Täpsema teabe saamiseks puuduta mõnda olemasolevat üksust, mitteaktiveerimiseks või kustutamiseks puuduta pikalt. Seadme praegused andmed (%1$s vaba):</string>
<string name="first_time_msg">Täname OsmAnd kasutamise eest. Lae piirkondlikud andmed võrguühenduseta kasutamiseks alla menüüst \'Seaded\' → \'Halda kaardifaile\', et vaadata kaarte, otsida aadresse, leida huvipunkte, ühistransporti ja palju muud.</string>
<string name="first_time_msg">Täname OsmAnd kasutamise eest. Laadi piirkondlikud andmed võrguühenduseta kasutamiseks alla menüüst „Seaded“ → „Halda kaardifaile“, et vaadata kaarte, otsida aadresse, leida huvipunkte, ühistransporti ja palju muud.</string>
<string name="local_indexes_cat_tile">Veebis ja vahemällu salvestatud paanikaardid</string>
<string name="index_settings_descr">Lae alla ja halda oma seadmesse salvestatud võrguühenduseta kaardifaile.</string>
<string name="index_settings_descr">Laadi alla ja halda oma seadmesse salvestatud võrguühenduseta kaardifaile.</string>
<string name="map_online_data">Veebipõhised ja paanikaardid</string>
<string name="prefs_plugins_descr">Lisad aktiveerivad täpsemad sätted ja täiendavad funktsioonid.</string>
<string name="vector_maps_may_display_faster_on_some_devices">Vektorkaardid kuvatakse tõenäoliselt kiiremini. Mõne seadme puhul ei pruugi see hästi töötada.</string>
<string name="play_commands_of_currently_selected_voice">Vali hääl ja proovi esitades teateid:</string>
<string name="native_rendering">Sisseehitatud renderdamine</string>
<string name="test_voice_prompts">Testi hääljuhiseid</string>
<string name="switch_to_raster_map_to_see">Lae selle asukoha jaoks võrguühenduseta vektorkaart alla menüüst \'Seaded\' (\'Halda kaardifaile\') või lülitu ümber \'Veebikaardid\' lisale.</string>
<string name="switch_to_raster_map_to_see">Laadi selle asukoha jaoks võrguühenduseta vektorkaart alla menüüst „Seaded“ („Halda kaardifaile“) või lülitu ümber „Veebikaardid“ lisamoodulile.</string>
<string name="validate_gpx_upload_name_pwd">GPX failide üleslaadimiseks täpsusta palun oma OSM kasutajanimi ja salasõna.</string>
<string name="zoom_by_trackball_descr">Muuda kaardi suurendustaset juhtkuuli horisontaalse liigutusega.</string>
<string name="zoom_by_trackball">Kasuta juhtkuuli suurendustaseme juhtimiseks</string>
<string name="rendering_out_of_memory">Valitud ala kuvamiseks pole piisavalt protsessimälu</string>
<string name="update_poi_does_not_change_indexes">Rakendusesisesed huvipunktide muudatused ei mõjuta alla laetud kaardifaile, muudatused salvestatakse failina seadmesse.</string>
<string name="update_poi_does_not_change_indexes">Rakendusesisesed huvipunktide muudatused ei mõjuta allalaaditud kaardifaile, muudatused salvestatakse failina seadmesse.</string>
<string name="local_openstreetmap_settings_descr">Kuva ja halda seadme andmebaasis märgitud OSM huvipunkte ja märkmeid.</string>
<string name="live_monitoring_url_descr">Täpsusta veebiaadress parameetrite süntaksiga: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}.</string>
<string name="gpx_monitoring_disabled_warn">Logi rada kasutades GPX vidinat või \'Reisi salvestamise\' sätteid.</string>
<string name="fav_export_confirmation">Varem eksporditud lemmikuid sisaldav fail on juba olemas. Asendada see\?</string>
<string name="download_files_not_enough_space">Pole piisavalt vaba ruumi %1$s MB alla laadimiseks (vaba: %2$s).</string>
<string name="download_files_not_enough_space">Pole piisavalt vaba ruumi %1$s MB allalaadimiseks (vaba: %2$s).</string>
<string name="native_library_not_supported">See seade ei toeta süsteemi teeki.</string>
<string name="init_native_library">Süsteemi teegi lähtestamine…</string>
<string name="pref_vector_rendering">Vektorite renderdamise valikud</string>
<string name="poi_query_by_name_matches_categories">Leiti mitu seotud huvipunktide kategooriat.</string>
<string name="data_to_search_poi_not_available">Huvipunktide otsimiseks lae alla võrguühenduseta andmed.</string>
<string name="data_to_search_poi_not_available">Huvipunktide otsimiseks laadi alla võrguühenduseta andmed.</string>
<string name="old_poi_file_should_be_deleted">Huvipunktide andmefail \'%1$s\' on üleliigne ja selle võib kustutada.</string>
<string name="update_poi_file_not_found">Kohalikku faili huvipunktide muudatuste säilitamiseks ei leitud ega saanud ka luua.</string>
<string name="map_version_changed_info">Uute kaardifailide kasutamiseks lae alla rakenduse uus versioon.</string>
<string name="local_index_upload_gpx_description">Lae GPX failid üles OSM kogukonda, parandades seeläbi kaarte.</string>
<string name="map_version_changed_info">Uute kaardifailide kasutamiseks laadi alla rakenduse uus versioon.</string>
<string name="local_index_upload_gpx_description">Laadi GPX failid üles OSM kogukonda, parandades seeläbi kaarte.</string>
<string name="show_more_map_detail_descr">Kuva mõningaid vektorkaardi detaile (teed jne) juba madalamatel suurendustasemetel.</string>
<string name="favorite_delete_multiple">Oled kindel, et soovid kustutada %1$d lemmikut ja %2$d lemmikute gruppi\?</string>
<string name="basemap_missing">Lae alla maailma põhikaart, et saada ülevaade kogu maailmast ka madalamatel suurendustasemetel.</string>
<string name="vector_data_missing">Lae alla (\'võrguühenduseta\') andmed kaartide võrguühenduseta kasutamiseks.</string>
<string name="basemap_missing">Saamaks ülevaade kogu maailmast ka madalamatel suurendustasemetel, laadi alla maailma põhikaart.</string>
<string name="vector_data_missing">Laadi alla andmed kaartide võrguühenduseta kasutamiseks.</string>
<string name="local_index_no_items_to_do">Puuduvad üksused %1$s</string>
<string name="tts_language_not_supported">Paigaldatud Android TTS (kõnesünteesi) mootor ei toeta valitud keelt, selle asemel kasutatakse selle eelhäälestatud TTS keelt. Kas otsida turult teist TTS-mootorit\?</string>
<string name="switch_to_vector_map_to_see">Selle asukoha jaoks on olemas võrguühenduseta vektorkaart.
\n
\nKasutamiseks aktiveeri menüü \'Menüü\' → \'Seadista kaart\' → \'Kaardiallikas…\' → \'Võrguühenduseta vektorkaardid\'.</string>
<string name="warning_tile_layer_not_downloadable">Rakendus ei suuda alla laadida kaardikihti %1$s, uuesti paigaldamine võib aidata.</string>
<string name="warning_tile_layer_not_downloadable">Rakendus ei suuda alla laadida kaardikihti %1$s, selle uuesti paigaldamine võib aidata.</string>
<string name="internet_not_available">Tegevust ei saa sooritada ilma internetiühenduseta.</string>
<string name="level_to_switch_vector_raster_descr">Kasuta rasterkaarte kõigeks seda taset ületavaks.</string>
<string name="level_to_switch_vector_raster">Vähim vektori suurendustase</string>
@ -2806,16 +2806,16 @@
\n
\nNavigeerimine lülitati ajutiselt ümber CloudMade võrguteenusele.</string>
<string name="osmand_net_previously_installed">Uues rakenduses toetatakse kõiki vanas paigaldatud rakenduses olevaid võrguühenduseta andmeid, kuid lemmikpunktid tuleb vanast rakendusest eksportida ja seejärel uues importida.</string>
<string name="voice_is_not_available_msg">Hääljuhiseid ei ole saadaval, mine menüüsse \'Seaded\' → \'Navigeerimise seaded\', vali profiil → \'Hääljuhised\' ja vali või lae alla hääljuhiste pakett.</string>
<string name="voice_is_not_available_msg">Hääljuhiseid ei ole saadaval, mine menüüsse „Seaded“ → „Navigeerimise seaded“, vali profiil → „Hääljuhised“ ja vali või laadi alla hääljuhiste pakett.</string>
<string name="daynight_descr">Reguleeri öö- ja päevarežiimi vahetamist.</string>
<string name="fast_route_mode_descr">Luba, et arvutada kiireim teekond või keela kütusesäästliku teekonna jaoks.</string>
<string name="tiles_to_download_estimated_size">Suurendustasemel {0} lae alla {1} paani ({2} MB)</string>
<string name="select_max_zoom_preload_area">Maksimaalne eellaetav suurendustase</string>
<string name="maps_could_not_be_downloaded">Seda kaarti ei saa alla laadida</string>
<string name="tiles_to_download_estimated_size">Suurendustasemel {0} laadi alla {1} paani ({2} MB)</string>
<string name="select_max_zoom_preload_area">Maksimaalne eellaaditav suurendustase</string>
<string name="maps_could_not_be_downloaded">Seda kaarti ei õnnestunud alla laadida</string>
<string name="gpx_files_not_found">Radade kaustast ei leitud ühtegi GPX faili</string>
<string name="import_file_favourites">Salvestada andmed GPX failina või importida teekonnapunktid \'Lemmikud\' hulka\?</string>
<string name="fav_file_to_load_not_found">Lemmikuid sisaldavat GPX faili ei leitud asukohast {0}</string>
<string name="none_region_found">Mälukaardilt ei leitud ühtegi alla laetud kaarti.</string>
<string name="none_region_found">Mälukaardilt ei leitud ühtegi allalaaditud kaarti.</string>
<string name="thanks_yandex_traffic">Aitäh Yandexile liiklusinfo eest.</string>
<string name="use_trackball_descr">Kasuta juhtpalli kaardi liigutamiseks.</string>
<string name="use_trackball">Kasuta juhtrullikut</string>
@ -2844,11 +2844,11 @@
<string name="sd_unmounted">Mälukaardile pole juurdepääsu.
\nSa ei näe kaarte ega leia asju.</string>
<string name="sd_mounted_ro">Mälukaart on kirjutuskaitstud.
\nNüüd on võimalik vaadata ainult eellaetud kaarti, mitte uusi alasid alla laadida.</string>
\nNüüd on võimalik vaadata ainult eellaaditud kaarti, mitte uusi alasid alla laadida.</string>
<string name="unzipping_file">Faili lahti pakkimine…</string>
<string name="route_head">Suundu</string>
<string name="first_time_continue">Hiljem</string>
<string name="first_time_download">Lae alla piirkondi</string>
<string name="first_time_download">Laadi alla piirkondi</string>
<string name="search_poi_location">Signaali ootel…</string>
<string name="search_near_map">Otsi praeguse kaardi keskkoha lähedusest</string>
<string name="search_nearby">Otsi lähedusest</string>
@ -2872,7 +2872,7 @@
<string name="show_transport_over_map_description">Kuva ühistranspordi peatused kaardil.</string>
<string name="show_transport_over_map">Kuva ühistranspordi peatused</string>
<string name="hello">OsmAnd navigeerimisrakendus</string>
<string name="update_poi_success">Huvipunktide andmed uuendatud (laeti {0})</string>
<string name="update_poi_success">Huvipunktide andmed uuendatud (laaditi {0})</string>
<string name="update_poi_error_local">Kohalike huvipunktide loetelu uuendamine ebaõnnestus.</string>
<string name="update_poi_is_not_available_for_zoom">Kaardi suurendamine võimaldab huvipunkte uuendada</string>
<string name="search_history_city">Linn: {0}</string>
@ -2880,17 +2880,17 @@
<string name="search_history_int_streets">Ristmik: {0} x {1} kohas {2}</string>
<string name="favorite">Lemmik</string>
<string name="uploading_data">Andmete üleslaadimine…</string>
<string name="uploading">Üleslaadimine</string>
<string name="uploading">Laadin üles</string>
<string name="search_nothing_found">Midagi ei leitud</string>
<string name="searching">Otsimine…</string>
<string name="searching_address">Aadressi otsimine…</string>
<string name="search_offline_address">Võrguühenduseta otsing</string>
<string name="route_general_information">Vahemaa kokku %1$s, sõiduaeg %2$d h %3$d min.</string>
<string name="sd_dir_not_accessible">Mälukaardil olevale andmesalvestuskaustale pole juurdepääsu!</string>
<string name="download_question">Laadida alla {0} - {1} \?</string>
<string name="download_question">Kas laadime alla {0} - {1} \?</string>
<string name="download_question_exist">Võrguühenduseta andmed {0} on juba olemas ({1}). Värskendada see ({2})\?</string>
<string name="address">Aadress</string>
<string name="downloading_list_indexes">Saadaolevate piirkondade loetelu allalaadimine</string>
<string name="downloading_list_indexes">Laadin alla saadaolevate piirkondade loetelu</string>
<string name="list_index_files_was_not_loaded">Piirkondade loendit ei õnnestunud hankida aadressilt https://osmand.net.</string>
<string name="fav_points_edited">Lemmikpunkti muudeti</string>
<string name="fav_points_not_exist">Lemmikpunkte pole</string>
@ -2901,28 +2901,28 @@
<string name="opening_changeset">Muudatuste komplekti avamine…</string>
<string name="closing_changeset">Muudatuste komplekti sulgemine…</string>
<string name="commiting_node">Sõlme kinnitamine…</string>
<string name="loading_poi_obj">HP laadimine</string>
<string name="loading_poi_obj">Laadin HP</string>
<string name="auth_failed">Autoriseerimine ebaõnnestus</string>
<string name="failed_op">ebaõnnestus</string>
<string name="converting_names">Kohalike/ingliskeelsete nimede teisendamine…</string>
<string name="loading_postcodes">Postiindeksite laadimine</string>
<string name="loading_streets">Tänavate laadimine</string>
<string name="loading_cities">Linnade laadimine</string>
<string name="loading_postcodes">Laadin postiindekseid</string>
<string name="loading_streets">Laadin tänavaid</string>
<string name="loading_cities">Laadin linnasid</string>
<string name="poi">HP</string>
<string name="error_occurred_saving_gpx">GPX faili salvestamine ebaõnnestus.</string>
<string name="arrived_at_destination">Oled kohale jõudnud.</string>
<string name="invalid_locations">Vigased koordinaadid</string>
<string name="go_back_to_osmand">Tagasi kaardile</string>
<string name="loading_data">Andmete laadimine</string>
<string name="loading_data">Laadin andmeid</string>
<string name="reading_indexes">Kohalike andmete lugemine…</string>
<string name="previous_run_crashed">OsmAnd jooksis viimasel kasutamisel kokku. Logifail asub {0}. Palun teata probleemist ja edasta logifail.</string>
<string name="saving_gpx_tracks">GPX faili salvestamine…</string>
<string name="finished_task">Valmis</string>
<string name="osm_settings_descr">Määra OSM kaastööks vajalikud OpenStreetMap.org (OSM) sätted.</string>
<string name="data_settings_descr">Määra keel, lae alla või lae andmed uuesti.</string>
<string name="data_settings_descr">Määra keel, laadi alla või laadi andmed uuesti.</string>
<string name="data_settings">Andmed</string>
<string name="additional_settings">Lisaseadistused</string>
<string name="reload_tile">Lae paan uuesti</string>
<string name="reload_tile">Laadi paan uuesti</string>
<string name="mark_point">Sihtmärk</string>
<string name="use_english_names_descr">Valige kohalike ja ingliskeelsete nimede vahel.</string>
<string name="use_english_names">Kasuta kaartidel ingliskeelseid nimesid</string>
@ -2941,7 +2941,7 @@
<string name="use_internet">Kasuta internetti</string>
<string name="show_location">Kuva oma asukoht</string>
<string name="show_gps_coordinates_text">Kuva kaardil GPS koordinaadid</string>
<string name="use_internet_to_download_tile">Lae alla puuduvad kaardipaanid</string>
<string name="use_internet_to_download_tile">Laadi alla puuduvad kaardipaanid</string>
<string name="app_description">Navigeerimisrakendus</string>
<string name="search_button">Otsi</string>
<string name="search_activity">Otsi</string>
@ -2984,7 +2984,7 @@
<string name="poi_action_succeded_template">Tegevus {0} lõpetatud.</string>
<string name="poi_error_unexpected_template">Tegevust {0} ei saanud sooritada.</string>
<string name="poi_error_io_error_template">I/O tõrge tegevuse {0} sooritamisel.</string>
<string name="poi_error_info_not_loaded">Sõlme teavet ei laetud</string>
<string name="poi_error_info_not_loaded">Sõlme teavet ei laaditud</string>
<string name="poi_dialog_opening_hours">Avatud</string>
<string name="poi_dialog_comment">Kommentaar</string>
<string name="poi_dialog_comment_default">Huvipunkti muutmine</string>
@ -3018,7 +3018,7 @@
<string name="user_hates_app_get_feedback_long">Palun anna meile teada kõigist ettepanekutest.</string>
<string name="failed_to_upload">Ei saanud üles laadida</string>
<string name="delete_change">Kustuta muudatus</string>
<string name="successfully_uploaded_pattern">Üles laetud {0}/{1}</string>
<string name="successfully_uploaded_pattern">Üles laaditud {0}/{1}</string>
<string name="try_again">Proovi uuesti</string>
<string name="error_message_pattern">Viga: {0}</string>
<string name="dahboard_options_dialog_title">Seadista armatuurlaud</string>
@ -3059,7 +3059,7 @@
<string name="downloads">Allalaadimised</string>
<string name="confirm_download_roadmaps">Ainult maanteede kaarti pole vaja, sest sul on tavaline (täielik) kaart. Kas soovid selle ikkagi alla laadida\?</string>
<string name="file_size_in_mb">%.1f MB</string>
<string name="free_downloads_used">Tasuta allalaadimised ära kasutatud</string>
<string name="free_downloads_used">Tasuta allalaadimised on ära kasutatud</string>
<string name="free_downloads_used_description">Kuvab järelejäänud tasuta allalaadimiste arvu.</string>
<string name="application_dir_description">Vali, kuhu soovid kaarte ja muid andmefaile salvestada.</string>
<string name="enter_country_name">Sisesta riigi nimi</string>
@ -3091,7 +3091,7 @@
<string name="use_dashboard_btn">Kasuta armatuurlauda</string>
<string name="use_drawer_btn">Kasuta menüüd</string>
<string name="value_downloaded_of_max">%1$.1f / %2$.1f MB</string>
<string name="only_download_over_wifi">Lae alla ainult WiFi kaudu</string>
<string name="only_download_over_wifi">Laadi alla ainult WiFi kaudu</string>
<string name="missing_write_external_storage_permission">OsmAndil puudub mälukaardi kasutamise luba</string>
<string name="last_map_change">Viimane kaardimuudatus: %s</string>
<string name="hourly">Iga tund</string>
@ -3204,12 +3204,12 @@
\n • Vikipeedia sinu eelistatud keeles võib sulle linnaekskursiooni ajal palju öelda
\n • Ühistranspordipeatused (buss, tramm, rong) koos liinide nimedega aitavad uues linnas navigeerida
\n • Jalakäijate režiimis GPS navigeerimine loob sulle marsruudi kõnniteede abil
\n • Lae üles GPX marsruut ja järgi seda või registreeri ja jaga enda oma
\n • Laadi üles GPX marsruut ja järgi seda või salvesta ja jaga enda oma
\n</string>
<string name="osmand_extended_description_part7">Panusta OSM kvaliteeti
\n Andmevigadest teatamine
\n • Lae GPX rajad OSM keskkonda üles otse rakendusest
\n • Lisa huvipunkte ja lae need kohe üles OSM keskkonda (või hiljem internetühenduse tekkides)
\n Teata andmevigadest
\n • Laadi GPX rajad OSM keskkonda üles otse rakendusest
\n • Lisa huvipunkte ja laadi need kohe üles OSM keskkonda (või hiljem internetühenduse tekkides)
\n</string>
<string name="osmand_extended_description_part8">OsmAnd on aktiivselt arendatud avatud lähtekoodiga tarkvara. Kõik saavad rakendusse panustada, teatades vigadest, parandades tõlkeid või luues uut funktsioonaalsust. Lisaks kasutab projekt rahalisele toetuset programmerimiseks ja uute funktsioonide testimiseks.
\n Ligikaudne kaardi leviala ja kvaliteet:
@ -3261,11 +3261,11 @@
\n • Valikuline kiiruse ja kõrguse kuvamine
\n • Kõrgusjoonte ja künkavarjutuse kuvamine (täiendava lisa abil)</string>
<string name="osmand_plus_extended_description_part7">Tee otse OSM kaastööd
\n Andmevigadest teatamine
\n • Lae GPX radu OSM keskkonda otse rakendusest
\n • Lisa huvipunkte ja lae need kohe üles OSM keskkonda (või hiljem internetiühenduse tekkimisel)
\n Valikuline reisi salvestamine ka taustrežiimis (kui seade on puhkeolekus)
\n OsmAnd on aktiivselt arendatud avatud lähtekoodiga tarkvara. Kõik saavad rakendusse panustada, teatades vigadest, parandades tõlkeid või kodeerides uusi funktsioone. Lisaks toetub projekt rahalisele toetusele koodide kodeerimiseks ja uute funktsioonide testimiseks.
\n Teata andmevigadest
\n • Laadi GPX radu OSM keskkonda otse rakendusest
\n • Lisa huvipunkte ja laadi need kohe üles OSM keskkonda (või hiljem internetiühenduse tekkimisel)
\n Kui soovid, siis salvesta teekonda ka taustrežiimis (kui seade on puhkeolekus)
\n OsmAnd on aktiivselt arendatud avatud lähtekoodiga tarkvara. Kõik saavad rakendusse panustada, teatades vigadest, parandades tõlkeid või kodeerides uusi funktsioone. Lisaks toetub projekt rahalisele toetusele nii programmeerimiseks kui ka uue funktsionaalsuse testimiseks.
\n</string>
<string name="osmand_plus_extended_description_part8">Ligikaudne kaardi leviala ja kvaliteet:
\n • Lääne-Euroopa: ****
@ -3278,7 +3278,7 @@
\n • Lähis-Ida: **
\n • Aafrika: **
\n • Antarktika: *
\n Enamike riikide andmed üle maailma on saadaval allalaadimiseks
\n Enamike riikide andmed üle maailma on allalaadimiseks saadaval
\n Afganistanist Zimbabweni, Austraaliast Ameerika Ühendriikideni. Argentina, Brasiilia, Kanada, Prantsusmaa, Saksamaa, Mehhiko, Suurbritannia, Hispaania, …
\n</string>
<string name="save_poi_too_many_uppercase">Nimi sisaldab liiga palju suurtähti. Jätkata\?</string>
@ -3302,8 +3302,8 @@
<string name="toast_empty_name_error">Nimetu asukoht</string>
<string name="tunnel_warning">Tunnel ees</string>
<string name="show_tunnels">Tunnelid</string>
<string name="download_wikipedia_description">Lae alla Vikipeedia artiklid %1$s kohta ilma võrguühenduseta lugemiseks.</string>
<string name="download_wikipedia_label">Lae alla Vikipeedia andmed</string>
<string name="download_wikipedia_description">Laadi alla Vikipeedia artiklid %1$s kohta ilma võrguühenduseta lugemiseks.</string>
<string name="download_wikipedia_label">Laadi alla Vikipeedia andmed</string>
<string name="open_in_browser_wiki_description">Vaata artiklit veebilehitsejas.</string>
<string name="download_wiki_region_placeholder">see piirkond</string>
<string name="wiki_article_search_text">Vastava viki artikli otsing</string>
@ -3358,9 +3358,9 @@
<string name="route_recalculation">Teekonna ümberarvutamine</string>
<string name="accessibility_announce">Teata</string>
<string name="login_and_pass">Kasutajanimi ja salasõna</string>
<string name="plugin_global_prefs_info">Need seaded on üldised ja rakenduvad kõikidele profiilidele</string>
<string name="plugin_global_prefs_info">Need pistikprogrammi seaded on üldised ja rakenduvad kõikidele profiilidele</string>
<string name="osm_editing">OSM\'i andmete muutmine</string>
<string name="osm_edits_view_descr">Kõiki üleslaadimata muudatusi või OSM vigu saad vaadata menüüs %1$s. Üleslaaditud punkte OsmAnd ei kuva.</string>
<string name="osm_edits_view_descr">Vaata kõiki üleslaadimata muudatusi või OSM vigu saad menüüs %1$s. Juba üleslaaditud muudatusi OsmAnd ei kuva.</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Ikooni kuvatakse vaid navigeerimise või liikumise ajal.</string>
<string name="select_map_icon_descr">Peatumisel näidatav ikoon.</string>
@ -3420,7 +3420,7 @@
<string name="hillshade_description">Kõrgusreljeefi kaart tumedate varjunditega nõlvade, tippude ja tasandike kirjeldamiseks.</string>
<string name="slope_description">Raja nõlva kallet visualiseeritakse värvidega.</string>
<string name="terrain_slider_description">Määra vähima ja suurima suurenduse kaardikihi kuvamisel.</string>
<string name="hillshade_download_description">Kõrgusreljeefi kuvamiseks on vaja täiendavaid kaarte.</string>
<string name="hillshade_download_description">Mäevarjude kaardil vaatamiseks on vaja täiendavaid kaarte.</string>
<string name="slope_download_description">Nõlvade kuvamiseks on vaja täiendavaid kaarte.</string>
<string name="slope_read_more">Nõlvadest saab rohkem lugeda %1$s-s.</string>
<string name="shared_string_transparency">Läbipaistvus</string>
@ -3556,8 +3556,8 @@
<string name="use_volume_buttons_as_zoom_descr">Nutiseadme helitugevuse nuppudega kontrollida saad kaardi suumi taset.</string>
<string name="use_volume_buttons_as_zoom">Helitugevuse nupud toimivad suumina</string>
<string name="please_provide_point_name_error">Palun sisestage punkti nimi</string>
<string name="search_download_wikipedia_maps">Lae alla Vikipeedia kaardid</string>
<string name="plugin_wikipedia_description">Hangi huviväärsuste kohta teavet Vikipeediast. See on sinu võrguühenduseta reisiraamat - lihtsalt võta kasutusele Vikipeedia lisaprogramm ja loe artikleid enda ümber asuvate objektide kohta.</string>
<string name="search_download_wikipedia_maps">Laadi alla Vikipeedia kaardid</string>
<string name="plugin_wikipedia_description">Hankige teavet huvipunktide kohta Wikipediast, taskukohasest võrguühenduseta juhendist, mis sisaldab artikleid kohtade ja sihtkohtade kohta.</string>
<string name="add_hidden_group_info">Kuna valitud grupp on peidetud, siis lisatud punkt ei ole kaardil nähtav. Vajadusel leiad ta „%s“ alt.</string>
<string name="app_mode_go_cart">Kartauto</string>
<string name="parking_positions">Parkimiskohad</string>
@ -3574,7 +3574,7 @@
<string name="turn_screen_on_power_button">Toitenupp</string>
<string name="shared_string_uninstall">Eemalda</string>
<string name="extra_maps_menu_group">Täiendavad kaardid</string>
<string name="tiles_storage_descr">Vali kuidas sa soovid allalaetud paane salvestada.</string>
<string name="tiles_storage_descr">Vali kuidas sa soovid allalaaditud paane salvestada.</string>
<string name="mapillary_item">OsmAnd ja Mapillary</string>
<string name="quick_action_item">Kiirtegevus</string>
<string name="radius_ruler_item">Raadiuse joonlaud</string>
@ -3646,14 +3646,14 @@
<string name="navigation_profile">Navigeerimisprofiil</string>
<string name="route_between_points_add_track_desc">Vali rajafail, millele lisame uue segmendi.</string>
<string name="street_level_imagery">Tänavataseme vaated</string>
<string name="plan_route_exit_dialog_descr">Kas sa oled kindel et soovid sulgeda teekonna planeerija ilma seda salvestamata\?</string>
<string name="plan_route_exit_dialog_descr">Kas oled kindel, et soovid loobuda kõikidest tehtud muudatustest planeeritud teekonnal\?</string>
<string name="in_case_of_reverse_direction">Vastupidise suuna korral</string>
<string name="reorder_or_hide_from">Muuda järjekorda või peida kirjed %1$s\'st.</string>
<string name="hidden_items_descr">Need kirjed on menüüs peidetuna, kuid tehtud valikud või lisaprogrammid on jätkuvalt kasutatavad.</string>
<string name="move_inside_category">Sa võid kirjeid liigutada vaid selle kategooria piires.</string>
<string name="shared_string_items">Kirjed</string>
<string name="reset_deafult_order">Taasta kirjete vaikimisi järjekord</string>
<string name="expire_time_descr">Puhverdatud paanid laetakse uuesti alla peale nimetatud minutite möödumist. Kui sa ei soovi uuendamist, siis jäta väli tühjaks.
<string name="expire_time_descr">Puhverdatud paanid laaaditakse uuesti alla peale nimetatud minutite möödumist. Kui sa ei soovi uuendamist, siis jäta väli tühjaks.
\n
\nÜks päev on 1440 minutit.
\nÜks nädal on 10080 minutit.
@ -3695,7 +3695,7 @@
<string name="simplified_track_description">Salvestatakse ainult üldine marsruut, teekonnapunktid kustutatakse.</string>
<string name="shared_string_file_name">Faili nimi</string>
<string name="number_of_gpx_files_selected_pattern">%s rajafaili valitud</string>
<string name="disable_recording_once_app_killed_descrp">Peatab raja logimise rakenduse jõuga sulgemise korral (hiljutiste rakenduste kaudu). (OsmAndi taustnäit kaob Androidi teavitusribalt.)</string>
<string name="disable_recording_once_app_killed_descrp">Raja logimine peatub, kui rakendus tapetakse (viimaste rakenduste kaudu). (OsmAnd-i tausttähis kaob Androidi teateribalt.)</string>
<string name="save_global_track_interval_descr">Määra üldisel raja salvestamisel kasutatav logimisvälp (lülitatakse sisse kaardil asuvast teekonna salvestamise vidinast).</string>
<string name="system_default_theme">Süsteemi vaikeseadistused</string>
<string name="all_next_segments">Kõik järgnevad segmendid</string>
@ -3721,7 +3721,7 @@
\nValides %1$s sa saad kiiruskaamerate-kohaseid teateid ja hoiatusi.
\n
\nValides %2$s kustutatakse kõik kiiruskaameratega seotud andmed, nagu hoiatused, teated ja huvipunktid seniks, kuni sa OsmAnd\'ile ei tee täiesti uut paigaldust.</string>
<string name="quick_action_remove_next_destination_descr">Praegune teekonna vahepunkt saab kustutatud. Kui ta osutub sihtkohaks, siis navigatsioon lõppeb.</string>
<string name="quick_action_remove_next_destination_descr">Kustutab järgmise marsruudi sihtkoha. Kui see on lõppsihtkoht, siis navigeerimine peatub.</string>
<string name="plan_route_change_route_type_after">Muuda teekonna tüüpi pärast</string>
<string name="plan_route_change_route_type_before">Muuda teekonna tüüpi enne</string>
<string name="plan_route_trim_after">Kärbi pärast</string>
@ -3767,12 +3767,12 @@
<string name="routing_attr_avoid_footways_description">Väldi jalgteid</string>
<string name="routing_attr_avoid_footways_name">Väldi jalgteid</string>
<string name="contour_lines_thanks">Täname „Kõrgusjoonte“ ostu eest</string>
<string name="osm_live_payment_subscription_management_hw">Ostukinnituse saabumisel arveldame tellimuse eest sinu AppGallery konto alusel.
<string name="osm_live_payment_subscription_management_hw">Teie AppGallery konto eest võetakse tasu ostu kinnitamisel.
\n
\nKui sa ei tühista tellimust enne uue perioodi algust, siis tellimus pikeneb automaatselt ning arveldame järgmise ajavahemiku eest (kuu/kvartal/aasta) selle alguses.
\nTellimus pikeneb automaatselt, kui seda ei tühistata enne uuendamise kuupäeva. Teie kontolt võetakse pikendamisperioodi (kuu / kolm kuud / aasta) eest tasu ainult pikendamise kuupäeval.
\n
\nTellimust saad hallata ja tühistada AppGallery seadistustest.</string>
<string name="osm_live_payment_desc_hw">Arveldame tellimuse eest valitud ajavahemiku alusel. Seda saad sa vabalt valitud ajal tühistada AppGallery\'s.</string>
\nTellimusi saate hallata ja tühistada oma AppGallery seadetes.</string>
<string name="osm_live_payment_desc_hw">Tellimuse eest võetakse tasu valitud perioodi kohta. Tühistage see igal ajal oma AppGallery\'s.</string>
<string name="use_complex_routing">Keeruka teekonna koostamine</string>
<string name="osm_edit_logout_success">Väljalogitud</string>
<string name="development">Arendus</string>
@ -3798,11 +3798,11 @@
<string name="mgrs_format_descr">OsmAnd kasutab MGRS-vormingut, mis on sarnane NATO UTM-vormingule.</string>
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="navigate_point_mgrs">MGRS</string>
<string name="message_you_need_add_two_points_to_show_graphs">Graafiku joonistamiseks peaksid lisama vähemalt kaks punkti</string>
<string name="message_you_need_add_two_points_to_show_graphs">Lisa vähemalt kaks punkti</string>
<string name="subscription_on_hold_title">OsmAnd Live tellimus on ootel</string>
<string name="subscription_paused_title">OsmAnd Live tellimus on peatatud</string>
<string name="subscription_expired_title">OsmAnd Live tellimus on aegunud</string>
<string name="subscription_payment_issue_title">Sinu tellimusega on üks pisikene segadus. Selleks et Google Play seadistuses makseviisi parandada, palun klõpsi seda nuppu.</string>
<string name="subscription_payment_issue_title">Tellimuse parandamiseks puudutage nuppu Google Play makseviisi seadistamiseks.</string>
<string name="manage_subscription">Halda tellimusi</string>
<string name="sign_in_with_open_street_map">Logi sisse OpenStreetMapi kasutajakontoga</string>
<string name="user_login">Kasutajanimi</string>
@ -3818,7 +3818,7 @@
<string name="shared_string_add_photo">Lisa foto</string>
<string name="register_on_openplacereviews">Registreeru
\nOpenPlaceReviews.org saidis</string>
<string name="register_on_openplacereviews_desc">Fotode allikaks on OpenPlaceReviews.org veebisait. Oma fotode üleslaadimiseks peaksid liituma selle veebisaidi kasutajaks.</string>
<string name="register_on_openplacereviews_desc">Fotode allikaks on avatud andmetel põhinev OpenPlaceReviews.org veebisait. Oma fotode üleslaadimiseks peaksid liituma selle veebisaidi kasutajaks.</string>
<string name="register_opr_create_new_account">Loo uus kasutajakonto</string>
<string name="register_opr_have_account">Mul juba on kasutajakonto olemas</string>
<string name="shared_string_search_history">Otsinguajalugu</string>
@ -3838,7 +3838,7 @@
<string name="add_to_opr">Lisa OpenPlaceReviews saiti</string>
<string name="use_dev_url_descr">Tavasaidi openstreetmap.org asemel kasuta OSM märkuste, huvipunktide või GPX-failide üleslaadimise katsetamiseks arendussaiti dev.openstreetmap.org.</string>
<string name="use_dev_url">Kasuta dev.openstreetmap.org saiti</string>
<string name="add_photos_descr">OsmAnd kuvam fotosid mitmetest allikatest:
<string name="add_photos_descr">OsmAnd kuvab fotosid mitmetest allikatest:
\nOpenPlaceReviews - huvipunkti fotod;
\nMapillary - tänavavaated;
\nWikimedia või veeb - OpenStreetMap\'i andmetes kirjeldatud fotod.</string>
@ -3852,4 +3852,100 @@
<string name="plan_route_join_segments">Liida lõigud</string>
<string name="profile_type_user_string">Kasutajaprofiil</string>
<string name="profile_type_osmand_string">OsmAnd profiil</string>
<string name="use_system_screen_timeout_promo">Vaikimisi keelatud: kui esiplaanil töötab OsmAnd, ei aegu ekraan läbi.
\n
\nKui see on lubatud, kasutab OsmAnd süsteemi ajalõpu sätet.</string>
<string name="use_system_screen_timeout">Kasutage süsteemi ekraani ajalõppu</string>
<string name="release_3_6">"• Profiilid: nüüd saate muuta järjestust, määrata kaardi ikooni, muuta kõiki põhiprofiilide sätteid ja taastada need vaikeseadetesse
\n
\n • Navigatsioonis on lisatud väljumisnumber
\n
\n • Ümber töötatud pistikprogrammi seaded
\n
\n • Kõigile profiilidele kiireks juurdepääsuks kuvatakse ümbertöödeldud seadete ekraan
\n
\n • Lisatud võimalus seadete kopeerimiseks teiselt profiililt
\n
\n • Lisatud võime muuta järjestust või peita HP kategooriaid otsingus
\n
\n • POI ikoonid kaardil õigesti joondatud
\n
\n • Kaardi seadistamiseks on lisatud päikeseloojangu / päikesetõusu andmed
\n
\n • Lisatud kaardil kodu / töökoha ikoonid
\n
\n • Lisatud seadetes mitmerealise kirjelduse tugi
\n
\n • Lisas Jaapani kaardile õige transliteratsiooni
\n
\n • Lisatud Antarktika kaart
\n
\n"</string>
<string name="route_recalculation_dist_descr">Teekond arvutatakse ümber, kui vahemaa teekonnani on suurem kui määratud parameeter</string>
<string name="plugin_disabled_descr">See pistikprogramm on eraldi rakendus, peate selle eraldi eemaldama, kui te ei kavatse seda enam kasutada.
\n
\nPistikprogramm jääb seadmesse pärast OsmAnd eemaldamist.</string>
<string name="plugin_disabled">Pistikprogramm välja lülitatud</string>
<string name="ui_customization_description">Kohandage üksuste hulka jaotistes \"Sahtel\", \"Kaardi seadistamine\" ja \"Kontekstimenüü\".
\n
\nKõigi nende juhtnuppude peitmiseks lülitage kasutamata pistikprogrammid välja. %1$s.</string>
<string name="ui_customization_short_descr">Sahtli osad, kontekstimenüü</string>
<string name="shared_string_drawer">Sahtel</string>
<string name="search_poi_types_descr">Ühendage erinevate kategooriate HP-de tüübid. Kõigi valimiseks puudutage lülitit, kategooria valimiseks puudutage vasakut serva.</string>
<string name="release_3_7">"• Uued võrguühenduseta nõlvakaardid
\n
\n • Lemmikute ja GPX-teekonnapunktide täielik kohandamine - kohandatud värvid, ikoonid, kujundid
\n
\n • Kohandatud üksuste järjekorda jaotistes \"Kontekstimenüü\", \"Kaardi seadistamine\" ja \"Sahtel\"
\n
\n • Vikipeedia eraldi kihina jaotises Kaardi seadistamine valige ainult vajalikud keeled
\n
\n • Loodud oma HP-de filter / kaardid täieliku paindlikkusega
\n
\n • Lisatud valikud kohandatud profiilide sätete taastamiseks
\n
\n • Täielikud GPX-marsruudid navigeerimisest toetavad liiklusradasid ja täitke pööramisjuhised
\n
\n • Parandatud tahvelarvutite kasutajaliidese suurused
\n
\n • Parandatud vead RTL-iga
\n
\n"</string>
<string name="system_screen_timeout_descr">Lülitab ekraani välja vastavalt süsteemi ekraani aegumisele.</string>
<string name="system_screen_timeout">Kasuta süsteemi ekraani ajalõppu</string>
<string name="turn_screen_on_descr">Valige ekraani äratussuvandid (veenduge, et seadme lukustamisel oleks esiplaanil OsmAnd):</string>
<string name="turn_screen_on_power_button_disabled">Keelatud. Nõuab jaotises „Aegumise aeg pärast ärkamist” valikut „Hoia ekraan sisse lülitatud”.</string>
<string name="turn_screen_on_wake_time_descr">Valige pärast ärkamist ekraani ajalõpp. (\"%1$s\" ei kasuta ajalõppu.)</string>
<string name="map_source_zoom_levels_descr">Mõjutab ekraani, kui seda kasutatakse kaardi või ülekatte / aluskattena.
\n
\n%1$s: kaart on piiratud valitud suurendustaseme vahemikuga.
\n
\n%2$s on tasemed, kus algsed paanid on nähtavad, suurem või suurem vähendamine toimub väljaspool neid väärtusi.</string>
<string name="start_finish_icons">Alguse ja lõpu ikoonid</string>
<string name="complex_routing_descr">Kahefaasiline marsruut autoga navigeerimiseks.</string>
<string name="lang_de_casual">Saksa (harilik)</string>
<string name="use_native_pt">Kohaliku ühistranspordi arendamine</string>
<string name="use_native_pt_desc">Lülita ümber Java (turvaline) ühistranspordi teekonna arvutamisele</string>
<string name="shared_string_graph">Graafik</string>
<string name="message_need_calculate_route_before_show_graph">%1$s andmed on saadaval ainult teedel. Graafikute nägemiseks arvutage marsruut, kasutades \"Punktidevaheline marsruut\".</string>
<string name="message_graph_will_be_available_after_recalculation">Palun oota.
\nGraafik on saadaval peale teekonna ümberarvutust.</string>
<string name="app_mode_gap">Vahe</string>
<string name="login_open_street_map">Logi OpenStreetMap-i sisse</string>
<string name="login_open_street_map_org">Logi sisse OpenStreetMap.org keskkonda</string>
<string name="enter_text_separated">Sisesta komadega eraldatud sildid.</string>
<string name="gpx_upload_public_visibility_descr">\"Avalik\" tähendab, et jälge kuvatakse avalikult teie GPS-i jälgedes ja avalikes GPS-i jälgede loendites ning avalikus jäljendite loendis koos ajatemplitega toores vormis. API kaudu edastatud andmed ei viita teie jälgimislehele. Jälgimispunkti ajatemplid pole avaliku GPS-i API kaudu saadaval ja jälgimispunktid pole kronoloogiliselt järjestatud.</string>
<string name="gpx_upload_private_visibility_descr">„Privaatne” tähendab, et jälge ei kuvata üheski avalikus loendis, kuid selle sünkroniseerimata järjekorras olevad jälgimispunktid on avaliku GPS-i API kaudu saadaval ilma ajatempliteta.</string>
<string name="gpx_upload_identifiable_visibility_descr">„Tuvastatav” tähendab, et jälg kuvatakse avalikult teie GPS-i jälgedes ja avalikes GPS-i jälgede loendites, st teised kasutajad saavad toore jälje alla laadida ja seostada teie kasutajanimega. Avalikud ajatempliga jäljepunkti andmed GPS-i API-st, mida teenindatakse rajapunktide API kaudu, viitavad teie algsele jälgimislehele.</string>
<string name="gpx_upload_trackable_visibility_descr">\"Jälgitav\" tähendab, et jälg ei ilmu ühteski avalikus loetelus, kuid töödeldud teekonnapunktid koos ajatemplitega sellest (mida ei saa seostada teiega otse) ilmuvad avaliku GPS API allalaadimiste kaudu.</string>
<string name="release_3_9">• Lisatud võimalus eksportida ja importida kõiki andmeid, sealhulgas seadeid, ressursse, oma kohti
\n
\n• Marsruudi planeerimine: graafikud rööbastee segmentide marsruudiga ja lisaks võime luua ja muuta mitut raja segmenti
\n
\n• Lisatud OAuth autentimise meetod OpenStreetMap, täiustatud UI OSM dialooge
\n
\n• Kohandatud lemmikvärvide ja asukohapunktide jälgimise toetus
\n
\n</string>
<string name="reverse_all_points">Pööra kõik punktid ümber</string>
</resources>

View file

@ -2063,7 +2063,7 @@
<string name="poi_dialog_reopen">بازگشایی</string>
<string name="get_plugin">دریافت</string>
<string name="use_fast_recalculation">محاسبهٔ مجدد هوشمند</string>
<string name="use_fast_recalculation_desc">فقط بخش ابتدایی مسیر را مجدداً محاسبه می‌کند. برای سفرهای طولانی مفید است.</string>
<string name="use_fast_recalculation_desc">فقط بخش ابتدایی مسیر را مجدداً محاسبه می‌کند. سودمند برای سفرهای طولانی.</string>
<string name="do_you_like_osmand">آیا از OsmAnd راضی هستید؟</string>
<string name="we_really_care_about_your_opinion">دیدگاه و بازخورد شما ارزشمند است.</string>
<string name="rate_this_app">به این برنامه امتیاز بدهید</string>
@ -3481,7 +3481,7 @@
<string name="live_monitoring_descr">اجازه می‌دهد موقعیت کنونی با استفاده از ضبط سفر هم‌رسانی شود.</string>
<string name="tracks_view_descr">ردهای ضبط‌شدهٔ شما در %1$s یا در پوشهٔ OsmAnd قرار دارند.</string>
<string name="multimedia_notes_view_descr">یادداشت‌های OSMای شما در %1$s قرار دارند.</string>
<string name="osm_edits_view_descr">می‌توانید همهٔ ویرایش‌ها یا یادداشت‌های OSMای خود را که آپلود نکرده‌اید در %1$s ببینید. نقاط آپلودشده را دیگر در OsmAnd نمی‌بینید.</string>
<string name="osm_edits_view_descr">همهٔ ویرایش‌ها یا یادداشت‌های OSMای آپلودنشدهٔ خود را در %1$s ببینید. تغییرات آپلودشده را دیگر نمی‌بینید.</string>
<string name="logcat_buffer_descr">لاگ‌های جزئی برنامه را بررسی و هم‌رسانی کنید</string>
<string name="multimedia_use_system_camera">استفاده از برنامهٔ سیستم</string>
<string name="multimedia_photo_play_sound">صدای شاتر دوربین</string>
@ -3925,7 +3925,7 @@
<string name="number_of_gpx_files_selected_pattern">%s فایل رد انتخاب شده است</string>
<string name="monitoring_control_start">ضبط</string>
<string name="disable_recording_once_app_killed_descrp">هنگامی که برنامه را از طریق برنامه‌های اخیر ببندید ضبط رد به‌طور موقت می‌ایستد. (نشانگر اجرای پس‌زمینه از نوار اعلان حذف می‌شود.)</string>
<string name="save_global_track_interval_descr">بازهٔ زمانی برای ضبط رد را انتخاب کنید (که از طریق ابزار ضبط سفر روی نقشه فعال می‌شود).</string>
<string name="save_global_track_interval_descr">بازهٔ زمانی برای ضبط رد را انتخاب کنید (که از طریق ابزارک ضبط سفر روی نقشه روشن می‌شود).</string>
<string name="gpx_monitoring_stop">نگه‌داشتن ضبط سفر</string>
<string name="gpx_monitoring_start">ازسرگیری ضبط سفر</string>
<string name="app_mode_inline_skates">اسکیت این‌لاین</string>
@ -3933,7 +3933,7 @@
<string name="app_mode_motor_scooter">اسکوتر موتوری</string>
<string name="app_mode_wheelchair_forward">ویلچر رو به جلو</string>
<string name="threshold_distance">فاصله آستانه</string>
<string name="start_finish_icons">نمادهای ابتدا/انتها</string>
<string name="start_finish_icons">نمادهای ابتدا و انتها</string>
<string name="routing_attr_avoid_footways_name">راه‌های پیاده</string>
<string name="routing_attr_avoid_footways_description">از راه‌های پیاده پرهیز می‌کند</string>
<string name="development">توسعه</string>
@ -3954,15 +3954,15 @@
<string name="perform_oauth_authorization_description">برای استفاده از قابلیت‌های ویرایشی، از طریق OAuth ثبت ورود کنید</string>
<string name="perform_oauth_authorization">ثبت ورود از طریق OAuth</string>
<string name="clear_osm_token">پاک‌سازی توکن OAuth اوپن‌استریت‌مپ</string>
<string name="osm_edit_logout_success">ثبت خروج موفقیت‌آمیز بود</string>
<string name="osm_edit_logout_success">خروج ثبت شد</string>
<string name="file_already_imported">فایل قبلاً در OsmAnd درون‌برد شده است</string>
<string name="use_two_phase_routing">استفاده از الگوریتم مسیریابی دومرحله‌ای A*</string>
<string name="shared_string_graph">نمودار</string>
<string name="message_need_calculate_route_before_show_graph">دادهٔ %1$s فقط در جاده ارائه می‌شود. برای اینکه آن را داشته باشید با استفاده از «مسیریابی بین نقطه‌ها» مسیری محاسبه کنید.</string>
<string name="message_graph_will_be_available_after_recalculation">منتظر بمانید تا مسیر دوباره محاسبه شود.
\nنمودار پس از بازمحاسبه در دسترس قرار خواهد گرفت.</string>
<string name="message_need_calculate_route_before_show_graph">دادهٔ %1$s فقط در جادهها ارائه می‌شود. با استفاده از «مسیریابی بین نقطه‌ها» مسیری محاسبه کنید تا نمودارها را ببینید.</string>
<string name="message_graph_will_be_available_after_recalculation">لطفاً منتظر بمانید.
\nنمودار پس از بازمحاسبهٔ مسیر فراهم می‌شود.</string>
<string name="ltr_or_rtl_combine_via_dash">%1$s — %2$s</string>
<string name="message_you_need_add_two_points_to_show_graphs">دست‌کم باید دو نقطه اضافه کنید</string>
<string name="message_you_need_add_two_points_to_show_graphs">دست‌کم دو نقطه اضافه کنید</string>
<string name="login_open_street_map">ثبت ورود در اوپن‌استریت‌مپ</string>
<string name="login_open_street_map_org">ثبت ورود در OpenStreetMap.org</string>
<string name="sign_in_with_open_street_map">ثبت ورود از طریق اوپن‌استریت‌مپ</string>
@ -3973,7 +3973,7 @@
<string name="login_account">حساب</string>
<string name="user_login">ثبت ورود</string>
<string name="manage_subscription">مدیریت اشتراک</string>
<string name="subscription_payment_issue_title">در رابطه با اشتراک شما مشکلی وجود دارد. روی دکمه کلیک کنید تا به تنظیمات اشتراک گوگل‌پلی بروید و شیوهٔ پرداخت خود را اصلاح نمایید.</string>
<string name="subscription_payment_issue_title">روی دکمه بزنید و یک شیوهٔ پرداخت در گوگل‌پلی تنظیم کنید تا اشتراک خود را اصلاح نمایید.</string>
<string name="markers_history">تاریخچهٔ نشانه‌ها</string>
<string name="send_files_to_openstreetmap">ارسال فایل GPX به اوپن‌استریت‌مپ</string>
<string name="gpx_upload_public_visibility_descr">«عمومی» یا Public به این معنی است که رد به‌صورت عمومی در ردهای جی‌پی‌اس شما و لیست ردهای عمومی جی‌پی‌اس در قالب خام نمایش داده می‌شود. دادهٔ نقاط رد که از طریق API در دسترس قرار می‌گیرد، به صفحهٔ ردهای شما ارجاع نمی‌دهد. مهر زمان نقاط رد از طریق API جی‌پی‌اس‌های عمومی دست‌یافتنی نیست و نقاط رد بر اساس زمان مرتب نیستند.</string>

View file

@ -3618,7 +3618,7 @@
<string name="poi_vehicle_military">Acceso para vehículos: militar</string>
<string name="poi_vehicle_delivery">Acceso para vehículos: entregas</string>
<string name="poi_vehicle_forestry">Acceso para vehículos: forestal</string>
<string name="poi_motorcar_yes">Acceso para automóbiles:</string>
<string name="poi_motorcar_yes">Acceso para automóbiles: si</string>
<string name="poi_motorcar_private">Acceso para automóbiles: privado</string>
<string name="poi_motorcar_no">Acceso para automóbiles: non</string>
<string name="poi_motorcar_destination">Acceso para automóbiles: destino</string>
@ -3876,4 +3876,19 @@
<string name="poi_siren">Serea</string>
<string name="poi_nurse">Enfermeira</string>
<string name="poi_mobile_money_agent">Axente de diñeiro móbil</string>
<string name="poi_lavoir">Lavadoiro</string>
<string name="poi_waste_transfer_station">Estación de transferencia de residuos</string>
<string name="poi_weightbridge">Balanza</string>
<string name="poi_ranger_station">Posto de garda forestal</string>
<string name="poi_water_source_lake">Lago</string>
<string name="poi_water_source_river">Río</string>
<string name="poi_water_source_well">Pozo</string>
<string name="poi_water_source_powered_pump">Bomba motorizada</string>
<string name="poi_water_source_water_tank">Tanque de auga</string>
<string name="poi_water_source_tap">Billa</string>
<string name="poi_water_source_water_works">Tratamento de augas</string>
<string name="poi_water_source_tube_well">Ben intubado</string>
<string name="poi_vaccination_covid19">Vacinación: COVID19</string>
<string name="poi_health_specialty_vaccination_yes">Vacinación</string>
<string name="poi_lifeguard_base">Base de salvavidas</string>
</resources>

View file

@ -1554,7 +1554,7 @@ Lon %2$s</string>
<string name="shared_string_release">Publicado</string>
<string name="plugin_install_needs_network">Precisas estar conectado para instalar este plugin.</string>
<string name="get_plugin">Obter</string>
<string name="use_fast_recalculation_desc">Recalcular só a parte inicial da ruta para viaxes longas.</string>
<string name="use_fast_recalculation_desc">Recalcular só a parte inicial da ruta, útil para viaxes longas.</string>
<string name="do_you_like_osmand">Gosta do OsmAnd?</string>
<string name="we_really_care_about_your_opinion">A túa opinión e comentarios son valorados.</string>
<string name="rate_this_app">Avalía esta aplicación</string>
@ -1967,7 +1967,7 @@ Lon %2$s</string>
<string name="follow_us">Séguenos</string>
<string name="access_direction_audio_feedback_descr">Inserir o enderezo do destino mediante son.</string>
<string name="use_osm_live_routing">Navegación do OsmAnd ao Vivo</string>
<string name="access_no_destination">Destino non definido</string>
<string name="access_no_destination">Complemento de accesibilidade: Destino non definido</string>
<string name="access_smart_autoannounce">Anuncios automáticos intelixentes</string>
<string name="access_smart_autoannounce_descr">Notificar só cando se mude o enderezo ó destino.</string>
<string name="access_autoannounce_period">Período dos anuncios automáticos</string>
@ -2594,7 +2594,7 @@ Lon %2$s</string>
<string name="private_access_routing_req">O destino ubícase nunha área de acceso privado. Permitir o emprego de camiños privados para esta viaxe\?</string>
<string name="nothing_found_descr">Mudar a procura ou aumentar o seu raio.</string>
<string name="quick_action_showhide_osmbugs_descr">Un botón que amosa ou agocha as notas do OSM no mapa.</string>
<string name="hillshade_menu_download_descr">Baixar o mapa de \'Sobreposición de asombreado\' para amosar o asombreado vertical.</string>
<string name="hillshade_menu_download_descr">Baixar o mapa de sobreposición de \'asombreado\' para amosar o asombreado vertical.</string>
<string name="hillshade_purchase_header">Instalar o plugin de \'Curvas de nivel\' para amosar as áreas verticais graduadas.</string>
<string name="hide_from_zoom_level">Agochar a partir do nivel de achegamento</string>
<string name="srtm_menu_download_descr">Baixar o mapa de \'Curvas de nivel\' para empregalas nesta rexión.</string>
@ -3450,7 +3450,7 @@ Lon %2$s</string>
<string name="login_and_pass">Nome de usuario e contrasinal</string>
<string name="plugin_global_prefs_info">Os axustes deste complemento son globais e aplícanse a todos os perfís</string>
<string name="osm_editing">Edición do OSM</string>
<string name="osm_edits_view_descr">Podes ollar todas as túas edicións aínda non subidas ou erros do OSM en %1$s. Os puntos subidos non se amosan no OsmAnd.</string>
<string name="osm_edits_view_descr">Mira todas as edicións aínda non subidas ou erros do OSM en %1$s. As modificacións xa subidas non se amosarán máis.</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">A icona amósase mentres se navega ou se move pola pantalla.</string>
<string name="select_map_icon_descr">A icona amósase en asueto.</string>
@ -3887,7 +3887,7 @@ Lon %2$s</string>
<string name="navigation_profile">Perfil de navegación</string>
<string name="route_between_points_add_track_desc">Escolle un ficheiro de pista ó que se engadirá un novo segmento.</string>
<string name="street_level_imagery">Imaxes a nivel de rúa</string>
<string name="plan_route_exit_dialog_descr">Pechar o plan de ruta sen gardar\?, desbotaranse todas as modificacións.</string>
<string name="plan_route_exit_dialog_descr">Estás seguro de desbotar todas as modificacións no plan de ruta\?</string>
<string name="in_case_of_reverse_direction">En caso de dirección inversa</string>
<string name="shared_string_save_as_gpx">Gardar coma novo ficheiro de pista</string>
<string name="add_segment_to_the_track">Engadir a un ficheiro de pistas</string>
@ -3930,7 +3930,7 @@ Lon %2$s</string>
<string name="sort_name_ascending">Nome: A Z</string>
<string name="start_finish_icons">Iconas de inicio e fin</string>
<string name="contour_lines_thanks">Grazas por mercar \'Curvas de nivel\'</string>
<string name="osm_live_payment_desc_hw">Subscrición cobrada por período escollido. Cancélaa na AppGallery en calquera intre.</string>
<string name="osm_live_payment_desc_hw">A subscrición é cobrada por período escollido. Cancélaa na AppGallery en calquera intre.</string>
<string name="osm_live_payment_subscription_management_hw">O pagamento será cargado na túa conta da AppGallery no mesmo intre da confirmación da compra.
\n
\nA subscrición é renovada de xeito automático a menos que sexa cancelada antes da data de renovación. A túa conta será cargada polo período de renovación (mes/trimestre/ano) só na data de renovación.
@ -3944,7 +3944,7 @@ Lon %2$s</string>
<string name="use_complex_routing">Enrutamento complexo</string>
<string name="complex_routing_descr">Enrutamento de dúas fases para a navegación de automóbil</string>
<string name="use_native_pt">Desenvolvemento do transporte público nativo</string>
<string name="use_native_pt_desc">Activar cálculo de enrutamento de transporte público do Java (seguro)</string>
<string name="use_native_pt_desc">Activar cálculo da ruta de transporte público do Java (seguro)</string>
<string name="what_is_new">Novidades</string>
<string name="perform_oauth_authorization_description">Inicia a sesión co OAuth para empregar as funcións de edición do OSM</string>
<string name="perform_oauth_authorization">Entrar polo OAuth</string>
@ -3959,8 +3959,7 @@ Lon %2$s</string>
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="mgrs_format_descr">O OsmAnd emprega MGRS, que é semellante ó formato UTM NATO.</string>
<string name="message_need_calculate_route_before_show_graph">%1$s datos dispoñíbeis só nas estrada, necesitas calcular unha ruta empregando \"Ruta entre puntos\" para obtela.</string>
<string name="message_graph_will_be_available_after_recalculation">Agarda polo recálculo da ruta.
\nO gráfico estará dispoñíbel após o recálculo.</string>
<string name="message_graph_will_be_available_after_recalculation">O gráfico estará dispoñíbel após o recálculo da ruta.</string>
<string name="shared_string_local_maps">Mapas locais</string>
<string name="app_mode_gap">Salto</string>
<string name="icon_group_amenity">Instalación</string>
@ -3971,9 +3970,9 @@ Lon %2$s</string>
<string name="icon_group_sport">Deporte</string>
<string name="icon_group_emergency">Emerxencia</string>
<string name="icon_group_travel">Viaxe</string>
<string name="message_you_need_add_two_points_to_show_graphs">Tes que engadir polo menos dous puntos</string>
<string name="message_you_need_add_two_points_to_show_graphs">Engade polo menos dous puntos</string>
<string name="manage_subscription">Xestionar subscrición</string>
<string name="subscription_payment_issue_title">Hai un problema coa túa subscrición. Preme no botón para ir ós axustes de subscrición da Google Play e corrixir o teu método de pagamento.</string>
<string name="subscription_payment_issue_title">Preme no botón para configurar un método de pagamento na Google Play e corrixir a túa subscrición.</string>
<string name="subscription_expired_title">A subscrición do OsmAnd Live expirou</string>
<string name="subscription_paused_title">A subscrición do OsmAnd Live foi detida</string>
<string name="subscription_on_hold_title">A subscrición do OsmAnd Live está en espera</string>
@ -4022,9 +4021,25 @@ Lon %2$s</string>
<string name="add_photos_descr">O OsmAnd amosa imaxes de diferentes fontes:
\nOpenPlaceReviews - imaxes POI;
\nMapillary - maxes a nivel de rúa;
\nWeb / Wikimedia - imaxes POI especificadas nos datos do OpenStreetMap.</string>
\nWeb / Wikimedia - imaxes POI segundo datos do OpenStreetMap.</string>
<string name="ltr_or_rtl_combine_via_star">%1$s * %2$s</string>
<string name="lang_de_casual">Alemán casual</string>
<string name="elevation_data">Podes empregar os datos de elevación para considerar o ascenso ou descenso da túa viaxe</string>
<string name="elevation_data">Podes empregar os datos de elevación para ter en conta o ascenso e descenso da viaxe</string>
<string name="app_mode_light_aircraft">Avión lixeiro</string>
<string name="plan_route_join_segments">Unir segmentos</string>
<string name="plan_route_split_before">Dividir antes</string>
<string name="plan_route_split_after">Dividir despois</string>
<string name="plan_route_add_new_segment">Engadir novo segmento</string>
<string name="profile_type_osmand_string">Perfil do OsmAnd</string>
<string name="profile_type_user_string">Perfil do usuario</string>
<string name="release_3_9">• Engadiuse a opción de exportar e importar todos os datos, incluíndo os axustes, os recursos e \"Os meus sitios\"
\n
\n • Planificar ruta: engadíronse gráficos para os segmentos de pistas coa ruta e capacidade de crear ou editar pistas de segmentos múltiples
\n
\n • Engadiuse o método de autenticación OAuth para o OpenStreetMap e mellorouse a interface de usuario dos diálogos do OSM
\n
\n • Engadíronse cores personalizadas para os favoritos e os puntos de referencia da pista
\n
\n</string>
<string name="reverse_all_points">Inverter todos os puntos</string>
</resources>

View file

@ -3878,4 +3878,16 @@
<string name="poi_lifeguard_base">Vízimentő-támaszpont</string>
<string name="poi_vaccination_covid19">Oltóközpont: Covid19</string>
<string name="poi_health_specialty_vaccination_yes">Oltóközpont</string>
<string name="poi_ranger_station">Ranger station</string>
<string name="poi_lavoir">Ruhamosó hely</string>
<string name="poi_waste_transfer_station">Hulladékátrakodó</string>
<string name="poi_weightbridge">Hídmérleg</string>
<string name="poi_water_source_lake"></string>
<string name="poi_water_source_river">Folyó</string>
<string name="poi_water_source_well">Kút</string>
<string name="poi_water_source_powered_pump">Motoros szivattyú</string>
<string name="poi_water_source_water_tank">Víztartály</string>
<string name="poi_water_source_tap">Csap</string>
<string name="poi_water_source_water_works">Vízmű</string>
<string name="poi_water_source_tube_well">Csöves kút</string>
</resources>

View file

@ -1559,7 +1559,7 @@
<string name="lang_gl">galiciai</string>
<string name="lang_et">észt</string>
<string name="lang_ceb">szebuano</string>
<string name="archive_wikipedia_data">Régi, összeférhetetlen Wikipédia adataid vannak. Archiválod őket?</string>
<string name="archive_wikipedia_data">A Wikipédia-adatok régiek és inkompatbilisek. Archiválja őket\?</string>
<string name="download_wikipedia_files">Letölt további Wikipédia-adatokat (%1$s MB)\?</string>
<string name="lang_es_ar">spanyol (argentín)</string>
<string name="lang_nb">norvég bokmål</string>
@ -1943,7 +1943,7 @@
<string name="map_widget_magnetic_bearing">Mágneses irány</string>
<string name="access_disable_offroute_recalc">Ne tervezzen újra, ha letérsz az útvonalról</string>
<string name="access_disable_wrong_direction_recalc">Ne tervezzen újra, ha ellenkező irányba mész</string>
<string name="access_no_destination">Nincs beállítva célpont</string>
<string name="access_no_destination">Kisegítő lehetőségek bővítmény: nincs beállítva célpont</string>
<string name="map_widget_battery">Akkumulátor töltöttsége</string>
<string name="move_marker_bottom_sheet_title">A jelölő helyének módosításához mozgasd a térképet</string>
<!-- string name="lat_lon_pattern">Szél.: %1$.5f Hossz.: %2$.5f</string -->
@ -2566,7 +2566,7 @@
<string name="shared_string_bookmark">Könyvjelző</string>
<string name="hide_full_description">Teljes leírás elrejtése</string>
<string name="show_full_description">Teljes leírás megjelenítése</string>
<string name="open_wikipedia_link_online">Wikipédia hivatkozás megnyitása online</string>
<string name="open_wikipedia_link_online">Wikipédia-link megnyitása online</string>
<string name="open_wikipedia_link_online_description">A hivatkozás a böngészőben fog megnyílni.</string>
<string name="read_wikipedia_offline">Wikipédia olvasása offline</string>
<string name="download_all">Összes letöltése</string>
@ -2603,7 +2603,7 @@
<string name="images_cache">Kép gyorsítótár</string>
<string name="delete_search_history">Keresési előzmények törlése</string>
<string name="download_images">Képek letöltése</string>
<string name="read_wikipedia_offline_description">Szerezz OsmAnd Live előfizetést, hogy Wikipédia és Wikivoyage cikkeket olvashass offline.</string>
<string name="read_wikipedia_offline_description">Szerezzen OsmAnd Live előfizetést, hogy offline módon is olvashasson Wikipédia- és Wikivoyage-szócikkeket.</string>
<string name="how_to_open_link">Hogyan nyisd meg a linket?</string>
<string name="purchase_cancelled_dialog_title">Lemondtad az OsmAnd Live előfizetésedet</string>
<string name="purchase_cancelled_dialog_descr">Előfizetés megújítása az alábbi funkciók használatának folytatásához:</string>
@ -2640,14 +2640,14 @@
<string name="index_item_world_wikivoyage">Wikivoyage szócikkek</string>
<string name="access_intermediate_arrival_time">Köztes érkezési idő</string>
<string name="map_widget_intermediate_time">Köztes idő</string>
<string name="download_wikipedia_description">Töltsd le %1$s Wikipédia szócikkeit offline olvasásra.</string>
<string name="download_wikipedia_description">Töltse le %1$s Wikipédia szócikkeit offline olvasásra.</string>
<string name="download_wikipedia_label">Wikipédia adatok letöltése</string>
<string name="open_in_browser_wiki">Szócikk megnyitása online</string>
<string name="open_in_browser_wiki_description">Szócikk megtekintése böngészőben.</string>
<string name="download_wiki_region_placeholder">ez a régió</string>
<string name="download_wiki_region_placeholder">ezen régió</string>
<string name="wiki_article_search_text">Megfelelő szócikk keresése</string>
<string name="wiki_article_not_found">Szócikk nem található</string>
<string name="how_to_open_wiki_title">Hogyan nyiss meg Wikipédia szócikkeket?</string>
<string name="how_to_open_wiki_title">Hogyan lehet Wikipédia szócikkeket megnyitni\?</string>
<string name="get_osmand_live">Az összes funkció feloldásához szerezze be az OsmAnd Live-ot: Napi térképfrissítés korlátlan számú letöltéssel, az összes fizetős és ingyenes bővítmény, Wikipédia, Wikivoyage és sok más.</string>
<string name="unirs_render_descr">Az alapértelmezett stílus módosítása a gyalogos és kerékpáros utak kontrasztosabb megjelenítése érdekében. Mapnik színeket használ.</string>
<string name="off_road_render_descr">Topo stílus alapján terepen történő vezetéshez és alátétként zöld műholdképekkel történő használathoz. Vékonyabb főutak, vastagabb mezőgazdasági és erdészeti utak, ösvények, kerékpár- és más útvonalak.</string>
@ -3422,7 +3422,7 @@
<string name="login_and_pass">Felhasználónév és jelszó</string>
<string name="plugin_global_prefs_info">Ezek a bővítménybeállítások globálisak, és minden profilra vonatkoznak</string>
<string name="osm_editing">OSM-szerkesztés</string>
<string name="osm_edits_view_descr">Az összes még fel nem töltött szerkesztés vagy OSM-hiba megtekinthető itt: %1$s. A már feltöltött pontok nem láthatók az OsmAndban.</string>
<string name="osm_edits_view_descr">"A még fel nem töltött szerkesztéseket vagy OSM-hibákat megtekintheti itt: %1$s. A már feltöltött módosítások nem jelennek meg."</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Navigáció vagy haladás közben megjelenő ikon.</string>
<string name="select_map_icon_descr">Álló helyzetben megjelenő ikon.</string>
@ -3481,7 +3481,7 @@
<string name="hillshade_description">A domborzatárnyékolás réteg sötét árnyalattal emeli ki a lejtőket, csúcsokat és a síkságokat.</string>
<string name="slope_description">A lejtő réteg színezéssel jeleníti meg a terep meredekségét.</string>
<string name="terrain_slider_description">Állítsa be a legkisebb és legnagyobb nagyítási szintet, amelyen a réteg megjelenjen.</string>
<string name="hillshade_download_description">További térképek szükségesek a domborzatárnyékolás térképen való megjelenítéséhez.</string>
<string name="hillshade_download_description">A domborzatárnyékolás térképen való megjelenítéséhez további térképek szükségesek.</string>
<string name="slope_download_description">További térképek szükségesek a lejtők térképen való megjelenítéséhez.</string>
<string name="shared_string_transparency">Áttetszőség</string>
<string name="shared_string_zoom_levels">Nagyítási szintek</string>
@ -3543,8 +3543,8 @@
\n
\nA használaton kívüli bővítmények kikapcsolásával elrejtheti őket a %1$s menüből.</string>
<string name="ui_customization_short_descr">Menü elemek, Opciók</string>
<string name="select_wikipedia_article_langs">Jelölje ki a térképen megjelenő Wikipédia szócikkek nyelvét. A szócikk olvasása közben válthat valamennyi elérhető nyelv között.</string>
<string name="some_articles_may_not_available_in_lang">Előfordulhat, hogy néhány Wikipédia szócikk nem érhető el az ön nyelvén.</string>
<string name="select_wikipedia_article_langs">Jelölje ki a térképen megjelenő Wikipédia-szócikkek nyelvét. A szócikk olvasása közben válthat valamennyi elérhető nyelv között.</string>
<string name="some_articles_may_not_available_in_lang">Előfordulhat, hogy néhány Wikipédia-szócikk nem érhető el az ön nyelvén.</string>
<string name="select_track_file">Nyomvonalfájl kijelölése</string>
<string name="lang_zhyue">kantoni</string>
<string name="lang_zhminnan">déli min</string>
@ -3734,7 +3734,7 @@
<string name="please_provide_point_name_error">Kérem, adjon nevet a pontnak</string>
<string name="lenght_limit_description">Adja meg a járműve hosszát (a hosszú járművekre útvonalkorlátozások vonatkozhatnak).</string>
<string name="quick_action_remove_next_destination">Legközelebbi célpont törlése</string>
<string name="search_download_wikipedia_maps">Wikipédia térképek letöltése</string>
<string name="search_download_wikipedia_maps">Wikipédia-térképek letöltése</string>
<string name="export_profile_dialog_description">További adatokat is kijelölhet exportálásra a profillal együtt.</string>
<string name="shared_string_include_data">Kiegészítő adatok átvétele</string>
<string name="import_profile_dialog_description">Az importált profil kiegészítő adatokat is tartalmaz. Koppintson az \"Importál\" gombra kizálólag a profiladatok importálásához vagy válassza a kiegészítő adatokat.</string>
@ -3744,8 +3744,8 @@
\nAz előfizetés automatikusan megújul, kivéve, ha azt a megújítási dátum előtt lemondja. A megújítási időszakra (hónap / 3 hónap / év) vonatkozóan a számláját csak a megújítás napján terheljük meg.
\n
\nAz előfizetéseket a Google Play beállításai között kezelheti és törölheti.</string>
<string name="quick_action_remove_next_destination_descr">Törli az útvonal soron következő célpontját. Amennyiben ez a végző célpont, a navigáció megáll.</string>
<string name="plugin_wikipedia_description">Tudjon meg többet az érdekes pontokról a Wikipédiából. Ez az Ön offline zsebútikönyve egyszerűen kapcsolja be a Wikipédia-bővítményt, és élvezze az Ön körüli objektumokról szóló cikkeket.</string>
<string name="quick_action_remove_next_destination_descr">Törli az útvonala következő célpontját. Ha ez a végső cél, akkor a navigáció leáll.</string>
<string name="plugin_wikipedia_description">Az érdekes helyekről a Wikipédia segítségével tájékozódhat. Ez olyan, mint egy zsebútikönyv: helyekről és úti célokról olvashat benne.</string>
<string name="app_mode_enduro_motorcycle">Salakmotor</string>
<string name="app_mode_motor_scooter">Robogó</string>
<string name="app_mode_wheelchair">Kerekesszék</string>
@ -3785,7 +3785,7 @@
<string name="gpx_split_interval_descr">Válassza ki, hogy a nyomvonalon milyen távolság- vagy időintervallumok jelzései jelenjenek meg.</string>
<string name="monitoring_min_distance_descr">Ez a szűrő kiküszöböli az ismétlődő pontok rögzítését ott, ahol túl kevés tényleges mozgás történhetett, így szebb lesz a később utólag fel nem dolgozott nyomvonalak térbeli megjelenése.</string>
<string name="multimedia_rec_split_title">Felvétel vágása</string>
<string name="disable_recording_once_app_killed_descrp">Szünetelteti a nyomvonal naplózását, amikor az alkalmazást bezárják (a \'mostanában használt alkalmazások\' felületen). (Az OsmAnd háttérjelzése eltűnik az Android értesítési sávjáról.)</string>
<string name="disable_recording_once_app_killed_descrp">A nyomvonal naplózása szünetelni fog, amikor az alkalmazást (újabb alkalmazásokkal) kilövik. (Ilyenkor az OsmAnd háttérjelzése is eltűnik az Android értesítési sávjáról.)</string>
<string name="monitoring_min_speed_descr_recommendation">Javaslat: Először próbálja meg a mozgásérzékelést használni a legkisebb elmozdulást naplózó szűrővel (B). Ez jobb eredményeket hozhat, és kevesebb adatot veszít. Ha a nyomvonalak alacsony sebességnél továbbra is zajosak, próbálkozzon itt nullától eltérő értékekkel. Felhívjuk figyelmét, hogy egyes (hálózatalapú módszereket használó) mérőeszközök egyáltalán nem adnak sebességértéket, így ebben az esetben semmi sem fog rögzülni.</string>
<string name="street_level_imagery">Utcaszintű képek</string>
<string name="simplified_track_description">Csak az út vonala lesz elmentve, az útpontok törlődnek.</string>
@ -3859,7 +3859,7 @@
<string name="navigation_profile">Navigációs profil</string>
<string name="monitoring_min_speed_descr_remark">Megjegyzés a „sebesség &gt; 0” ellenőrzéséhez: A legtöbb GPS lapkakészlet (chipset) csak akkor mutat sebességértéket, ha az algoritmus megállapítja, hogy mozgásban van. Ha nincs mozgás, akkor nem mutatnak sebességet. Ezért ebben a szűrőben a „&gt; 0” beállítás bizonyos értelemben a GPS lapkakészlet mozgásérzékelését használja. De még ha a rögzítés ideje alatt itt nem is szűrjük a GPX elemzése során mégis használjuk ezt a funkciót a korrigált távolság meghatározásához, vagyis az abban a mezőben megjelenített érték a mozgás közben rögzített távolság.</string>
<string name="only_selected_segment_recalc">Csak a kijelölt szakasz lesz újraszámítva a kiválasztott profilnak megfelelően.</string>
<string name="plan_route_exit_dialog_descr">Biztos, hogy mentés nélkül bezárja az útvonaltervezőt\? Minden változást elvész.</string>
<string name="plan_route_exit_dialog_descr">Biztosan elveti az összes módosítást a tervezett útvonalon\?</string>
<string name="follow_track_descr">Válassza ki a követendő nyomvonalfájlt</string>
<string name="listed_exist">A felsorolt %1$s már létezik az OsmAndban.</string>
<string name="all_previous_segments">Minden korábbi szakasz</string>
@ -3898,12 +3898,12 @@
<string name="sort_name_ascending">Név: AZ</string>
<string name="start_finish_icons">Kiindulás és érkezés ikonjai</string>
<string name="contour_lines_thanks">Köszönjük, hogy megvásárolta a szintvonalbővítményt (Contour lines)</string>
<string name="osm_live_payment_desc_hw">Az előfizetés díja a kiválasztott időszakonként lesz kiszámítva. Bármikor törölheti az AppGallery webhelyen.</string>
<string name="osm_live_payment_subscription_management_hw">A fizetést a vásárlás visszaigazolásakor az AppGallery számlájára terheljük.
<string name="osm_live_payment_desc_hw">Az előfizetés a kiválasztott időszakonként kerül felszámolásra. Bármikor törölheti az AppGallery alkalmazásban.</string>
<string name="osm_live_payment_subscription_management_hw">AppGallery-fiókját a vásárlás visszaigazolása után terheljük meg.
\n
\nAz előfizetés automatikusan megújul, kivéve, ha azt a megújítási dátum előtt lemondja. A megújítási időszakra (hónap / 3 hónap / év) vonatkozóan a számláját csak a megújítás napján terheljük meg.
\nAz előfizetés automatikusan meghosszabbodik, kivéve, ha a megújítási dátum előtt lemondják. A megújítási időszakra (hónap / három hónap / év) az Ön számláját csak a megújítás napján terheljük meg.
\n
\nAz előfizetéseket az AppGallery beállításai között kezelheti és törölheti.</string>
\nAz előfizetéseket az AppGallery beállításaiban kezelheti és törölheti.</string>
<string name="routing_attr_avoid_footways_description">Gyalogutak elkerülése</string>
<string name="routing_attr_avoid_footways_name">Gyalogutak elkerülése</string>
<string name="development">Fejlesztés</string>
@ -3950,7 +3950,7 @@
<string name="subscription_on_hold_title">Az OsmAnd-előfizetés fel van függesztve</string>
<string name="subscription_paused_title">Az OsmAnd Live-előfizetés szünetel</string>
<string name="subscription_expired_title">Az OsmAnd Live-előfizetés lejárt</string>
<string name="subscription_payment_issue_title">Probléma van az előfizetésével. A fizetési mód kijavítása érdekében koppintson a gombra a Google Play előfizetési beállításaihoz történő ugráshoz.</string>
<string name="subscription_payment_issue_title">Előfizetése kijavítása érdekében koppintson a gombra, és állítsa be a fizetési módot a Google Playen.</string>
<string name="user_login">Bejelentkezés</string>
<string name="login_account">Fiók</string>
<string name="use_login_password">Bejelentkezés felhasználónévvel és jelszóval</string>
@ -4007,4 +4007,7 @@
\n • Egyéni színek támogatása a kedvenceknél és a nyomvonalak útpontjainál
\n
\n"</string>
<string name="profile_type_osmand_string">OsmAnd profil</string>
<string name="profile_type_user_string">Felhasználói profil</string>
<string name="reverse_all_points">Összes pont megfordítása</string>
</resources>

View file

@ -3610,7 +3610,7 @@
<string name="poi_vehicle_military">Aðgangur farartækja: hernaðarlegur</string>
<string name="poi_vehicle_delivery">Aðgangur farartækja: vöruafhending</string>
<string name="poi_vehicle_forestry">Aðgangur farartækja: skógrækt</string>
<string name="poi_motorcar_yes">Aðgangur bifreiða:</string>
<string name="poi_motorcar_yes">Aðgangur bifreiða:</string>
<string name="poi_motorcar_private">Aðgangur bifreiða: einka</string>
<string name="poi_motorcar_no">Aðgangur bifreiða: nei</string>
<string name="poi_motorcar_destination">Aðgangur bifreiða: áfangastaður</string>
@ -3868,4 +3868,19 @@
<string name="poi_consulate_consular_agency">Ræðismannastofnun</string>
<string name="poi_embassy_branch_embassy">Útibú</string>
<string name="poi_consulate_consular_office">Ræðisskrifstofa</string>
<string name="poi_waste_transfer_station">Millifærslustöð fyrir úrgang</string>
<string name="poi_water_source_powered_pump">Aflknúin dæla</string>
<string name="poi_water_source_water_tank">Vatnstankur</string>
<string name="poi_water_source_tap">Vatnshani</string>
<string name="poi_health_specialty_vaccination_yes">Bólusetning</string>
<string name="poi_ranger_station">Landvarðastöð</string>
<string name="poi_water_source_tube_well">Pípubrunnur</string>
<string name="poi_water_source_water_works">Vatnsvinnsla</string>
<string name="poi_vaccination_covid19">Bólusetning: COVID19</string>
<string name="poi_water_source_well">Brunnur</string>
<string name="poi_weightbridge">Vogarbrú</string>
<string name="poi_water_source_lake">Stöðuvatn</string>
<string name="poi_lavoir">Þvottaþró (þvottaaðstaða)</string>
<string name="poi_water_source_river">Á</string>
<string name="poi_lifeguard_base">Bækistöð öryggisvarða</string>
</resources>

View file

@ -1085,7 +1085,7 @@
<string name="use_kalman_filter_compass">Nota Kalman-síu</string>
<string name="use_magnetic_sensor">Nota segulskynjara</string>
<string name="install_paid">Full útgáfa</string>
<string name="cancel_route">Hafna leið</string>
<string name="cancel_route">Hafna leið\?</string>
<string name="cancel_navigation">Stöðva leiðsögn</string>
<string name="clear_destination">Hreinsa út áfangastað</string>
<string name="choose_osmand_theme_descr">Sérsníddu hvernig forritið lítur út.</string>
@ -1384,7 +1384,7 @@
<string name="replace_favorite_confirmation">Ertu viss að þú viljir skipta út eftirlætinu %1$s?</string>
<string name="confirmation_to_delete_history_items">Fjarlægja valin atriði úr breytingaskránni?</string>
<string name="change_markers_position">Breyta staðsetningu kortamerkis</string>
<string name="access_no_destination">Áfangastaður er ekki stilltur</string>
<string name="access_no_destination">Stillingaviðbót fyrir altækan aðgang: Áfangastaður er ekki stilltur</string>
<string name="map_widget_bearing">Hlutfallsleg stefna</string>
<string name="no_map_markers_found">Bættu við kortamerkjum á kortinu</string>
<string name="anonymous_user_hint">Nafnlausir notendur geta ekki:
@ -1746,7 +1746,7 @@
<string name="incremental_search_building">Stigvaxandi leit byggingar</string>
<string name="poi_error_info_not_loaded">Upplýsingum um hnút var ekki hlaðið inn</string>
<string name="use_fast_recalculation">Snjöll endurreiknun leiðar</string>
<string name="use_fast_recalculation_desc">Endurreiknar aðeins upphafshluta leiðar. Má nota fyrir langar ferðir.</string>
<string name="use_fast_recalculation_desc">Endurreiknar aðeins upphafshluta leiðar, má nota fyrir langar ferðir.</string>
<string name="confirm_download_roadmaps">Kortið sem eingöngu er með vegum er ekki nauðsynlegt, þar sem þú ert þegar með staðlaða (fulla útgáfu) kortsins. Sækja það samt?</string>
<string name="rendering_attr_depthContours_description">Birta dýptarlínur og punkta.</string>
<string name="rendering_attr_depthContours_name">Dýptarlínur sjávar</string>
@ -3429,7 +3429,7 @@
<string name="live_monitoring">Rakning með netstuðningi</string>
<string name="save_track_logging_accuracy">Nákvæmni skráninga</string>
<string name="route_recalculation">Endurreikningur leiðar</string>
<string name="plugin_global_prefs_info">Þessar stillingar eru víðværar og eiga við um öll snið</string>
<string name="plugin_global_prefs_info">Þessar stillingar viðbótarinnar eru víðværar og eiga við um öll snið</string>
<string name="osm_editing">OSM-breytingar</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Táknið birtist þegar leiðsögn er í gangi eða á meðan verið er á ferðinni.</string>
@ -3459,7 +3459,7 @@
<string name="multimedia_photo_play_sound">Hljóð við myndatöku</string>
<string name="osm_authorization_success">Heimild fékkst</string>
<string name="not_support_file_type_with_ext">Veljið studda %1$s kerfisviðaukaskrá í staðinn.</string>
<string name="osm_edits_view_descr">Þú getur skoðað allar óinnsendar breytingar þínar eða villur í OSM í %1$s. Innsendir punktar eru ekki birtir í OsmAnd.</string>
<string name="osm_edits_view_descr">Þú getur skoðað allar óinnsendar breytingar þínar eða villur í OSM í %1$s. Áður innsendir punktar eru ekki lengur birtir.</string>
<string name="monitoring_min_speed_descr_side_effect">Aukaverkanir: Ferilinn þinn mun vanta alla þá hluta þar sem kröfur um lágmarkshraða voru ekki uppfylltar (t.d. þar sem þú ert að ýta hjólinu þínu upp bratta brekku). Að auki verða engar upplýsingar um kyrrstöður, eins og t.d. hvíldarstaði. Þetta hefur áhrif á alla greiningu eða eftirvinnslu, eins og þegar verið er að skilgreina heildarlengd ferðar, tíma á ferðinni eða meðalhraða þinn.</string>
<string name="monitoring_min_speed_descr_recommendation">Ábending: Reyndu fyrst að nota hreyfiskynjun í gegnum síuna sem mælis skráða lágmarkshliðrun (B), hún gæti gefið betri niðurstöður og þú tapar minna af gögnum. Ef ferlarnir þínir eru áfram loðnir við lágan hraða, skaltu prófa hér gildi sem ekki eru núll. Athugaðu að sumar mælingar gætu gefið gildi án hraða (sumar mæliaðferðir sem byggjast á netkerfum), í þeim tilfellum myndi ekkert vera skráð.</string>
<string name="monitoring_min_speed_descr_remark">Athugaðu: ef hraði &gt; 0 skoðaðu: Flest GPS kubbasett gefa aðeins upp hraðagildi ef reikniritið ákvarðar að tækið sé á hreyfingu, en gefa ekki neitt gildi ef svo er ekki. Þar af leiðir að sé notuð stillingin &gt; 0 í þessari síu má segja að sé verið að nota hreyfiskynjunina í GPS kubbasettinu. En jafnvel þó þetta sé ekki síað á meðan skráningu stendur, þá notum við samt þennan eiginleika í greiningu okkar á GPX-ferlinum til að ákvarða leiðrétta vegalengd, þ.e.a.s. gildið sem birtist í þeim reit er einmitt skráð vegalengd á meðan verið er á ferðinni.</string>
@ -3788,7 +3788,7 @@
<string name="quick_action_remove_next_destination">Eyða næsta markpunkti</string>
<string name="navigation_profile">Leiðsagnarsnið</string>
<string name="app_mode_wheelchair_forward">Hjólastóll áfram</string>
<string name="plugin_wikipedia_description">Náðu í upplýsingar um merka staði frá Wikipedia. Þetta er þá orðið að vasaleiðsögn án nettengingar - bara virkjaðu Wikipedia-viðbótina og njóttu þess að geta lesið um hlutina í kringum þig.</string>
<string name="plugin_wikipedia_description">Náðu í upplýsingar um merka staði frá Wikipedia, þetta er þá orðið að vasaleiðsögn án nettengingar.</string>
<string name="use_volume_buttons_as_zoom_descr">Stýrðu aðdráttarstigi korts með hljóðstyrkshnöppum tækisins.</string>
<string name="routing_attr_length_description">Tilgreindu lengd farartækis sem leyfð er á leiðum.</string>
<string name="in_case_of_reverse_direction">Ef stefna er öfug</string>
@ -3840,7 +3840,7 @@
\n</string>
<string name="gpx_split_interval_descr">Veldu bilið þar sem merki með tíma eða vegalengd á ferlinum verða birt.</string>
<string name="attach_to_the_roads">Tengja við vegina</string>
<string name="plan_route_exit_dialog_descr">Ertu viss um að þú viljir loka leiðaskipulagningu án þess að vista\?</string>
<string name="plan_route_exit_dialog_descr">Ertu viss um að þú viljir henda öllum óvistuðum breytingum í skipulögðu leiðinni\?</string>
<string name="marker_save_as_track">Vista sem ferilskrá</string>
<string name="threshold_distance">Þolvik vegalengdar</string>
<string name="save_track_to_gpx_globally">Skrifa feril í GPX-skrá</string>
@ -3850,7 +3850,7 @@
<string name="gpx_split_interval_none_descr">Veldu hvernig þú vilt skipta upp: eftir tíma eða vegalengd.</string>
<string name="shared_string_save_as_gpx">Vista sem nýja ferilskrá</string>
<string name="follow_track_descr">Veldu ferilskrá til að fylgja</string>
<string name="quick_action_remove_next_destination_descr">Puntinum á núverandi áfangastað leiðarinnar verður eytt. Ef þetta er sjálfur áfangastaðurinn, mun leiðsögn stöðvast.</string>
<string name="quick_action_remove_next_destination_descr">Eyðir næsta áfangastað leiðarinnar. Ef þetta er sjálfur áfangastaðurinn, mun leiðsögn stöðvast.</string>
<string name="delete_address">Eyða heimilisfangi</string>
<string name="layer_gpx_layer">Ferlar</string>
<string name="start_of_the_track">Upphaf ferils</string>
@ -3910,7 +3910,7 @@
<string name="clear_osm_token">Hreinsa OAuth-teikn OpenStreetMap</string>
<string name="osm_edit_logout_success">Skráð út</string>
<string name="number_of_gpx_files_selected_pattern">%s GPX-skrár valdar</string>
<string name="disable_recording_once_app_killed_descrp">Mun setja GPX-skráningu í bið þegar forritið er drepið (slökkt á því í gegnum skjáinn fyrir nýleg forrit - bakgrunnsvísir OsmAnd hverfur þar með úr tilkynningastiku Android-kerfisins.)</string>
<string name="disable_recording_once_app_killed_descrp">GPX-skráning er sett í bið þegar forritið er drepið (slökkt á því í gegnum skjáinn fyrir nýleg forrit - bakgrunnsvísir OsmAnd hverfur þar með úr tilkynningastiku Android-kerfisins.)</string>
<string name="save_global_track_interval_descr">Veldu millibil skráninga í almenna leiðarskráningu (virkjað með viðmótshlutanum \'Skráning ferðar\' á kortinu).</string>
<string name="gpx_monitoring_stop">Setja skráningu í bið</string>
<string name="gpx_monitoring_start">Halda áfram með skráningu</string>
@ -3929,10 +3929,10 @@
\n • Lagfærð vandamál við inn/útflutning á stillingum sniða
\n
\n</string>
<string name="message_graph_will_be_available_after_recalculation">Bíddu eftir endurútreikningi leiðar.
<string name="message_graph_will_be_available_after_recalculation">Bíddu aðeins.
\nGrafið verður tiltækt eftir endurútreikning.</string>
<string name="snowmobile_render_descr">Fyrir akstur vélsleða á sérstökum vegum og slóðum.</string>
<string name="message_need_calculate_route_before_show_graph">%1$s gögn aðeins tiltæk á vegunum, þú þarft að reikna leið með “Leið milli punkta” til að fá hana.</string>
<string name="message_need_calculate_route_before_show_graph">%1$s gögn aðeins tiltæk á vegunum, þú þarft að reikna leið með “Leið milli punkta” til að sjá gröf.</string>
<string name="file_already_imported">Skrá hefur þegar verið flutt inn í OsmAnd</string>
<string name="app_mode_gap">Bil</string>
<string name="contour_lines_thanks">Takk fyrir að kaupa \'Hæðarlínur\'</string>
@ -3957,7 +3957,7 @@
<string name="open_street_map_login_mode">Þú þarft að skrá þig inn til að geta sent inn ný atriði eða breytingar.
\n
\nÞú getur skráð þig inn með öruggu OAuth-aðferðinni eða notað notandanafn og lykilorð innskráningar.</string>
<string name="subscription_payment_issue_title">Það er vandamál með áskriftina þína. Smelltu á hnappinn til að fara í stillingar Google Play áskriftarinnar og laga þar greiðslumátann.</string>
<string name="subscription_payment_issue_title">Smelltu á hnappinn til að setja upp greiðslumáta á Google Play áskriftarinnar og laga þar áskriftina þína.</string>
<string name="use_login_password">Nota notandanafn og lykilorð</string>
<string name="login_open_street_map">Skrá inn á OpenStreetMap</string>
<string name="user_login">Skrá inn</string>
@ -3969,7 +3969,7 @@
<string name="login_account">Notandaaðgangur</string>
<string name="login_open_street_map_org">Skrá inn á OpenStreetMap.org</string>
<string name="markers_history">Vinnsluferill kortamerkja</string>
<string name="message_you_need_add_two_points_to_show_graphs">Þú þarft að bæta við a.m.k. tveimur punktum</string>
<string name="message_you_need_add_two_points_to_show_graphs">Bættu við a.m.k. tveimur punktum</string>
<string name="navigate_point_mgrs">MGRS</string>
<string name="subscription_paused_title">Áskrift að OsmAnd Live hefur verið sett í bið</string>
<string name="mgrs_format_descr">OsmAnd notar MGRS, sem er svipað og UTM-snið NATO.</string>
@ -3988,7 +3988,7 @@
<string name="register_opr_create_new_account">Búa til nýjan notandaaðgang</string>
<string name="osm_login_descr">Þú getur skráð þig inn með öruggu OAuth-aðferðinni eða notað notandanafn og lykilorð innskráningar.</string>
<string name="app_mode_motorboat">Vélbátar</string>
<string name="register_on_openplacereviews_desc">Ljósmyndir eru í boði frá opna gagnaverkefninu OpenPlaceReviews.org. Til að geta sent inn myndir þarftu að skrá þig á vefsvæðinu.</string>
<string name="register_on_openplacereviews_desc">Ljósmyndir eru í boði frá opna gagnaverkefninu OpenPlaceReviews.org. Til að geta sent inn myndir þarftu að skrá þig á vefsvæðinu þeirra.</string>
<string name="osm_edit_comment_note">Gera athugasemd við OSM-minnispunkt</string>
<string name="gpx_upload_trackable_visibility_descr">\"Rekjanlegt\" þýðir að ferillinn birtist ekki á neinum opinberum listum, en meðhöndlaðir ferilpunktar með tímamerkjum úr ferlinum (sem ekki er hægt að tengja beint við þig) munu birtast í gögnum sem eru sótt í gegnum opinbert GPS API-forritsviðmót.</string>
<string name="elevation_data">Þú getur notað hæðargögn til útreikninga á hækkun/lækkun í ferðunum þínum</string>
@ -4013,4 +4013,20 @@
<string name="select_data_to_export">Veldu þau gögn sem á að flytja út í skrána.</string>
<string name="select_picture">Veldu mynd</string>
<string name="cannot_upload_image">Mistókst að senda inn mynd, reyndu aftur síðar</string>
<string name="release_3_9">• Bætt við möguleika á að flytja út og inn öll gögn, þar með talið stillingar, tilföng, staðir
\n
\n • Skipulagning leiða: gröf ferilbúta með leið, bætt við möguleika á að búa til og breyta mörgum ferilbútum
\n
\n • Bætt við OAuth-auðkenningarleið fyrir OpenStreetMap, endurbætt viðmót valglugga í OSM
\n
\n • Stuðningur við sérsniðna liti í eftirlætum og ferilpunktum
\n
\n</string>
<string name="plan_route_join_segments">Sameina búta</string>
<string name="plan_route_split_after">Skipta upp á eftir</string>
<string name="plan_route_add_new_segment">Bæta við nýjum bút</string>
<string name="plan_route_split_before">Skipta upp á undan</string>
<string name="profile_type_user_string">Notandasnið</string>
<string name="reverse_all_points">Snúa við öllum punktum</string>
<string name="profile_type_osmand_string">OsmAnd-snið</string>
</resources>

View file

@ -2190,24 +2190,77 @@
<string name="poi_traffic_signals_arrow">חץ</string>
<string name="poi_traffic_signals_vibration">רטט</string>
<string name="poi_fire_hydrant_pressure_filter">לחץ</string>
<string name="poi_recreation_center"></string>
<string name="poi_summer_camp"></string>
<string name="poi_salt_no"></string>
<string name="poi_salt_yes"></string>
<string name="poi_depth"></string>
<string name="poi_bicycle_parking_tree"></string>
<string name="poi_bicycle_parking_lockers"></string>
<string name="poi_military_checkpoint"></string>
<string name="poi_street_cabinet_street_lighting"></string>
<string name="poi_street_cabinet_water_management"></string>
<string name="poi_street_cabinet_waste"></string>
<string name="poi_street_cabinet_postal_service"></string>
<string name="poi_street_cabinet_gas"></string>
<string name="poi_street_cabinet_cable_tv"></string>
<string name="poi_street_cabinet_telecom"></string>
<string name="poi_street_cabinet_power"></string>
<string name="poi_in_service_yes"></string>
<string name="poi_water_source_stream"></string>
<string name="poi_water_source_pond"></string>
<string name="poi_water_source_main"></string>
<string name="poi_recreation_center">אתר נופש</string>
<string name="poi_summer_camp">מחנה קיץ</string>
<string name="poi_salt_no">מלח: אין</string>
<string name="poi_salt_yes">מלח</string>
<string name="poi_depth">עומק</string>
<string name="poi_bicycle_parking_tree">עץ אופניים</string>
<string name="poi_bicycle_parking_lockers">תאים</string>
<string name="poi_military_checkpoint">נקודת בידוק צבאית</string>
<string name="poi_street_cabinet_street_lighting">סוג ארון: תאורת רחוב</string>
<string name="poi_street_cabinet_water_management">סוג ארון: ניהול מים</string>
<string name="poi_street_cabinet_waste">סוג ארון: פסולת</string>
<string name="poi_street_cabinet_postal_service">סוג ארון: שירות דואר</string>
<string name="poi_street_cabinet_gas">סוג ארון: גז</string>
<string name="poi_street_cabinet_cable_tv">סוג ארון: טלוויזיה בכבלים</string>
<string name="poi_street_cabinet_telecom">סוג ארון: תקשורת</string>
<string name="poi_street_cabinet_power">סוג ארון: חשמל</string>
<string name="poi_in_service_yes">מספק שירות: כן</string>
<string name="poi_water_source_stream">זרם מים</string>
<string name="poi_water_source_pond">בריכה</string>
<string name="poi_water_source_main">ראשי</string>
<string name="poi_route_trolleybus_ref">טרוליבוס</string>
<string name="poi_route_share_taxi_ref">מונית שירות</string>
<string name="poi_route_bus_ref">אוטובוס</string>
<string name="poi_surface_snow">פני השטח: שלג</string>
<string name="poi_surface_salt">פני השטח: מלח</string>
<string name="poi_nuclear_explosion_series">סדרת פיצוצים</string>
<string name="poi_nuclear_explosion_date_utc">תאריך הפיצוץ (UTC)</string>
<string name="poi_nuclear_explosion_type_underwater">סוג פיצוץ: תת־ימי</string>
<string name="poi_nuclear_explosion_type_underground">סוג פיצוץ: תת־קרקעי</string>
<string name="poi_service_bicycle_cleaning_no">ניקוי אופניים: אין</string>
<string name="poi_service_bicycle_cleaning_yes">ניקוי</string>
<string name="poi_service_bicycle_diy_no">כלים לתיקון עצמי של אופניים: אין</string>
<string name="poi_service_bicycle_diy_yes">כלים לתיקון עצמי</string>
<string name="poi_service_bicycle_pump_no">משאבת אופניים: אין</string>
<string name="poi_service_bicycle_pump_yes">משאבה</string>
<string name="poi_service_bicycle_rental_no">השכרת אופניים: לא</string>
<string name="poi_service_bicycle_rental_yes">השכרה</string>
<string name="poi_service_bicycle_repair_no">תיקון אופניים: לא</string>
<string name="poi_service_bicycle_repair_yes">תיקון</string>
<string name="poi_service_bicycle_retail_no">קמעונאות אופניים: לא</string>
<string name="poi_service_bicycle_retail_yes">קמעונאי</string>
<string name="poi_shop_additional_yes">עם חנות</string>
<string name="poi_surveillance_yes">מעקב: יש</string>
<string name="poi_historic_yes">פריט היסטורי</string>
<string name="poi_route_subway_ref">רכבת תחתית</string>
<string name="poi_route_ferry_ref">מעבורת</string>
<string name="poi_route_funicular_ref">פוניקולר</string>
<string name="poi_route_monorail_ref">מונורייל</string>
<string name="poi_route_light_rail_ref">רכבת קלה</string>
<string name="poi_route_train_ref">רכבת</string>
<string name="poi_route_tram_ref">חשמלית</string>
<string name="poi_industrial_brickyard">סוג: ייצור לבנים</string>
<string name="poi_industrial_brewery">סוג: מבשלה</string>
<string name="poi_industrial_auto_wrecker">סוג: רכבים לפירוק</string>
<string name="poi_industrial_warehouse">סוג: מחסן</string>
<string name="poi_industrial_refinery">סוג: מזקקה</string>
<string name="poi_industrial_timber">סוג: עץ</string>
<string name="poi_industrial_gas">סוג: תעשיית הגז</string>
<string name="poi_industrial_factory">סוג: מפעל</string>
<string name="poi_industrial_wellsite">סוג: wellsite</string>
<string name="poi_industrial_oil">סוג: תעשיית הדלק</string>
<string name="poi_training_hairdressing">הכשרה: עיצוב שיער</string>
<string name="poi_training_aviation">הכשרה: תעופה</string>
<string name="poi_training_yoga">הכשרה: יוגה</string>
<string name="poi_training_computer">הכשרה: מחשבים</string>
<string name="poi_training_cooking">הכשרה: בישול</string>
<string name="poi_training_art">הכשרה: אומנות</string>
<string name="poi_training_sport">הכשרה: ספורט</string>
<string name="poi_training_dance">הכשרה: ריקוד</string>
<string name="poi_training_music">הכשרה: מוזיקה</string>
<string name="poi_training_language">הכשרה: שפה</string>
<string name="poi_training_martial_art">הכשרה: אומנות לחימה</string>
<string name="poi_industrial_agriculture">סוג: חקלאות</string>
</resources>

View file

@ -3561,7 +3561,7 @@
<string name="shared_string_rhomb">מעויני</string>
<string name="shared_string_square">ריבועי</string>
<string name="shared_string_min">מזערי</string>
<string name="osm_edits_view_descr">ניתן לצפות בכל העריכות או בתקלות ב־OSM שטרם הועלו תחת %1$s. נקודות שהועלו לא מופיעות ב־OsmAnd.</string>
<string name="osm_edits_view_descr">ניתן לצפות בכל העריכות או בתקלות ב־OSM שטרם הועלו תחת %1$s. שינויים שהועלו לא יופיעו עוד.</string>
<string name="hillshade_description">מפת הצללה עם צבעי הצללה כהים כדי להדגיש מדרונות, פסגות ועמקים.</string>
<string name="shared_string_octagon">מתומן</string>
<string name="multimedia_notes_view_descr">הערות ה־OSM שלך הן תחת %1$s.</string>
@ -3800,7 +3800,7 @@
<string name="lenght_limit_description">נא לספק את אורך כלי הרכב שלך, מגבלות מסלול מסוימות עשויות לחול על כלי רכב ארוכים.</string>
<string name="quick_action_remove_next_destination">מחיקת נקודת היעד הקרובה ביותר</string>
<string name="please_provide_point_name_error">נא לספק שם לנקודה</string>
<string name="quick_action_remove_next_destination_descr">נקודת היעד הנוכחית במסלול תימחק. אם זה יהיה היעד, הניווט ייעצר.</string>
<string name="quick_action_remove_next_destination_descr">מוחק את נקודת היעד הבאה במסלול שלך. אם זו נקודת היעד, הניווט ייפסק.</string>
<string name="search_download_wikipedia_maps">הורדת מפות ויקיפדיה</string>
<string name="plugin_wikipedia_description">קבלת מידע על נקודות עניין מוויקיפדיה. מדריך הכיס הפרטי שלך - עליך פשוט להפעיל את התוסף של ויקיפדיה וליהנות מערכים על מה שסביבך.</string>
<string name="app_mode_enduro_motorcycle">אופנוע שטח</string>
@ -3877,7 +3877,7 @@
<string name="simplified_track_description">רק קו המסלול יישמר, נקודות הדרך תימחקנה.</string>
<string name="shared_string_file_name">שם קובץ</string>
<string name="number_of_gpx_files_selected_pattern">%s קובצי מסלול נבחרו</string>
<string name="disable_recording_once_app_killed_descrp">רישום ה־GPX יושהה כאשר היישומון ייסגר (דרך היישומונים האחרונים). (התראות הרקע של OsmAnd תיעלמנה מסרגל ההודעות של Android.)</string>
<string name="disable_recording_once_app_killed_descrp">תיעוד המסלול יושהה כאשר היישומון ייסגר (דרך היישומונים האחרונים). (התראות הרקע של OsmAnd תיעלמנה מסרגל ההודעות של Android.)</string>
<string name="gpx_monitoring_stop">להשהות הקלטת מסלול</string>
<string name="gpx_monitoring_start">להמשיך בהקלטת המסלול</string>
<string name="system_default_theme">בררת המחדל של המערכת</string>
@ -3914,11 +3914,11 @@
<string name="routing_attr_avoid_footways_description">הימנעות משבילי הולכי רגל</string>
<string name="routing_attr_avoid_footways_name">הימנעות משבילי הולכי רגל</string>
<string name="osm_live_payment_desc_hw">המינוי חויב לתקופה הנבחרת. ניתן לבטל דרך ה־AppGallery בכל עת.</string>
<string name="osm_live_payment_subscription_management_hw">התשלום יחויב דרך חשבון ה־AppGallery שלך עם אישור הרכישה.
<string name="osm_live_payment_subscription_management_hw">חשבון ה־AppGallery שלך יחויב עם אישור הרכישה.
\n
\nהמינוי מתחדש אוטומטי אלא אם כן בוטל בטרם תאריך החידוש. החשבון שלך יחויב על תקופת החידוש (חודש/שלושה חודשים/שנה) רק בתאריך החידוש.
\nתוקף המינוי מתארך אוטומטי אלא אם כן בוטל בטרם תאריך החידוש. החשבון שלך יחויב על תקופת החידוש (חודש/שלושה חודשים/שנה) רק בתאריך החידוש.
\n
\nניתן לנהל ולבטל את המינויים שלך דרך ההגדרות ב־AppGallery שלך.</string>
\nניתן לנהל ולבטל את המינויים שלך בהגדרות ב־AppGallery שלך.</string>
<string name="what_is_new">מה חדש</string>
<string name="development">פיתוח</string>
<string name="use_live_public_transport">נתוני זמן אמת של OsmAnd</string>
@ -4020,5 +4020,7 @@
\n</string>
<string name="profile_type_osmand_string">פרופיל</string>
<string name="profile_type_user_string">פרופיל</string>
<string name="reverse_all_points">להפוך את כל</string>
<string name="reverse_all_points">להפוך את כל הנקודות</string>
<string name="profile_by_default_description">נא לבחור את הפרופיל בו יעשה שימוש עם הפעלת היישומון.</string>
<string name="shared_string_last_used">שימוש אחרון</string>
</resources>

View file

@ -3896,4 +3896,5 @@
<string name="poi_water_source_tube_well">Bem embalado</string>
<string name="poi_weightbridge">Balança</string>
<string name="poi_ranger_station">Posto de guarda florestal</string>
<string name="poi_waste_transfer_station">Estação de transferência de resíduos</string>
</resources>

View file

@ -4013,4 +4013,5 @@
<string name="plan_route_add_new_segment">Adicionar novo segmento</string>
<string name="profile_type_osmand_string">Perfil do OsmAnd</string>
<string name="profile_type_user_string">Perfil de usuário</string>
<string name="reverse_all_points">Reverter todos os pontos</string>
</resources>

View file

@ -3871,4 +3871,11 @@
<string name="poi_lifeguard_base">Base de salva-vidas</string>
<string name="poi_vaccination_covid19">Vacinação: COVID19</string>
<string name="poi_health_specialty_vaccination_yes">Vacinação</string>
<string name="poi_waste_transfer_station">Estação de transferência de resíduos</string>
<string name="poi_weightbridge">Ponte de peso</string>
<string name="poi_water_source_lake">Lago</string>
<string name="poi_water_source_river">Rio</string>
<string name="poi_water_source_water_tank">Tanque de água</string>
<string name="poi_water_source_tap">Torneira</string>
<string name="poi_water_source_water_works">Estação de tratamento de água</string>
</resources>

View file

@ -3881,4 +3881,9 @@
<string name="poi_water_source_tap">Нажмите</string>
<string name="poi_water_source_water_works">Водозабор</string>
<string name="poi_water_source_tube_well">Трубчатый колодец</string>
<string name="poi_mobile_money_agent">Мобильный платёжный офис</string>
<string name="poi_weightbridge">Весовая платформа</string>
<string name="poi_lavoir">Умывальник</string>
<string name="poi_waste_transfer_station">Станция перекачки отходов</string>
<string name="poi_ranger_station">Станция рейнджеров</string>
</resources>

View file

@ -1819,7 +1819,7 @@
<string name="routing_attr_height_name">Предельная высота</string>
<string name="routing_attr_height_description">Укажите высоту транспортного средства для учёта при построении маршрута.</string>
<string name="use_fast_recalculation">Умный пересчёт маршрута</string>
<string name="use_fast_recalculation_desc">Пересчитывается только начальная часть маршрута. Может использоваться для дальних поездок.</string>
<string name="use_fast_recalculation_desc">Пересчитывается только начальная часть маршрута. Полезно для дальних поездок.</string>
<string name="osm_edit_context_menu_delete">Удалить правки OSM</string>
<string name="rendering_value_disabled_name">Выключено</string>
<string name="rendering_value_walkingRoutesScopeOSMC_name">Раскраска по сетевой принадлежности</string>
@ -2169,7 +2169,7 @@
<string name="access_disable_offroute_recalc_descr">Предотвращает пересчёт маршрута после того, как вы из него вышли.</string>
<string name="access_disable_wrong_direction_recalc">Не пересчитывать маршрут при обратном направлении движения</string>
<string name="access_disable_wrong_direction_recalc_descr">Предотвращает автоматический пересчёт маршрута при обратном направлении движения.</string>
<string name="access_no_destination">Пункт назначения не задан</string>
<string name="access_no_destination">Плагин специальных возможностей: пункт назначения не задан</string>
<string name="access_direction_audio_feedback">Озвучивать направление</string>
<string name="access_direction_audio_feedback_descr">Индицировать звуком направление на целевую точку.</string>
<string name="access_direction_haptic_feedback">Тактильная индикация направления</string>
@ -3505,7 +3505,7 @@
<string name="login_and_pass">Имя пользователя и пароль</string>
<string name="plugin_global_prefs_info">Эти настройки плагина применяются ко всем профилям</string>
<string name="osm_editing">Редактирование OSM</string>
<string name="osm_edits_view_descr">Здесь отображаются ваши правки и ошибки OSM, ещё не отправленные в %1$s. Отправленные точки не будут отображаться.</string>
<string name="osm_edits_view_descr">Здесь отображаются ваши правки и ошибки OSM, ещё не отправленные в %1$s. Отправленные изменения не отображаются.</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Значок, отображаемый во время навигации или движения.</string>
<string name="select_map_icon_descr">Значок, отображаемый в состоянии покоя.</string>
@ -3905,7 +3905,7 @@
<string name="contour_lines_thanks">Спасибо за покупку \'Контурных линий\'</string>
<string name="routing_attr_avoid_footways_description">Избегать пешеходных дорожек</string>
<string name="routing_attr_avoid_footways_name">Избегать пешеходных дорожек</string>
<string name="osm_live_payment_desc_hw">Подписка взимается за выбранный период. Отмените её в AppGallery в любое время.</string>
<string name="osm_live_payment_desc_hw">Подписка оплачивается за выбранный период. Отмените её в AppGallery в любое время.</string>
<string name="osm_live_payment_subscription_management_hw">Оплата будет снята с вашей учётной записи AppGallery при подтверждении покупки.
\n
\nПодписка продлевается автоматически, если она не будет отменена до даты продления. С вашего счёта будет взиматься плата за период продления (месяц/три месяца/год) только в дату продления.
@ -3941,7 +3941,7 @@
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="mgrs_format_descr">OsmAnd использует MGRS, который похож на формат UTM NATO.</string>
<string name="use_native_pt">Развитие местного общественного транспорта</string>
<string name="message_you_need_add_two_points_to_show_graphs">Нужно добавить не менее двух точек</string>
<string name="message_you_need_add_two_points_to_show_graphs">Добавьте не менее двух точек</string>
<string name="message_need_calculate_route_before_show_graph">Данные %1$s доступны только для дорог, нужно рассчитать маршрут с помощью «Маршрут между точками».</string>
<string name="enter_text_separated">Вводите теги через запятую.</string>
<string name="use_native_pt_desc">Перейти на расчёт маршрутов общественного транспорта с помощью Java (safe)</string>
@ -3974,7 +3974,7 @@
<string name="add_photos_descr">OsmAnd показывает фотографии из нескольких источников:
\nOpenPlaceReviews — фотогорафии POI;
\nMapillary — изображения улиц;
\nWeb / Wikimedia — фотографии POI, указанные в данных OpenStreetMap.</string>
\nWeb / Wikimedia — фотографии POI по данным OpenStreetMap.</string>
<string name="shared_string_resources">Ресурсы</string>
<string name="approximate_file_size">Примерный размер файла</string>
<string name="file_size_needed_for_import">Требуется для импорта</string>
@ -3985,10 +3985,10 @@
<string name="select_items_for_import">Выберите импортируемые элементы.</string>
<string name="use_dev_url">Использовать dev.openstreetmap.org</string>
<string name="osm_login_descr">Можно войти в систему с помощью безопасного метода OAuth или используя свои имя пользователя и пароль.</string>
<string name="subscription_payment_issue_title">Возникла проблема с подпиской. Нажмите кнопку, чтобы перейти к настройкам подписки Google Play и исправить способ оплаты.</string>
<string name="subscription_payment_issue_title">Нажмите кнопку, чтобы перейти к настройкам подписки Google Play и исправить способ оплаты.</string>
<string name="osm_edit_comment_note">Комментировать заметку OSM</string>
<string name="use_dev_url_descr">Переключиться на использование dev.openstreetmap.org вместо openstreetmap.org для тестирования отправки заметок OSM / POI / GPX.</string>
<string name="register_on_openplacereviews_desc">Фотографии предоставлены проектом открытых данных OpenPlaceReviews.org. Чтобы отправить свои фотографии, необходимо зарегистрироваться на сайте.</string>
<string name="register_on_openplacereviews_desc">Фотографии предоставлены проектом открытых данных OpenPlaceReviews.org. Чтобы отправить свои фотографии, необходимо зарегистрироваться на этом сайте.</string>
<string name="cannot_upload_image">Невозможно отправить изображение, попробуйте позже</string>
<string name="select_picture">Выбор изображения</string>
<string name="app_mode_kayak">Каяк</string>
@ -3999,4 +3999,6 @@
<string name="plan_route_join_segments">Объединить сегменты</string>
<string name="plan_route_split_before">Разделить до</string>
<string name="plan_route_split_after">Разделить после</string>
<string name="profile_type_user_string">Профиль пользователя</string>
<string name="profile_type_osmand_string">Профиль OsmAnd</string>
</resources>

View file

@ -4018,4 +4018,5 @@
\n</string>
<string name="profile_type_osmand_string">Profil OsmAnd</string>
<string name="profile_type_user_string">Profil používateľa</string>
<string name="reverse_all_points">Otočiť všetky body</string>
</resources>

View file

@ -3974,4 +3974,6 @@
<string name="profile_type_osmand_string">OsmAnd profili</string>
<string name="profile_type_user_string">Kullanıcı profili</string>
<string name="reverse_all_points">Tüm noktaları tersine çevir</string>
<string name="profile_by_default_description">Uygulama başlangıcında kullanılacak profili seçin.</string>
<string name="shared_string_last_used">Son kullanılan</string>
</resources>

View file

@ -4015,4 +4015,6 @@
<string name="profile_type_osmand_string">Профіль OsmAnd</string>
<string name="profile_type_user_string">Профіль користувача</string>
<string name="reverse_all_points">Повернути назад всі точки</string>
<string name="profile_by_default_description">Виберіть профіль, який застосовуватиметься під час запуску.</string>
<string name="shared_string_last_used">Востаннє використовувалось</string>
</resources>

View file

@ -3895,4 +3895,6 @@
<string name="poi_water_source_tube_well">管井</string>
<string name="poi_weightbridge">地磅</string>
<string name="poi_ranger_station">護林員站</string>
<string name="poi_lavoir">公共洗衣區</string>
<string name="poi_waste_transfer_station">垃圾站</string>
</resources>

View file

@ -4013,4 +4013,5 @@
\n</string>
<string name="profile_type_osmand_string">OsmAnd 設定檔</string>
<string name="profile_type_user_string">使用者設定檔</string>
<string name="reverse_all_points">反轉所有點</string>
</resources>

View file

@ -11,6 +11,10 @@
Thx - Hardy
-->
<string name="routing_attr_prefer_hiking_routes_name">Prefer hiking routes</string>
<string name="routing_attr_prefer_hiking_routes_description">Prefer hiking routes</string>
<string name="shared_string_last_used">Last used</string>
<string name="profile_by_default_description">Select the profile, that will be used on application start.</string>
<string name="reverse_all_points">Reverse all points</string>
<string name="release_3_9">
• Added option to export and import all data including settings, resources, my places\n\n

View file

@ -4,9 +4,10 @@
xmlns:tools="http://schemas.android.com/tools"
android:title="@string/osmand_settings">
<net.osmand.plus.settings.preferences.ListPreferenceEx
android:icon="@drawable/ic_world_globe_dark"
<Preference
android:key="default_application_mode_string"
android:icon="@drawable/ic_world_globe_dark"
android:persistent="false"
android:layout="@layout/preference_with_descr"
android:title="@string/settings_preset" />

View file

@ -80,6 +80,7 @@ import net.osmand.plus.routing.IRoutingDataUpdateListener;
import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
import net.osmand.plus.routing.RouteDirectionInfo;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelperUtils;
import net.osmand.plus.routing.VoiceRouter;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.ApplicationMode.ApplicationModeBean;
@ -1803,7 +1804,7 @@ public class OsmandAidlApi {
if (ni.directionInfo != null && ni.directionInfo.getTurnType() != null) {
TurnType tt = ni.directionInfo.getTurnType();
RouteDirectionInfo a = ni.directionInfo;
bundle.putString(prefix + PARAM_NT_DIRECTION_NAME, RoutingHelper.formatStreetName(a.getStreetName(), a.getRef(), a.getDestinationName(), ""));
bundle.putString(prefix + PARAM_NT_DIRECTION_NAME, RoutingHelperUtils.formatStreetName(a.getStreetName(), a.getRef(), a.getDestinationName(), ""));
bundle.putString(prefix + PARAM_NT_DIRECTION_TURN, tt.toXmlString());
bundle.putFloat(prefix + PARAM_NT_DIRECTION_ANGLE, tt.getTurnAngle());
bundle.putBoolean(prefix + PARAM_NT_DIRECTION_POSSIBLY_LEFT, tt.isPossibleLeftTurn());
@ -2365,7 +2366,7 @@ public class OsmandAidlApi {
if (!ApplicationMode.values(app).contains(appMode)) {
ApplicationMode.changeProfileAvailability(appMode, true, app);
}
app.getSettings().APPLICATION_MODE.set(appMode);
app.getSettings().setApplicationMode(appMode);
}
});
return true;
@ -2395,7 +2396,7 @@ public class OsmandAidlApi {
public boolean addRoadBlock(ABlockedRoad road) {
LatLon latLon = new LatLon(road.getLatitude(), road.getLongitude());
app.getAvoidSpecificRoads().addImpassableRoad(null, latLon, false, false, null);
app.getAvoidSpecificRoads().addImpassableRoad(null, latLon, false, false, road.getAppModeKey());
return true;
}

View file

@ -419,10 +419,10 @@ public class AppInitializer implements IProgress {
if (osmandSettings.FOLLOW_THE_ROUTE.get()) {
ApplicationMode savedMode = osmandSettings.readApplicationMode();
if (!osmandSettings.APPLICATION_MODE.get().getStringKey().equals(savedMode.getStringKey())) {
osmandSettings.APPLICATION_MODE.set(savedMode);
osmandSettings.setApplicationMode(savedMode);
}
} else {
osmandSettings.APPLICATION_MODE.set(osmandSettings.DEFAULT_APPLICATION_MODE.get());
osmandSettings.setApplicationMode(osmandSettings.DEFAULT_APPLICATION_MODE.get());
}
startTime = System.currentTimeMillis();
getLazyRoutingConfig();

View file

@ -258,7 +258,7 @@ public class ContextMenuAdapter {
@Override
public void onClick(View view) {
if (selected.size() > 0) {
app.getSettings().APPLICATION_MODE.set(selected.iterator().next());
app.getSettings().setApplicationMode(selected.iterator().next());
notifyDataSetChanged();
}
if (changeAppModeListener != null) {

View file

@ -39,7 +39,7 @@ import net.osmand.data.LatLon;
import net.osmand.data.QuadPoint;
import net.osmand.plus.TargetPointsHelper.TargetPoint;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelper.RouteSegmentSearchResult;
import net.osmand.plus.routing.RouteSegmentSearchResult;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.router.RouteSegmentResult;
@ -154,7 +154,7 @@ public class OsmAndLocationProvider implements SensorEventListener {
startLocation.setTime(ms);
}
RouteSegmentSearchResult searchResult =
RoutingHelper.searchRouteSegment(currentLocation.getLatitude(), currentLocation.getLongitude(), -1, roads);
RouteSegmentSearchResult.searchRouteSegment(currentLocation.getLatitude(), currentLocation.getLongitude(), -1, roads);
if (searchResult != null) {
currentRoad = searchResult.getRoadIndex();
currentSegment = searchResult.getSegmentIndex();

View file

@ -64,6 +64,7 @@ import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.inapp.InAppPurchaseHelper;
import net.osmand.plus.mapmarkers.MapMarkersDbHelper;
import net.osmand.plus.mapmarkers.MapMarkersHelper;
import net.osmand.plus.measurementtool.MeasurementEditingContext;
import net.osmand.plus.monitoring.LiveMonitoringHelper;
import net.osmand.plus.osmedit.oauth.OsmOAuthHelper;
import net.osmand.plus.poi.PoiFiltersHelper;
@ -156,6 +157,7 @@ public class OsmandApplication extends MultiDexApplication {
GpxDbHelper gpxDbHelper;
QuickActionRegistry quickActionRegistry;
OsmOAuthHelper osmOAuthHelper;
MeasurementEditingContext measurementEditingContext;
private Resources localizedResources;
private Map<String, Builder> customRoutingConfigs = new ConcurrentHashMap<>();
@ -465,6 +467,14 @@ public class OsmandApplication extends MultiDexApplication {
return routingHelper;
}
public MeasurementEditingContext getMeasurementEditingContext() {
return measurementEditingContext;
}
public void setMeasurementEditingContext(MeasurementEditingContext context) {
this.measurementEditingContext = context;
}
public TransportRoutingHelper getTransportRoutingHelper() {
return transportRoutingHelper;
}
@ -537,7 +547,7 @@ public class OsmandApplication extends MultiDexApplication {
routingHelper.clearCurrentRoute(null, new ArrayList<LatLon>());
routingHelper.setRoutePlanningMode(false);
osmandSettings.LAST_ROUTING_APPLICATION_MODE = osmandSettings.APPLICATION_MODE.get();
osmandSettings.APPLICATION_MODE.set(osmandSettings.DEFAULT_APPLICATION_MODE.get());
osmandSettings.setApplicationMode(osmandSettings.DEFAULT_APPLICATION_MODE.get());
targetPointsHelper.removeAllWayPoints(false, false);
}

View file

@ -12,6 +12,7 @@ import net.osmand.data.PointDescription;
import net.osmand.plus.GeocodingLookupService.AddressLookupRequest;
import net.osmand.plus.routing.RouteProvider.RouteService;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelperUtils;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener;
import net.osmand.plus.settings.backend.OsmandSettings;
@ -444,7 +445,7 @@ public class TargetPointsHelper {
Location lastKnownLocation = ctx.getLocationProvider().getLastKnownLocation();
LatLon latLon = lastKnownLocation != null ?
new LatLon(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude()) : null;
routingHelper.checkAndUpdateStartLocation(latLon);
RoutingHelperUtils.checkAndUpdateStartLocation(ctx, latLon);
setMyLocationPoint(latLon, false, null);
}
}

View file

@ -126,7 +126,7 @@ import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu;
import net.osmand.plus.routepreparationmenu.MapRouteInfoMenuFragment;
import net.osmand.plus.routing.IRouteInformationListener;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelper.RouteCalculationProgressCallback;
import net.osmand.plus.routing.RouteCalculationProgressCallback;
import net.osmand.plus.routing.TransportRoutingHelper.TransportRouteCalculationProgressCallback;
import net.osmand.plus.search.QuickSearchDialogFragment;
import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchTab;
@ -553,7 +553,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
allowPrivate.setModeValue(mode, true);
}
}
getRoutingHelper().recalculateRouteDueToSettingsChange();
getRoutingHelper().onSettingsChanged(null, true);
}
});
dlg.setNegativeButton(R.string.shared_string_no, null);

View file

@ -63,6 +63,7 @@ import net.osmand.plus.measurementtool.MeasurementToolFragment;
import net.osmand.plus.measurementtool.StartPlanRouteBottomSheet;
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
import net.osmand.plus.osmedit.dialogs.DismissRouteBottomSheetFragment;
import net.osmand.plus.profiles.ProfileDataUtils;
import net.osmand.plus.profiles.RoutingProfileDataObject;
import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu;
import net.osmand.plus.routepreparationmenu.WaypointsFragment;
@ -121,7 +122,6 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_S
import static net.osmand.plus.ContextMenuAdapter.PROFILES_CHOSEN_PROFILE_TAG;
import static net.osmand.plus.ContextMenuAdapter.PROFILES_CONTROL_BUTTON_TAG;
import static net.osmand.plus.ContextMenuAdapter.PROFILES_NORMAL_PROFILE_TAG;
import static net.osmand.plus.settings.fragments.NavigationFragment.getRoutingProfiles;
public class MapActivityActions implements DialogProvider {
@ -555,7 +555,7 @@ public class MapActivityActions implements DialogProvider {
TargetPointsHelper targets = app.getTargetPointsHelper();
ApplicationMode mode = appMode != null ? appMode : getRouteMode(from);
//app.getSettings().APPLICATION_MODE.set(mode);
//app.getSettings().setApplicationMode(mode, false);
app.getRoutingHelper().setAppMode(mode);
app.initVoiceCommandPlayer(mapActivity, mode, true, null, false, false, showMenu);
// save application mode controls
@ -588,7 +588,7 @@ public class MapActivityActions implements DialogProvider {
TargetPointsHelper targets = app.getTargetPointsHelper();
ApplicationMode mode = getRouteMode(null);
//app.getSettings().APPLICATION_MODE.set(mode);
//app.getSettings().setApplicationMode(mode, false);
app.getRoutingHelper().setAppMode(mode);
//Test for #2810: No need to init player here?
//app.initVoiceCommandPlayer(mapActivity, true, null, false, false);
@ -737,7 +737,7 @@ public class MapActivityActions implements DialogProvider {
String modeDescription;
Map<String, RoutingProfileDataObject> profilesObjects = getRoutingProfiles(app);
Map<String, RoutingProfileDataObject> profilesObjects = ProfileDataUtils.getRoutingProfiles(app);
for (final ApplicationMode appMode : activeModes) {
if (appMode.isCustomProfile()) {
modeDescription = getProfileDescription(app, appMode, profilesObjects, getString(R.string.profile_type_user_string));
@ -756,7 +756,7 @@ public class MapActivityActions implements DialogProvider {
.setListener(new ItemClickListener() {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int position, boolean isChecked, int[] viewCoordinates) {
app.getSettings().APPLICATION_MODE.set(appMode);
app.getSettings().setApplicationMode(appMode);
updateDrawerMenu();
return false;
}
@ -1046,7 +1046,7 @@ public class MapActivityActions implements DialogProvider {
//switch profile button
ApplicationMode currentMode = app.getSettings().APPLICATION_MODE.get();
String modeDescription;
Map<String, RoutingProfileDataObject> profilesObjects = getRoutingProfiles(app);
Map<String, RoutingProfileDataObject> profilesObjects = ProfileDataUtils.getRoutingProfiles(app);
if (currentMode.isCustomProfile()) {
modeDescription = getProfileDescription(app, currentMode, profilesObjects, getString(R.string.profile_type_user_string));
} else {

View file

@ -25,6 +25,7 @@ import net.osmand.plus.dashboard.DashboardOnMap;
import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelperUtils;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.views.AnimateDraggingMapThread;
import net.osmand.plus.views.OsmandMapTileView;
@ -175,7 +176,7 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
locationProvider = location.getProvider();
if (settings.DRIVING_REGION_AUTOMATIC.get() && !drivingRegionUpdated && !app.isApplicationInitializing()) {
drivingRegionUpdated = true;
app.getRoutingHelper().checkAndUpdateStartLocation(location);
RoutingHelperUtils.checkAndUpdateStartLocation(app, location);
}
}
if (mapView != null) {

View file

@ -15,6 +15,7 @@ import androidx.fragment.app.FragmentManager;
import net.osmand.AndroidUtils;
import net.osmand.PlatformUtil;
import net.osmand.plus.profiles.ProfileDataUtils;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
@ -33,7 +34,6 @@ import net.osmand.plus.download.DownloadValidationManager;
import net.osmand.plus.download.IndexItem;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.helpers.FontCache;
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
import net.osmand.plus.widgets.style.CustomTypefaceSpan;
import org.apache.commons.logging.Log;
@ -221,7 +221,7 @@ public class PluginInstalledBottomSheetDialog extends MenuBottomSheetDialogFragm
final BottomSheetItemWithCompoundButton[] appModeItem = new BottomSheetItemWithCompoundButton[1];
appModeItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder()
.setChecked(ApplicationMode.values(app).contains(mode))
.setDescription(BaseSettingsFragment.getAppModeDescription(app, mode))
.setDescription(ProfileDataUtils.getAppModeDescription(app, mode))
.setTitle(mode.toHumanString())
.setIcon(getActiveIcon(mode.getIconRes()))
.setLayoutId(R.layout.bottom_sheet_item_with_descr_and_switch_56dp)

View file

@ -32,8 +32,8 @@ import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelper.RouteSegmentSearchResult;
import net.osmand.plus.routing.RouteSegmentSearchResult;
import net.osmand.plus.routing.RoutingHelperUtils;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.views.layers.ContextMenuLayer;
import net.osmand.router.RouteSegmentResult;
@ -119,7 +119,7 @@ public class AvoidSpecificRoads {
remove(item);
removeImpassableRoad(item);
notifyDataSetChanged();
recalculateRoute();
recalculateRoute(item != null ? item.appModeKey : null);
}
});
return v;
@ -150,7 +150,7 @@ public class AvoidSpecificRoads {
if (obj != null) {
String locale = app.getSettings().MAP_PREFERRED_LOCALE.get();
boolean transliterate = app.getSettings().MAP_TRANSLITERATE_NAMES.get();
String name = RoutingHelper.formatStreetName(
String name = RoutingHelperUtils.formatStreetName(
obj.getName(locale, transliterate),
obj.getRef(locale, transliterate, true),
obj.getDestinationName(locale, transliterate, true),
@ -163,11 +163,9 @@ public class AvoidSpecificRoads {
return app.getString(R.string.shared_string_road);
}
private void recalculateRoute() {
RoutingHelper rh = app.getRoutingHelper();
if (rh.isRouteCalculated() || rh.isRouteBeingCalculated()) {
rh.recalculateRouteDueToSettingsChange();
}
private void recalculateRoute(@Nullable String appModeKey) {
ApplicationMode mode = ApplicationMode.valueOfStringKey(appModeKey, null);
app.getRoutingHelper().onSettingsChanged(mode);
}
public void removeImpassableRoad(LatLon latLon) {
@ -184,7 +182,7 @@ public class AvoidSpecificRoads {
removeImpassableRoad(getLocation(obj));
}
public void showDialog(@NonNull final MapActivity mapActivity) {
public void showDialog(@NonNull final MapActivity mapActivity, final @Nullable ApplicationMode mode) {
boolean nightMode = app.getDaynightHelper().isNightModeForMapControls();
Context themedContext = UiUtilities.getThemedContext(mapActivity, nightMode);
@ -209,14 +207,14 @@ public class AvoidSpecificRoads {
bld.setPositiveButton(R.string.shared_string_select_on_map, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
selectFromMap(mapActivity);
selectFromMap(mapActivity, mode);
}
});
bld.setNegativeButton(R.string.shared_string_close, null);
bld.show();
}
public void selectFromMap(final MapActivity mapActivity) {
public void selectFromMap(@NonNull final MapActivity mapActivity) {
ContextMenuLayer cm = mapActivity.getMapLayers().getContextMenuLayer();
cm.setSelectOnMap(new CallbackWithObject<LatLon>() {
@Override
@ -227,6 +225,17 @@ public class AvoidSpecificRoads {
});
}
public void selectFromMap(@NonNull final MapActivity mapActivity, @Nullable final ApplicationMode mode) {
ContextMenuLayer cm = mapActivity.getMapLayers().getContextMenuLayer();
cm.setSelectOnMap(new CallbackWithObject<LatLon>() {
@Override
public boolean processResult(LatLon result) {
addImpassableRoad(mapActivity, result, true, false, mode != null ? mode.getStringKey() : null);
return true;
}
});
}
public void addImpassableRoad(@Nullable final MapActivity mapActivity,
@NonNull final LatLon loc,
final boolean showDialog,
@ -239,12 +248,14 @@ public class AvoidSpecificRoads {
ApplicationMode defaultAppMode = app.getRoutingHelper().getAppMode();
final ApplicationMode appMode = appModeKey != null ? ApplicationMode.valueOfStringKey(appModeKey, defaultAppMode) : defaultAppMode;
List<RouteSegmentResult> roads = app.getRoutingHelper().getRoute().getOriginalRoute();
List<RouteSegmentResult> roads = app.getMeasurementEditingContext() != null
? app.getMeasurementEditingContext().getRoadSegmentData(appMode)
: app.getRoutingHelper().getRoute().getOriginalRoute();
if (mapActivity != null && roads != null) {
RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy();
float maxDistPx = MAX_AVOID_ROUTE_SEARCH_RADIUS_DP * tb.getDensity();
RouteSegmentSearchResult searchResult =
RoutingHelper.searchRouteSegment(loc.getLatitude(), loc.getLongitude(), maxDistPx / tb.getPixDensity(), roads);
RouteSegmentSearchResult.searchRouteSegment(loc.getLatitude(), loc.getLongitude(), maxDistPx / tb.getPixDensity(), roads);
if (searchResult != null) {
QuadPoint point = searchResult.getPoint();
LatLon newLoc = new LatLon(MapUtils.get31LatitudeY((int) point.y), MapUtils.get31LongitudeX((int) point.x));
@ -349,10 +360,10 @@ public class AvoidSpecificRoads {
app.getSettings().removeImpassableRoad(location);
}
}
recalculateRoute();
recalculateRoute(avoidRoadInfo.appModeKey);
if (activity != null) {
if (showDialog) {
showDialog(activity);
showDialog(activity, ApplicationMode.valueOfStringKey(avoidRoadInfo.appModeKey, null));
}
MapContextMenu menu = activity.getContextMenu();
if (menu.isActive()) {

View file

@ -47,6 +47,7 @@ import net.osmand.plus.quickaction.QuickActionRegistry;
import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
import net.osmand.plus.routing.RouteDirectionInfo;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelperUtils;
import net.osmand.plus.search.listitems.QuickSearchListItem;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.track.SaveGpxAsyncTask;
@ -697,7 +698,7 @@ public class ExternalApiHelper {
if (ni.directionInfo != null && ni.directionInfo.getTurnType() != null) {
TurnType tt = ni.directionInfo.getTurnType();
RouteDirectionInfo a = ni.directionInfo;
result.putExtra(prefix + PARAM_NT_DIRECTION_NAME, RoutingHelper.formatStreetName(a.getStreetName(), a.getRef(), a.getDestinationName(), ""));
result.putExtra(prefix + PARAM_NT_DIRECTION_NAME, RoutingHelperUtils.formatStreetName(a.getStreetName(), a.getRef(), a.getDestinationName(), ""));
result.putExtra(prefix + PARAM_NT_DIRECTION_TURN, tt.toXmlString());
result.putExtra(prefix + PARAM_NT_DIRECTION_ANGLE, tt.getTurnAngle());
result.putExtra(prefix + PARAM_NT_DIRECTION_POSSIBLY_LEFT, tt.isPossibleLeftTurn());
@ -736,7 +737,7 @@ public class ExternalApiHelper {
OsmandApplication app = mapActivity.getMyApplication();
RoutingHelper routingHelper = app.getRoutingHelper();
if (gpx == null) {
app.getSettings().APPLICATION_MODE.set(mode);
app.getSettings().setApplicationMode(mode);
final TargetPointsHelper targets = mapActivity.getMyApplication().getTargetPointsHelper();
targets.removeAllWayPoints(false, true);
targets.navigateToPoint(to, true, -1, toDesc);
@ -746,7 +747,7 @@ public class ExternalApiHelper {
mapActivity.getMapRouteInfoMenu().show();
} else {
if (app.getSettings().APPLICATION_MODE.get() != routingHelper.getAppMode()) {
app.getSettings().APPLICATION_MODE.set(routingHelper.getAppMode());
app.getSettings().setApplicationMode(routingHelper.getAppMode(), false);
}
mapActivity.getMapViewTrackingUtilities().backToLocationImpl();
app.getSettings().FOLLOW_THE_ROUTE.set(true);

View file

@ -953,7 +953,7 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
if (navigateInPedestrianMode()) {
mapActivity.getMyApplication().getSettings().APPLICATION_MODE.set(ApplicationMode.PEDESTRIAN);
mapActivity.getMyApplication().getSettings().setApplicationMode(ApplicationMode.PEDESTRIAN, false);
}
mapActivity.getMapLayers().getMapControlsLayer().navigateButton();
}

View file

@ -31,10 +31,7 @@ public class ImpassibleRoadsMenuController extends MenuController {
if (activity != null) {
app.getAvoidSpecificRoads().removeImpassableRoad(
ImpassibleRoadsMenuController.this.avoidRoadInfo);
RoutingHelper rh = app.getRoutingHelper();
if (rh.isRouteCalculated() || rh.isRouteBeingCalculated()) {
rh.recalculateRouteDueToSettingsChange();
}
app.getRoutingHelper().onSettingsChanged();
activity.getContextMenu().close();
}
}

View file

@ -178,7 +178,7 @@ public class DestinationReachedMenuFragment extends Fragment {
}
}
OsmandSettings settings = mapActivity.getMyApplication().getSettings();
settings.APPLICATION_MODE.set(settings.DEFAULT_APPLICATION_MODE.get());
settings.setApplicationMode(settings.DEFAULT_APPLICATION_MODE.get());
mapActivity.getMapActions().stopNavigationWithoutConfirm();
dismissMenu();
}

View file

@ -137,7 +137,7 @@ public class RoutePreferencesMenu {
LocalRoutingParameter rp = group.getRoutingParameters().get(i);
rp.setSelected(settings, i == position);
}
mapActivity.getRoutingHelper().recalculateRouteDueToSettingsChange();
mapActivity.getRoutingHelper().onSettingsChanged(true);
updateParameters();
}
}
@ -366,7 +366,7 @@ public class RoutePreferencesMenu {
app.getTargetPointsHelper().updateRouteAndRefresh(true);
updateSpinnerItems(gpxSpinner);
updateParameters();
mapActivity.getRoutingHelper().recalculateRouteDueToSettingsChange();
mapActivity.getRoutingHelper().onSettingsChanged(true);
return true;
}
}, app.getDaynightHelper().isNightModeForMapControls());
@ -389,7 +389,7 @@ public class RoutePreferencesMenu {
if (mapActivity.getRoutingHelper().getCurrentGPXRoute() != null) {
mapActivity.getRoutingHelper().setGpxParams(null);
settings.FOLLOW_THE_GPX_ROUTE.set(null);
mapActivity.getRoutingHelper().recalculateRouteDueToSettingsChange();
mapActivity.getRoutingHelper().onSettingsChanged(true);
}
updateParameters();
return true;

View file

@ -4,6 +4,7 @@ import android.util.Pair;
import net.osmand.Location;
import net.osmand.data.LatLon;
import net.osmand.plus.routing.RouteCalculationProgressCallback;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.GPXUtilities.WptPt;
@ -127,7 +128,7 @@ public class MarkersPlanRouteContext {
findPairsToCalculate(points);
RoutingHelper routingHelper = app.getRoutingHelper();
if (!snapToRoadPairsToCalculate.isEmpty() && !routingHelper.isRouteBeingCalculated()) {
routingHelper.startRouteCalculationThread(getParams(), true, true);
routingHelper.startRouteCalculationThread(getParams());
app.runInUIThread(new Runnable() {
@Override
public void run() {
@ -217,7 +218,7 @@ public class MarkersPlanRouteContext {
params.mode = snappedMode;
params.ctx = app;
params.calculationProgress = calculationProgress = new RouteCalculationProgress();
params.calculationProgressCallback = new RoutingHelper.RouteCalculationProgressCallback() {
params.calculationProgressCallback = new RouteCalculationProgressCallback() {
@Override
public void start() {
@ -265,7 +266,7 @@ public class MarkersPlanRouteContext {
}
});
if (!snapToRoadPairsToCalculate.isEmpty()) {
app.getRoutingHelper().startRouteCalculationThread(getParams(), true, true);
app.getRoutingHelper().startRouteCalculationThread(getParams());
} else {
app.runInUIThread(new Runnable() {
@Override

View file

@ -135,12 +135,12 @@ public class GraphsCard extends BaseCard implements OnUpdateInfoListener {
}
private void updateMenu() {
if (!editingCtx.isPointsEnoughToCalculateRoute()) {
graphTypesMenu.setVisibility(View.GONE);
} else {
if (editingCtx.isPointsEnoughToCalculateRoute()) {
graphTypesMenu.setVisibility(View.VISIBLE);
graphTypesMenu.removeAllViews();
fillInMenu();
} else {
graphTypesMenu.setVisibility(View.GONE);
}
}
@ -349,7 +349,7 @@ public class GraphsCard extends BaseCard implements OnUpdateInfoListener {
private List<RouteStatistics> calculateRouteStatistics() {
OsmandApplication app = getMyApplication();
List<RouteSegmentResult> route = editingCtx.getAllRouteSegments();
List<RouteSegmentResult> route = editingCtx.getOrderedRoadSegmentData();
if (route != null && app != null) {
return RouteDetailsFragment.calculateRouteStatistics(app, route, nightMode);
}

View file

@ -16,11 +16,12 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.measurementtool.command.ApplyGpxApproximationCommand;
import net.osmand.plus.measurementtool.command.MeasurementCommandManager;
import net.osmand.plus.measurementtool.command.MeasurementModeCommand;
import net.osmand.plus.routing.IRouteSettingsListener;
import net.osmand.plus.routing.RouteCalculationParams;
import net.osmand.plus.routing.RouteCalculationParams.RouteCalculationResultListener;
import net.osmand.plus.routing.RouteCalculationProgressCallback;
import net.osmand.plus.routing.RouteCalculationResult;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelper.RouteCalculationProgressCallback;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.router.RouteCalculationProgress;
import net.osmand.router.RouteExporter;
@ -40,12 +41,13 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import static net.osmand.plus.measurementtool.MeasurementEditingContext.CalculationMode.WHOLE_TRACK;
import static net.osmand.plus.measurementtool.command.MeasurementModeCommand.MeasurementCommandType.APPROXIMATE_POINTS;
public class MeasurementEditingContext {
public class MeasurementEditingContext implements IRouteSettingsListener {
public final static ApplicationMode DEFAULT_APP_MODE = ApplicationMode.DEFAULT;
@ -70,9 +72,11 @@ public class MeasurementEditingContext {
private int calculatedPairs;
private int pointsToCalculateSize;
private CalculationMode lastCalculationMode = WHOLE_TRACK;
private SnapToRoadProgressListener progressListener;
private ApplicationMode appMode = DEFAULT_APP_MODE;
private SnapToRoadProgressListener progressListener;
private RouteCalculationProgress calculationProgress;
private Map<Pair<WptPt, WptPt>, RoadSegmentData> roadSegmentData = new ConcurrentHashMap<>();
public enum CalculationMode {
@ -86,64 +90,20 @@ public class MeasurementEditingContext {
ADD_BEFORE,
}
public static class RoadSegmentData {
private final ApplicationMode appMode;
private final WptPt start;
private final WptPt end;
private final List<WptPt> points;
private final List<RouteSegmentResult> segments;
private final double distance;
public void setApplication(OsmandApplication application) {
this.application = application;
}
public RoadSegmentData(@NonNull ApplicationMode appMode, @NonNull WptPt start, @NonNull WptPt end,
@Nullable List<WptPt> points, @Nullable List<RouteSegmentResult> segments) {
this.appMode = appMode;
this.start = start;
this.end = end;
this.points = points;
this.segments = segments;
double distance = 0;
if (points != null && points.size() > 1) {
for (int i = 1; i < points.size(); i++) {
distance += MapUtils.getDistance(points.get(i - 1).lat, points.get(i - 1).lon,
points.get(i).lat, points.get(i).lon);
}
} else if (segments != null) {
for (RouteSegmentResult segment : segments) {
distance += segment.getDistance();
}
}
this.distance = distance;
}
public ApplicationMode getAppMode() {
return appMode;
}
public WptPt getStart() {
return start;
}
public WptPt getEnd() {
return end;
}
@Nullable
public List<WptPt> getPoints() {
return points != null ? Collections.unmodifiableList(points) : null;
}
@Nullable
public List<RouteSegmentResult> getSegments() {
return segments != null ? Collections.unmodifiableList(segments) : null;
}
public double getDistance() {
return distance;
public void setupRouteSettingsListener() {
if (application != null) {
application.getRoutingHelper().addRouteSettingsListener(this);
}
}
public void setApplication(OsmandApplication application) {
this.application = application;
public void resetRouteSettingsListener() {
if (application != null) {
application.getRoutingHelper().removeRouteSettingsListener(this);
}
}
MeasurementCommandManager getCommandManager() {
@ -371,7 +331,7 @@ public class MeasurementEditingContext {
return getPointsCount() >= 2;
}
public List<RouteSegmentResult> getAllRouteSegments() {
public List<RouteSegmentResult> getOrderedRoadSegmentData() {
List<RouteSegmentResult> allSegments = new ArrayList<>();
for (Pair<WptPt, WptPt> key : getOrderedRoadSegmentDataKeys()) {
RoadSegmentData data = roadSegmentData.get(key);
@ -385,19 +345,48 @@ public class MeasurementEditingContext {
return allSegments.size() > 0 ? allSegments : null;
}
public void recalculateRouteSegmentsForAppMode() {
clearRouteSegmentsByAppMode();
updateSegmentsForSnap();
}
public void clearRouteSegmentsByAppMode() {
for (Pair<WptPt, WptPt> key : getOrderedRoadSegmentDataKeys()) {
if(key.first.getProfileType().equals(appMode.getStringKey())) {
RoadSegmentData data = roadSegmentData.get(key);
if (data != null) {
roadSegmentData.remove(key);
@NonNull
public List<RouteSegmentResult> getRoadSegmentData(@Nullable ApplicationMode mode) {
List<RouteSegmentResult> res = new ArrayList<>();
if (mode == null) {
for (RoadSegmentData data : roadSegmentData.values()) {
List<RouteSegmentResult> segments = data.getSegments();
if (!Algorithms.isEmpty(segments)) {
res.addAll(segments);
}
}
} else {
for (Entry<Pair<WptPt, WptPt>, RoadSegmentData> dataEntry : roadSegmentData.entrySet()) {
WptPt firstPoint = dataEntry.getKey().first;
if (mode.getStringKey().equals(firstPoint.getProfileType())) {
List<RouteSegmentResult> segments = dataEntry.getValue().getSegments();
if (!Algorithms.isEmpty(segments)) {
res.addAll(segments);
}
}
}
}
return res;
}
void recalculateRouteSegments(@Nullable ApplicationMode mode) {
boolean changed = false;
if (mode == null) {
roadSegmentData.clear();
changed = true;
} else {
for (Pair<WptPt, WptPt> pair : getOrderedRoadSegmentDataKeys()) {
if (mode.getStringKey().equals(pair.first.getProfileType())) {
RoadSegmentData data = roadSegmentData.get(pair);
if (data != null) {
roadSegmentData.remove(pair);
changed = true;
}
}
}
}
if (changed) {
updateSegmentsForSnap(false);
}
}
@ -673,7 +662,7 @@ public class MeasurementEditingContext {
if (progressListener != null && !routingHelper.isRouteBeingCalculated()) {
RouteCalculationParams params = getParams(true);
if (params != null) {
routingHelper.startRouteCalculationThread(params, true, true);
routingHelper.startRouteCalculationThread(params);
application.runInUIThread(new Runnable() {
@Override
public void run() {
@ -794,11 +783,11 @@ public class MeasurementEditingContext {
Pair<WptPt, WptPt> pair = new Pair<>(routePoints.get(i), routePoints.get(i + 1));
int startIndex = pair.first.getTrkPtIndex();
if (startIndex < 0 || startIndex < prevPointIndex || startIndex >= points.size()) {
startIndex = findPointIndex(pair.first, points, prevPointIndex);
startIndex = MeasurementEditingContextUtils.findPointIndex(pair.first, points, prevPointIndex);
}
int endIndex = pair.second.getTrkPtIndex();
if (endIndex < 0 || endIndex < startIndex || endIndex >= points.size()) {
endIndex = findPointIndex(pair.second, points, startIndex);
endIndex = MeasurementEditingContextUtils.findPointIndex(pair.second, points, startIndex);
}
if (startIndex >= 0 && endIndex >= 0) {
List<WptPt> pairPoints = new ArrayList<>();
@ -847,7 +836,7 @@ public class MeasurementEditingContext {
List<GpxPoint> gpxPoints = gpxApproximation.finalPoints;
for (int i = 0; i < gpxPoints.size(); i++) {
GpxPoint gp1 = gpxPoints.get(i);
boolean lastGpxPoint = isLastGpxPoint(gpxPoints, i);
boolean lastGpxPoint = MeasurementEditingContextUtils.isLastGpxPoint(gpxPoints, i);
List<WptPt> points = new ArrayList<>();
List<RouteSegmentResult> segments = new ArrayList<>();
for (int k = 0; k < gp1.routeToTarget.size(); k++) {
@ -858,7 +847,7 @@ public class MeasurementEditingContext {
}
for (int k = 0; k < segments.size(); k++) {
RouteSegmentResult seg = segments.get(k);
fillPointsArray(points, seg, lastGpxPoint && k == segments.size() - 1);
MeasurementEditingContextUtils.fillPointsArray(points, seg, lastGpxPoint && k == segments.size() - 1);
}
if (!points.isEmpty()) {
WptPt wp1 = new WptPt();
@ -893,61 +882,6 @@ public class MeasurementEditingContext {
return routePoints;
}
private boolean isLastGpxPoint(List<GpxPoint> gpxPoints, int index) {
if (index == gpxPoints.size() - 1) {
return true;
} else {
for (int i = index + 1; i < gpxPoints.size(); i++) {
GpxPoint gp = gpxPoints.get(i);
for (int k = 0; k < gp.routeToTarget.size(); k++) {
RouteSegmentResult seg = gp.routeToTarget.get(k);
if (seg.getStartPointIndex() != seg.getEndPointIndex()) {
return false;
}
}
}
}
return true;
}
private void fillPointsArray(List<WptPt> points, RouteSegmentResult seg, boolean includeEndPoint) {
int ind = seg.getStartPointIndex();
boolean plus = seg.isForwardDirection();
float[] heightArray = seg.getObject().calculateHeightArray();
while (ind != seg.getEndPointIndex()) {
addPointToArray(points, seg, ind, heightArray);
ind = plus ? ind + 1 : ind - 1;
}
if (includeEndPoint) {
addPointToArray(points, seg, ind, heightArray);
}
}
private void addPointToArray(List<WptPt> points, RouteSegmentResult seg, int index, float[] heightArray) {
LatLon l = seg.getPoint(index);
WptPt pt = new WptPt();
if (heightArray != null && heightArray.length > index * 2 + 1) {
pt.ele = heightArray[index * 2 + 1];
}
pt.lat = l.getLatitude();
pt.lon = l.getLongitude();
points.add(pt);
}
private int findPointIndex(WptPt point, List<WptPt> points, int firstIndex) {
double minDistance = Double.MAX_VALUE;
int index = 0;
for (int i = Math.max(0, firstIndex); i < points.size(); i++) {
double distance = MapUtils.getDistance(point.lat, point.lon, points.get(i).lat, points.get(i).lon);
if (distance < minDistance) {
minDistance = distance;
index = i;
}
}
return index;
}
private void updateSegmentsForSnap(boolean both) {
recreateSegments(beforeSegments = new ArrayList<>(),
beforeSegmentsForSnap = new ArrayList<>(), before.points, true);
@ -966,7 +900,6 @@ public class MeasurementEditingContext {
}
}
void cancelSnapToRoad() {
progressListener.hideProgressBar();
if (calculationProgress != null) {
@ -1063,7 +996,7 @@ public class MeasurementEditingContext {
progressListener.refresh();
RouteCalculationParams params = getParams(false);
if (params != null) {
application.getRoutingHelper().startRouteCalculationThread(params, true, true);
application.getRoutingHelper().startRouteCalculationThread(params);
} else {
progressListener.hideProgressBar();
}
@ -1108,8 +1041,10 @@ public class MeasurementEditingContext {
for (int i = startPointIndex; i < endPointIndex; i++) {
Pair<WptPt, WptPt> pair = new Pair<>(before.points.get(i), before.points.get(i + 1));
RoadSegmentData data = this.roadSegmentData.get(pair);
if (data != null && data.points != null && data.segments != null) {
for (WptPt pt : data.points) {
List<WptPt> dataPoints = data != null ? data.getPoints() : null;
List<RouteSegmentResult> dataSegments = data != null ? data.getSegments() : null;
if (dataPoints != null && dataSegments != null) {
for (WptPt pt : dataPoints) {
Location l = new Location("");
l.setLatitude(pt.getLatitude());
l.setLongitude(pt.getLongitude());
@ -1119,7 +1054,7 @@ public class MeasurementEditingContext {
locations.add(l);
}
pair.second.setTrkPtIndex(i + 1 < before.points.size() - 1 ? locations.size() : locations.size() - 1);
route.addAll(data.segments);
route.addAll(dataSegments);
}
}
if (!locations.isEmpty() && !route.isEmpty()) {
@ -1156,14 +1091,8 @@ public class MeasurementEditingContext {
return res;
}
interface SnapToRoadProgressListener {
void showProgressBar();
void updateProgress(int progress);
void hideProgressBar();
void refresh();
@Override
public void onRouteSettingsChanged(@Nullable ApplicationMode mode) {
recalculateRouteSegments(mode);
}
}

View file

@ -0,0 +1,67 @@
package net.osmand.plus.measurementtool;
import net.osmand.GPXUtilities;
import net.osmand.data.LatLon;
import net.osmand.router.RoutePlannerFrontEnd;
import net.osmand.router.RouteSegmentResult;
import net.osmand.util.MapUtils;
import java.util.List;
public class MeasurementEditingContextUtils {
static boolean isLastGpxPoint(List<RoutePlannerFrontEnd.GpxPoint> gpxPoints, int index) {
if (index == gpxPoints.size() - 1) {
return true;
} else {
for (int i = index + 1; i < gpxPoints.size(); i++) {
RoutePlannerFrontEnd.GpxPoint gp = gpxPoints.get(i);
for (int k = 0; k < gp.routeToTarget.size(); k++) {
RouteSegmentResult seg = gp.routeToTarget.get(k);
if (seg.getStartPointIndex() != seg.getEndPointIndex()) {
return false;
}
}
}
}
return true;
}
static int findPointIndex(GPXUtilities.WptPt point, List<GPXUtilities.WptPt> points, int firstIndex) {
double minDistance = Double.MAX_VALUE;
int index = 0;
for (int i = Math.max(0, firstIndex); i < points.size(); i++) {
double distance = MapUtils.getDistance(point.lat, point.lon, points.get(i).lat, points.get(i).lon);
if (distance < minDistance) {
minDistance = distance;
index = i;
}
}
return index;
}
static void addPointToArray(List<GPXUtilities.WptPt> points, RouteSegmentResult seg, int index, float[] heightArray) {
LatLon l = seg.getPoint(index);
GPXUtilities.WptPt pt = new GPXUtilities.WptPt();
if (heightArray != null && heightArray.length > index * 2 + 1) {
pt.ele = heightArray[index * 2 + 1];
}
pt.lat = l.getLatitude();
pt.lon = l.getLongitude();
points.add(pt);
}
static void fillPointsArray(List<GPXUtilities.WptPt> points, RouteSegmentResult seg, boolean includeEndPoint) {
int ind = seg.getStartPointIndex();
boolean plus = seg.isForwardDirection();
float[] heightArray = seg.getObject().calculateHeightArray();
while (ind != seg.getEndPointIndex()) {
addPointToArray(points, seg, ind, heightArray);
ind = plus ? ind + 1 : ind - 1;
}
if (includeEndPoint) {
addPointToArray(points, seg, ind, heightArray);
}
}
}

View file

@ -72,7 +72,6 @@ import net.osmand.plus.measurementtool.command.ReorderPointCommand;
import net.osmand.plus.measurementtool.command.ReversePointsCommand;
import net.osmand.plus.measurementtool.command.SplitPointsCommand;
import net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet;
import net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet.OnAppModeConfiguredCallback;
import net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet.DialogMode;
import net.osmand.plus.routepreparationmenu.cards.BaseCard;
import net.osmand.plus.settings.backend.ApplicationMode;
@ -98,7 +97,6 @@ import java.util.Locale;
import static net.osmand.IndexConstants.GPX_FILE_EXT;
import static net.osmand.IndexConstants.GPX_INDEX_DIR;
import static net.osmand.plus.measurementtool.MeasurementEditingContext.CalculationMode;
import static net.osmand.plus.measurementtool.MeasurementEditingContext.SnapToRoadProgressListener;
import static net.osmand.plus.measurementtool.SaveAsNewTrackBottomSheetDialogFragment.SaveAsNewTrackFragmentListener;
import static net.osmand.plus.measurementtool.SelectFileBottomSheet.Mode.ADD_TO_TRACK;
import static net.osmand.plus.measurementtool.SelectFileBottomSheet.SelectFileListener;
@ -109,8 +107,7 @@ import static net.osmand.plus.measurementtool.command.ClearPointsCommand.ClearCo
public class MeasurementToolFragment extends BaseOsmAndFragment implements RouteBetweenPointsFragmentListener,
OptionsFragmentListener, GpxApproximationFragmentListener, SelectedPointFragmentListener,
SaveAsNewTrackFragmentListener, MapControlsThemeInfoProvider,
OnAppModeConfiguredCallback {
SaveAsNewTrackFragmentListener, MapControlsThemeInfoProvider {
public static final String TAG = MeasurementToolFragment.class.getSimpleName();
public static final String TAPS_DISABLED_KEY = "taps_disabled_key";
@ -241,7 +238,8 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
final MeasurementToolLayer measurementLayer = mapActivity.getMapLayers().getMeasurementToolLayer();
final OsmandApplication app = mapActivity.getMyApplication();
editingCtx.setApplication(mapActivity.getMyApplication());
app.setMeasurementEditingContext(editingCtx);
editingCtx.setApplication(app);
editingCtx.setProgressListener(new SnapToRoadProgressListener() {
@Override
public void showProgressBar() {
@ -267,6 +265,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
updateDistancePointsText();
}
});
editingCtx.setupRouteSettingsListener();
measurementLayer.setEditingCtx(editingCtx);
@ -930,7 +929,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
if (isFollowTrackMode()) {
mapActivity.getMapActions().setGPXRouteParams(gpx);
app.getTargetPointsHelper().updateRouteAndRefresh(true);
app.getRoutingHelper().recalculateRouteDueToSettingsChange();
app.getRoutingHelper().onSettingsChanged(true);
} else {
mapActivity.getMapActions().stopNavigationActionConfirm(null , new Runnable() {
@Override
@ -1102,12 +1101,6 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
updateDistancePointsText();
}
@Override
public void onAppModeConfigured() {
editingCtx.recalculateRouteSegmentsForAppMode();
updateDistancePointsText();
}
@Override
public void onChangeRouteTypeBefore() {
MapActivity mapActivity = getMapActivity();
@ -1910,6 +1903,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
private void dismiss(@NonNull MapActivity mapActivity, boolean clearContext) {
try {
OsmandApplication app = mapActivity.getMyApplication();
if (clearContext) {
editingCtx.clearSegments();
}
@ -1920,13 +1914,15 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
GpxData gpxData = editingCtx.getGpxData();
GPXFile gpx = gpxData != null ? gpxData.getGpxFile() : null;
if (gpx != null) {
Intent newIntent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getTrackActivity());
Intent newIntent = new Intent(mapActivity, app.getAppCustomization().getTrackActivity());
newIntent.putExtra(TrackActivity.TRACK_FILE_NAME, gpx.path);
newIntent.putExtra(TrackActivity.OPEN_TRACKS_LIST, true);
newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(newIntent);
}
}
editingCtx.resetRouteSettingsListener();
app.setMeasurementEditingContext(null);
mapActivity.getSupportFragmentManager().beginTransaction().remove(this).commitAllowingStateLoss();
} catch (Exception e) {
// ignore

View file

@ -0,0 +1,68 @@
package net.osmand.plus.measurementtool;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.router.RouteSegmentResult;
import net.osmand.util.MapUtils;
import java.util.Collections;
import java.util.List;
public class RoadSegmentData {
private final ApplicationMode appMode;
private final WptPt start;
private final WptPt end;
private final List<WptPt> points;
private final List<RouteSegmentResult> segments;
private final double distance;
public RoadSegmentData(@NonNull ApplicationMode appMode, @NonNull WptPt start, @NonNull WptPt end,
@Nullable List<WptPt> points, @Nullable List<RouteSegmentResult> segments) {
this.appMode = appMode;
this.start = start;
this.end = end;
this.points = points;
this.segments = segments;
double distance = 0;
if (points != null && points.size() > 1) {
for (int i = 1; i < points.size(); i++) {
distance += MapUtils.getDistance(points.get(i - 1).lat, points.get(i - 1).lon,
points.get(i).lat, points.get(i).lon);
}
} else if (segments != null) {
for (RouteSegmentResult segment : segments) {
distance += segment.getDistance();
}
}
this.distance = distance;
}
public ApplicationMode getAppMode() {
return appMode;
}
public WptPt getStart() {
return start;
}
public WptPt getEnd() {
return end;
}
@Nullable
public List<WptPt> getPoints() {
return points != null ? Collections.unmodifiableList(points) : null;
}
@Nullable
public List<RouteSegmentResult> getSegments() {
return segments != null ? Collections.unmodifiableList(segments) : null;
}
public double getDistance() {
return distance;
}
}

View file

@ -0,0 +1,12 @@
package net.osmand.plus.measurementtool;
interface SnapToRoadProgressListener {
void showProgressBar();
void updateProgress(int progress);
void hideProgressBar();
void refresh();
}

View file

@ -6,7 +6,7 @@ import androidx.annotation.NonNull;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.plus.measurementtool.MeasurementEditingContext;
import net.osmand.plus.measurementtool.MeasurementEditingContext.RoadSegmentData;
import net.osmand.plus.measurementtool.RoadSegmentData;
import net.osmand.plus.measurementtool.MeasurementToolLayer;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.router.RoutePlannerFrontEnd.GpxRouteApproximation;

View file

@ -4,7 +4,7 @@ import android.util.Pair;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.plus.measurementtool.MeasurementEditingContext;
import net.osmand.plus.measurementtool.MeasurementEditingContext.RoadSegmentData;
import net.osmand.plus.measurementtool.RoadSegmentData;
import net.osmand.plus.measurementtool.MeasurementToolLayer;
import net.osmand.plus.settings.backend.ApplicationMode;

View file

@ -4,7 +4,7 @@ import android.util.Pair;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.plus.measurementtool.MeasurementEditingContext;
import net.osmand.plus.measurementtool.MeasurementEditingContext.RoadSegmentData;
import net.osmand.plus.measurementtool.RoadSegmentData;
import net.osmand.plus.measurementtool.MeasurementToolLayer;
import java.util.ArrayList;

View file

@ -4,7 +4,7 @@ import android.util.Pair;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.plus.measurementtool.MeasurementEditingContext;
import net.osmand.plus.measurementtool.MeasurementEditingContext.RoadSegmentData;
import net.osmand.plus.measurementtool.RoadSegmentData;
import net.osmand.plus.measurementtool.MeasurementToolLayer;
import java.util.ArrayList;

View file

@ -4,12 +4,11 @@ import android.util.Pair;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.plus.measurementtool.MeasurementEditingContext;
import net.osmand.plus.measurementtool.MeasurementEditingContext.RoadSegmentData;
import net.osmand.plus.measurementtool.RoadSegmentData;
import net.osmand.plus.measurementtool.MeasurementToolLayer;
import net.osmand.plus.settings.backend.ApplicationMode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

View file

@ -2,11 +2,9 @@ package net.osmand.plus.measurementtool.command;
import android.util.Pair;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.plus.measurementtool.MeasurementEditingContext;
import net.osmand.plus.measurementtool.MeasurementEditingContext.RoadSegmentData;
import net.osmand.plus.measurementtool.RoadSegmentData;
import net.osmand.plus.measurementtool.MeasurementToolLayer;
import java.util.ArrayList;

View file

@ -16,7 +16,6 @@ import net.osmand.PlatformUtil;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
@ -105,7 +104,7 @@ public class ConfigureProfileMenuAdapter extends AbstractProfileMenuAdapter<Conf
holder.menuIcon.setVisibility(View.VISIBLE);
final ApplicationMode item = (ApplicationMode) obj;
holder.title.setText(item.toHumanString());
holder.descr.setText(BaseSettingsFragment.getAppModeDescription(app, item));
holder.descr.setText(ProfileDataUtils.getAppModeDescription(app, item));
holder.initSwitcher = true;
holder.compoundButton.setChecked(selectedItems.contains(item));

View file

@ -31,7 +31,6 @@ import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.BaseOsmAndFragment;
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
import net.osmand.plus.views.controls.ReorderItemTouchHelperCallback;
import java.util.ArrayList;
@ -241,7 +240,7 @@ public class EditProfilesFragment extends BaseOsmAndFragment {
if (order == null) {
order = mode.getOrder();
}
profiles.add(new EditProfileDataObject(modeKey, mode.toHumanString(), BaseSettingsFragment.getAppModeDescription(getContext(), mode),
profiles.add(new EditProfileDataObject(modeKey, mode.toHumanString(), ProfileDataUtils.getAppModeDescription(getContext(), mode),
mode.getIconRes(), false, mode.isCustomProfile(), deleted, mode.getIconColorInfo(), order));
}
}

View file

@ -3,6 +3,7 @@ package net.osmand.plus.profiles;
import androidx.annotation.ColorRes;
import androidx.annotation.NonNull;
public class ProfileDataObject implements Comparable<ProfileDataObject> {
private String name;
@ -62,4 +63,5 @@ public class ProfileDataObject implements Comparable<ProfileDataObject> {
public int compareTo(@NonNull ProfileDataObject another) {
return this.name.compareToIgnoreCase(another.name);
}
}

View file

@ -0,0 +1,136 @@
package net.osmand.plus.profiles;
import android.content.Context;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.router.GeneralRouter;
import net.osmand.router.RoutingConfiguration;
import net.osmand.util.Algorithms;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ProfileDataUtils {
public static final String OSMAND_NAVIGATION = "osmand_navigation";
public static List<ProfileDataObject> getDataObjects(OsmandApplication app,
List<ApplicationMode> appModes) {
List<ProfileDataObject> profiles = new ArrayList<>();
for (ApplicationMode mode : appModes) {
String description = mode.getDescription();
if (Algorithms.isEmpty(description)) {
description = getAppModeDescription(app, mode);
}
profiles.add(new ProfileDataObject(mode.toHumanString(), description,
mode.getStringKey(), mode.getIconRes(), false, mode.getIconColorInfo()));
}
return profiles;
}
public static String getAppModeDescription(Context ctx, ApplicationMode mode) {
String description;
if (mode.isCustomProfile()) {
description = ctx.getString(R.string.profile_type_user_string);
} else {
description = ctx.getString(R.string.profile_type_osmand_string);
}
return description;
}
public static List<RoutingProfileDataObject> getSortedRoutingProfiles(OsmandApplication app) {
List<RoutingProfileDataObject> result = new ArrayList<>();
Map<String, List<RoutingProfileDataObject>> routingProfilesByFileNames = getRoutingProfilesByFileNames(app);
List<String> fileNames = new ArrayList<>(routingProfilesByFileNames.keySet());
Collections.sort(fileNames, new Comparator<String>() {
@Override
public int compare(String s, String t1) {
return s.equals(OSMAND_NAVIGATION) ? -1 : t1.equals(OSMAND_NAVIGATION) ? 1 : s.compareToIgnoreCase(t1);
}
});
for (String fileName : fileNames) {
List<RoutingProfileDataObject> routingProfilesFromFile = routingProfilesByFileNames.get(fileName);
if (routingProfilesFromFile != null) {
Collections.sort(routingProfilesFromFile);
result.addAll(routingProfilesFromFile);
}
}
return result;
}
public static Map<String, List<RoutingProfileDataObject>> getRoutingProfilesByFileNames(OsmandApplication app) {
Map<String, List<RoutingProfileDataObject>> result = new HashMap<>();
for (final RoutingProfileDataObject profile : getRoutingProfiles(app).values()) {
String fileName = profile.getFileName() != null ? profile.getFileName() : OSMAND_NAVIGATION;
if (result.containsKey(fileName)) {
result.get(fileName).add(profile);
} else {
result.put(fileName, new ArrayList<RoutingProfileDataObject>() {
{ add(profile); }
});
}
}
return result;
}
public static Map<String, RoutingProfileDataObject> getRoutingProfiles(OsmandApplication context) {
Map<String, RoutingProfileDataObject> profilesObjects = new HashMap<>();
profilesObjects.put(RoutingProfileDataObject.RoutingProfilesResources.STRAIGHT_LINE_MODE.name(), new RoutingProfileDataObject(
RoutingProfileDataObject.RoutingProfilesResources.STRAIGHT_LINE_MODE.name(),
context.getString(RoutingProfileDataObject.RoutingProfilesResources.STRAIGHT_LINE_MODE.getStringRes()),
context.getString(R.string.special_routing_type),
RoutingProfileDataObject.RoutingProfilesResources.STRAIGHT_LINE_MODE.getIconRes(),
false, null));
profilesObjects.put(RoutingProfileDataObject.RoutingProfilesResources.DIRECT_TO_MODE.name(), new RoutingProfileDataObject(
RoutingProfileDataObject.RoutingProfilesResources.DIRECT_TO_MODE.name(),
context.getString(RoutingProfileDataObject.RoutingProfilesResources.DIRECT_TO_MODE.getStringRes()),
context.getString(R.string.special_routing_type),
RoutingProfileDataObject.RoutingProfilesResources.DIRECT_TO_MODE.getIconRes(),
false, null));
if (context.getBRouterService() != null) {
profilesObjects.put(RoutingProfileDataObject.RoutingProfilesResources.BROUTER_MODE.name(), new RoutingProfileDataObject(
RoutingProfileDataObject.RoutingProfilesResources.BROUTER_MODE.name(),
context.getString(RoutingProfileDataObject.RoutingProfilesResources.BROUTER_MODE.getStringRes()),
context.getString(R.string.third_party_routing_type),
RoutingProfileDataObject.RoutingProfilesResources.BROUTER_MODE.getIconRes(),
false, null));
}
List<String> disabledRouterNames = OsmandPlugin.getDisabledRouterNames();
for (RoutingConfiguration.Builder builder : context.getAllRoutingConfigs()) {
collectRoutingProfilesFromConfig(context, builder, profilesObjects, disabledRouterNames);
}
return profilesObjects;
}
private static void collectRoutingProfilesFromConfig(OsmandApplication app, RoutingConfiguration.Builder builder,
Map<String, RoutingProfileDataObject> profilesObjects, List<String> disabledRouterNames) {
for (Map.Entry<String, GeneralRouter> entry : builder.getAllRouters().entrySet()) {
String routerKey = entry.getKey();
GeneralRouter router = entry.getValue();
if (!routerKey.equals("geocoding") && !disabledRouterNames.contains(router.getFilename())) {
int iconRes = R.drawable.ic_action_gdirections_dark;
String name = router.getProfileName();
String description = app.getString(R.string.osmand_default_routing);
String fileName = router.getFilename();
if (!Algorithms.isEmpty(fileName)) {
description = fileName;
} else if (RoutingProfileDataObject.RoutingProfilesResources.isRpValue(name.toUpperCase())) {
iconRes = RoutingProfileDataObject.RoutingProfilesResources.valueOf(name.toUpperCase()).getIconRes();
name = app.getString(RoutingProfileDataObject.RoutingProfilesResources.valueOf(name.toUpperCase()).getStringRes());
}
profilesObjects.put(routerKey, new RoutingProfileDataObject(routerKey, name, description,
iconRes, false, fileName));
}
}
}
}

View file

@ -59,4 +59,5 @@ public class RoutingProfileDataObject extends ProfileDataObject {
return rpValues.contains(value);
}
}
}

View file

@ -88,7 +88,7 @@ public class SelectAppModesBottomSheetDialogFragment extends AppModesBottomSheet
OsmandSettings settings = getMyApplication().getSettings();
if (appMode != this.appMode) {
if (appModeChangeable) {
settings.APPLICATION_MODE.set(appMode);
settings.setApplicationMode(appMode);
}
Fragment targetFragment = getTargetFragment();
if (targetFragment instanceof AppModeChangedListener) {

View file

@ -19,7 +19,7 @@ import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
import net.osmand.plus.settings.fragments.NavigationFragment;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.bottomsheets.BasePreferenceBottomSheet;
import java.util.ArrayList;
@ -54,7 +54,8 @@ public class SelectMultipleProfilesBottomSheet extends BasePreferenceBottomSheet
private void refreshProfiles(OsmandApplication app) {
profiles.clear();
profiles.addAll(NavigationFragment.getBaseProfiles(app, true));
List<ApplicationMode> appModes = ApplicationMode.allPossibleValues();
profiles.addAll(ProfileDataUtils.getDataObjects(app, appModes));
for (ProfileDataObject profile : profiles) {
String key = profile.getStringKey();
profile.setSelected(selectedProfiles.contains(key));

View file

@ -2,8 +2,12 @@ package net.osmand.plus.profiles;
import android.app.Activity;
import android.content.Context;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
@ -15,6 +19,8 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
@ -28,10 +34,10 @@ import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.LongDescriptionItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.SimpleDividerItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
import net.osmand.plus.settings.fragments.MainSettingsFragment;
import net.osmand.plus.settings.fragments.NavigationFragment;
import net.osmand.plus.settings.fragments.ProfileAppearanceFragment;
import net.osmand.plus.helpers.FontCache;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.bottomsheets.BasePreferenceBottomSheet;
import net.osmand.router.RoutingConfiguration;
@ -42,35 +48,36 @@ import java.util.List;
import static net.osmand.plus.importfiles.ImportHelper.ImportType.ROUTING;
public class SelectProfileBottomSheetDialogFragment extends BasePreferenceBottomSheet {
public class SelectProfileBottomSheet extends BasePreferenceBottomSheet {
private static final Log LOG = PlatformUtil
.getLog(SelectProfileBottomSheetDialogFragment.class);
public static final String TAG = "SelectProfileBottomSheetDialogFragment";
private static final Log LOG = PlatformUtil.getLog(SelectProfileBottomSheet.class);
public static final String TAG = "SelectProfileBottomSheet";
public final static String DIALOG_TYPE = "dialog_type";
public final static String TYPE_BASE_APP_PROFILE = "base_profiles";
public final static String TYPE_NAV_PROFILE = "routing_profiles";
public final static String SELECTED_KEY = "selected_base";
public final static String PROFILE_KEY_ARG = "profile_key_arg";
public final static String USE_LAST_PROFILE_ARG = "use_last_profile_arg";
public final static String IS_PROFILE_IMPORTED_ARG = "is_profile_imported_arg";
String type;
private SelectProfileListener listener;
private DialogMode dialogMode;
private final List<ProfileDataObject> profiles = new ArrayList<>();
private String selectedItemKey;
public enum DialogMode {
BASE_PROFILE,
NAVIGATION_PROFILE,
DEFAULT_PROFILE
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
OsmandApplication app = getMyApplication();
Bundle args = getArguments();
if (args != null && args.get(DIALOG_TYPE) != null) {
type = args.getString(DIALOG_TYPE);
String dialogModeName = args.getString(DIALOG_TYPE);
dialogMode = DialogMode.valueOf(dialogModeName);
selectedItemKey = args.getString(SELECTED_KEY, null);
refreshProfiles(app);
}
@ -91,12 +98,12 @@ public class SelectProfileBottomSheetDialogFragment extends BasePreferenceBottom
@Override
public void createMenuItems(Bundle savedInstanceState) {
OsmandApplication app = requiredMyApplication();
View bottomSpaceView = new View(app);
int space = (int) getResources().getDimension(R.dimen.empty_state_text_button_padding_top);
bottomSpaceView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, space));
if (type.equals(TYPE_BASE_APP_PROFILE)) {
if (dialogMode == DialogMode.BASE_PROFILE) {
items.add(new TitleItem(getString(R.string.select_base_profile_dialog_title)));
items.add(new LongDescriptionItem(getString(R.string.select_base_profile_dialog_message)));
for (int i = 0; i < profiles.size(); i++) {
@ -138,7 +145,7 @@ public class SelectProfileBottomSheetDialogFragment extends BasePreferenceBottom
.setCustomView(bottomSpaceView)
.create());*/
} else if (type.equals(TYPE_NAV_PROFILE)) {
} else if (dialogMode == DialogMode.NAVIGATION_PROFILE) {
items.add(new TitleItem(getString(R.string.select_nav_profile_dialog_title)));
items.add(new LongDescriptionItem(getString(R.string.select_nav_profile_dialog_message)));
for (int i = 0; i < profiles.size(); i++) {
@ -146,11 +153,11 @@ public class SelectProfileBottomSheetDialogFragment extends BasePreferenceBottom
boolean showBottomDivider = false;
if (i < profiles.size() - 1) {
RoutingProfileDataObject nextProfile = (RoutingProfileDataObject) profiles.get(i + 1);
if (profile.getFileName() == null) {
showBottomDivider = nextProfile.getFileName() != null;
} else {
showBottomDivider = !profile.getFileName().equals(nextProfile.getFileName());
}
if (profile.getFileName() == null) {
showBottomDivider = nextProfile.getFileName() != null;
} else {
showBottomDivider = !profile.getFileName().equals(nextProfile.getFileName());
}
}
addProfileItem(profile, showBottomDivider);
}
@ -175,15 +182,44 @@ public class SelectProfileBottomSheetDialogFragment extends BasePreferenceBottom
items.add(new BaseBottomSheetItem.Builder()
.setCustomView(bottomSpaceView)
.create());
} else if (dialogMode == DialogMode.DEFAULT_PROFILE) {
items.add(new TitleItem(getString(R.string.settings_preset)));
items.add(new LongDescriptionItem(getString(R.string.profile_by_default_description)));
boolean useLastAppModeByDefault = app.getSettings().USE_LAST_APPLICATION_MODE_BY_DEFAULT.get();
addCheckableItem(R.string.shared_string_last_used, useLastAppModeByDefault, new OnClickListener() {
@Override
public void onClick(View v) {
Bundle args = new Bundle();
args.putBoolean(USE_LAST_PROFILE_ARG, true);
Fragment target = getTargetFragment();
if (target instanceof OnSelectProfileCallback) {
((OnSelectProfileCallback) target).onProfileSelected(args);
}
dismiss();
}
});
items.add(new SimpleDividerItem(app));
for (int i = 0; i < profiles.size(); i++) {
ProfileDataObject profile = profiles.get(i);
addProfileItem(profile, false, !useLastAppModeByDefault);
}
}
}
private void addProfileItem(final ProfileDataObject profile, boolean showBottomDivider) {
addProfileItem(profile, showBottomDivider, true);
}
private void addProfileItem(final ProfileDataObject profile,
boolean showBottomDivider,
boolean setupSelected) {
OsmandApplication app = requiredMyApplication();
int activeColorResId = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light;
int iconDefaultColorResId = nightMode ? R.color.icon_color_default_dark : R.color.icon_color_default_light;
View itemView = UiUtilities.getInflater(getContext(), nightMode).inflate(R.layout.bottom_sheet_item_with_descr_and_radio_btn, null);
TextView tvTitle = itemView.findViewById(R.id.title);
TextView tvDescription = itemView.findViewById(R.id.description);
@ -193,13 +229,13 @@ public class SelectProfileBottomSheetDialogFragment extends BasePreferenceBottom
tvTitle.setText(profile.getName());
tvDescription.setText(profile.getDescription());
boolean isSelected = profile.getStringKey().equals(selectedItemKey);
boolean isSelected = setupSelected && profile.getStringKey().equals(selectedItemKey);
int iconColor;
if (type.equals(TYPE_BASE_APP_PROFILE)) {
iconColor = profile.getIconColor(nightMode);
} else {
if (dialogMode == DialogMode.NAVIGATION_PROFILE) {
iconColor = isSelected ? activeColorResId : iconDefaultColorResId;
} else {
iconColor = profile.getIconColor(nightMode);
}
Drawable drawableIcon = app.getUIUtilities().getIcon(profile.getIconRes(), iconColor);
@ -213,28 +249,56 @@ public class SelectProfileBottomSheetDialogFragment extends BasePreferenceBottom
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (listener == null) {
getListener();
}
Bundle args = new Bundle();
args.putString(PROFILE_KEY_ARG, profile.getStringKey());
listener.onSelectedType(args);
Fragment target = getTargetFragment();
if (target instanceof OnSelectProfileCallback) {
((OnSelectProfileCallback) target).onProfileSelected(args);
}
dismiss();
}
})
.create());
}
private void addCheckableItem(int titleId,
boolean isSelected,
OnClickListener listener) {
OsmandApplication app = requiredMyApplication();
View itemView = UiUtilities.getInflater(getContext(), nightMode).inflate(R.layout.bottom_sheet_item_with_descr_and_radio_btn, null);
itemView.findViewById(R.id.icon).setVisibility(View.GONE);
itemView.findViewById(R.id.description).setVisibility(View.GONE);
itemView.findViewById(R.id.divider_bottom).setVisibility(View.GONE);
Typeface typeface = FontCache.getRobotoMedium(app);
String title = getString(titleId);
SpannableString spannable = UiUtilities.createCustomFontSpannable(typeface, title, title, title);
int activeColor = ContextCompat.getColor(app, getActiveColorId());
ForegroundColorSpan colorSpan = new ForegroundColorSpan(activeColor);
spannable.setSpan(colorSpan, 0, title.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
((TextView) itemView.findViewById(R.id.title)).setText(spannable);
CompoundButton compoundButton = itemView.findViewById(R.id.compound_button);
compoundButton.setChecked(isSelected);
UiUtilities.setupCompoundButton(compoundButton, nightMode, UiUtilities.CompoundButtonType.GLOBAL);
items.add(new BaseBottomSheetItem.Builder()
.setCustomView(itemView)
.setOnClickListener(listener)
.create());
}
private void addButtonItem(int titleId, int iconId, OnClickListener listener) {
OsmandApplication app = requiredMyApplication();
Context themedCtx = UiUtilities.getThemedContext(app, nightMode);
int activeColorResId = AndroidUtils.resolveAttribute(themedCtx, R.attr.active_color_basic);
View buttonView = View.inflate(themedCtx, R.layout.bottom_sheet_item_preference_btn, null);
TextView tvTitle = buttonView.findViewById(R.id.title);
tvTitle.setText(app.getString(titleId));
tvTitle.setText(getString(titleId));
ImageView ivIcon = buttonView.findViewById(R.id.icon);
ivIcon.setImageDrawable(app.getUIUtilities().getIcon(iconId, activeColorResId));
@ -244,18 +308,6 @@ public class SelectProfileBottomSheetDialogFragment extends BasePreferenceBottom
.create());
}
private void refreshProfiles(OsmandApplication app) {
profiles.clear();
if (type.equals(TYPE_NAV_PROFILE)) {
profiles.addAll(NavigationFragment.getSortedRoutingProfiles(app));
} else if (type.equals(TYPE_BASE_APP_PROFILE)) {
profiles.addAll(NavigationFragment.getBaseProfiles(app));
} else {
LOG.error("Check data type!");
dismiss();
}
}
private void refreshView() {
Activity activity = getActivity();
View mainView = getView();
@ -275,28 +327,25 @@ public class SelectProfileBottomSheetDialogFragment extends BasePreferenceBottom
}
}
private void getListener() {
FragmentActivity activity = getActivity();
if (activity != null) {
FragmentManager fragmentManager = activity.getSupportFragmentManager();
NavigationFragment navigationFragment = (NavigationFragment) fragmentManager.findFragmentByTag(NavigationFragment.class.getName());
ProfileAppearanceFragment profileAppearanceFragment = (ProfileAppearanceFragment) fragmentManager.findFragmentByTag(ProfileAppearanceFragment.TAG);
MainSettingsFragment mainSettingsFragment = (MainSettingsFragment) fragmentManager.findFragmentByTag(MainSettingsFragment.TAG);
private void refreshProfiles(OsmandApplication app) {
profiles.clear();
switch (dialogMode) {
case BASE_PROFILE:
List<ApplicationMode> appModes = new ArrayList<>(ApplicationMode.allPossibleValues());
appModes.remove(ApplicationMode.DEFAULT);
profiles.addAll(ProfileDataUtils.getDataObjects(app, appModes));
break;
if (navigationFragment != null) {
listener = navigationFragment.getNavProfileListener();
} else if (profileAppearanceFragment != null) {
listener = profileAppearanceFragment.getParentProfileListener();
} else if (mainSettingsFragment != null) {
listener = mainSettingsFragment.getParentProfileListener();
}
case NAVIGATION_PROFILE:
profiles.addAll(ProfileDataUtils.getSortedRoutingProfiles(app));
break;
case DEFAULT_PROFILE:
profiles.addAll(ProfileDataUtils.getDataObjects(app, ApplicationMode.values(app)));
break;
}
}
public interface SelectProfileListener {
void onSelectedType(Bundle args);
}
@Nullable
private MapActivity getMapActivity() {
Activity activity = getActivity();
@ -305,4 +354,23 @@ public class SelectProfileBottomSheetDialogFragment extends BasePreferenceBottom
}
return null;
}
public static void showInstance(@NonNull FragmentActivity activity,
@NonNull DialogMode dialogMode,
@Nullable Fragment target,
String selectedItemKey,
boolean usedOnMap) {
SelectProfileBottomSheet fragment = new SelectProfileBottomSheet();
Bundle args = new Bundle();
args.putString(DIALOG_TYPE, dialogMode.name());
args.putString(SELECTED_KEY, selectedItemKey);
fragment.setArguments(args);
fragment.setUsedOnMap(usedOnMap);
fragment.setTargetFragment(target, 0);
fragment.show(activity.getSupportFragmentManager(), TAG);
}
public interface OnSelectProfileCallback {
void onProfileSelected(Bundle args);
}
}

View file

@ -19,7 +19,6 @@ import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
@ -99,7 +98,7 @@ public class SelectProfileMenuAdapter extends AbstractProfileMenuAdapter<SelectP
holder.menuIcon.setVisibility(View.GONE);
final ApplicationMode item = (ApplicationMode) obj;
holder.title.setText(item.toHumanString());
holder.descr.setText(BaseSettingsFragment.getAppModeDescription(app, item));
holder.descr.setText(ProfileDataUtils.getAppModeDescription(app, item));
int profileColorResId = item.getIconColorInfo().getColor(nightMode);
holder.icon.setImageDrawable(app.getUIUtilities().getIcon(profileColorResId, selectedIconColorRes));

View file

@ -123,7 +123,7 @@ public class SwitchProfileAction extends SwitchableAction<String> {
ApplicationMode appMode = getModeForKey(params);
if (appMode != null) {
OsmandApplication app = activity.getMyApplication();
app.getSettings().APPLICATION_MODE.set(appMode);
app.getSettings().setApplicationMode(appMode);
app.getQuickActionRegistry().setQuickActionFabState(true);
String message = String.format(activity.getString(

View file

@ -20,6 +20,7 @@ import androidx.fragment.app.Fragment;
import net.osmand.AndroidUtils;
import net.osmand.data.LatLon;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
@ -32,6 +33,7 @@ import net.osmand.plus.base.bottomsheetmenu.simpleitems.SubtitleDividerItem;
import net.osmand.plus.dashboard.DashboardOnMap;
import net.osmand.plus.helpers.AvoidSpecificRoads;
import net.osmand.router.GeneralRouter;
import net.osmand.router.RouteSegmentResult;
import java.io.Serializable;
import java.util.ArrayList;
@ -52,6 +54,7 @@ public class AvoidRoadsBottomSheetDialogFragment extends MenuBottomSheetDialogFr
private static final String AVOID_ROADS_TYPES_KEY = "avoid_roads_types";
private static final String HIDE_IMPASSABLE_ROADS_KEY = "hide_impassable_roads";
private static final String AVOID_ROADS_OBJECTS_KEY = "avoid_roads_objects";
private static final String AVOID_ROADS_APP_MODE_KEY = "avoid_roads_app_mode";
private RoutingOptionsHelper routingOptionsHelper;
@ -63,11 +66,16 @@ public class AvoidRoadsBottomSheetDialogFragment extends MenuBottomSheetDialogFr
private boolean hideImpassableRoads;
@ColorRes
private int compoundButtonColorId = INVALID_ID;
private ApplicationMode appMode;
public void setHideImpassableRoads(boolean hideImpassableRoads) {
this.hideImpassableRoads = hideImpassableRoads;
}
public void setApplicationMode(ApplicationMode appMode) {
this.appMode = appMode;
}
@Override
public void createMenuItems(Bundle savedInstanceState) {
final OsmandApplication app = getMyApplication();
@ -83,6 +91,9 @@ public class AvoidRoadsBottomSheetDialogFragment extends MenuBottomSheetDialogFr
if (savedInstanceState.containsKey(AVOID_ROADS_OBJECTS_KEY)) {
removedImpassableRoads = (List<LatLon>) savedInstanceState.getSerializable(AVOID_ROADS_OBJECTS_KEY);
}
if (savedInstanceState.containsKey(AVOID_ROADS_APP_MODE_KEY)) {
appMode = ApplicationMode.valueOfStringKey(savedInstanceState.getString(AVOID_ROADS_APP_MODE_KEY), null);
}
}
if (routingParametersMap == null) {
routingParametersMap = getRoutingParametersMap(app);
@ -154,7 +165,7 @@ public class AvoidRoadsBottomSheetDialogFragment extends MenuBottomSheetDialogFr
if (mapActivity != null) {
mapActivity.getDashboard().setDashboardVisibility(false, DashboardOnMap.DashboardType.ROUTE_PREFERENCES);
mapActivity.getMapRouteInfoMenu().hide();
app.getAvoidSpecificRoads().selectFromMap(mapActivity);
app.getAvoidSpecificRoads().selectFromMap(mapActivity, appMode);
Fragment fragment = getTargetFragment();
if (fragment != null) {
fragment.onActivityResult(getTargetRequestCode(), OPEN_AVOID_ROADS_DIALOG_REQUEST_CODE, null);
@ -262,6 +273,9 @@ public class AvoidRoadsBottomSheetDialogFragment extends MenuBottomSheetDialogFr
outState.putSerializable(AVOID_ROADS_TYPES_KEY, routingParametersMap);
outState.putSerializable(AVOID_ROADS_OBJECTS_KEY, (Serializable) removedImpassableRoads);
outState.putBoolean(HIDE_IMPASSABLE_ROADS_KEY, hideImpassableRoads);
if (appMode != null) {
outState.putString(AVOID_ROADS_APP_MODE_KEY, appMode.getStringKey());
}
}
@Override
@ -301,7 +315,7 @@ public class AvoidRoadsBottomSheetDialogFragment extends MenuBottomSheetDialogFr
avoidSpecificRoads.removeImpassableRoad(routeLocation);
}
app.getRoutingHelper().recalculateRouteDueToSettingsChange();
app.getRoutingHelper().onSettingsChanged(true);
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
final MapRouteInfoMenu mapRouteInfoMenu = mapActivity.getMapRouteInfoMenu();

View file

@ -521,7 +521,7 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
}
mapActivity.getMapActions().setGPXRouteParams(gpxFile);
app.getTargetPointsHelper().updateRouteAndRefresh(true);
app.getRoutingHelper().recalculateRouteDueToSettingsChange();
app.getRoutingHelper().onSettingsChanged(true);
}
}

View file

@ -9,6 +9,7 @@ import android.os.Build;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.Handler;
import android.util.Pair;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
@ -51,12 +52,8 @@ import net.osmand.plus.GeocodingLookupService;
import net.osmand.plus.GeocodingLookupService.AddressLookupRequest;
import net.osmand.plus.GeocodingLookupService.OnAddressLookupResult;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.mapmarkers.MapMarker;
import net.osmand.plus.OsmAndLocationProvider;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.TargetPointsHelper;
import net.osmand.plus.TargetPointsHelper.TargetPoint;
@ -70,6 +67,7 @@ import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo;
import net.osmand.plus.helpers.GpxUiHelper;
import net.osmand.plus.helpers.WaypointHelper;
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenuFragment;
import net.osmand.plus.mapmarkers.MapMarker;
import net.osmand.plus.mapmarkers.MapMarkerSelectionFragment;
import net.osmand.plus.poi.PoiUIFilter;
import net.osmand.plus.profiles.AppModesBottomSheetDialogFragment;
@ -101,9 +99,16 @@ import net.osmand.plus.routing.IRouteInformationListener;
import net.osmand.plus.routing.RouteCalculationResult;
import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelperUtils;
import net.osmand.plus.routing.TransportRoutingHelper;
import net.osmand.plus.search.QuickSearchHelper;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.layers.ContextMenuLayer.IContextMenuProvider;
import net.osmand.plus.widgets.TextViewExProgress;
import net.osmand.router.GeneralRouter;
import net.osmand.router.GeneralRouter.RoutingParameter;
@ -281,7 +286,10 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
if (selectFromMapTouch) {
selectFromMapTouch = false;
LatLon latLon = tileBox.getLatLonFromPixel(point.x, point.y);
choosePointTypeAction(mapActivity, latLon, selectFromMapPointType, null, null);
Pair<LatLon, PointDescription> pair = getObjectLocation(mapActivity.getMapView(), point, tileBox);
LatLon selectedPoint = pair != null ? pair.first : latLon;
PointDescription name = pair != null ? pair.second : null;
choosePointTypeAction(mapActivity, selectedPoint, selectFromMapPointType, name, null);
if (selectFromMapWaypoints) {
WaypointsFragment.showInstance(mapActivity.getSupportFragmentManager(), true);
} else {
@ -293,6 +301,28 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
return false;
}
private Pair<LatLon, PointDescription> getObjectLocation(OsmandMapTileView mapView, PointF point, RotatedTileBox tileBox) {
List<Object> objects = new ArrayList<>();
for (OsmandMapLayer layer : mapView.getLayers()) {
if (layer instanceof IContextMenuProvider) {
objects.clear();
IContextMenuProvider provider = (IContextMenuProvider) layer;
provider.collectObjectsFromPoint(point, tileBox, objects, true);
for (Object o : objects) {
if (provider.isObjectClickable(o)) {
LatLon latLon = provider.getObjectLocation(o);
PointDescription name = null;
if (o instanceof FavouritePoint) {
name = ((FavouritePoint) o).getPointDescription(mapView.getApplication());
}
return new Pair<>(latLon, name);
}
}
}
}
return null;
}
private void choosePointTypeAction(MapActivity mapActivity, LatLon latLon, PointType pointType, PointDescription pd, String address) {
OsmandApplication app = getApp();
FavouritesDbHelper favorites = app.getFavorites();
@ -862,7 +892,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
}
routingHelper.setAppMode(next);
app.initVoiceCommandPlayer(mapActivity, next, true, null, false, false, true);
routingHelper.recalculateRouteDueToSettingsChange();
routingHelper.onSettingsChanged(true);
}
}
@ -1279,7 +1309,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
if (mapActivity != null) {
OsmandApplication app = mapActivity.getMyApplication();
app.getAvoidSpecificRoads().removeImpassableRoad(avoidRoadInfo);
app.getRoutingHelper().recalculateRouteDueToSettingsChange();
app.getRoutingHelper().onSettingsChanged(true);
if (app.getAvoidSpecificRoads().getImpassableRoads().isEmpty() && getAvoidedParameters(app).isEmpty()) {
mode.parameters.remove(parameter);
}
@ -1312,7 +1342,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
CommonPreference<Boolean> preference = settings.getCustomRoutingBooleanProperty(routingParameter.getId(), routingParameter.getDefaultBoolean());
preference.setModeValue(app.getRoutingHelper().getAppMode(), false);
avoidedParameters.remove(routingParameter);
app.getRoutingHelper().recalculateRouteDueToSettingsChange();
app.getRoutingHelper().onSettingsChanged(true);
if (app.getAvoidSpecificRoads().getImpassableRoads().isEmpty() && avoidedParameters.isEmpty()) {
mode.parameters.remove(parameter);
}
@ -2411,7 +2441,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
}
} else if (routingHelper.isRouteCalculated()) {
RouteCalculationResult result = routingHelper.getRoute();
QuadRect routeRect = routingHelper.getRouteRect(result);
QuadRect routeRect = RoutingHelperUtils.getRouteRect(app, result);
if (routeRect != null) {
rect = routeRect;
}

View file

@ -1,7 +1,6 @@
package net.osmand.plus.routepreparationmenu;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Build;
@ -13,7 +12,6 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.ColorRes;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.SwitchCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
@ -400,7 +398,7 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
boolean enabled = !settings.ENABLE_TIME_CONDITIONAL_ROUTING.getModeValue(applicationMode);
settings.ENABLE_TIME_CONDITIONAL_ROUTING.setModeValue(applicationMode, enabled);
timeConditionalRoutingItem[0].setChecked(enabled);
app.getRoutingHelper().recalculateRouteDueToSettingsChange();
app.getRoutingHelper().onSettingsChanged(applicationMode, true);
}
})
.create();
@ -473,6 +471,7 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
AvoidRoadsBottomSheetDialogFragment avoidRoadsFragment = new AvoidRoadsBottomSheetDialogFragment();
avoidRoadsFragment.setTargetFragment(RouteOptionsBottomSheet.this, AvoidRoadsBottomSheetDialogFragment.REQUEST_CODE);
avoidRoadsFragment.setCompoundButtonColorId(selectedModeColorId);
avoidRoadsFragment.setApplicationMode(applicationMode);
avoidRoadsFragment.show(mapActivity.getSupportFragmentManager(), AvoidRoadsBottomSheetDialogFragment.TAG);
updateMenu();
}
@ -656,19 +655,6 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
}
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
super.onDismiss(dialog);
notifyAppModeConfigurationChanged();
}
private void notifyAppModeConfigurationChanged() {
Fragment fragment = getTargetFragment();
if (fragment instanceof OnAppModeConfiguredCallback) {
((OnAppModeConfiguredCallback) fragment).onAppModeConfigured();
}
}
private List<LocalRoutingParameter> getRoutingParameters(ApplicationMode applicationMode) {
List<String> routingParameters;
@ -742,10 +728,6 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
}
}
public interface OnAppModeConfiguredCallback {
void onAppModeConfigured();
}
public enum AppModeOptions {
CAR(MuteSoundRoutingParameter.KEY,

View file

@ -113,7 +113,7 @@ public class RoutingOptionsHelper {
public void selectRestrictedRoads(final MapActivity mapActivity) {
mapActivity.getDashboard().setDashboardVisibility(false, DashboardOnMap.DashboardType.ROUTE_PREFERENCES);
mapActivity.getMapRouteInfoMenu().hide();
mapActivity.getMyApplication().getAvoidSpecificRoads().showDialog(mapActivity);
mapActivity.getMyApplication().getAvoidSpecificRoads().showDialog(mapActivity, null);
}
public void selectVoiceGuidance(final MapActivity mapActivity, final CallbackWithObject<String> callback, ApplicationMode applicationMode) {
@ -230,7 +230,7 @@ public class RoutingOptionsHelper {
if (rp instanceof OtherLocalRoutingParameter) {
updateGpxRoutingParameter((OtherLocalRoutingParameter) rp);
}
routingHelper.recalculateRouteDueToSettingsChange();
routingHelper.onSettingsChanged(rp.getApplicationMode(), true);
}
public void updateGpxRoutingParameter(OtherLocalRoutingParameter gpxParam) {
@ -377,7 +377,7 @@ public class RoutingOptionsHelper {
LocalRoutingParameter rp = group.getRoutingParameters().get(i);
rp.setSelected(settings, i == position);
}
mapActivity.getRoutingHelper().recalculateRouteDueToSettingsChange();
mapActivity.getRoutingHelper().onSettingsChanged(true);
if (listener != null) {
listener.onClick();
}

View file

@ -108,7 +108,7 @@ public class MapMarkersCard extends BaseCard {
public void onClick(View v) {
LatLon point = new LatLon(marker.getLatitude(), marker.getLongitude());
app.getTargetPointsHelper().navigateToPoint(point, true, -1, marker.getPointDescription(mapActivity));
app.getRoutingHelper().recalculateRouteDueToSettingsChange();
app.getRoutingHelper().onSettingsChanged(true);
}
});
if (i > 0) {

View file

@ -0,0 +1,87 @@
package net.osmand.plus.routing;
import androidx.annotation.NonNull;
import net.osmand.Location;
import net.osmand.binary.RouteDataObject;
import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.router.RouteSegmentResult;
import net.osmand.router.TurnType;
import net.osmand.util.Algorithms;
public class CurrentStreetName {
public String text;
public TurnType turnType;
public boolean showMarker; // turn type has priority over showMarker
public RouteDataObject shieldObject;
public String exitRef;
@NonNull
private static String getRouteSegmentStreetName(@NonNull RoutingHelper routingHelper, @NonNull RouteSegmentResult rs, boolean includeRef) {
OsmandSettings settings = routingHelper.getSettings();
String nm = rs.getObject().getName(settings.MAP_PREFERRED_LOCALE.get(), settings.MAP_TRANSLITERATE_NAMES.get());
String rf = rs.getObject().getRef(settings.MAP_PREFERRED_LOCALE.get(), settings.MAP_TRANSLITERATE_NAMES.get(), rs.isForwardDirection());
String dn = rs.getObject().getDestinationName(settings.MAP_PREFERRED_LOCALE.get(),
settings.MAP_TRANSLITERATE_NAMES.get(), rs.isForwardDirection());
return RoutingHelperUtils.formatStreetName(nm, includeRef ? rf : null, dn, "»");
}
@NonNull
public static CurrentStreetName getCurrentName(@NonNull RoutingHelper routingHelper, @NonNull NextDirectionInfo n) {
CurrentStreetName streetName = new CurrentStreetName();
Location l = routingHelper.getLastFixedLocation();
float speed = 0;
if (l != null && l.hasSpeed()) {
speed = l.getSpeed();
}
boolean isSet = false;
// 1. turn is imminent
if (n.distanceTo > 0 && n.directionInfo != null && !n.directionInfo.getTurnType().isSkipToSpeak() &&
routingHelper.getVoiceRouter().isDistanceLess(speed, n.distanceTo, routingHelper.getVoiceRouter().PREPARE_DISTANCE * 0.75f)) {
String nm = n.directionInfo.getStreetName();
String rf = n.directionInfo.getRef();
String dn = n.directionInfo.getDestinationName();
isSet = !(Algorithms.isEmpty(nm) && Algorithms.isEmpty(rf) && Algorithms.isEmpty(dn));
streetName.text = RoutingHelperUtils.formatStreetName(nm, null, dn, "»");
streetName.turnType = n.directionInfo.getTurnType();
streetName.shieldObject = n.directionInfo.getRouteDataObject();
if (streetName.turnType == null) {
streetName.turnType = TurnType.valueOf(TurnType.C, false);
}
if (n.directionInfo.getExitInfo() != null) {
streetName.exitRef = n.directionInfo.getExitInfo().getRef();
if (!Algorithms.isEmpty(n.directionInfo.getExitInfo().getExitStreetName())) {
streetName.text = n.directionInfo.getExitInfo().getExitStreetName();
}
}
}
// 2. display current road street name
if (!isSet) {
RouteSegmentResult rs = routingHelper.getCurrentSegmentResult();
if (rs != null) {
streetName.text = getRouteSegmentStreetName(routingHelper, rs, false);
if (Algorithms.isEmpty(streetName.text)) {
isSet = !Algorithms.isEmpty(getRouteSegmentStreetName(routingHelper, rs, true));
} else {
isSet = true;
}
streetName.showMarker = true;
streetName.shieldObject = rs.getObject();
}
}
// 3. display next road street name if this one empty
if (!isSet) {
RouteSegmentResult rs = routingHelper.getNextStreetSegmentResult();
if (rs != null) {
streetName.text = getRouteSegmentStreetName(routingHelper, rs, false);
streetName.turnType = TurnType.valueOf(TurnType.C, false);
streetName.shieldObject = rs.getObject();
}
}
if (streetName.turnType == null) {
streetName.showMarker = true;
}
return streetName;
}
}

View file

@ -0,0 +1,12 @@
package net.osmand.plus.routing;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.plus.settings.backend.ApplicationMode;
public interface IRouteSettingsListener {
void onRouteSettingsChanged(@Nullable ApplicationMode mode);
}

View file

@ -5,7 +5,6 @@ import net.osmand.data.LatLon;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.routing.RouteProvider.GPXRouteParams;
import net.osmand.plus.routing.RoutingHelper.RouteCalculationProgressCallback;
import net.osmand.router.RouteCalculationProgress;
import java.util.List;

View file

@ -0,0 +1,12 @@
package net.osmand.plus.routing;
public interface RouteCalculationProgressCallback {
void start();
void updateProgress(int progress);
void requestPrivateAccessRouting();
void finish();
}

View file

@ -435,7 +435,7 @@ public class RouteCalculationResult {
}
}
String description = toString(turn, ctx, false) + " " + RoutingHelper.formatStreetName(info.getStreetName(),
String description = toString(turn, ctx, false) + " " + RoutingHelperUtils.formatStreetName(info.getStreetName(),
info.getRef(), info.getDestinationName(), ctx.getString(R.string.towards));
description = description.trim();
String[] pointNames = s.getObject().getPointNames(s.getStartPointIndex());

View file

@ -0,0 +1,406 @@
package net.osmand.plus.routing;
import androidx.annotation.NonNull;
import net.osmand.Location;
import net.osmand.data.LatLon;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.router.RouteCalculationProgress;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import static net.osmand.plus.notifications.OsmandNotification.NotificationType.NAVIGATION;
class RouteRecalculationHelper {
private static final int RECALCULATE_THRESHOLD_COUNT_CAUSING_FULL_RECALCULATE = 3;
private static final int RECALCULATE_THRESHOLD_CAUSING_FULL_RECALCULATE_INTERVAL = 2 * 60 * 1000;
private final OsmandApplication app;
private final RoutingHelper routingHelper;
private final ExecutorService executor = new RouteRecalculationExecutor();
private final Map<Future<?>, RouteRecalculationTask> tasksMap = new LinkedHashMap<>();
private RouteRecalculationTask lastTask;
private long lastTimeEvaluatedRoute = 0;
private String lastRouteCalcError;
private String lastRouteCalcErrorShort;
private long recalculateCountInInterval = 0;
private int evalWaitInterval = 0;
private RouteCalculationProgressCallback progressRoute;
RouteRecalculationHelper(@NonNull RoutingHelper routingHelper) {
this.routingHelper = routingHelper;
this.app = routingHelper.getApplication();
}
String getLastRouteCalcError() {
return lastRouteCalcError;
}
String getLastRouteCalcErrorShort() {
return lastRouteCalcErrorShort;
}
void setProgressBar(RouteCalculationProgressCallback progressRoute) {
this.progressRoute = progressRoute;
}
boolean isRouteBeingCalculated() {
synchronized (routingHelper) {
for (Future<?> future : tasksMap.keySet()) {
if (!future.isDone()) {
return true;
}
}
}
return false;
}
void resetEvalWaitInterval() {
evalWaitInterval = 0;
}
void stopCalculation() {
synchronized (routingHelper) {
for (Entry<Future<?>, RouteRecalculationTask> taskFuture : tasksMap.entrySet()) {
taskFuture.getValue().stopCalculation();
taskFuture.getKey().cancel(false);
}
}
}
void stopCalculationIfParamsNotChanged() {
synchronized (routingHelper) {
boolean hasPendingTasks = tasksMap.isEmpty();
for (Entry<Future<?>, RouteRecalculationTask> taskFuture : tasksMap.entrySet()) {
RouteRecalculationTask task = taskFuture.getValue();
if (!task.isParamsChanged()) {
taskFuture.getKey().cancel(false);
task.stopCalculation();
}
}
if (hasPendingTasks) {
if (isFollowingMode()) {
getVoiceRouter().announceBackOnRoute();
}
}
}
}
private OsmandSettings getSettings() {
return routingHelper.getSettings();
}
private ApplicationMode getAppMode() {
return routingHelper.getAppMode();
}
private boolean isFollowingMode() {
return routingHelper.isFollowingMode();
}
private VoiceRouter getVoiceRouter() {
return routingHelper.getVoiceRouter();
}
private Location getLastFixedLocation() {
return routingHelper.getLastFixedLocation();
}
private boolean isDeviatedFromRoute() {
return routingHelper.isDeviatedFromRoute();
}
private Location getLastProjection() {
return routingHelper.getLastProjection();
}
private void setNewRoute(RouteCalculationResult prevRoute, final RouteCalculationResult res, Location start) {
final boolean newRoute = !prevRoute.isCalculated();
if (isFollowingMode()) {
Location lastFixedLocation = getLastFixedLocation();
if (lastFixedLocation != null) {
start = lastFixedLocation;
}
// try remove false route-recalculated prompts by checking direction to second route node
boolean wrongMovementDirection = false;
List<Location> routeNodes = res.getImmutableAllLocations();
if (routeNodes != null && !routeNodes.isEmpty()) {
int newCurrentRoute = RoutingHelperUtils.lookAheadFindMinOrthogonalDistance(start, routeNodes, res.currentRoute, 15);
if (newCurrentRoute + 1 < routeNodes.size()) {
// This check is valid for Online/GPX services (offline routing is aware of route direction)
wrongMovementDirection = RoutingHelperUtils.checkWrongMovementDirection(start, routeNodes.get(newCurrentRoute + 1));
// set/reset evalWaitInterval only if new route is in forward direction
if (wrongMovementDirection) {
evalWaitInterval = 3000;
} else {
evalWaitInterval = Math.max(3000, evalWaitInterval * 3 / 2);
evalWaitInterval = Math.min(evalWaitInterval, 120000);
}
}
}
// trigger voice prompt only if new route is in forward direction
// If route is in wrong direction after one more setLocation it will be recalculated
if (!wrongMovementDirection || newRoute) {
getVoiceRouter().newRouteIsCalculated(newRoute);
}
}
app.getWaypointHelper().setNewRoute(res);
routingHelper.newRouteCalculated(newRoute, res);
}
void startRouteCalculationThread(RouteCalculationParams params, boolean paramsChanged, boolean updateProgress) {
synchronized (routingHelper) {
getSettings().LAST_ROUTE_APPLICATION_MODE.set(getAppMode());
RouteRecalculationTask newTask = new RouteRecalculationTask(this, params, paramsChanged);
lastTask = newTask;
startProgress(params);
if (updateProgress) {
updateProgress(params);
}
Future<?> future = executor.submit(newTask);
tasksMap.put(future, newTask);
}
}
public void recalculateRouteInBackground(final Location start, final LatLon end, final List<LatLon> intermediates,
final RouteProvider.GPXRouteParamsBuilder gpxRoute, final RouteCalculationResult previousRoute, boolean paramsChanged, boolean onlyStartPointChanged) {
if (start == null || end == null) {
return;
}
// do not evaluate very often
if ((!isRouteBeingCalculated() && System.currentTimeMillis() - lastTimeEvaluatedRoute > evalWaitInterval)
|| paramsChanged || !onlyStartPointChanged) {
if (System.currentTimeMillis() - lastTimeEvaluatedRoute < RECALCULATE_THRESHOLD_CAUSING_FULL_RECALCULATE_INTERVAL) {
recalculateCountInInterval++;
}
ApplicationMode mode = getAppMode();
final RouteCalculationParams params = new RouteCalculationParams();
params.start = start;
params.end = end;
params.intermediates = intermediates;
params.gpxRoute = gpxRoute == null ? null : gpxRoute.build(app);
params.onlyStartPointChanged = onlyStartPointChanged;
if (recalculateCountInInterval < RECALCULATE_THRESHOLD_COUNT_CAUSING_FULL_RECALCULATE
|| (gpxRoute != null && gpxRoute.isPassWholeRoute() && isDeviatedFromRoute())) {
params.previousToRecalculate = previousRoute;
} else {
recalculateCountInInterval = 0;
}
params.leftSide = getSettings().DRIVING_REGION.get().leftHandDriving;
params.fast = getSettings().FAST_ROUTE_MODE.getModeValue(mode);
params.mode = mode;
params.ctx = app;
boolean updateProgress = false;
if (params.mode.getRouteService() == RouteProvider.RouteService.OSMAND) {
params.calculationProgress = new RouteCalculationProgress();
updateProgress = true;
} else {
params.resultListener = new RouteCalculationParams.RouteCalculationResultListener() {
@Override
public void onRouteCalculated(RouteCalculationResult route) {
app.runInUIThread(new Runnable() {
@Override
public void run() {
finishProgress(params);
}
});
}
};
}
if (getLastProjection() != null) {
params.currentLocation = getLastFixedLocation();
}
startRouteCalculationThread(params, paramsChanged, updateProgress);
}
}
void startProgress(final RouteCalculationParams params) {
if (params.calculationProgressCallback != null) {
params.calculationProgressCallback.start();
} else if (progressRoute != null) {
progressRoute.start();
}
}
void updateProgress(final RouteCalculationParams params) {
final RouteCalculationProgressCallback progressRoute;
if (params.calculationProgressCallback != null) {
progressRoute = params.calculationProgressCallback;
} else {
progressRoute = this.progressRoute;
}
if (progressRoute != null) {
app.runInUIThread(new Runnable() {
@Override
public void run() {
RouteCalculationProgress calculationProgress = params.calculationProgress;
if (isRouteBeingCalculated()) {
if (lastTask != null && lastTask.params == params) {
progressRoute.updateProgress((int) calculationProgress.getLinearProgress());
if (calculationProgress.requestPrivateAccessRouting) {
progressRoute.requestPrivateAccessRouting();
}
updateProgress(params);
}
} else {
if (calculationProgress.requestPrivateAccessRouting) {
progressRoute.requestPrivateAccessRouting();
}
progressRoute.finish();
}
}
}, 300);
}
}
void finishProgress(RouteCalculationParams params) {
final RouteCalculationProgressCallback progressRoute;
if (params.calculationProgressCallback != null) {
progressRoute = params.calculationProgressCallback;
} else {
progressRoute = this.progressRoute;
}
if (progressRoute != null) {
progressRoute.finish();
}
}
private static class RouteRecalculationTask implements Runnable {
private final RouteRecalculationHelper routingThreadHelper;
private final RoutingHelper routingHelper;
private final RouteCalculationParams params;
private final boolean paramsChanged;
String routeCalcError;
String routeCalcErrorShort;
int evalWaitInterval = 0;
public RouteRecalculationTask(@NonNull RouteRecalculationHelper routingThreadHelper,
@NonNull RouteCalculationParams params, boolean paramsChanged) {
this.routingThreadHelper = routingThreadHelper;
this.routingHelper = routingThreadHelper.routingHelper;
this.params = params;
this.paramsChanged = paramsChanged;
if (params.calculationProgress == null) {
params.calculationProgress = new RouteCalculationProgress();
}
}
public boolean isParamsChanged() {
return paramsChanged;
}
public void stopCalculation() {
params.calculationProgress.isCancelled = true;
}
private OsmandSettings getSettings() {
return routingHelper.getSettings();
}
private void showMessage(final String msg) {
final OsmandApplication app = routingHelper.getApplication();
app.runInUIThread(new Runnable() {
@Override
public void run() {
app.showToastMessage(msg);
}
});
}
@Override
public void run() {
RouteProvider provider = routingHelper.getProvider();
OsmandSettings settings = getSettings();
RouteCalculationResult res = provider.calculateRouteImpl(params);
if (params.calculationProgress.isCancelled) {
return;
}
final boolean onlineSourceWithoutInternet = !res.isCalculated() &&
params.mode.getRouteService().isOnline() && !settings.isInternetConnectionAvailable();
if (onlineSourceWithoutInternet && settings.GPX_ROUTE_CALC_OSMAND_PARTS.get()) {
if (params.previousToRecalculate != null && params.previousToRecalculate.isCalculated()) {
res = provider.recalculatePartOfflineRoute(res, params);
}
}
RouteCalculationResult prev = routingHelper.getRoute();
synchronized (routingHelper) {
if (res.isCalculated()) {
if (!params.inSnapToRoadMode && !params.inPublicTransportMode) {
routingHelper.setRoute(res);
routingHelper.updateOriginalRoute();
}
if (params.resultListener != null) {
params.resultListener.onRouteCalculated(res);
}
} else {
evalWaitInterval = Math.max(3000, routingThreadHelper.evalWaitInterval * 3 / 2); // for Issue #3899
evalWaitInterval = Math.min(evalWaitInterval, 120000);
}
}
OsmandApplication app = routingHelper.getApplication();
if (res.isCalculated()) {
if (!params.inSnapToRoadMode && !params.inPublicTransportMode) {
routingThreadHelper.setNewRoute(prev, res, params.start);
}
} else if (onlineSourceWithoutInternet) {
routeCalcError = app.getString(R.string.error_calculating_route)
+ ":\n" + app.getString(R.string.internet_connection_required_for_online_route);
routeCalcErrorShort = app.getString(R.string.error_calculating_route);
showMessage(routeCalcError);
} else {
if (res.getErrorMessage() != null) {
routeCalcError = app.getString(R.string.error_calculating_route) + ":\n" + res.getErrorMessage();
routeCalcErrorShort = app.getString(R.string.error_calculating_route);
} else {
routeCalcError = app.getString(R.string.empty_route_calculated);
routeCalcErrorShort = app.getString(R.string.empty_route_calculated);
}
showMessage(routeCalcError);
}
app.getNotificationHelper().refreshNotification(NAVIGATION);
}
}
private class RouteRecalculationExecutor extends ThreadPoolExecutor {
public RouteRecalculationExecutor() {
super(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
RouteRecalculationTask task = null;
synchronized (routingHelper) {
if (r instanceof Future<?>) {
task = tasksMap.remove(r);
}
}
if (t == null && task != null) {
evalWaitInterval = task.evalWaitInterval;
lastRouteCalcError = task.routeCalcError;
lastRouteCalcErrorShort = task.routeCalcErrorShort;
}
lastTimeEvaluatedRoute = System.currentTimeMillis();
}
}
}

View file

@ -0,0 +1,59 @@
package net.osmand.plus.routing;
import net.osmand.binary.RouteDataObject;
import net.osmand.data.QuadPoint;
import net.osmand.router.RouteSegmentResult;
import net.osmand.util.MapUtils;
import java.util.List;
public class RouteSegmentSearchResult {
private final int roadIndex;
private final int segmentIndex;
private final QuadPoint point;
RouteSegmentSearchResult(int roadIndex, int segmentIndex, QuadPoint point) {
this.roadIndex = roadIndex;
this.segmentIndex = segmentIndex;
this.point = point;
}
public int getRoadIndex() {
return roadIndex;
}
public int getSegmentIndex() {
return segmentIndex;
}
public QuadPoint getPoint() {
return point;
}
public static RouteSegmentSearchResult searchRouteSegment(double latitude, double longitude, double maxDist, List<RouteSegmentResult> roads) {
int roadIndex = -1;
int segmentIndex = -1;
QuadPoint point = null;
int px = MapUtils.get31TileNumberX(longitude);
int py = MapUtils.get31TileNumberY(latitude);
double dist = maxDist < 0 ? 1000 : maxDist;
for (int i = 0; i < roads.size(); i++) {
RouteSegmentResult road = roads.get(i);
int startPointIndex = Math.min(road.getStartPointIndex(), road.getEndPointIndex());
int endPointIndex = Math.max(road.getEndPointIndex(), road.getStartPointIndex());
RouteDataObject obj = road.getObject();
for (int j = startPointIndex + 1; j <= endPointIndex; j++) {
QuadPoint proj = MapUtils.getProjectionPoint31(px, py, obj.getPoint31XTile(j - 1), obj.getPoint31YTile(j - 1),
obj.getPoint31XTile(j), obj.getPoint31YTile(j));
double dd = MapUtils.squareRootDist31((int) proj.x, (int) proj.y, px, py);
if (dd < dist) {
dist = dd;
roadIndex = i;
segmentIndex = j;
point = proj;
}
}
}
return roadIndex != -1 ? new RouteSegmentSearchResult(roadIndex, segmentIndex, point) : null;
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,210 @@
package net.osmand.plus.routing;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.Location;
import net.osmand.data.LatLon;
import net.osmand.data.QuadRect;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.TargetPointsHelper;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.util.MapUtils;
import java.util.List;
public class RoutingHelperUtils {
private static final float POSITION_TOLERANCE = 60;
private static final int CACHE_RADIUS = 100000;
@NonNull
public static String formatStreetName(String name, String ref, String destination, String towards) {
String formattedStreetName = "";
if (ref != null && ref.length() > 0) {
formattedStreetName = ref;
}
if (name != null && name.length() > 0) {
if (formattedStreetName.length() > 0) {
formattedStreetName = formattedStreetName + " ";
}
formattedStreetName = formattedStreetName + name;
}
if (destination != null && destination.length() > 0) {
if (formattedStreetName.length() > 0) {
formattedStreetName = formattedStreetName + " ";
}
formattedStreetName = formattedStreetName + towards + " " + destination;
}
return formattedStreetName.replace(";", ", ");
}
@Nullable
public static QuadRect getRouteRect(@NonNull OsmandApplication app, @NonNull RouteCalculationResult result) {
QuadRect rect = new QuadRect(0, 0, 0, 0);
Location lt = app.getRoutingHelper().getLastProjection();
if (lt == null) {
lt = app.getTargetPointsHelper().getPointToStartLocation();
}
if (lt == null) {
lt = app.getLocationProvider().getLastKnownLocation();
}
if (lt != null) {
MapUtils.insetLatLonRect(rect, lt.getLatitude(), lt.getLongitude());
}
List<Location> list = result.getImmutableAllLocations();
for (Location l : list) {
MapUtils.insetLatLonRect(rect, l.getLatitude(), l.getLongitude());
}
List<TargetPointsHelper.TargetPoint> targetPoints = app.getTargetPointsHelper().getIntermediatePointsWithTarget();
for (TargetPointsHelper.TargetPoint l : targetPoints) {
MapUtils.insetLatLonRect(rect, l.getLatitude(), l.getLongitude());
}
return rect.left == 0 && rect.right == 0 ? null : rect;
}
static LatLon getProject(Location loc, Location from, Location to) {
return MapUtils.getProjection(loc.getLatitude(),
loc.getLongitude(), from.getLatitude(), from.getLongitude(),
to.getLatitude(), to.getLongitude());
}
static double getOrthogonalDistance(Location loc, Location from, Location to) {
return MapUtils.getOrthogonalDistance(loc.getLatitude(),
loc.getLongitude(), from.getLatitude(), from.getLongitude(),
to.getLatitude(), to.getLongitude());
}
static int lookAheadFindMinOrthogonalDistance(Location currentLocation, List<Location> routeNodes, int currentRoute, int iterations) {
double newDist;
double dist = Double.POSITIVE_INFINITY;
int index = currentRoute;
while (iterations > 0 && currentRoute + 1 < routeNodes.size()) {
newDist = getOrthogonalDistance(currentLocation, routeNodes.get(currentRoute), routeNodes.get(currentRoute + 1));
if (newDist < dist) {
index = currentRoute;
dist = newDist;
}
currentRoute++;
iterations--;
}
return index;
}
public static float getPosTolerance(float accuracy) {
if (accuracy > 0) {
return POSITION_TOLERANCE / 2 + accuracy;
}
return POSITION_TOLERANCE;
}
public static float getDefaultAllowedDeviation(OsmandSettings settings, ApplicationMode mode, float posTolerance) {
if (settings.DISABLE_OFFROUTE_RECALC.getModeValue(mode)) {
return -1.0f;
} else if (mode.getRouteService() == RouteProvider.RouteService.DIRECT_TO) {
return -1.0f;
} else if (mode.getRouteService() == RouteProvider.RouteService.STRAIGHT) {
MetricsConstants mc = settings.METRIC_SYSTEM.getModeValue(mode);
if (mc == MetricsConstants.KILOMETERS_AND_METERS || mc == MetricsConstants.MILES_AND_METERS) {
return 500.f;
} else {
// 1/4 mile
return 482.f;
}
}
return posTolerance * RoutingHelper.ALLOWED_DEVIATION;
}
/**
* Wrong movement direction is considered when between
* current location bearing (determines by 2 last fixed position or provided)
* and bearing from currentLocation to next (current) point
* the difference is more than 60 degrees
*/
public static boolean checkWrongMovementDirection(Location currentLocation, Location nextRouteLocation) {
// measuring without bearing could be really error prone (with last fixed location)
// this code has an effect on route recalculation which should be detected without mistakes
if (currentLocation.hasBearing() && nextRouteLocation != null) {
float bearingMotion = currentLocation.getBearing();
float bearingToRoute = currentLocation.bearingTo(nextRouteLocation);
double diff = MapUtils.degreesDiff(bearingMotion, bearingToRoute);
if (Math.abs(diff) > 60f) {
// require delay interval since first detection, to avoid false positive
//but leave out for now, as late detection is worse than false positive (it may reset voice router then cause bogus turn and u-turn prompting)
//if (wrongMovementDetected == 0) {
// wrongMovementDetected = System.currentTimeMillis();
//} else if ((System.currentTimeMillis() - wrongMovementDetected > 500)) {
return true;
//}
} else {
//wrongMovementDetected = 0;
return false;
}
}
//wrongMovementDetected = 0;
return false;
}
static boolean identifyUTurnIsNeeded(@NonNull RoutingHelper routingHelper, @NonNull Location currentLocation, double posTolerance) {
RouteCalculationResult route = routingHelper.getRoute();
if (routingHelper.getFinalLocation() == null || currentLocation == null || !route.isCalculated() || routingHelper.isPublicTransportMode()) {
return false;
}
boolean isOffRoute = false;
if (currentLocation.hasBearing()) {
float bearingMotion = currentLocation.getBearing();
Location nextRoutePosition = route.getNextRouteLocation();
float bearingToRoute = currentLocation.bearingTo(nextRoutePosition);
double diff = MapUtils.degreesDiff(bearingMotion, bearingToRoute);
// 7. Check if you left the route and an unscheduled U-turn would bring you back (also Issue 863)
// This prompt is an interim advice and does only sound if a new route in forward direction could not be found in x seconds
if (Math.abs(diff) > 135f) {
float d = currentLocation.distanceTo(nextRoutePosition);
// 60m tolerance to allow for GPS inaccuracy
if (d > posTolerance) {
// require x sec continuous since first detection
long deviateFromRouteDetected = routingHelper.getDeviateFromRouteDetected();
if (deviateFromRouteDetected == 0) {
routingHelper.setDeviateFromRouteDetected(System.currentTimeMillis());
} else if ((System.currentTimeMillis() - deviateFromRouteDetected > 10000)) {
isOffRoute = true;
//log.info("bearingMotion is opposite to bearingRoute"); //$NON-NLS-1$
}
}
} else {
routingHelper.setDeviateFromRouteDetected(0);
}
}
return isOffRoute;
}
static float getArrivalDistance(ApplicationMode mode, OsmandSettings settings) {
ApplicationMode m = mode == null ? settings.getApplicationMode() : mode;
float defaultSpeed = Math.max(0.3f, m.getDefaultSpeed());
/// Used to be: car - 90 m, bicycle - 50 m, pedestrian - 20 m
// return ((float)settings.getApplicationMode().getArrivalDistance()) * settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(m);
// GPS_TOLERANCE - 12 m
// 5 seconds: car - 80 m @ 50 kmh, bicyle - 45 m @ 25 km/h, bicyle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h,
return RoutingHelper.GPS_TOLERANCE + defaultSpeed * 5 * RoutingHelper.ARRIVAL_DISTANCE_FACTOR;
}
public static void checkAndUpdateStartLocation(@NonNull OsmandApplication app, LatLon newStartLocation) {
if (newStartLocation != null) {
LatLon lastStartLocation = app.getSettings().getLastStartPoint();
if (lastStartLocation == null || MapUtils.getDistance(newStartLocation, lastStartLocation) > CACHE_RADIUS) {
app.getMapViewTrackingUtilities().detectDrivingRegion(newStartLocation);
app.getSettings().setLastStartPoint(newStartLocation);
}
}
}
public static void checkAndUpdateStartLocation(@NonNull OsmandApplication app, Location nextStartLocation) {
if (nextStartLocation != null) {
checkAndUpdateStartLocation(app, new LatLon(nextStartLocation.getLatitude(), nextStartLocation.getLongitude()));
}
}
}

View file

@ -13,38 +13,42 @@ import net.osmand.binary.BinaryMapIndexReader;
import net.osmand.data.LatLon;
import net.osmand.data.QuadRect;
import net.osmand.osm.edit.Node;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.render.NativeOsmandLibrary;
import net.osmand.plus.routing.RouteCalculationParams.RouteCalculationResultListener;
import net.osmand.plus.routing.RouteProvider.RouteService;
import net.osmand.plus.routing.RoutingHelper.RouteCalculationProgressCallback;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.router.GeneralRouter;
import net.osmand.router.NativeTransportRoutingResult;
import net.osmand.router.RouteCalculationProgress;
import net.osmand.router.RoutingConfiguration;
import net.osmand.router.TransportRoutePlanner;
import net.osmand.router.TransportRouteResult;
import net.osmand.router.TransportRoutePlanner.TransportRouteResultSegment;
import net.osmand.router.TransportRoutingContext;
import net.osmand.router.TransportRouteResult;
import net.osmand.router.TransportRoutingConfiguration;
import net.osmand.router.NativeTransportRoutingResult;
import net.osmand.router.TransportRoutingContext;
import net.osmand.util.MapUtils;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import static net.osmand.plus.notifications.OsmandNotification.NotificationType.NAVIGATION;
@ -54,10 +58,14 @@ public class TransportRoutingHelper {
private List<WeakReference<IRouteInformationListener>> listeners = new LinkedList<>();
private OsmandApplication app;
private final OsmandApplication app;
private ApplicationMode applicationMode = ApplicationMode.PUBLIC_TRANSPORT;
private RoutingHelper routingHelper;
private final ExecutorService executor = new RouteRecalculationExecutor();
private final Map<Future<?>, RouteRecalculationTask> tasksMap = new LinkedHashMap<>();
private RouteRecalculationTask lastTask;
private List<TransportRouteResult> routes;
private Map<Pair<TransportRouteResultSegment, TransportRouteResultSegment>, RouteCalculationResult> walkingRouteSegments;
private int currentRoute = -1;
@ -65,11 +73,9 @@ public class TransportRoutingHelper {
private LatLon startLocation;
private LatLon endLocation;
private Thread currentRunningJob;
private String lastRouteCalcError;
private String lastRouteCalcErrorShort;
private long lastTimeEvaluatedRoute = 0;
private boolean waitingNextJob;
private TransportRouteCalculationProgressCallback progressRoute;
@ -171,16 +177,16 @@ public class TransportRoutingHelper {
this.currentRoute = currentRoute;
}
public void addListener(IRouteInformationListener l){
public void addListener(IRouteInformationListener l) {
listeners.add(new WeakReference<>(l));
}
public boolean removeListener(IRouteInformationListener lt){
public boolean removeListener(IRouteInformationListener lt) {
Iterator<WeakReference<IRouteInformationListener>> it = listeners.iterator();
while(it.hasNext()) {
while (it.hasNext()) {
WeakReference<IRouteInformationListener> ref = it.next();
IRouteInformationListener l = ref.get();
if(l == null || lt == l) {
if (l == null || lt == l) {
it.remove();
return true;
}
@ -213,18 +219,14 @@ public class TransportRoutingHelper {
private void startRouteCalculationThread(TransportRouteCalculationParams params) {
synchronized (this) {
final Thread prevRunningJob = currentRunningJob;
app.getSettings().LAST_ROUTE_APPLICATION_MODE.set(routingHelper.getAppMode());
RouteRecalculationThread newThread =
new RouteRecalculationThread("Calculating public transport route", params,
app.getSettings().SAFE_MODE.get() ? null : NativeOsmandLibrary.getLoadedLibrary());
currentRunningJob = newThread;
RouteRecalculationTask newTask = new RouteRecalculationTask(this, params,
app.getSettings().SAFE_MODE.get() ? null : NativeOsmandLibrary.getLoadedLibrary());
lastTask = newTask;
startProgress(params);
updateProgress(params);
if (prevRunningJob != null) {
newThread.setWaitPrevJob(prevRunningJob);
}
currentRunningJob.start();
Future<?> future = executor.submit(newTask);
tasksMap.put(future, newTask);
}
}
@ -251,10 +253,7 @@ public class TransportRoutingHelper {
if (isRouteBeingCalculated()) {
float pr = calculationProgress.getLinearProgress();
progressRoute.updateProgress((int) pr);
Thread t = currentRunningJob;
if (t instanceof RouteRecalculationThread && ((RouteRecalculationThread) t).params != params) {
// different calculation started
} else {
if (lastTask != null && lastTask.params == params) {
updateProgress(params);
}
} else {
@ -269,7 +268,23 @@ public class TransportRoutingHelper {
}
public boolean isRouteBeingCalculated() {
return currentRunningJob instanceof RouteRecalculationThread || waitingNextJob;
synchronized (this) {
for (Future<?> future : tasksMap.keySet()) {
if (!future.isDone()) {
return true;
}
}
}
return false;
}
private void stopCalculation() {
synchronized (this) {
for (Map.Entry<Future<?>, RouteRecalculationTask> taskFuture : tasksMap.entrySet()) {
taskFuture.getValue().stopCalculation();
taskFuture.getKey().cancel(false);
}
}
}
private void setNewRoute(final List<TransportRouteResult> res) {
@ -323,9 +338,7 @@ public class TransportRoutingHelper {
}
});
this.endLocation = newFinalLocation;
if (currentRunningJob instanceof RouteRecalculationThread) {
((RouteRecalculationThread) currentRunningJob).stopCalculation();
}
stopCalculation();
}
private void setCurrentLocation(LatLon currentLocation) {
@ -336,15 +349,6 @@ public class TransportRoutingHelper {
recalculateRouteInBackground(currentLocation, endLocation);
}
private void showMessage(final String msg) {
app.runInUIThread(new Runnable() {
@Override
public void run() {
app.showToastMessage(msg);
}
});
}
@Nullable
public QuadRect getTransportRouteRect(@NonNull TransportRouteResult result) {
TransportRoutingHelper transportRoutingHelper = app.getTransportRoutingHelper();
@ -404,7 +408,7 @@ public class TransportRoutingHelper {
}
}
private class WalkingRouteSegment {
private static class WalkingRouteSegment {
TransportRouteResultSegment s1;
TransportRouteResultSegment s2;
LatLon start;
@ -437,18 +441,24 @@ public class TransportRoutingHelper {
}
}
private class RouteRecalculationThread extends Thread {
private static class RouteRecalculationTask implements Runnable {
private final TransportRoutingHelper transportRoutingHelper;
private final RoutingHelper routingHelper;
private final TransportRouteCalculationParams params;
private Thread prevRunningJob;
private final Queue<WalkingRouteSegment> walkingSegmentsToCalculate = new ConcurrentLinkedQueue<>();
private Map<Pair<TransportRouteResultSegment, TransportRouteResultSegment>, RouteCalculationResult> walkingRouteSegments = new HashMap<>();
private boolean walkingSegmentsCalculated;
private NativeLibrary lib;
private final NativeLibrary lib;
public RouteRecalculationThread(String name, TransportRouteCalculationParams params, NativeLibrary library) {
super(name);
String routeCalcError;
String routeCalcErrorShort;
public RouteRecalculationTask(@NonNull TransportRoutingHelper transportRoutingHelper,
@NonNull TransportRouteCalculationParams params, @Nullable NativeLibrary library) {
this.transportRoutingHelper = transportRoutingHelper;
this.routingHelper = transportRoutingHelper.routingHelper;
this.params = params;
this.lib = library;
if (params.calculationProgress == null) {
@ -460,9 +470,9 @@ public class TransportRoutingHelper {
params.calculationProgress.isCancelled = true;
}
/**
* TODO Check if native lib available and calculate route there.
*
* @param params
* @return
* @throws IOException
@ -474,18 +484,18 @@ public class TransportRoutingHelper {
BinaryMapIndexReader[] files = params.ctx.getResourceManager().getTransportRoutingMapFiles();
params.params.clear();
OsmandSettings settings = params.ctx.getSettings();
for(Map.Entry<String, GeneralRouter.RoutingParameter> e : config.getRouter(params.mode.getRoutingProfile()).getParameters().entrySet()){
for (Map.Entry<String, GeneralRouter.RoutingParameter> e : config.getRouter(params.mode.getRoutingProfile()).getParameters().entrySet()) {
String key = e.getKey();
GeneralRouter.RoutingParameter pr = e.getValue();
String vl;
if(pr.getType() == GeneralRouter.RoutingParameterType.BOOLEAN) {
if (pr.getType() == GeneralRouter.RoutingParameterType.BOOLEAN) {
CommonPreference<Boolean> pref = settings.getCustomRoutingBooleanProperty(key, pr.getDefaultBoolean());
Boolean bool = pref.getModeValue(params.mode);
vl = bool ? "true" : null;
} else {
vl = settings.getCustomRoutingProperty(key, "").getModeValue(params.mode);
}
if(vl != null && vl.length() > 0) {
if (vl != null && vl.length() > 0) {
params.params.put(key, vl);
}
}
@ -493,7 +503,7 @@ public class TransportRoutingHelper {
TransportRoutingConfiguration cfg = new TransportRoutingConfiguration(prouter, params.params);
TransportRoutingContext ctx = new TransportRoutingContext(cfg, library, files);
ctx.calculationProgress = params.calculationProgress;
ctx.calculationProgress = params.calculationProgress;
if (ctx.library != null && !settings.PT_SAFE_MODE.get()) {
NativeTransportRoutingResult[] nativeRes = library.runNativePTRouting(
MapUtils.get31TileNumberX(params.start.getLongitude()),
@ -510,7 +520,6 @@ public class TransportRoutingHelper {
@Nullable
private RouteCalculationParams getWalkingRouteParams() {
ApplicationMode walkingMode = ApplicationMode.PEDESTRIAN;
final WalkingRouteSegment walkingRouteSegment = walkingSegmentsToCalculate.poll();
@ -518,13 +527,14 @@ public class TransportRoutingHelper {
return null;
}
OsmandApplication app = routingHelper.getApplication();
Location start = new Location("");
start.setLatitude(walkingRouteSegment.start.getLatitude());
start.setLongitude(walkingRouteSegment.start.getLongitude());
LatLon end = new LatLon(walkingRouteSegment.end.getLatitude(), walkingRouteSegment.end.getLongitude());
final float currentDistanceFromBegin =
RouteRecalculationThread.this.params.calculationProgress.distanceFromBegin +
RouteRecalculationTask.this.params.calculationProgress.distanceFromBegin +
(walkingRouteSegment.s1 != null ? (float) walkingRouteSegment.s1.getTravelDist() : 0);
final RouteCalculationParams params = new RouteCalculationParams();
@ -548,8 +558,8 @@ public class TransportRoutingHelper {
float p = Math.max(params.calculationProgress.distanceFromBegin,
params.calculationProgress.distanceFromEnd);
RouteRecalculationThread.this.params.calculationProgress.distanceFromBegin =
Math.max(RouteRecalculationThread.this.params.calculationProgress.distanceFromBegin, currentDistanceFromBegin + p);
RouteRecalculationTask.this.params.calculationProgress.distanceFromBegin =
Math.max(RouteRecalculationTask.this.params.calculationProgress.distanceFromBegin, currentDistanceFromBegin + p);
}
@Override
@ -564,7 +574,7 @@ public class TransportRoutingHelper {
updateProgress(0);
RouteCalculationParams walkingRouteParams = getWalkingRouteParams();
if (walkingRouteParams != null) {
routingHelper.startRouteCalculationThread(walkingRouteParams, true, true);
routingHelper.startRouteCalculationThread(walkingRouteParams);
}
}
}
@ -572,7 +582,7 @@ public class TransportRoutingHelper {
params.resultListener = new RouteCalculationResultListener() {
@Override
public void onRouteCalculated(RouteCalculationResult route) {
RouteRecalculationThread.this.walkingRouteSegments.put(new Pair<>(walkingRouteSegment.s1, walkingRouteSegment.s2), route);
RouteRecalculationTask.this.walkingRouteSegments.put(new Pair<>(walkingRouteSegment.s1, walkingRouteSegment.s2), route);
}
};
@ -603,7 +613,7 @@ public class TransportRoutingHelper {
}
RouteCalculationParams walkingRouteParams = getWalkingRouteParams();
if (walkingRouteParams != null) {
routingHelper.startRouteCalculationThread(walkingRouteParams, true, true);
routingHelper.startRouteCalculationThread(walkingRouteParams);
// wait until all segments calculated
while (!walkingSegmentsCalculated) {
try {
@ -620,26 +630,18 @@ public class TransportRoutingHelper {
}
}
private void showMessage(final String msg) {
final OsmandApplication app = routingHelper.getApplication();
app.runInUIThread(new Runnable() {
@Override
public void run() {
app.showToastMessage(msg);
}
});
}
@Override
public void run() {
synchronized (TransportRoutingHelper.this) {
currentRunningJob = this;
waitingNextJob = prevRunningJob != null;
}
if (prevRunningJob != null) {
while (prevRunningJob.isAlive()) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// ignore
}
}
synchronized (TransportRoutingHelper.this) {
currentRunningJob = this;
waitingNextJob = false;
}
}
List<TransportRouteResult> res = null;
String error = null;
try {
@ -652,38 +654,52 @@ public class TransportRoutingHelper {
log.error(e);
}
if (params.calculationProgress.isCancelled) {
synchronized (TransportRoutingHelper.this) {
currentRunningJob = null;
}
return;
}
synchronized (TransportRoutingHelper.this) {
routes = res;
TransportRoutingHelper.this.walkingRouteSegments = walkingRouteSegments;
synchronized (transportRoutingHelper) {
transportRoutingHelper.routes = res;
transportRoutingHelper.walkingRouteSegments = walkingRouteSegments;
if (res != null) {
if (params.resultListener != null) {
params.resultListener.onRouteCalculated(res);
}
}
currentRunningJob = null;
}
OsmandApplication app = routingHelper.getApplication();
if (res != null) {
setNewRoute(res);
transportRoutingHelper.setNewRoute(res);
} else if (error != null) {
lastRouteCalcError = app.getString(R.string.error_calculating_route) + ":\n" + error;
lastRouteCalcErrorShort = app.getString(R.string.error_calculating_route);
showMessage(lastRouteCalcError);
routeCalcError = app.getString(R.string.error_calculating_route) + ":\n" + error;
routeCalcErrorShort = app.getString(R.string.error_calculating_route);
showMessage(routeCalcError);
} else {
lastRouteCalcError = app.getString(R.string.empty_route_calculated);
lastRouteCalcErrorShort = app.getString(R.string.empty_route_calculated);
showMessage(lastRouteCalcError);
routeCalcError = app.getString(R.string.empty_route_calculated);
routeCalcErrorShort = app.getString(R.string.empty_route_calculated);
showMessage(routeCalcError);
}
app.getNotificationHelper().refreshNotification(NAVIGATION);
lastTimeEvaluatedRoute = System.currentTimeMillis();
}
}
private class RouteRecalculationExecutor extends ThreadPoolExecutor {
public RouteRecalculationExecutor() {
super(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
public void setWaitPrevJob(Thread prevRunningJob) {
this.prevRunningJob = prevRunningJob;
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
RouteRecalculationTask task = null;
synchronized (TransportRoutingHelper.this) {
if (r instanceof Future<?>) {
task = tasksMap.remove(r);
}
}
if (t == null && task != null) {
lastRouteCalcError = task.routeCalcError;
lastRouteCalcErrorShort = task.routeCalcErrorShort;
}
lastTimeEvaluatedRoute = System.currentTimeMillis();
}
}
}

View file

@ -530,7 +530,7 @@ public class VoiceRouter {
}
if (currentStatus == STATUS_UNKNOWN) {
// Play "Continue for ..." if (1) after route calculation no other prompt is due, or (2) after a turn if next turn is more than PREPARE_LONG_DISTANCE away
// Play "Continue for ..." if (1) after route calculation if no other prompt is due, or (2) after a turn if next turn is more than PREPARE_LONG_DISTANCE away
if ((playGoAheadDist == -1) || (dist > PREPARE_LONG_DISTANCE)) {
playGoAheadDist = dist - 3 * TURN_NOW_DISTANCE;
}

View file

@ -238,7 +238,7 @@ public class OsmandSettings {
String appModeKey = (String) value;
ApplicationMode appMode = ApplicationMode.valueOfStringKey(appModeKey, null);
if (appMode != null) {
APPLICATION_MODE.set(appMode);
setApplicationMode(appMode);
return true;
}
}
@ -380,6 +380,18 @@ public class OsmandSettings {
public ApplicationMode LAST_ROUTING_APPLICATION_MODE = null;
public boolean setApplicationMode(ApplicationMode appMode) {
return setApplicationMode(appMode, true);
}
public boolean setApplicationMode(ApplicationMode appMode, boolean markAsLastUsed) {
boolean valueSaved = APPLICATION_MODE.set(appMode);
if (markAsLastUsed && valueSaved) {
LAST_USED_APPLICATION_MODE.set(appMode.getStringKey());
}
return valueSaved;
}
// this value string is synchronized with settings_pref.xml preference name
public final OsmandPreference<ApplicationMode> APPLICATION_MODE = new PreferenceWithListener<ApplicationMode>() {
@ -735,11 +747,20 @@ public class OsmandSettings {
public final OsmandPreference<String> LAST_FAV_CATEGORY_ENTERED = new StringPreference(this, "last_fav_category", "").makeGlobal();
public final OsmandPreference<Boolean> USE_LAST_APPLICATION_MODE_BY_DEFAULT = new BooleanPreference(this, "use_last_application_mode_by_default", false).makeGlobal().makeShared();
public final OsmandPreference<String> LAST_USED_APPLICATION_MODE = new StringPreference(this, "last_used_application_mode", ApplicationMode.DEFAULT.getStringKey()).makeGlobal().makeShared();
public final OsmandPreference<ApplicationMode> DEFAULT_APPLICATION_MODE = new CommonPreference<ApplicationMode>(this, "default_application_mode_string", ApplicationMode.DEFAULT) {
@Override
protected ApplicationMode getValue(Object prefs, ApplicationMode defaultValue) {
String key = settingsAPI.getString(prefs, getId(), defaultValue.getStringKey());
String key;
if (USE_LAST_APPLICATION_MODE_BY_DEFAULT.get()) {
key = LAST_USED_APPLICATION_MODE.get();
} else {
key = settingsAPI.getString(prefs, getId(), defaultValue.getStringKey());
}
return ApplicationMode.valueOfStringKey(key, defaultValue);
}
@ -747,7 +768,7 @@ public class OsmandSettings {
protected boolean setValue(Object prefs, ApplicationMode val) {
boolean valueSaved = settingsAPI.edit(prefs).putString(getId(), val.getStringKey()).commit();
if (valueSaved) {
APPLICATION_MODE.set(val);
setApplicationMode(val);
}
return valueSaved;

View file

@ -15,6 +15,7 @@ import com.google.android.material.slider.Slider;
import net.osmand.AndroidUtils;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.routing.RoutingHelperUtils;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
@ -28,7 +29,6 @@ import net.osmand.plus.base.bottomsheetmenu.simpleitems.LongDescriptionItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.SubtitmeListDividerItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.settings.fragments.ApplyQueryType;
import net.osmand.plus.settings.fragments.OnConfirmPreferenceChange;
import net.osmand.plus.settings.preferences.SwitchPreferenceEx;
@ -207,8 +207,8 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot
}
private void getDefaultValue() {
currentValue = RoutingHelper.getDefaultAllowedDeviation(settings, appMode,
RoutingHelper.getPosTolerance(0));
currentValue = RoutingHelperUtils.getDefaultAllowedDeviation(settings, appMode,
RoutingHelperUtils.getPosTolerance(0));
}
private int findIndexOfValue(float allowedValue) {

View file

@ -12,6 +12,7 @@ import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import net.osmand.plus.profiles.ProfileDataUtils;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
@ -19,7 +20,6 @@ import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
public class ResetProfilePrefsBottomSheet extends BasePreferenceBottomSheet {
@ -48,7 +48,7 @@ public class ResetProfilePrefsBottomSheet extends BasePreferenceBottomSheet {
.setChecked(true)
.setCompoundButtonColorId(profileColor)
.setButtonTintList(ColorStateList.valueOf(getResolvedColor(profileColor)))
.setDescription(BaseSettingsFragment.getAppModeDescription(ctx, mode))
.setDescription(ProfileDataUtils.getAppModeDescription(ctx, mode))
.setIcon(getIcon(mode.getIconRes(), profileColor))
.setTitle(mode.toHumanString())
.setBackground(new LayerDrawable(layers))

View file

@ -2,7 +2,6 @@ package net.osmand.plus.settings.fragments;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
@ -883,17 +882,6 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl
return listPreference;
}
public static String getAppModeDescription(Context ctx, ApplicationMode mode) {
String description;
if (mode.isCustomProfile()) {
description = ctx.getString(R.string.profile_type_user_string);
} else {
description = ctx.getString(R.string.profile_type_osmand_string);
}
return description;
}
public static boolean showInstance(FragmentActivity activity, SettingsScreenType screenType) {
return showInstance(activity, screenType, null);
}

View file

@ -38,7 +38,6 @@ import net.osmand.plus.dialogs.ConfigureMapMenu;
import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.profiles.SelectCopyAppModeBottomSheet;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.bottomsheets.ChangeGeneralProfilesPrefBottomSheet;
import net.osmand.plus.settings.fragments.ConfigureMenuRootFragment.ScreenType;
import net.osmand.plus.settings.fragments.RearrangeMenuItemsAdapter.MenuItemsAdapterListener;
@ -451,7 +450,7 @@ public class ConfigureMenuItemsFragment extends BaseOsmAndFragment
new View.OnClickListener() {
@Override
public void onClick(View view) {
showResetDialog();
resetToDefault();
}
})));
items.add(new RearrangeMenuAdapterItem(BUTTON, new RearrangeMenuItemsAdapter.ButtonItem(
@ -497,29 +496,18 @@ public class ConfigureMenuItemsFragment extends BaseOsmAndFragment
dismissDialog.show();
}
public void showResetDialog() {
Context themedContext = UiUtilities.getThemedContext(getActivity(), nightMode);
AlertDialog.Builder dismissDialog = new AlertDialog.Builder(themedContext);
dismissDialog.setTitle(getString(R.string.shared_string_reset));
dismissDialog.setMessage(getString(R.string.reset_deafult_order));
dismissDialog.setNegativeButton(R.string.shared_string_cancel, null);
dismissDialog.setPositiveButton(R.string.shared_string_reset, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
hiddenMenuItems.clear();
menuItemsOrder.clear();
wasReset = true;
isChanged = true;
if (screenType == ScreenType.CONTEXT_MENU_ACTIONS) {
mainActionItems.clear();
}
instantiateContextMenuAdapter();
initSavedIds(appMode, true);
initMainActionsIds(appMode, true);
rearrangeAdapter.updateItems(getAdapterItems());
}
});
dismissDialog.show();
public void resetToDefault() {
hiddenMenuItems.clear();
menuItemsOrder.clear();
wasReset = true;
isChanged = true;
if (screenType == ScreenType.CONTEXT_MENU_ACTIONS) {
mainActionItems.clear();
}
instantiateContextMenuAdapter();
initSavedIds(appMode, true);
initMainActionsIds(appMode, true);
rearrangeAdapter.updateItems(getAdapterItems());
}
private void dismissFragment() {

View file

@ -417,7 +417,7 @@ public class ConfigureProfileFragment extends BaseSettingsFragment implements Co
if (!ApplicationMode.values(app).contains(selectedMode)) {
ApplicationMode.changeProfileAvailability(selectedMode, true, app);
}
settings.APPLICATION_MODE.set(selectedMode);
settings.setApplicationMode(selectedMode);
fragmentManager.beginTransaction()
.remove(this)
.addToBackStack(TAG)

View file

@ -344,7 +344,7 @@ public class GeneralProfileSettingsFragment extends BaseSettingsFragment impleme
TextView desc = (TextView) v.findViewById(R.id.description);
if (item instanceof DrivingRegion) {
DrivingRegion drivingRegion = (DrivingRegion) item;
title.setText(getString(drivingRegion.name));
title.setText(app.getString(drivingRegion.name));
desc.setVisibility(View.VISIBLE);
desc.setText(drivingRegion.getDescription(v.getContext()));
} else if (item instanceof String) {

View file

@ -2,6 +2,7 @@ package net.osmand.plus.settings.fragments;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Pair;
import android.widget.ImageView;
@ -16,14 +17,20 @@ import net.osmand.plus.dialogs.ConfigureMapMenu;
import net.osmand.plus.dialogs.SendAnalyticsBottomSheetDialogFragment;
import net.osmand.plus.dialogs.SendAnalyticsBottomSheetDialogFragment.OnSendAnalyticsPrefsUpdate;
import net.osmand.plus.dialogs.SpeedCamerasBottomSheet;
import net.osmand.plus.profiles.SelectProfileBottomSheet;
import net.osmand.plus.profiles.SelectProfileBottomSheet.DialogMode;
import net.osmand.plus.profiles.SelectProfileBottomSheet.OnSelectProfileCallback;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.preferences.ListPreferenceEx;
import net.osmand.plus.settings.preferences.SwitchPreferenceEx;
import static net.osmand.plus.profiles.SelectProfileBottomSheet.PROFILE_KEY_ARG;
import static net.osmand.plus.profiles.SelectProfileBottomSheet.USE_LAST_PROFILE_ARG;
public class GlobalSettingsFragment extends BaseSettingsFragment
implements OnSendAnalyticsPrefsUpdate, OnPreferenceChanged {
implements OnSendAnalyticsPrefsUpdate, OnPreferenceChanged, OnSelectProfileCallback {
public static final String TAG = GlobalSettingsFragment.class.getSimpleName();
@ -94,9 +101,7 @@ public class GlobalSettingsFragment extends BaseSettingsFragment
@Override
public void onPreferenceChanged(String prefId) {
if (prefId.equals(settings.DEFAULT_APPLICATION_MODE.getId())) {
setupDefaultAppModePref();
} else if (prefId.equals(settings.PREFERRED_LOCALE.getId())) {
if (prefId.equals(settings.PREFERRED_LOCALE.getId())) {
// recreate activity to update locale
Activity activity = getActivity();
OsmandApplication app = getMyApplication();
@ -117,7 +122,13 @@ public class GlobalSettingsFragment extends BaseSettingsFragment
@Override
public boolean onPreferenceClick(Preference preference) {
String prefId = preference.getKey();
if (settings.SPEED_CAMERAS_UNINSTALLED.getId().equals(prefId) && !settings.SPEED_CAMERAS_UNINSTALLED.get()) {
if (prefId.equals(settings.DEFAULT_APPLICATION_MODE.getId())) {
if (getActivity() != null) {
String defaultModeKey = settings.DEFAULT_APPLICATION_MODE.get().getStringKey();
SelectProfileBottomSheet.showInstance(getActivity(),
DialogMode.DEFAULT_PROFILE, this, defaultModeKey, false);
}
} else if (settings.SPEED_CAMERAS_UNINSTALLED.getId().equals(prefId) && !settings.SPEED_CAMERAS_UNINSTALLED.get()) {
FragmentManager fm = getFragmentManager();
if (fm != null) {
SpeedCamerasBottomSheet.showInstance(fm, this);
@ -127,23 +138,20 @@ public class GlobalSettingsFragment extends BaseSettingsFragment
}
private void setupDefaultAppModePref() {
OsmandApplication app = getMyApplication();
if (app == null) {
return;
Preference defaultApplicationMode = (Preference) findPreference(settings.DEFAULT_APPLICATION_MODE.getId());
int iconColor = settings.getApplicationMode().getIconColorInfo().getColor(isNightMode());
String summary;
int iconId;
if (settings.USE_LAST_APPLICATION_MODE_BY_DEFAULT.get()) {
summary = getString(R.string.shared_string_last_used);
iconId = R.drawable.ic_action_manage_profiles;
} else {
ApplicationMode appMode = settings.DEFAULT_APPLICATION_MODE.get();
summary = appMode.toHumanString();
iconId = appMode.getIconRes();
}
ApplicationMode[] appModes = ApplicationMode.values(app).toArray(new ApplicationMode[0]);
String[] entries = new String[appModes.length];
String[] entryValues = new String[appModes.length];
for (int i = 0; i < entries.length; i++) {
entries[i] = appModes[i].toHumanString();
entryValues[i] = appModes[i].getStringKey();
}
ListPreferenceEx defaultApplicationMode = (ListPreferenceEx) findPreference(settings.DEFAULT_APPLICATION_MODE.getId());
defaultApplicationMode.setIcon(getIcon(settings.DEFAULT_APPLICATION_MODE.get().getIconRes(),
settings.getApplicationMode().getIconColorInfo().getColor(isNightMode())));
defaultApplicationMode.setEntries(entries);
defaultApplicationMode.setEntryValues(entryValues);
defaultApplicationMode.setIcon(getIcon(iconId, iconColor));
defaultApplicationMode.setSummary(summary);
}
private void setupPreferredLocalePref() {
@ -219,6 +227,18 @@ public class GlobalSettingsFragment extends BaseSettingsFragment
uninstallSpeedCameras.setTitle(uninstalled ? R.string.speed_cameras_removed_descr : R.string.uninstall_speed_cameras);
}
@Override
public void onProfileSelected(Bundle args) {
if (args.getBoolean(USE_LAST_PROFILE_ARG)) {
settings.USE_LAST_APPLICATION_MODE_BY_DEFAULT.set(true);
} else {
settings.USE_LAST_APPLICATION_MODE_BY_DEFAULT.set(false);
String value = args.getString(PROFILE_KEY_ARG);
settings.setPreference(settings.DEFAULT_APPLICATION_MODE.getId(), value);
}
setupDefaultAppModePref();
}
public static Pair<String[], String[]> getPreferredLocaleIdsAndValues(Context ctx) {
// See language list and statistics at: https://hosted.weblate.org/projects/osmand/main/
// Hardy maintenance 2016-05-29:

View file

@ -20,8 +20,10 @@ import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment;
import net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.SelectProfileListener;
import net.osmand.plus.profiles.ProfileDataUtils;
import net.osmand.plus.profiles.SelectProfileBottomSheet;
import net.osmand.plus.profiles.SelectProfileBottomSheet.DialogMode;
import net.osmand.plus.profiles.SelectProfileBottomSheet.OnSelectProfileCallback;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.backup.SettingsItem;
import net.osmand.plus.settings.backend.backup.SettingsItemType;
@ -33,12 +35,10 @@ import java.util.List;
import java.util.Set;
import static net.osmand.plus.importfiles.ImportHelper.ImportType.SETTINGS;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.DIALOG_TYPE;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.IS_PROFILE_IMPORTED_ARG;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.PROFILE_KEY_ARG;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.TYPE_BASE_APP_PROFILE;
import static net.osmand.plus.profiles.SelectProfileBottomSheet.IS_PROFILE_IMPORTED_ARG;
import static net.osmand.plus.profiles.SelectProfileBottomSheet.PROFILE_KEY_ARG;
public class MainSettingsFragment extends BaseSettingsFragment {
public class MainSettingsFragment extends BaseSettingsFragment implements OnSelectProfileCallback{
public static final String TAG = MainSettingsFragment.class.getName();
@ -52,7 +52,6 @@ public class MainSettingsFragment extends BaseSettingsFragment {
private List<ApplicationMode> allAppModes;
private Set<ApplicationMode> availableAppModes;
private SelectProfileListener selectProfileListener = null;
@Override
public void onCreate(Bundle savedInstanceState) {
@ -119,15 +118,9 @@ public class MainSettingsFragment extends BaseSettingsFragment {
ApplicationMode.valueOfStringKey(prefId, null));
return true;
} else if (CREATE_PROFILE.equals(prefId)) {
final SelectProfileBottomSheetDialogFragment dialog = new SelectProfileBottomSheetDialogFragment();
Bundle bundle = new Bundle();
bundle.putString(DIALOG_TYPE, TYPE_BASE_APP_PROFILE);
dialog.setArguments(bundle);
dialog.setUsedOnMap(false);
dialog.setAppMode(getSelectedAppMode());
if (getActivity() != null) {
getActivity().getSupportFragmentManager().beginTransaction()
.add(dialog, "select_base_profile").commitAllowingStateLoss();
SelectProfileBottomSheet.showInstance(getActivity(),
DialogMode.BASE_PROFILE, this, null, false);
}
} else if (IMPORT_PROFILE.equals(prefId)) {
final MapActivity mapActivity = getMapActivity();
@ -162,7 +155,7 @@ public class MainSettingsFragment extends BaseSettingsFragment {
private void setupConfigureProfilePref() {
ApplicationMode selectedMode = app.getSettings().APPLICATION_MODE.get();
String title = selectedMode.toHumanString();
String profileType = getAppModeDescription(getContext(), selectedMode);
String profileType = ProfileDataUtils.getAppModeDescription(getContext(), selectedMode);
Preference configureProfile = findPreference(CONFIGURE_PROFILE);
configureProfile.setIcon(getAppProfilesIcon(selectedMode, true));
configureProfile.setTitle(title);
@ -200,7 +193,7 @@ public class MainSettingsFragment extends BaseSettingsFragment {
pref.setIcon(getAppProfilesIcon(applicationMode, isAppProfileEnabled));
pref.setTitle(applicationMode.toHumanString());
pref.setSummary(getAppModeDescription(getContext(), applicationMode));
pref.setSummary(ProfileDataUtils.getAppModeDescription(getContext(), applicationMode));
pref.setChecked(isAppProfileEnabled);
pref.setLayoutResource(R.layout.preference_with_descr_dialog_and_switch);
pref.setFragment(ConfigureProfileFragment.class.getName());
@ -222,30 +215,23 @@ public class MainSettingsFragment extends BaseSettingsFragment {
: getIcon(iconResId, isNightMode() ? R.color.icon_color_secondary_dark : R.color.icon_color_secondary_light);
}
public SelectProfileListener getParentProfileListener() {
if (selectProfileListener == null) {
selectProfileListener = new SelectProfileListener() {
@Override
public void onSelectedType(Bundle args) {
FragmentActivity activity = getActivity();
if (activity != null) {
FragmentManager fragmentManager = activity.getSupportFragmentManager();
if (fragmentManager != null) {
String profileKey = args.getString(PROFILE_KEY_ARG);
boolean imported = args.getBoolean(IS_PROFILE_IMPORTED_ARG);
ProfileAppearanceFragment.showInstance(activity, SettingsScreenType.PROFILE_APPEARANCE,
profileKey, imported);
}
}
}
};
}
return selectProfileListener;
}
@Override
public void onPause() {
updateRouteInfoMenu();
super.onPause();
}
@Override
public void onProfileSelected(Bundle args) {
FragmentActivity activity = getActivity();
if (activity != null) {
FragmentManager fragmentManager = activity.getSupportFragmentManager();
if (fragmentManager != null) {
String profileKey = args.getString(PROFILE_KEY_ARG);
boolean imported = args.getBoolean(IS_PROFILE_IMPORTED_ARG);
ProfileAppearanceFragment.showInstance(activity, SettingsScreenType.PROFILE_APPEARANCE,
profileKey, imported);
}
}
}
}

View file

@ -10,51 +10,38 @@ import androidx.preference.Preference;
import androidx.preference.SwitchPreferenceCompat;
import net.osmand.plus.measurementtool.MeasurementToolFragment;
import net.osmand.plus.profiles.ProfileDataUtils;
import net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet;
import net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet.DialogMode;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.profiles.ProfileDataObject;
import net.osmand.plus.profiles.RoutingProfileDataObject;
import net.osmand.plus.profiles.RoutingProfileDataObject.RoutingProfilesResources;
import net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment;
import net.osmand.plus.profiles.SelectProfileBottomSheet;
import net.osmand.plus.profiles.SelectProfileBottomSheet.OnSelectProfileCallback;
import net.osmand.plus.routing.RouteProvider;
import net.osmand.plus.settings.preferences.SwitchPreferenceEx;
import net.osmand.router.GeneralRouter;
import net.osmand.router.RoutingConfiguration;
import net.osmand.util.Algorithms;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.DIALOG_TYPE;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.IS_PROFILE_IMPORTED_ARG;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.PROFILE_KEY_ARG;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.SELECTED_KEY;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.TYPE_NAV_PROFILE;
import static net.osmand.plus.profiles.SelectProfileBottomSheet.IS_PROFILE_IMPORTED_ARG;
import static net.osmand.plus.profiles.SelectProfileBottomSheet.PROFILE_KEY_ARG;
import static net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet.DIALOG_MODE_KEY;
public class NavigationFragment extends BaseSettingsFragment {
public class NavigationFragment extends BaseSettingsFragment implements OnSelectProfileCallback {
public static final String TAG = NavigationFragment.class.getSimpleName();
public static final String NAVIGATION_TYPE = "navigation_type";
public static final String OSMAND_NAVIGATION = "osmand_navigation";
private SelectProfileBottomSheetDialogFragment.SelectProfileListener navTypeListener;
private Map<String, RoutingProfileDataObject> routingProfileDataObjects;
private Preference navigationType;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
routingProfileDataObjects = getRoutingProfiles(app);
routingProfileDataObjects = ProfileDataUtils.getRoutingProfiles(app);
setupOnBackPressedCallback();
}
@ -134,38 +121,17 @@ public class NavigationFragment extends BaseSettingsFragment {
@Override
public boolean onPreferenceClick(Preference preference) {
if (preference.getKey().equals(NAVIGATION_TYPE)) {
final SelectProfileBottomSheetDialogFragment dialog = new SelectProfileBottomSheetDialogFragment();
Bundle bundle = new Bundle();
if (getSelectedAppMode() != null) {
bundle.putString(SELECTED_KEY, getSelectedAppMode().getRoutingProfile());
}
bundle.putString(DIALOG_TYPE, TYPE_NAV_PROFILE);
dialog.setArguments(bundle);
dialog.setUsedOnMap(false);
dialog.setAppMode(getSelectedAppMode());
String routingProfileKey =
getSelectedAppMode() != null ? getSelectedAppMode().getRoutingProfile() : null;
if (getActivity() != null) {
getActivity().getSupportFragmentManager().beginTransaction()
.add(dialog, "select_nav_type").commitAllowingStateLoss();
SelectProfileBottomSheet.showInstance(
getActivity(), SelectProfileBottomSheet.DialogMode.NAVIGATION_PROFILE,
this, routingProfileKey, false);
}
}
return false;
}
public SelectProfileBottomSheetDialogFragment.SelectProfileListener getNavProfileListener() {
if (navTypeListener == null) {
navTypeListener = new SelectProfileBottomSheetDialogFragment.SelectProfileListener() {
@Override
public void onSelectedType(Bundle args) {
if (args.getBoolean(IS_PROFILE_IMPORTED_ARG)) {
routingProfileDataObjects = getRoutingProfiles(app);
}
updateRoutingProfile(args.getString(PROFILE_KEY_ARG));
}
};
}
return navTypeListener;
}
void updateRoutingProfile(String profileKey) {
RoutingProfileDataObject selectedRoutingProfileDataObject = routingProfileDataObjects.get(profileKey);
if (profileKey == null || selectedRoutingProfileDataObject == null) {
@ -193,112 +159,6 @@ public class NavigationFragment extends BaseSettingsFragment {
appMode.setRoutingProfile(profileKey);
}
public static List<RoutingProfileDataObject> getSortedRoutingProfiles(OsmandApplication app) {
List<RoutingProfileDataObject> result = new ArrayList<>();
Map<String, List<RoutingProfileDataObject>> routingProfilesByFileNames = getRoutingProfilesByFileNames(app);
List<String> fileNames = new ArrayList<>(routingProfilesByFileNames.keySet());
Collections.sort(fileNames, new Comparator<String>() {
@Override
public int compare(String s, String t1) {
return s.equals(OSMAND_NAVIGATION) ? -1 : t1.equals(OSMAND_NAVIGATION) ? 1 : s.compareToIgnoreCase(t1);
}
});
for (String fileName : fileNames) {
List<RoutingProfileDataObject> routingProfilesFromFile = routingProfilesByFileNames.get(fileName);
if (routingProfilesFromFile != null) {
Collections.sort(routingProfilesFromFile);
result.addAll(routingProfilesFromFile);
}
}
return result;
}
public static Map<String, List<RoutingProfileDataObject>> getRoutingProfilesByFileNames(OsmandApplication app) {
Map<String, List<RoutingProfileDataObject>> result = new HashMap<>();
for (final RoutingProfileDataObject profile : getRoutingProfiles(app).values()) {
String fileName = profile.getFileName() != null ? profile.getFileName() : OSMAND_NAVIGATION;
if (result.containsKey(fileName)) {
result.get(fileName).add(profile);
} else {
result.put(fileName, new ArrayList<RoutingProfileDataObject>() {
{ add(profile); }
});
}
}
return result;
}
public static Map<String, RoutingProfileDataObject> getRoutingProfiles(OsmandApplication context) {
Map<String, RoutingProfileDataObject> profilesObjects = new HashMap<>();
profilesObjects.put(RoutingProfilesResources.STRAIGHT_LINE_MODE.name(), new RoutingProfileDataObject(
RoutingProfilesResources.STRAIGHT_LINE_MODE.name(),
context.getString(RoutingProfilesResources.STRAIGHT_LINE_MODE.getStringRes()),
context.getString(R.string.special_routing_type),
RoutingProfilesResources.STRAIGHT_LINE_MODE.getIconRes(),
false, null));
profilesObjects.put(RoutingProfilesResources.DIRECT_TO_MODE.name(), new RoutingProfileDataObject(
RoutingProfilesResources.DIRECT_TO_MODE.name(),
context.getString(RoutingProfilesResources.DIRECT_TO_MODE.getStringRes()),
context.getString(R.string.special_routing_type),
RoutingProfilesResources.DIRECT_TO_MODE.getIconRes(),
false, null));
if (context.getBRouterService() != null) {
profilesObjects.put(RoutingProfilesResources.BROUTER_MODE.name(), new RoutingProfileDataObject(
RoutingProfilesResources.BROUTER_MODE.name(),
context.getString(RoutingProfilesResources.BROUTER_MODE.getStringRes()),
context.getString(R.string.third_party_routing_type),
RoutingProfilesResources.BROUTER_MODE.getIconRes(),
false, null));
}
List<String> disabledRouterNames = OsmandPlugin.getDisabledRouterNames();
for (RoutingConfiguration.Builder builder : context.getAllRoutingConfigs()) {
collectRoutingProfilesFromConfig(context, builder, profilesObjects, disabledRouterNames);
}
return profilesObjects;
}
private static void collectRoutingProfilesFromConfig(OsmandApplication app, RoutingConfiguration.Builder builder,
Map<String, RoutingProfileDataObject> profilesObjects, List<String> disabledRouterNames) {
for (Map.Entry<String, GeneralRouter> entry : builder.getAllRouters().entrySet()) {
String routerKey = entry.getKey();
GeneralRouter router = entry.getValue();
if (!routerKey.equals("geocoding") && !disabledRouterNames.contains(router.getFilename())) {
int iconRes = R.drawable.ic_action_gdirections_dark;
String name = router.getProfileName();
String description = app.getString(R.string.osmand_default_routing);
String fileName = router.getFilename();
if (!Algorithms.isEmpty(fileName)) {
description = fileName;
} else if (RoutingProfilesResources.isRpValue(name.toUpperCase())) {
iconRes = RoutingProfilesResources.valueOf(name.toUpperCase()).getIconRes();
name = app.getString(RoutingProfilesResources.valueOf(name.toUpperCase()).getStringRes());
}
profilesObjects.put(routerKey, new RoutingProfileDataObject(routerKey, name, description,
iconRes, false, fileName));
}
}
}
public static List<ProfileDataObject> getBaseProfiles(OsmandApplication app) {
return getBaseProfiles(app, false);
}
public static List<ProfileDataObject> getBaseProfiles(OsmandApplication app, boolean includeBrowseMap) {
List<ProfileDataObject> profiles = new ArrayList<>();
for (ApplicationMode mode : ApplicationMode.allPossibleValues()) {
if (mode != ApplicationMode.DEFAULT || includeBrowseMap) {
String description = mode.getDescription();
if (Algorithms.isEmpty(description)) {
description = getAppModeDescription(app, mode);
}
profiles.add(new ProfileDataObject(mode.toHumanString(), description,
mode.getStringKey(), mode.getIconRes(), false, mode.getIconColorInfo()));
}
}
return profiles;
}
private void setupVehicleParametersPref() {
Preference vehicleParameters = findPreference("vehicle_parameters");
int iconRes = getSelectedAppMode().getIconRes();
@ -311,4 +171,12 @@ public class NavigationFragment extends BaseSettingsFragment {
mapActivity.getMapRouteInfoMenu().updateMenu();
}
}
@Override
public void onProfileSelected(Bundle args) {
if (args.getBoolean(IS_PROFILE_IMPORTED_ARG)) {
routingProfileDataObjects = ProfileDataUtils.getRoutingProfiles(app);
}
updateRoutingProfile(args.getString(PROFILE_KEY_ARG));
}
}

View file

@ -51,7 +51,9 @@ import net.osmand.plus.profiles.LocationIcon;
import net.osmand.plus.profiles.NavigationIcon;
import net.osmand.plus.profiles.ProfileIconColors;
import net.osmand.plus.profiles.ProfileIcons;
import net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment;
import net.osmand.plus.profiles.SelectProfileBottomSheet;
import net.osmand.plus.profiles.SelectProfileBottomSheet.DialogMode;
import net.osmand.plus.profiles.SelectProfileBottomSheet.OnSelectProfileCallback;
import net.osmand.plus.routing.RouteProvider;
import net.osmand.plus.widgets.FlowLayout;
import net.osmand.plus.widgets.OsmandTextFieldBoxes;
@ -64,13 +66,10 @@ import java.util.ArrayList;
import java.util.Collections;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_SETTINGS_ID;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.DIALOG_TYPE;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.IS_PROFILE_IMPORTED_ARG;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.PROFILE_KEY_ARG;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.SELECTED_KEY;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.TYPE_BASE_APP_PROFILE;
import static net.osmand.plus.profiles.SelectProfileBottomSheet.IS_PROFILE_IMPORTED_ARG;
import static net.osmand.plus.profiles.SelectProfileBottomSheet.PROFILE_KEY_ARG;
public class ProfileAppearanceFragment extends BaseSettingsFragment {
public class ProfileAppearanceFragment extends BaseSettingsFragment implements OnSelectProfileCallback {
private static final Log LOG = PlatformUtil.getLog(ProfileAppearanceFragment.class);
@ -98,7 +97,6 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
private static final String IS_BASE_PROFILE_IMPORTED = "is_base_profile_imported";
private static final String IS_NEW_PROFILE_KEY = "is_new_profile_key";
private SelectProfileBottomSheetDialogFragment.SelectProfileListener parentProfileListener;
private SettingsHelper.SettingsExportListener exportListener;
private ProgressDialog progress;
@ -400,18 +398,12 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
public void onClick(View v) {
if (isNewProfile) {
hideKeyboard();
final SelectProfileBottomSheetDialogFragment fragment = new SelectProfileBottomSheetDialogFragment();
Bundle bundle = new Bundle();
fragment.setUsedOnMap(false);
fragment.setAppMode(getSelectedAppMode());
if (changedProfile.parent != null) {
bundle.putString(SELECTED_KEY, changedProfile.parent.getStringKey());
}
bundle.putString(DIALOG_TYPE, TYPE_BASE_APP_PROFILE);
fragment.setArguments(bundle);
String selectedAppModeKey =
changedProfile.parent != null ? changedProfile.parent.getStringKey() : null;
if (getActivity() != null) {
getActivity().getSupportFragmentManager().beginTransaction()
.add(fragment, "select_nav_type").commitAllowingStateLoss();
SelectProfileBottomSheet.showInstance(
getActivity(), DialogMode.BASE_PROFILE, ProfileAppearanceFragment.this,
selectedAppModeKey, false);
}
}
}
@ -709,20 +701,6 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
}
}
public SelectProfileBottomSheetDialogFragment.SelectProfileListener getParentProfileListener() {
if (parentProfileListener == null) {
parentProfileListener = new SelectProfileBottomSheetDialogFragment.SelectProfileListener() {
@Override
public void onSelectedType(Bundle args) {
String profileKey = args.getString(PROFILE_KEY_ARG);
boolean imported = args.getBoolean(IS_PROFILE_IMPORTED_ARG);
updateParentProfile(profileKey, imported);
}
};
}
return parentProfileListener;
}
private SettingsHelper.SettingsExportListener getSettingsExportListener() {
if (exportListener == null) {
exportListener = new SettingsHelper.SettingsExportListener() {
@ -953,6 +931,13 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
}
}
@Override
public void onProfileSelected(Bundle args) {
String profileKey = args.getString(PROFILE_KEY_ARG);
boolean imported = args.getBoolean(IS_PROFILE_IMPORTED_ARG);
updateParentProfile(profileKey, imported);
}
public static boolean showInstance(FragmentActivity activity, SettingsScreenType screenType, @Nullable String appMode, boolean imported) {
try {
Fragment fragment = Fragment.instantiate(activity, screenType.fragmentName);

View file

@ -33,6 +33,7 @@ import net.osmand.plus.UiUtilities;
import net.osmand.plus.Version;
import net.osmand.plus.routing.RouteProvider;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelperUtils;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.BooleanPreference;
import net.osmand.plus.settings.backend.CommonPreference;
@ -431,10 +432,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
public void onClick(DialogInterface dialog, int which) {
mode.setStrAngle(angleValue[0]);
updateAllSettings();
RoutingHelper routingHelper = app.getRoutingHelper();
if (mode.equals(routingHelper.getAppMode()) && (routingHelper.isRouteCalculated() || routingHelper.isRouteBeingCalculated())) {
routingHelper.recalculateRouteDueToSettingsChange();
}
app.getRoutingHelper().onSettingsChanged(mode);
}
});
builder.setNegativeButton(R.string.shared_string_cancel, null);
@ -481,7 +479,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
float allowedValue = settings.ROUTE_RECALCULATION_DISTANCE.getModeValue(appMode);
boolean enabled = allowedValue != DISABLE_MODE;
if (allowedValue <= 0) {
allowedValue = RoutingHelper.getDefaultAllowedDeviation(settings, appMode, RoutingHelper.getPosTolerance(0));
allowedValue = RoutingHelperUtils.getDefaultAllowedDeviation(settings, appMode, RoutingHelperUtils.getPosTolerance(0));
}
String summary = String.format(getString(R.string.ltr_or_rtl_combine_via_bold_point),
enabled ? getString(R.string.shared_string_enabled) : getString(R.string.shared_string_disabled),
@ -642,12 +640,8 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
return multiSelectPref;
}
private static void recalculateRoute(OsmandApplication app, ApplicationMode mode) {
RoutingHelper routingHelper = app.getRoutingHelper();
if (mode.equals(routingHelper.getAppMode())
&& (routingHelper.isRouteCalculated() || routingHelper.isRouteBeingCalculated())) {
routingHelper.recalculateRouteDueToSettingsChange();
}
private static void recalculateRoute(@NonNull OsmandApplication app, ApplicationMode mode) {
app.getRoutingHelper().onSettingsChanged(mode);
}
private void clearParameters() {

Some files were not shown because too many files have changed in this diff Show more