Merge branch 'master' into tp_to_native

This commit is contained in:
MadWasp79 2020-04-23 19:02:33 +03:00
commit 937fedc1bf
96 changed files with 3807 additions and 1001 deletions

View file

@ -46,6 +46,8 @@ public class IndexConstants {
public static final String RENDERER_INDEX_EXT = ".render.xml"; //$NON-NLS-1$
public static final String GPX_FILE_EXT = ".gpx"; //$NON-NLS-1$
public final static String POI_TABLE = "poi"; //$NON-NLS-1$
public static final String INDEX_DOWNLOAD_DOMAIN = "download.osmand.net";

View file

@ -49,7 +49,7 @@ public class Algorithms {
return map == null || map.size() == 0;
}
public static boolean isEmpty(String s) {
public static boolean isEmpty(CharSequence s) {
return s == null || s.length() == 0;
}

View file

@ -1,4 +1,210 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="proxy_settings">Iɣewwaṛen n upruksi</string>
<string name="not_logged_in">Ur teqqineḍ ara</string>
<string name="closing">Amdal</string>
<string name="logging_out">Tuffγa</string>
<string name="initialization">Tanekra</string>
<string name="show_on_map">Sken ɣef tkarḍa</string>
<string name="shared_string_live">Srid</string>
<string name="in_time">di %1$s</string>
<string name="initializing">Tanekra</string>
<string name="device_added_successfully">%1$s ittwarna.</string>
<string name="shared_string_sort_by">Smizwer s</string>
<string name="by_group">Segrew s</string>
<string name="by_distance">S umeccaq</string>
<string name="shared_string_error_short">Tuccḍa</string>
<string name="searching_for_gps">Asideg…</string>
<string name="shared_string_settings">Iɣewwaṛen</string>
<string name="shared_string_off">Yensa</string>
<string name="shared_string_all">Meṛṛa</string>
<string name="shared_string_name">Isem</string>
<string name="shared_string_hide">Ffer</string>
<string name="shared_string_add">Rnu</string>
<string name="shared_string_update">Leqqem</string>
<string name="shared_string_search">Nadi</string>
<string name="share_location_as_description_second_line">Tzemreḍ ad ternuḍ daɣen ad tsekneḍ asulay ID yibenk deg umsaɣ Telegram s useqdec n ubut %1$s. %2$s</string>
<string name="device_name_is_too_long">Isem n yibenk meqqar aṭas</string>
<string name="enter_device_name_description">Mudd isem i yibenk-ik amaynut ma aṭas 200 n yisekkilen.</string>
<string name="error_adding_new_device">Ur izmir ara ad yernu ibenk amaynut</string>
<string name="enter_another_device_name">Fren isem ur tesqedceḍ ara yakan</string>
<string name="last_update_from_telegram">Lqem aneggaru seg Telegram</string>
<string name="map_and_text">Takarḍa akked uḍris</string>
<string name="send_location_as_descr">Fren udem n yiznan i igebren adig-ik.</string>
<string name="send_location_as">Azen adig</string>
<string name="open_in_osmand">sken deg OsmAnd</string>
<string name="average_speed">Arured alemmas</string>
<string name="average_altitude">Awrir alemmas</string>
<string name="time_on_the_move">Tanzagt n tikli</string>
<string name="monitoring_is_disabled">Aqareɛ yensa</string>
<string name="monitoring_is_enabled">Asekles yermed</string>
<string name="shared_string_collected">yettwalqeḍ</string>
<string name="points_size">%1$d n wagazen</string>
<string name="gps_points_in_buffer">yettwazen (%1$d deg tkatut taskudant)</string>
<string name="please_update_osmand">Leqqem OsmAnd akken ad twaliḍ isefka ɣef tkarḍa</string>
<string name="show_gps_points_descr">Ad d-yesken amḍan n wagazen GPS i d-yettwaleqḍen daɣen ttwaznen.</string>
<string name="show_gps_points">Sken agazen GPS</string>
<string name="received_gps_points">Agazen GPX i d-yettwaremsen: %1$s</string>
<string name="osmand_privacy_policy">Tasertit tabaḍnit n OsmAnd</string>
<string name="telegram_privacy_policy">Tasertit tabaḍnit n Telegram</string>
<string name="privacy_policy_agree">S utekki ɣef \"Kemmel\" ad tqebleḍ tiwtilin n Telegram- akked tasertit tabaḍnit OsmAnd.</string>
<string name="privacy_policy_telegram_client">Aneḍfaṛ OsmAnd d yiwen seg yimsaɣen i iseqdacen tiɣerɣert yeldin Telegram. Inermisen-ik zemren ad sqedcen yal amsaɣ-nniḍen Telegram.</string>
<string name="privacy_policy_use_telegram">Telegram (d asnas n yiznan) yettwaseqdec i tuqqna d teywalt d yimdanen.</string>
<string name="shared_string_telegram">Telegram</string>
<string name="app_name_short">Aneḍfaṛ OsmAnd</string>
<string name="timeline_description">Rmed aḍfaṛ i usekles n wadigen meṛṛa deg uzray.</string>
<string name="location_recording_enabled">Sekles adig urmid</string>
<string name="disable_monitoring">Sens aḍfaṛ</string>
<string name="timeline_available_for_free_now">Aɣmis yella tura baṭel.</string>
<string name="type_contact_or_group_name">Sekcem isem n unermis neɣ n ugraw</string>
<string name="search_contacts_descr">Nadi gar yigrawen d yinermisen-ik.</string>
<string name="min_logging_speed_descr">Imsizdig: ulac asekles ddaw n urured yettwafernen</string>
<string name="min_logging_speed">Arured adday i usekles</string>
<string name="min_logging_accuracy_descr">Imsiadig: ulac asekles skud tiseddi ur tewwiḍ ara</string>
<string name="min_logging_accuracy">Tiseddi taddayt i usekles</string>
<string name="min_logging_distance_descr">Imsideg: ameccaq adday gar sin n wagazen n usekles</string>
<string name="min_logging_distance">Ameccaq adday i usekles</string>
<string name="timeline_no_data_descr">Ur d-nelqiḍ ara isefka i wass i tferneḍ</string>
<string name="start_end_date">Azemz seg tazwara - Taggara</string>
<string name="set_time_timeline_descr">Fren akud ara tsekneḍ</string>
<string name="saved_messages">Iznan yettwaskelsen</string>
<string name="unit_of_speed_system">Tayunt n urured</string>
<string name="unit_of_speed_system_descr">Ad isbadu tayunt n urured.</string>
<string name="unit_of_length">Tayunin n umeccaq</string>
<string name="unit_of_length_descr">Beddel tayunt n uktili n umeccaq.</string>
<string name="units_and_formats">Tayunin d yimasalen</string>
<string name="time_zone_descr">Fren izḍi usrig ara d-tsekneḍ deg yiznan-ik n usideg.</string>
<string name="buffer_time">Azemz n taggara n tkatut taskudant</string>
<string name="buffer_time_descr">Tanzagt tafellayt n usefkles n wagazen deg tkatut taskudant</string>
<string name="status_widget_title">Addad n uneḍfaṛ OsmAnd</string>
<string name="back_to_osmand">Uɣal ɣer OsmAnd</string>
<string name="last_response_duration">Tiririt taneggarut: %1$s aya</string>
<string name="last_update_from_telegram_duration">Lqem aneggaru n Telegram: %1$s aya</string>
<string name="last_response_date">Tiririt taneggarut: %1$s</string>
<string name="last_update_from_telegram_date">Lqem aneggaru n Telegram: %1$s</string>
<string name="duration_ago">%1$S</string>
<string name="shared_string_suggested">Yettesumer</string>
<string name="time_zone">Iẓḍi usrig</string>
<string name="shared_string_enabled">Urmid</string>
<string name="timeline">Amazray</string>
<string name="live_now">Tura</string>
<string name="my_location">Sken adig-iw</string>
<string name="shared_string_second_short">sec.</string>
<string name="shared_string_minute_short">tas</string>
<string name="shared_string_hour_short">s</string>
<string name="si_nm">Miles iwlalen</string>
<string name="si_m_s">Imitren di tasint (m/tasint)</string>
<string name="si_mph">Imilen deg usrag</string>
<string name="si_kmh">Kilometr deg usrag</string>
<string name="mile_per_hour">m/tasint</string>
<string name="km_h">h</string>
<string name="m_s">m/s</string>
<string name="nm_h">h</string>
<string name="min_km">tasint</string>
<string name="min_mile">tasint</string>
<string name="m">m</string>
<string name="km">km</string>
<string name="mile">Maori</string>
<string name="yard">yd</string>
<string name="shared_string_welcome">Ansuf yiswen</string>
<string name="shared_string_authorization">Asuter n tsiregt tettwaqbel</string>
<string name="share_location">Bḍu adɣar</string>
<string name="shared_string_distance">Ameccaq</string>
<string name="osmand_service">Agilal</string>
<string name="shared_string_cancel">Sefsex</string>
<string name="shared_string_continue">Kemmel</string>
<string name="shared_string_logout">Tuffɣa</string>
<string name="shared_string_login">Tuqqna</string>
<string name="enter_password">Sekcem awal n uffir</string>
<string name="authentication_code">Tangalt n usesteb s snat n tarrayin</string>
<string name="enter_code">Kcem</string>
<string name="shared_string_password">Awal n uɛeddi</string>
<string name="phone_number_title">Uṭṭun n tiliɣri</string>
<string name="start_location_sharing">Bḍu adɣar</string>
<string name="set_time">Akud</string>
<string name="shared_string_back">Uɣal</string>
<string name="shared_string_share">Bḍu</string>
<string name="shared_string_install">Sbedd</string>
<string name="hours_format"><ph id="mtc_1" equiv-text="base64:JTEkZA=="/></string>
<string name="minutes_format"><ph id="mtc_1" equiv-text="base64:JTEkZA=="/></string>
<string name="shared_string_bot">Aṛubut</string>
<string name="expire_at">Azmez n tasewti</string>
<string name="sharing_time">Beṭṭu</string>
<string name="gps_and_location">Tawuri</string>
<string name="stale_location">Talemmast yeccḍen</string>
<string name="shared_string_account">Amiḍan</string>
<string name="shared_string_close">Mdel</string>
<string name="shared_string_group">Agraw</string>
<string name="last_response">Dernier temps de réponse</string>
<string name="time_ago">aya</string>
<string name="shared_string_exit">Tufɣa</string>
<string name="shared_string_sort">Smizzwer</string>
<string name="by_name">S yisem</string>
<string name="share_location_as">Bḍu adɣar</string>
<string name="add_device">Rnu ibenk</string>
<string name="shared_string_save">Sekles</string>
<string name="shared_string_disable">Désactiver</string>
<string name="no_internet_connection">Ulac tuqqna n Internet</string>
<string name="shared_string_status">Addad</string>
<string name="not_found_yet">ulac-it</string>
<string name="shared_string_later">Ticki</string>
<string name="go_to_settings">Ddu ɣer iɣewwaṛen</string>
<string name="background_work">Agilal</string>
<string name="device_name">Nom du périphérique</string>
<string name="device_name_cannot_be_empty">Ur yessefk ara isem ad yili d ilem</string>
<string name="shared_string_text">Aḍris</string>
<string name="shared_string_map">Takarḍa</string>
<string name="start_date">Azemz n tazwara</string>
<string name="end_date">Azemz n tagara</string>
<string name="shared_string_sent">Yettwazen</string>
<string name="gps_points">Tineqqiḍin</string>
<string name="shared_string_date">Azemz</string>
<string name="shared_string_appearance">Udem</string>
<string name="how_it_works">Amek id ig leḥḥu</string>
<string name="shared_string_accept">Qbel</string>
<string name="shared_string_ok">Γas</string>
<string name="search_contacts">Nadi inermisen</string>
<string name="bearing">Tamesɣult i anker n userken</string>
<string name="altitude">Awrir</string>
<string name="precision">Tiseddi</string>
<string name="direction">Tanila</string>
<string name="privacy">Tabaḍnit</string>
<string name="proxy">Apṛuksi</string>
<string name="proxy_disconnected">Ur yeqqin ara</string>
<string name="proxy_connected">Iqqen</string>
<string name="proxy_type">Anaw n upṛuksi</string>
<string name="shared_string_enable">Rmed</string>
<string name="shared_string_connection">Tuqqna</string>
<string name="proxy_server">Aqeddac</string>
<string name="proxy_port">Port</string>
<string name="proxy_credentials">Inekcam n umeẓlu n uḥraz</string>
<string name="proxy_username">Nom d\'utilisateur</string>
<string name="proxy_password">Awal n uɛeddi</string>
<string name="proxy_key">Tasarut</string>
<string name="gpx_settings">Iɣewwaṛen</string>
<string name="shared_string_select">Fren</string>
<string name="timeline_no_data">Ulac isefka</string>
<string name="shared_string_apply">Snes</string>
<string name="shared_string_start">Tazwara</string>
<string name="shared_string_end">Tagara</string>
<string name="choose_osmand_desc">Fren lqem OsmAnd anida inermisen ad ttwaseknen deg tkarda.</string>
<string name="logout_from_osmand_telegram">Ffeɣ seg uneḍfar OsmAnd\?</string>
<string name="logout_from_osmand_telegram_descr">Tebɣiḍ ad teffɣeḍ seg uneḍfar OsmAnd; ur tettizmired ara ad tebḍuḍ adig-ik neɣ adig n wiyaḍ\?</string>
<string name="live_now_description">Inermisen akked yigrawen beṭṭun adig-nsen yid-neɣ.</string>
<string name="no_gps_connection">Ulac tuqqna GPS</string>
<string name="location_sharing_status">Beṭṭu: %1$s</string>
<string name="sharing_status">Bdu addad</string>
<string name="last_available_location">Adig aneggaru yellan</string>
<string name="re_send_location">Ales tuzna n wadig</string>
<string name="not_sent_yet">Ur yettwazen ara yakan</string>
<string name="sharing_in_background">Bḍu agilal</string>
<string name="battery_optimization_description">Sens aṣeggem n uẓru i uneḍfaṛ OsmAnd akken ur yettnusu ara weḥd-s ticki yella deg ugilal.</string>
<string name="background_work_description">Beddel iɣewwaṛen n uṣeggem n uẓru i userked n beṭṭu n wadig.</string>
<string name="connecting_to_the_internet">Tuqqna ɣer Internet</string>
<string name="sending_location_messages">Tuzna n wadig</string>
<string name="waiting_for_response_from_telegram">Yettraǧu tiririt n Telegram</string>
<string name="not_possible_to_send_to_telegram_chats">Ur izmir ara ad yazen ɣer usqerdec Telegram:</string>
<string name="successfully_sent_and_updated">Yettwazen akken iwata</string>
<string name="last_updated_location">Adig aneggaru yettwaleqmen:</string>
<string name="share_location_as_description">Ma tebɣiḍ ad teqqneḍ ddeqs n yibenkan ɣer yiwet n umiḍan Telegram, ilaq ad tesqedceḍ ibenk-nniḍen i beṭṭu n wadig-ik.</string>
</resources>

View file

@ -263,4 +263,10 @@
<string name="shared_string_suggested">Предложено</string>
<string name="status_widget_title">Статус OsmAnd Tracker</string>
<string name="back_to_osmand">Вернуться к OsmAnd</string>
<string name="shared_string_error_short">ОШИБКА</string>
<string name="duration_ago">%1$s назад</string>
<string name="last_response_duration">Последний ответ: %1$s назад</string>
<string name="last_update_from_telegram_duration">Последнее обновление от Telegram: %1$s назад</string>
<string name="last_response_date">Последний ответ: %1$s</string>
<string name="last_update_from_telegram_date">Последнее обновление от Telegram: %1$s</string>
</resources>

6
OsmAnd/.gitignore vendored
View file

@ -27,6 +27,12 @@ res/drawable-large/widget_*
res/drawable-large-hdpi/widget_*
res/drawable-large-xhdpi/widget_*
# rendering-styles/style-icons/
h_*
g_*
mm_*
mx_*
valgrind/
bin/
dist/

View file

@ -51,8 +51,8 @@ android {
versionName "3.7.0"
versionName System.getenv("APK_VERSION")? System.getenv("APK_VERSION").toString(): versionName
versionName System.getenv("APK_VERSION_SUFFIX")? versionName + System.getenv("APK_VERSION_SUFFIX").toString(): versionName
// Stops the Gradle plugins automatic rasterization of vectors
// generatedDensities = []
}
lintOptions {
@ -83,6 +83,8 @@ android {
// Don't compress any embedded resources
noCompress "qz"
cruncherEnabled = false
// Flag notifies aapt to keep the attribute IDs around
// additionalParameters "--no-version-vectors"
}
dexOptions {
@ -352,22 +354,62 @@ task collectHelpContentsAssets(type: Copy) {
into "assets/feature_articles"
}
task copyPoiCategiry(type: Copy) {
task copyPoiCategories(type: Copy) {
from("../../resources/poi") {
include "poi_categories.json"
}
into "assets"
}
task copyStyleIcons(type: Copy) {
task copyStyleIcons(type: Sync) {
from "../../resources/rendering_styles/style-icons/"
into "res/"
include "**/*.png"
include "**/*.png", "**/*.xml"
preserve {
include '**/*'
exclude "**/mm_*", "**/h_*"
}
}
task copyWidgetIcons(type: Exec) {
if (!Os.isFamily(Os.FAMILY_WINDOWS)) {
commandLine 'sh', file("./copy_widget_icons.sh").getAbsolutePath()
task copyPOIIcons(type: Sync) {
from "../../resources/rendering_styles/drawable-mx/"
into "res/drawable/"
include "**/*.png", "**/*.xml"
preserve {
include '**/*'
exclude "**/mx_*"
}
}
task copyWidgetIconsXhdpi(type: Sync) {
from "res/drawable-xxhdpi/"
into "res/drawable-large-xhdpi/"
include "**/widget_*.png", "**/widget_*.xml", "**/map_*.xml", "**/map_*.png"
preserve {
include '*'
exclude "**/widget_*.png", "**/widget_*.xml", "**/map_*.xml", "**/map_*.png"
}
}
task copyWidgetIconsHdpi(type: Sync) {
from "res/drawable-xhdpi/"
into "res/drawable-large-hdpi/"
include "**/widget_*.png", "**/widget_*.xml", "**/map_*.xml", "**/map_*.png"
preserve {
include '*'
exclude "**/widget_*.png", "**/widget_*.xml", "**/map_*.xml", "**/map_*.png"
}
}
task copyWidgetIcons(type: Sync) {
from "res/drawable-hdpi/"
into "res/drawable-large/"
include "**/widget_*.png", "**/widget_*.xml", "**/map_*.xml", "**/map_*.png"
preserve {
include '*'
exclude "**/widget_*.png", "**/widget_*.xml", "**/map_*.xml", "**/map_*.png"
}
}
@ -377,10 +419,13 @@ task collectExternalResources {
collectHelpContentsAssets,
collectHelpContentsStyle,
copyStyleIcons,
copyPOIIcons,
updateNoTranslate,
validateTranslate,
copyWidgetIcons,
copyPoiCategiry,
copyWidgetIconsHdpi,
copyWidgetIconsXhdpi,
copyPoiCategories,
downloadWorldMiniBasemap
Gradle gradle = getGradle()

View file

@ -1,6 +0,0 @@
cp -f res/drawable-hdpi/widget_* res/drawable-large/
cp -f res/drawable-xxhdpi/widget_* res/drawable-large-hdpi/
cp -f res/drawable-xhdpi/widget_* res/drawable-large-xhdpi/
cp -f res/drawable-hdpi/map_* res/drawable-large/
cp -f res/drawable-xhdpi/map_* res/drawable-large-hdpi/
cp -f res/drawable-xxhdpi/map_* res/drawable-large-xhdpi/

View file

@ -183,8 +183,9 @@
android:layout_marginBottom="@dimen/map_button_size"
android:orientation="horizontal">
<SeekBar
android:id="@+id/map_transparency_seekbar"
<com.google.android.material.slider.Slider
android:id="@+id/map_transparency_slider"
style="@style/Widget.Styled.Slider"
android:layout_width="@dimen/map_trans_seek_size"
android:layout_height="wrap_content"
android:layout_gravity="center"/>

View file

@ -80,11 +80,13 @@
</LinearLayout>
<SeekBar
android:id="@+id/speed_seekbar"
<com.google.android.material.slider.Slider
android:id="@+id/speed_slider"
style="@style/Widget.Styled.Slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:layout_marginLeft="@dimen/content_padding_small"
android:layout_marginRight="@dimen/content_padding_small"
android:paddingBottom="@dimen/content_padding" />
</LinearLayout>

View file

@ -34,9 +34,10 @@
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginStart="@dimen/dialog_content_margin" />
<SeekBar
<com.google.android.material.slider.Slider
android:id="@+id/Speedup"
android:layout_width="fill_parent"
style="@style/Widget.Styled.Slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dialog_content_margin"
android:layout_marginTop="@dimen/map_small_button_margin"

View file

@ -3,14 +3,14 @@
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx
android:id="@android:id/title"
@ -36,10 +36,10 @@
<com.google.android.material.slider.Slider
android:id="@+id/slider"
style="@style/Widget.MaterialComponents.Slider"
android:theme="@style/Theme.MaterialComponents"
style="@style/Widget.Styled.Slider"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:layout_width="match_parent"
android:layout_height="wrap_content"
osmand:labelBehavior="gone" />
android:layout_height="wrap_content" />
</LinearLayout>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<net.osmand.plus.widgets.TextViewEx xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/button_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:letterSpacing="@dimen/description_letter_spacing"
android:paddingLeft="@dimen/content_padding_half"
android:paddingTop="@dimen/content_padding_half"
android:paddingRight="@dimen/content_padding_half"
android:paddingBottom="@dimen/content_padding_half"
android:textColor="?attr/active_color_basic"
android:textSize="@dimen/default_desc_text_size"
app:typeface="@string/font_roboto_medium"
tools:text="@string/read_more" />

View file

@ -21,8 +21,9 @@
android:layout_marginEnd="10dp"
android:layout_marginStart="10dp" />
<SeekBar
<com.google.android.material.slider.Slider
android:id="@+id/ZoomToDownload"
style="@style/Widget.Styled.Slider"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/content_padding"

View file

@ -198,17 +198,14 @@
<com.google.android.material.slider.Slider
android:id="@+id/transparency_slider"
style="@style/Widget.MaterialComponents.Slider"
style="@style/Widget.Styled.Slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/list_header_settings_top_margin"
android:paddingBottom="@dimen/dialog_content_margin"
android:stepSize="1"
android:theme="@style/Theme.MaterialComponents"
app:haloRadius="@dimen/slider_thumb_size"
app:thumbRadius="@dimen/slider_thumb_size"
app:tickColor="@android:color/transparent"
app:trackHeight="@dimen/slider_track_height" />
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:stepSize="1" />
<View
android:layout_width="match_parent"
@ -281,16 +278,13 @@
<com.google.android.material.slider.Slider
android:id="@+id/zoom_slider"
style="@style/Widget.MaterialComponents.Slider"
style="@style/Widget.Styled.Slider"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:stepSize="1"
android:theme="@style/Theme.MaterialComponents"
app:haloRadius="@dimen/slider_thumb_size"
app:thumbRadius="@dimen/slider_thumb_size"
app:tickColor="@color/color_black"
app:trackHeight="@dimen/slider_track_height" />
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:stepSize="1" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/zoom_value_max"

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/card_and_list_background_basic">
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/list_header_settings_top_margin">
<net.osmand.plus.LockableViewPager
android:id="@+id/images_pager"
android:layout_width="match_parent"
android:layout_height="132dp" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:letterSpacing="@dimen/text_button_letter_spacing"
android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/list_header_settings_top_margin"
android:paddingRight="@dimen/content_padding"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
app:typeface="@string/font_roboto_regular"
tools:text="@string/plugin_disabled_descr" />
<LinearLayout
android:id="@+id/buttons_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/content_padding_half"
android:layout_marginTop="@dimen/list_header_settings_top_margin"
android:layout_marginRight="@dimen/content_padding_half"
android:orientation="vertical" />
</LinearLayout>
</LinearLayout>

View file

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/pstsTabBackground"
android:minHeight="@dimen/dashboard_map_toolbar"
android:theme="?attr/toolbar_theme"
app:contentInsetLeft="72dp"
app:contentInsetStart="72dp" />
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/activity_background_basic">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/dialog_button_ex_height">
<ImageView
android:id="@+id/item_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:adjustViewBounds="true"
android:background="?attr/bg_color"
android:maxHeight="132dp"
android:scaleType="fitCenter"
tools:src="@drawable/extension_stub" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/item_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/bg_color"
android:letterSpacing="@dimen/text_button_letter_spacing"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/content_padding_small"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
app:typeface="@string/font_roboto_regular"
tools:text="@string/lorem_ipsum" />
<include layout="@layout/card_bottom_divider" />
</LinearLayout>
</ScrollView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="?attr/list_background_color">
<include layout="@layout/bottom_buttons" />
</LinearLayout>
</FrameLayout>
</LinearLayout>

View file

@ -33,14 +33,16 @@
android:layout_height="wrap_content"
tools:src="@drawable/ic_action_opacity"/>
<SeekBar
android:id="@+id/seekbar"
style="?android:attr/progressBarStyleHorizontal"
<com.google.android.material.slider.Slider
android:id="@+id/slider"
style="@style/Widget.Styled.Slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:valueFrom="0"
android:valueTo="255"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/content_padding_half"
android:layout_marginRight="@dimen/content_padding"
android:max="255"
android:layout_marginStart="@dimen/content_padding_half"
android:layout_marginEnd="@dimen/content_padding" />
</LinearLayout>

View file

@ -98,15 +98,14 @@
android:layout_marginBottom="@dimen/map_button_size"
android:orientation="horizontal">
<SeekBar
android:id="@+id/map_transparency_seekbar"
<com.google.android.material.slider.Slider
android:id="@+id/map_transparency_slider"
style="@style/Widget.Styled.Slider"
android:layout_width="@dimen/map_trans_seek_size"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:paddingStart="6dp"
android:paddingEnd="6dp" />
android:layout_marginLeft="@dimen/dashPadding"
android:layout_marginRight="@dimen/dashPadding"/>
</LinearLayout>

View file

@ -15,7 +15,7 @@
<ImageView
android:id="@+id/plugin_image"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:adjustViewBounds="true"

View file

@ -34,6 +34,7 @@
android:layout_gravity="center"
android:clickable="false"
android:visibility="gone"
app:srcCompat="@drawable/mx_special_star_stroked" />
app:srcCompat="@drawable/mx_special_star_stroked"
/>
</FrameLayout>
</FrameLayout>

View file

@ -118,11 +118,15 @@
</LinearLayout>
<SeekBar
android:id="@+id/angle_seekbar"
<com.google.android.material.slider.Slider
android:id="@+id/angle_slider"
style="@style/Widget.Styled.Slider"
android:valueTo="90"
android:stepSize="5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="90"
android:layout_marginLeft="@dimen/content_padding_small"
android:layout_marginRight="@dimen/content_padding_small"
android:paddingBottom="@dimen/content_padding" />
</LinearLayout>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/slider_container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.slider.Slider
android:id="@+id/slider"
style="@style/Widget.Styled.Slider"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</FrameLayout>

View file

@ -3602,4 +3602,34 @@
<string name="move_inside_category">يمكنك نقل العناصر داخل هذه الفئة فقط.</string>
<string name="developer_plugin">الإضافات المطورة</string>
<string name="shared_string_items">العناصر</string>
<string name="select_wikipedia_article_langs">حدد اللغات التي ستظهر بها مقالات ويكيبيديا على الخريطة. يمكنك التبديل بين جميع اللغات المتاحة أثناء قراءة المقالة.</string>
<string name="some_articles_may_not_available_in_lang">قد لا تتوفر بعض مقالات ويكيبيديا بلغتك.</string>
<string name="lang_zhyue">الكانتونية</string>
<string name="lang_zhminnan">جنوب دقيقة</string>
<string name="lang_yo">اليوروبية</string>
<string name="lang_war">واراي</string>
<string name="lang_uz">الأوزبكية</string>
<string name="lang_ur">الأوردية</string>
<string name="lang_tt">التتار</string>
<string name="lang_tg">الطاجيكية</string>
<string name="lang_sco">الأسكتلندية</string>
<string name="lang_scn">الصقلية</string>
<string name="lang_pnb">البنجابية</string>
<string name="lang_ne">النيبالية</string>
<string name="lang_nap">نابولي</string>
<string name="lang_my">البورمية</string>
<string name="lang_mn">المنغولية</string>
<string name="lang_min">مينانغكابو</string>
<string name="lang_mg">مدغشقر</string>
<string name="lang_ky">القرقيزية</string>
<string name="lang_kk">الكازاخستانية</string>
<string name="lang_jv">الجاوية</string>
<string name="lang_gu">الجوجاراتية</string>
<string name="lang_cv">تشوفاش</string>
<string name="lang_ce">الشيشانية</string>
<string name="lang_bar">البافارية</string>
<string name="lang_ba">باشكير</string>
<string name="lang_an">ارجواني</string>
<string name="lang_lmo">لومبارد</string>
<string name="custom_color">لون مخصص</string>
</resources>

View file

@ -1,13 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources><string name="poi_road_obstacle">Ugur n webrid</string>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="poi_road_obstacle">Ugur n webrid</string>
<string name="poi_healthcare">Tazmart</string>
<string name="poi_fuel_type">Tawsit n tumast</string>
<string name="poi_fuel_avia_type">Tawsit n tumast (avia)</string>
<string name="poi_fuel_type">Tawsit n userɣu</string>
<string name="poi_fuel_avia_type">Tawsit n userɣu (isafagen)</string>
<string name="poi_clothes_type">Tawsit</string>
<string name="poi_shoes_type">Tawsit</string>
<string name="poi_fire_hydrant_type">Tawsit</string>
<string name="poi_highway_crossing_type">Ṣṣenf</string>
<string name="poi_zoo_type">Ṣṣenf</string>
<string name="poi_highway_crossing_type">Tawsit</string>
<string name="poi_zoo_type">Anaw</string>
<string name="poi_traffic_signals_sound">Imesli</string>
<string name="poi_shop">Tazenzut</string>
<string name="poi_sport">Addal</string>
@ -24,9 +25,8 @@
<string name="poi_clothes_schoolwear">Aγerbaz</string>
<string name="poi_music_school">Aγerbaz n cna</string>
<string name="poi_language_school">Aγerbaz n tutlayin</string>
<string name="poi_payment_type">Tawsit n usellek</string>
<string name="poi_payment_fuel_type">Tikaṛḍiwin n tumast</string>
<string name="poi_payment_type">Tawsit n lexlaṣ</string>
<string name="poi_payment_fuel_type">Tikaṛḍiwin n userɣu</string>
<string name="poi_service_general">Ameẓlu</string>
<string name="poi_pump">Tamejγart</string>
<string name="poi_city_capital">Tamaneγt</string>
@ -54,7 +54,631 @@
<string name="poi_hairdresser">Anersam</string>
<string name="poi_bank">Tabanka</string>
<string name="poi_love_hotel">Asensu n tayri</string>
<string name="poi_payment_telephone_cards_yes">Tikarḍiwin n usiwel</string>
<string name="poi_cuisine_bakery">Taneγrumt</string>
<string name="poi_tactile_paving_incorrect">Arameqtu</string>
<string name="poi_video_no">Uhu</string>
<string name="poi_video_yes">Ih</string>
<string name="poi_sms_no">Uhu</string>
<string name="poi_sms_yes">Ih</string>
<string name="poi_video_telephone">Ividyuten</string>
<string name="poi_sms">SMS</string>
<string name="poi_volcano_type_mud">Ixmiṛ</string>
<string name="poi_volcano_status_inactive">Insa</string>
<string name="poi_volcano_status_active">Urmid</string>
<string name="poi_volcano_status">Addad</string>
<string name="poi_volcano_type">Anaw</string>
<string name="poi_url">URL</string>
<string name="poi_parking_space">Amḍiq n aniɣsur</string>
<string name="poi_bath_open_air_no">Uhu</string>
<string name="poi_bath_open_air_yes">Ih</string>
<string name="poi_bath_type_lake">Amdun</string>
<string name="poi_bath_type_river">Asif</string>
<string name="poi_bath_type">Anaw</string>
<string name="poi_craft_builder">Abennay n tittra laqqayen</string>
<string name="poi_disabled_yes">Ih</string>
<string name="poi_goods_yes">Ih</string>
<string name="poi_hgv_delivery">Livraison de nourriture</string>
<string name="poi_hgv_destination">Taniɣert</string>
<string name="poi_hgv_yes">Ih</string>
<string name="poi_mofa_yes">Ih</string>
<string name="poi_moped_yes">Ih</string>
<string name="poi_motorcycle_destination">Taniɣert</string>
<string name="poi_motorcycle_yes">Ih</string>
<string name="poi_trailer_yes">Ih</string>
<string name="poi_motorhome_yes">Ih</string>
<string name="poi_caravan_yes">Ih</string>
<string name="poi_bus_yes">Ih</string>
<string name="poi_snowmobile_yes">Ih</string>
<string name="poi_defibrillator_location">Adig</string>
<string name="reddit">Reddit</string>
<string name="poi_climbing_crag">Ih</string>
<string name="poi_rtsa_scale_3b_asterisk">3Б*</string>
<string name="poi_rtsa_scale_3b"></string>
<string name="poi_rtsa_scale_3a_asterisk">3А*</string>
<string name="poi_rtsa_scale_3a">3А</string>
<string name="poi_rtsa_scale_2b_asterisk">2Б*</string>
<string name="poi_rtsa_scale_2b"></string>
<string name="poi_rtsa_scale_2a_asterisk">2А*</string>
<string name="poi_rtsa_scale_1b_asterisk">1Б*</string>
<string name="poi_rtsa_scale_1b"></string>
<string name="poi_rtsa_scale_1a_asterisk">1А*</string>
<string name="poi_rtsa_scale_1a">1А</string>
<string name="poi_charging_station">taɣsert n uɛemmeṛ</string>
<string name="poi_park_ride_bus">Azrug</string>
<string name="poi_park_ride_yes">Ih</string>
<string name="poi_denotation_landmark">Aglam n temnaḍt</string>
<string name="poi_childcare">Aqareɛ n warrac</string>
<string name="poi_books_children"># Arrac</string>
<string name="poi_books_religion">Asγan</string>
<string name="poi_substation_measurement">askar n akat</string>
<string name="poi_substation_compression">_War askkussem</string>
<string name="poi_substation_compensation">Compensation de la désynchronisation audio</string>
<string name="poi_substation_converter">Convertisseur YUVP</string>
<string name="poi_substation_transition">Ma yella taɣult-agi termed udiɣ tremmes-d imaylen akka tura, rnu akk tansiwin imayl ilaqen deg uḥric wis 3 send ad tbeddleḍ akalas MK akken ur ixetteṛ ara tiddin ar waddad amaynut.</string>
<string name="poi_substation_industrial">Industriel</string>
<string name="poi_substation_distribution">Beṭṭu</string>
<string name="poi_substation_transmission">Mode de transmission</string>
<string name="poi_bulk_purchase_yes">Ih</string>
<string name="poi_substation_type">Anaw</string>
<string name="poi_atm">Asedgar awurman n yidrimen</string>
<string name="poi_hill">Awrir</string>
<string name="poi_end_date">Azemz n tagara</string>
<string name="poi_rock">Aẓru</string>
<string name="poi_course">Jerred ɣer temsirin tuzribin ɣef tbaḍnit</string>
<string name="poi_checkpoint_type_electronic">Electronique</string>
<string name="poi_checkpoint_type_code">Tangalt</string>
<string name="poi_glacier_type_rock">Aẓru</string>
<string name="poi_glacier_type_hanging">Sireg asenqeḍ s usiẓi</string>
<string name="poi_glacier_type_valley">Talat</string>
<string name="poi_service_vehicle_insurance_yes">Assurance</string>
<string name="poi_service_vehicle_alignment_yes">Asettef</string>
<string name="poi_service_vehicle_glass_yes">Rmed/ sens Looking Glass</string>
<string name="poi_service_vehicle_batteries_yes">Tibaṭriyin</string>
<string name="poi_service_vehicle_car_parts_yes">Ticeqqufin n ubeddel n tkeryas</string>
<string name="poi_socket_schuko_output_low">Faible</string>
<string name="poi_socket_schuko_output_medium">Alemmas</string>
<string name="poi_socket_schuko_output_high">Haut</string>
<string name="poi_socket_cee_blue_output_low">Faible</string>
<string name="poi_socket_cee_blue_output_medium">Alemmas</string>
<string name="poi_socket_cee_blue_output_high">Haut</string>
<string name="poi_socket_type3_output_low">Faible</string>
<string name="poi_socket_type3_output_medium">Alemmas</string>
<string name="poi_socket_type3_output_high">Haut</string>
<string name="poi_socket_type2_combo_output_low">Faible</string>
<string name="poi_socket_type2_combo_output_medium">Alemmas</string>
<string name="poi_socket_type2_combo_output_high">Haut</string>
<string name="poi_socket_type2_output_low">Faible</string>
<string name="poi_socket_type2_output_medium">Alemmas</string>
<string name="poi_socket_type2_output_high">Haut</string>
<string name="poi_socket_chademo_output_low">Faible</string>
<string name="poi_socket_chademo_output_medium">Alemmas</string>
<string name="poi_socket_chademo_output_high">Haut</string>
<string name="poi_socket_type2_yes">tiddi n ufaylu: $1, anaw n MIME: $2</string>
<string name="poi_socket_type1_yes">Tawsit = 1 yemmal-d tagar di tazwara n tawala, = 0 di tagara n tawala.</string>
<string name="poi_electricity_combined_charging">taɣsert n uɛemmeṛ</string>
<string name="poi_climbing_ice_no">Patinoire</string>
<string name="poi_climbing_trad_no">Amensay</string>
<string name="poi_ref_post">Tangalt n lpusṭa</string>
<string name="poi_post_flats">Plat</string>
<string name="poi_post_street">Abrid</string>
<string name="poi_bicycle_no">Azlalam</string>
<string name="poi_car_no">Takerrust: uhu</string>
<string name="poi_car_yes">Takerrust: ih</string>
<string name="poi_water_place_access_family">Famille</string>
<string name="poi_water_place_access_community">Tarbaɛt</string>
<string name="poi_water_supply_pump">Tamejγart</string>
<string name="poi_water_purification_none">Ula yiwen</string>
<string name="poi_operational_status_broken">Broken Hill</string>
<string name="poi_operational_status_restricted">Ukrif</string>
<string name="poi_operational_status_closed">Yemdel</string>
<string name="poi_operational_status_open">Ldi</string>
<string name="poi_government_archive">Aɣbar</string>
<string name="poi_network">Aẓeṭṭa</string>
<string name="poi_boat_rental">Asekru n iɣerruba</string>
<string name="poi_reservation_no">Asuter n uḥeṛṛi</string>
<string name="poi_animal_shelter_purpose_release_no">Tasuffeɣt n lqem</string>
<string name="poi_animal_shelter_purpose_adoption_no">Ɣef uqbal</string>
<string name="poi_animal_shelter_purpose">Glem asentel n tugna</string>
<string name="poi_owner">Bab</string>
<string name="poi_motorcycle_type_standard">Anaway</string>
<string name="poi_motorcycle_parts_yes">amuren</string>
<string name="poi_motorcycle_repair_no">Seggem azadur n isefka</string>
<string name="poi_motorcycle_repair_yes">Seggem azadur n isefka</string>
<string name="poi_motorcycle_rental_no">Kerru n tkerrust</string>
<string name="poi_motorcycle_services">Services</string>
<string name="poi_fast_food_cafeteria">Ih</string>
<string name="poi_gambling_type">Anaw</string>
<string name="poi_theatre_genre_circus">Cirque</string>
<string name="poi_social_facility_type">Anaw</string>
<string name="poi_shower_filter_yes">Ih</string>
<string name="poi_takeaway_filter_yes">Ih</string>
<string name="poi_delivery_filter_yes">Ih</string>
<string name="poi_outdoor_seating_filter_yes">Ih</string>
<string name="poi_cuisine_tibetan">Tatibitant</string>
<string name="poi_cuisine_bulgarian">Tabulgarit</string>
<string name="poi_cuisine_dutch">Tahulandit</string>
<string name="poi_cuisine_english">Tagnizit</string>
<string name="poi_cuisine_hawaiian">Tahawayt</string>
<string name="poi_cuisine_armenian">Tarmanit</string>
<string name="poi_cuisine_swedish">Taswidit</string>
<string name="poi_cuisine_cantonese">Takuntunit</string>
<string name="poi_cuisine_basque">Tabaskit</string>
<string name="poi_cuisine_afghan">Afɣani</string>
<string name="poi_cuisine_ukrainian">Tukranit</string>
<string name="poi_cuisine_mongolian">Tamungulit</string>
<string name="poi_cuisine_latin_american">Taspanit n temrikt talatinit</string>
<string name="poi_cuisine_cuban">![]({{ site.baseurl }}/assets/posts/2017-07-03-cuba/child_apps.jpg)&lt;br/&gt;
\n*Agrud n Kuba yettnadin isnasen yella i usiggez*
\n</string>
<string name="poi_cuisine_czech">Taččikit</string>
<string name="poi_cuisine_uzbek">Tuzbikt</string>
<string name="poi_cuisine_european">Asulay VAT n Turuft</string>
<string name="poi_cuisine_lao">Talawsit</string>
<string name="poi_cuisine_hungarian">Tahungrit</string>
<string name="poi_cuisine_irish">Tirlandit</string>
<string name="poi_cuisine_malaysian">Amalizi</string>
<string name="poi_cuisine_persian">Tafarsit</string>
<string name="poi_cuisine_malagasy">Tamalgact</string>
<string name="poi_cuisine_croatian">Takrwasit</string>
<string name="poi_cuisine_african">Afriq</string>
<string name="poi_cuisine_indonesian">Tandunizit</string>
<string name="poi_cuisine_danish">Tadanit</string>
<string name="poi_cuisine_polish">Tapulunit</string>
<string name="poi_cuisine_georgian">Taǧiyurǧit</string>
<string name="poi_cuisine_portuguese">Tapurtugit</string>
<string name="poi_cuisine_filipino">Tafilipant</string>
<string name="poi_cuisine_russian">Tarusit</string>
<string name="poi_cuisine_bavarian">Tabavaṛyant</string>
<string name="poi_cuisine_korean">Takurit</string>
<string name="poi_cuisine_vietnamese">Tabyatnamit</string>
<string name="poi_cuisine_spanish">Taspenyulit</string>
<string name="poi_cuisine_turkish">Taṭurkit</string>
<string name="poi_cuisine_thai">Taṭaylundit</string>
<string name="poi_cuisine_greek">Tagrikit</string>
<string name="poi_cuisine_french">Taṛumit</string>
<string name="poi_cuisine_asian">N Asya:</string>
<string name="poi_cuisine_american">Amarikan</string>
<string name="poi_cuisine_indian">Océan Indien</string>
<string name="poi_cuisine_german">Talmanit</string>
<string name="poi_cuisine_japanese">Tajapunit</string>
<string name="poi_cuisine_chinese">Tacinwatt</string>
<string name="poi_cuisine_italian">Taṭelyanit</string>
<string name="poi_fitness">Fitness</string>
<string name="poi_fitness_centre">Centres de conditionnement physique</string>
<string name="poi_health_specialty_behavior_yes">Comportement</string>
<string name="poi_health_specialty_dentistry_yes">Odontologie</string>
<string name="poi_aerialway_length">Tanzagt</string>
<string name="poi_wiki_lang_jv">Javanese wikiAwiki Ajavani</string>
<string name="poi_wiki_lang_als">Awiki alzasyan</string>
<string name="poi_wiki_lang_af">Awiki afrikaans</string>
<string name="poi_cargo_container">Conteneurs</string>
<string name="poi_temperature">Tifestiniwin n lḥamu</string>
<string name="poi_artist_name">Anaẓur</string>
<string name="poi_square">Amkuẓ</string>
<string name="poi_site_type_city">Tiɣremt</string>
<string name="poi_animal_training_dog">&lt;strong&gt;Amarraw&lt;/strong&gt; &amp;mdash; Tzemreḍ ad tsettefeḍ isebtar-inek s umyellel. deg umedya tzemreḍ ad tesɛuḍ asebtar &amp;#8220;Awal ɣef&amp;#8221; i yesɛan isebtar &amp;#8220;Tudert-iw&amp;#8221; aked&amp;#8220;Aqjun-iw&amp;#8221; d isebtar inadayen. Ulac tilist i isebtar inadayen.</string>
<string name="poi_theatre_genre_chamber_music">Musique de chambre</string>
<string name="poi_theatre_genre_comedy">Comédie</string>
<string name="poi_theatre_genre_cabaret">Cabaret</string>
<string name="poi_theatre_genre_opera">Opéra</string>
<string name="poi_theatre_genre_musical">Musical</string>
<string name="poi_social_facility_for_disabled">Yensa</string>
<string name="poi_social_facility_for_child"># Arrac</string>
<string name="poi_social_facility_shelter">Aglat</string>
<string name="poi_power_supply_yes">Ih</string>
<string name="poi_caravans_yes">Ih</string>
<string name="poi_washing_machine_yes">Ih</string>
<string name="poi_scout_yes">Ih</string>
<string name="poi_backcountry_no">Uhu</string>
<string name="poi_backcountry_yes">Ih</string>
<string name="poi_tents_yes">Tessireg</string>
<string name="poi_massage_chinese">Tacinwatt</string>
<string name="poi_massage_thai">Taṭaylundit</string>
<string name="poi_shoes_men">Irgazen</string>
<string name="poi_shoes_sport">Addalen</string>
<string name="poi_shoes_children"># Arrac</string>
<string name="poi_clothes_dance">Danse</string>
<string name="poi_clothes_socks">Nom d\'utilisateur SOCKS</string>
<string name="poi_clothes_traditional">Amensay</string>
<string name="poi_clothes_fur">Taḥidurt</string>
<string name="poi_clothes_sports">Addalen</string>
<string name="poi_clothes_men">Irgazen</string>
<string name="poi_street_lamp">Tasafut n ubrid</string>
<string name="poi_fuel_100ll">100LL n userɣu</string>
<string name="poi_fuel_91ul">91UL n userɣu</string>
<string name="poi_elevator_yes">Asalay</string>
<string name="poi_note">Tamawt</string>
<string name="poi_service_bicycle_pump_yes">Tamejγart</string>
<string name="poi_service_bicycle_repair_yes">Seggem azadur n isefka</string>
<string name="poi_route_bus_ref">Azrug</string>
<string name="poi_architect_name">Amasgad</string>
<string name="poi_width">Largeur</string>
<string name="poi_internet_access_type_yes">Tawsit n unekcum ar internet</string>
<string name="poi_internet_access_type_no">Tawsit n unekcum ar internet</string>
<string name="poi_internet_access_type_wired">S ugatu</string>
<string name="poi_internet_access_type_terminal">Anemdu</string>
<string name="poi_internet_access_type_wlan">Wi-Fi</string>
<string name="poi_shelter_type_building">Azadaɣ</string>
<string name="poi_shelter_type_weather_shelter">Anezwi</string>
<string name="poi_bin_yes">Iḍumman</string>
<string name="poi_bench_yes">Ih</string>
<string name="poi_beach_sand">Ijdi</string>
<string name="poi_wetland_mud">Ixmiṛ</string>
<string name="poi_wetland_marsh">Alma</string>
<string name="poi_resource_water">Aman</string>
<string name="poi_resource_stone">Ablaḍ</string>
<string name="poi_resource_silver">Argent</string>
<string name="poi_resource_sand">Ijdi</string>
<string name="poi_resource_ruby">Ruby</string>
<string name="poi_resource_lead">Amasay Design n lqem-agi</string>
<string name="poi_resource_aggregate">Agrégat</string>
<string name="poi_inscription">Ajerred</string>
<string name="poi_memorial_column">Tagejdit</string>
<string name="poi_memorial_stone">Ablaḍ</string>
<string name="poi_vending_ice_cream">Tamagrist</string>
<string name="poi_vending_dvd">DVD</string>
<string name="poi_vending_coffee">Lqahwa</string>
<string name="poi_vending_food">Učči</string>
<string name="poi_vending_drinks">Tissit</string>
<string name="poi_toilets_yes">Ih</string>
<string name="poi_male_yes">Amalay</string>
<string name="poi_car_wash_no">Tarda n tkeryas</string>
<string name="poi_brushless_yes">Ih</string>
<string name="poi_automated_no">Awurman</string>
<string name="poi_automated_yes">Ih</string>
<string name="poi_self_service_no">Ameẓlu n yiman</string>
<string name="poi_self_service_yes">Ih</string>
<string name="poi_service_repair_no">Seggem azadur n isefka</string>
<string name="poi_service_repair">Seggem azadur n isefka</string>
<string name="poi_service_parts">amuren</string>
<string name="poi_cocktails_yes">Ih</string>
<string name="poi_delivery_no">Livraison de nourriture</string>
<string name="poi_delivery_yes">Livraison de nourriture</string>
<string name="poi_microbrewery_yes">Ih</string>
<string name="poi_drive_through_yes">Ih</string>
<string name="poi_drive_in_no">Périphérique disque optique</string>
<string name="poi_drive_in_yes">Ih</string>
<string name="poi_description_payment">Aglam n lexlaṣ</string>
<string name="poi_payment_token_yes">Jetons</string>
<string name="poi_payment_paypal_yes">PayPal</string>
<string name="poi_payment_svg_yes">SVG - Scalable Vector Graphics</string>
<string name="poi_payment_ep_quick_yes">Tamerkast s tɣawla</string>
<string name="poi_payment_jcb_yes">JCB</string>
<string name="poi_payment_others_yes">Wiyyaḍ</string>
<string name="poi_payment_cheque_yes">Asenqed</string>
<string name="poi_payment_litecoin_yes">Litecoin</string>
<string name="poi_payment_american_express_no">Tikarḍiwin American Express (AMEX)...</string>
<string name="poi_payment_american_express_yes">American Express (AMEX)</string>
<string name="poi_payment_bitcoin_yes">Bitcoin</string>
<string name="poi_payment_cash_yes">Ṣerf</string>
<string name="poi_aerialway_bicycle_summer">Yettwasireg deg unebdu</string>
<string name="poi_aerialway_bicycle_yes">Tessireg</string>
<string name="poi_aerialway_heating_yes">Ih</string>
<string name="poi_capacity_disabled_yes">Ih</string>
<string name="poi_piste_grooming_no">Uhu</string>
<string name="poi_piste_grooming_classic">Klasik</string>
<string name="poi_piste_difficulty_expert">a muzay</string>
<string name="poi_piste_difficulty_advanced">Anaẓi</string>
<string name="poi_piste_difficulty_intermediate">2: Alemmas</string>
<string name="poi_piste_difficulty_easy">Fessus</string>
<string name="poi_level">Aswir</string>
<string name="poi_sand">Ijdi</string>
<string name="poi_logging">Journalisation</string>
<string name="poi_farmland">Akal n tkerrazt</string>
<string name="poi_garden">Produits pour maisons de campagne et le jardin</string>
<string name="poi_traffic_signals_sound_no">Uhu</string>
<string name="poi_traffic_signals_sound_yes">Ih</string>
<string name="poi_tactile_paving_yes">Ih</string>
<string name="poi_smoking_yes">Tessireg</string>
<string name="poi_smoking_no">Tessireg</string>
<string name="poi_covered_no">"Meṛṛa isenfaṛen i yeɛna uɣawas n ufter,ttwakksen. "</string>
<string name="poi_covered_yes">Ih</string>
<string name="poi_fireplace_yes">Ih</string>
<string name="poi_board_type_astronomy">Tasnallunt</string>
<string name="poi_board_type_technology">Tatiknulujit</string>
<string name="poi_information_sign">Creḍ</string>
<string name="poi_information_history">Amezray</string>
<string name="poi_information_terminal">Anemdu</string>
<string name="poi_information_office">Tanarit</string>
<string name="poi_information_map">Takarḍa</string>
<string name="poi_water_point">Adig n waman</string>
<string name="poi_pump_yes">Ih</string>
<string name="poi_pump_powered">Irfed-it</string>
<string name="poi_pump_manual">Awfusan</string>
<string name="poi_alt_name">Isem nniḍen</string>
<string name="poi_building">Azadaɣ</string>
<string name="poi_animal_shelter">Aglat n yiɣarsiwen</string>
<string name="poi_trees_coffea">Lqahwa</string>
<string name="poi_trees_date">Azemz</string>
<string name="poi_trees_orange">Ačinawi</string>
<string name="poi_trees_apple">Contrôler le volume du système avec la télécommande Apple</string>
<string name="poi_trees_olive">Olive</string>
<string name="poi_bicycle_parking_anchors">Timdeyin</string>
<string name="poi_nudism_yes">Tessireg</string>
<string name="poi_access_no">Ulac anekcum</string>
<string name="poi_wheelchair_limited">Ifuyla yeddan ɣer-sen talast n {{number}} MAṬ.</string>
<string name="poi_wheelchair_no">Uhu</string>
<string name="poi_start_date">Azemz n tazwara</string>
<string name="poi_seasonal_summer">Yettwasireg deg unebdu</string>
<string name="poi_seasonal_no">Uhu</string>
<string name="poi_seasonal_yes">Ih</string>
<string name="poi_drinking_water_no">Uhu</string>
<string name="poi_drinking_water_yes">Ih</string>
<string name="poi_fee_no">Uhu</string>
<string name="poi_fee_yes">Ih</string>
<string name="poi_operator">Amahal</string>
<string name="poi_height">Teɣzi</string>
<string name="poi_mobile">Aziraz</string>
<string name="poi_google_plus">Google</string>
<string name="poi_instagram">Instagram</string>
<string name="poi_youtube">YouTube</string>
<string name="poi_skype">Skype</string>
<string name="twitter">Twitter</string>
<string name="facebook">Facebook</string>
<string name="poi_fax">Fax</string>
<string name="poi_email">Imayl</string>
<string name="poi_website">Asmel n web</string>
<string name="poi_phone">Tiliɣri</string>
<string name="poi_description">Aseglem</string>
<string name="poi_entrance_exit">Tufɣa</string>
<string name="poi_block">Iḥder</string>
<string name="poi_wiki_lang_ko">Awiki Akuri</string>
<string name="poi_wiki_lang_ja">Awiki Ajapuni</string>
<string name="poi_wiki_lang_it">Awiki aṭelyan</string>
<string name="poi_wiki_place">Wikipedia</string>
<string name="poi_landmark">Aglam n temnaḍt</string>
<string name="poi_anchorage">Anchorage</string>
<string name="poi_islet">Tigzirt meẓẓiyen</string>
<string name="poi_island">Tigzirt</string>
<string name="poi_tree">Aseklu</string>
<string name="poi_wood">Amadeɣ</string>
<string name="poi_water">Aman</string>
<string name="poi_valley">Talat</string>
<string name="poi_beach">Taftist</string>
<string name="poi_stream">Flux</string>
<string name="poi_river">Asif</string>
<string name="poi_waterfall">Acercuṛ n waman</string>
<string name="poi_accountant">Amessiḍan</string>
<string name="poi_bureau_de_change">Tanarit n ubeddel n yidrimen</string>
<string name="poi_crematorium">Tanerɣut</string>
<string name="poi_brothel">Axxam n wuqqu</string>
<string name="poi_sauna">Sauna</string>
<string name="poi_shower">Tasnuceft</string>
<string name="poi_dock">Largeur de la zone de l\'animation de chargement (pixels)</string>
<string name="poi_car_sharing">Beṭṭu n tkeryas</string>
<string name="poi_car_rental">Kerru n tkerrust</string>
<string name="poi_it">Tanarit</string>
<string name="poi_lawyer">Abugaṭu</string>
<string name="poi_insurance">Assurance</string>
<string name="poi_nursing_home">Axxam n tastaɣt s udawi</string>
<string name="poi_doctors">Imejjayen</string>
<string name="poi_place_farm">Tibḥirt</string>
<string name="poi_place_allotments">Talmat n twacult</string>
<string name="poi_locality">Amḍiq</string>
<string name="poi_neighbourhood">Azniq</string>
<string name="poi_quarter">"Asnifel n n ukraḍyur aneggaru"</string>
<string name="poi_isolated_dwelling">Axxam awḥid</string>
<string name="poi_capital">Ih</string>
<string name="poi_city">Tiɣremt</string>
<string name="poi_country">Country</string>
<string name="poi_government">Anabaḍ</string>
<string name="poi_prison">Lḥebs</string>
<string name="poi_courthouse">Aneɣ n teɣdemt</string>
<string name="poi_social_facility">Ameẓlu amettan</string>
<string name="poi_university">Tasdawit</string>
<string name="poi_kindergarten">Tibḥirt n warrac</string>
<string name="poi_driving_school">Aɣerbaz n uselmed n tenheṛt</string>
<string name="poi_college">Aɣerbaz</string>
<string name="poi_construction">Construction &amp; travaux de réparation</string>
<string name="poi_basin">Amdun</string>
<string name="poi_allotments">Talmat n twacult</string>
<string name="poi_landfill">Agudu</string>
<string name="poi_recycling_furniture">Ameublement</string>
<string name="poi_recycling_hardcore">Hardcore</string>
<string name="poi_recycling_computers">Tasarut n turagt d tameɣtut i yiwen n useqdac u tzemreḍ ad tt-tesqedceḍ alam 3 n iselkimen. Asermed yuḥwaǧ tuqqna ɣer internet.</string>
<string name="poi_recycling_metal">Métal</string>
<string name="poi_recycling_aluminium">Aluminyum</string>
<string name="poi_recycling_wood">Amadeɣ</string>
<string name="poi_recycling_batteries">Tibaṭriyin</string>
<string name="poi_recycling_paper">Se_zg taɣawsa ɣer umasal n lkaɣeḍ</string>
<string name="poi_recycling_glass">Rmed/ sens Looking Glass</string>
<string name="poi_recycling_container">Anagbar</string>
<string name="poi_post_box">Tanaka n tebṛatin</string>
<string name="poi_weir">Uggug</string>
<string name="poi_rest_area">Amḍiq n ustaεfu</string>
<string name="poi_speed_camera">Takamiṛat n urured</string>
<string name="poi_bridge">Pont</string>
<string name="poi_tunnel">Ifri</string>
<string name="poi_cuisine_wine">Crab</string>
<string name="poi_cuisine_fast_food">Učči arurad</string>
<string name="poi_cuisine_ice_cream">Tamagrist</string>
<string name="poi_cuisine_coffee">Lqahwa</string>
<string name="poi_xmas_url">Asmel Web</string>
<string name="poi_xmas">Île Christmas</string>
<string name="poi_seasonal">Asemhuyan</string>
<string name="poi_shelter_type">Anaw</string>
<string name="poi_recycling_type">Anaw</string>
<string name="poi_beauty_salon_service">Ameẓlu</string>
<string name="poi_drive_in">Aḍebsi aquṛan</string>
<string name="poi_delivery">Livraison de nourriture</string>
<string name="poi_theatre_genre">Genre</string>
<string name="poi_resort_type">Anaw</string>
<string name="poi_clock_option">Ayen nniḍen</string>
<string name="poi_information_contents">Agbur</string>
<string name="poi_information_type">Anaw</string>
<string name="poi_wheelchair_yes">Ih</string>
<string name="poi_archaeological_site_type">Anaw</string>
<string name="poi_embassy_type">Anaw</string>
<string name="poi_animal_training_type">Anaw</string>
<string name="poi_telescope_type">Anaw</string>
<string name="poi_observatory_designation">Isem</string>
<string name="poi_service_bicycle_charging_no">La d-yettali</string>
<string name="poi_wiki_link">Wikipedia</string>
<string name="poi_length">Tanzagt</string>
<string name="poi_organic_no">Uhu</string>
<string name="poi_organic_yes">Ih</string>
<string name="poi_min_age">Âge minimum du gel (FREEZE)</string>
<string name="poi_display_no">Sken am:</string>
<string name="poi_voltage">Haut voltage LNB</string>
<string name="poi_telescope_spectrum">Analyseur de spectre</string>
<string name="poi_telescope_type_gamma">Gamma</string>
<string name="poi_telescope_type_radio">"Télévision numérique et radio"</string>
<string name="poi_telescope_type_optical">SDI optique</string>
<string name="poi_aerodrome_type_private">Uslig</string>
<string name="poi_aerodrome_type_public">Azayez</string>
<string name="poi_dispensing_yes">Ih</string>
<string name="poi_summer_camp">Camp d\'été</string>
<string name="poi_depth">Profondeur du framebuffer</string>
<string name="poi_fire_hydrant_style_water_source_stream">Flux</string>
<string name="poi_fire_hydrant_style_water_source_pond">Pond</string>
<string name="poi_fire_hydrant_style_water_source_main">MAIN</string>
<string name="poi_fire_hydrant_position_street">Abrid</string>
<string name="poi_fire_hydrant_position_green">Adal</string>
<string name="poi_disease_aids_no">Tallalin timeẓranin</string>
<string name="poi_home_visit_yes">Ih</string>
<string name="poi_emergency_no">Tiliɣri n utrab</string>
<string name="poi_fire_hydrant_type_wall">Aɣrab</string>
<string name="poi_fire_hydrant_type_pond">Pond</string>
<string name="poi_medical_system_chinese_yes">Chinois traditionel Unix (EUC-TW)</string>
<string name="poi_medical_system_western_yes">Utrim</string>
<string name="poi_free_flying_official_no">Tanarit: uhu</string>
<string name="poi_free_flying_official_yes">Tanarit: ih</string>
<string name="poi_vacuum_cleaner_yes">Ih</string>
<string name="poi_car_wash_yes">Ih</string>
<string name="poi_compressed_air_yes">Ih</string>
<string name="poi_protected_area">Tamnaḍt yettwaḥerzen</string>
<string name="poi_inscription_ne">Ajerred:GS</string>
<string name="poi_inscription_e">Ajerred:G</string>
<string name="poi_inscription_se">Ajerred:NS</string>
<string name="poi_inscription_s">Ajerred:N</string>
<string name="poi_inscription_sw">Ajerred:NM</string>
<string name="poi_inscription_w">Ajerred:M</string>
<string name="poi_inscription_nw">Ajerred:GM</string>
<string name="poi_inscription_n">Ajerred:G</string>
<string name="poi_official_name">Isem n tnarit</string>
<string name="poi_running">En cours d\'exécution</string>
<string name="poi_aerialway_drag_lift">Tiliski</string>
<string name="poi_aerialway_platter">Asalay n uḍebsi</string>
<string name="poi_aerialway_t_bar">Amessawen n tafeggagt s T</string>
<string name="poi_aerialway_chair_lift">Tilisɣimt</string>
<string name="poi_aerialway_cable_car">Tilifirik</string>
<string name="poi_aerialway_station">Taɣsert n tilituzdiɣt</string>
<string name="poi_ferry_terminal">Anemdu n ufirri</string>
<string name="poi_runway">Tafuɣalt</string>
<string name="poi_helipad">Anafag n ukuptir</string>
<string name="poi_aerodrome">Anafag</string>
<string name="poi_subway_station">Ih</string>
<string name="poi_bus_station">Taɣsert n yisakacen</string>
<string name="poi_bus_stop">Anbeddi n usakal</string>
<string name="poi_public_transport_platform_bus">Anbeddi n usakal</string>
<string name="poi_parking_entrance">Tabburt n uneɣsar</string>
<string name="poi_motorcycle_parking">Aneɣsar n imuṭuten</string>
<string name="poi_parking">Aneɣsar</string>
<string name="poi_fuel_1_50">1:50 n userɣu</string>
<string name="poi_fuel_1_25">1:25 n userɣu</string>
<string name="poi_fuel_octane_100">Octane 100</string>
<string name="poi_fuel_octane_98">Octane 98</string>
<string name="poi_fuel_octane_95">Octane 95</string>
<string name="poi_fuel_octane_92">Octane 92</string>
<string name="poi_fuel_octane_91">Octane 91</string>
<string name="poi_fuel_octane_80">Octane 80</string>
<string name="poi_car_wash">Tarda n tkeryas</string>
<string name="poi_gate">Tabburt</string>
<string name="poi_ford">Asaka</string>
<string name="poi_emergency_access_point">Tabburt n unekcum n utrab</string>
<string name="poi_ambulance_station">Taɣsirt n tasindut</string>
<string name="poi_grit_bin">Asenduq n tasent</string>
<string name="poi_fire_hydrant">Amsexsay n tmes</string>
<string name="poi_emergency_phone">Tiliɣri n utrab</string>
<string name="poi_fire_station">"Taqcelt n isexsayen"</string>
<string name="poi_games">Uraren</string>
<string name="poi_marketplace">Ssuq</string>
<string name="poi_sports">Articles de sport</string>
<string name="poi_musical_instrument">Allalen n uẓawan</string>
<string name="poi_books">Librairie</string>
<string name="poi_vending_machine">Asedgar awurman</string>
<string name="poi_coffee">Café</string>
<string name="poi_user_defined_other">Aseqdac arussin</string>
<string name="poi_osmwiki">Wikipedia</string>
<string name="poi_natural">Agaman</string>
<string name="poi_service">Ameẓlu</string>
<string name="poi_club">Club</string>
<string name="poi_internet_access">Anekcum ɣer Internet</string>
<string name="poi_office">Tanarit</string>
<string name="poi_administrative">Tadbelant</string>
<string name="poi_communication">taɣwalt</string>
<string name="poi_transportation">Transport de Fret</string>
<string name="poi_emergency">Tanesɣiwlt</string>
<string name="poi_bicycle_parking_type">Taswit</string>
<string name="poi_covered">Idel</string>
<string name="poi_parking_type">Tawsit</string>
<string name="poi_automated">Awurman</string>
<string name="poi_self_service">Ameẓlu n yiman</string>
<string name="poi_brushless">War imeṣleḥ</string>
<string name="poi_tactile_paving">Anasiw annalan</string>
<string name="poi_payment_toll_type">Tawsit n lexlaṣ</string>
<string name="poi_fire_hydrant_water_source">Tala</string>
<string name="poi_fire_hydrant_position">Adig</string>
<string name="poi_bicycle_service">Ameẓlu n uvilu</string>
<string name="poi_vending_type">Anaw n uznuzu</string>
<string name="poi_internet_access_type">Tawsit n unekcum ɣer internet</string>
<string name="poi_additional_type">Ayen-nniḍen</string>
<string name="poi_beauty">Salon de Beauté</string>
<string name="poi_craft_tailor">Axeggaḍ</string>
<string name="poi_craft_shoemaker">Axerraz</string>
<string name="poi_craft_plumber">Amsaldun</string>
<string name="poi_craft_photographer">Asewlaf</string>
<string name="poi_craft_painter">Abeyyaṭ</string>
<string name="poi_craft_gardener">Abeḥḥar</string>
<string name="poi_craft_electrician">Amesliktri</string>
<string name="poi_craft_carpenter">Amekras</string>
<string name="poi_craft_brewery">Tberna</string>
<string name="poi_drinking_water">Aman n tissit</string>
<string name="poi_food_court">Tamnaḍt n wučči</string>
<string name="poi_pub">Ttberna</string>
<string name="poi_bar">Ttberna</string>
<string name="poi_fast_food">Učči arurad</string>
<string name="poi_restaurant">Asečču</string>
<string name="poi_cafe">Lqehwa</string>
<string name="poi_park">Parc</string>
<string name="poi_swimming_pool">Tanerdabt</string>
<string name="poi_bench">Aɣalad</string>
<string name="poi_hunting_stand">Tanefsart n uselfeɣ</string>
<string name="poi_casino">Akazinu</string>
<string name="poi_library">Tamkarḍit</string>
<string name="poi_club_fan">Fan-club</string>
<string name="poi_resort">Resort</string>
<string name="poi_shelter">Aglat</string>
<string name="poi_tomb">Tanḍelt</string>
<string name="poi_clock">Tamrilt</string>
<string name="poi_information">Talɣut</string>
<string name="poi_monastery">Amunastiṛ</string>
<string name="poi_internet_access_no">Tawsit n unekcum ar internet</string>
<string name="poi_denomination_tibetan">Tatibitant</string>
<string name="poi_denomination_united">Tagelda Yeddukklen</string>
<string name="poi_religion_muslim">Islam</string>
<string name="poi_place_of_worship">Amḍiq n weɛbad</string>
<string name="poi_apartment">Abrid/Uṭṭun n uxxam:</string>
<string name="poi_hostel">Azebriz</string>
<string name="poi_attraction_maze">Tazibba</string>
<string name="poi_zoo">Zoo</string>
<string name="poi_fountain">Tala</string>
<string name="poi_city_gate">Tabburt n temdint</string>
<string name="poi_castle">Tiɣremt</string>
<string name="poi_boundary_stone">Aẓru n talast</string>
<string name="poi_battlefield">Amraḥ n Tamiwta</string>
<string name="poi_archaeological_site">Adig Asenzikan</string>
<string name="poi_artwork">URL de la jaquette</string>
<string name="poi_museum">Asalay</string>
<string name="poi_volleyball">Équipe de volley</string>
<string name="poi_swimming">Tanerdabt</string>
<string name="poi_roller_skating">Patin à roulettes</string>
<string name="poi_cycling">Tilḥin s uvilo</string>
<string name="poi_basketball">Équipe de basket-ball</string>
<string name="poi_raceway">Amnenniḍ</string>
<string name="poi_pitch">Pas</string>
<string name="poi_ice_rink">Patinoire</string>
<string name="poi_stadium">Annar</string>
<string name="poi_studio">Astudyu</string>
</resources>

View file

@ -3,7 +3,7 @@
<string name="rendering_value_car_name">Takeṛṛust</string>
<string name="rendering_value_bicycle_name">Azlalam</string>
<string name="rendering_value_pedestrian_name">Amsebrid</string>
<string name="shared_string_from">sγur</string>
<string name="shared_string_from">sɣur</string>
<string name="access_hint_enter_name">Ger isem</string>
<string name="access_hint_enter_category">Ger taggayt</string>
<string name="access_hint_enter_description">Gred aglam.</string>
@ -16,17 +16,17 @@
<string name="route_stops_before">%1$s n uneḥbus uqbel</string>
<string name="coords_search">Asemmezdi n unadi</string>
<string name="advanced_coords_search">Asemmezdi asurif n unadi</string>
<string name="back_to_search">Tuγalin γer unadi</string>
<string name="back_to_search">Tuɣalin ɣer unadi</string>
<string name="shared_string_location">Adig</string>
<string name="read_more">Γer uggar</string>
<string name="whats_new">Dacu i d amaynut deg</string>
<string name="shared_string_update">Sedγi</string>
<string name="share_menu_location">Bḍu adγar</string>
<string name="shared_string_update">Leqqem</string>
<string name="share_menu_location">Bḍu adɣar</string>
<string name="favorite_category_add_new_title">Rnu taggayt tamaynut</string>
<string name="favorite_category_add_new">Rnu amaynut</string>
<string name="av_locations">Idγaren</string>
<string name="rendering_value_red_name">Azeggaγ</string>
<string name="rendering_value_yellow_name">Awraγ</string>
<string name="av_locations">Idɣaren</string>
<string name="rendering_value_red_name">Azeggaɣ</string>
<string name="rendering_value_yellow_name">Awraɣ</string>
<string name="rendering_value_lightgreen_name">Adal afessas</string>
<string name="rendering_value_green_name">Adal</string>
<string name="rendering_value_lightblue_name">Azegzaw afessas</string>
@ -44,7 +44,7 @@
<string name="shared_string_never">Warǧin</string>
<string name="shared_string_none">Ulac</string>
<string name="shared_string_and">d</string>
<string name="shared_string_or">naγ</string>
<string name="shared_string_or">naɣ</string>
<string name="shared_string_history">Amezray</string>
<string name="shared_string_share">Bḍu</string>
<string name="shared_string_more">Uggar …</string>
@ -62,7 +62,7 @@
<string name="rendering_attr_hideText_name">Aḍris</string>
<string name="int_days">ussan</string>
<string name="osmo_connect_menu">Qqen</string>
<string name="voice_pref_title">Taγuct</string>
<string name="voice_pref_title">Taɣuct</string>
<string name="lang_zh">Tacinwatt</string>
<string name="lang_en">Tagnizit</string>
<string name="lang_en_gb">Tagnizit (Tagldit i ddukklen)</string>
@ -109,10 +109,10 @@
<string name="monitoring_control_start">GPX</string>
<string name="no_route">Ulac abrid</string>
<string name="map_widget_top_text">Isem n webrid</string>
<string name="map_widget_back_to_loc">Anida i yelliγ</string>
<string name="map_widget_back_to_loc">Anida i yelliɣ</string>
<string name="osmand_parking_hours">Isragen</string>
<string name="zoomOut">Semẓi</string>
<string name="zoomIn">Semγeṛ</string>
<string name="zoomIn">Semɣeṛ</string>
<string name="north">agafa</string>
<string name="north_north_east">agafa-ugafa-ugemmuḍ</string>
<string name="north_east">agafa-ugemmuḍ</string>
@ -129,11 +129,11 @@
<string name="west_north_west">ataram-ugafa-utaram</string>
<string name="north_west">agafa-utaram</string>
<string name="north_north_west">agafa-ugafa-utaram</string>
<string name="front">γer zdat</string>
<string name="right">γer tama tayeffust</string>
<string name="back">γer deffir</string>
<string name="left">γer tama taẓelmaṭt</string>
<string name="towards">γer</string>
<string name="front">ɣer zdat</string>
<string name="right">ɣer tama tayeffust</string>
<string name="back">ɣer deffir</string>
<string name="left">ɣer tama taẓelmaṭt</string>
<string name="towards">ɣer</string>
<string name="i_am_here">Aqliyi da</string>
<string name="index_name_north_america">Marikan n Ugafa</string>
<string name="index_name_central_america">Marikan Talemmast</string>
@ -144,7 +144,7 @@
<string name="index_name_africa">Tafriqt</string>
<string name="general_settings">Amatu</string>
<string name="city_type_village">Taddart</string>
<string name="city_type_town">Tiγremt</string>
<string name="city_type_town">Tiɣremt</string>
<string name="shared_string_gpx_route">Abrid n GPX</string>
<string name="button_upgrade_osmandplus">Leqqem OsmAnd+</string>
<string name="search_position_address">Tansa …</string>
@ -181,25 +181,25 @@
<string name="position_on_map_center">Talemmast</string>
<string name="position_on_map_bottom">Ddaw</string>
<string name="search_address_city">Tiɣremt</string>
<string name="search_address_building">Azadaγ</string>
<string name="search_address_building">Azadaɣ</string>
<string name="search_address_street_option">Ger iberdan</string>
<string name="poi_action_add">rnu</string>
<string name="poi_action_change">senfel</string>
<string name="poi_action_delete">kkes</string>
<string name="poi_dialog_opening_hours">Ldi</string>
<string name="app_name_osmand">OsmAnd</string>
<string name="building_number">Uṭṭun n Uzadaγ</string>
<string name="building_number">Uṭṭun n Uzadaɣ</string>
<string name="show_gpx">Sken isefka GPX</string>
<string name="roads">Iberdan</string>
<string name="buy"></string>
<string name="value_downloaded_of_max">%1$.1f ɣef %2$.1f MAṬ</string>
<string name="file_size_in_mb">%.1f MAṬ</string>
<string name="update_all">Sedγi iten akk (%1$s MB)</string>
<string name="update_all">Sedɣi iten akk (%1$s MB)</string>
<string name="enter_country_name">Sekcem isem n tmurt</string>
<string name="other_menu_group">Wayeḍ</string>
<string name="update">Sedγi</string>
<string name="update_now">Sedγi tura</string>
<string name="last_update">Asedγi aneggaru : %s</string>
<string name="update_now">Sedɣi tura</string>
<string name="last_update">Asedɣi aneggaru : %s</string>
<string name="update_time">Tallit n trarast</string>
<string name="daily">Yal ass</string>
<string name="weekly">Yal imalas</string>
@ -210,27 +210,27 @@
<string name="city_type_neighbourhood">Azniq</string>
<string name="map_widget_search">Anadi</string>
<string name="shared_string_is_open_24_7">Taneldit 24/7</string>
<string name="follow_us">Ḍfer aγ</string>
<string name="follow_us">Ḍfer aɣ</string>
<string name="access_category_choice">Fren taggayt</string>
<string name="shared_string_move_up">Ali ↑</string>
<string name="shared_string_move_down">Ader ↓</string>
<string name="road_blocked">Yergel ubrid</string>
<string name="shared_string_type">"Type "</string>
<string name="live_updates">Isdγiten usriden</string>
<string name="live_updates">Isdɣiten usriden</string>
<string name="route_duration">Tanazagt :</string>
<string name="no_inet_connection">Ulac tuqqna n Internet</string>
<string name="no_update_info">Ur d skanay isdγiten</string>
<string name="shared_string_change">Senfel</string>
<string name="restart_search">Ɛiwed a nadi</string>
<string name="shared_string_search">Anadi</string>
<string name="search_for">Nadi γef</string>
<string name="address_search_desc">Anadi γef tansa</string>
<string name="shared_string_search">Nadi</string>
<string name="search_for">Nadi ɣef</string>
<string name="address_search_desc">Anadi ɣef tansa</string>
<string name="poi_filter_by_name">Anadi s yisem</string>
<string name="search_offline_clear_search">Anadi Ajdid</string>
<string name="searching_address">Anadi n tansa …</string>
<string name="shared_string_plugin">Azegrar</string>
<string name="type_address">Gred tansa</string>
<string name="type_city_town">Sekcem tiγremt neγ tamdint</string>
<string name="type_city_town">Sekcem tiɣremt neɣ tamdint</string>
<string name="type_postcode">Sekcem angal n tesreqqest</string>
<string name="select_city">Ffren tamdint</string>
<string name="select_postcode">Ffren angal n unadi</string>
@ -240,15 +240,15 @@
<string name="show_route">Ttfaṣil n webrid</string>
<string name="route_head">Edfar</string>
<string name="shared_string_email_address">Tansa imayl</string>
<string name="looking_up_address">Anadi γef tansa</string>
<string name="plugin_settings">Iseγzaf</string>
<string name="shared_string_settings">Iγewwaṛen</string>
<string name="looking_up_address">Anadi ɣef tansa</string>
<string name="plugin_settings">Iseɣzaf</string>
<string name="shared_string_settings">Iɣewwaṛen</string>
<string name="shared_string_address">Tansa</string>
<string name="favourites_edit_dialog_category">Taggayt</string>
<string name="search_history_street">Abrid : {0}, {1}</string>
<string name="search_offline_address">Anadi s war tuqqna</string>
<string name="search_online_address">Anadi s tuqqna</string>
<string name="search_address">Nadi γef tansa</string>
<string name="search_address">Nadi ɣef tansa</string>
<string name="search_address_region">Tamnaḍt</string>
<string name="search_address_street">Abrid</string>
<string name="add_favorite_dialog_default_favourite_name">Menyif</string>
@ -256,29 +256,29 @@
<string name="favourites">Inurifen</string>
<string name="empty_state_favourites">Rnu ɣer imenyafen</string>
<string name="wrong_input">Yir anekcam</string>
<string name="shared_string_options">Iγewwaṛen</string>
<string name="shared_string_options">Iɣewwaṛen</string>
<string name="mapillary_menu_title_username">Isem n useqdac</string>
<string name="nearest_cities">Timdinin ig qarben</string>
<string name="shared_string_add_to_map_markers">Rnu ar ticṛaḍ</string>
<string name="map_markers">Ticṛaḍ</string>
<string name="lang_kab">Taqbaylit</string>
<string name="lang_ber">Tifinaγ</string>
<string name="lang_ber">Tifinaɣ</string>
<string name="shared_string_cancel">Sefsex</string>
<string name="shared_string_help">Tallelt</string>
<string name="shared_string_save">Sekles</string>
<string name="shared_string_apply">Snes</string>
<string name="shared_string_show_all">Sken akk</string>
<string name="map_locale">Tutlayt n tgertilt</string>
<string name="download_tab_updates">Isedγiten</string>
<string name="download_tab_updates">Isedɣiten</string>
<string name="rendering_category_details">Talqayt</string>
<string name="rendering_category_transport">Amesni</string>
<string name="text_size">Tiddi n waḍris</string>
<string name="speak_street_names">Ismawen n iberdan (TTS)</string>
<string name="context_menu_item_directions_to">Iwellihen γer</string>
<string name="context_menu_item_directions_to">Iwellihen ɣer</string>
<string name="context_menu_item_directions_from">Tinilwin seg</string>
<string name="street_name">Isem n webrid</string>
<string name="phone">Tiliγri</string>
<string name="map_widget_renderer">Aγanib n tkarḍa</string>
<string name="phone">Tiliɣri</string>
<string name="map_widget_renderer">Aɣanib n tkarḍa</string>
<string name="shared_string_description">Asnummel</string>
<string name="user_password">Awal-ik uffir n OSM</string>
<string name="city_type_hamlet">Aḥriq</string>
@ -287,7 +287,7 @@
<string name="transport_Routes">Iberdan</string>
<string name="transport">Amesni</string>
<string name="enter_new_name">Jerred ism ajdid</string>
<string name="shared_string_back">Uγal</string>
<string name="shared_string_back">Uɣal</string>
<string name="shared_string_view">Sken</string>
<string name="shared_string_road">Abrid</string>
<string name="shared_string_finish">Fakk</string>
@ -328,7 +328,7 @@
<string name="rendering_value_medium_w_name">D alemmas</string>
<string name="rendering_value_low_name">Faible</string>
<string name="shared_string_appearance">Udem</string>
<string name="shared_string_notifications">Ilγa</string>
<string name="shared_string_notifications">Ilɣa</string>
<string name="shared_string_continue">Kemmel</string>
<string name="shared_string_pause">Bedd</string>
<string name="shared_string_paused">Yettraǧu</string>
@ -348,7 +348,7 @@
<string name="osm_live_subscribe_btn">S\'abonner</string>
<string name="osm_live_active">Urmid</string>
<string name="osm_live_not_active">Insa</string>
<string name="osm_live_subscription_settings">Iγewwaṛen n ujerred</string>
<string name="osm_live_subscription_settings">Iɣewwaṛen n ujerred</string>
<string name="shared_string_toolbar">Tafeggagt n ifecka</string>
<string name="shared_string_widgets">Iwiǧiten</string>
<string name="shared_string_reverse_order">Tti asmizzwer</string>
@ -359,7 +359,7 @@
<string name="shared_string_sound">Imesli</string>
<string name="route_distance">Ameccaq n tamsalt :</string>
<string name="shared_string_near">Zdat n</string>
<string name="copied_to_clipboard">Aḍris yettwanγel γef afus</string>
<string name="copied_to_clipboard">Aḍris yettwanɣel ɣef afus</string>
<string name="osn_comment_dialog_title">Rnu awennit</string>
<string name="osb_comment_dialog_message">Izen</string>
<string name="osb_comment_dialog_author">Isem n umeskar</string>
@ -374,7 +374,7 @@
<string name="si_kmh">Kilometr deg usrag</string>
<string name="si_mph">Imilen deg usrag</string>
<string name="shared_string_navigation">Assilel</string>
<string name="download_live_updates">Isdγiten usriden</string>
<string name="download_live_updates">Isdɣiten usriden</string>
<string name="rendering_value_orange_name">Ačinawi</string>
<string name="rendering_value_purple_name">Amidadi</string>
<string name="rendering_value_pink_name">Axuxi</string>
@ -396,7 +396,7 @@
<string name="lang_ast">Tasturyant</string>
<string name="shared_string_show_details">Sken talqayt</string>
<string name="rendering_value_disabled_name">Yensa</string>
<string name="shared_string_copy">Nγel</string>
<string name="shared_string_copy">Nɣel</string>
<string name="shared_string_manage">Sefrek</string>
<string name="shared_string_edit">Ẓreg</string>
<string name="shared_string_places">Idigen</string>
@ -406,10 +406,10 @@
<string name="osmand_parking_minute">tas</string>
<string name="osmand_parking_time_left">id iguran</string>
<string name="your_edits">Tiẓrigin-ik</string>
<string name="general_settings_2">Iγewwaren imuta</string>
<string name="general_settings_2">Iɣewwaren imuta</string>
<string name="shared_string_dismiss">Aggi</string>
<string name="shared_string_do_not_use">Ur seqdac ara</string>
<string name="shared_string_off">Insa</string>
<string name="shared_string_off">Yensa</string>
<string name="shared_string_previous">Ɣer deffir</string>
<string name="shared_string_next">Ar zdat</string>
<string name="shared_string_enable">Rmed</string>
@ -434,9 +434,9 @@
<string name="shared_string_download">Sider</string>
<string name="shared_string_downloading">Azdam…</string>
<string name="shared_string_close">Mdel</string>
<string name="shared_string_exit">Tufγa</string>
<string name="shared_string_exit">Tufɣa</string>
<string name="shared_string_collapse">Ḍfes</string>
<string name="shared_string_show_on_map">"Sken γef tkarḍa"</string>
<string name="shared_string_show_on_map">"Sken ɣef tkarḍa"</string>
<string name="shared_string_map">Takarḍa</string>
<string name="shared_string_favorite">Menyif</string>
<string name="shared_string_favorites">Imenyafen</string>
@ -471,12 +471,12 @@
<string name="map_widget_plain_time">Tasaɛet imir-a</string>
<string name="selected_gpx_info_show">"
\n
\nAsiti γezzifen akken ad d-sekneḍ γef tkarḍa"</string>
\nAsiti ɣezzifen akken ad d-sekneḍ ɣef tkarḍa"</string>
<string name="local_index_gpx_info_show">"
\n
\nIγewwaṛen n usiti γezzifen"</string>
\nIɣewwaṛen n usiti ɣezzifen"</string>
<string name="gpx_selection_segment_title">Segment</string>
<string name="misc_pref_title"/>
<string name="misc_pref_title">Divers</string>
<string name="localization_pref_title">Asideg</string>
<string name="lang_pt_br">Tapurtugit (Birizil)</string>
<string name="lang_eu">Tabaskit</string>
@ -499,7 +499,7 @@
<string name="edit_tilesource_url_to_load">URL</string>
<string name="driving_region_australia">Usṭralya</string>
<string name="route_descr_map_location">Takarḍa :</string>
<string name="route_descr_destination">Taniγert</string>
<string name="route_descr_destination">Taniɣert</string>
<string name="plugin_distance_point_speed">arured</string>
<string name="plugin_distance_point">Taneqqiḍt</string>
<string name="distance_measurement_start_editing">Bdu taẓrigt</string>
@ -508,13 +508,13 @@
<string name="prefer_in_routing_title">Smenyifi …</string>
<string name="recording_unavailable">ulac</string>
<string name="recording_context_menu_play">Urar</string>
<string name="poi_filter_parking">Aneγsar</string>
<string name="poi_filter_parking">Aneɣsar</string>
<string name="poi_filter_entertainment">Asedhu</string>
<string name="poi_filter_restaurants">Taneččit</string>
<string name="poi_filter_fuel">Aserγu</string>
<string name="map_widget_parking">Aneγsar</string>
<string name="poi_filter_fuel">Aserɣu</string>
<string name="map_widget_parking">Aneɣsar</string>
<string name="map_widget_speed">Arured</string>
<string name="map_widget_distance">Taniγert</string>
<string name="map_widget_distance">Taniɣert</string>
<string name="map_widget_altitude">Awrir</string>
<string name="osmand_parking_minutes">Tisdatin</string>
<string name="osmand_parking_warning">Γur-k</string>
@ -524,12 +524,12 @@
<string name="gpxup_private">Uslig</string>
<string name="navigate_point_format">Format</string>
<string name="navpoint_search_desc">Tisidag</string>
<string name="plugins_screen">Iseγzaf</string>
<string name="prefs_plugins">Iseγzaf</string>
<string name="plugins_screen">Iseɣzaf</string>
<string name="prefs_plugins">Iseɣzaf</string>
<string name="gpx_visibility_txt">Tametwalant</string>
<string name="gpx_tags_txt">Tibzimin</string>
<string name="default_buttons_support">Tallelt</string>
<string name="info_button">Talγut</string>
<string name="info_button">Talɣut</string>
<string name="accessibility_mode">Askar n tnekcumt</string>
<string name="altitude">Awrir</string>
<string name="arrival_distance_factor_normally">Amagnu</string>
@ -537,17 +537,17 @@
<string name="index_name_asia">Asya</string>
<string name="amenity_type_user_defined">Aseqdac arussin</string>
<string name="routing_settings">Asnirem</string>
<string name="global_settings">Iγewwaren Imuta</string>
<string name="city_type_city">Tiγremt</string>
<string name="global_settings">Iɣewwaren Imuta</string>
<string name="city_type_city">Tiɣremt</string>
<string name="search_position_favorites">Imenyafen …</string>
<string name="search_position_undefined">D arbadu</string>
<string name="select_search_position">Taneṣlit :</string>
<string name="favorite_places_category">Imukan</string>
<string name="shared_string_release">Yeffeγ-d</string>
<string name="shared_string_release">Yeffeɣ-d</string>
<string name="local_index_mi_restore">Sermed</string>
<string name="local_index_mi_backup">Sexsi</string>
<string name="incomplete_locale">arummid</string>
<string name="context_menu_item_share_location">Bḍu adγar</string>
<string name="context_menu_item_share_location">Bḍu adɣar</string>
<string name="amenity_type_administrative">Tadbelant</string>
<string name="amenity_type_entertainment">Asedhu</string>
<string name="amenity_type_office">Tanarit</string>
@ -572,14 +572,14 @@
<string name="get_directions">Iwellihen</string>
<string name="failed_op">ixṣar</string>
<string name="finished_task">Immed</string>
<string name="additional_settings">Iγewwaren imernan</string>
<string name="additional_settings">Iɣewwaren imernan</string>
<string name="mark_point">Asaḍas</string>
<string name="search_button">Rechercher</string>
<string name="search_activity">Rechercher</string>
<string name="app_mode_bicycle">Tilḥin s uvilo</string>
<string name="navigate_point_latitude">Turrut</string>
<string name="navigate_point_longitude">Tazegrart</string>
<string name="search_address_building_option">Azadaγ</string>
<string name="search_address_building_option">Azadaɣ</string>
<string name="poi_dialog_comment">Awennit</string>
<string name="default_buttons_commit">Wennet</string>
<string name="filter_current_poiButton">Imzizdig</string>
@ -593,41 +593,41 @@
<string name="tab_title_basic">Azadur</string>
<string name="tab_title_advanced">Talqayt</string>
<string name="next_proceed">Ɣer zdat</string>
<string name="contact_info">Talγut n unermes</string>
<string name="are_you_sure">Tebγiḍ ?</string>
<string name="contact_info">Talɣut n unermes</string>
<string name="are_you_sure">Tebɣiḍ \?</string>
<string name="new_version">Lqem amaynut</string>
<string name="features_menu_group">Timahalin</string>
<string name="plugins_menu_group">Iseγzaf</string>
<string name="plugins_menu_group">Iseɣzaf</string>
<string name="faq_item">Isteqsiyen FAQ</string>
<string name="faq_item_description">Isteqsiyen i d-yettuγalen s waṭas</string>
<string name="faq_item_description">Isteqsiyen i d-yettuɣalen s waṭas</string>
<string name="versions_item">Ileqman</string>
<string name="feedback">Tikti</string>
<string name="contact_us">Anermis</string>
<string name="number_of_edits">Amḍan n ibeddlilen</string>
<string name="quick_action_add_favorite">Rnut d amenyaf</string>
<string name="favorite_autofill_toast_text">" yekles γer "</string>
<string name="favorite_autofill_toast_text">" yekles ɣer "</string>
<string name="favorite_empty_place_name">Amḍiq</string>
<string name="quick_action_add_category">Rnu taggayt tamaynutt</string>
<string name="quick_action_add_navigation">Asnirem</string>
<string name="quick_action_bug_message">Izen</string>
<string name="retry">Ɛreḍ tikkelt nniḍen</string>
<string name="add_point_before">Rnu tanqiḍt γer sdeffir</string>
<string name="add_point_after">Rnu tanqiḍt γer sdat</string>
<string name="search_map_hint">Tiγremt neγ tamnaḍt</string>
<string name="add_point_before">Rnu tanqiḍt ɣer sdeffir</string>
<string name="add_point_after">Rnu tanqiḍt ɣer sdat</string>
<string name="search_map_hint">Tiɣremt neɣ tamnaḍt</string>
<string name="lang_lb">Taluksumburgit</string>
<string name="shared_string_show_description">Sken aglam.</string>
<string name="lang_vi">Tabyatnamit</string>
<string name="context_menu_item_search">Nadi di liqrib</string>
<string name="empty_state_osm_edits">Rnu neγ ẓreg ifarisen n OSM</string>
<string name="empty_state_osm_edits">Rnu neɣ ẓreg ifarisen n OSM</string>
<string name="shared_string_deleted">Ittwakkes</string>
<string name="shared_string_edited">Ittwaẓreg</string>
<string name="search_favorites">Anadi γef imenyafen</string>
<string name="search_favorites">Anadi ɣef imenyafen</string>
<string name="select_street">Fren abrid</string>
<string name="context_menu_item_open_note">Ldi tamawt n OSM</string>
<string name="search_poi_category_hint">Aru kra iw nadi γef kullec</string>
<string name="search_poi_category_hint">Aru kra iw nadi ɣef kullec</string>
<string name="shared_string_my_favorites">Inurifen</string>
<string name="route_tr">Bren γer tama tayeffust t edfreḍ</string>
<string name="route_tl">Bren γer tama tazelmaṭ t edfraḍ</string>
<string name="route_tr">Bren ɣer tama tayeffust t edfreḍ</string>
<string name="route_tl">Bren ɣer tama tazelmaṭ t edfraḍ</string>
<string name="modify_the_search_query">Ẓreg asuter n unadi.</string>
<string name="shared_string_added">Iţwarna</string>
<string name="marker_activated">Creḍ %s immed.</string>
@ -647,8 +647,8 @@
<string name="context_menu_points_of_group">Akk tinqiḍin n ugraw</string>
<string name="open_from">Yeldi si</string>
<string name="open_till">Yeldi si</string>
<string name="will_close_at">Ad imdel γef</string>
<string name="will_open_at">Ad yeldi γef</string>
<string name="will_close_at">Ad imdel ɣef</string>
<string name="will_open_at">Ad yeldi ɣef</string>
<string name="will_open_on">Ad yeldi ass</string>
<string name="additional_actions">Tiggawin nniḍen</string>
<string name="av_locations_selected_desc">Afaylu GPX igebren adig akked isefka n tezmilin ittwafernen.</string>
@ -848,4 +848,418 @@
<string name="rendering_value_thin_name">Fin</string>
<string name="access_shared_string_navigate_up">Aller vers le haut</string>
<string name="coords_format">Amasal n tsidegt</string>
<string name="developer_plugin">Azegrir n tneflit</string>
<string name="replace_point_descr">Semselsi agaz s wagi</string>
<string name="app_mode_ski_snowmobile">Amuṭu n udfel</string>
<string name="custom_osmand_plugin">Azegrir OsmAnd udmawan</string>
<string name="changes_applied_to_profile">Ibeddilen ttwasmersen i umaɣnu %1$s.</string>
<string name="settings_item_read_error">Ur izmir ara ad d-iɣer %1$s.</string>
<string name="settings_item_write_error">Ur izmir ara ad yaru %1$s.</string>
<string name="settings_item_import_error">Ur izmir ara ad yekter %1$s.</string>
<string name="select_track_file">Fren afaylu n lǧeṛṛa</string>
<string name="wiki_menu_download_descr">Tikarḍiwin-nniḍen laqent i uskan n POI Wikipedia ɣef tkarḍa.</string>
<string name="select_wikipedia_article_langs">Fren tutlayin ideg ad d-banen yimagraden Wikipedia ɣef tkarḍa-ik. Tzemreḍ ad tuɣaleḍ seg tutlayt ɣer tayeḍ seg tid yellan deg tɣuri n umagrad.</string>
<string name="some_articles_may_not_available_in_lang">Kra n yimagraden Wikipedia zemren ur ttilin ara s tutlayt-ik.</string>
<string name="lang_zhminnan">Tamint n umalu</string>
<string name="lang_war">Tawarayt</string>
<string name="lang_min">Taminangkabut</string>
<string name="lang_lmo">Talumbardit</string>
<string name="average_speed">Arured alemmas</string>
<string name="average_altitude">Awrir alemmas</string>
<string name="unit_of_length">Tayunin n umeccaq</string>
<string name="unit_of_length_descr">Beddel tayunt n uktili n umeccaq.</string>
<string name="units_and_formats">Tayunin d yimasalen</string>
<string name="si_m_s">Imitren di tasint (m/tasint)</string>
<string name="km_h">h</string>
<string name="min_km">tasint</string>
<string name="min_mile">tasint</string>
<string name="mile">Maori</string>
<string name="osmand_service">Agilal</string>
<string name="ltr_or_rtl_combine_via_comma">"%1$s, %2$s "</string>
<string name="lang_zhyue">Takuntunit</string>
<string name="lang_yo">Tayurubit</string>
<string name="lang_uz">Tuzbikt</string>
<string name="lang_ur">Turdut</string>
<string name="lang_tt">Tatatart</string>
<string name="lang_tg">Tatajikt</string>
<string name="lang_sco">Taskutlandit</string>
<string name="lang_scn">Tasisilyant</string>
<string name="lang_pnb">Tabenjabit</string>
<string name="lang_ne">Tanipalit</string>
<string name="lang_nap">Tanapolitant</string>
<string name="lang_my">Tabirmanit</string>
<string name="lang_mn">Tamungulit</string>
<string name="lang_mg">Tamalgact</string>
<string name="lang_ky">Takirgizt</string>
<string name="lang_kk">Takazaxt</string>
<string name="lang_jv">Tajavanit</string>
<string name="lang_gu">Tagujaratit</string>
<string name="lang_cv">Tačubact</string>
<string name="lang_ce">Tačičant</string>
<string name="lang_bar">Tabavaṛyant</string>
<string name="lang_ba">Tabackirt</string>
<string name="lang_an">Taṛagunit</string>
<string name="shared_string_divider">anabraz</string>
<string name="shared_string_hidden">Yeffer</string>
<string name="main_actions">Tigawin</string>
<string name="shared_string_items">Iferdisen</string>
<string name="add_description">Aglam</string>
<string name="shared_string_import_complete">Akter yemmed</string>
<string name="items_added">Iferdisen n umawal yettwarnan</string>
<string name="keep_both">Ḥrez</string>
<string name="shared_string_profiles">Imeɣna</string>
<string name="shared_string_poi_types">Tiwsiyin</string>
<string name="profile_type_custom_string">Amaɣnu Gaia udmawan…</string>
<string name="shared_string_app_default_w_val">Amezwer (%S)</string>
<string name="ltr_or_rtl_triple_combine_via_dash">%1$s %2$s Asuddim i %3$s</string>
<string name="open_settings">Ldi iɣewwaṛen</string>
<string name="sort_by_category">Smizzwer s taggayt</string>
<string name="copy_coordinates">Tisidag</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s di %2$s</string>
<string name="ltr_or_rtl_combine_via_slash">%1$s di %2$s</string>
<string name="multimedia_photo_play_sound">Γeṛ ameslaw n tkamirat</string>
<string name="live_monitoring_adress">Tansa web</string>
<string name="app_mode_osm">Rnu neɣ ẓreg ifarisen n OSM</string>
<string name="osm_editing">Taẓrigt</string>
<string name="login_and_pass">Ma ulac aɣilif mudd isem n useqdac d wawal-ik uffir\\u0020</string>
<string name="import_from_file">Kter-d si kra n ufaylu</string>
<string name="reset_all_profile_settings">Ales awennez n yiɣewwaren meṛṛa</string>
<string name="selected_profile">Modifier le profil sélectionné</string>
<string name="reorder_profiles">Ẓreg amaɣnu</string>
<string name="edit_profiles">Imeɣna</string>
<string name="select_color">Fren ini</string>
<string name="shared_string_downloading_formatted">Azdam n %S</string>
<string name="shared_string_turn_off">Sens</string>
<string name="suggested_maps">Yettesumer</string>
<string name="update_all_maps">Mucceḍ Akk</string>
<string name="shared_string_memory_kb_desc">%1$S</string>
<string name="shared_string_memory_mb_desc">%1$s Mo (%2$s%%) n tallunt i yettwasqedcen</string>
<string name="shared_string_memory_gb_desc">%1$S</string>
<string name="shared_string_memory_tb_desc">%1$S</string>
<string name="shared_string_calculate">Selkem</string>
<string name="app_mode_utv">Côte à côte</string>
<string name="rendering_attr_piste_difficulty_expert_name">a muzay</string>
<string name="rendering_attr_piste_difficulty_intermediate_name">2: Alemmas</string>
<string name="shared_string_select_folder">akaram</string>
<string name="data_storage_preference_summary">%1$s di %2$s</string>
<string name="shared_string_by_default">[Amezwer]</string>
<string name="list_of_installed_plugins">Isiɣzifen ittusbedden</string>
<string name="map_look">Takarḍa</string>
<string name="map_look_descr">Arwes</string>
<string name="wake_time">Akud</string>
<string name="navigate_point_format_olc">Ldi adeg…</string>
<string name="navigate_point_format_utm">tizeɣt</string>
<string name="price_and_discount">%1$S %2$S</string>
<string name="get_discount_second_part">"di %1$s"</string>
<string name="gpx_join_gaps">Semlil</string>
<string name="shared_string_open_track">ḍfeṛ</string>
<string name="shared_string_file_is_saved">yettwasekles</string>
<string name="routeInfo_roadClass_name">Anaw</string>
<string name="routeInfo_road_types_name">Tiwsiyin</string>
<string name="collected_data">(ulac isefk d iţugemren)</string>
<string name="shared_string_color_magenta">_Magenta:</string>
<string name="application_profiles">Imeɣna</string>
<string name="routing_profile_straightline">Ajerriḍ usrid</string>
<string name="profile_alert_delete_title">Kkes amaɣnu</string>
<string name="profile_alert_duplicate_name_title">Sisleg isem.</string>
<string name="profile_alert_need_profile_name_title">Sekcem isem amaynut n umaɣnu</string>
<string name="profile_type_base_string">Amaɣnu</string>
<string name="settings_routing_mode_string">Mode de Zoom : %s</string>
<string name="select_icon_profile_dialog_title">Fren tignit n usmel</string>
<string name="nav_type_hint">Tunigin</string>
<string name="profile_name_hint">Nom du profil</string>
<string name="settings_privacy_and_security">Tabaḍnit akked tɣellist</string>
<string name="downloaded_maps">yettusider</string>
<string name="searching_gps">Anadi...</string>
<string name="move_maps">Tikarḍiwin</string>
<string name="send_log">Azen</string>
<string name="shared_string_degrees">_Tifesniwin:</string>
<string name="quick_action_day_night_mode">%S &amp;Askar aɣelsan</string>
<string name="rendering_attr_highway_class_state_road_name">Aɣrem</string>
<string name="rendering_attr_smoothness_very_bad_name">Dirit</string>
<string name="rendering_attr_smoothness_intermediate_name">2: Alemmas</string>
<string name="rendering_attr_smoothness_excellent_name">Yufrar ($1)</string>
<string name="by_transport_type">"di %1$s"</string>
<string name="show_more">Sken-ed ugar</string>
<string name="shared_string_swap">F-Droid ihegga i umbaddal</string>
<string name="add_work">Rnu</string>
<string name="add_home">Agejdan</string>
<string name="metric_ton">Am</string>
<string name="cubic_m">_M</string>
<string name="on_foot">Amsebrid</string>
<string name="add_destination_point">Taniɣert</string>
<string name="quick_action_switch_night_mode">Iḍ:</string>
<string name="quick_action_switch_day_mode">ass</string>
<string name="powered_by_osmand">OsmAnd</string>
<string name="osm_live_payment_current_subscription">Beddel ajerred amiran ar uɣawas n 2 n iseggasen</string>
<string name="osm_live_payment_discount_descr">%1$S</string>
<string name="thank_you_for_feedback">Tanemmirt ɣef tickti!</string>
<string name="send_search_query">Nadi tuttra</string>
<string name="shared_string_world">azul-i-medden-meṛṛa</string>
<string name="coord_input_add_point">Taneqqiḍt</string>
<string name="coord_input_edit_point">Taneqqiḍt</string>
<string name="quick_action_edit_actions">Tigawin</string>
<string name="shared_string_gpx_files">Ifuyla</string>
<string name="shared_string_gpx_file">Ittemcabi ar ufayli-ik GPX</string>
<string name="shared_string_restart">Ales tanekra</string>
<string name="paid_plugin">Azegrir</string>
<string name="paid_app">Asnas</string>
<string name="wiki_article_not_found">Ulac amagrad</string>
<string name="download_wiki_region_placeholder">Tamnaḍt:</string>
<string name="purchase_unlim_title">%1$S</string>
<string name="purchase_dialog_title">Fren</string>
<string name="shared_string_travel_book">Voyage</string>
<string name="shared_string_dont">Ur aɣ-ṭṭafaṛ ara</string>
<string name="clear_all_intermediates">Sfeḍ akk tineqqidin</string>
<string name="transport_nearby_routes">Sider i useqdec deg usnas.</string>
<string name="osm_notes">Tizmilin</string>
<string name="all_data">Akk isefka ttunefken-d ddaw n CC-BY-SA 2.0:</string>
<string name="osc_file">Afaylu</string>
<string name="rendering_attr_hidePOILabels_name">Tib&amp;zimin</string>
<string name="shared_string_marker">Rnu taṛekkizt ɣef tkarḍa</string>
<string name="osm_recipients_label">Inermisen</string>
<string name="by_type">S wanaw</string>
<string name="by_date">Azemz d</string>
<string name="go_to_next_field">Urti</string>
<string name="import_file">Kter</string>
<string name="show_map">"Sken ɣef tkarḍa"</string>
<string name="rendering_value_darkyellow_name">Awraɣ</string>
<string name="osn_modify_dialog_title">Beddel</string>
<string name="shared_string_markers">Ticṛaḍ</string>
<string name="my_location">ideg</string>
<string name="use_location">ideg</string>
<string name="make_active">Urmid</string>
<string name="do_not_use_animations">Seqdec asmussu n wumuɣ</string>
<string name="move_point">Taneqqiḍt</string>
<string name="add_line">Rnu</string>
<string name="edit_line">Ẓreg</string>
<string name="save_as_line">Sekles s yisem</string>
<string name="enter_gpx_name">Isem n ufaylu :</string>
<string name="min_max">tasint</string>
<string name="max_min">tasint</string>
<string name="mapillary_menu_title_tile_cache">Tuffirt</string>
<string name="mapillary_menu_edit_text_hint">Isem n useqdac</string>
<string name="quick_action_add_destination">Taniɣert</string>
<string name="no_overlay">Incrustations</string>
<string name="fonts_header">Tisefsiyin</string>
<string name="shared_string_time_span">Akud</string>
<string name="file_can_not_be_moved">Ulamek an sekḥer afaylu $1 deg $2.</string>
<string name="navigate_point_olc_info_invalid">Arameɣtu</string>
<string name="navigate_point_olc">Ldi adeg…</string>
<string name="quick_action_map_source_title">Iɣbula</string>
<string name="quick_action_map_styles">Iɣunab</string>
<string name="quick_action_poi_list">Umuɣ</string>
<string name="quick_action_add_configure_map">Swel…</string>
<string name="quick_action_poi_hide">Ffer %1$S</string>
<string name="quick_action_poi_show">Sken %1$S</string>
<string name="quick_action_favorites_hide">Inurifen</string>
<string name="quick_action_favorites_show">Sken inurifen</string>
<string name="quick_actions_delete_text">Tebɣiḍ ad tekseḍ tigawt-agi\?</string>
<string name="quick_actions_delete">Kkes tigawt</string>
<string name="quick_action_edit_action">Tigawt</string>
<string name="quick_action_navigation_voice_on">Taɣect:</string>
<string name="quick_action_add_poi">Rnu</string>
<string name="quick_action_item_screen">Agdil</string>
<string name="upload_poi">Ali</string>
<string name="rendering_value_fine_name">Ṣeggem akken iwat anadi-ik</string>
<string name="gpx_add_track">Rnu ugar...</string>
<string name="shared_string_recorded">Imeslawen i yessekles {author}</string>
<string name="rendering_value_dark_brown_name">Aqehwi</string>
<string name="edit_filter">Taggayin</string>
<string name="create_custom_poi">Imsizdeg udmawan</string>
<string name="new_filter">Imsizdeg</string>
<string name="save_filter">Imsizdeg</string>
<string name="apply_filters">Snes tistayin</string>
<string name="allow_access_location">Eǧǧ anekcum ɣer wadeg</string>
<string name="search_map">Anadi...</string>
<string name="hourly">s usrag</string>
<string name="updates_size">leqqem</string>
<string name="live_update">leqqem</string>
<string name="only_download_over_wifi">Ala ɣef Wi-Fi</string>
<string name="use_drawer_btn">Umuɣ</string>
<string name="use_dashboard_btn">Tafelwit n tedbelt</string>
<string name="map_legend">Taneffust</string>
<string name="first_usage_item">Amezwaru</string>
<string name="get_full_version">lqem</string>
<string name="later">Ticki</string>
<string name="poi_dialog_poi_type">Anaw</string>
<string name="closing_at">Amdal...</string>
<string name="opening_at">Tulya...</string>
<string name="commit_poi">Wennet</string>
<string name="dahboard_options_dialog_title">Sbadu tafelwit n tedbelt</string>
<string name="error_message_pattern">Tuccḍa:</string>
<string name="navigation_intent_invalid">amasal arameɣtu</string>
<string name="av_photo_play_sound">Γeṛ ameslaw n tkamirat</string>
<string name="poi_remove_title">Kkes</string>
<string name="poi_create_title">rnu</string>
<string name="poi_edit_title">Ẓreg</string>
<string name="favourites_context_menu_edit">Anurif</string>
<string name="context_menu_item_create_poi">rnu</string>
<string name="context_menu_item_update_map">leqqem</string>
<string name="search_POI_level_btn">Tzemreḍ ad taffeḍ ugar n italɣut sakin ad tesnifleḍ deg ugdil n izegrar.</string>
<string name="searchpoi_activity">Fren</string>
<string name="app_description">Tunigin</string>
<string name="map_source">aɣbalu</string>
<string name="app_settings">Iɣewwaṛen</string>
<string name="reload_tile">Smiren</string>
<string name="update_tile">leqqem</string>
<string name="loading_data">Asali...</string>
<string name="error_occurred_saving_gpx">Ur izmir ara ad isekles afaylu</string>
<string name="loading_poi_obj">Asali...</string>
<string name="search_nothing_found">Ulac ayen yettwafen</string>
<string name="uploading_data">Asali...</string>
<string name="context_menu_item_update_poi">leqqem</string>
<string name="search_nearby">Nadi di liqrib</string>
<string name="first_time_continue">Ticki</string>
<string name="show_poi_filter">Imsizdeg</string>
<string name="hide_poi_filter">Imsizdeg</string>
<string name="context_menu_item_search_poi">Nadi</string>
<string name="layer_map">aɣbalu</string>
<string name="error_occurred_loading_gpx">\"ur izmir ara ad yali: \"</string>
<string name="rotate_map_to_bearing">Orientation</string>
<string name="rotate_map_to_bearing_descr">Areyyec</string>
<string name="poi_context_menu_delete">Kkes</string>
<string name="poi_context_menu_modify">Beddel</string>
<string name="layer_gpx_layer">Ifuyla</string>
<string name="show_point_options">Adig</string>
<string name="shared_string_download_map">Sider</string>
<string name="amenity_type_emergency">Annar n trusi n utrab</string>
<string name="send_location">Adig</string>
<string name="send_location_way_choose_title">Bḍu adig</string>
<string name="error_doing_search">Ur izmir ara ad iselkem anadi</string>
<string name="install_more">Sebded</string>
<string name="tts_missing_language_data_title">yettwazgel</string>
<string name="ttsvoice">Taɣect:</string>
<string name="local_indexes_cat_poi">Isefka</string>
<string name="local_indexes_cat_backup">Tamahilt-agi tensa akka tura.</string>
<string name="local_index_map_data">Takarḍa</string>
<string name="local_index_poi_data">Isefka</string>
<string name="local_index_items_restored"><ph id="mtc_1" equiv-text="base64:JTEkZA=="/> seg <ph id="mtc_2" equiv-text="base64:JTIkZA=="/> n yiferdisen remden akken iwata.</string>
<string name="local_index_items_deleted"><ph id="mtc_1" equiv-text="base64:JTEkZA=="/> seg <ph id="mtc_2" equiv-text="base64:JTIkZA=="/> n yiferdisen ttwakksen akken iwata.</string>
<string name="local_index_items_backuped"><ph id="mtc_1" equiv-text="base64:JTEkZA=="/> seg <ph id="mtc_2" equiv-text="base64:JTIkZA=="/> n yiferdisen nsan akken iwata.</string>
<string name="local_index_mi_upload_gpx">Azen i...</string>
<string name="local_index_items_uploaded"><ph id="mtc_1" equiv-text="base64:JTEkZA=="/> seg <ph id="mtc_2" equiv-text="base64:JTIkZA=="/> n yiferdisen ulin akken iwata.</string>
<string name="file_with_name_already_exists">Tabzimt s yisem-agi tella yakan.</string>
<string name="file_can_not_be_renamed">Ur yezmir ara ad ibeddel isem ufaylu \"$1\" ar \"$2\".</string>
<string name="free_version_title">lqem</string>
<string name="local_openstreetmap_delete">Kkes</string>
<string name="local_openstreetmap_uploadall">Ali</string>
<string name="local_openstreetmap_were_uploaded">{0} POI/Tizmilin ulin</string>
<string name="arrival_distance_factor_late">Aneḍru yettwaheggan iɛedda fell-as lḥal</string>
<string name="arrival_distance_factor_early">Détection SKIP précoce sur images P</string>
<string name="no_info">talɣut</string>
<string name="front_left">ɣer zdat</string>
<string name="zoomIs">Seggem aswir n usemɣer/asemẓi</string>
<string name="confirm_interrupt_download">Sefsex asider</string>
<string name="osmand_parking_no_lim_text">War talast</string>
<string name="map_widget_next_turn">ar zdat</string>
<string name="map_widget_monitoring">Aɣmis</string>
<string name="int_continuosly">A_maɣlal</string>
<string name="avoid_in_routing_title">Zgel tulsa n wawalen d yisekkilen.</string>
<string name="show_warnings_title">Ilɣa</string>
<string name="poi_filter_food_shop">Tuččit</string>
<string name="poi_filter_emergency">Annar n trusi n utrab</string>
<string name="btn_advanced_mode">Talqayt…</string>
<string name="add_tag">Rnu</string>
<string name="rendering_attr_roadColors_name">Azenziɣ n yini</string>
<string name="safe_mode">Askar aɣelsan</string>
<string name="rendering_attr_noAdminboundaries_name">Ajemmeq n uḍris</string>
<string name="download_regular_maps">tizeɣt</string>
<string name="download_select_map_types">Wayeḍ</string>
<string name="map_widget_av_notes">Ameslaw/Tavidyut</string>
<string name="recording_description">%1$S %3$S %2$S</string>
<string name="av_settings">Ameslaw/Tavidyut</string>
<string name="av_def_action_choose">_Di tuttra</string>
<string name="recording_context_menu_precord">Ṭṭef tawlaft...</string>
<string name="av_def_action_picture">Ṭṭef tawlaft...</string>
<string name="local_indexes_cat_av">Ameslaw/Tavidyut</string>
<string name="item_unchecked">ur yettwaṛcem ara</string>
<string name="item_checked">Senqedeɣ. Ɛeyyen anezri amaynut</string>
<string name="map_widget_gps_info">Talɣut</string>
<string name="select_address_activity">Veuillez renseigner le champs \"address\".</string>
<string name="cancel_navigation">Tunigin</string>
<string name="install_paid">lqem</string>
<string name="gpx_file_name">Isem n ufaylu</string>
<string name="plugin_distance_point_ele">Élevation satellite en dixièmes de degré</string>
<string name="settings_preset">Amaɣnu amezwer</string>
<string name="app_mode_default">Snirem</string>
<string name="map_magnifier">Tasemɣert</string>
<string name="map_widget_map_rendering">Tiririt n tkarḍa</string>
<string name="app_modes_choose">Imeɣna</string>
<string name="route_descr_select_destination">Taniɣert</string>
<string name="select_gpx">Fren...</string>
<string name="gpx_selection_number_of_points">%1$s
\nn tneqqidin</string>
<string name="rendering_value_browse_map_name">Snirem</string>
<string name="monitoring_settings">Asekles</string>
<string name="proxy_port_descr">Uṭṭun n tebburt n upruksi-ik (m.d.. 8118)</string>
<string name="proxy_host_descr">Asenneftaɣ n upruksi-ik (m.d. 127.0.0.1)</string>
<string name="enable_proxy_title">Rmed Apruksi HTTP</string>
<string name="confirm_every_run">Sutur yal tikelt</string>
<string name="traffic_warning_stop">Seḥbes</string>
<string name="search_radius_proximity">Sider i useqdec deg usnas.</string>
<string name="configure_map">Swel…</string>
<string name="map_widget_left">Tafelwit n yiri, tattayt, ukessar, ufella, ɣumm, tiddi, amrussu</string>
<string name="download_tab_downloads">Sken akkw isidar</string>
<string name="rendering_attr_roadStyle_description">Aɣanib:</string>
<string name="rendering_attr_roadStyle_name">Aɣanib:</string>
<string name="edit_group">agraw</string>
<string name="free">%1$S</string>
<string name="online_map">Iqqen</string>
<string name="osmand_parking_plugin_name">Amḍiq n aniɣsur</string>
<string name="audionotes_plugin_name">Ameslaw/Tavidyut</string>
<string name="record_plugin_name">Asekles</string>
<string name="shared_string_online_maps">Iqqen</string>
<string name="shared_string_my_location">ideg</string>
<string name="shared_string_add_to_favorites">R&amp;nu ɣeṛ isniraf</string>
<string name="shared_string_action_template">Tigawt</string>
<string name="shared_string_unexpected_error">Tuccḍa tarussint.</string>
<string name="shared_string_on">Yermed</string>
<string name="drawer">Umuɣ</string>
<string name="osmand_parking_overdue">Amiḍan-ik ɣer-s akka tura tafaturt ur yettwaxelṣen ara. Xelleṣ tifaturin yeqqimen.</string>
<string name="confirmation_to_clear_history">Sfeḍ amazray</string>
<string name="welmode_download_maps">Sider</string>
<string name="filter_poi_hint">Sizdeg s</string>
<string name="storage_directory">asekles</string>
<string name="shared_string_logoff">Yensa</string>
<string name="lang_ht">Tahaysit</string>
<string name="lang_os">Ossetian</string>
<string name="rendering_value_translucent_lightgreen_name">Amumad afessas</string>
<string name="rendering_attr_currentTrackWidth_description">Tehri</string>
<string name="rendering_attr_currentTrackWidth_name">Tehri</string>
<string name="rendering_attr_currentTrackColor_description">Ini</string>
<string name="rendering_attr_currentTrackColor_name">Ini</string>
<string name="rendering_value_default13_name">(Amezwer)</string>
<string name="rendering_value_boldOutline_name">Aɣawas</string>
<string name="favourites_edit_dialog_title">Anurif</string>
<string name="shared_string_trip_recording">Asekles</string>
<string name="nm_h">Kannada</string>
<string name="regions">Meṛṛa timnaḍin</string>
<string name="go_to_map">"Sken ɣef tkarḍa"</string>
<string name="map_downloaded">yettusider</string>
<string name="shared_string_qr_code">Tangalt</string>
<string name="lang_als">Talbanit</string>
<string name="osn_close_dialog_success">imdel</string>
<string name="osn_close_dialog_title">Mdel</string>
<string name="osn_add_dialog_title">rnu</string>
<string name="osn_bug_name">Ldi tamawt n OSM</string>
<string name="osm_save_offline">Aruqqin</string>
<string name="available_maps">Yella</string>
<string name="rec_split_storage_size">asekles</string>
<string name="shared_string_undo_all">Akk</string>
<string name="item_removed">Aferdis yettwakkes.</string>
<string name="rendering_attr_hideIcons_name">Tigniyin</string>
<string name="data_is_not_available">Ulac</string>
<string name="map_marker">marker</string>
<string name="full_report">Azen</string>
<string name="shared_string_topbar">Asawen</string>
<string name="number_of_gpx_files_selected_pattern">%S n ifuyla ifernen.</string>
<string name="map_mode">Takarḍa</string>
<string name="access_tree_list">Aseklu</string>
<string name="access_empty_list">(Tabdart d tilemt)</string>
<string name="access_expanded_list">Iţusnefli</string>
<string name="access_collapsed_list">Iţufneẓ</string>
<string name="access_default_color">Fren ini n lexṣas</string>
<string name="storage_directory_card">Takatut</string>
<string name="custom_color">Ini udmawan</string>
</resources>

View file

@ -3634,4 +3634,11 @@ Abasta l\'àrea: %1$s x %2$s</string>
<string name="move_inside_category">Només podeu moure els elements dins d\'aquesta categoria.</string>
<string name="developer_plugin">Connector per a desenvolupadors</string>
<string name="shared_string_items">Elements</string>
<string name="lang_cv">Txuvaix</string>
<string name="lang_ce">Txetxè</string>
<string name="lang_bar">Bavarès</string>
<string name="lang_ba">Baixkir</string>
<string name="lang_an">Aragonès</string>
<string name="lang_lmo">Llombard</string>
<string name="custom_color">Color personalitzat</string>
</resources>

View file

@ -3615,4 +3615,35 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="move_inside_category">Elementer kan kun flyttes inden for kategorien.</string>
<string name="developer_plugin">Udvikler udvidelse</string>
<string name="shared_string_items">Elementer</string>
<string name="lang_min">Minangkabau</string>
<string name="select_wikipedia_article_langs">Vælg de sprog, som Wikipedia-artikler skal vises på kortet. Skift mellem alle tilgængelige sprog, mens artiklen læses.</string>
<string name="lang_zhminnan">Minnan</string>
<string name="lang_yo">Yoruba</string>
<string name="lang_war">Waray</string>
<string name="lang_uz">Usbekisk</string>
<string name="lang_ur">Urdu</string>
<string name="lang_tt">Tatarisk</string>
<string name="lang_tg">Tadsjikisk</string>
<string name="lang_sco">Skotsk</string>
<string name="lang_scn">Siciliansk</string>
<string name="lang_pnb">Punjabisk</string>
<string name="lang_ne">Nepalesisk</string>
<string name="lang_nap">Napolitansk</string>
<string name="lang_my">Burmesisk</string>
<string name="lang_mn">Mongolsk</string>
<string name="lang_zhyue">Kantonesisk</string>
<string name="lang_mg">Malagassisk</string>
<string name="lang_ky">kirgisisk</string>
<string name="lang_kk">kasakhisk</string>
<string name="lang_jv">Javanesisk</string>
<string name="lang_gu">Gujarati</string>
<string name="lang_cv">Tsjuvasjisk</string>
<string name="lang_ce">Tjetjensk</string>
<string name="lang_bar">Bayersk</string>
<string name="lang_ba">Basjkirisk</string>
<string name="lang_lmo">Lombardisk</string>
<string name="lang_an">Aragonsk</string>
<string name="custom_color">Brugerdefineret farve</string>
<string name="some_articles_may_not_available_in_lang">Nogle Wikipedia-artikler er muligvis ikke tilgængelige på dit sprog.</string>
<string name="extra_maps_menu_group">Ekstra kort</string>
</resources>

View file

@ -1071,7 +1071,7 @@ Lon: %2$s</string>
<string name="interrupt_music">Paŭzigi muzikon</string>
<string name="interrupt_music_descr">Voĉaj anoncoj paǔzigas ludadon de muziko.</string>
<string name="osmand_short_description_80_chars">Tuttera map-foliumilo kaj navigilo uzanta vektorajn aŭ enretajn mapojn OSM</string>
<string name="osmand_plus_short_description_80_chars">Foliumi tutmondajn mapojn kaj navigadi uzante eksterretajn kaj enretajn OSM mapojn</string>
<string name="osmand_plus_short_description_80_chars">Tuttera mapfoliumilo kaj navigilo uzanta OSMmapojn (vektorajn aŭ enretajn)</string>
<string name="osmand_long_description_1000_chars">OsmAnd (OSM Aŭtomata Navigado Direkte al la celo)
\n
\nOsmAnd estas malfermkoda navigada aplikaĵo kun aliro al diversaj mondaj datumoj de OSM. Ĉiuj mapoj (vektoraj kaj kahelaj) povas esti konservitaj en la poŝtelefona konservejo por malkonekta uzado. La aplikaĵo ankaŭ ebligas uzi lokan aŭ enretan navigadon kun voĉaj anoncoj turnopostturno.
@ -1521,7 +1521,7 @@ Lon: %2$s</string>
\n Ambaŭ loko kaj tempo estas montrataj en la stirpanelo de kaj sur la fenestraĵo sur la mapekrano. Memorigo povas esti aldonita al la Androida kalendaro.</string>
<string name="osmand_distance_planning_plugin_name">Kalkulilo de distanco kaj planilo</string>
<string name="osmand_distance_planning_plugin_description">Ebligas difini kursojn per frapeti la mapon kaj modifi ekzistajn GPXdosierojn por plani vojaĝon kaj mezuri distancon inter punktoj. Rezultoj povas esti konservitaj kiel GPXdosierojn, kiujn oni povas estonte uzi por gvidado.</string>
<string name="osm_settings">OpenStreetMap-redaktilo</string>
<string name="osm_settings">OSM-redaktilo</string>
<string name="osm_editing_plugin_description">Kontribuu al OSM per krei aŭ modifi punktojn (ekz. vendejojn, vidindaĵojn, hidrantojn), malfermi aŭ komenti rimarkojn kaj alŝuti registritajn GPXspurojn per OsmAnd. OpenStreetMap (OSM) estas komunuma, tutmonda kaj publika mapprojekto. Necesas krei konton ĉe OpenStreetMap.org por kontribui.</string>
<string name="debugging_and_development">OsmAnd-programistilo</string>
<string name="osmand_development_plugin_description">Agordoj pri evoluigo kaj senerarigado de OsmAnd: simuladi kurson, efikeco de ekranbildigado, voĉaj anoncoj. Destinitaj por programistoj, ne bezonataj por kutimaj uzantoj.</string>
@ -2284,65 +2284,68 @@ Indikas lokon: %1$s x %2$s"</string>
\n • Antarkto: *
\n Mapoj de preskaŭ ĉiuj de landoj de la mondo estas elŝuteblaj!
\n Havigu konfidindan navigilon en via lando - kaj en Francujo, Germanujo, Meksiko, Britujo, Hispanujo, Nederlando, Usono, Rusujo, Brazilo kaj ie alie.</string>
<string name="osmand_plus_extended_description_part1">OsmAnd+ (OSM Aŭtomata Navigado Direkte al celo) estas mapa kaj naviga aplikaĵo kun aliro al liberaj, tutmondaj kaj alt-kvalitaj datumoj de OSM.
\n Ĝuu voĉan kaj vidan navigadon, esploradon de interesejoj (punktoj de intereso), kreadon kaj administradon de GPXspuroj, montradon de nivelkurboj kaj informojn pri altitudo (per kromprogramo), elekton inter aŭta, bicikla kaj piediranta reĝimoj, OSMredaktadon kaj pli.
<string name="osmand_plus_extended_description_part1">OsmAnd+ (OSM Aŭtomata Navigado Direkte al celo) estas mapa kaj naviga aplikaĵo kun aliro al liberaj, tutmondaj kaj altkvalitaj datumoj de OSM.
\n Ĝuu voĉan kaj vidan navigadon, foliumu tra diversspecaj interesejoj (punktoj de intereso), kreu kaj administru GPXspurojn, vidigu sur la mapo nivelkurbojn kaj informojn pri altitudo (per kromprogramo), elektu inter aŭta, bicikla kaj piediranta reĝimoj, redaktu OSM kaj pli.
\n
\n OsmAnd+ estas pagenda versio de aplikaĵo. Per aĉeti ĝin, vi apogas la projekton, fondas evoluigon de novaj funkcioj kaj akiras plej aktualajn ĝisdatigojn.
\n OsmAnd+ estas pagenda versio de la aplikaĵo. Per aĉeti ĝin, vi apogas la projekton, fondas evoluigon de novaj funkcioj kaj akiras plej aktualajn ĝisdatigojn.
\n
\n Kelkaj ĉefaj ebloj de OsmAnd+:</string>
<string name="osmand_plus_extended_description_part2">Navigado
\n • Funkcias enrete (pli rapide) aŭ eksterrete (neniuj retmigradaj kostoj dum estado eksterlande)
\n • Turno-post-turnaj voĉaj anoncoj (antaŭregistritaj kaj parolsintezitaj voĉoj)
\n • Informoj pri koridoroj, strat-nomoj kaj proksimuma tempo de alveno
\n • Subteno por interceloj sur via kurso
\n • Aŭtomata rekalkulado de kurso kiam vi devojiĝos
\n • Serĉi cel-lokojn laŭ adreso, laŭ speco (ekz.: restoracio, hotelo, benzinejo, muzeo) aŭ laŭ geografiaj koordinatoj</string>
<string name="osmand_plus_extended_description_part3">Map-vido
\n Ĉefaj eblaĵoj:</string>
<string name="osmand_plus_extended_description_part2">Navigado:
\n • funkcias enrete (rapide) aŭ tute malkonekte (neniuj abonpagoj fremdlande)
\n • navigado turno-post-turno (antaŭregistritaj aŭ parolsintezitaj voĉoj (EO nedisponebla))
\n • informoj pri koridoroj, vidigo de strata nomo kaj proksimuma tempo de alveno
\n • interceloj de kurso
\n • aŭtomate rekalkuli kurson kiam devoje
\n • serĉi lokojn laŭ adreso, laŭ speco (ekz. restoracio, hotelo, benzinejo, muzeo) aŭ laŭ geografiaj koordinatoj</string>
<string name="osmand_plus_extended_description_part3">Mapvido:
\n • montri vian pozicion kaj orientiĝon
\n • malnepre orienti la ekranon laŭ kompaso aŭ laŭ via direkto de movo
\n• konservi viajn plej gravajn ejojn en listo de ŝatataj
\n• montri proksimajn interesejojn (punktojn de intereso)
\n• montrado de specialaj enretaj kaheloj, satelita vido (de Bing), diversaj surtavoloj ekz. piediradaj kursoj, GPX-spuroj kaj kromaj tavoloj kun agordebla diafaneco
\n • konservi viajn plej gravajn lokojn en la listo de ŝatataj
\n • montri proksimajn interesejojn (vendejoj, frizejoj, statuoj, ktp)
\n • vidigi specialajn enretajn kahelojn, satelita vido (de Bing), diversaj surtavoloj ekz. piediradaj kursoj, GPX-spuroj kaj kromaj tavoloj kun agordebla diafaneco
\n • malnepre vidigi nomojn en Esperanto, en loka lingvo aŭ en fonetika transskribo
\n</string>
<string name="fonts_header">Mapaj tiparoj</string>
<string name="osmand_plus_extended_description_part4">Uzi datumojn de OSM kaj Vikipedio
\n • alt-kvalitaj informoj el la plej bonaj kunlaboraj projektoj en la mondo
\n • OSM-datumoj disponeblaj por lando aŭ regiono
\n • Vikipediaj interesejoj, taŭgaj por vizitado
<string name="osmand_plus_extended_description_part4">Uzi datumojn de OSM kaj Vikipedio:
\n • altkvalitaj informoj el la plej bonaj kunlaboraj projektoj en la mondo
\n • OSMdatumoj disponeblaj por lando aŭ regiono
\n • punktoj de Vikipedio (ekz. monumentoj) taŭga por vizitado
\n • senlimaj senpagaj elŝutoj senpere de la aplikaĵo
\n • kompaktaj vektoraj mapoj ĝisdatigataj almenaŭ unumonate
\n • elekto inter plenaj datumoj por regiono aŭ nur voja reto (ekz. plena mapo de Japanujo okupas 700 MB, sed nur-voja mapo nur 200 MB)</string>
<string name="osmand_plus_extended_description_part5">Sekurecaj eblaĵoj
\n • Malnepre aŭtomate baskulas inter taga/nokta vido
\n • Malnepre montras rapid-limon kaj avertojn se vi trorapidas
\n • Malnepra rapid-dependa map-pligrandigo
\n • Kunhavigi vian pozicion, por ke viajn amikojn povu trovi vin</string>
<string name="osmand_plus_extended_description_part6">Bicikladaj kaj piediradaj eblaĵoj
\n • Vidigo de piediradaj kaj bicikladaj kursoj, bonega por eksterdoma aktiveco
\n • Speciala difinado de vojo por biciklado kaj piedirado
\n • Malnepra vidigo de haltejoj de publika transporto (aŭtobusaj, tramaj, fervojaj) kun nomoj de linioj
\n • Malnepra registrado de kurso kun eblo konservi ĝin al GPX-dosiero aŭ al enreta servo
\n • Malnepra vidigado de rapido kaj altitudo
\n • Vidigado de nivelkurboj kaj nivel-ombrumo (reliefo) (per kromprogramo)</string>
<string name="osmand_plus_extended_description_part7">Senpere kontribui al OSM
\n • Raporti erarojn pri datumoj
\n • Alŝuti GPX-spurojn al OSM senpere de la aplikaĵo
\n • Aldoni interesejojn kaj senpere alŝuti ilin al OSM (aŭ poste se eksterrete)
\n • Malnepre registri kurson ankaŭ en fona reĝimo (kiam la aparato dormetas)
\n OsmAnd estas malfermkoda kaj daŭre evoluigata programaro. Ĉiu povas kontribui al la aplikaĵo per raporti erarojn, plibonigi tradukojn aŭ programi novajn funkciojn. La projekto baziĝas sur monaj donaj por fondi kodumadon kaj testi novajn funkciojn.</string>
<string name="osmand_plus_extended_description_part8">Proksimuma map-atingo kaj kvalito:
\n • Okcidenta Eŭropo: ****
\n • Orienta Eŭropo: ***
\n • Rusujo: ***
\n • Nordameriko: ***
\n • Sudameriko: **
\n • Azio: **
\n • Japanujo kaj Koreujo: ***
\n • Proksim-Oriento: **
\n • Afriko: **
\n • Antarkto: *
\nMapoj de preskaŭ ĉiuj de landoj de la mondo estas elŝuteblaj! De Afganujo al Zimbabvo, de Aŭstralio al Usono, Argentino, Brazilo, Kanado, Francujo, Germanujo, Meksiko, Britujo, Hispanujo…
\n • elekto inter plenaj datumoj por regiono aŭ nur voja reto (ekz. plena mapo povas okupi 700 MB, sed nurvoja mapo 200 MB)</string>
<string name="osmand_plus_extended_description_part5">Sekurecaj eblaĵoj:
\n • malnepre aŭtomate baskui inter taga/nokta vido
\n • malnepre montri rapidlimon kaj avertojn se vi trorapidas
\n • malnepra rapiddependa mappligrandigo
\n • kunhavigi vian pozicion, por ke viaj amikoj povu trovi vin
\n</string>
<string name="osmand_plus_extended_description_part6">Bicikladaj kaj piediradaj eblaĵoj:
\n • vidigo de piediradaj kaj bicikladaj kursoj, bonega por eksterdoma aktiveco
\n • speciala difinado de vojo por biciklado kaj piedirado
\n • malnepra vidigo de haltejoj de publika transporto (aŭtobusaj, tramaj, fervojaj) kun nomoj de linioj
\n • malnepra registrado de kurso kun eblo konservi ĝin al GPXdosiero aŭ al enreta servo
\n • malnepra vidigo de rapido kaj altitudo
\n • vidigado de nivelkurboj kaj nivelombrumo (reliefo) (per kromprogramo)</string>
<string name="osmand_plus_extended_description_part7">Senpere kontribui al OSM:
\n • raporti erarojn pri datumoj
\n • alŝuti GPX-spurojn al OSM senpere de la aplikaĵo
\n • aldoni interesejojn kaj senpere alŝuti ilin al OSM (aŭ poste se eksterrete)
\n • malnepre registri kurson ankaŭ en fona reĝimo (kiam la aparato dormetas)
\n OsmAnd estas malfermkoda kaj daŭre evoluigata programaro. Ĉiu povas kontribui al la aplikaĵo per raporti erarojn, plibonigi tradukojn aŭ programi novajn funkciojn. La projekto baziĝas sur monaj donacoj por fondi kodumadon kaj testi novajn funkciojn.
\n</string>
<string name="osmand_plus_extended_description_part8">Proksimuma mapatingo kaj kvalito:
\n • Okcidenta Eŭropo: ☆☆☆☆
\n • Orienta Eŭropo: ☆☆☆
\n • Rusujo: ☆☆☆
\n • Nordameriko: ☆☆☆
\n • Sudameriko: ☆☆
\n • Azio: ☆☆
\n • Japanujo kaj Koreujo: ☆☆☆
\n • Proksim-Oriento: ☆☆
\n • Afriko: ☆☆
\n • Antarkto: ☆
\nMapoj de preskaŭ ĉiuj landoj de la mondo estas elŝuteblaj!
\nDe Afganujo al Zimbabvo, de Aŭstralio al Usono, Argentino, Brazilo, Kanado, Francujo, Germanujo, Meksiko, Britujo, Hispanujo…
\n</string>
<string name="restore_purchases">Restarigi aĉetaĵojn</string>
<string name="shared_string_visible">Videbla</string>
@ -3604,7 +3607,7 @@ Indikas lokon: %1$s x %2$s"</string>
<string name="wiki_menu_download_descr">Kromaj mapoj estas necesaj por vidigi punktojn de Vikipedio sur la mapo.</string>
<string name="main_actions_descr">Ĉefaj agoj povas enhavi nur 4 butonojn.</string>
<string name="main_actions">Ĉefaj agoj</string>
<string name="additional_actions_descr">Vi povas aliri tiun ĉi agojn per la butono “agoj”.</string>
<string name="additional_actions_descr">Vi povas aliri tiujn ĉi agojn per la butono “agoj”.</string>
<string name="move_inside_category">Vi povas movi elementojn nur ene tiu ĉi kategorio.</string>
<string name="developer_plugin">Programista kromprogramo</string>
<string name="shared_string_items">Elementoj</string>
@ -3612,7 +3615,7 @@ Indikas lokon: %1$s x %2$s"</string>
\n
\nVi povas malaktivigi neuzatajn kromprogramojn por kaŝi ĉiujn iliajn rilatajn butonojn: %1$s.</string>
<string name="ui_customization_short_descr">Elementoj de tirmenuo, kunteksta menuo, ktp.</string>
<string name="ui_customization">Alĝustigi interfacon</string>
<string name="ui_customization">Alĝustigi fasadon</string>
<string name="shared_string_drawer">Tirmenuo</string>
<string name="context_menu_actions">Kunteksta menuo</string>
<string name="reorder_or_hide_from">Reordigi kaj kaŝi elementojn: %1$s.</string>
@ -3621,4 +3624,35 @@ Indikas lokon: %1$s x %2$s"</string>
<string name="hidden_items_descr">La jenaj elementoj estas kaŝitaj el la menuo, sed la rilataj eblaĵoj kaj kromprogramoj plue funkcios.</string>
<string name="shared_string_hidden">Kaŝitaj</string>
<string name="reset_items_descr">Agordoj restarigos al la implicitaj valoroj post kaŝiĝo.</string>
<string name="select_wikipedia_article_langs">Elektu lingvojn, en kiuj artikoloj de Vikipedio montriĝos sur la mapo. Vi povos baskuli inter ĉiuj disponeblaj lingvoj dum legi artikolon.</string>
<string name="some_articles_may_not_available_in_lang">Iuj artikoloj de Vikipedio povas ne esti disponeblaj en via lingvo.</string>
<string name="lang_zhyue">Kantona</string>
<string name="lang_zhminnan">Minnana</string>
<string name="lang_yo">Joruba</string>
<string name="lang_war">Varaja</string>
<string name="lang_uz">Uzbeka</string>
<string name="lang_ur">Urdua</string>
<string name="lang_tt">Tatara</string>
<string name="lang_tg">Taĝika</string>
<string name="lang_sco">Skota</string>
<string name="lang_scn">Sicilia</string>
<string name="lang_pnb">Panĝaba (okcidenta)</string>
<string name="lang_ne">Nepalia</string>
<string name="lang_nap">Napola</string>
<string name="lang_my">Birma</string>
<string name="lang_mn">Mongola</string>
<string name="lang_min">Minankabaŭa</string>
<string name="lang_mg">Malagasa</string>
<string name="lang_ky">Kirgiza</string>
<string name="lang_kk">Kazaĥa</string>
<string name="lang_jv">Java</string>
<string name="lang_gu">Guĝarata</string>
<string name="lang_cv">Ĉuvaŝa</string>
<string name="lang_ce">Ĉeĉena</string>
<string name="lang_bar">Bavara</string>
<string name="lang_ba">Baŝkira</string>
<string name="lang_an">Aragona</string>
<string name="lang_lmo">Lombarda</string>
<string name="custom_color">Propra koloro</string>
<string name="extra_maps_menu_group">Kromaj mapoj</string>
</resources>

View file

@ -3654,7 +3654,7 @@
\n
\nمیتوانید افزونه‌های بی‌استفاده را غیرفعال کنید تا همهٔ کنترل‌های آن‌ها از %1$s برنامه پنهان شود.</string>
<string name="reset_items_descr">تنظیمات پس از پنهان‌سازی به حالت اولیه بازنشانی می‌شود.</string>
<string name="hidden_items_descr"></string>
<string name="hidden_items_descr">این اقلام در منو پنهان می‌شوند، اما گزینه‌ها یا افزونه‌های متناظر همچنان کار می‌کنند.</string>
<string name="shared_string_hidden">پنهان</string>
<string name="shared_string_divider">جداکننده</string>
<string name="reorder_or_hide_from">مرتب‌سازی یا پنهان‌سازی اقلام %1$s.</string>
@ -3666,4 +3666,11 @@
<string name="main_actions">کنش‌های اصلی</string>
<string name="additional_actions_descr">با زدن روی دکمهٔ «کنش‌ها» می‌توانید به این کنش‌ها دسترسی پیدا کنید.</string>
<string name="developer_plugin">افزونهٔ توسعه‌دهنده</string>
<string name="divider_descr">چیزهایی که از این نقطه به پایین قرار می‌گیرند، با جداکننده جدا می‌شوند.</string>
<string name="move_inside_category">اقلام را فقط درون این دسته می‌توانید جابه‌جا کنید.</string>
<string name="shared_string_items">اقلام</string>
<string name="select_wikipedia_article_langs">انتخاب کنید مقاله‌های ویکی‌پدیا به چه زبان‌هایی روی نقشه نمایان شوند. هنگام مطالعهٔ مقاله می‌توانید بین زبان‌های مختلف جابه‌جا شوید.</string>
<string name="some_articles_may_not_available_in_lang">ممکن است برخی مقاله‌های ویکی‌پدیا به زبان شما در دسترس نباشد.</string>
<string name="lang_lmo">لومبارد</string>
<string name="custom_color">رنگ دلخواه</string>
</resources>

View file

@ -53,7 +53,7 @@
<string name="open_street_map_login_descr">Nécessaire pour les contributions à openstreetmap.org.</string>
<string name="user_password">Votre mot de passe OSM</string>
<string name="osmand_service">Mode arrière-plan</string>
<string name="osmand_service_descr">OsmAnd s\'exécute en tâche de fond, écran éteint.</string>
<string name="osmand_service_descr">OsmAnd s\'exécute en arrière-plan, écran éteint.</string>
<string name="switch_to_raster_map_to_see">Téléchargez une carte vectorielle hors-ligne pour ce lieu (depuis \'Paramètres\' &gt; \'Gérer les cartes\') ou utilisez le greffon \"cartes en ligne\".</string>
<string name="download_files_not_enough_space">Il n\'y a pas suffisamment d\'espace pour télécharger %1$s MB (disponible : %2$s).</string>
<string name="download_files_question_space">Télécharger {0} fichier(s) \?
@ -348,7 +348,7 @@
<string name="background_service_provider_descr">Sélectionnez une méthode de géolocalisation pour le service arrière-plan :</string>
<string name="background_service_provider">Fournisseur de géolocalisation</string>
<string name="background_router_service_descr">Suit votre position lorsque l\'écran est éteint.</string>
<string name="background_router_service">Exécuter OsmAnd en tâche de fond</string>
<string name="background_router_service">Exécuter OsmAnd en arrière-plan</string>
<string name="off_router_service_no_gps_available">Le service d\'arrière-plan requiert l\'activation de la géolocalisation.</string>
<string name="hide_poi_filter">Masquer le filtre</string>
<string name="show_poi_filter">Afficher le filtre</string>
@ -762,8 +762,10 @@
<string name="map_widget_mini_route">Mini-carte de l\'itinéraire</string>
<string name="bg_service_screen_lock">Verrouiller</string>
<string name="bg_service_screen_unlock">Déverrouiller</string>
<string name="bg_service_sleep_mode_off">Exécuter\n lapplication en tâche de fond</string>
<string name="bg_service_sleep_mode_on">Arrêter\n l\'exécution de l\'application en tâche de fond</string>
<string name="bg_service_sleep_mode_off">Exécuter
\n lapplication en arrière-plan</string>
<string name="bg_service_sleep_mode_on">Arrêter
\n l\'exécution de l\'application en arrière-plan</string>
<string name="bg_service_screen_lock_toast">L\'écran est verrouillé</string>
<string name="bg_service_interval">Positionner l\'intervalle d\'activation :</string>
<string name="layer_map_appearance">Configurer l\'écran</string>
@ -864,7 +866,7 @@
<string name="rendering_attr_roadColors_name">Thème de couleurs pour les routes</string>
<string name="zxing_barcode_scanner_not_found">Lapplication ZXing Barcode Scanner n\'est pas installée. Souhaitez-vous l\'installer depuis Google Play ?</string>
<string name="close_changeset">Clôturer les modifications</string>
<string name="background_service_is_enabled_question">Le service OsmAnd s\'exécute toujours en tâche de fond. Souhaitez-vous également l\'arrêter ?</string>
<string name="background_service_is_enabled_question">Le service OsmAnd s\'exécute encore en arrière-plan. Souhaitez-vous aussi l\'arrêter \?</string>
<string name="safe_mode_description">Exécuter l\'application en mode sûr (utiliser le code Android plus lent plutôt que le code natif).</string>
<string name="safe_mode">Mode sûr</string>
<string name="native_library_not_running">L\'application s\'exécute en mode sûr (désactivez ce mode dans Paramètres).</string>
@ -1242,9 +1244,9 @@
<string name="local_index_select_gpx_file">Sélectionnez une trace</string>
<string name="keep_navigation_service">Conserver</string>
<string name="stop_navigation_service">Arrêter</string>
<string name="enable_sleep_mode">Démarrer lexécution de la tâche de fond GPS ?</string>
<string name="enable_sleep_mode">Démarrer lexécution du GPS en arrière-plan</string>
<string name="gps_wake_up_timer">Intervalle de réveil du GPS</string>
<string name="sleep_mode_stop_dialog">Arrêter lexécution de la tâche de fond GPS ?</string>
<string name="sleep_mode_stop_dialog">Arrêter lexécution du GPS en arrière-plan \?</string>
<string name="map_preferred_locale_descr">Langue préférée des libellés sur la carte (en cas d\'indisponibilité affiche les noms anglais ou locaux).</string>
<string name="map_preferred_locale">Langue préférée pour la carte</string>
<string name="local_map_names">Noms locaux</string>
@ -1669,7 +1671,7 @@
<string name="favourites_context_menu_add">Ajouter un favori</string>
<string name="shared_string_trip_recording">Enregistrement de l\'itinéraire</string>
<string name="shared_string_navigation">Navigation</string>
<string name="osmand_running_in_background">Exécuter en tâche de fond</string>
<string name="osmand_running_in_background">Exécuter en arrière-plan</string>
<string name="default_speed_system_descr">Définir l\'unité de vitesse.</string>
<string name="default_speed_system">Unité de vitesse</string>
<string name="nm">mn</string>
@ -3610,4 +3612,12 @@ représentant la zone : %1$s x %2$s</string>
<string name="main_actions">Actions principales</string>
<string name="developer_plugin">Greffon de développement</string>
<string name="shared_string_items">Éléments</string>
<string name="select_wikipedia_article_langs">Sélectionnez les langues dans lesquelles les articles Wikipédia s\'afficheront sur la carte. Vous pouvez basculer entre toutes les langues disponibles pendant la lecture de l\'article.</string>
<string name="lang_bar">Bavarois</string>
<string name="lang_jv">Javanais</string>
<string name="lang_mn">Mongolien</string>
<string name="lang_scn">Sicilien</string>
<string name="some_articles_may_not_available_in_lang">Certains articles Wikipédia peuvent ne pas être disponibles dans votre langue.</string>
<string name="custom_color">Couleur personnalisée</string>
<string name="extra_maps_menu_group">Cartes supplémentaires</string>
</resources>

View file

@ -3513,7 +3513,7 @@ Ha szereted az OsmAndot és az OSM-et, és szeretnéd támogatni a fejlődésük
<string name="recalculate_route_in_deviation">Útvonal újraszámítása letérés esetén</string>
<string name="select_distance_route_will_recalc">Jelöld ki a távolságot, amely fölött az útvonal újraszámításra kerül.</string>
<string name="recalculate_route_distance_promo">Az útvonal újraszámításra kerül, amennyiben az útvonal és a jelenlegi helyzet közötti távolság nagyobb, mint a kiválasztott érték.</string>
<string name="n_items_of_z">%1$s ennyiből: %2$s</string>
<string name="n_items_of_z">%1$s a %2$s-ból</string>
<string name="download_slope_maps">Lejtők</string>
<string name="quick_action_show_hide_terrain">Domborzat megjelenítése/elrejtése</string>
<string name="quick_action_terrain_hide">Domborzat elrejtése</string>
@ -3536,12 +3536,12 @@ Ha szereted az OsmAndot és az OSM-et, és szeretnéd támogatni a fejlődésük
<string name="settings_item_write_error">%1$s írása sikertelen.</string>
<string name="settings_item_import_error">%1$s importálása sikertelen.</string>
<string name="ui_customization">Felhasználói felület testreszabása</string>
<string name="shared_string_drawer">Fiók</string>
<string name="shared_string_drawer">Menü</string>
<string name="reorder_or_hide_from">%1$s: elemek átrendezése vagy elrejtése.</string>
<string name="shared_string_divider">Elválasztó</string>
<string name="divider_descr">Az ez alatti elemek elválasztásra kerülnek egy elválasztóval.</string>
<string name="hidden_items_descr">Ezek az elemek a menüből elrejtésre kerültek, azonban az általuk képviselt beállítások vagy bővítmények továbbra is érvényben maradnak.</string>
<string name="main_actions_descr">Fő műveletek csak 4 gombot tartalmaz.</string>
<string name="main_actions_descr">A fő műveletekhez csak 4 elem tartozhat.</string>
<string name="multimedia_use_system_camera">Rendszeralkalmazás használata</string>
<string name="multimedia_photo_play_sound">Fényképező zárhang</string>
<string name="osm_authorization_success">Hitelesítés sikeres</string>
@ -3550,7 +3550,7 @@ Ha szereted az OsmAndot és az OSM-et, és szeretnéd támogatni a fejlődésük
<string name="shared_string_hidden">Rejtett</string>
<string name="reset_items_descr">A beállítások az eredeti állapotba fognak visszaállni elrejtés után.</string>
<string name="main_actions">Fő műveletek</string>
<string name="additional_actions_descr">Ehhez a művelethez a \"Műveletek\" gombra koppintva férhet hozzá.</string>
<string name="additional_actions_descr">Ezekhez a műveletekhez a \"Műveletek\" gombra koppintva férhet hozzá.</string>
<string name="move_inside_category">Csak ezen a kategórián belül lehetséges az elemek áthelyezése.</string>
<string name="developer_plugin">Fejlesztő bővítmény</string>
<string name="replace_point_descr">Másik pont lecserélése erre</string>
@ -3560,4 +3560,41 @@ Ha szereted az OsmAndot és az OSM-et, és szeretnéd támogatni a fejlődésük
<string name="shared_string_language">Nyelv</string>
<string name="shared_string_all_languages">Összes nyelv</string>
<string name="wiki_menu_download_descr">További térképek szükségesek a Wikipédia POI-k térképen való megjelenítéséhez.</string>
<string name="context_menu_actions">Opciók menü elemei</string>
<string name="ui_customization_description">Személyre szabhatja az elemek számát a Menüben, a Térkép beállításában és az Opciókban.
\n
\nA használaton kívüli bővítmények letiltá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_track_file">Nyomvonalfájl kijelölése</string>
<string name="lang_zhyue">kantoni</string>
<string name="lang_zhminnan">déli min</string>
<string name="lang_yo">joruba</string>
<string name="lang_war">waray</string>
<string name="lang_uz">üzbég</string>
<string name="lang_ur">urdu</string>
<string name="lang_tt">tatár</string>
<string name="lang_tg">tádzsik</string>
<string name="lang_sco">scots</string>
<string name="lang_scn">szicíliai</string>
<string name="lang_pnb">pandzsábi</string>
<string name="lang_ne">nepáli</string>
<string name="lang_nap">nápolyi</string>
<string name="lang_my">burmai</string>
<string name="lang_mn">mongol</string>
<string name="lang_min">minangkabau</string>
<string name="lang_mg">malgas</string>
<string name="lang_ky">kirgiz</string>
<string name="lang_kk">kazak</string>
<string name="lang_jv">jávai</string>
<string name="lang_gu">gudzsaráti</string>
<string name="lang_cv">csuvas</string>
<string name="lang_ce">csecsen</string>
<string name="lang_bar">bajor</string>
<string name="lang_ba">baskír</string>
<string name="lang_an">aragóniai</string>
<string name="lang_lmo">lombard</string>
<string name="custom_color">Egyéni szín</string>
<string name="extra_maps_menu_group">Egyéb térképek</string>
</resources>

View file

@ -3651,4 +3651,35 @@ Stendur fyrir svæði: %1$s x %2$s</string>
<string name="developer_plugin">Forritsviðbót fyrir forritun</string>
<string name="shared_string_items">Atriði</string>
<string name="wiki_menu_download_descr">Viðbótarkort þarf til að skoða Wikipedia-merkisstaði á kortinu.</string>
<string name="extra_maps_menu_group">Aukakort</string>
<string name="select_wikipedia_article_langs">Veldu þau tungumál sem Wikipedia-greinarnar ættu að birtast á á kortinu. Þú munt geta skipt á milli allra tiltækra tungumála á meðan þú lest greinar.</string>
<string name="some_articles_may_not_available_in_lang">Sumar Wikipedia-greinar gætu verið ekki tiltækar á þínu tungumáli.</string>
<string name="lang_zhyue">Kantónska</string>
<string name="lang_zhminnan">Suður-mín</string>
<string name="lang_yo">Yórúba</string>
<string name="lang_war">Waray</string>
<string name="lang_uz">Úsbekíska</string>
<string name="lang_ur">Úrdú</string>
<string name="lang_tt">Tatarska</string>
<string name="lang_tg">Tadzjikíska</string>
<string name="lang_sco">Skoska</string>
<string name="lang_scn">Sikileyska</string>
<string name="lang_pnb">Punjabíska</string>
<string name="lang_ne">Nepalska</string>
<string name="lang_nap">Neapólíska</string>
<string name="lang_my">Búrmíska</string>
<string name="lang_mn">Mongólska</string>
<string name="lang_min">Minangkabau</string>
<string name="lang_mg">Malagasíska</string>
<string name="lang_ky">Kyrgsíska</string>
<string name="lang_kk">Kasakíska</string>
<string name="lang_jv">Javanska</string>
<string name="lang_gu">Gujaratíska</string>
<string name="lang_cv">Chuvash</string>
<string name="lang_ce">Tétjenska</string>
<string name="lang_bar">Bæverska</string>
<string name="lang_ba">Bashkir</string>
<string name="lang_an">Aragónska</string>
<string name="lang_lmo">Lombardíska</string>
<string name="custom_color">Sérsniðinn litur</string>
</resources>

View file

@ -3614,10 +3614,10 @@ Reprezentuje obszar: %1$s x %2$s</string>
<string name="replace_point_descr">Zastąp tym inny punkt</string>
<string name="custom_osmand_plugin">Niestandardowa wtyczka OsmAnd</string>
<string name="changes_applied_to_profile">Zmiany zastosowano do profilu %1$s.</string>
<string name="settings_item_read_error">Nie udało się przeczytać %1$s.</string>
<string name="settings_item_read_error">Nie udało się odczytać %1$s.</string>
<string name="settings_item_write_error">Nie udało się napisać %1$s.</string>
<string name="settings_item_import_error">Nie udało się zaimportować %1$s.</string>
<string name="ui_customization_short_descr">Elementy szuflady, menu kontekstowe</string>
<string name="ui_customization_short_descr">Elementy szuflady, menu podręczne</string>
<string name="ui_customization">Ustawienia interfejsu użytkownika</string>
<string name="shared_string_drawer">Szuflada</string>
<string name="context_menu_actions">Menu kontekstowe działań</string>
@ -3633,11 +3633,13 @@ Reprezentuje obszar: %1$s x %2$s</string>
<string name="move_inside_category">Możesz przemieszczać elementy tylko wewnątrz tej kategorii.</string>
<string name="developer_plugin">Wtyczka deweloperska</string>
<string name="shared_string_items">Elementy</string>
<string name="select_track_file">Wybierz plik ścieżki</string>
<string name="select_track_file">Wybór pliku śladu</string>
<string name="shared_string_languages">Języki</string>
<string name="shared_string_language">Język</string>
<string name="shared_string_all_languages">Wszystkie języki</string>
<string name="wikipedia_poi_languages_promo">Niektóre artykuły Wikipiedii mogą nie być dostępne w twoim języku, wybierz w których językach artykuły Wikipedii mogą pojawiać się na mapie.
\nBędziesz mógł zmieniać pomiędzy wszystkimi możliwymi językami podczas czytania artykułu.</string>
<string name="wiki_menu_download_descr">Potrzebne są dodatkowe mapy, żeby przeglądać UM Wikipedii na mapie.</string>
<string name="some_articles_may_not_available_in_lang">Pewne artykuły Wikipedii mogą być nie dostępne w wybranym języku.</string>
<string name="custom_color">Dostosowany kolor</string>
</resources>

View file

@ -3618,7 +3618,7 @@ Pôr do Sol: %2$s</string>
<string name="shared_string_divider">Divisor</string>
<string name="divider_descr">Elementos abaixo deste ponto separados por um divisor.</string>
<string name="shared_string_hidden">Escondido</string>
<string name="hidden_items_descr">Esses itens estão ocultos no menu, mas as opções ou plug-ins representados ainda estão funcionando.</string>
<string name="hidden_items_descr">Esses itens estão ocultos no menu, mas as opções ou plug-ins representados continuarão funcionando.</string>
<string name="reset_items_descr">As configurações serão redefinidas para o estado original após ocultar.</string>
<string name="main_actions_descr">As ações principais contêm apenas 4 botões.</string>
<string name="main_actions">Principais ações</string>
@ -3626,4 +3626,34 @@ Pôr do Sol: %2$s</string>
<string name="move_inside_category">Você pode mover itens somente dentro desta categoria.</string>
<string name="developer_plugin">Plugin do desenvolvedor</string>
<string name="shared_string_items">Itens</string>
<string name="select_wikipedia_article_langs">Selecione os idiomas em que os artigos da Wikipédia aparecerão no mapa. Você pode alternar entre todos os idiomas disponíveis enquanto lê o artigo.</string>
<string name="some_articles_may_not_available_in_lang">Alguns artigos da Wikipédia podem não estar disponíveis no seu idioma.</string>
<string name="lang_zhyue">Cantonês</string>
<string name="lang_zhminnan">Min do Sul</string>
<string name="lang_yo">Iorubá</string>
<string name="lang_war">Samarenho</string>
<string name="lang_uz">Uzbeque</string>
<string name="lang_ur">Urdu</string>
<string name="lang_tt">Tártaro</string>
<string name="lang_tg">Tajique</string>
<string name="lang_sco">Ânglico Escocês</string>
<string name="lang_scn">Siciliano</string>
<string name="lang_pnb">Panjábi</string>
<string name="lang_ne">Nepali</string>
<string name="lang_nap">Napolitano</string>
<string name="lang_my">Birmanês</string>
<string name="lang_mn">Mongol</string>
<string name="lang_min">Minangkabau</string>
<string name="lang_mg">Malgaxe</string>
<string name="lang_ky">Quirguiz</string>
<string name="lang_kk">Cazaque</string>
<string name="lang_jv">Javanês</string>
<string name="lang_gu">Guzerate</string>
<string name="lang_cv">Tchuvache</string>
<string name="lang_ce">Checheno</string>
<string name="lang_bar">Bávaro</string>
<string name="lang_ba">Basquires</string>
<string name="lang_an">Aragonês</string>
<string name="lang_lmo">Lombardo</string>
<string name="custom_color">Cor customizada</string>
</resources>

View file

@ -3631,4 +3631,35 @@
<string name="additional_actions_descr">Доступ к этим действиям происходит нажатием кнопки \"Действия\".</string>
<string name="move_inside_category">Перемещать элементы можно только внутри данной категории.</string>
<string name="developer_plugin">Плагин для разработчиков</string>
<string name="select_wikipedia_article_langs">Выберите языки, на которых статьи Википедии будут отображаться на карте. Вы сможете переключаться между всеми доступными языками при чтении статьи.</string>
<string name="lang_yo">Йоруба</string>
<string name="custom_color">Пользовательский цвет</string>
<string name="some_articles_may_not_available_in_lang">Некоторые статьи Википедии могут быть недоступны на вашем языке.</string>
<string name="lang_zhyue">Кантонский</string>
<string name="lang_zhminnan">Южный Мин</string>
<string name="lang_war">Варей</string>
<string name="lang_uz">Узбекский</string>
<string name="lang_ur">Урду</string>
<string name="lang_tt">Татарский</string>
<string name="lang_tg">Таджикский</string>
<string name="lang_sco">Шотландский</string>
<string name="lang_scn">Сицилийский</string>
<string name="lang_pnb">Панджаби</string>
<string name="lang_ne">Непальский</string>
<string name="lang_nap">Неаполитанский</string>
<string name="lang_my">Бирманский</string>
<string name="lang_mn">Монгольский</string>
<string name="lang_min">Минангкабау</string>
<string name="lang_mg">Малагасийский</string>
<string name="lang_ky">Киргизский</string>
<string name="lang_kk">Казахский</string>
<string name="lang_jv">Яванский</string>
<string name="lang_gu">Гуджарати</string>
<string name="lang_cv">Чувашский</string>
<string name="lang_ce">Чеченский</string>
<string name="lang_bar">Баварский</string>
<string name="lang_ba">Башкирский</string>
<string name="lang_an">Арагонский</string>
<string name="lang_lmo">Ломбардский</string>
<string name="extra_maps_menu_group">Дополнительные карты</string>
</resources>

View file

@ -3622,12 +3622,42 @@
<string name="shared_string_divider">分隔符</string>
<string name="divider_descr">低於此點的元素將由分隔符分離。</string>
<string name="shared_string_hidden">已隱藏</string>
<string name="hidden_items_descr">這些項目已從選單隱藏,但對應的選項或外掛程式仍在運作中</string>
<string name="hidden_items_descr">這些項目已從選單隱藏,但對應的選項或外掛程式將會繼續運作</string>
<string name="reset_items_descr">隱藏後,設定將會重設回原始狀態。</string>
<string name="main_actions_descr">主要動作僅包含 4 個按鈕。</string>
<string name="main_actions">主要動作</string>
<string name="additional_actions_descr">您可以透過輕點「動作」按鈕來存取動作。</string>
<string name="additional_actions_descr">您可以透過輕點「動作」按鈕來存取這些動作。</string>
<string name="move_inside_category">您只能在此分類中移動項目。</string>
<string name="developer_plugin">開發者外掛程式</string>
<string name="shared_string_items">項目</string>
<string name="select_wikipedia_article_langs">選取維基百科的文章在地圖上顯示時的語言。您可以在閱讀文章時在所有可用的語言間切換。</string>
<string name="some_articles_may_not_available_in_lang">某些維基百科的文章可能無法以您的語言提供。</string>
<string name="lang_zhyue">粵語</string>
<string name="lang_zhminnan">閩南語</string>
<string name="lang_yo">約魯巴語</string>
<string name="lang_war">瓦瑞語</string>
<string name="lang_uz">烏茲別克語</string>
<string name="lang_ur">烏爾都語</string>
<string name="lang_tt">韃靼語</string>
<string name="lang_tg">塔吉克語</string>
<string name="lang_sco">低地蘇格蘭語</string>
<string name="lang_scn">西西里語</string>
<string name="lang_pnb">旁遮普語</string>
<string name="lang_ne">尼泊爾語</string>
<string name="lang_nap">那不勒斯語</string>
<string name="lang_my">緬甸語</string>
<string name="lang_mn">蒙古語</string>
<string name="lang_min">米南佳保語</string>
<string name="lang_mg">馬達加斯加語</string>
<string name="lang_ky">吉爾吉斯語</string>
<string name="lang_kk">哈薩克語</string>
<string name="lang_jv">爪哇語</string>
<string name="lang_gu">古吉拉特語</string>
<string name="lang_cv">楚瓦什語</string>
<string name="lang_ce">車臣語</string>
<string name="lang_bar">巴伐利亞語</string>
<string name="lang_ba">巴什基爾語</string>
<string name="lang_an">亞拉岡語</string>
<string name="lang_lmo">倫巴底語</string>
<string name="custom_color">自訂顏色</string>
</resources>

View file

@ -361,9 +361,10 @@
<dimen name="setting_select_icon_button_height">128dp</dimen>
<dimen name="setting_select_icon_button_width">164dp</dimen>
<dimen name="slider_thumb_size">8dp</dimen>
<dimen name="slider_thumb_size">6dp</dimen>
<dimen name="slider_thumb_halo_size">12dp</dimen>
<dimen name="slider_track_height">2dp</dimen>
<dimen name="mtrl_slider_track_side_padding">@dimen/slider_thumb_size</dimen>
<dimen name="list_item_move_header_min_height">65dp</dimen>
</resources>

View file

@ -11,6 +11,8 @@
Thx - Hardy
-->
<string name="download_unsupported_action">Unsupported action %1$s</string>
<string name="extra_maps_menu_group">Extra maps</string>
<string name="custom_color">Custom color</string>
<string name="lang_lmo">Lombard</string>
<string name="lang_an">Aragonese</string>

View file

@ -112,6 +112,11 @@
<item name="divider_color">@color/divider_color_dark</item>
</style>
<!-- MaterialComponents Widgets override -->
<style name="Widget.Styled.Slider" parent="Widget.MaterialComponents.Slider">
<item name="android:theme">@style/Theme.MaterialComponents</item>
</style>
<!-- Osmand themes styles -->
<style name="OsmandLightTheme" parent="Theme.AppCompat.Light">
<item name="android:textDirection">locale</item>

View file

@ -0,0 +1,82 @@
package net.osmand;
import android.content.Context;
import android.content.res.Configuration;
import net.osmand.util.Algorithms;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class JsonUtils {
public static String getLocalizedResFromMap(Context ctx, Map<String, String> localizedMap, String defVal) {
if (!Algorithms.isEmpty(localizedMap)) {
Configuration config = ctx.getResources().getConfiguration();
String lang = config.locale.getLanguage();
String name = localizedMap.get(lang);
if (Algorithms.isEmpty(name)) {
name = localizedMap.get("");
}
if (!Algorithms.isEmpty(name)) {
return name;
}
}
return defVal;
}
public static List<String> jsonArrayToList(String key, JSONObject json) throws JSONException {
List<String> items = new ArrayList<>();
JSONArray jsonArray = json.optJSONArray(key);
if (jsonArray != null) {
for (int i = 0; i < jsonArray.length(); i++) {
items.add(jsonArray.getString(i));
}
}
return items;
}
public static Map<String, String> getLocalizedMapFromJson(String key, JSONObject json) throws JSONException {
JSONObject jsonObject = json.optJSONObject(key);
return getLocalizedMapFromJson(jsonObject);
}
public static Map<String, String> getLocalizedMapFromJson(JSONObject json) throws JSONException {
Map<String, String> localizedMap = new HashMap<>();
if (json != null) {
for (Iterator<String> it = json.keys(); it.hasNext(); ) {
String localeKey = it.next();
String name = json.getString(localeKey);
localizedMap.put(localeKey, name);
}
}
return localizedMap;
}
public static void writeStringListToJson(String key, JSONObject json, List<String> items) throws JSONException {
if (!Algorithms.isEmpty(items)) {
JSONArray jsonArray = new JSONArray();
for (String render : items) {
jsonArray.put(render);
}
json.put(key, jsonArray);
}
}
public static void writeLocalizedMapToJson(String jsonKey, JSONObject json, Map<String, String> map) throws JSONException {
if (!Algorithms.isEmpty(map)) {
JSONObject jsonObject = new JSONObject();
for (Map.Entry<String, String> entry : map.entrySet()) {
jsonObject.put(entry.getKey(), entry.getValue());
}
json.put(jsonKey, jsonObject);
}
}
}

View file

@ -16,7 +16,6 @@ import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.TextView;
import androidx.annotation.ColorRes;
@ -28,6 +27,8 @@ import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import com.google.android.material.slider.Slider;
import net.osmand.AndroidUtils;
import net.osmand.PlatformUtil;
import net.osmand.plus.activities.HelpActivity;
@ -464,33 +465,26 @@ public class ContextMenuAdapter {
}
}
if (convertView.findViewById(R.id.seekbar) != null) {
SeekBar seekBar = (SeekBar) convertView.findViewById(R.id.seekbar);
Slider slider = (Slider) convertView.findViewById(R.id.slider);
if (slider != null) {
if (item.getProgress() != ContextMenuItem.INVALID_ID) {
seekBar.setProgress(item.getProgress());
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
slider.setValue(item.getProgress());
slider.addOnChangeListener(new Slider.OnChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) {
OnIntegerValueChangedListener listener = item.getIntegerListener();
int progress = (int) value;
item.setProgress(progress);
if (listener != null && fromUser) {
listener.onIntegerValueChangedListener(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
seekBar.setVisibility(View.VISIBLE);
} else if (seekBar != null) {
seekBar.setVisibility(View.GONE);
slider.setVisibility(View.VISIBLE);
} else {
slider.setVisibility(View.GONE);
}
UiUtilities.setupSeekBar(app, seekBar, nightMode, profileDependent);
UiUtilities.setupSlider(slider, nightMode, currentModeColor);
}
View progressBar = convertView.findViewById(R.id.ProgressBar);

View file

@ -1,17 +1,20 @@
package net.osmand.plus;
import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.Html;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.IndexConstants;
import net.osmand.JsonUtils;
import net.osmand.PlatformUtil;
import net.osmand.data.LatLon;
import net.osmand.map.ITileSource;
import net.osmand.map.TileSourceManager;
import net.osmand.map.WorldRegion;
import net.osmand.plus.SettingsHelper.AvoidRoadsSettingsItem;
import net.osmand.plus.SettingsHelper.MapSourcesSettingsItem;
import net.osmand.plus.SettingsHelper.PluginSettingsItem;
@ -20,6 +23,10 @@ import net.osmand.plus.SettingsHelper.ProfileSettingsItem;
import net.osmand.plus.SettingsHelper.QuickActionsSettingsItem;
import net.osmand.plus.SettingsHelper.SettingsCollectListener;
import net.osmand.plus.SettingsHelper.SettingsItem;
import net.osmand.plus.download.DownloadActivityType;
import net.osmand.plus.download.DownloadIndexesThread;
import net.osmand.plus.download.DownloadResources;
import net.osmand.plus.download.IndexItem;
import net.osmand.plus.helpers.AvoidSpecificRoads;
import net.osmand.plus.poi.PoiUIFilter;
import net.osmand.plus.quickaction.QuickAction;
@ -32,7 +39,9 @@ import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@ -56,6 +65,8 @@ public class CustomOsmandPlugin extends OsmandPlugin {
private List<String> rendererNames = new ArrayList<>();
private List<String> routerNames = new ArrayList<>();
private List<SuggestedDownloadItem> suggestedDownloadItems = new ArrayList<>();
private List<WorldRegion> customRegions = new ArrayList<>();
public CustomOsmandPlugin(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
super(app);
@ -65,6 +76,26 @@ public class CustomOsmandPlugin extends OsmandPlugin {
loadResources();
}
@Override
public String getId() {
return pluginId;
}
@Override
public String getName() {
return JsonUtils.getLocalizedResFromMap(app, names, app.getString(R.string.custom_osmand_plugin));
}
@Override
public CharSequence getDescription() {
String description = JsonUtils.getLocalizedResFromMap(app, descriptions, null);
return description != null ? Html.fromHtml(description) : null;
}
public String getResourceDirName() {
return resourceDirName;
}
@Override
public boolean init(@NonNull OsmandApplication app, @Nullable Activity activity) {
super.init(app, activity);
@ -78,6 +109,108 @@ public class CustomOsmandPlugin extends OsmandPlugin {
return true;
}
@Override
public void disable(OsmandApplication app) {
super.disable(app);
removePluginItems(null);
}
public File getPluginDir() {
return app.getAppPath(IndexConstants.PLUGINS_DIR + pluginId);
}
public File getPluginItemsFile() {
return new File(getPluginDir(), "items" + IndexConstants.OSMAND_SETTINGS_FILE_EXT);
}
public File getPluginResDir() {
File pluginDir = getPluginDir();
if (!Algorithms.isEmpty(resourceDirName)) {
return new File(pluginDir, resourceDirName);
}
return pluginDir;
}
@Override
public List<String> getRendererNames() {
return rendererNames;
}
@Override
public List<String> getRouterNames() {
return routerNames;
}
private Drawable getIconForFile(String path, Map<String, String> fileNames) {
for (Map.Entry<String, String> entry : fileNames.entrySet()) {
String value = entry.getValue();
if (value.startsWith("@")) {
value = value.substring(1);
}
if (path.endsWith(value)) {
return BitmapDrawable.createFromPath(path);
}
}
return null;
}
@NonNull
@Override
public Drawable getLogoResource() {
return icon != null ? icon : super.getLogoResource();
}
@Override
public Drawable getAssetResourceImage() {
return image;
}
@Override
public List<WorldRegion> getDownloadMaps() {
return customRegions;
}
@Override
public List<IndexItem> getSuggestedMaps() {
List<IndexItem> suggestedMaps = new ArrayList<>();
DownloadIndexesThread downloadThread = app.getDownloadThread();
if (!downloadThread.getIndexes().isDownloadedFromInternet && app.getSettings().isInternetConnectionAvailable()) {
downloadThread.runReloadIndexFiles();
}
boolean downloadIndexes = app.getSettings().isInternetConnectionAvailable()
&& !downloadThread.getIndexes().isDownloadedFromInternet
&& !downloadThread.getIndexes().downloadFromInternetFailed;
if (!downloadIndexes) {
for (SuggestedDownloadItem item : suggestedDownloadItems) {
DownloadActivityType type = DownloadActivityType.getIndexType(item.scopeId);
if (type != null) {
List<IndexItem> foundMaps = new ArrayList<>();
String searchType = item.getSearchType();
if ("latlon".equalsIgnoreCase(searchType)) {
LatLon latLon = app.getMapViewTrackingUtilities().getMapLocation();
foundMaps.addAll(getMapsForType(latLon, type));
} else if ("worldregion".equalsIgnoreCase(searchType)) {
LatLon latLon = app.getMapViewTrackingUtilities().getMapLocation();
foundMaps.addAll(getMapsForType(latLon, type));
}
if (!Algorithms.isEmpty(item.getNames())) {
foundMaps.addAll(getMapsForType(item.getNames(), type, item.getLimit()));
}
suggestedMaps.addAll(foundMaps);
}
}
}
return suggestedMaps;
}
public void setResourceDirName(String resourceDirName) {
this.resourceDirName = resourceDirName;
}
private void addPluginItemsFromFile(final File file) {
app.getSettingsHelper().collectSettings(file, "", 1, new SettingsCollectListener() {
@Override
@ -93,9 +226,7 @@ public class CustomOsmandPlugin extends OsmandPlugin {
ApplicationMode.changeProfileAvailability(savedMode, true, app);
}
iterator.remove();
} else if (item instanceof PluginSettingsItem) {
iterator.remove();
} else {
} else if (!(item instanceof PluginSettingsItem)) {
item.setShouldReplace(true);
}
}
@ -179,208 +310,95 @@ public class CustomOsmandPlugin extends OsmandPlugin {
});
}
@Override
public void disable(OsmandApplication app) {
super.disable(app);
removePluginItems(null);
}
public File getPluginDir() {
return app.getAppPath(IndexConstants.PLUGINS_DIR + pluginId);
}
public File getPluginItemsFile() {
return new File(getPluginDir(), "items" + IndexConstants.OSMAND_SETTINGS_FILE_EXT);
}
public File getPluginResDir() {
File pluginDir = getPluginDir();
if (!Algorithms.isEmpty(resourceDirName)) {
return new File(pluginDir, resourceDirName);
}
return pluginDir;
}
@Override
public String getId() {
return pluginId;
}
@Override
public String getName() {
Configuration config = app.getResources().getConfiguration();
String lang = config.locale.getLanguage();
String name = names.get(lang);
if (Algorithms.isEmpty(name)) {
name = names.get("");
}
if (Algorithms.isEmpty(name)) {
name = app.getString(R.string.custom_osmand_plugin);
}
return name;
}
@Override
public String getDescription() {
Configuration config = app.getResources().getConfiguration();
String lang = config.locale.getLanguage();
String description = descriptions.get(lang);
if (Algorithms.isEmpty(description)) {
description = descriptions.get("");
}
return description;
}
public String getResourceDirName() {
return resourceDirName;
}
public void setResourceDirName(String resourceDirName) {
this.resourceDirName = resourceDirName;
}
public void readAdditionalDataFromJson(JSONObject json) throws JSONException {
JSONObject iconJson = json.has("icon") ? json.getJSONObject("icon") : null;
if (iconJson != null) {
for (Iterator<String> it = iconJson.keys(); it.hasNext(); ) {
String iconKey = it.next();
String name = iconJson.getString(iconKey);
iconNames.put(iconKey, name);
}
}
JSONObject imageJson = json.has("image") ? json.getJSONObject("image") : null;
if (imageJson != null) {
for (Iterator<String> it = imageJson.keys(); it.hasNext(); ) {
String imageKey = it.next();
String name = imageJson.getString(imageKey);
imageNames.put(imageKey, name);
}
}
JSONObject nameJson = json.has("name") ? json.getJSONObject("name") : null;
if (nameJson != null) {
for (Iterator<String> it = nameJson.keys(); it.hasNext(); ) {
String localeKey = it.next();
String name = nameJson.getString(localeKey);
names.put(localeKey, name);
}
}
JSONObject descriptionJson = json.has("description") ? json.getJSONObject("description") : null;
if (descriptionJson != null) {
for (Iterator<String> it = descriptionJson.keys(); it.hasNext(); ) {
String localeKey = it.next();
String name = descriptionJson.getString(localeKey);
descriptions.put(localeKey, name);
}
iconNames = JsonUtils.getLocalizedMapFromJson("icon", json);
imageNames = JsonUtils.getLocalizedMapFromJson("image", json);
names = JsonUtils.getLocalizedMapFromJson("name", json);
descriptions = JsonUtils.getLocalizedMapFromJson("description", json);
JSONArray regionsJson = json.optJSONArray("regionsJson");
if (regionsJson != null) {
customRegions.addAll(collectRegionsFromJson(regionsJson));
}
}
public void writeAdditionalDataToJson(JSONObject json) throws JSONException {
JSONObject iconJson = new JSONObject();
for (Map.Entry<String, String> entry : iconNames.entrySet()) {
iconJson.put(entry.getKey(), entry.getValue());
}
json.put("icon", iconJson);
JsonUtils.writeLocalizedMapToJson("icon", json, iconNames);
JsonUtils.writeLocalizedMapToJson("image", json, imageNames);
JsonUtils.writeLocalizedMapToJson("name", json, names);
JsonUtils.writeLocalizedMapToJson("description", json, descriptions);
JSONObject imageJson = new JSONObject();
for (Map.Entry<String, String> entry : imageNames.entrySet()) {
imageJson.put(entry.getKey(), entry.getValue());
JSONArray regionsJson = new JSONArray();
for (WorldRegion region : getFlatCustomRegions()) {
if (region instanceof CustomRegion) {
regionsJson.put(((CustomRegion) region).toJson());
}
}
json.put("regionsJson", regionsJson);
}
json.put("image", imageJson);
JSONObject nameJson = new JSONObject();
for (Map.Entry<String, String> entry : names.entrySet()) {
nameJson.put(entry.getKey(), entry.getValue());
private List<WorldRegion> getFlatCustomRegions() {
List<WorldRegion> l = new ArrayList<>(customRegions);
for (WorldRegion region : customRegions) {
collectCustomSubregionsFromRegion(region, l);
}
return l;
}
json.put("name", nameJson);
JSONObject descriptionJson = new JSONObject();
for (Map.Entry<String, String> entry : descriptions.entrySet()) {
descriptionJson.put(entry.getKey(), entry.getValue());
private void collectCustomSubregionsFromRegion(WorldRegion region, List<WorldRegion> items) {
items.addAll(region.getSubregions());
for (WorldRegion subregion : region.getSubregions()) {
collectCustomSubregionsFromRegion(subregion, items);
}
json.put("description", descriptionJson);
}
public void readDependentFilesFromJson(JSONObject json) throws JSONException {
JSONArray rendererNamesJson = json.has("rendererNames") ? json.getJSONArray("rendererNames") : null;
if (rendererNamesJson != null) {
for (int i = 0; i < rendererNamesJson.length(); i++) {
String renderer = rendererNamesJson.getString(i);
rendererNames.add(renderer);
}
}
JSONArray routerNamesJson = json.has("routerNames") ? json.getJSONArray("routerNames") : null;
if (routerNamesJson != null) {
for (int i = 0; i < routerNamesJson.length(); i++) {
String renderer = routerNamesJson.getString(i);
routerNames.add(renderer);
}
}
JSONObject iconNamesJson = json.has("iconNames") ? json.getJSONObject("iconNames") : null;
if (iconNamesJson != null) {
for (Iterator<String> it = iconNamesJson.keys(); it.hasNext(); ) {
String localeKey = it.next();
String name = iconNamesJson.getString(localeKey);
iconNames.put(localeKey, name);
}
}
JSONObject imageNamesJson = json.has("imageNames") ? json.getJSONObject("imageNames") : null;
if (imageNamesJson != null) {
for (Iterator<String> it = imageNamesJson.keys(); it.hasNext(); ) {
String localeKey = it.next();
String name = imageNamesJson.getString(localeKey);
imageNames.put(localeKey, name);
}
}
resourceDirName = json.has("pluginResDir") ? json.getString("pluginResDir") : null;
rendererNames = JsonUtils.jsonArrayToList("rendererNames", json);
routerNames = JsonUtils.jsonArrayToList("routerNames", json);
resourceDirName = json.optString("pluginResDir");
}
public void writeDependentFilesJson(JSONObject json) throws JSONException {
JSONArray rendererNamesJson = new JSONArray();
for (String render : rendererNames) {
rendererNamesJson.put(render);
}
json.put("rendererNames", rendererNamesJson);
JSONArray routerNamesJson = new JSONArray();
for (String render : routerNames) {
routerNamesJson.put(render);
}
json.put("routerNames", routerNamesJson);
JSONObject iconNamesJson = new JSONObject();
for (Map.Entry<String, String> entry : iconNames.entrySet()) {
iconNamesJson.put(entry.getKey(), entry.getValue());
}
json.put("iconNames", iconNamesJson);
JSONObject imageNamesJson = new JSONObject();
for (Map.Entry<String, String> entry : imageNames.entrySet()) {
imageNamesJson.put(entry.getKey(), entry.getValue());
}
json.put("imageNames", imageNamesJson);
JsonUtils.writeStringListToJson("rendererNames", json, rendererNames);
JsonUtils.writeStringListToJson("routerNames", json, routerNames);
json.put("pluginResDir", resourceDirName);
}
@Override
public List<String> getRendererNames() {
return rendererNames;
public static List<CustomRegion> collectRegionsFromJson(JSONArray jsonArray) throws JSONException {
List<CustomRegion> customRegions = new ArrayList<>();
Map<String, CustomRegion> flatRegions = new HashMap<>();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject regionJson = jsonArray.getJSONObject(i);
CustomRegion region = CustomRegion.fromJson(regionJson);
flatRegions.put(region.getPath(), region);
}
@Override
public List<String> getRouterNames() {
return routerNames;
for (CustomRegion region : flatRegions.values()) {
if (!Algorithms.isEmpty(region.getParentPath())) {
CustomRegion parentReg = flatRegions.get(region.getParentPath());
if (parentReg != null) {
parentReg.addSubregion(region);
}
} else {
customRegions.add(region);
}
}
return customRegions;
}
public void addRouter(String fileName) {
String routerName = Algorithms.getFileWithoutDirs(fileName);
if (!routerNames.contains(routerName)) {
routerNames.add(routerName);
}
}
public void addRenderer(String fileName) {
String rendererName = Algorithms.getFileWithoutDirs(fileName);
if (!rendererNames.contains(rendererName)) {
rendererNames.add(rendererName);
}
}
public void loadResources() {
File pluginResDir = getPluginResDir();
@ -398,28 +416,25 @@ public class CustomOsmandPlugin extends OsmandPlugin {
}
}
private Drawable getIconForFile(String path, Map<String, String> fileNames) {
for (Map.Entry<String, String> entry : fileNames.entrySet()) {
String value = entry.getValue();
if (value.startsWith("@")) {
value = value.substring(1);
}
if (path.endsWith(value)) {
return BitmapDrawable.createFromPath(path);
}
}
return null;
public void updateSuggestedDownloads(List<SuggestedDownloadItem> items) {
suggestedDownloadItems = new ArrayList<>(items);
}
@NonNull
@Override
public Drawable getLogoResource() {
return icon != null ? icon : super.getLogoResource();
public void updateDownloadItems(List<WorldRegion> items) {
customRegions = new ArrayList<>(items);
}
@Override
public Drawable getAssetResourceImage() {
return image;
private List<IndexItem> getMapsForType(LatLon latLon, DownloadActivityType type) {
try {
return DownloadResources.findIndexItemsAt(app, latLon, type);
} catch (IOException e) {
LOG.error(e);
}
return Collections.emptyList();
}
private List<IndexItem> getMapsForType(List<String> names, DownloadActivityType type, int limit) {
return DownloadResources.findIndexItemsAt(app, names, type, false, limit);
}
public interface PluginItemsListener {
@ -427,4 +442,35 @@ public class CustomOsmandPlugin extends OsmandPlugin {
void onItemsRemoved();
}
public static class SuggestedDownloadItem {
private String scopeId;
private String searchType;
private List<String> names;
private int limit;
public SuggestedDownloadItem(String scopeId, String searchType, List<String> names, int limit) {
this.scopeId = scopeId;
this.limit = limit;
this.searchType = searchType;
this.names = names;
}
public String getScopeId() {
return scopeId;
}
public String getSearchType() {
return searchType;
}
public List<String> getNames() {
return names;
}
public int getLimit() {
return limit;
}
}
}

View file

@ -0,0 +1,183 @@
package net.osmand.plus;
import androidx.annotation.ColorInt;
import androidx.annotation.Nullable;
import net.osmand.JsonUtils;
import net.osmand.PlatformUtil;
import net.osmand.map.WorldRegion;
import net.osmand.plus.download.CustomIndexItem;
import net.osmand.plus.download.DownloadActivityType;
import net.osmand.plus.download.IndexItem;
import net.osmand.plus.download.ui.DownloadDescriptionInfo;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CustomRegion extends WorldRegion {
private static final Log LOG = PlatformUtil.getLog(CustomRegion.class);
private String scopeId;
private String path;
private String parentPath;
private String type;
private String subfolder;
private JSONArray downloadItemsJson;
private DownloadDescriptionInfo descriptionInfo;
private Map<String, String> names = new HashMap<>();
private Map<String, String> icons = new HashMap<>();
private Map<String, String> headers = new HashMap<>();
private int headerColor = -1;
private CustomRegion(String scopeId, String path, String type) {
super(path, null);
this.scopeId = scopeId;
this.path = path;
this.type = type;
}
public String getScopeId() {
return scopeId;
}
public String getPath() {
return path;
}
public String getParentPath() {
return parentPath;
}
@ColorInt
public int getHeaderColor() {
return headerColor;
}
@Nullable
public DownloadDescriptionInfo getDescriptionInfo() {
return descriptionInfo;
}
public static CustomRegion fromJson(JSONObject object) throws JSONException {
String scopeId = object.optString("scope-id", null);
String path = object.optString("path", null);
String type = object.optString("type", null);
CustomRegion region = new CustomRegion(scopeId, path, type);
region.subfolder = object.optString("subfolder", null);
int index = path.lastIndexOf(File.separator);
if (index != -1) {
region.parentPath = path.substring(0, index);
}
region.names = JsonUtils.getLocalizedMapFromJson("name", object);
if (!Algorithms.isEmpty(region.names)) {
region.regionName = region.names.get("");
region.regionNameEn = region.names.get("");
region.regionFullName = region.names.get("");
region.regionNameLocale = region.names.get("");
}
region.icons = JsonUtils.getLocalizedMapFromJson("icon", object);
region.headers = JsonUtils.getLocalizedMapFromJson("header", object);
region.downloadItemsJson = object.optJSONArray("items");
String headerColor = object.optString("header-color", null);
try {
region.headerColor = Algorithms.isEmpty(headerColor) ? 0 : Algorithms.parseColor(headerColor);
} catch (IllegalArgumentException e) {
region.headerColor = 0;
}
region.descriptionInfo = DownloadDescriptionInfo.fromJson(object.optJSONObject("description"));
return region;
}
public JSONObject toJson() throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.putOpt("scope-id", scopeId);
jsonObject.putOpt("path", path);
jsonObject.putOpt("type", type);
jsonObject.putOpt("subfolder", subfolder);
JsonUtils.writeLocalizedMapToJson("name", jsonObject, names);
JsonUtils.writeLocalizedMapToJson("icon", jsonObject, icons);
JsonUtils.writeLocalizedMapToJson("header", jsonObject, headers);
if (descriptionInfo != null) {
jsonObject.putOpt("description", descriptionInfo.toJson());
}
jsonObject.putOpt("items", downloadItemsJson);
return jsonObject;
}
public List<IndexItem> loadIndexItems() {
List<IndexItem> items = new ArrayList<>();
if (downloadItemsJson != null) {
try {
for (int i = 0; i < downloadItemsJson.length(); i++) {
JSONObject itemJson = downloadItemsJson.getJSONObject(i);
long timestamp = itemJson.optLong("timestamp") * 1000;
long contentSize = itemJson.optLong("contentSize");
long containerSize = itemJson.optLong("containerSize");
String indexType = itemJson.optString("type", type);
String webUrl = itemJson.optString("weburl");
String fileName = itemJson.optString("filename");
String downloadUrl = itemJson.optString("downloadurl");
String size = new DecimalFormat("#.#").format(containerSize / (1024f * 1024f));
List<String> descrImageUrl = JsonUtils.jsonArrayToList("image-description-url", itemJson);
Map<String, String> indexNames = JsonUtils.getLocalizedMapFromJson("name", itemJson);
Map<String, String> descriptions = JsonUtils.getLocalizedMapFromJson("description", itemJson);
Map<String, String> webButtonText = JsonUtils.getLocalizedMapFromJson("web-button-text", itemJson);
DownloadActivityType type = DownloadActivityType.getIndexType(indexType);
if (type != null) {
IndexItem indexItem = new CustomIndexItem.CustomIndexItemBuilder()
.setFileName(fileName)
.setSubfolder(subfolder)
.setDownloadUrl(downloadUrl)
.setNames(indexNames)
.setDescriptions(descriptions)
.setImageDescrUrl(descrImageUrl)
.setWebUrl(webUrl)
.setWebButtonText(webButtonText)
.setTimestamp(timestamp)
.setSize(size)
.setContentSize(contentSize)
.setContainerSize(containerSize)
.setType(type)
.create();
items.add(indexItem);
}
}
} catch (JSONException e) {
LOG.error(e);
}
}
return items;
}
}

View file

@ -17,6 +17,7 @@ import net.osmand.GPXUtilities.Track;
import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.IProgress;
import net.osmand.IndexConstants;
import net.osmand.PlatformUtil;
import net.osmand.data.LatLon;
import net.osmand.plus.GPXDatabase.GpxDataItem;
@ -241,7 +242,7 @@ public class GpxSelectionHelper {
if (i >= 0) {
name = name.substring(i + 1);
}
if (name.toLowerCase().endsWith(".gpx")) {
if (name.toLowerCase().endsWith(IndexConstants.GPX_FILE_EXT)) {
name = name.substring(0, name.length() - 4);
}
name = name.replace('_', ' ');

View file

@ -1009,10 +1009,10 @@ public class MapMarkersHelper {
if (!dir.exists()) {
dir.mkdirs();
}
File fout = new File(dir, fileName + ".gpx");
File fout = new File(dir, fileName + IndexConstants.GPX_FILE_EXT);
int ind = 1;
while (fout.exists()) {
fout = new File(dir, fileName + "_" + (++ind) + ".gpx");
fout = new File(dir, fileName + "_" + (++ind) + IndexConstants.GPX_FILE_EXT);
}
GPXFile file = new GPXFile(Version.getFullVersion(ctx));
for (MapMarker marker : mapMarkers) {

View file

@ -67,8 +67,6 @@ public class OsmAndAppCustomization {
private Map<String, Bitmap> navDrawerLogos = new HashMap<>();
private ArrayList<String> navDrawerParams;
private String navDrawerFooterIntent;
private String navDrawerFooterAppName;
private String navDrawerFooterPackageName;
@ -254,8 +252,8 @@ public class OsmAndAppCustomization {
}
@Nullable
public ArrayList<String> getNavDrawerLogoParams() {
return navDrawerParams;
public String getNavDrawerLogoUrl() {
return app.getSettings().NAV_DRAWER_URL.get();
}
public boolean setNavDrawerLogo(String uri, @Nullable String packageName, @Nullable String intent) {
@ -300,10 +298,8 @@ public class OsmAndAppCustomization {
} catch (IOException e) {
LOG.error("Failed to write file", e);
}
if (packageName != null && intent != null) {
navDrawerParams = new ArrayList<>();
navDrawerParams.add(packageName);
navDrawerParams.add(intent);
if (!Algorithms.isEmpty(intent)) {
app.getSettings().NAV_DRAWER_LOGO.set(intent);
}
}
return true;

View file

@ -4,12 +4,14 @@ package net.osmand.plus;
import android.app.Activity;
import android.content.DialogInterface;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.view.ContextThemeWrapper;
import androidx.core.content.ContextCompat;
import com.google.android.material.slider.Slider;
import net.osmand.CallbackWithObject;
import net.osmand.GPXUtilities;
@ -55,15 +57,17 @@ public class OsmAndLocationSimulation {
if (useGpx) {
boolean nightMode = app.getDaynightHelper().isNightModeForMapControls();
int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
ApplicationMode appMode = app.getSettings().getApplicationMode();
int selectedModeColor = ContextCompat.getColor(app, appMode.getIconColorInfo().getColor(nightMode));
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(ma, themeRes));
builder.setTitle(R.string.animate_route);
final View view = ma.getLayoutInflater().inflate(R.layout.animate_route, null);
((TextView) view.findViewById(R.id.MinSpeedup)).setText("1"); //$NON-NLS-1$
((TextView) view.findViewById(R.id.MaxSpeedup)).setText("4"); //$NON-NLS-1$
final SeekBar speedup = (SeekBar) view.findViewById(R.id.Speedup);
speedup.setMax(3);
UiUtilities.setupSeekBar(app, speedup, nightMode, true);
final Slider speedup = (Slider) view.findViewById(R.id.Speedup);
speedup.setValueTo(3);
UiUtilities.setupSlider(speedup, nightMode, selectedModeColor, true);
builder.setView(view);
builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
@ -74,7 +78,7 @@ public class OsmAndLocationSimulation {
@Override
public boolean processResult(GPXUtilities.GPXFile[] result) {
GPXRouteParamsBuilder builder = new GPXRouteParamsBuilder(result[0], app.getSettings());
startAnimationThread(app, builder.getPoints(), true, speedup.getProgress() + 1);
startAnimationThread(app, builder.getPoints(), true, speedup.getValue() + 1);
if (runnable != null) {
runnable.run();
}

View file

@ -35,6 +35,7 @@ import net.osmand.access.AccessibilityPlugin;
import net.osmand.aidl.OsmandAidlApi;
import net.osmand.data.LatLon;
import net.osmand.map.OsmandRegions;
import net.osmand.map.TileSourceManager;
import net.osmand.map.WorldRegion;
import net.osmand.osm.MapPoiTypes;
import net.osmand.osm.io.NetworkUtils;
@ -187,7 +188,15 @@ public class OsmandApplication extends MultiDexApplication {
externalStorageDirectory = osmandSettings.getInternalAppPath();
}
Algorithms.removeAllFiles(this.getAppPath(IndexConstants.TEMP_DIR));
Algorithms.removeAllFiles(getAppPath(IndexConstants.TEMP_DIR));
if (appInitializer.isAppVersionChanged()) {
// Reset mapillary tile sources
File tilesPath = getAppPath(IndexConstants.TILES_INDEX_DIR);
File mapillaryRasterTilesPath = new File(tilesPath, TileSourceManager.getMapillaryRasterSource().getName());
File mapillaryVectorTilesPath = new File(tilesPath, TileSourceManager.getMapillaryVectorSource().getName());
Algorithms.removeAllFiles(mapillaryRasterTilesPath);
Algorithms.removeAllFiles(mapillaryVectorTilesPath);
}
checkPreferredLocale();
appInitializer.onCreateApplication();

View file

@ -21,6 +21,7 @@ import net.osmand.IProgress;
import net.osmand.Location;
import net.osmand.PlatformUtil;
import net.osmand.access.AccessibilityPlugin;
import net.osmand.map.WorldRegion;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.TabActivity.TabItem;
import net.osmand.plus.api.SettingsAPI;
@ -84,7 +85,7 @@ public abstract class OsmandPlugin {
public abstract String getName();
public abstract String getDescription();
public abstract CharSequence getDescription();
@Nullable
public Drawable getAssetResourceImage() {
@ -182,6 +183,10 @@ public abstract class OsmandPlugin {
return Collections.emptyList();
}
public List<WorldRegion> getDownloadMaps() {
return Collections.emptyList();
}
public List<String> getRendererNames() {
return Collections.emptyList();
}
@ -645,6 +650,31 @@ public abstract class OsmandPlugin {
return null;
}
public static List<WorldRegion> getCustomDownloadRegions() {
List<WorldRegion> l = new ArrayList<>();
for (OsmandPlugin plugin : getEnabledPlugins()) {
l.addAll(plugin.getDownloadMaps());
}
return l;
}
public static List<IndexItem> getCustomDownloadItems() {
List<IndexItem> l = new ArrayList<>();
for (WorldRegion region : getCustomDownloadRegions()) {
collectIndexItemsFromSubregion(region, l);
}
return l;
}
public static void collectIndexItemsFromSubregion(WorldRegion region, List<IndexItem> items) {
if (region instanceof CustomRegion) {
items.addAll(((CustomRegion) region).loadIndexItems());
}
for (WorldRegion subregion : region.getSubregions()) {
collectIndexItemsFromSubregion(subregion, items);
}
}
public static List<String> getDisabledRendererNames() {
List<String> l = new ArrayList<String>();
for (OsmandPlugin plugin : getNotEnabledPlugins()) {

View file

@ -1453,7 +1453,8 @@ public class OsmandSettings {
public final CommonPreference<String> API_NAV_DRAWER_ITEMS_JSON = new StringPreference("api_nav_drawer_items_json", "{}").makeGlobal();
public final CommonPreference<String> API_CONNECTED_APPS_JSON = new StringPreference("api_connected_apps_json", "[]").makeGlobal();
public final CommonPreference<String> NAV_DRAWER_LOGO = new StringPreference("nav_drawer_logo", "").makeProfile();
public final CommonPreference<String> NAV_DRAWER_LOGO = new StringPreference("drawer_logo", "").makeProfile();
public final CommonPreference<String> NAV_DRAWER_URL = new StringPreference("drawer_url", "").makeProfile();
public final CommonPreference<Integer> NUMBER_OF_STARTS_FIRST_XMAS_SHOWN = new IntPreference("number_of_starts_first_xmas_shown", 0).makeGlobal();

View file

@ -16,10 +16,12 @@ import net.osmand.PlatformUtil;
import net.osmand.data.LatLon;
import net.osmand.map.ITileSource;
import net.osmand.map.TileSourceManager;
import net.osmand.map.WorldRegion;
import net.osmand.osm.MapPoiTypes;
import net.osmand.osm.PoiCategory;
import net.osmand.plus.ApplicationMode.ApplicationModeBean;
import net.osmand.plus.ApplicationMode.ApplicationModeBuilder;
import net.osmand.plus.CustomOsmandPlugin.SuggestedDownloadItem;
import net.osmand.plus.OsmandSettings.OsmandPreference;
import net.osmand.plus.helpers.AvoidSpecificRoads;
import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo;
@ -131,7 +133,9 @@ public class SettingsHelper {
QUICK_ACTIONS,
POI_UI_FILTERS,
MAP_SOURCES,
AVOID_ROADS
AVOID_ROADS,
SUGGESTED_DOWNLOADS,
DOWNLOADS
}
public abstract static class SettingsItem {
@ -410,6 +414,10 @@ public class SettingsHelper {
} else if (fileItem.getSubtype() == FileSettingsItem.FileSubtype.OTHER) {
plugin.setResourceDirName(item.getFileName());
}
} else if (item instanceof SuggestedDownloadsItem) {
plugin.updateSuggestedDownloads(((SuggestedDownloadsItem) item).getItems());
} else if (item instanceof DownloadsItem) {
plugin.updateDownloadItems(((DownloadsItem) item).getItems());
}
}
OsmandPlugin.addCustomPlugin(app, plugin);
@ -441,6 +449,199 @@ public class SettingsHelper {
}
}
public static class SuggestedDownloadsItem extends SettingsItem {
private List<SuggestedDownloadItem> items;
SuggestedDownloadsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
super(app, json);
}
@Override
protected void init() {
super.init();
items = new ArrayList<>();
}
@NonNull
@Override
public SettingsItemType getType() {
return SettingsItemType.SUGGESTED_DOWNLOADS;
}
@NonNull
@Override
public String getName() {
return "suggested_downloads";
}
@NonNull
@Override
public String getPublicName(@NonNull Context ctx) {
return "suggested_downloads";
}
public List<SuggestedDownloadItem> getItems() {
return items;
}
@Override
void readItemsFromJson(@NonNull JSONObject json) throws IllegalArgumentException {
try {
if (!json.has("items")) {
return;
}
JSONArray jsonArray = json.getJSONArray("items");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
String scopeId = object.optString("scope-id");
String searchType = object.optString("search-type");
int limit = object.optInt("limit", -1);
List<String> names = new ArrayList<>();
if (object.has("names")) {
JSONArray namesArray = object.getJSONArray("names");
for (int j = 0; j < namesArray.length(); j++) {
names.add(namesArray.getString(j));
}
}
SuggestedDownloadItem suggestedDownload = new SuggestedDownloadItem(scopeId, searchType, names, limit);
items.add(suggestedDownload);
}
} catch (JSONException e) {
warnings.add(app.getString(R.string.settings_item_read_error, String.valueOf(getType())));
throw new IllegalArgumentException("Json parse error", e);
}
}
@Override
void writeItemsToJson(@NonNull JSONObject json) {
JSONArray jsonArray = new JSONArray();
if (!items.isEmpty()) {
try {
for (SuggestedDownloadItem downloadItem : items) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("scope-id", downloadItem.getScopeId());
if (downloadItem.getLimit() != -1) {
jsonObject.put("limit", downloadItem.getLimit());
}
if (!Algorithms.isEmpty(downloadItem.getSearchType())) {
jsonObject.put("search-type", downloadItem.getSearchType());
}
if (!Algorithms.isEmpty(downloadItem.getNames())) {
JSONArray namesArray = new JSONArray();
for (String downloadName : downloadItem.getNames()) {
namesArray.put(downloadName);
}
jsonObject.put("names", namesArray);
}
jsonArray.put(jsonObject);
}
json.put("items", jsonArray);
} catch (JSONException e) {
warnings.add(app.getString(R.string.settings_item_write_error, String.valueOf(getType())));
LOG.error("Failed write to json", e);
}
}
}
@Nullable
@Override
SettingsItemReader getReader() {
return null;
}
@Nullable
@Override
SettingsItemWriter getWriter() {
return null;
}
}
public static class DownloadsItem extends SettingsItem {
private List<WorldRegion> items;
DownloadsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
super(app, json);
}
@Override
protected void init() {
super.init();
items = new ArrayList<>();
}
@NonNull
@Override
public SettingsItemType getType() {
return SettingsItemType.DOWNLOADS;
}
@NonNull
@Override
public String getName() {
return "downloads";
}
@NonNull
@Override
public String getPublicName(@NonNull Context ctx) {
return "downloads";
}
public List<WorldRegion> getItems() {
return items;
}
@Override
void readItemsFromJson(@NonNull JSONObject json) throws IllegalArgumentException {
try {
if (!json.has("items")) {
return;
}
JSONArray jsonArray = json.getJSONArray("items");
items.addAll(CustomOsmandPlugin.collectRegionsFromJson(jsonArray));
} catch (JSONException e) {
warnings.add(app.getString(R.string.settings_item_read_error, String.valueOf(getType())));
throw new IllegalArgumentException("Json parse error", e);
}
}
@Override
void writeItemsToJson(@NonNull JSONObject json) {
JSONArray jsonArray = new JSONArray();
if (!items.isEmpty()) {
try {
for (WorldRegion region : items) {
if (region instanceof CustomRegion) {
JSONObject regionJson = ((CustomRegion) region).toJson();
jsonArray.put(regionJson);
}
}
json.put("items", jsonArray);
} catch (JSONException e) {
warnings.add(app.getString(R.string.settings_item_write_error, String.valueOf(getType())));
LOG.error("Failed write to json", e);
}
}
}
@Nullable
@Override
SettingsItemReader getReader() {
return null;
}
@Nullable
@Override
SettingsItemWriter getWriter() {
return null;
}
}
public abstract static class CollectionSettingsItem<T> extends SettingsItem {
protected List<T> items;
@ -780,8 +981,9 @@ public class SettingsHelper {
@Override
void readItemsFromJson(@NonNull JSONObject json) throws IllegalArgumentException {
JSONObject prefsJson = json.optJSONObject("prefs");
try {
JSONObject drawerLogoJson = json.has("drawerLogo") ? json.getJSONObject("drawerLogo") : null;
JSONObject drawerLogoJson = prefsJson.optJSONObject("drawer_logo");
if (drawerLogoJson != null) {
for (Iterator<String> it = drawerLogoJson.keys(); it.hasNext(); ) {
String localeKey = it.next();
@ -2095,6 +2297,12 @@ public class SettingsHelper {
case AVOID_ROADS:
item = new AvoidRoadsSettingsItem(app, json);
break;
case SUGGESTED_DOWNLOADS:
item = new SuggestedDownloadsItem(app, json);
break;
case DOWNLOADS:
item = new DownloadsItem(app, json);
break;
}
return item;
}

View file

@ -39,6 +39,7 @@ import androidx.core.view.ViewCompat;
import androidx.core.widget.TintableCompoundButton;
import com.google.android.material.snackbar.BaseTransientBottomBar;
import com.google.android.material.slider.Slider;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.snackbar.SnackbarContentLayout;
@ -496,31 +497,56 @@ public class UiUtilities {
compoundButton.setBackgroundColor(Color.TRANSPARENT);
}
public static void setupSeekBar(@NonNull OsmandApplication app, @NonNull SeekBar seekBar,
boolean nightMode, boolean profileDependent) {
int activeColor = ContextCompat.getColor(app, profileDependent ?
app.getSettings().APPLICATION_MODE.get().getIconColorInfo().getColor(nightMode) :
nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light);
setupSeekBar(seekBar, activeColor, nightMode);
public static ViewGroup createSliderView(@NonNull Context ctx, boolean nightMode) {
return (ViewGroup) getInflater(ctx, nightMode).inflate(R.layout.slider, null, false);
}
public static void setupSeekBar(@NonNull SeekBar seekBar, @ColorInt int activeColor, boolean nightMode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
int backgroundColor = ContextCompat.getColor(seekBar.getContext(), nightMode
? R.color.icon_color_secondary_dark : R.color.icon_color_default_light);
if (seekBar.getProgressDrawable() instanceof LayerDrawable) {
LayerDrawable progressDrawable = (LayerDrawable) seekBar.getProgressDrawable();
Drawable background = progressDrawable.findDrawableByLayerId(android.R.id.background);
if (background != null) {
background.setColorFilter(backgroundColor, PorterDuff.Mode.SRC_IN);
public static void setupSlider(Slider slider, boolean nightMode, @ColorInt Integer activeColor) {
setupSlider(slider, nightMode, activeColor, false);
}
Drawable progress = progressDrawable.findDrawableByLayerId(android.R.id.progress);
if (progress != null) {
progress.setColorFilter(activeColor, PorterDuff.Mode.SRC_IN);
public static void setupSlider(Slider slider, boolean nightMode,
@ColorInt Integer activeColor, boolean showTicks) {
Context ctx = slider.getContext();
if (ctx == null) {
return;
}
int themeId = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
ctx = new ContextThemeWrapper(ctx, themeId);
// colors
int[][] states = new int[][] {
new int[] {android.R.attr.state_enabled},
new int[] {-android.R.attr.state_enabled}
};
if (activeColor == null) {
activeColor = AndroidUtils.getColorFromAttr(ctx, R.attr.active_color_basic);
}
seekBar.getThumb().setColorFilter(activeColor, PorterDuff.Mode.SRC_IN);
}
int activeDisableColor = getColorWithAlpha(activeColor, 0.25f);
ColorStateList activeCsl = new ColorStateList(states,
new int[] {activeColor, activeDisableColor});
int inactiveColor = AndroidUtils.getColorFromAttr(ctx, R.attr.default_icon_color);
ColorStateList inactiveCsl = new ColorStateList(states,
new int[] {inactiveColor, inactiveColor});
slider.setTrackColorActive(activeCsl);
slider.setTrackColorInactive(inactiveCsl);
slider.setHaloColor(activeCsl);
slider.setThumbColor(activeCsl);
int ticksColor = showTicks ? ContextCompat.getColor(ctx,
nightMode ? R.color.color_black : R.color.color_white) :
Color.TRANSPARENT;
slider.setTickColor(new ColorStateList(states, new int[] {ticksColor, ticksColor}));
// sizes
int thumbRadius = ctx.getResources().getDimensionPixelSize(R.dimen.slider_thumb_size);
int haloRadius = ctx.getResources().getDimensionPixelSize(R.dimen.slider_thumb_halo_size);
int trackHeight = ctx.getResources().getDimensionPixelSize(R.dimen.slider_track_height);
slider.setThumbRadius(thumbRadius);
slider.setHaloRadius(haloRadius);
slider.setTrackHeight(trackHeight);
// label behavior
slider.setLabelBehavior(Slider.LABEL_GONE);
}
public static void setupDialogButton(boolean nightMode, View buttonView, DialogButtonType buttonType, @StringRes int buttonTextId) {

View file

@ -5,12 +5,14 @@ import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import com.google.android.material.slider.Slider;
import net.osmand.PlatformUtil;
import net.osmand.data.QuadRect;
import net.osmand.data.RotatedTileBox;
@ -71,37 +73,28 @@ public class DownloadTilesDialog {
((TextView)view.findViewById(R.id.MinZoom)).setText(zoom+""); //$NON-NLS-1$
((TextView)view.findViewById(R.id.MaxZoom)).setText(max+""); //$NON-NLS-1$
final SeekBar seekBar = (SeekBar) view.findViewById(R.id.ZoomToDownload);
seekBar.setMax(max - zoom);
seekBar.setProgress((max - zoom) / 2);
final Slider slider = (Slider) view.findViewById(R.id.ZoomToDownload);
slider.setValueTo(max - zoom);
int progress = (max - zoom) / 2;
slider.setValue(progress);
final TextView downloadText = ((TextView) view.findViewById(R.id.DownloadDescription));
final String template = ctx.getString(R.string.tiles_to_download_estimated_size);
updateLabel(zoom, rb.getLatLonBounds(), downloadText, template, seekBar.getProgress());
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
updateLabel(zoom, rb.getLatLonBounds(), downloadText, template, (int) slider.getValue());
slider.addOnChangeListener(new Slider.OnChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
updateLabel(zoom, rb.getLatLonBounds(), downloadText, template, progress);
public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) {
updateLabel(zoom, rb.getLatLonBounds(), downloadText, template, (int) value);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
builder.setPositiveButton(R.string.shared_string_download, new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
run(zoom, seekBar.getProgress(), rb.getLatLonBounds(), mapSource);
run(zoom, (int) slider.getValue(), rb.getLatLonBounds(), mapSource);
}
});
builder.setNegativeButton(R.string.shared_string_cancel, null);

View file

@ -6,6 +6,7 @@ import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
@ -55,6 +56,7 @@ import net.osmand.plus.dialogs.FavoriteDialogs;
import net.osmand.plus.download.IndexItem;
import net.osmand.plus.liveupdates.OsmLiveActivity;
import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment;
import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment.ContextMenuItemClickListener;
import net.osmand.plus.mapmarkers.MapMarkersDialogFragment;
import net.osmand.plus.mapmarkers.MarkersPlanRouteContext;
import net.osmand.plus.measurementtool.MeasurementToolFragment;
@ -64,11 +66,11 @@ import net.osmand.plus.routepreparationmenu.WaypointsFragment;
import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.settings.BaseSettingsFragment;
import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment.ContextMenuItemClickListener;
import net.osmand.plus.views.BaseMapLayer;
import net.osmand.plus.views.MapControlsLayer;
import net.osmand.plus.views.MapTileLayer;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.wikipedia.WikipediaDialogFragment;
import net.osmand.plus.wikivoyage.WikivoyageWelcomeDialogFragment;
import net.osmand.plus.wikivoyage.data.TravelDbHelper;
import net.osmand.plus.wikivoyage.explore.WikivoyageExploreActivity;
@ -83,6 +85,7 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static net.osmand.IndexConstants.GPX_FILE_EXT;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_CONFIGURE_MAP_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_CONFIGURE_SCREEN_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_DASHBOARD_ID;
@ -111,7 +114,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.helpers.ImportHelper.GPX_SUFFIX;
public class MapActivityActions implements DialogProvider {
@ -282,8 +284,8 @@ public class MapActivityActions implements DialogProvider {
fileDir.mkdirs();
File toSave = fileDir;
if (name.length() > 0) {
if (!name.endsWith(GPX_SUFFIX)) {
name += GPX_SUFFIX;
if (!name.endsWith(GPX_FILE_EXT)) {
name += GPX_FILE_EXT;
}
toSave = new File(fileDir, name);
}
@ -320,7 +322,7 @@ public class MapActivityActions implements DialogProvider {
if (params.length > 0) {
File file = params[0];
String fileName = file.getName();
GPXFile gpx = app.getRoutingHelper().generateGPXFileWithRoute(fileName.substring(0,fileName.length()-GPX_SUFFIX.length()));
GPXFile gpx = app.getRoutingHelper().generateGPXFileWithRoute(fileName.substring(0,fileName.length()-GPX_FILE_EXT.length()));
GPXUtilities.writeGpxFile(file, gpx);
return app.getString(R.string.route_successfully_saved_at, file.getName());
}
@ -1144,28 +1146,8 @@ public class MapActivityActions implements DialogProvider {
menu.show();
}
public void restoreOrReturnDialog(final String packageName) {
AlertDialog.Builder builder = new AlertDialog.Builder(mapActivity);
builder.setTitle("Restore OsmAnd");
builder.setMessage("Do you want to Restore OsmAnd or get back to the Client App?");
builder.setPositiveButton("Restore", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
restoreOsmand();
}
});
builder.setNeutralButton("Return", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
executeHeadersIntent(packageName);
}
});
builder.setNegativeButton("Cancel", null);
builder.show();
}
protected void updateDrawerMenu() {
boolean nightMode = getMyApplication().getDaynightHelper().isNightModeForMapControls();
final boolean nightMode = getMyApplication().getDaynightHelper().isNightModeForMapControls();
final ListView menuItemsListView = (ListView) mapActivity.findViewById(R.id.menuItems);
if (nightMode) {
menuItemsListView.setBackgroundColor(ContextCompat.getColor(mapActivity, R.color.list_background_color_dark));
@ -1174,7 +1156,6 @@ public class MapActivityActions implements DialogProvider {
}
menuItemsListView.removeHeaderView(drawerLogoHeader);
Bitmap navDrawerLogo = getMyApplication().getAppCustomization().getNavDrawerLogo();
final ArrayList<String> navDrawerLogoParams = getMyApplication().getAppCustomization().getNavDrawerLogoParams();
if (navDrawerLogo != null) {
drawerLogoHeader.setImageBitmap(navDrawerLogo);
@ -1193,8 +1174,9 @@ public class MapActivityActions implements DialogProvider {
boolean hasHeader = menuItemsListView.getHeaderViewsCount() > 0;
boolean hasFooter = menuItemsListView.getFooterViewsCount() > 0;
if (hasHeader && position == 0 || (hasFooter && position == menuItemsListView.getCount() - 1)) {
if (navDrawerLogoParams != null) {
executeHeadersIntent(navDrawerLogoParams.get(0));
String drawerLogoParams = getMyApplication().getAppCustomization().getNavDrawerLogoUrl();
if (!Algorithms.isEmpty(drawerLogoParams)) {
WikipediaDialogFragment.showFullArticle(mapActivity, Uri.parse(drawerLogoParams), nightMode);
}
} else {
position -= menuItemsListView.getHeaderViewsCount();
@ -1209,20 +1191,4 @@ public class MapActivityActions implements DialogProvider {
});
}
private void executeHeadersIntent(String packageName) {
Intent launchIntent = mapActivity.getPackageManager().getLaunchIntentForPackage(packageName);
if(launchIntent!=null) mapActivity.startActivity(launchIntent);
mapActivity.closeDrawer();
}
private void showReturnConfirmationDialog(String packageName) {
restoreOrReturnDialog(packageName);
mapActivity.closeDrawer();
}
private void restoreOsmand(){
getMyApplication().getAppCustomization().restoreOsmand();
mapActivity.closeDrawer();
}
}

View file

@ -7,6 +7,7 @@ import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
@ -15,9 +16,11 @@ import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import net.osmand.AndroidUtils;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
@ -74,6 +77,14 @@ public class PluginActivity extends OsmandActionBarActivity implements Download
TextView descriptionView = (TextView) findViewById(R.id.plugin_description);
descriptionView.setText(plugin.getDescription());
boolean light = getMyApplication().getSettings().isLightContent();
int linkTextColor = ContextCompat.getColor(this,
light ? R.color.ctx_menu_bottom_view_url_color_light : R.color.ctx_menu_bottom_view_url_color_dark);
descriptionView.setLinkTextColor(linkTextColor);
descriptionView.setMovementMethod(LinkMovementMethod.getInstance());
AndroidUtils.removeLinkUnderline(descriptionView);
Button settingsButton = (Button) findViewById(R.id.plugin_settings);
settingsButton.setOnClickListener(new View.OnClickListener() {
@Override

View file

@ -5,6 +5,7 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@ -17,6 +18,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.PopupMenu;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import net.osmand.AndroidUtils;
@ -182,6 +184,14 @@ public class PluginsActivity extends OsmandListActivity implements DownloadIndex
name = plugin.getName();
pluginDescription.setText(plugin.getDescription());
boolean light = getMyApplication().getSettings().isLightContent();
int linkTextColor = ContextCompat.getColor(PluginsActivity.this,
light ? R.color.ctx_menu_bottom_view_url_color_light : R.color.ctx_menu_bottom_view_url_color_dark);
pluginDescription.setLinkTextColor(linkTextColor);
pluginDescription.setMovementMethod(LinkMovementMethod.getInstance());
AndroidUtils.removeLinkUnderline(pluginDescription);
OsmandApplication app = getMyApplication();
int color = AndroidUtils.getColorFromAttr(app, R.attr.list_background_color);
pluginLogo.setImageDrawable(UiUtilities.tintDrawable(plugin.getLogoResource(), color));

View file

@ -5,6 +5,7 @@ import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.format.DateFormat;
import net.osmand.IndexConstants;
import net.osmand.PlatformUtil;
import net.osmand.data.LatLon;
import net.osmand.plus.GPXDatabase.GpxDataItem;
@ -209,7 +210,7 @@ public class SavingTrackHelper extends SQLiteOpenHelper {
// save file
for (final String f : data.keySet()) {
log.debug("Filename: " + f);
File fout = new File(dir, f + ".gpx"); //$NON-NLS-1$
File fout = new File(dir, f + IndexConstants.GPX_FILE_EXT);
if (!data.get(f).isEmpty()) {
WptPt pt = data.get(f).findPointToShow();
String fileName = f + "_" + new SimpleDateFormat("HH-mm_EEE", Locale.US).format(new Date(pt.time)); //$NON-NLS-1$
@ -227,10 +228,10 @@ public class SavingTrackHelper extends SQLiteOpenHelper {
}
}
filenames.add(fileName);
fout = new File(dir, fileName + ".gpx"); //$NON-NLS-1$
fout = new File(dir, fileName + IndexConstants.GPX_FILE_EXT);
int ind = 1;
while (fout.exists()) {
fout = new File(dir, fileName + "_" + (++ind) + ".gpx"); //$NON-NLS-1$ //$NON-NLS-2$
fout = new File(dir, fileName + "_" + (++ind) + IndexConstants.GPX_FILE_EXT); //$NON-NLS-1$
}
}

View file

@ -31,7 +31,6 @@ import net.osmand.plus.OsmandSettings.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.profiles.AppProfileArrayAdapter;
import net.osmand.plus.profiles.ProfileDataObject;
import net.osmand.plus.views.SeekBarPreference;
import org.apache.commons.logging.Log;
@ -61,7 +60,6 @@ public abstract class SettingsBaseActivity extends ActionBarPreferenceActivity
private Map<String, OsmandPreference<Boolean>> booleanPreferences = new LinkedHashMap<String, OsmandPreference<Boolean>>();
private Map<String, OsmandPreference<?>> listPreferences = new LinkedHashMap<String, OsmandPreference<?>>();
private Map<String, OsmandPreference<String>> editTextPreferences = new LinkedHashMap<String, OsmandPreference<String>>();
private Map<String, OsmandPreference<Integer>> seekBarPreferences = new LinkedHashMap<String, OsmandPreference<Integer>>();
private Map<String, Map<String, ?>> listPrefValues = new LinkedHashMap<String, Map<String, ?>>();
@ -115,13 +113,6 @@ public abstract class SettingsBaseActivity extends ActionBarPreferenceActivity
return p;
}
public void registerSeekBarPreference(OsmandPreference<Integer> b, PreferenceScreen screen) {
SeekBarPreference p = (SeekBarPreference) screen.findPreference(b.getId());
p.setOnPreferenceChangeListener(this);
screenPreferences.put(b.getId(), p);
seekBarPreferences.put(b.getId(), b);
}
public static String getRoutingStringPropertyName(Context ctx, String propertyName, String defValue) {
try {
Field f = R.string.class.getField("routing_attr_" + propertyName + "_name");
@ -209,18 +200,6 @@ public abstract class SettingsBaseActivity extends ActionBarPreferenceActivity
return propertyValue;
}
public SeekBarPreference createSeekBarPreference(OsmandPreference<Integer> b, int title, int summary, int dialogTextId, int defValue,
int maxValue) {
SeekBarPreference p = new SeekBarPreference(this, dialogTextId, defValue, maxValue);
p.setTitle(title);
p.setKey(b.getId());
p.setSummary(summary);
p.setOnPreferenceChangeListener(this);
screenPreferences.put(b.getId(), p);
seekBarPreferences.put(b.getId(), b);
return p;
}
public <T> void registerListPreference(OsmandPreference<T> b, PreferenceGroup screen, String[] names, T[] values) {
ListPreference p = (ListPreference) screen.findPreference(b.getId());
prepareListPreference(b, names, values, p);
@ -531,11 +510,6 @@ public abstract class SettingsBaseActivity extends ActionBarPreferenceActivity
pref.setChecked(b.get());
}
for (OsmandPreference<Integer> b : seekBarPreferences.values()) {
SeekBarPreference pref = (SeekBarPreference) screenPreferences.get(b.getId());
pref.setValue(b.get());
}
for (OsmandPreference<?> p : listPreferences.values()) {
ListPreference listPref = (ListPreference) screenPreferences.get(p.getId());
Map<String, ?> prefValues = listPrefValues.get(p.getId());
@ -563,13 +537,10 @@ public abstract class SettingsBaseActivity extends ActionBarPreferenceActivity
public boolean onPreferenceChange(Preference preference, Object newValue) {
// handle boolean preferences
OsmandPreference<Boolean> boolPref = booleanPreferences.get(preference.getKey());
OsmandPreference<Integer> seekPref = seekBarPreferences.get(preference.getKey());
OsmandPreference<Object> listPref = (OsmandPreference<Object>) listPreferences.get(preference.getKey());
OsmandPreference<String> editPref = editTextPreferences.get(preference.getKey());
if (boolPref != null) {
boolPref.set((Boolean) newValue);
} else if (seekPref != null) {
seekPref.set((Integer) newValue);
} else if (editPref != null) {
editPref.set((String) newValue);
} else if (listPref != null) {

View file

@ -21,8 +21,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
@ -30,6 +28,8 @@ import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import com.google.android.material.slider.Slider;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuItem;
@ -829,70 +829,71 @@ public class SettingsNavigationActivity extends SettingsBaseActivity {
final int[] minValue, final int[] defaultValue, final int[] maxValue,
final int min, final int max, View seekbarView, final boolean nightMode,
final int activeColor) {
View seekbarLayout;
View sliderLayout;
int titleId;
final int[] speedValue;
switch (type) {
case DEFAULT_SPEED_ONLY:
speedValue = defaultValue;
seekbarLayout = seekbarView.findViewById(R.id.min_speed_layout);
sliderLayout = seekbarView.findViewById(R.id.min_speed_layout);
titleId = R.string.default_speed_setting_title;
break;
case MIN_SPEED:
speedValue = minValue;
seekbarLayout = seekbarView.findViewById(R.id.min_speed_layout);
sliderLayout = seekbarView.findViewById(R.id.min_speed_layout);
titleId = R.string.shared_string_min_speed;
break;
case MAX_SPEED:
speedValue = maxValue;
seekbarLayout = seekbarView.findViewById(R.id.max_speed_layout);
sliderLayout = seekbarView.findViewById(R.id.max_speed_layout);
titleId = R.string.shared_string_max_speed;
break;
default:
speedValue = defaultValue;
seekbarLayout = seekbarView.findViewById(R.id.default_speed_layout);
sliderLayout = seekbarView.findViewById(R.id.default_speed_layout);
titleId = R.string.default_speed_setting_title;
break;
}
final SeekBar speedSeekBar = seekbarLayout.findViewById(R.id.speed_seekbar);
final TextView speedTitleTv = seekbarLayout.findViewById(R.id.speed_title);
final TextView speedMinTv = seekbarLayout.findViewById(R.id.speed_seekbar_min_text);
final TextView speedMaxTv = seekbarLayout.findViewById(R.id.speed_seekbar_max_text);
final TextView speedUnitsTv = seekbarLayout.findViewById(R.id.speed_units);
final TextView speedTv = seekbarLayout.findViewById(R.id.speed_text);
final Slider slider = sliderLayout.findViewById(R.id.speed_slider);
final TextView speedTitleTv = sliderLayout.findViewById(R.id.speed_title);
final TextView speedMinTv = sliderLayout.findViewById(R.id.speed_seekbar_min_text);
final TextView speedMaxTv = sliderLayout.findViewById(R.id.speed_seekbar_max_text);
final TextView speedUnitsTv = sliderLayout.findViewById(R.id.speed_units);
final TextView speedTv = sliderLayout.findViewById(R.id.speed_text);
speedTitleTv.setText(titleId);
speedMinTv.setText(String.valueOf(min));
speedMaxTv.setText(String.valueOf(max));
speedTv.setText(String.valueOf(speedValue[0]));
speedUnitsTv.setText(speedUnits);
speedSeekBar.setMax(max - min);
speedSeekBar.setProgress(Math.max(speedValue[0] - min, 0));
speedSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
slider.setValueTo(max - min);
slider.setValue(Math.max(speedValue[0] - min, 0));
slider.addOnChangeListener(new Slider.OnChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
public void onValueChange(@NonNull Slider slider, float val, boolean fromUser) {
int progress = (int) val;
int value = progress + min;
switch (type) {
case DEFAULT_SPEED:
case DEFAULT_SPEED_ONLY:
if (value > maxValue[0]) {
value = maxValue[0];
speedSeekBar.setProgress(Math.max(value - min, 0));
slider.setValue(Math.max(value - min, 0));
} else if (value < minValue[0]) {
value = minValue[0];
speedSeekBar.setProgress(Math.max(value - min, 0));
slider.setValue(Math.max(value - min, 0));
}
break;
case MIN_SPEED:
if (value > defaultValue[0]) {
value = defaultValue[0];
speedSeekBar.setProgress(Math.max(value - min, 0));
slider.setValue(Math.max(value - min, 0));
}
break;
case MAX_SPEED:
if (value < defaultValue[0]) {
value = defaultValue[0];
speedSeekBar.setProgress(Math.max(value - min, 0));
slider.setValue(Math.max(value - min, 0));
}
break;
default:
@ -901,15 +902,7 @@ public class SettingsNavigationActivity extends SettingsBaseActivity {
speedValue[0] = value;
speedTv.setText(String.valueOf(value));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
UiUtilities.setupSeekBar(speedSeekBar, activeColor, nightMode);
UiUtilities.setupSlider(slider, nightMode, activeColor);
}
}

View file

@ -23,6 +23,7 @@ import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.IndexConstants;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.data.QuadRect;
@ -92,7 +93,7 @@ public class TrackActivity extends TabActivity {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
if (file != null) {
String fn = file.getName().replace(".gpx", "").replace("/", " ").replace("_", " ");
String fn = file.getName().replace(IndexConstants.GPX_FILE_EXT, "").replace("/", " ").replace("_", " ");
actionBar.setTitle(fn);
} else {
actionBar.setTitle(getString(R.string.shared_string_currently_recording_track));

View file

@ -110,8 +110,9 @@ public class BottomSheetItemWithDescription extends SimpleBottomSheetItem {
return this;
}
public void setDescriptionLinksClickable(boolean descriptionLinksClickable) {
public Builder setDescriptionLinksClickable(boolean descriptionLinksClickable) {
this.descriptionLinksClickable = descriptionLinksClickable;
return this;
}
public BottomSheetItemWithDescription create() {

View file

@ -109,6 +109,7 @@ public class PluginInstalledBottomSheetDialog extends MenuBottomSheetDialogFragm
setupHeightAndBackground(getView());
}
})
.setDescriptionLinksClickable(true)
.setDescription(plugin.getDescription())
.setDescriptionMaxLines(COLLAPSED_DESCRIPTION_LINES)
.setLayoutId(R.layout.bottom_sheet_item_with_expandable_descr)

View file

@ -0,0 +1,196 @@
package net.osmand.plus.download;
import android.content.Context;
import androidx.annotation.NonNull;
import net.osmand.JsonUtils;
import net.osmand.map.OsmandRegions;
import net.osmand.plus.OsmandApplication;
import net.osmand.util.Algorithms;
import java.io.File;
import java.util.List;
import java.util.Map;
public class CustomIndexItem extends IndexItem {
private String subfolder;
private String downloadUrl;
private String webUrl;
private List<String> imageDescrUrl;
private Map<String, String> names;
private Map<String, String> descriptions;
private Map<String, String> webButtonTexts;
public CustomIndexItem(String fileName,
String subfolder,
String downloadUrl,
String webUrl,
String size,
long timestamp,
long contentSize,
long containerSize,
List<String> imageDescrUrl,
Map<String, String> names,
Map<String, String> descriptions,
Map<String, String> webButtonTexts,
@NonNull DownloadActivityType type) {
super(fileName, null, timestamp, size, contentSize, containerSize, type);
this.subfolder = subfolder;
this.downloadUrl = downloadUrl;
this.webUrl = webUrl;
this.imageDescrUrl = imageDescrUrl;
this.names = names;
this.descriptions = descriptions;
this.webButtonTexts = webButtonTexts;
}
@Override
public DownloadEntry createDownloadEntry(OsmandApplication ctx) {
DownloadEntry entry = super.createDownloadEntry(ctx);
if (entry != null) {
entry.urlToDownload = downloadUrl;
}
return entry;
}
@Override
public File getTargetFile(OsmandApplication ctx) {
String basename = getTranslatedBasename();
if (!Algorithms.isEmpty(subfolder)) {
basename = subfolder + "/" + basename;
}
return new File(type.getDownloadFolder(ctx, this), basename + type.getUnzipExtension(ctx, this));
}
@Override
public String getVisibleName(Context ctx, OsmandRegions osmandRegions) {
return getVisibleName(ctx, osmandRegions, true);
}
@Override
public String getVisibleName(Context ctx, OsmandRegions osmandRegions, boolean includingParent) {
String name = super.getVisibleName(ctx, osmandRegions, includingParent);
return JsonUtils.getLocalizedResFromMap(ctx, names, name);
}
public List<String> getDescriptionImageUrl() {
return imageDescrUrl;
}
public String getLocalizedDescription(Context ctx) {
String description = super.getDescription();
return JsonUtils.getLocalizedResFromMap(ctx, descriptions, description);
}
public String getWebUrl() {
return webUrl;
}
public String getWebButtonText(Context ctx) {
return JsonUtils.getLocalizedResFromMap(ctx, webButtonTexts, null);
}
public static class CustomIndexItemBuilder {
private String fileName;
private String subfolder;
private String downloadUrl;
private String webUrl;
private String size;
private long timestamp;
private long contentSize;
private long containerSize;
private List<String> imageDescrUrl;
private Map<String, String> names;
private Map<String, String> descriptions;
private Map<String, String> webButtonText;
private DownloadActivityType type;
public CustomIndexItemBuilder setFileName(String fileName) {
this.fileName = fileName;
return this;
}
public CustomIndexItemBuilder setSubfolder(String subfolder) {
this.subfolder = subfolder;
return this;
}
public CustomIndexItemBuilder setDownloadUrl(String downloadUrl) {
this.downloadUrl = downloadUrl;
return this;
}
public CustomIndexItemBuilder setWebUrl(String webUrl) {
this.webUrl = webUrl;
return this;
}
public CustomIndexItemBuilder setSize(String size) {
this.size = size;
return this;
}
public CustomIndexItemBuilder setTimestamp(long timestamp) {
this.timestamp = timestamp;
return this;
}
public CustomIndexItemBuilder setContentSize(long contentSize) {
this.contentSize = contentSize;
return this;
}
public CustomIndexItemBuilder setContainerSize(long containerSize) {
this.containerSize = containerSize;
return this;
}
public CustomIndexItemBuilder setImageDescrUrl(List<String> imageDescrUrl) {
this.imageDescrUrl = imageDescrUrl;
return this;
}
public CustomIndexItemBuilder setNames(Map<String, String> names) {
this.names = names;
return this;
}
public CustomIndexItemBuilder setDescriptions(Map<String, String> descriptions) {
this.descriptions = descriptions;
return this;
}
public CustomIndexItemBuilder setWebButtonText(Map<String, String> webButtonText) {
this.webButtonText = webButtonText;
return this;
}
public CustomIndexItemBuilder setType(@NonNull DownloadActivityType type) {
this.type = type;
return this;
}
public CustomIndexItem create() {
return new CustomIndexItem(fileName,
subfolder,
downloadUrl,
webUrl,
size,
timestamp,
contentSize,
containerSize,
imageDescrUrl,
names,
descriptions,
webButtonText,
type);
}
}
}

View file

@ -51,6 +51,11 @@ public class DownloadActivityType {
new DownloadActivityType(R.string.shared_string_wikivoyage, R.drawable.ic_plugin_wikipedia, "wikivoyage", 65);
public static final DownloadActivityType LIVE_UPDATES_FILE =
new DownloadActivityType(R.string.download_live_updates, "live_updates", 70);
public static final DownloadActivityType GPX_FILE =
new DownloadActivityType(R.string.shared_string_gpx_tracks, R.drawable.ic_action_polygom_dark, "gpx", 75);
public static final DownloadActivityType SQLITE_FILE =
new DownloadActivityType(R.string.shared_string_online_maps, "sqlite", 80);
private final int stringResource;
private final int iconResource;
@ -136,6 +141,10 @@ public class DownloadActivityType {
return fileName.endsWith(IndexConstants.SQLITE_EXT);
} else if (DEPTH_CONTOUR_FILE == this) {
return fileName.endsWith(addVersionToExt(IndexConstants.BINARY_MAP_INDEX_EXT_ZIP, IndexConstants.BINARY_MAP_VERSION));
} else if (GPX_FILE == this) {
return fileName.endsWith(IndexConstants.GPX_FILE_EXT);
} else if (SQLITE_FILE == this) {
return fileName.endsWith(IndexConstants.SQLITE_EXT);
}
return false;
}
@ -166,12 +175,16 @@ public class DownloadActivityType {
return ctx.getAppPath(IndexConstants.TILES_INDEX_DIR);
} else if (DEPTH_CONTOUR_FILE == this) {
return ctx.getAppPath(IndexConstants.MAPS_PATH);
} else if (GPX_FILE == this) {
return ctx.getAppPath(IndexConstants.GPX_INDEX_DIR);
} else if (SQLITE_FILE == this) {
return ctx.getAppPath(IndexConstants.TILES_INDEX_DIR);
}
throw new UnsupportedOperationException();
}
public boolean isZipStream(OsmandApplication ctx, IndexItem indexItem) {
return HILLSHADE_FILE != this && SLOPE_FILE != this && WIKIVOYAGE_FILE != this;
return HILLSHADE_FILE != this && SLOPE_FILE != this && SQLITE_FILE != this && WIKIVOYAGE_FILE != this && GPX_FILE != this;
}
public boolean isZipFolder(OsmandApplication ctx, IndexItem indexItem) {
@ -213,8 +226,12 @@ public class DownloadActivityType {
return IndexConstants.SQLITE_EXT;
} else if (SLOPE_FILE == this) {
return IndexConstants.SQLITE_EXT;
} else if (SQLITE_FILE == this) {
return IndexConstants.SQLITE_EXT;
} else if (DEPTH_CONTOUR_FILE == this) {
return BINARY_MAP_INDEX_EXT;
} else if (GPX_FILE == this) {
return IndexConstants.GPX_FILE_EXT;
}
throw new UnsupportedOperationException();
}
@ -238,6 +255,8 @@ public class DownloadActivityType {
return "&fonts=yes";
} else if (this == DEPTH_CONTOUR_FILE) {
return "&inapp=depth";
} else if (this == GPX_FILE) {
return "&gpx=yes";
}
return "";
}
@ -303,6 +322,8 @@ public class DownloadActivityType {
return ctx.getString(R.string.download_depth_countours);
} else if (this == FONT_FILE) {
return ctx.getString(R.string.fonts_header);
} else if (this == GPX_FILE) {
return ctx.getString(R.string.shared_string_gpx_tracks);
}
return "";
}
@ -370,6 +391,8 @@ public class DownloadActivityType {
return fileName.replace('_', ' ');
} else if (this == SLOPE_FILE) {
return fileName.replace('_', ' ');
} else if (this == SQLITE_FILE) {
return fileName.replace('_', ' ');
} else if (this == LIVE_UPDATES_FILE) {
int l = fileName.lastIndexOf('.');
if (l == -1) {

View file

@ -349,6 +349,7 @@ public class DownloadIndexesThread {
app.getSettings().LAST_CHECKED_UPDATES.set(System.currentTimeMillis());
result.prepareData(indexFileList.getIndexFiles());
} catch (Exception e) {
LOG.error(e);
}
}
return result == null ? new DownloadResources(app) : result;

View file

@ -55,6 +55,7 @@ public class DownloadResourceGroup {
FONTS(R.string.fonts_header),
VOICE_REC(R.string.index_name_voice),
OTHER_MAPS(R.string.download_select_map_types),
EXTRA_MAPS(R.string.extra_maps_menu_group),
WORLD(-1),
REGION(-1);
@ -79,7 +80,7 @@ public class DownloadResourceGroup {
public boolean containsIndexItem() {
return isHeader() && this != SUBREGIONS && this != OTHER_GROUP && this != OTHER_MAPS_GROUP
&& this != NAUTICAL_MAPS_GROUP && this != TRAVEL_GROUP;
&& this != NAUTICAL_MAPS_GROUP && this != TRAVEL_GROUP && this != EXTRA_MAPS;
}
public boolean isHeader() {
@ -90,7 +91,8 @@ public class DownloadResourceGroup {
|| this == OTHER_MAPS_HEADER || this == OTHER_MAPS_GROUP
|| this == FONTS_HEADER
|| this == NAUTICAL_MAPS_HEADER || this == NAUTICAL_MAPS_GROUP
|| this == WIKIVOYAGE_HEADER || this == TRAVEL_GROUP;
|| this == WIKIVOYAGE_HEADER || this == TRAVEL_GROUP
|| this == EXTRA_MAPS;
}
public static String getVoiceTTSId() {
@ -274,7 +276,7 @@ public class DownloadResourceGroup {
}
public IndexItem getItemByIndex(int ind) {
if(individualResources != null && ind < individualResources.size()) {
if (individualResources != null && ind >= 0 && ind < individualResources.size()) {
return individualResources.get(ind);
}
return null;

View file

@ -9,8 +9,11 @@ import net.osmand.data.LatLon;
import net.osmand.map.OsmandRegions;
import net.osmand.map.WorldRegion;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.CustomRegion;
import net.osmand.plus.download.DownloadOsmandIndexesHelper.AssetIndexItem;
import net.osmand.plus.inapp.InAppPurchaseHelper;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
@ -290,6 +293,8 @@ public class DownloadResources extends DownloadResourceGroup {
protected boolean prepareData(List<IndexItem> resources) {
this.rawResources = resources;
DownloadResourceGroup extraMapsGroup = new DownloadResourceGroup(this, DownloadResourceGroupType.EXTRA_MAPS);
DownloadResourceGroup otherMapsGroup = new DownloadResourceGroup(this, DownloadResourceGroupType.OTHER_MAPS_GROUP);
DownloadResourceGroup otherMapsScreen = new DownloadResourceGroup(otherMapsGroup, DownloadResourceGroupType.OTHER_MAPS);
DownloadResourceGroup otherMaps = new DownloadResourceGroup(otherMapsGroup, DownloadResourceGroupType.OTHER_MAPS_HEADER);
@ -363,6 +368,14 @@ public class DownloadResources extends DownloadResourceGroup {
}
this.groupByRegion = groupByRegion;
List<WorldRegion> customRegions = OsmandPlugin.getCustomDownloadRegions();
if (!Algorithms.isEmpty(customRegions)) {
addGroup(extraMapsGroup);
for (WorldRegion region : customRegions) {
buildRegionsGroups(region, extraMapsGroup);
}
}
LinkedList<WorldRegion> queue = new LinkedList<WorldRegion>();
LinkedList<DownloadResourceGroup> parent = new LinkedList<DownloadResourceGroup>();
DownloadResourceGroup worldSubregions = new DownloadResourceGroup(this, DownloadResourceGroupType.SUBREGIONS);
@ -433,6 +446,40 @@ public class DownloadResources extends DownloadResourceGroup {
return true;
}
private void buildRegionsGroups(WorldRegion region, DownloadResourceGroup group) {
LinkedList<WorldRegion> queue = new LinkedList<WorldRegion>();
LinkedList<DownloadResourceGroup> parent = new LinkedList<DownloadResourceGroup>();
queue.add(region);
parent.add(group);
while (!queue.isEmpty()) {
WorldRegion reg = queue.pollFirst();
DownloadResourceGroup parentGroup = parent.pollFirst();
List<WorldRegion> subregions = reg.getSubregions();
DownloadResourceGroup mainGrp = new DownloadResourceGroup(parentGroup, DownloadResourceGroupType.REGION, reg.getRegionId());
mainGrp.region = reg;
parentGroup.addGroup(mainGrp);
if (reg instanceof CustomRegion) {
CustomRegion customRegion = (CustomRegion) reg;
List<IndexItem> indexItems = customRegion.loadIndexItems();
if (!Algorithms.isEmpty(indexItems)) {
DownloadResourceGroup flatFiles = new DownloadResourceGroup(mainGrp, DownloadResourceGroupType.REGION_MAPS);
for (IndexItem ii : indexItems) {
flatFiles.addItem(ii);
}
mainGrp.addGroup(flatFiles);
}
}
DownloadResourceGroup subRegions = new DownloadResourceGroup(mainGrp, DownloadResourceGroupType.EXTRA_MAPS);
mainGrp.addGroup(subRegions);
// add to processing queue
for (WorldRegion rg : subregions) {
queue.add(rg);
parent.add(subRegions);
}
}
}
/**
* @return smallest index item, if there are no downloaded index items; Downloaded item otherwise.
*/
@ -465,6 +512,10 @@ public class DownloadResources extends DownloadResourceGroup {
}
public static List<IndexItem> findIndexItemsAt(OsmandApplication app, LatLon latLon, DownloadActivityType type, boolean includeDownloaded) throws IOException {
return findIndexItemsAt(app, latLon, type, includeDownloaded, -1);
}
public static List<IndexItem> findIndexItemsAt(OsmandApplication app, LatLon latLon, DownloadActivityType type, boolean includeDownloaded, int limit) throws IOException {
List<IndexItem> res = new ArrayList<>();
OsmandRegions regions = app.getRegions();
DownloadIndexesThread downloadThread = app.getDownloadThread();
@ -473,6 +524,25 @@ public class DownloadResources extends DownloadResourceGroup {
if (includeDownloaded || !isIndexItemDownloaded(downloadThread, type, downloadRegion, res)) {
addIndexItem(downloadThread, type, downloadRegion, res);
}
if (limit != -1 && res.size() == limit) {
break;
}
}
return res;
}
public static List<IndexItem> findIndexItemsAt(OsmandApplication app, List<String> names, DownloadActivityType type, boolean includeDownloaded, int limit) {
List<IndexItem> res = new ArrayList<>();
OsmandRegions regions = app.getRegions();
DownloadIndexesThread downloadThread = app.getDownloadThread();
for (String name : names) {
WorldRegion downloadRegion = regions.getRegionDataByDownloadName(name);
if (downloadRegion != null && (includeDownloaded || !isIndexItemDownloaded(downloadThread, type, downloadRegion, res))) {
addIndexItem(downloadThread, type, downloadRegion, res);
}
if (limit != -1 && res.size() == limit) {
break;
}
}
return res;
}

View file

@ -137,17 +137,20 @@ public class IndexItem implements Comparable<IndexItem> {
}
public File getTargetFile(OsmandApplication ctx) {
String basename;
if (type == DownloadActivityType.HILLSHADE_FILE) {
basename = (FileNameTranslationHelper.HILL_SHADE + getBasename()).replace("_", " ");
} else if (type == DownloadActivityType.SLOPE_FILE) {
basename = (FileNameTranslationHelper.SLOPE + getBasename()).replace('_', ' ');
} else {
basename = getBasename();
}
String basename = getTranslatedBasename();
return new File(type.getDownloadFolder(ctx, this), basename + type.getUnzipExtension(ctx, this));
}
public String getTranslatedBasename() {
if (type == DownloadActivityType.HILLSHADE_FILE) {
return (FileNameTranslationHelper.HILL_SHADE + getBasename()).replace("_", " ");
} else if (type == DownloadActivityType.SLOPE_FILE) {
return (FileNameTranslationHelper.SLOPE + getBasename()).replace('_', ' ');
} else {
return getBasename();
}
}
public File getBackupFile(OsmandApplication ctx) {
File backup = new File(ctx.getAppPath(IndexConstants.BACKUP_INDEX_DIR), getTargetFile(ctx).getName());
return backup;

View file

@ -0,0 +1,112 @@
package net.osmand.plus.download.ui;
import android.content.Context;
import android.text.Html;
import net.osmand.JsonUtils;
import net.osmand.PlatformUtil;
import org.apache.commons.logging.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class DownloadDescriptionInfo {
private static final Log LOG = PlatformUtil.getLog(DownloadDescriptionInfo.class);
private JSONArray buttonsJson;
private List<String> imageUrls;
private Map<String, String> texts;
public List<String> getImageUrls() {
return imageUrls;
}
public CharSequence getLocalizedDescription(Context ctx) {
String description = JsonUtils.getLocalizedResFromMap(ctx, texts, null);
return description != null ? Html.fromHtml(description) : null;
}
public List<ActionButton> getActionButtons(Context ctx) {
List<ActionButton> actionButtons = new ArrayList<>();
if (buttonsJson != null) {
try {
for (int i = 0; i < buttonsJson.length(); i++) {
String url = null;
String actionType = null;
JSONObject object = buttonsJson.getJSONObject(i);
if (object.has("url")) {
url = object.optString("url");
} else if (object.has("action")) {
actionType = object.optString("action");
}
Map<String, String> localizedMap = JsonUtils.getLocalizedMapFromJson(object);
String name = JsonUtils.getLocalizedResFromMap(ctx, localizedMap, null);
ActionButton actionButton = new ActionButton(actionType, name, url);
actionButtons.add(actionButton);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
return actionButtons;
}
public static DownloadDescriptionInfo fromJson(JSONObject json) {
if (json != null) {
DownloadDescriptionInfo downloadDescriptionInfo = new DownloadDescriptionInfo();
try {
downloadDescriptionInfo.texts = JsonUtils.getLocalizedMapFromJson("text", json);
downloadDescriptionInfo.imageUrls = JsonUtils.jsonArrayToList("image", json);
downloadDescriptionInfo.buttonsJson = json.optJSONArray("button");
} catch (JSONException e) {
LOG.error(e);
}
return downloadDescriptionInfo;
}
return null;
}
public JSONObject toJson() throws JSONException {
JSONObject descrJson = new JSONObject();
JsonUtils.writeLocalizedMapToJson("text", descrJson, texts);
JsonUtils.writeStringListToJson("image", descrJson, imageUrls);
descrJson.putOpt("button", buttonsJson);
return descrJson;
}
public static class ActionButton {
private String actionType;
private String name;
private String url;
public ActionButton(String actionType, String name, String url) {
this.actionType = actionType;
this.name = name;
this.url = url;
}
public String getActionType() {
return actionType;
}
public String getName() {
return name;
}
public String getUrl() {
return url;
}
}
}

View file

@ -0,0 +1,178 @@
package net.osmand.plus.download.ui;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.DialogFragment;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;
import net.osmand.AndroidUtils;
import net.osmand.PicassoUtils;
import net.osmand.map.WorldRegion;
import net.osmand.plus.CustomRegion;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.download.CustomIndexItem;
import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.download.DownloadResourceGroup;
import net.osmand.plus.download.DownloadResources;
import net.osmand.plus.wikipedia.WikipediaDialogFragment;
import net.osmand.util.Algorithms;
import static net.osmand.plus.download.ui.DownloadResourceGroupFragment.REGION_ID_DLG_KEY;
public class DownloadItemFragment extends DialogFragment {
public static final String ITEM_ID_DLG_KEY = "index_item_dialog_key";
public static final String TAG = DownloadItemFragment.class.getSimpleName();
private String regionId = "";
private int itemIndex = -1;
private DownloadResourceGroup group;
private CustomIndexItem indexItem;
private View view;
private Toolbar toolbar;
private ImageView image;
private TextView description;
private TextView buttonTextView;
private boolean nightMode;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
nightMode = !getMyApplication().getSettings().isLightContent();
int themeId = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
setStyle(STYLE_NO_FRAME, themeId);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.item_info_fragment, container, false);
if (savedInstanceState != null) {
regionId = savedInstanceState.getString(REGION_ID_DLG_KEY);
itemIndex = savedInstanceState.getInt(ITEM_ID_DLG_KEY, -1);
}
if ((itemIndex == -1 || group == null) && getArguments() != null) {
regionId = getArguments().getString(REGION_ID_DLG_KEY);
itemIndex = getArguments().getInt(ITEM_ID_DLG_KEY, -1);
}
toolbar = view.findViewById(R.id.toolbar);
Drawable icBack = getMyApplication().getUIUtilities().getIcon(AndroidUtils.getNavigationIconResId(requireContext()));
toolbar.setNavigationIcon(icBack);
toolbar.setNavigationContentDescription(R.string.access_shared_string_navigate_up);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
description = view.findViewById(R.id.item_description);
image = view.findViewById(R.id.item_image);
View dismissButton = view.findViewById(R.id.dismiss_button);
dismissButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (indexItem != null && !Algorithms.isEmpty(indexItem.getWebUrl())) {
WikipediaDialogFragment.showFullArticle(v.getContext(), Uri.parse(indexItem.getWebUrl()), nightMode);
}
}
});
UiUtilities.setupDialogButton(nightMode, dismissButton, UiUtilities.DialogButtonType.PRIMARY, "");
buttonTextView = (TextView) dismissButton.findViewById(R.id.button_text);
return view;
}
@Override
public void onResume() {
super.onResume();
reloadData();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(REGION_ID_DLG_KEY, regionId);
outState.putInt(ITEM_ID_DLG_KEY, itemIndex);
}
private void reloadData() {
DownloadActivity downloadActivity = getDownloadActivity();
if (downloadActivity != null) {
OsmandApplication app = downloadActivity.getMyApplication();
DownloadResources indexes = getDownloadActivity().getDownloadThread().getIndexes();
group = indexes.getGroupById(regionId);
indexItem = (CustomIndexItem) group.getItemByIndex(itemIndex);
if (indexItem != null) {
toolbar.setTitle(indexItem.getVisibleName(app, app.getRegions()));
WorldRegion region = group.getRegion();
if (region instanceof CustomRegion) {
CustomRegion customRegion = (CustomRegion) region;
int color = customRegion.getHeaderColor();
if (color != -1) {
toolbar.setBackgroundColor(color);
}
}
description.setText(indexItem.getLocalizedDescription(app));
buttonTextView.setText(indexItem.getWebButtonText(app));
final PicassoUtils picassoUtils = PicassoUtils.getPicasso(app);
Picasso picasso = Picasso.get();
for (final String imageUrl : indexItem.getDescriptionImageUrl()) {
RequestCreator rc = picasso.load(imageUrl);
rc.into(image, new Callback() {
@Override
public void onSuccess() {
image.setVisibility(View.VISIBLE);
picassoUtils.setResultLoaded(imageUrl, true);
}
@Override
public void onError(Exception e) {
image.setVisibility(View.GONE);
picassoUtils.setResultLoaded(imageUrl, false);
}
});
}
}
}
}
private OsmandApplication getMyApplication() {
return (OsmandApplication) getActivity().getApplication();
}
private DownloadActivity getDownloadActivity() {
return (DownloadActivity) getActivity();
}
public static DownloadItemFragment createInstance(String regionId, int itemIndex) {
Bundle bundle = new Bundle();
bundle.putString(REGION_ID_DLG_KEY, regionId);
bundle.putInt(ITEM_ID_DLG_KEY, itemIndex);
DownloadItemFragment fragment = new DownloadItemFragment();
fragment.setArguments(bundle);
return fragment;
}
}

View file

@ -5,6 +5,7 @@ import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.TypedValue;
@ -21,18 +22,26 @@ import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.MenuItemCompat;
import androidx.fragment.app.DialogFragment;
import androidx.viewpager.widget.PagerAdapter;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import net.osmand.AndroidNetworkUtils;
import net.osmand.AndroidUtils;
import net.osmand.PicassoUtils;
import net.osmand.plus.CustomRegion;
import net.osmand.plus.LockableViewPager;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.OsmandBaseExpandableListAdapter;
import net.osmand.plus.download.CustomIndexItem;
import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.download.DownloadActivity.BannerAndDownloadFreeVersion;
import net.osmand.plus.download.DownloadActivityType;
@ -42,9 +51,12 @@ import net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType;
import net.osmand.plus.download.DownloadResources;
import net.osmand.plus.download.DownloadValidationManager;
import net.osmand.plus.download.IndexItem;
import net.osmand.plus.download.ui.DownloadDescriptionInfo.ActionButton;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.inapp.InAppPurchaseHelper;
import net.osmand.plus.inapp.InAppPurchaseHelper.InAppPurchaseListener;
import net.osmand.plus.inapp.InAppPurchaseHelper.InAppPurchaseTaskType;
import net.osmand.plus.wikipedia.WikipediaDialogFragment;
import net.osmand.util.Algorithms;
import org.json.JSONException;
@ -60,8 +72,10 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
InAppPurchaseListener, OnChildClickListener {
public static final int RELOAD_ID = 0;
public static final int SEARCH_ID = 1;
public static final String TAG = "RegionDialogFragment";
private static final String REGION_ID_DLG_KEY = "world_region_dialog_key";
public static final String REGION_ID_DLG_KEY = "world_region_dialog_key";
private String groupId;
private View view;
private BannerAndDownloadFreeVersion banner;
@ -74,13 +88,15 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
private View searchView;
private View restorePurchasesView;
private View subscribeEmailView;
private View descriptionView;
private boolean nightMode;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
purchaseHelper = getDownloadActivity().getPurchaseHelper();
boolean isLightTheme = getMyApplication().getSettings().OSMAND_THEME.get() == OsmandSettings.OSMAND_LIGHT_THEME;
int themeId = isLightTheme ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme;
nightMode = !getMyApplication().getSettings().isLightContent();
int themeId = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
setStyle(STYLE_NO_FRAME, themeId);
setHasOptionsMenu(true);
}
@ -130,6 +146,7 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
addSubscribeEmailRow();
addSearchRow();
addRestorePurchasesRow();
addDescriptionRow();
listView.setOnChildClickListener(this);
listAdapter = new DownloadResourceGroupAdapter(activity);
listView.setAdapter(listAdapter);
@ -177,6 +194,11 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
}
}
private void addDescriptionRow() {
descriptionView = activity.getLayoutInflater().inflate(R.layout.group_description_item, listView, false);
listView.addHeaderView(descriptionView);
}
private void addSearchRow() {
if (!openAsDialog() ) {
searchView = activity.getLayoutInflater().inflate(R.layout.simple_list_menu_item, null);
@ -228,6 +250,53 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
}
}
private void updateDescriptionView() {
if (descriptionView != null) {
if (group != null && group.getRegion() instanceof CustomRegion) {
CustomRegion customRegion = (CustomRegion) group.getRegion();
DownloadDescriptionInfo downloadDescriptionInfo = customRegion.getDescriptionInfo();
if (downloadDescriptionInfo != null) {
TextView description = descriptionView.findViewById(R.id.description);
CharSequence descr = downloadDescriptionInfo.getLocalizedDescription(activity);
description.setText(descr);
AndroidUiHelper.updateVisibility(description, !Algorithms.isEmpty(descr));
ViewGroup buttonsContainer = descriptionView.findViewById(R.id.buttons_container);
buttonsContainer.removeAllViews();
for (final ActionButton actionButton : downloadDescriptionInfo.getActionButtons(activity)) {
String name = actionButton.getName();
if (!Algorithms.isEmpty(name)) {
TextView buttonText = (TextView) activity.getLayoutInflater().inflate(R.layout.download_description_button, buttonsContainer, false);
buttonText.setText(name);
buttonText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (actionButton.getUrl() != null) {
WikipediaDialogFragment.showFullArticle(activity, Uri.parse(actionButton.getUrl()), nightMode);
} else {
activity.getMyApplication().showShortToastMessage(R.string.download_unsupported_action, actionButton.getActionType());
}
}
});
buttonsContainer.addView(buttonText);
}
}
LockableViewPager viewPager = descriptionView.findViewById(R.id.images_pager);
if (!Algorithms.isEmpty(downloadDescriptionInfo.getImageUrls())) {
ImagesPagerAdapter adapter = new ImagesPagerAdapter(downloadDescriptionInfo.getImageUrls());
viewPager.setAdapter(adapter);
} else {
viewPager.setVisibility(View.GONE);
}
descriptionView.findViewById(R.id.container).setVisibility(View.VISIBLE);
return;
}
}
descriptionView.findViewById(R.id.container).setVisibility(View.GONE);
}
}
private void hideSubscribeEmailView() {
if (subscribeEmailView != null && subscribeEmailView.findViewById(R.id.container).getVisibility() == View.VISIBLE) {
subscribeEmailView.findViewById(R.id.container).setVisibility(View.GONE);
@ -386,12 +455,15 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
}
private void reloadData() {
DownloadResources indexes = activity.getDownloadThread().getIndexes();
group = indexes.getGroupById(groupId);
if (!openAsDialog()) {
updateSearchView();
}
updateSubscribeEmailView();
DownloadResources indexes = activity.getDownloadThread().getIndexes();
group = indexes.getGroupById(groupId);
updateDescriptionView();
if (group != null) {
listAdapter.update(group);
toolbar.setTitle(group.getName(activity));
@ -451,6 +523,11 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
.createInstance(uniqueId);
((DownloadActivity) getActivity()).showDialog(getActivity(), regionDialogFragment);
return true;
} else if (child instanceof CustomIndexItem) {
String regionId = group.getGroupByIndex(groupPosition).getUniqueId();
DownloadItemFragment downloadItemFragment = DownloadItemFragment.createInstance(regionId, childPosition);
((DownloadActivity) getActivity()).showDialog(getActivity(), downloadItemFragment);
} else if (child instanceof IndexItem) {
IndexItem indexItem = (IndexItem) child;
ItemViewHolder vh = (ItemViewHolder) v.getTag();
@ -632,7 +709,8 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
convertView.setTag(viewHolder);
}
if (mainGroup.getType() == DownloadResourceGroupType.REGION &&
group != null && group.getType() == DownloadResourceGroupType.REGION_MAPS) {
group != null && group.getType() == DownloadResourceGroupType.REGION_MAPS
&& !(item instanceof CustomIndexItem)) {
viewHolder.setShowTypeInName(true);
viewHolder.setShowTypeInDesc(false);
} else if (group != null && (group.getType() == DownloadResourceGroupType.SRTM_HEADER
@ -720,4 +798,60 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
return true;
}
}
private class ImagesPagerAdapter extends PagerAdapter {
private PicassoUtils picassoUtils;
private List<String> imageUrls;
public ImagesPagerAdapter(List<String> imageUrls) {
this.imageUrls = imageUrls;
picassoUtils = PicassoUtils.getPicasso(getMyApplication());
}
@Override
public int getCount() {
return imageUrls.size();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = createImageView(position);
container.addView(view, 0);
return view;
}
@Override
public void destroyItem(ViewGroup collection, int position, @NonNull Object view) {
collection.removeView((View) view);
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
private View createImageView(int position) {
final ImageView imageView = new ImageView(getContext());
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
final String imageUrl = imageUrls.get(position);
Picasso.get().load(imageUrl).into(imageView, new Callback() {
@Override
public void onSuccess() {
imageView.setVisibility(View.VISIBLE);
picassoUtils.setResultLoaded(imageUrl, true);
}
@Override
public void onError(Exception e) {
imageView.setVisibility(View.INVISIBLE);
picassoUtils.setResultLoaded(imageUrl, false);
}
});
return imageView;
}
}
}

View file

@ -115,6 +115,7 @@ import java.util.List;
import java.util.Map;
import static com.github.mikephil.charting.components.XAxis.XAxisPosition.BOTTOM;
import static net.osmand.IndexConstants.GPX_FILE_EXT;
import static net.osmand.binary.RouteDataObject.HEIGHT_UNDEFINED;
import static net.osmand.plus.OsmAndFormatter.FEET_IN_ONE_METER;
import static net.osmand.plus.OsmAndFormatter.METERS_IN_KILOMETER;
@ -307,8 +308,8 @@ public class GpxUiHelper {
public static String getGpxTitle(String fileName) {
String s = fileName;
if (s.toLowerCase().endsWith(".gpx")) {
s = s.substring(0, s.length() - ".gpx".length());
if (s.toLowerCase().endsWith(GPX_FILE_EXT)) {
s = s.substring(0, s.length() - GPX_FILE_EXT.length());
}
s = s.replace('_', ' ');
return s;
@ -901,7 +902,7 @@ public class GpxUiHelper {
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
if (f.getName().toLowerCase().endsWith(".gpx")) { //$NON-NLS-1$
if (f.getName().toLowerCase().endsWith(GPX_FILE_EXT)) {
list.add(new GPXInfo(absolutePath ? f.getAbsolutePath() :
parent + f.getName(), f.lastModified(), f.length()));
} else if (f.isDirectory()) {

View file

@ -84,6 +84,7 @@ import java.util.Map;
import java.util.zip.ZipInputStream;
import static android.app.Activity.RESULT_OK;
import static net.osmand.IndexConstants.GPX_FILE_EXT;
import static net.osmand.IndexConstants.OSMAND_SETTINGS_FILE_EXT;
import static net.osmand.IndexConstants.RENDERER_INDEX_EXT;
import static net.osmand.IndexConstants.ROUTING_FILE_EXT;
@ -99,7 +100,7 @@ public class ImportHelper {
public final static Log log = PlatformUtil.getLog(ImportHelper.class);
public static final String KML_SUFFIX = ".kml";
public static final String KMZ_SUFFIX = ".kmz";
public static final String GPX_SUFFIX = ".gpx";
private final AppCompatActivity activity;
private final OsmandApplication app;
private final OsmandMapTileView mapView;
@ -146,8 +147,8 @@ public class ImportHelper {
boolean isOsmandSubdir = isSubDirectory(app.getAppPath(IndexConstants.GPX_INDEX_DIR), new File(contentUri.getPath()));
if (!isOsmandSubdir && name != null) {
String nameLC = name.toLowerCase();
if (nameLC.endsWith(GPX_SUFFIX)) {
name = name.substring(0, name.length() - 4) + GPX_SUFFIX;
if (nameLC.endsWith(GPX_FILE_EXT)) {
name = name.substring(0, name.length() - 4) + GPX_FILE_EXT;
handleGpxImport(contentUri, name, true, useImportDir);
return true;
} else if (nameLC.endsWith(KML_SUFFIX)) {
@ -1046,14 +1047,14 @@ public class ImportHelper {
private File getFileToSave(final String fileName, final File importDir, final WptPt pt) {
final StringBuilder builder = new StringBuilder(fileName);
if ("".equals(fileName)) {
builder.append("import_").append(new SimpleDateFormat("HH-mm_EEE", Locale.US).format(new Date(pt.time))).append(GPX_SUFFIX); //$NON-NLS-1$
builder.append("import_").append(new SimpleDateFormat("HH-mm_EEE", Locale.US).format(new Date(pt.time))).append(GPX_FILE_EXT); //$NON-NLS-1$
}
if (fileName.endsWith(KML_SUFFIX)) {
builder.replace(builder.length() - KML_SUFFIX.length(), builder.length(), GPX_SUFFIX);
builder.replace(builder.length() - KML_SUFFIX.length(), builder.length(), GPX_FILE_EXT);
} else if (fileName.endsWith(KMZ_SUFFIX)) {
builder.replace(builder.length() - KMZ_SUFFIX.length(), builder.length(), GPX_SUFFIX);
} else if (!fileName.endsWith(GPX_SUFFIX)) {
builder.append(GPX_SUFFIX);
builder.replace(builder.length() - KMZ_SUFFIX.length(), builder.length(), GPX_FILE_EXT);
} else if (!fileName.endsWith(GPX_FILE_EXT)) {
builder.append(GPX_FILE_EXT);
}
return new File(importDir, builder.toString());
}

View file

@ -1070,7 +1070,7 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
for (OsmandMapLayer layer : mapActivity.getMapView().getLayers()) {
layer.populateObjectContextMenu(latLon, getObject(), menuAdapter, mapActivity);
}
mapActivity.getMapActions().addActionsToAdapter(all ? 0 : latLon.getLatitude(), all ? 0 : latLon.getLatitude(), menuAdapter, getObject(), all);
mapActivity.getMapActions().addActionsToAdapter(all ? 0 : latLon.getLatitude(), all ? 0 : latLon.getLongitude(), menuAdapter, getObject(), all);
}
return menuAdapter;
}

View file

@ -11,6 +11,7 @@ import androidx.core.content.ContextCompat;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.IndexConstants;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.plus.GpxSelectionHelper;
@ -113,7 +114,7 @@ public class WptPtMenuBuilder extends MenuBuilder {
if (points.size() > 0) {
String title = view.getContext().getString(R.string.context_menu_points_of_group);
File file = new File(gpx.path);
String gpxName = file.getName().replace(".gpx", "").replace("/", " ").replace("_", " ");
String gpxName = file.getName().replace(IndexConstants.GPX_FILE_EXT, "").replace("/", " ").replace("_", " ");
int color = getPointColor(wpt, getFileColor(selectedGpxFile));
buildRow(view, app.getUIUtilities().getPaintedIcon(R.drawable.ic_type_waypoints_group, color), null, title, 0, gpxName,
true, getCollapsableWaypointsView(view.getContext(), true, gpx, wpt),

View file

@ -6,6 +6,7 @@ import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.IndexConstants;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.plus.GpxSelectionHelper;
@ -115,7 +116,7 @@ public class WptPtMenuController extends MenuController {
sb.append(", ");
if (selectedGpxFile != null) {
File file = new File(selectedGpxFile.getGpxFile().path);
String gpxName = file.getName().replace(".gpx", "").replace("/", " ").replace("_", " ");
String gpxName = file.getName().replace(IndexConstants.GPX_FILE_EXT, "").replace("/", " ").replace("_", " ");
sb.append(gpxName);
}
return sb.toString();

View file

@ -172,7 +172,7 @@ public class AddTracksGroupBottomSheetDialogFragment extends AddGroupBottomSheet
String sub = gpxSubfolder.length() == 0 ?
gpxFile.getName() : gpxSubfolder + "/" + gpxFile.getName();
processGPXFolder(gpxFile, sub);
} else if (gpxFile.isFile() && gpxFile.getName().toLowerCase().endsWith(".gpx")) {
} else if (gpxFile.isFile() && gpxFile.getName().toLowerCase().endsWith(IndexConstants.GPX_FILE_EXT)) {
GpxDataItem item = dbHelper.getItem(gpxFile, gpxDataItemCallback);
publishProgress(item);
}

View file

@ -1494,10 +1494,10 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
if (!dir.exists()) {
dir.mkdirs();
}
File fout = new File(dir, fileName + ".gpx");
File fout = new File(dir, fileName + IndexConstants.GPX_FILE_EXT);
int ind = 1;
while (fout.exists()) {
fout = new File(dir, fileName + "_" + (++ind) + ".gpx");
fout = new File(dir, fileName + "_" + (++ind) + IndexConstants.GPX_FILE_EXT);
}
GPXUtilities.writeGpxFile(fout, gpx);
}

View file

@ -32,7 +32,6 @@ import net.osmand.plus.widgets.OsmandTextFieldBoxes;
import java.io.File;
import java.util.Date;
import static net.osmand.plus.helpers.ImportHelper.GPX_SUFFIX;
import static net.osmand.plus.mapmarkers.CoordinateInputDialogFragment.ADDED_POINTS_NUMBER_KEY;
public class SaveAsTrackBottomSheetDialogFragment extends BottomSheetDialogFragment {
@ -98,11 +97,11 @@ public class SaveAsTrackBottomSheetDialogFragment extends BottomSheetDialogFragm
Date date = new Date();
final String suggestedName = app.getString(R.string.markers) + "_" + DateFormat.format("yyyy-MM-dd", date).toString();
String displayedName = suggestedName;
File fout = new File(dir, suggestedName + GPX_SUFFIX);
File fout = new File(dir, suggestedName + IndexConstants.GPX_FILE_EXT);
int ind = 1;
while (fout.exists()) {
displayedName = suggestedName + "_" + (++ind);
fout = new File(dir, displayedName + GPX_SUFFIX);
fout = new File(dir, displayedName + IndexConstants.GPX_FILE_EXT);
}
final EditText nameEditText = (EditText) mainView.findViewById(R.id.name_edit_text);
nameEditText.setText(displayedName);

View file

@ -10,6 +10,7 @@ import androidx.annotation.Nullable;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.IndexConstants;
import net.osmand.plus.GpxSelectionHelper;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.MapMarkersHelper;
@ -161,7 +162,7 @@ public class SelectWptCategoriesBottomSheetDialogFragment extends MenuBottomShee
private String getGpxName(GPXFile gpxFile) {
return new File(gpxFile.path).getName()
.replace(".gpx", "")
.replace(IndexConstants.GPX_FILE_EXT, "")
.replace("/", " ")
.replace("_", " ");
}

View file

@ -404,7 +404,7 @@ public class MapMarkersGroupsAdapter extends RecyclerView.Adapter<RecyclerView.V
if (groupName.equals("")) {
groupName = app.getString(R.string.shared_string_favorites);
} else if (group.getType() == MapMarkersGroup.GPX_TYPE) {
groupName = groupName.replace(".gpx", "").replace("/", " ").replace("_", " ");
groupName = groupName.replace(IndexConstants.GPX_FILE_EXT, "").replace("/", " ").replace("_", " ");
}
if (group.isDisabled()) {
headerString = groupName;

View file

@ -7,6 +7,7 @@ import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.IndexConstants;
import net.osmand.plus.GPXDatabase.GpxDataItem;
import net.osmand.plus.R;
@ -33,7 +34,7 @@ public class TracksGroupsAdapter extends GroupsAdapter {
GpxDataItem gpx = getItem(position);
MapMarkersGroupViewHolder markersGroupViewHolder = (MapMarkersGroupViewHolder) holder;
markersGroupViewHolder.icon.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_polygom_dark));
markersGroupViewHolder.name.setText(gpx.getFile().getName().replace(".gpx", "").replace("/", " ").replace("_", " "));
markersGroupViewHolder.name.setText(gpx.getFile().getName().replace(IndexConstants.GPX_FILE_EXT, "").replace("/", " ").replace("_", " "));
GPXTrackAnalysis analysis = gpx.getAnalysis();
markersGroupViewHolder.numberCount.setText(analysis != null ? String.valueOf(analysis.wptPoints) : "");
String description = getDescription(gpx);

View file

@ -81,7 +81,8 @@ import java.util.Date;
import java.util.List;
import java.util.Locale;
import static net.osmand.plus.helpers.ImportHelper.GPX_SUFFIX;
import static net.osmand.IndexConstants.GPX_FILE_EXT;
public class MeasurementToolFragment extends BaseOsmAndFragment {
@ -1171,11 +1172,11 @@ public class MeasurementToolFragment extends BaseOsmAndFragment {
final String suggestedName = new SimpleDateFormat("yyyy-MM-dd_HH-mm_EEE", Locale.US).format(new Date());
String displayedName = suggestedName;
File fout = new File(dir, suggestedName + GPX_SUFFIX);
File fout = new File(dir, suggestedName + GPX_FILE_EXT);
int ind = 1;
while (fout.exists()) {
displayedName = suggestedName + "_" + (++ind);
fout = new File(dir, displayedName + GPX_SUFFIX);
fout = new File(dir, displayedName + GPX_FILE_EXT);
}
nameEt.setText(displayedName);
nameEt.setSelection(displayedName.length());
@ -1188,12 +1189,12 @@ public class MeasurementToolFragment extends BaseOsmAndFragment {
@Override
public void onClick(DialogInterface dialog, int which) {
final String name = nameEt.getText().toString();
String fileName = name + GPX_SUFFIX;
String fileName = name + GPX_FILE_EXT;
if (textChanged[0]) {
File fout = new File(dir, fileName);
int ind = 1;
while (fout.exists()) {
fileName = name + "_" + (++ind) + GPX_SUFFIX;
fileName = name + "_" + (++ind) + GPX_FILE_EXT;
fout = new File(dir, fileName);
}
}
@ -1217,7 +1218,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment {
@Override
public void afterTextChanged(Editable editable) {
if (new File(dir, editable.toString() + GPX_SUFFIX).exists()) {
if (new File(dir, editable.toString() + GPX_FILE_EXT).exists()) {
warningTextView.setVisibility(View.VISIBLE);
warningTextView.setText(R.string.file_with_name_already_exists);
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
@ -1277,7 +1278,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment {
TrkSegment after = editingCtx.getAfterTrkSegmentLine();
if (gpx == null) {
toSave = new File(dir, fileName);
String trackName = fileName.substring(0, fileName.length() - GPX_SUFFIX.length());
String trackName = fileName.substring(0, fileName.length() - GPX_FILE_EXT.length());
GPXFile gpx = new GPXFile(Version.getFullVersion(activity.getMyApplication()));
if (measurementLayer != null) {
if (saveType == SaveType.LINE) {
@ -1534,11 +1535,11 @@ public class MeasurementToolFragment extends BaseOsmAndFragment {
public void onClick(DialogInterface dialog, int which) {
if (showOnMapToggle.isChecked()) {
final String name = new SimpleDateFormat("yyyy-MM-dd_HH-mm_EEE", Locale.US).format(new Date());
String fileName = name + GPX_SUFFIX;
String fileName = name + GPX_FILE_EXT;
File fout = new File(dir, fileName);
int ind = 1;
while (fout.exists()) {
fileName = name + "_" + (++ind) + GPX_SUFFIX;
fileName = name + "_" + (++ind) + GPX_FILE_EXT;
fout = new File(dir, fileName);
}
saveNewGpx(dir, fileName, true, SaveType.LINE, true);

View file

@ -25,6 +25,7 @@ import androidx.fragment.app.FragmentManager;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.IndexConstants;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
@ -74,7 +75,7 @@ public class OnSaveCurrentTrackFragment extends BottomSheetDialogFragment {
}
Context ctx = requireContext();
file = new File(app.getAppCustomization().getTracksDir(), savedGpxName + ".gpx");
file = new File(app.getAppCustomization().getTracksDir(), savedGpxName + IndexConstants.GPX_FILE_EXT);
final boolean nightMode = app.getDaynightHelper().isNightModeForMapControls();
final int textPrimaryColor = nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light;
View mainView = UiUtilities.getInflater(ctx, nightMode).inflate(R.layout.fragment_on_save_current_track, container);
@ -175,7 +176,7 @@ public class OnSaveCurrentTrackFragment extends BottomSheetDialogFragment {
return null;
}
OsmandApplication app = (OsmandApplication) activity.getApplication();
File savedFile = new File(app.getAppCustomization().getTracksDir(), new File(savedGpxDir, savedGpxName + ".gpx").getPath());
File savedFile = new File(app.getAppCustomization().getTracksDir(), new File(savedGpxDir, savedGpxName + IndexConstants.GPX_FILE_EXT).getPath());
if (savedGpxName.equalsIgnoreCase(newGpxName)) {
return savedFile;
}
@ -183,7 +184,7 @@ public class OnSaveCurrentTrackFragment extends BottomSheetDialogFragment {
Toast.makeText(app, R.string.empty_filename, Toast.LENGTH_LONG).show();
return null;
}
return LocalIndexesFragment.renameGpxFile(app, savedFile, newGpxName + ".gpx", true, null);
return LocalIndexesFragment.renameGpxFile(app, savedFile, newGpxName + IndexConstants.GPX_FILE_EXT, true, null);
}
private void showOnMap(File f, boolean animated) {

View file

@ -6,20 +6,22 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.AppCompatCheckBox;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import com.google.android.material.slider.Slider;
import net.osmand.AndroidUtils;
import net.osmand.Location;
import net.osmand.ValueHolder;
@ -506,8 +508,10 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
final int[] minutes, final ValueHolder<Boolean> choice,
final ValueHolder<Integer> v,
final boolean showTrackSelection, boolean nightMode) {
ApplicationMode appMode = app.getSettings().getApplicationMode();
int textColorPrimary = ContextCompat.getColor(app, nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light);
int textColorSecondary = ContextCompat.getColor(app, nightMode ? R.color.text_color_secondary_dark : R.color.text_color_secondary_light);
int selectedModeColor = ContextCompat.getColor(uiCtx, appMode.getIconColorInfo().getColor(nightMode));
LinearLayout ll = new LinearLayout(uiCtx);
final int dp24 = AndroidUtils.dpToPx(uiCtx, 24f);
final int dp8 = AndroidUtils.dpToPx(uiCtx, 8f);
@ -516,22 +520,20 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
tv.setText(String.format(patternMsg, uiCtx.getString(R.string.int_continuosly)));
tv.setTextColor(textColorSecondary);
SeekBar sp = new SeekBar(uiCtx);
sp.setPadding(dp24 + dp8, dp8, dp24 + dp8, dp8);
final int secondsLength = seconds.length;
final int minutesLength = minutes.length;
sp.setMax(secondsLength + minutesLength - 1);
sp.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
ViewGroup sliderContainer = UiUtilities.createSliderView(uiCtx, nightMode);
sliderContainer.setPadding(dp24, dp8, dp24, dp8);
Slider sp = sliderContainer.findViewById(R.id.slider);
UiUtilities.setupSlider(sp, nightMode, selectedModeColor, true);
sp.setValueTo(secondsLength + minutesLength - 1);
sp.setStepSize(1);
sp.addOnChangeListener(new Slider.OnChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) {
String s;
int progress = (int) value;
if(progress == 0) {
s = uiCtx.getString(R.string.int_continuosly);
v.value = 0;
@ -545,20 +547,18 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
}
}
tv.setText(String.format(patternMsg, s));
}
});
UiUtilities.setupSeekBar(app, sp, nightMode, true);
for (int i = 0; i < secondsLength + minutesLength - 1; i++) {
if (i < secondsLength) {
if (v.value <= seconds[i] * 1000) {
sp.setProgress(i);
sp.setValue(i);
break;
}
} else {
if (v.value <= minutes[i - secondsLength] * 1000 * 60) {
sp.setProgress(i);
sp.setValue(i);
break;
}
}
@ -566,7 +566,7 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(tv);
ll.addView(sp);
ll.addView(sliderContainer);
if (choice != null) {
final AppCompatCheckBox cb = new AppCompatCheckBox(uiCtx);
cb.setText(R.string.confirm_every_run);

View file

@ -978,7 +978,7 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
String sub = gpxSubfolder.length() == 0 ? gpxFile.getName() : gpxSubfolder + "/"
+ gpxFile.getName();
loadGPXFolder(gpxFile, result, loadTask, progress, sub);
} else if (gpxFile.isFile() && gpxFile.getName().toLowerCase().endsWith(".gpx")) {
} else if (gpxFile.isFile() && gpxFile.getName().toLowerCase().endsWith(IndexConstants.GPX_FILE_EXT)) {
GpxInfo info = new GpxInfo();
info.subfolder = gpxSubfolder;
info.file = gpxFile;
@ -1233,7 +1233,7 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
v.findViewById(R.id.group_divider).setVisibility(View.VISIBLE);
StringBuilder t = new StringBuilder();
String groupName = group.replaceAll("_", " ").replace(".gpx", "");
String groupName = group.replaceAll("_", " ").replace(IndexConstants.GPX_FILE_EXT, "");
if (groupName.length() == 0) {
groupName = getString(R.string.shared_string_tracks);
}

View file

@ -46,6 +46,7 @@ import net.osmand.Collator;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.IndexConstants;
import net.osmand.OsmAndCollator;
import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon;
@ -1269,7 +1270,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment implements
dir.mkdir();
}
for (final String f : files.keySet()) {
File fout = new File(dir, f + ".gpx");
File fout = new File(dir, f + IndexConstants.GPX_FILE_EXT);
GPXUtilities.writeGpxFile(fout, gpx);
}
return shouldClearPath;

View file

@ -34,6 +34,7 @@ import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.IndexConstants;
import net.osmand.data.PointDescription;
import net.osmand.osm.edit.Entity;
import net.osmand.osm.edit.Node;
@ -800,7 +801,7 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo
} else {
sb.append("osm_modification");
}
sb.append(oscFile ? ".osc" : ".gpx");
sb.append(oscFile ? ".osc" : IndexConstants.GPX_FILE_EXT);
return sb.toString();
}

View file

@ -145,7 +145,7 @@ public class PoiFiltersHelper {
public List<PoiUIFilter> getLocalWikipediaPoiFilters(boolean onlyActiveLocales) {
String wikiLang = "wiki:lang:";
if (cacheWikipediaFilters == null) {
cacheWikipediaFilters = new ArrayList<>();
List<PoiUIFilter> wikipediaFilters = new ArrayList<>();
PoiType place = application.getPoiTypes().getPoiTypeByKey(WIKI_PLACE);
if (place != null) {
for (String locale : application.getPoiTypes().getAllAvailableWikiLocales()) {
@ -153,9 +153,10 @@ public class PoiFiltersHelper {
WikipediaPoiMenu.getTranslation(application, locale));
filter.setSavedFilterByName(wikiLang + locale);
filter.setStandardFilter(true);
cacheWikipediaFilters.add(filter);
wikipediaFilters.add(filter);
}
}
cacheWikipediaFilters = wikipediaFilters;
}
if (onlyActiveLocales && cacheWikipediaFilters.size() > 0) {
List<PoiUIFilter> onlyActiveLocalFilters = new ArrayList<>();

View file

@ -193,7 +193,7 @@ public class DataStorageHelper {
tracksMemory = DataStorageMemoryItem.builder()
.setKey(TRACKS_MEMORY)
// .setExtensions(".gpx", ".gpx.bz2")
// .setExtensions(IndexConstants.GPX_FILE_EXT, ".gpx.bz2")
.setDirectories(
new Directory(app.getAppPath(IndexConstants.GPX_INDEX_DIR).getAbsolutePath(), true, EXTENSIONS, false))
.createItem();

View file

@ -9,9 +9,9 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentManager;
@ -19,6 +19,8 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.PreferenceViewHolder;
import com.google.android.material.slider.Slider;
import net.osmand.StateChangedListener;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmAndFormatter;
@ -287,8 +289,9 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
boolean nightMode = !app.getSettings().isLightContentForMode(mode);
Context themedContext = UiUtilities.getThemedContext(activity, nightMode);
AlertDialog.Builder builder = new AlertDialog.Builder(themedContext);
View seekbarView = LayoutInflater.from(themedContext).inflate(R.layout.recalculation_angle_dialog, null, false);
builder.setView(seekbarView);
View sliderView = LayoutInflater.from(themedContext).inflate(
R.layout.recalculation_angle_dialog, null, false);
builder.setView(sliderView);
builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
@ -303,36 +306,28 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
builder.setNegativeButton(R.string.shared_string_cancel, null);
int selectedModeColor = ContextCompat.getColor(app, mode.getIconColorInfo().getColor(nightMode));
setupAngleSlider(angleValue, seekbarView, nightMode, selectedModeColor);
setupAngleSlider(angleValue, sliderView, nightMode, selectedModeColor);
builder.show();
}
private static void setupAngleSlider(final float[] angleValue,
View seekbarView,
View sliderView,
final boolean nightMode,
final int activeColor) {
final SeekBar angleBar = seekbarView.findViewById(R.id.angle_seekbar);
final TextView angleTv = seekbarView.findViewById(R.id.angle_text);
final Slider angleBar = sliderView.findViewById(R.id.angle_slider);
final TextView angleTv = sliderView.findViewById(R.id.angle_text);
angleTv.setText(String.valueOf(angleValue[0]));
angleBar.setProgress((int) angleValue[0]);
angleBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
angleBar.setValue((int) angleValue[0]);
angleBar.addOnChangeListener(new Slider.OnChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
int value = progress - (progress % 5);
public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) {
angleValue[0] = value;
angleTv.setText(String.valueOf(value));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
UiUtilities.setupSeekBar(angleBar, activeColor, nightMode);
UiUtilities.setupSlider(angleBar, nightMode, activeColor, true);
}
private void setupSelectRouteRecalcDistance(PreferenceScreen screen) {

View file

@ -71,7 +71,7 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot
}
int contentPaddingSmall = app.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
int dialogContentMargin = app.getResources().getDimensionPixelSize(R.dimen.dialog_content_margin);
int contentPadding = app.getResources().getDimensionPixelSize(R.dimen.content_padding);
OsmandSettings.MetricsConstants mc = settings.METRIC_SYSTEM.get();
if (mc == OsmandSettings.MetricsConstants.KILOMETERS_AND_METERS) {
@ -80,14 +80,16 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot
entryValues = new Float[]{9.1f, 18.3f, 30.5f, 45.7f, 91.5f, 183.0f, 482.0f, 965.0f, 1609.0f};
}
final int appModeColor = appMode.getIconColorInfo().getColor(nightMode);
final int appModeColorId = appMode.getIconColorInfo().getColor(nightMode);
final int appModeColor = ContextCompat.getColor(app, appModeColorId);
final int activeColor = AndroidUtils.resolveAttribute(app, R.attr.active_color_basic);
final int disabledColor = AndroidUtils.resolveAttribute(app, android.R.attr.textColorSecondary);
String title = getString(R.string.recalculate_route_in_deviation);
items.add(new TitleItem(title));
final View sliderView = UiUtilities.getInflater(getContext(), nightMode).inflate(R.layout.bottom_sheet_item_slider_with_two_text, null);
final View sliderView = UiUtilities.getInflater(getContext(), nightMode)
.inflate(R.layout.bottom_sheet_item_slider_with_two_text, null);
slider = sliderView.findViewById(R.id.slider);
tvSliderTitle = sliderView.findViewById(android.R.id.title);
tvSliderTitle.setText(getString(R.string.distance));
@ -102,7 +104,7 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot
final BottomSheetItemWithCompoundButton[] preferenceBtn = new BottomSheetItemWithCompoundButton[1];
preferenceBtn[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder()
.setChecked(enabled)
.setCompoundButtonColorId(appModeColor)
.setCompoundButtonColorId(appModeColorId)
.setTitle(enabled ? on : off)
.setTitleColorId(enabled ? activeColor : disabledColor)
.setCustomView(getCustomButtonView(enabled))
@ -129,7 +131,7 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot
items.add(preferenceBtn[0]);
items.add(new DividerSpaceItem(app, contentPaddingSmall));
items.add(new LongDescriptionItem(getString(R.string.select_distance_route_will_recalc)));
items.add(new DividerSpaceItem(app, dialogContentMargin));
items.add(new DividerSpaceItem(app, contentPadding));
slider.addOnChangeListener(new Slider.OnChangeListener() {
@Override
@ -141,6 +143,7 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot
}
}
});
UiUtilities.setupSlider(slider, nightMode, appModeColor, true);
items.add(new BaseBottomSheetItem.Builder()
.setCustomView(sliderView)
.create());

View file

@ -2,7 +2,6 @@ package net.osmand.plus.srtmplugin;
import android.app.Activity;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.net.Uri;
@ -77,8 +76,8 @@ public class TerrainFragment extends BaseOsmAndFragment implements View.OnClickL
private boolean nightMode;
private boolean terrainEnabled;
private int colorProfileRes;
private int colorProfile;
private ColorStateList colorProfileStateList;
private TextView downloadDescriptionTv;
private TextView transparencyValueTv;
@ -115,8 +114,8 @@ public class TerrainFragment extends BaseOsmAndFragment implements View.OnClickL
uiUtilities = app.getUIUtilities();
nightMode = !settings.isLightContent();
srtmPlugin = OsmandPlugin.getPlugin(SRTMPlugin.class);
colorProfile = settings.getApplicationMode().getIconColorInfo().getColor(nightMode);
colorProfileStateList = ColorStateList.valueOf(ContextCompat.getColor(app, colorProfile));
colorProfileRes = settings.getApplicationMode().getIconColorInfo().getColor(nightMode);
colorProfile = ContextCompat.getColor(app, colorProfileRes);
terrainEnabled = srtmPlugin.isTerrainLayerEnabled();
super.onCreate(savedInstanceState);
}
@ -174,15 +173,8 @@ public class TerrainFragment extends BaseOsmAndFragment implements View.OnClickL
switchCompat.setOnClickListener(this);
slopeBtn.setOnClickListener(this);
transparencySlider.setTrackColorActive(colorProfileStateList);
transparencySlider.setThumbColor(colorProfileStateList);
transparencySlider.setLabelBehavior(Slider.LABEL_GONE);
zoomSlider.setTrackColorActive(colorProfileStateList);
zoomSlider.setThumbColor(colorProfileStateList);
zoomSlider.setLabelBehavior(Slider.LABEL_GONE);
zoomSlider.setTickColor(nightMode
? ColorStateList.valueOf(R.color.color_white)
: ColorStateList.valueOf(R.color.color_black));
UiUtilities.setupSlider(transparencySlider, nightMode, colorProfile);
UiUtilities.setupSlider(zoomSlider, nightMode, colorProfile, true);
transparencySlider.addOnSliderTouchListener(this);
zoomSlider.addOnSliderTouchListener(this);
@ -264,7 +256,7 @@ public class TerrainFragment extends BaseOsmAndFragment implements View.OnClickL
String transparency = transparencyValue + "%";
int minZoom = Math.max(srtmPlugin.getTerrainMinZoom(), TERRAIN_MIN_ZOOM);
int maxZoom = Math.min(srtmPlugin.getTerrainMaxZoom(), TERRAIN_MAX_ZOOM);
iconIv.setImageDrawable(uiUtilities.getIcon(R.drawable.ic_action_hillshade_dark, colorProfile));
iconIv.setImageDrawable(uiUtilities.getIcon(R.drawable.ic_action_hillshade_dark, colorProfileRes));
stateTv.setText(R.string.shared_string_enabled);
transparencySlider.setValue(transparencyValue);
transparencyValueTv.setText(transparency);

View file

@ -18,22 +18,25 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.core.view.ViewPropertyAnimatorCompat;
import androidx.core.view.ViewPropertyAnimatorListener;
import com.google.android.material.slider.Slider;
import net.osmand.AndroidUtils;
import net.osmand.Location;
import net.osmand.core.android.MapRendererContext;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.data.RotatedTileBox;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmAndAppCustomization;
import net.osmand.plus.OsmAndLocationProvider;
import net.osmand.plus.OsmAndLocationSimulation;
@ -97,7 +100,7 @@ public class MapControlsLayer extends OsmandMapLayer {
// private RulerControl rulerControl;
// private List<MapControls> allControls = new ArrayList<MapControls>();
private SeekBar transparencyBar;
private Slider transparencySlider;
private LinearLayout transparencyBarLayout;
private static CommonPreference<Integer> transparencySetting;
private boolean isTransparencyBarEnabled;
@ -921,28 +924,19 @@ public class MapControlsLayer extends OsmandMapLayer {
// /////////////// Transparency bar /////////////////////////
private void initTransparencyBar() {
transparencyBarLayout = (LinearLayout) mapActivity.findViewById(R.id.map_transparency_layout);
transparencyBar = (SeekBar) mapActivity.findViewById(R.id.map_transparency_seekbar);
transparencyBar.setMax(255);
transparencySlider = (Slider) mapActivity.findViewById(R.id.map_transparency_slider);
transparencySlider.setValueTo(255);
if (transparencySetting != null) {
transparencyBar.setProgress(transparencySetting.get());
transparencySlider.setValue(transparencySetting.get());
transparencyBarLayout.setVisibility(View.VISIBLE);
} else {
transparencyBarLayout.setVisibility(View.GONE);
}
transparencyBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
transparencySlider.addOnChangeListener(new Slider.OnChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) {
if (transparencySetting != null) {
transparencySetting.set(progress);
transparencySetting.set((int) value);
mapActivity.getMapView().refreshMap();
}
}
@ -961,18 +955,21 @@ public class MapControlsLayer extends OsmandMapLayer {
public void showTransparencyBar(CommonPreference<Integer> transparenPreference,
boolean isTransparencyBarEnabled) {
this.isTransparencyBarEnabled = isTransparencyBarEnabled;
ApplicationMode appMode = app.getSettings().getApplicationMode();
if (MapControlsLayer.transparencySetting != transparenPreference) {
MapControlsLayer.transparencySetting = transparenPreference;
}
if (transparenPreference != null && isTransparencyBarEnabled) {
transparencyBarLayout.setVisibility(View.VISIBLE);
transparencyBar.setProgress(transparenPreference.get());
transparencySlider.setValue(transparenPreference.get());
} else {
transparencyBarLayout.setVisibility(View.GONE);
}
boolean nightMode = app.getDaynightHelper().isNightModeForMapControls();
UiUtilities.setupSeekBar(app, transparencyBar, nightMode, true);
int selectedModeColor = ContextCompat.getColor(app,
appMode.getIconColorInfo().getColor(nightMode));
UiUtilities.setupSlider(transparencySlider, nightMode, selectedModeColor);
}
public void hideTransparencyBar() {

View file

@ -1,189 +0,0 @@
/*
* Copyright (c) 2010 Jordan Frank, HumanSense Project, McGill University
* Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
* See LICENSE for more information
*/
package net.osmand.plus.views;
import net.osmand.plus.R;
import android.content.Context;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
/**
* A preference item that uses a seek-bar, or slider to set the value.
*
* @author Jordan Frank <jordan.frank@cs.mcgill.ca>
*
*/
public class SeekBarPreference extends DialogPreference implements
SeekBar.OnSeekBarChangeListener {
private static final String MAX_VALUE_ID = "max";
private static final String DEFAULT_VALUE_ID = "defaultValue";
private static final String DIALOG_TEXT_ID = "text";
private static final String DIALOG_MESSAGE_ID = "dialogMessage";
private static final String ANDROID_NS = "http://schemas.android.com/apk/res/android";
private SeekBar seekBar;
private TextView dialogTextView, valueTextView;
private final Context context;
private final String dialogText, valueText;
private final int defaultValue;
private int maxValue, value, valueToSave = 0;
/**
* Default constructor.
*
* @param context
* The application context.
* @param attrs
* The attribute set, containing the text, title, values, and
* range for the slider dialog.
*/
public SeekBarPreference(final Context context, final AttributeSet attrs) {
super(context, attrs);
this.context = context;
dialogText = context.getResources().getString(
attrs.getAttributeResourceValue(ANDROID_NS, DIALOG_MESSAGE_ID,
R.string.app_name));
valueText = attrs.getAttributeValue(ANDROID_NS, DIALOG_TEXT_ID);
defaultValue = attrs.getAttributeIntValue(ANDROID_NS, DEFAULT_VALUE_ID,
0);
maxValue = attrs.getAttributeIntValue(ANDROID_NS, MAX_VALUE_ID, 100);
}
/**
* Default constructor.
*
* @param context
* The application context.
* @param attrs
* The attribute set, containing the text, title, values, and
* range for the slider dialog.
*/
public SeekBarPreference(final Context context, int dialogTextId, int defValue, int maxValue) {
super(context, null);
this.context = context;
dialogText = context.getResources().getString(dialogTextId);
valueText = null;
this.defaultValue = defValue;
this.maxValue = maxValue;
}
public int getMax() {
return maxValue;
}
public int getValue() {
return value;
}
@Override
protected void onBindDialogView(final View v) {
super.onBindDialogView(v);
seekBar.setMax(maxValue);
seekBar.setProgress(value);
}
@Override
protected View onCreateDialogView() {
LinearLayout.LayoutParams params;
final LinearLayout layout = new LinearLayout(context);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(6, 6, 6, 6);
dialogTextView = new TextView(context);
if (dialogText != null) {
dialogTextView.setText(dialogText);
}
layout.addView(dialogTextView);
valueTextView = new TextView(context);
valueTextView.setGravity(Gravity.CENTER_HORIZONTAL);
valueTextView.setTextSize(32);
params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layout.addView(valueTextView, params);
seekBar = new SeekBar(context);
seekBar.setOnSeekBarChangeListener(this);
layout.addView(seekBar, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
if (shouldPersist()) {
value = getPersistedInt(defaultValue);
}
seekBar.setMax(maxValue);
seekBar.setProgress(value);
return layout;
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if(positiveResult){
if (shouldPersist()) {
persistInt(valueToSave);
}
callChangeListener(Integer.valueOf(valueToSave));
} else {
this.valueToSave = value;
}
}
@Override
public void onProgressChanged(final SeekBar seek, final int value,
final boolean fromTouch) {
final String t = String.valueOf(value);
valueTextView.setText(valueText == null ? t : t + valueText);
valueToSave = value;
}
@Override
protected void onSetInitialValue(final boolean restore,
final Object defaultValue) {
super.onSetInitialValue(restore, defaultValue);
if (restore) {
value = shouldPersist() ? getPersistedInt(this.defaultValue) : 0;
} else {
value = (Integer) defaultValue;
}
valueToSave = value;
}
@Override
public void onStartTrackingTouch(final SeekBar seek) {
}
@Override
public void onStopTrackingTouch(final SeekBar seek) {
}
public void setMax(final int max) {
maxValue = max;
}
public void setValue(final int value) {
this.value = value;
this.valueToSave = value;
persistInt(value);
if (seekBar != null) {
seekBar.setProgress(value);
}
}
}

View file

@ -633,7 +633,8 @@ public class TravelDbHelper {
}
public String getGPXName(TravelArticle article) {
return article.getTitle().replace('/', '_').replace('\'', '_').replace('\"', '_') + ".gpx";
return article.getTitle().replace('/', '_').replace('\'', '_')
.replace('\"', '_') + IndexConstants.GPX_FILE_EXT;
}
public File createGpxFile(TravelArticle article) {