conflict resolved

This commit is contained in:
simon 2020-10-09 14:24:15 +03:00
commit 79b542384d
174 changed files with 3497 additions and 2987 deletions

View file

@ -27,7 +27,7 @@ public abstract class MapRenderingTypes {
private static final Log log = PlatformUtil.getLog(MapRenderingTypes.class);
public static final String[] langs = new String[] { "af", "als", "ar", "az", "be", "bg", "bn", "bpy", "br", "bs", "ca", "ceb", "cs", "cy", "da", "de", "el", "eo", "es", "et", "eu", "fa", "fi", "fr", "fy", "ga", "gl", "he", "hi", "hsb",
"hr", "ht", "hu", "hy", "id", "is", "it", "ja", "ka", "ko", "ku", "la", "lb", "lo", "lt", "lv", "mk", "ml", "mr", "ms", "nds", "new", "nl", "nn", "no", "nv", "os", "pl", "pms", "pt", "ro", "ru", "sc", "sh", "sk", "sl", "sq", "sr", "sv", "sw", "ta", "te", "th", "tl", "tr", "uk", "vi", "vo", "zh", "zh-hans", "zh-hant", };
"hr", "ht", "hu", "hy", "id", "is", "it", "ja", "ka", "kn", "ko", "ku", "la", "lb", "lo", "lt", "lv", "mk", "ml", "mr", "ms", "nds", "new", "nl", "nn", "no", "nv", "os", "pl", "pms", "pt", "ro", "ru", "sc", "sh", "sk", "sl", "sq", "sr", "sv", "sw", "ta", "te", "th", "tl", "tr", "uk", "vi", "vo", "zh", "zh-hans", "zh-hant", };
public final static byte RESTRICTION_NO_RIGHT_TURN = 1;

View file

@ -267,4 +267,8 @@
<string name="status_widget_title">تتبع حالة أوسماند</string>
<string name="back_to_osmand">العودة إلى OsmAnd</string>
<string name="duration_ago">%1$s منذ</string>
<string name="send_report">إرسال التقرير</string>
<string name="shared_string_export">تصدير</string>
<string name="logcat_buffer">سجل الاستخدام</string>
<string name="logcat_buffer_descr">التحقق من السجلات التفصيلية للتطبيق ومشاركتها</string>
</resources>

View file

@ -268,4 +268,8 @@
<string name="last_response_duration">Última respuesta: Hace %1$s</string>
<string name="duration_ago">Hace %1$s</string>
<string name="shared_string_error_short">ERR</string>
<string name="shared_string_export">Exportar</string>
<string name="logcat_buffer">Búfer de Logcat</string>
<string name="logcat_buffer_descr">Comprueba y comparte los registros detallados de la aplicación</string>
<string name="send_report">Enviar informe</string>
</resources>

View file

@ -267,4 +267,8 @@
<string name="last_response_date">Última resposta: %1$s</string>
<string name="last_update_from_telegram_date">Última atualização do Telegram: %1$s</string>
<string name="shared_string_error_short">ERR</string>
<string name="send_report">Enviar o relatório</string>
<string name="shared_string_export">Exportar</string>
<string name="logcat_buffer">Buffer de logcat</string>
<string name="logcat_buffer_descr">Verifique e compartilhe registos detalhados da app</string>
</resources>

View file

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M7,13C5.8954,13 5,13.8954 5,15C5,16.1046 5.8954,17 7,17H20C20.5523,17 21,17.4477 21,18C21,18.5523 20.5523,19 20,19H7C4.7909,19 3,17.2091 3,15C3,12.7909 4.7909,11 7,11H16.5C17.0523,11 17.5,11.4477 17.5,12C17.5,12.5523 17.0523,13 16.5,13H7Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillType="evenOdd"
android:fillAlpha="0.5"/>
<path
android:pathData="M21,18C21,19.1046 20.1046,20 19,20C17.8954,20 17,19.1046 17,18C17,16.8954 17.8954,16 19,16C20.1046,16 21,16.8954 21,18Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M3,6C3,4.3432 4.3432,3 6,3C7.3062,3 8.4175,3.8348 8.8293,5H17C19.2091,5 21,6.7909 21,9C21,11.2091 19.2091,13 17,13H16.5C15.9477,13 15.5,12.5523 15.5,12C15.5,11.4477 15.9477,11 16.5,11H17C18.1046,11 19,10.1046 19,9C19,7.8954 18.1046,7 17,7H8.8293C8.4175,8.1652 7.3062,9 6,9C4.3432,9 3,7.6568 3,6ZM7,6C7,5.4477 6.5523,5 6,5C5.4477,5 5,5.4477 5,6C5,6.5523 5.4477,7 6,7C6.5523,7 7,6.5523 7,6Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="M7,6C7,6.5523 6.5523,7 6,7C5.4477,7 5,6.5523 5,6C5,5.4477 5.4477,5 6,5C6.5523,5 7,5.4477 7,6Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillAlpha="0.5"/>
</vector>

View file

@ -0,0 +1,39 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0"
android:fillColor="#ffffff"/>
<path
android:pathData="M23,22L21,22A1,1 0,0 0,20 23L20,23A1,1 0,0 0,21 24L23,24A1,1 0,0 0,24 23L24,23A1,1 0,0 0,23 22z"
android:fillColor="#8AC826"/>
<path
android:pathData="M9,10L11,10A1,1 0,0 1,12 11L12,11A1,1 0,0 1,11 12L9,12A1,1 0,0 1,8 11L8,11A1,1 0,0 1,9 10z"
android:fillColor="#140579"/>
<path
android:pathData="M14,10L16,10A1,1 0,0 1,17 11L17,11A1,1 0,0 1,16 12L14,12A1,1 0,0 1,13 11L13,11A1,1 0,0 1,14 10z"
android:fillColor="#FFC93A"/>
<path
android:pathData="M19,10L23,10A1,1 0,0 1,24 11L24,11A1,1 0,0 1,23 12L19,12A1,1 0,0 1,18 11L18,11A1,1 0,0 1,19 10z"
android:fillColor="#8AC826"/>
<path
android:pathData="M23,14L20,14A1,1 0,0 0,19 15L19,15A1,1 0,0 0,20 16L23,16A1,1 0,0 0,24 15L24,15A1,1 0,0 0,23 14z"
android:fillColor="#8AC826"/>
<path
android:pathData="M17,14L15,14A1,1 0,0 0,14 15L14,15A1,1 0,0 0,15 16L17,16A1,1 0,0 0,18 15L18,15A1,1 0,0 0,17 14z"
android:fillColor="#FFC93A"/>
<path
android:pathData="M12,14L9,14A1,1 0,0 0,8 15L8,15A1,1 0,0 0,9 16L12,16A1,1 0,0 0,13 15L13,15A1,1 0,0 0,12 14z"
android:fillColor="#140579"/>
<path
android:pathData="M23,18L18,18A1,1 0,0 0,17 19L17,19A1,1 0,0 0,18 20L23,20A1,1 0,0 0,24 19L24,19A1,1 0,0 0,23 18z"
android:fillColor="#8AC826"/>
<path
android:pathData="M15,18L12,18A1,1 0,0 0,11 19L11,19A1,1 0,0 0,12 20L15,20A1,1 0,0 0,16 19L16,19A1,1 0,0 0,15 18z"
android:fillColor="#FFC93A"/>
<path
android:pathData="M9,18L9,18A1,1 0,0 0,8 19L8,19A1,1 0,0 0,9 20L9,20A1,1 0,0 0,10 19L10,19A1,1 0,0 0,9 18z"
android:fillColor="#140579"/>
</vector>

View file

@ -6,33 +6,37 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="start"
osmand:typeface="@string/font_roboto_regular"
android:layout_weight="1"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
tools:text="title"/>
osmand:typeface="@string/font_roboto_regular"
tools:text="Some very long title to check overlapped texts" />
<Space
android:layout_width="@dimen/content_padding"
android:layout_height="match_parent" />
<net.osmand.plus.widgets.TextViewEx
android:id="@android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
osmand:typeface="@string/font_roboto_medium"
android:textColor="?attr/active_color_basic"
android:textSize="@dimen/default_list_text_size"
tools:text="summary"/>
osmand:typeface="@string/font_roboto_medium"
tools:text="summary" />
</FrameLayout>
</LinearLayout>
<com.google.android.material.slider.Slider
android:id="@+id/slider"

View file

@ -1074,7 +1074,7 @@
<string name="rendering_category_routes">المسارات الرياضية</string>
<string name="rendering_category_transport">وسائل المواصلات</string>
<string name="rendering_category_others">سمات أخرى للخريطة</string>
<string name="map_widget_appearance_rem">العناصر الاخرى</string>
<string name="map_widget_appearance_rem">العناصر الأخرى</string>
<string name="map_widget_top">شريط المعلومات</string>
<string name="map_widget_right">العدادات على اليمين</string>
<string name="map_widget_left">العدادات على اليسار</string>
@ -3413,7 +3413,7 @@
<string name="select_nav_icon_descr">سترى الأيقونة فقط أثناء الملاحة أو أثناء التحرك.</string>
<string name="button_rate">قيم</string>
<string name="select_map_icon_descr">تظهر أيقونة الخريطة فقط على الخريطة ، وتتغير أثناء التنقل إلى أيقونة التنقل.</string>
<string name="logcat_buffer_descr">تحقق وتبادل سجلات مفصلة من التطبيق</string>
<string name="logcat_buffer_descr">التحقق من السجلات التفصيلية للتطبيق ومشاركتها</string>
<string name="search_offline_geo_error">تعذر تحليل الهدف الجغرافي \'%s\'.</string>
<string name="permission_is_required">الإذن مطلوب لاستخدام هذا الخيار.</string>
<string name="monitoring_min_speed_descr_side_effect">اعراض جانبية: سيفقد المسار الخاص بك جميع الأقسام التي لم يتحقق فيها معيار الحد الأدنى للسرعة (على سبيل المثال ، حيث تدفع دراجتك أعلى تل شديد الانحدار). أيضا ، لن تكون هناك معلومات حول فترات الراحة ، مثل الاستراحات. هذا له تأثيرات على أي تحليل أو مرحلة ما بعد المعالجة ، مثل عند محاولة تحديد المدة الإجمالية لرحلتك ، أو وقت الحركة ، أو متوسط سرعتك.</string>
@ -3893,4 +3893,12 @@
<string name="sort_name_ascending">الاسم: أ ي</string>
<string name="start_finish_icons">رموز البدء/الانتهاء</string>
<string name="contour_lines_thanks">شكرا لشرائك \"خطوط الكنتور\"</string>
<string name="osm_live_payment_desc_hw">رسوم الاشتراك ستفرض كل شهر. يمكنك إلغاء اشتراكك متى أردت عبر Google play.</string>
<string name="osm_live_payment_subscription_management_hw">سيتم تحصيل المبلغ على حساب AppGallery الخاص بك عند تأكيد الشراء.
\n
\nيتم تجديد الاشتراك تلقائيًا ما لم يتم إلغاؤه قبل تاريخ التجديد. سيتم خصم حسابك على فترة التجديد (شهر/ثلاثة أشهر/سنة) فقط في تاريخ التجديد.
\n
\nيمكنك إدارة وإلغاء الاشتراكات الخاصة بك عن طريق الانتقال إلى إعدادات AppGallery.</string>
<string name="routing_attr_avoid_footways_description">تجنب الممرات</string>
<string name="routing_attr_avoid_footways_name">تجنب الممرات</string>
</resources>

View file

@ -3826,7 +3826,7 @@
<string name="plan_route_select_track_file_for_open">Wählen Sie eine Trackdatei zum Öffnen aus.</string>
<string name="shared_string_done">Fertig</string>
<string name="overwrite_track">Track überschreiben</string>
<string name="threshold_distance">Schwellenwert-Distanz</string>
<string name="threshold_distance">Maximaler Abstand</string>
<string name="save_as_new_track">Als neuen Track speichern</string>
<string name="reverse_route">Route umkehren</string>
<string name="route_between_points_whole_track_button_desc">Der gesamte Track wird mit dem ausgewählten Profil neu berechnet.</string>
@ -3910,4 +3910,12 @@
<string name="sort_name_ascending">Name: A Z</string>
<string name="start_finish_icons">Start-/Ziel-Symbole</string>
<string name="contour_lines_thanks">Vielen Dank für den Kauf von \'Höhenlinien\'</string>
<string name="osm_live_payment_desc_hw">Das Abonnement wird pro ausgewähltem Zeitraum berechnet. Sie können das Abonnement jederzeit über die AppGallery kündigen.</string>
<string name="osm_live_payment_subscription_management_hw">Die Bezahlung wird Ihrem AppGallery-Konto bei der Bestätigung des Kaufs belastet.
\n
\n Das Abonnement verlängert sich automatisch, sofern es nicht vor dem Verlängerungsdatum gekündigt wird. Ihr Konto wird für den Verlängerungszeitraum (Monat / drei Monate / Jahr) nur am Verlängerungsdatum belastet.
\n
\n Sie können Ihre Abonnements verwalten und kündigen, indem Sie zu Ihren AppGallery-Einstellungen gehen.</string>
<string name="routing_attr_avoid_footways_description">Vermeidet Fußwege</string>
<string name="routing_attr_avoid_footways_name">Keine Fußwege</string>
</resources>

View file

@ -3909,4 +3909,12 @@
<string name="sort_name_ascending">Nombre: A Z</string>
<string name="start_finish_icons">Iconos de inicio/fin</string>
<string name="contour_lines_thanks">Gracias por comprar las «Curvas de nivel»</string>
<string name="osm_live_payment_desc_hw">La suscripción se cobra por el período elegido. Puedes cancelarlo en cualquier momento en AppGallery.</string>
<string name="osm_live_payment_subscription_management_hw">El pago será cargado a la cuenta de AppGallery al confirmar la compra.
\n
\nLa suscripción se renueva automáticamente a menos que se cancele antes de la fecha de renovación. La cuenta será cargada por el período de renovación (mes/trimestre/año) sólo en la fecha de renovación.
\n
\nPuedes administrar y cancelar las suscripciones accediendo a los ajustes de AppGallery.</string>
<string name="routing_attr_avoid_footways_description">Evita pasar por las veredas o aceras</string>
<string name="routing_attr_avoid_footways_name">Evitar veredas/aceras</string>
</resources>

View file

@ -3905,4 +3905,13 @@
<string name="sort_name_ascending">Nombre: A Z</string>
<string name="sort_last_modified">Último modificado</string>
<string name="start_finish_icons">Iconos de inicio/fin</string>
<string name="contour_lines_thanks">Gracias por comprar las «Curvas de nivel»</string>
<string name="osm_live_payment_desc_hw">La suscripción se cobra por el período elegido. Puedes cancelarlo en cualquier momento en AppGallery.</string>
<string name="osm_live_payment_subscription_management_hw">El pago será cargado a la cuenta de AppGallery al confirmar la compra.
\n
\nLa suscripción se renueva automáticamente a menos que se cancele antes de la fecha de renovación. La cuenta será cargada por el período de renovación (mes/trimestre/año) sólo en la fecha de renovación.
\n
\nPuedes administrar y cancelar las suscripciones accediendo a los ajustes de AppGallery.</string>
<string name="routing_attr_avoid_footways_description">Evita pasar por aceras o veredas</string>
<string name="routing_attr_avoid_footways_name">Evitar aceras</string>
</resources>

View file

@ -3764,4 +3764,13 @@
<string name="sort_name_ascending">Nimi: A Z</string>
<string name="screen_timeout">Ekraani väljalülitamine</string>
<string name="app_mode_wheelchair_forward">Ratastool edasi</string>
<string name="routing_attr_avoid_footways_description">Väldi jalgteid</string>
<string name="routing_attr_avoid_footways_name">Väldi jalgteid</string>
<string name="contour_lines_thanks">Täname „Kõrgusjoonte“ ostu eest</string>
<string name="osm_live_payment_subscription_management_hw">Ostukinnituse saabumisel arveldame tellimuse eest sinu AppGallery konto alusel.
\n
\nKui sa ei tühista tellimust enne uue perioodi algust, siis tellimus pikeneb automaatselt ning arveldame järgmise ajavahemiku eest (kuu/kvartal/aasta) selle alguses.
\n
\nTellimust saad hallata ja tühistada AppGallery seadistustest.</string>
<string name="osm_live_payment_desc_hw">Arveldame tellimuse eest valitud ajavahemiku alusel. Seda saad sa vabalt valitud ajal tühistada AppGallery\'s.</string>
</resources>

View file

@ -3885,4 +3885,7 @@
<string name="sort_name_ascending">Nom : A Z</string>
<string name="start_finish_icons">Icônes de départ / arrivée</string>
<string name="contour_lines_thanks">Merci pour votre achat de \'Courbes de niveaux\'</string>
<string name="osm_live_payment_desc_hw">Abonnement facturé pour chaque période sélectionnée. Annulation possible à tout moment sur AppGallery.</string>
<string name="routing_attr_avoid_footways_description">Éviter les trottoirs</string>
<string name="routing_attr_avoid_footways_name">Éviter les trottoirs</string>
</resources>

View file

@ -3911,4 +3911,12 @@
<string name="sort_name_ascending">שם: א ת</string>
<string name="start_finish_icons">סמלי התחלה/סיום</string>
<string name="contour_lines_thanks">תודה לך על רכישת ‚קווי מתאר’</string>
<string name="routing_attr_avoid_footways_description">הימנעות משבילי הולכי רגל</string>
<string name="routing_attr_avoid_footways_name">הימנעות משבילי הולכי רגל</string>
<string name="osm_live_payment_desc_hw">המינוי חויב לתקופה הנבחרת. ניתן לבטל דרך ה־AppGallery בכל עת.</string>
<string name="osm_live_payment_subscription_management_hw">התשלום יחויב דרך חשבון ה־AppGallery שלך עם אישור הרכישה.
\n
\nהמינוי מתחדש אוטומטי אלא אם כן בוטל בטרם תאריך החידוש. החשבון שלך יחויב על תקופת החידוש (חודש/שלושה חודשים/שנה) רק בתאריך החידוש.
\n
\nניתן לנהל ולבטל את המינויים שלך דרך ההגדרות ב־AppGallery שלך.</string>
</resources>

View file

@ -3901,4 +3901,12 @@
<string name="sort_name_ascending">Nome: A Z</string>
<string name="start_finish_icons">Ícones de início/término</string>
<string name="contour_lines_thanks">Obrigado por adquirir \'curvas de nível\'</string>
<string name="osm_live_payment_desc_hw">Assinatura cobrada por período selecionado. Cancele no AppGallery a qualquer momento.</string>
<string name="osm_live_payment_subscription_management_hw">O pagamento será cobrado em sua conta AppGallery na confirmação da compra.
\n
\nA assinatura é renovada automaticamente, a menos que seja cancelada antes da data de renovação. Sua conta será cobrada pelo período de renovação (mês/três meses/ano) apenas na data de renovação.
\n
\nVocê pode gerenciar e cancelar suas assinaturas acessando as configurações do AppGallery.</string>
<string name="routing_attr_avoid_footways_description">Evite passarelas</string>
<string name="routing_attr_avoid_footways_name">Evite passarelas</string>
</resources>

View file

@ -3908,4 +3908,12 @@
<string name="sort_name_ascending">Nome: A Z</string>
<string name="start_finish_icons">Ícones de início/fim</string>
<string name="contour_lines_thanks">Obrigado por comprar \'Curvas de nível\'</string>
<string name="osm_live_payment_desc_hw">Assinatura cobrada por período selecionado. Cancele-a na AppGallery a qualquer momento.</string>
<string name="osm_live_payment_subscription_management_hw">O pagamento será debitado na sua conta AppGallery no momento da confirmação da compra.
\n
\nA assinatura é renovada automaticamente, a menos que seja cancelada antes da data de renovação. A sua conta será cobrada pelo período de renovação (mês/três meses/ano) apenas na data de renovação.
\n
\nPode gerir e cancelar as suas subscrições a ir às definições da sua AppGallery.</string>
<string name="routing_attr_avoid_footways_description">Evitar passeios</string>
<string name="routing_attr_avoid_footways_name">Evitar passeios</string>
</resources>

View file

@ -73,7 +73,7 @@
<string name="select_postcode">Поиск почтового индекса</string>
<string name="quick_action_take_audio_note">Запись аудио⁣</string>
<string name="quick_action_take_video_note">Записать видео</string>
<string name="quick_action_take_photo_note">Фотозаметка</string>
<string name="quick_action_take_photo_note">Сделать фото</string>
<string name="quick_action_add_osm_bug">OSM-заметка</string>
<string name="parking_options">Функции парковки</string>
<string name="full_version_thanks">Благодарим вас за покупку платной версии OsmAnd.</string>
@ -531,10 +531,10 @@
<string name="overlay_transparency">Прозрачность наложения</string>
<string name="map_transparency_descr">Отрегулируйте прозрачность основной карты.</string>
<string name="map_transparency">Прозрачность основной карты</string>
<string name="layer_underlay">Карта подложки</string>
<string name="layer_underlay">Карта подложки</string>
<string name="map_underlay">Карта подложки</string>
<string name="map_underlay_descr">Выберите карту подложки</string>
<string name="layer_overlay">Карта наложения</string>
<string name="layer_overlay">Карта наложения</string>
<string name="map_overlay">Карта наложения</string>
<string name="map_overlay_descr">Выберите слой наложения поверх основной карты</string>
<string name="tile_source_already_installed">Карта уже установлена, настройки будут обновлены.</string>
@ -689,7 +689,7 @@
<string name="layer_route">Маршрут</string>
<string name="layer_osm_bugs">OSM-заметки (онлайн)</string>
<string name="layer_poi">POI…</string>
<string name="layer_map">Источник карты</string>
<string name="layer_map">Источник карты</string>
<string name="menu_layers">Слои</string>
<string name="context_menu_item_search_poi">Поиск POI</string>
<string name="use_trackball_descr">Использовать трекбол для перемещения по карте.</string>
@ -1179,7 +1179,7 @@
<string name="context_menu_item_last_intermediate_point">Последний промежуточный пункт</string>
<string name="context_menu_item_first_intermediate_point">Сделать начальной остановкой</string>
<string name="add_as_last_destination_point">Сделать последней остановкой</string>
<string name="add_as_first_destination_point">Сделать начальной остановкой</string>
<string name="add_as_first_destination_point">Первый промежуточный пункт</string>
<string name="replace_destination_point">Заменить пункт назначения</string>
<string name="new_destination_point_dialog">Пункт назначения уже задан</string>
<string name="target_point">Пункт %1$s</string>
@ -3580,8 +3580,7 @@
<string name="monitoring_min_speed_descr_remark">Примечание: проверка скорости &gt; 0: большинство модулей GPS сообщают значение скорости только в том случае, если алгоритм определяет, что вы движетесь, и ничего, если вы не перемещаетесь. Следовательно, использование параметра &gt; 0 в этом фильтре в некотором смысле приводит к обнаружению факта перемещения модуля GPS. Но даже если мы не производим данную фильтрацию во время записи, то всё равно эта функция используется при анализе GPX для определения скорректированного расстояния, то есть значение, отображаемое в этом поле, является расстоянием, записанным во время движения.</string>
<string name="multimedia_rec_split_title">Разделение записи</string>
<string name="live_monitoring_adress_descr">Укажите веб-адрес со следующими параметрами: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}.</string>
<string name="monitoring_min_accuracy_descr">"Будут записываться только точки, отвечающие
\n в минимальной точностью (в метрах/футах —зависит от настроек системы). Точность — это близость измерений к истинному положению, и она не связана напрямую с точностью, которая представляет собой разброс повторных измерений."</string>
<string name="monitoring_min_accuracy_descr">"Будут записываться только точки, отвечающие по показателю минимальной точности (в метрах или футах — зависит от настроек системы). Точность — это близость измерений к истинному положению, и она не связана напрямую с точностью, которая представляет собой разброс повторных измерений."</string>
<string name="monitoring_min_speed_descr_recommendation">Рекомендация: попробуйте сначала воспользоваться детектором движения через фильтр минимального смещения (B), что может дать лучшие результаты и вы потеряете меньше данных. Если треки остаются шумными на низких скоростях, попробуйте использовать ненулевые значения. Обратите внимание, что некоторые измерения могут вообще не указывать значения скорости (некоторые сетевые методы), и в этом случае ничего не будет записываться.</string>
<string name="slope_description">Для визуализации крутизны рельефа используются цвета.</string>
<string name="slope_read_more">Подробнее об уклонах можно прочитать в %1$s.</string>
@ -3904,4 +3903,12 @@
<string name="sort_name_ascending">Имя: А - Я</string>
<string name="start_finish_icons">Значки старта и финиша</string>
<string name="contour_lines_thanks">Спасибо за покупку \'Контурных линий\'</string>
<string name="routing_attr_avoid_footways_description">Избегать пешеходных дорожек</string>
<string name="routing_attr_avoid_footways_name">Избегать пешеходных дорожек</string>
<string name="osm_live_payment_desc_hw">Подписка взимается за выбранный период. Отмените её в AppGallery в любое время.</string>
<string name="osm_live_payment_subscription_management_hw">Оплата будет снята с вашей учетной записи AppGallery при подтверждении покупки.
\n
\nПодписка продлевается автоматически, если она не будет отменена до даты продления. С вашего счета будет взиматься плата за период продления (месяц/три месяца/год) только в дату продления.
\n
\nВы можете управлять своими подписками и отменять их, перейдя в настройки AppGallery.</string>
</resources>

View file

@ -3887,7 +3887,7 @@
<string name="shared_string_redo">Torra a fàghere</string>
<string name="release_3_8">• Funtzionalidade de pranificatione de un\'àndala agiornada: permitit de impreare castas diferentes de navigatzione pro segmentu e s\'inclusione de rastas
\n
\n • New Appearance menu for tracks: select color, thickness, display direction arrows, start/finish icons
\n • Menù de Aparèntzia nou pro sas rastas: ischerta su colore, grussària, visulaizatzione de sas fritzas de diretzione, iconas de incumintzu/fine
\n
\n • Visibilidade megiorada de sos nodos pro sas bitzicletas.
\n
@ -3905,4 +3905,12 @@
<string name="sort_name_ascending">Nùmene: A Z</string>
<string name="start_finish_icons">Iconas de incumintzu/fine</string>
<string name="contour_lines_thanks">Gràtzias pro àere comporadu \'Curvas de livellu\'</string>
<string name="osm_live_payment_desc_hw">Costu periòdicu de s\'abbonamentu. Lu podes anullare in AppGallery cando boles.</string>
<string name="osm_live_payment_subscription_management_hw">Su pagamentu at a èssere addebitadu a su contu tuo de AppGallery cando sa còmpora at a èssere cunfirmada.
\n
\nS\'abbonamentu si rinnovat a sa sola automaticamente, francu chi siat istadu annulladu in antis de sa die de su rinnovu. Su contu tuo at a bènnere addebitadu pro su perìodu de rinnovu (mese/tres meses/annu) in sa die de rinnovu ebbia.
\n
\nPodes amministrare e annullare sos abbonamentos tuos intrende in sas impostatziones de AppGallery tuas.</string>
<string name="routing_attr_avoid_footways_description">Èvita sos martzapiedis</string>
<string name="routing_attr_avoid_footways_name">Èvita sos martzapiedis</string>
</resources>

View file

@ -509,7 +509,7 @@
<string name="poi_register_office">Matričný úrad</string>
<string name="poi_pension_fund">Dôchodkový fond</string>
<string name="poi_migration">Imigračný úrad</string>
<string name="poi_tax_inspection">Daňová kontrola</string>
<string name="poi_tax_inspection">Daňový úrad</string>
<string name="poi_quarter">Štvrť</string>
<string name="poi_attraction_summer_toboggan">Suchá bobová dráha</string>
<string name="poi_attraction_swing_carousel">Kolotoč s hojdačkami</string>
@ -3652,4 +3652,5 @@
<string name="poi_covered_booth">Búdka</string>
<string name="poi_sms_no">Nie</string>
<string name="poi_sms_yes">Áno</string>
<string name="poi_taxi_office">Kancelária taxislužby</string>
</resources>

View file

@ -3654,8 +3654,8 @@
<string name="lang_lmo">Lombardsky</string>
<string name="ltr_or_rtl_combine_via_slash_with_space">%1$s / %2$s</string>
<string name="osm_live_payment_subscription_management">Platba bude stiahnutá z vášho účtu Google Play po potvrdení nákupu.
\n
\n Predplatné sa automaticky obnovuje ak nie je zrušené pred dátumom jeho obnovenia. Ďalšia platba za obdobie predplatného (mesiac/štvrťrok/rok) bude stiahnutá v deň obnovenia.
\n
\n Predplatné sa automaticky obnovuje, ak nie je zrušené pred dátumom jeho obnovenia. Ďalšia platba za obdobie predplatného (mesiac/štvrťrok/rok) bude stiahnutá v deň obnovenia.
\n
\n Vaše predplatné môžete spravovať a zrušiť v nastaveniach Google Play.</string>
<string name="search_poi_types">Hľadať typy bodov záujmu</string>
@ -3906,4 +3906,12 @@
<string name="sort_name_ascending">Názov: A Z</string>
<string name="start_finish_icons">Ikony štartu/cieľa</string>
<string name="contour_lines_thanks">Ďakujeme za zakúpenie modulu \'Vrstevnice\'</string>
<string name="osm_live_payment_desc_hw">Predplatné bude spoplatnené v zvolenom intervale. Predplatné zrušte kedykoľvek na AppGallery.</string>
<string name="osm_live_payment_subscription_management_hw">Platba bude stiahnutá z vášho účtu AppGallery po potvrdení nákupu.
\n
\nPredplatné sa automaticky obnovuje, ak nie je zrušené pred dátumom jeho obnovenia. Ďalšia platba za obdobie predplatného (mesiac/štvrťrok/rok) bude stiahnutá v deň obnovenia.
\n
\n Vaše predplatné môžete spravovať a zrušiť v nastaveniach AppGallery.</string>
<string name="routing_attr_avoid_footways_description">Vyhnúť sa chodníkom pre chodcov</string>
<string name="routing_attr_avoid_footways_name">Vyhnúť sa chodníkom</string>
</resources>

View file

@ -3861,4 +3861,12 @@
<string name="sort_name_ascending">İsim: A Z</string>
<string name="start_finish_icons">Başlangıç/bitiş simgeleri</string>
<string name="contour_lines_thanks">\'Eş yükselti eğrileri\'ni satın aldığınız için teşekkürler</string>
<string name="osm_live_payment_desc_hw">Abonelik seçilen dönem başına ücretlendirilir. İstediğiniz zaman AppGallery\'den iptal edin.</string>
<string name="osm_live_payment_subscription_management_hw">Ödeme, satın alma onaylandığında AppGallery hesabınızdan alınacaktır.
\n
\nYenileme tarihinden önce iptal edilmedikçe abonelik otomatik olarak yenilenir. Hesabınızdan yenileme süresi (ay/üç ay/yıl) için yalnızca yenileme tarihinde ücret alınacaktır.
\n
\n AppGallery ayarlarınıza giderek aboneliklerinizi yönetebilir ve iptal edebilirsiniz.</string>
<string name="routing_attr_avoid_footways_description">Yaya yollarından kaçın</string>
<string name="routing_attr_avoid_footways_name">Yaya yollarından kaçın</string>
</resources>

View file

@ -3901,4 +3901,12 @@
<string name="sort_name_ascending">名稱A Z</string>
<string name="start_finish_icons">開始/結束圖示</string>
<string name="contour_lines_thanks">感謝您購買 \'Contour lines\'</string>
<string name="osm_live_payment_desc_hw">按選定週期收取訂閱費用。隨時在 AppGallery 上取消。</string>
<string name="osm_live_payment_subscription_management_hw">確認購買後將會從您的 AppGallery 帳號中付款。
\n
\n除非在續訂日期前取消否則就會自動續訂。您的帳號將只會在續訂日期收取訂閱週期一個月三個月一年的費用。
\n
\n您可以在您的 AppGallery 設定中管理與取消您的訂閱。</string>
<string name="routing_attr_avoid_footways_description">避免人行道</string>
<string name="routing_attr_avoid_footways_name">避免人行道</string>
</resources>

View file

@ -15,6 +15,14 @@
<string name="clear_osm_token">Clear OpenStreetMap OAuth token</string>
<string name="perform_oauth_authorization">Log in via OAuth</string>
<string name="perform_oauth_authorization_description">Perform an OAuth Login to use osmedit features</string>
<string name="use_native_pt_desc">Switch to Java (safe) Public Transport routing calculation</string>
<string name="use_native_pt">Native Public Transport development</string>
<string name="use_fast_recalculation_desc">Recalculates only the initial part of the route. Can be used for long trips.</string>
<string name="complex_routing_descr">Two-phase routing for car navigation.</string>
<string name="use_complex_routing">Complex routing</string>
<string name="use_live_routing">OsmAnd Live data</string>
<string name="use_live_public_transport">OsmAnd Live data</string>
<string name="development">Development</string>
<string name="routing_attr_avoid_footways_name">Avoid footways</string>
<string name="routing_attr_avoid_footways_description">Avoid footways</string>
<string name="osm_live_payment_subscription_management_hw">Payment will be charged to your AppGallery account at the confirmation of purchase.\n\nSubscription automatically renews unless it is canceled before the renewal date. Your account will be charged for renewal period(month/three month/year) only on the renewal date.\n\nYou can manage and cancel your subscriptions by going to your AppGallery settings.</string>
@ -3666,7 +3674,6 @@
<string name="plugin_install_needs_network">You need to be online to install this plugin.</string>
<string name="get_plugin">Get</string>
<string name="use_fast_recalculation">Smart route recalculation</string>
<string name="use_fast_recalculation_desc">For long trips, only recalculate the initial part of the route.</string>
<string name="do_you_like_osmand">Do you like OsmAnd?</string>
<string name="we_really_care_about_your_opinion">Your opinion and feedback is valued.</string>
<string name="rate_this_app">Rate this app</string>

View file

@ -25,46 +25,11 @@
android:summaryOn="@string/shared_string_enabled"
android:title="@string/safe_mode" />
<net.osmand.plus.settings.preferences.SwitchPreferenceEx
android:key="pt_safe_mode"
android:layout="@layout/preference_with_descr_dialog_and_switch"
android:summaryOff="@string/shared_string_disabled"
android:summaryOn="@string/shared_string_enabled"
android:title="Native PT development" />
<PreferenceCategory
android:key="routing"
android:layout="@layout/preference_category_with_descr"
android:title="@string/routing_settings" />
<net.osmand.plus.settings.preferences.SwitchPreferenceEx
android:key="disable_complex_routing"
android:layout="@layout/preference_with_descr_dialog_and_switch"
android:summaryOff="@string/shared_string_disabled"
android:summaryOn="@string/shared_string_enabled"
android:title="@string/disable_complex_routing" />
<net.osmand.plus.settings.preferences.SwitchPreferenceEx
android:key="use_fast_recalculation"
android:layout="@layout/preference_with_descr_dialog_and_switch"
android:summaryOff="@string/shared_string_disabled"
android:summaryOn="@string/shared_string_enabled"
android:title="@string/use_fast_recalculation" />
<net.osmand.plus.settings.preferences.SwitchPreferenceEx
android:key="enable_osmc_routing"
android:layout="@layout/preference_with_descr_dialog_and_switch"
android:summaryOff="@string/shared_string_disabled"
android:summaryOn="@string/shared_string_enabled"
android:title="@string/use_osm_live_routing" />
<net.osmand.plus.settings.preferences.SwitchPreferenceEx
android:key="enable_osmc_public_transport"
android:layout="@layout/preference_with_descr_dialog_and_switch"
android:summaryOff="@string/shared_string_disabled"
android:summaryOn="@string/shared_string_enabled"
android:title="@string/use_osm_live_public_transport" />
<Preference
android:key="simulate_your_location"
android:layout="@layout/preference_with_descr"

View file

@ -58,7 +58,7 @@
android:layout="@layout/preference_button"
android:persistent="false"
android:title="@string/reorder_profiles"
app:fragment="net.osmand.plus.profiles.EditProfilesFragment"
app:fragment="net.osmand.plus.profiles.fragments.EditProfilesFragment"
tools:icon="@drawable/ic_action_edit_dark" />
<Preference

View file

@ -23,6 +23,7 @@ import net.osmand.plus.inapp.InAppPurchases.InAppPurchase;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription;
import net.osmand.plus.inapp.InAppPurchasesImpl.InAppPurchaseLiveUpdatesOldSubscription;
import net.osmand.plus.inapp.util.BillingManager;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.srtmplugin.SRTMPlugin;
import net.osmand.util.Algorithms;
@ -407,7 +408,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
}
}
}
OsmandSettings.OsmandPreference<Long> subscriptionCancelledTime = ctx.getSettings().LIVE_UPDATES_PURCHASE_CANCELLED_TIME;
OsmandPreference<Long> subscriptionCancelledTime = ctx.getSettings().LIVE_UPDATES_PURCHASE_CANCELLED_TIME;
if (!subscribedToLiveUpdates && ctx.getSettings().LIVE_UPDATES_PURCHASED.get()) {
if (subscriptionCancelledTime.get() == 0) {
subscriptionCancelledTime.set(System.currentTimeMillis());

View file

@ -31,7 +31,7 @@ import net.osmand.plus.inapp.InAppPurchases.InAppSubscription;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscriptionIntroductoryInfo;
import net.osmand.plus.inapp.InAppPurchasesImpl.InAppPurchaseLiveUpdatesOldSubscription;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.util.Algorithms;
import java.lang.ref.WeakReference;

View file

@ -223,6 +223,19 @@ public class FileUtils {
return tempDir;
}
public static boolean isWritable(File dirToTest) {
boolean isWriteable;
try {
dirToTest.mkdirs();
File writeTestFile = File.createTempFile("osmand_", ".tmp", dirToTest);
isWriteable = writeTestFile.exists();
writeTestFile.delete();
} catch (IOException e) {
isWriteable = false;
}
return isWriteable;
}
public interface RenameCallback {
void renamedTo(File file);
}

View file

@ -18,10 +18,10 @@ import net.osmand.AndroidUtils;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.layers.AidlMapLayer;
import net.osmand.plus.views.layers.MapInfoLayer;

View file

@ -25,7 +25,7 @@ import net.osmand.core.jni.ResolvedMapStyle;
import net.osmand.core.jni.SwigUtilities;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.render.RendererRegistry;
import net.osmand.render.RenderingRuleProperty;
import net.osmand.render.RenderingRuleStorageProperties;

View file

@ -13,8 +13,8 @@ import androidx.annotation.StringRes;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings.BooleanPreference;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import net.osmand.plus.settings.backend.BooleanPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.parkingpoint.ParkingPositionPlugin;
import net.osmand.util.Algorithms;

View file

@ -28,7 +28,7 @@ import net.osmand.map.OsmandRegions.RegionTranslation;
import net.osmand.map.WorldRegion;
import net.osmand.osm.AbstractPoiType;
import net.osmand.osm.MapPoiTypes;
import net.osmand.plus.activities.DayNightHelper;
import net.osmand.plus.helpers.DayNightHelper;
import net.osmand.plus.activities.LocalIndexHelper;
import net.osmand.plus.activities.LocalIndexInfo;
import net.osmand.plus.activities.SavingTrackHelper;

View file

@ -3,7 +3,30 @@ package net.osmand.plus;
import android.annotation.SuppressLint;
import android.content.SharedPreferences;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import net.osmand.data.FavouritePoint.SpecialPointType;
import net.osmand.data.LatLon;
import net.osmand.plus.AppInitializer.AppInitializeListener;
import net.osmand.plus.AppInitializer.InitEvents;
import net.osmand.plus.api.SettingsAPI;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.EnumStringPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.util.Algorithms;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class AppVersionUpgradeOnInit {
public static final String FIRST_TIME_APP_RUN = "FIRST_TIME_APP_RUN"; //$NON-NLS-1$
public static final String VERSION_INSTALLED_NUMBER = "VERSION_INSTALLED_NUMBER"; //$NON-NLS-1$
public static final String NUMBER_OF_STARTS = "NUMBER_OF_STARTS"; //$NON-NLS-1$
@ -43,7 +66,7 @@ class AppVersionUpgradeOnInit {
@SuppressLint("ApplySharedPref")
void upgradeVersion(SharedPreferences startPrefs, int lastVersion) {
if(!startPrefs.contains(NUMBER_OF_STARTS)) {
if (!startPrefs.contains(NUMBER_OF_STARTS)) {
startPrefs.edit().putInt(NUMBER_OF_STARTS, 1).commit();
} else {
startPrefs.edit().putInt(NUMBER_OF_STARTS, startPrefs.getInt(NUMBER_OF_STARTS, 0) + 1).commit();
@ -59,27 +82,28 @@ class AppVersionUpgradeOnInit {
} else {
prevAppVersion = startPrefs.getInt(VERSION_INSTALLED_NUMBER, 0);
if (needsUpgrade(startPrefs, lastVersion)) {
OsmandSettings settings = app.getSettings();
if (prevAppVersion < VERSION_2_2) {
app.getSettings().SHOW_DASHBOARD_ON_START.set(true);
app.getSettings().SHOW_DASHBOARD_ON_MAP_SCREEN.set(true);
app.getSettings().SHOW_CARD_TO_CHOOSE_DRAWER.set(true);
settings.SHOW_DASHBOARD_ON_START.set(true);
settings.SHOW_DASHBOARD_ON_MAP_SCREEN.set(true);
settings.SHOW_CARD_TO_CHOOSE_DRAWER.set(true);
startPrefs.edit().putInt(VERSION_INSTALLED_NUMBER, VERSION_2_2).commit();
}
if (prevAppVersion < VERSION_2_3) {
startPrefs.edit().putInt(VERSION_INSTALLED_NUMBER, VERSION_2_3).commit();
}
if (prevAppVersion < VERSION_3_2) {
app.getSettings().BILLING_PURCHASE_TOKENS_SENT.set("");
settings.BILLING_PURCHASE_TOKENS_SENT.set("");
startPrefs.edit().putInt(VERSION_INSTALLED_NUMBER, VERSION_3_2).commit();
}
if (prevAppVersion < VERSION_3_5 || Version.getAppVersion(app).equals("3.5.3")
|| Version.getAppVersion(app).equals("3.5.4")) {
app.getSettings().migratePreferences();
migratePreferences();
app.getAppInitializer().addListener(new AppInitializer.AppInitializeListener() {
@Override
public void onProgress(AppInitializer init, AppInitializer.InitEvents event) {
if (event.equals(AppInitializer.InitEvents.FAVORITES_INITIALIZED)) {
app.getSettings().migrateHomeWorkParkingToFavorites();
migrateHomeWorkParkingToFavorites();
}
}
@ -90,21 +114,22 @@ class AppVersionUpgradeOnInit {
startPrefs.edit().putInt(VERSION_INSTALLED_NUMBER, VERSION_3_5).commit();
}
if (prevAppVersion < VERSION_3_6) {
app.getSettings().migratePreferences();
migratePreferences();
startPrefs.edit().putInt(VERSION_INSTALLED_NUMBER, VERSION_3_6).commit();
}
if (prevAppVersion < VERSION_3_7) {
app.getSettings().migrateEnumPreferences();
migrateEnumPreferences();
startPrefs.edit().putInt(VERSION_INSTALLED_NUMBER, VERSION_3_7).commit();
}
if (prevAppVersion < VERSION_3_7_01) {
app.getAppInitializer().addListener(new AppInitializer.AppInitializeListener() {
app.getAppInitializer().addListener(new AppInitializeListener() {
@Override
public void onProgress(AppInitializer init, AppInitializer.InitEvents event) {
if (event.equals(AppInitializer.InitEvents.FAVORITES_INITIALIZED)) {
if (event.equals(InitEvents.FAVORITES_INITIALIZED)) {
app.getFavorites().fixBlackBackground();
}
}
@Override
public void onFinish(AppInitializer init) {
}
@ -112,7 +137,7 @@ class AppVersionUpgradeOnInit {
startPrefs.edit().putInt(VERSION_INSTALLED_NUMBER, VERSION_3_7_01).commit();
}
if (prevAppVersion < VERSION_3_8_00) {
app.getSettings().migrateQuickActionStates();
migrateQuickActionStates();
startPrefs.edit().putInt(VERSION_INSTALLED_NUMBER, VERSION_3_8_00).commit();
}
startPrefs.edit().putInt(VERSION_INSTALLED_NUMBER, lastVersion).commit();
@ -135,20 +160,20 @@ class AppVersionUpgradeOnInit {
}
public void resetFirstTimeRun(SharedPreferences startPrefs) {
if(startPrefs != null) {
if (startPrefs != null) {
startPrefs.edit().remove(FIRST_TIME_APP_RUN).commit();
}
}
public int getNumberOfStarts(SharedPreferences startPrefs) {
if(startPrefs == null) {
if (startPrefs == null) {
return 0;
}
return startPrefs.getInt(NUMBER_OF_STARTS, 1);
}
public long getFirstInstalledDays(SharedPreferences startPrefs) {
if(startPrefs == null) {
if (startPrefs == null) {
return 0;
}
long nd = startPrefs.getLong(FIRST_INSTALLED, 0);
@ -159,4 +184,165 @@ class AppVersionUpgradeOnInit {
public boolean isFirstTime() {
return firstTime;
}
}
public void migratePreferences() {
OsmandSettings settings = app.getSettings();
migrateEnumPreferences();
SharedPreferences globalSharedPreferences = (SharedPreferences) settings.getGlobalPreferences();
Map<String, ?> globalPrefsMap = globalSharedPreferences.getAll();
for (String key : globalPrefsMap.keySet()) {
OsmandPreference<?> pref = settings.getPreference(key);
if (pref instanceof CommonPreference) {
CommonPreference<?> commonPreference = (CommonPreference<?>) pref;
if (!commonPreference.isGlobal()) {
for (ApplicationMode mode : ApplicationMode.allPossibleValues()) {
if (!commonPreference.isSetForMode(mode) && !commonPreference.hasDefaultValueForMode(mode)) {
settings.setPreference(key, globalPrefsMap.get(key), mode);
}
}
}
}
}
SharedPreferences defaultProfilePreferences = (SharedPreferences) settings.getProfilePreferences(ApplicationMode.DEFAULT);
Map<String, ?> defaultPrefsMap = defaultProfilePreferences.getAll();
for (String key : defaultPrefsMap.keySet()) {
OsmandPreference<?> pref = settings.getPreference(key);
if (pref instanceof CommonPreference) {
CommonPreference<?> commonPreference = (CommonPreference<?>) pref;
if (commonPreference.isGlobal() && !commonPreference.isSet()) {
settings.setPreference(key, defaultPrefsMap.get(key));
}
}
}
for (OsmandPreference<?> pref : getGeneralPrefs()) {
if (pref instanceof CommonPreference) {
CommonPreference<?> commonPref = (CommonPreference<?>) pref;
Object defaultVal = commonPref.getModeValue(ApplicationMode.DEFAULT);
for (ApplicationMode mode : ApplicationMode.allPossibleValues()) {
if (!commonPref.isSetForMode(mode) && !commonPref.hasDefaultValueForMode(mode)) {
settings.setPreference(commonPref.getId(), defaultVal, mode);
}
}
}
}
String json = settings.getSettingsAPI().getString(settings.getGlobalPreferences(), "custom_app_profiles", "");
if (!Algorithms.isEmpty(json)) {
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
Type t = new TypeToken<ArrayList<ApplicationMode.ApplicationModeBean>>() {
}.getType();
List<ApplicationMode.ApplicationModeBean> customProfiles = gson.fromJson(json, t);
if (!Algorithms.isEmpty(customProfiles)) {
for (ApplicationMode.ApplicationModeBean modeBean : customProfiles) {
ApplicationMode.ApplicationModeBuilder builder = ApplicationMode.fromModeBean(app, modeBean);
ApplicationMode.saveProfile(builder, app);
}
}
}
}
public void migrateEnumPreferences() {
OsmandSettings settings = app.getSettings();
for (OsmandPreference<?> pref : settings.getRegisteredPreferences().values()) {
if (pref instanceof EnumStringPreference) {
EnumStringPreference<?> enumPref = (EnumStringPreference<?>) pref;
if (enumPref.isGlobal()) {
migrateEnumPref(enumPref, (SharedPreferences) settings.getGlobalPreferences());
} else {
for (ApplicationMode mode : ApplicationMode.allPossibleValues()) {
migrateEnumPref(enumPref, (SharedPreferences) settings.getProfilePreferences(mode));
}
}
}
}
}
public void migrateQuickActionStates() {
OsmandSettings settings = app.getSettings();
String quickActionsJson = settings.getSettingsAPI().getString(settings.getGlobalPreferences(), "quick_action_new", "");
if (!Algorithms.isEmpty(quickActionsJson)) {
Gson gson = new GsonBuilder().create();
Type type = new TypeToken<HashMap<String, Boolean>>() {
}.getType();
HashMap<String, Boolean> quickActions = gson.fromJson(quickActionsJson, type);
if (!Algorithms.isEmpty(quickActions)) {
for (ApplicationMode mode : ApplicationMode.allPossibleValues()) {
settings.setQuickActions(quickActions, mode);
}
}
}
}
private void migrateEnumPref(EnumStringPreference enumPref, SharedPreferences sharedPreferences) {
Object value = sharedPreferences.getAll().get(enumPref.getId());
if (value instanceof Integer) {
int enumIndex = (int) value;
if (enumIndex >= 0 && enumIndex < enumPref.getValues().length) {
Enum savedValue = enumPref.getValues()[enumIndex];
enumPref.setValue(sharedPreferences, savedValue);
}
}
}
public void migrateHomeWorkParkingToFavorites() {
OsmandSettings settings = app.getSettings();
FavouritesDbHelper favorites = app.getFavorites();
SettingsAPI settingsAPI = settings.getSettingsAPI();
Object globalPreferences = settings.getGlobalPreferences();
LatLon homePoint = null;
float lat = settingsAPI.getFloat(globalPreferences, "home_point_lat", 0);
float lon = settingsAPI.getFloat(globalPreferences, "home_point_lon", 0);
if (lat != 0 || lon != 0) {
homePoint = new LatLon(lat, lon);
}
LatLon workPoint = null;
lat = settingsAPI.getFloat(globalPreferences, "work_point_lat", 0);
lon = settingsAPI.getFloat(globalPreferences, "work_point_lon", 0);
if (lat != 0 || lon != 0) {
workPoint = new LatLon(lat, lon);
}
if (homePoint != null) {
favorites.setSpecialPoint(homePoint, SpecialPointType.HOME, null);
}
if (workPoint != null) {
favorites.setSpecialPoint(workPoint, SpecialPointType.WORK, null);
}
}
public OsmandPreference<?>[] getGeneralPrefs() {
OsmandSettings settings = app.getSettings();
return new OsmandPreference[] {
settings.EXTERNAL_INPUT_DEVICE,
settings.CENTER_POSITION_ON_MAP,
settings.ROTATE_MAP,
settings.MAP_SCREEN_ORIENTATION,
settings.LIVE_MONITORING_URL,
settings.LIVE_MONITORING_MAX_INTERVAL_TO_SEND,
settings.LIVE_MONITORING_INTERVAL,
settings.LIVE_MONITORING,
settings.SHOW_TRIP_REC_NOTIFICATION,
settings.AUTO_SPLIT_RECORDING,
settings.SAVE_TRACK_MIN_SPEED,
settings.SAVE_TRACK_PRECISION,
settings.SAVE_TRACK_MIN_DISTANCE,
settings.SAVE_TRACK_INTERVAL,
settings.TRACK_STORAGE_DIRECTORY,
settings.SAVE_HEADING_TO_GPX,
settings.DISABLE_RECORDING_ONCE_APP_KILLED,
settings.SAVE_TRACK_TO_GPX,
settings.SAVE_GLOBAL_TRACK_REMEMBER,
settings.SAVE_GLOBAL_TRACK_INTERVAL,
settings.MAP_EMPTY_STATE_ALLOWED,
settings.DO_NOT_USE_ANIMATIONS,
settings.USE_KALMAN_FILTER_FOR_COMPASS,
settings.USE_MAGNETIC_FIELD_SENSOR_COMPASS,
settings.USE_TRACKBALL_FOR_MOVEMENTS,
settings.SPEED_SYSTEM,
settings.ANGULAR_UNITS,
settings.METRIC_SYSTEM,
settings.DRIVING_REGION,
settings.DRIVING_REGION_AUTOMATIC
};
}
}

View file

@ -38,9 +38,8 @@ import net.osmand.plus.dialogs.HelpArticleDialogFragment;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmAndAppCustomization;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.ContextMenuItemsPreference;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import net.osmand.plus.settings.backend.ContextMenuItemsPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
@ -137,14 +136,18 @@ public class ContextMenuAdapter {
Collections.sort(items, new Comparator<ContextMenuItem>() {
@Override
public int compare(ContextMenuItem item1, ContextMenuItem item2) {
if (DRAWER_SWITCH_PROFILE_ID.equals(item1.getId())) {
return -1;
}
if (DRAWER_CONFIGURE_PROFILE_ID.equals(item1.getId()) && DRAWER_SWITCH_PROFILE_ID.equals(item2.getId())) {
if (DRAWER_CONFIGURE_PROFILE_ID.equals(item1.getId())
&& DRAWER_SWITCH_PROFILE_ID.equals(item2.getId())) {
return 1;
}
if (DRAWER_CONFIGURE_PROFILE_ID.equals(item1.getId())) {
} else if (DRAWER_SWITCH_PROFILE_ID.equals(item1.getId())
&& DRAWER_CONFIGURE_PROFILE_ID.equals(item2.getId())) {
return -1;
} else if (DRAWER_SWITCH_PROFILE_ID.equals(item1.getId())
|| DRAWER_CONFIGURE_PROFILE_ID.equals(item1.getId())) {
return -1;
} else if (DRAWER_SWITCH_PROFILE_ID.equals(item2.getId())
|| DRAWER_CONFIGURE_PROFILE_ID.equals(item2.getId())) {
return 1;
}
int order1 = item1.getOrder();
int order2 = item2.getOrder();
@ -643,7 +646,7 @@ public class ContextMenuAdapter {
return makeDeleteAction(prefs.toArray(new OsmandPreference[prefs.size()]));
}
private static void resetSetting(ApplicationMode appMode, OsmandSettings.OsmandPreference preference, boolean profileOnly) {
private static void resetSetting(ApplicationMode appMode, OsmandPreference preference, boolean profileOnly) {
if (profileOnly) {
preference.resetModeToDefault(appMode);
} else {

View file

@ -29,7 +29,7 @@ import net.osmand.plus.helpers.GpxUiHelper;
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType;
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
import net.osmand.plus.routing.RouteProvider;
import net.osmand.plus.settings.backend.OsmandSettings.MetricsConstants;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.track.GpxSplitType;
import net.osmand.plus.track.GradientScaleType;
import net.osmand.util.Algorithms;

View file

@ -15,9 +15,9 @@ import net.osmand.osm.PoiCategory;
import net.osmand.osm.PoiType;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.AngularConstants;
import net.osmand.plus.settings.backend.OsmandSettings.MetricsConstants;
import net.osmand.plus.settings.backend.OsmandSettings.SpeedConstants;
import net.osmand.plus.helpers.enums.AngularConstants;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.helpers.enums.SpeedConstants;
import net.osmand.util.Algorithms;
import java.text.DateFormatSymbols;

View file

@ -30,6 +30,7 @@ import androidx.multidex.MultiDex;
import androidx.multidex.MultiDexApplication;
import net.osmand.AndroidUtils;
import net.osmand.FileUtils;
import net.osmand.IndexConstants;
import net.osmand.PlatformUtil;
import net.osmand.access.AccessibilityPlugin;
@ -42,7 +43,7 @@ import net.osmand.osm.MapPoiTypes;
import net.osmand.osm.io.NetworkUtils;
import net.osmand.plus.AppInitializer.AppInitializeListener;
import net.osmand.plus.access.AccessibilityMode;
import net.osmand.plus.activities.DayNightHelper;
import net.osmand.plus.helpers.DayNightHelper;
import net.osmand.plus.activities.ExitActivity;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.SavingTrackHelper;
@ -56,7 +57,9 @@ import net.osmand.plus.download.DownloadIndexesThread;
import net.osmand.plus.download.DownloadService;
import net.osmand.plus.download.IndexItem;
import net.osmand.plus.helpers.AvoidSpecificRoads;
import net.osmand.plus.helpers.enums.DrivingRegion;
import net.osmand.plus.helpers.LockHelper;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.helpers.WaypointHelper;
import net.osmand.plus.inapp.InAppPurchaseHelper;
import net.osmand.plus.mapmarkers.MapMarkersDbHelper;
@ -189,7 +192,7 @@ public class OsmandApplication extends MultiDexApplication {
osmandSettings.initExternalStorageDirectory();
}
externalStorageDirectory = osmandSettings.getExternalStorageDirectory();
if (!OsmandSettings.isWritable(externalStorageDirectory)) {
if (!FileUtils.isWritable(externalStorageDirectory)) {
externalStorageDirectoryReadOnly = true;
externalStorageDirectory = osmandSettings.getInternalAppPath();
}
@ -983,15 +986,15 @@ public class OsmandApplication extends MultiDexApplication {
}
public void setupDrivingRegion(WorldRegion reg) {
OsmandSettings.DrivingRegion drg = null;
DrivingRegion drg = null;
WorldRegion.RegionParams params = reg.getParams();
// boolean americanSigns = "american".equals(params.getRegionRoadSigns());
boolean leftHand = "yes".equals(params.getRegionLeftHandDriving());
OsmandSettings.MetricsConstants mc1 = "miles".equals(params.getRegionMetric()) ?
OsmandSettings.MetricsConstants.MILES_AND_FEET : OsmandSettings.MetricsConstants.KILOMETERS_AND_METERS;
OsmandSettings.MetricsConstants mc2 = "miles".equals(params.getRegionMetric()) ?
OsmandSettings.MetricsConstants.MILES_AND_METERS : OsmandSettings.MetricsConstants.KILOMETERS_AND_METERS;
for (OsmandSettings.DrivingRegion r : OsmandSettings.DrivingRegion.values()) {
MetricsConstants mc1 = "miles".equals(params.getRegionMetric()) ?
MetricsConstants.MILES_AND_FEET : MetricsConstants.KILOMETERS_AND_METERS;
MetricsConstants mc2 = "miles".equals(params.getRegionMetric()) ?
MetricsConstants.MILES_AND_METERS : MetricsConstants.KILOMETERS_AND_METERS;
for (DrivingRegion r : DrivingRegion.values()) {
if (r.leftHandDriving == leftHand && (r.defMetrics == mc1 || r.defMetrics == mc2)) {
drg = r;
break;

View file

@ -47,6 +47,8 @@ import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin;
import net.osmand.plus.search.QuickSearchDialogFragment;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
import net.osmand.plus.skimapsplugin.SkiMapsPlugin;
import net.osmand.plus.srtmplugin.SRTMPlugin;
@ -80,7 +82,7 @@ public abstract class OsmandPlugin {
protected OsmandApplication app;
protected List<OsmandSettings.OsmandPreference> pluginPreferences = new ArrayList<>();
protected List<OsmandPreference> pluginPreferences = new ArrayList<>();
private boolean active;
private String installURL = null;
@ -118,7 +120,7 @@ public abstract class OsmandPlugin {
return null;
}
public List<OsmandSettings.OsmandPreference> getPreferences() {
public List<OsmandPreference> getPreferences() {
return pluginPreferences;
}
@ -919,44 +921,44 @@ public abstract class OsmandPlugin {
}
}
protected OsmandSettings.CommonPreference<Boolean> registerBooleanPreference(OsmandApplication app, String prefId, boolean defValue) {
OsmandSettings.CommonPreference<Boolean> preference = app.getSettings().registerBooleanPreference(prefId, defValue);
protected CommonPreference<Boolean> registerBooleanPreference(OsmandApplication app, String prefId, boolean defValue) {
CommonPreference<Boolean> preference = app.getSettings().registerBooleanPreference(prefId, defValue);
pluginPreferences.add(preference);
return preference;
}
private OsmandSettings.CommonPreference<Boolean> registerBooleanAccessibilityPreference(OsmandApplication app, String prefId, boolean defValue) {
OsmandSettings.CommonPreference<Boolean> preference = app.getSettings().registerBooleanAccessibilityPreference(prefId, defValue);
private CommonPreference<Boolean> registerBooleanAccessibilityPreference(OsmandApplication app, String prefId, boolean defValue) {
CommonPreference<Boolean> preference = app.getSettings().registerBooleanAccessibilityPreference(prefId, defValue);
pluginPreferences.add(preference);
return preference;
}
protected OsmandSettings.CommonPreference<String> registerStringPreference(OsmandApplication app, String prefId, String defValue) {
OsmandSettings.CommonPreference<String> preference = app.getSettings().registerStringPreference(prefId, defValue);
protected CommonPreference<String> registerStringPreference(OsmandApplication app, String prefId, String defValue) {
CommonPreference<String> preference = app.getSettings().registerStringPreference(prefId, defValue);
pluginPreferences.add(preference);
return preference;
}
protected OsmandSettings.CommonPreference<Integer> registerIntPreference(OsmandApplication app, String prefId, int defValue) {
OsmandSettings.CommonPreference<Integer> preference = app.getSettings().registerIntPreference(prefId, defValue);
protected CommonPreference<Integer> registerIntPreference(OsmandApplication app, String prefId, int defValue) {
CommonPreference<Integer> preference = app.getSettings().registerIntPreference(prefId, defValue);
pluginPreferences.add(preference);
return preference;
}
protected OsmandSettings.CommonPreference<Long> registerLongPreference(OsmandApplication app, String prefId, long defValue) {
OsmandSettings.CommonPreference<Long> preference = app.getSettings().registerLongPreference(prefId, defValue);
protected CommonPreference<Long> registerLongPreference(OsmandApplication app, String prefId, long defValue) {
CommonPreference<Long> preference = app.getSettings().registerLongPreference(prefId, defValue);
pluginPreferences.add(preference);
return preference;
}
protected OsmandSettings.CommonPreference<Float> registerFloatPreference(OsmandApplication app, String prefId, float defValue) {
OsmandSettings.CommonPreference<Float> preference = app.getSettings().registerFloatPreference(prefId, defValue);
protected CommonPreference<Float> registerFloatPreference(OsmandApplication app, String prefId, float defValue) {
CommonPreference<Float> preference = app.getSettings().registerFloatPreference(prefId, defValue);
pluginPreferences.add(preference);
return preference;
}
protected <T extends Enum> OsmandSettings.CommonPreference<T> registerEnumIntPreference(OsmandApplication app, String prefId, Enum defaultValue, Enum[] values, Class<T> clz) {
OsmandSettings.CommonPreference<T> preference = app.getSettings().registerEnumIntPreference(prefId, defaultValue, values, clz);
protected <T extends Enum> CommonPreference<T> registerEnumIntPreference(OsmandApplication app, String prefId, Enum defaultValue, Enum[] values, Class<T> clz) {
CommonPreference<T> preference = app.getSettings().registerEnumIntPreference(prefId, defaultValue, values, clz);
pluginPreferences.add(preference);
return preference;
}

View file

@ -1,13 +1,15 @@
package net.osmand.plus;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import net.osmand.plus.inapp.InAppPurchaseHelper;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class Version {
private final String appVersion;
@ -149,4 +151,21 @@ public class Version {
return v;
}
}
public static boolean isOpenGlAvailable(OsmandApplication app) {
if ("qnx".equals(System.getProperty("os.name"))) {
return false;
}
File nativeLibraryDir = new File(app.getApplicationInfo().nativeLibraryDir);
if (nativeLibraryDir.exists() && nativeLibraryDir.canRead()) {
File[] files = nativeLibraryDir.listFiles();
if (files != null) {
for (File file : files) {
if ("libOsmAndCoreWithJNI.so".equals(file.getName())) {
return true;
}
}
}
}
return false;
}
}

View file

@ -43,6 +43,7 @@ import net.osmand.plus.FavouritesDbHelper.FavoriteGroup;
import net.osmand.plus.FavouritesDbHelper.FavoritesListener;
import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
@ -96,7 +97,7 @@ public class FavoritesTreeFragment extends OsmandExpandableListFragment implemen
private Set<FavoriteGroup> groupsToDelete = new LinkedHashSet<>();
private ActionMode actionMode;
private Drawable arrowImageDisabled;
private HashMap<String, OsmandSettings.OsmandPreference<Boolean>> preferenceCache = new HashMap<>();
private HashMap<String, OsmandPreference<Boolean>> preferenceCache = new HashMap<>();
private View footerView;
private Location lastLocation;
private float lastHeading;
@ -763,8 +764,8 @@ public class FavoritesTreeFragment extends OsmandExpandableListFragment implemen
}
}
private OsmandSettings.OsmandPreference<Boolean> getGroupExpandedPreference(String groupName) {
OsmandSettings.OsmandPreference<Boolean> preference = preferenceCache.get(groupName);
private OsmandPreference<Boolean> getGroupExpandedPreference(String groupName) {
OsmandPreference<Boolean> preference = preferenceCache.get(groupName);
if (preference == null) {
String groupKey = groupName + GROUP_EXPANDED_POSTFIX;
preference = getSettings().registerBooleanPreference(groupKey, false);

View file

@ -74,6 +74,9 @@ import net.osmand.plus.OsmAndConstants;
import net.osmand.plus.OsmAndLocationSimulation;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.helpers.DayNightHelper;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.TargetPointsHelper;
import net.osmand.plus.TargetPointsHelper.TargetPoint;
@ -130,7 +133,6 @@ import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchTab;
import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
import net.osmand.plus.settings.fragments.ConfigureProfileFragment;
@ -533,7 +535,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
@Override
public void requestPrivateAccessRouting() {
if (!settings.FORCE_PRIVATE_ACCESS_ROUTING_ASKED.getModeValue(getRoutingHelper().getAppMode())) {
final OsmandSettings.CommonPreference<Boolean> allowPrivate
final CommonPreference<Boolean> allowPrivate
= settings.getCustomRoutingBooleanProperty(GeneralRouter.ALLOW_PRIVATE, false);
final List<ApplicationMode> modes = ApplicationMode.values(app);
for (ApplicationMode mode : modes) {

View file

@ -29,7 +29,7 @@ import net.osmand.plus.DialogListItemAdapter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.R;
import net.osmand.plus.SQLiteTileSource;
import net.osmand.plus.activities.MapActivity.ShowQuickSearchMode;

View file

@ -25,13 +25,13 @@ import net.osmand.AndroidUtils;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.profiles.AppProfileArrayAdapter;
import net.osmand.plus.profiles.ProfileDataObject;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import org.apache.commons.logging.Log;

View file

@ -42,9 +42,9 @@ import net.osmand.osm.io.NetworkUtils;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.AngularConstants;
import net.osmand.plus.settings.backend.OsmandSettings.DrivingRegion;
import net.osmand.plus.settings.backend.OsmandSettings.MetricsConstants;
import net.osmand.plus.helpers.enums.AngularConstants;
import net.osmand.plus.helpers.enums.DrivingRegion;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.base.MapViewTrackingUtilities;

View file

@ -34,6 +34,12 @@ import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.helpers.enums.AutoZoomMap;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.helpers.enums.SpeedConstants;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.Version;
@ -44,10 +50,6 @@ import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper;
import net.osmand.plus.routing.RouteProvider.RouteService;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.AutoZoomMap;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandSettings.SpeedConstants;
import net.osmand.plus.voice.CommandPlayer;
import net.osmand.router.GeneralRouter;
import net.osmand.router.GeneralRouter.GeneralRouterProfile;
@ -171,7 +173,7 @@ public class SettingsNavigationActivity extends SettingsBaseActivity {
//array size must be equal!
Float[] speedLimitsKmhPos = new Float[]{0f, 5f, 7f, 10f, 15f, 20f};
Float[] speedLimitsMphPos = new Float[]{0f, 3f, 5f, 7f, 10f, 15f};
if (settings.METRIC_SYSTEM.get() == OsmandSettings.MetricsConstants.KILOMETERS_AND_METERS) {
if (settings.METRIC_SYSTEM.get() == MetricsConstants.KILOMETERS_AND_METERS) {
String[] speedNames = new String[speedLimitsKmh.length];
String[] speedNamesPos = new String[speedLimitsKmhPos.length];
for (int i = 0; i < speedLimitsKmh.length; i++) {
@ -407,7 +409,7 @@ public class SettingsNavigationActivity extends SettingsBaseActivity {
}
public static boolean isRoutingParameterSelected(OsmandSettings settings, ApplicationMode am, RoutingParameter routingParameter) {
final OsmandSettings.CommonPreference<Boolean> property =
final CommonPreference<Boolean> property =
settings.getCustomRoutingBooleanProperty(routingParameter.getId(), routingParameter.getDefaultBoolean());
if(am != null) {
return property.getModeValue(am);
@ -417,7 +419,7 @@ public class SettingsNavigationActivity extends SettingsBaseActivity {
}
public static void setRoutingParameterSelected(OsmandSettings settings, ApplicationMode am, String routingParameterId, boolean defaultBoolean, boolean isChecked) {
final OsmandSettings.CommonPreference<Boolean> property = settings.getCustomRoutingBooleanProperty(routingParameterId, defaultBoolean);
final CommonPreference<Boolean> property = settings.getCustomRoutingBooleanProperty(routingParameterId, defaultBoolean);
if (am != null) {
property.setModeValue(am, isChecked);
} else {

View file

@ -53,8 +53,8 @@ import net.osmand.plus.ContextMenuAdapter.ItemClickListener;
import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;

View file

@ -38,7 +38,6 @@ import net.osmand.PlatformUtil;
import net.osmand.data.PointDescription;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings.NotesSortByMode;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.activities.ActionBarProgressActivity;

View file

@ -0,0 +1,14 @@
package net.osmand.plus.audionotes;
public enum NotesSortByMode {
BY_TYPE,
BY_DATE;
public boolean isByType() {
return this == BY_TYPE;
}
public boolean isByDate() {
return this == BY_DATE;
}
}

View file

@ -3,8 +3,7 @@ package net.osmand.plus.audionotes;
import android.os.Bundle;
import android.view.View;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.NotesSortByMode;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.R;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
@ -53,7 +52,7 @@ public class SortByMenuBottomSheetDialogFragment extends MenuBottomSheetDialogFr
}
private void selectSortByMode(NotesSortByMode mode) {
final OsmandSettings.CommonPreference<NotesSortByMode> sortByMode = getMyApplication().getSettings().NOTES_SORT_BY_MODE;
final CommonPreference<NotesSortByMode> sortByMode = getMyApplication().getSettings().NOTES_SORT_BY_MODE;
if (sortByMode.get() != mode) {
sortByMode.set(mode);
if (listener != null) {

View file

@ -25,7 +25,7 @@ import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.Version;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.BaseOsmAndDialogFragment;

View file

@ -30,6 +30,7 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import net.osmand.AndroidUtils;
import net.osmand.FileUtils;
import net.osmand.ValueHolder;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
@ -113,7 +114,7 @@ public class DashChooseAppDirFragment {
boolean copyFiles = !currentAppFile.getAbsolutePath().equals(selectedFile.getAbsolutePath()) && !mapsCopied;
warningReadonly.setVisibility(copyFiles ? View.VISIBLE : View.GONE);
if (copyFiles) {
if (!OsmandSettings.isWritable(currentAppFile)) {
if (!FileUtils.isWritable(currentAppFile)) {
warningReadonly.setText(activity.getString(R.string.android_19_location_disabled,
currentAppFile.getAbsolutePath()));
} else {
@ -385,7 +386,7 @@ public class DashChooseAppDirFragment {
@Override
public void onClick(View v) {
boolean wr = OsmandSettings.isWritable(selectedFile);
boolean wr = FileUtils.isWritable(selectedFile);
if (wr) {
boolean changed = !currentAppFile.getAbsolutePath().equals(selectedFile.getAbsolutePath());
getMyApplication().setExternalStorageDirectory(type, selectedFile.getAbsolutePath());

View file

@ -24,7 +24,7 @@ import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;

View file

@ -35,12 +35,7 @@ public class DevelopmentSettingsFragment extends BaseSettingsFragment {
setupOpenglRenderPref();
setupSafeModePref();
setupPTSafeMode();
setupDisableComplexRoutingPref();
setupFastRecalculationPref();
setupOsmLiveForRoutingPref();
setupOsmLiveForPublicTransportPref();
setupSimulateYourLocationPref();
Preference debuggingAndDevelopment = findPreference("debugging_and_development");
@ -62,13 +57,17 @@ public class DevelopmentSettingsFragment extends BaseSettingsFragment {
}
private void setupOpenglRenderPref() {
SwitchPreferenceEx useOpenglRender = (SwitchPreferenceEx) findPreference(settings.USE_OPENGL_RENDER.getId());
useOpenglRender.setDescription(getString(R.string.use_opengl_render_descr));
useOpenglRender.setIconSpaceReserved(false);
SwitchPreferenceEx useOpenglRender = findPreference(settings.USE_OPENGL_RENDER.getId());
if (Version.isOpenGlAvailable(app)) {
useOpenglRender.setDescription(getString(R.string.use_opengl_render_descr));
useOpenglRender.setIconSpaceReserved(false);
} else {
useOpenglRender.setVisible(false);
}
}
private void setupSafeModePref() {
SwitchPreferenceEx safeMode = (SwitchPreferenceEx) findPreference(settings.SAFE_MODE.getId());
SwitchPreferenceEx safeMode = findPreference(settings.SAFE_MODE.getId());
if (!Version.isBlackberry(app)) {
safeMode.setDescription(getString(R.string.safe_mode_description));
safeMode.setIconSpaceReserved(false);
@ -82,40 +81,6 @@ public class DevelopmentSettingsFragment extends BaseSettingsFragment {
}
}
private void setupPTSafeMode() {
SwitchPreferenceEx ptSafeMode = (SwitchPreferenceEx) findPreference(settings.PT_SAFE_MODE.getId());
if (!Version.isBlackberry(app)) {
ptSafeMode.setDescription("Switch to Java (safe) Public Transport routing calculation");
ptSafeMode.setIconSpaceReserved(false);
} else {
ptSafeMode.setVisible(false);
}
}
private void setupDisableComplexRoutingPref() {
SwitchPreferenceEx disableComplexRouting = (SwitchPreferenceEx) findPreference(settings.DISABLE_COMPLEX_ROUTING.getId());
disableComplexRouting.setDescription(getString(R.string.disable_complex_routing_descr));
disableComplexRouting.setIconSpaceReserved(false);
}
private void setupFastRecalculationPref() {
SwitchPreferenceEx useFastRecalculation = (SwitchPreferenceEx) findPreference(settings.USE_FAST_RECALCULATION.getId());
useFastRecalculation.setDescription(getString(R.string.use_fast_recalculation_desc));
useFastRecalculation.setIconSpaceReserved(false);
}
private void setupOsmLiveForRoutingPref() {
SwitchPreferenceEx useOsmLiveForRouting = (SwitchPreferenceEx) findPreference(settings.USE_OSM_LIVE_FOR_ROUTING.getId());
useOsmLiveForRouting.setDescription(getString(R.string.use_osm_live_routing_description));
useOsmLiveForRouting.setIconSpaceReserved(false);
}
private void setupOsmLiveForPublicTransportPref() {
SwitchPreferenceEx useOsmLiveForPublicTransport = (SwitchPreferenceEx) findPreference(settings.USE_OSM_LIVE_FOR_PUBLIC_TRANSPORT.getId());
useOsmLiveForPublicTransport.setDescription(getString(R.string.use_osm_live_public_transport_description));
useOsmLiveForPublicTransport.setIconSpaceReserved(false);
}
private void setupSimulateYourLocationPref() {
final Preference simulateYourLocation = findPreference(SIMULATE_YOUR_LOCATION);
simulateYourLocation.setIconSpaceReserved(false);

View file

@ -14,11 +14,11 @@ import android.preference.PreferenceScreen;
import net.osmand.plus.OsmAndLocationSimulation;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.activities.SettingsBaseActivity;
import net.osmand.plus.render.NativeOsmandLibrary;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.util.SunriseSunset;
import java.text.SimpleDateFormat;
@ -34,41 +34,27 @@ public class SettingsDevelopmentActivity extends SettingsBaseActivity {
app.applyTheme(this);
super.onCreate(savedInstanceState);
getToolbar().setTitle(R.string.debugging_and_development);
PreferenceScreen cat = getPreferenceScreen();
PreferenceScreen category = getPreferenceScreen();
Preference pref;
cat.addPreference(createCheckBoxPreference(settings.USE_OPENGL_RENDER,
R.string.use_opengl_render, R.string.use_opengl_render_descr));
if (Version.isOpenGlAvailable(app)) {
category.addPreference(createCheckBoxPreference(settings.USE_OPENGL_RENDER,
R.string.use_opengl_render, R.string.use_opengl_render_descr));
}
if (!Version.isBlackberry(app)) {
CheckBoxPreference nativeCheckbox = createCheckBoxPreference(settings.SAFE_MODE, R.string.safe_mode, R.string.safe_mode_description);
CheckBoxPreference nativePTCheckbox = createCheckBoxPreference(settings.PT_SAFE_MODE, "Native PT routing development", "Switch to Java (safe) Public Transport routing calculation");
// disable the checkbox if the library cannot be used
if ((NativeOsmandLibrary.isLoaded() && !NativeOsmandLibrary.isSupported()) || settings.NATIVE_RENDERING_FAILED.get()) {
nativeCheckbox.setEnabled(false);
nativeCheckbox.setChecked(true);
}
cat.addPreference(nativeCheckbox);
cat.addPreference(nativePTCheckbox);
category.addPreference(nativeCheckbox);
}
PreferenceCategory navigation = new PreferenceCategory(this);
navigation.setTitle(R.string.routing_settings);
cat.addPreference(navigation);
navigation.addPreference(createCheckBoxPreference(settings.DISABLE_COMPLEX_ROUTING,
R.string.disable_complex_routing, R.string.disable_complex_routing_descr));
navigation.addPreference(createCheckBoxPreference(settings.USE_FAST_RECALCULATION,
R.string.use_fast_recalculation, R.string.use_fast_recalculation_desc));
navigation.addPreference(createCheckBoxPreference(settings.USE_OSM_LIVE_FOR_ROUTING,
R.string.use_osm_live_routing,
R.string.use_osm_live_routing_description));
navigation.addPreference(createCheckBoxPreference(settings.USE_OSM_LIVE_FOR_PUBLIC_TRANSPORT,
R.string.use_osm_live_public_transport,
R.string.use_osm_live_public_transport_description));
category.addPreference(navigation);
pref = new Preference(this);
final Preference simulate = pref;
final OsmAndLocationSimulation sim = getMyApplication().getLocationProvider().getLocationSimulation();
@ -95,7 +81,7 @@ public class SettingsDevelopmentActivity extends SettingsBaseActivity {
PreferenceCategory debug = new PreferenceCategory(this);
debug.setTitle(R.string.debugging_and_development);
cat.addPreference(debug);
category.addPreference(debug);
CheckBoxPreference dbg = createCheckBoxPreference(settings.DEBUG_RENDERING_INFO,
R.string.trace_rendering, R.string.trace_rendering_descr);
@ -125,10 +111,6 @@ public class SettingsDevelopmentActivity extends SettingsBaseActivity {
debug.addPreference(createCheckBoxPreference(settings.SHOULD_SHOW_FREE_VERSION_BANNER,
R.string.show_free_version_banner,
R.string.show_free_version_banner_description));
pref = new Preference(this);
pref.setTitle(R.string.test_voice_prompts);
@ -141,7 +123,7 @@ public class SettingsDevelopmentActivity extends SettingsBaseActivity {
return true;
}
});
cat.addPreference(pref);
category.addPreference(pref);
pref = new Preference(this);
pref.setTitle(R.string.logcat_buffer);
@ -154,11 +136,11 @@ public class SettingsDevelopmentActivity extends SettingsBaseActivity {
return true;
}
});
cat.addPreference(pref);
category.addPreference(pref);
PreferenceCategory info = new PreferenceCategory(this);
info.setTitle(R.string.info_button);
cat.addPreference(info);
category.addPreference(info);
pref = new Preference(this);
pref.setTitle(R.string.global_app_allocated_memory);

View file

@ -19,7 +19,7 @@ import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.activities.OsmandActionBarActivity;
import net.osmand.plus.routing.data.StreetName;
@ -151,7 +151,7 @@ public class TestVoiceActivity extends OsmandActionBarActivity {
v += "\n \u25CF BT SCO: The current app profile is not set to use 'Phone call audio'.";
}
//OsmandSettings.OsmandPreference<Integer> pref = ((OsmandApplication) getApplication()).getSettings().VOICE_PROMPT_DELAY[stream];
//OsmandPreference<Integer> pref = ((OsmandApplication) getApplication()).getSettings().VOICE_PROMPT_DELAY[stream];
//if(pref != null) {
// v += "\n \u25CF Voice prompt delay for selected output: " + pref.get() + "\u00A0ms";
//}
@ -299,7 +299,7 @@ public class TestVoiceActivity extends OsmandActionBarActivity {
}
if (description.startsWith("\u25BA (11.2)")) {
int ams = ((OsmandApplication) getApplication()).getSettings().AUDIO_MANAGER_STREAM.get();
OsmandSettings.OsmandPreference<Integer> pref = ((OsmandApplication) getApplication()).getSettings().VOICE_PROMPT_DELAY[ams];
OsmandPreference<Integer> pref = ((OsmandApplication) getApplication()).getSettings().VOICE_PROMPT_DELAY[ams];
if (pref != null) {
if (pref.get() >= 3000) {
pref.set(0);

View file

@ -33,6 +33,11 @@ import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.DialogListItemAdapter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.helpers.enums.DayNightMode;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.ListStringPreference;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
@ -40,9 +45,6 @@ import net.osmand.plus.activities.SettingsActivity;
import net.osmand.plus.inapp.InAppPurchaseHelper;
import net.osmand.plus.poi.PoiUIFilter;
import net.osmand.plus.render.RendererRegistry;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings.ListStringPreference;
import net.osmand.plus.srtmplugin.SRTMPlugin;
import net.osmand.plus.transport.TransportLinesMenu;
import net.osmand.plus.views.OsmandMapTileView;
@ -307,7 +309,7 @@ public class ConfigureMapMenu {
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
String sunriseTime = dateFormat.format(sunriseSunset.getSunrise());
String sunsetTime = dateFormat.format(sunriseSunset.getSunset());
OsmandSettings.DayNightMode dayNightMode = activity.getMyApplication().getSettings().DAYNIGHT_MODE.get();
DayNightMode dayNightMode = activity.getMyApplication().getSettings().DAYNIGHT_MODE.get();
if (dayNightMode.isDay() || dayNightMode.isNight()) {
if (sunriseSunset.isDaytime()) {
description = String.format(app.getString(R.string.sunset_at), sunsetTime);
@ -334,9 +336,9 @@ public class ConfigureMapMenu {
final OsmandMapTileView view = activity.getMapView();
AlertDialog.Builder bld = new AlertDialog.Builder(new ContextThemeWrapper(view.getContext(), themeRes));
bld.setTitle(R.string.daynight);
final String[] items = new String[OsmandSettings.DayNightMode.values().length];
final String[] items = new String[DayNightMode.values().length];
for (int i = 0; i < items.length; i++) {
items[i] = OsmandSettings.DayNightMode.values()[i].toHumanString(app);
items[i] = DayNightMode.values()[i].toHumanString(app);
}
int i = view.getSettings().DAYNIGHT_MODE.get().ordinal();
bld.setNegativeButton(R.string.shared_string_dismiss, null);
@ -345,7 +347,7 @@ public class ConfigureMapMenu {
@Override
public void onClick(View v) {
int which = (int) v.getTag();
view.getSettings().DAYNIGHT_MODE.set(OsmandSettings.DayNightMode.values()[which]);
view.getSettings().DAYNIGHT_MODE.set(DayNightMode.values()[which]);
refreshMapComplete(activity);
activity.getDashboard().refreshContent(true);
// adapter.getItem(pos).setDescription(s, getDayNightDescr(activity));
@ -376,7 +378,7 @@ public class ConfigureMapMenu {
return false;
}
final OsmandMapTileView view = activity.getMapView();
final OsmandSettings.OsmandPreference<Float> mapDensity = view.getSettings().MAP_DENSITY;
final OsmandPreference<Float> mapDensity = view.getSettings().MAP_DENSITY;
AlertDialog.Builder bld = new AlertDialog.Builder(new ContextThemeWrapper(view.getContext(), themeRes));
int p = (int) (mapDensity.get() * 100);
final TIntArrayList tlist = new TIntArrayList(new int[]{25, 33, 50, 75, 100, 125, 150, 200, 300, 400});
@ -669,25 +671,25 @@ public class ConfigureMapMenu {
@ColorInt final int selectedProfileColor) {
final List<RenderingRuleProperty> ps = new ArrayList<>();
final List<OsmandSettings.CommonPreference<Boolean>> prefs = new ArrayList<>();
final List<CommonPreference<Boolean>> prefs = new ArrayList<>();
Iterator<RenderingRuleProperty> it = customRules.iterator();
while (it.hasNext()) {
RenderingRuleProperty p = it.next();
if (category.equals(p.getCategory()) && p.isBoolean()) {
ps.add(p);
final OsmandSettings.CommonPreference<Boolean> pref = activity.getMyApplication().getSettings()
final CommonPreference<Boolean> pref = activity.getMyApplication().getSettings()
.getCustomRenderBooleanProperty(p.getAttrName());
prefs.add(pref);
it.remove();
}
}
if (prefs.size() > 0) {
final List<OsmandSettings.CommonPreference<String>> includedPrefs = new ArrayList<>();
final List<CommonPreference<String>> includedPrefs = new ArrayList<>();
if (customRulesIncluded != null) {
for (RenderingRuleProperty p : customRulesIncluded) {
if (!p.isBoolean()) {
final OsmandSettings.CommonPreference<String> pref = activity.getMyApplication().getSettings()
final CommonPreference<String> pref = activity.getMyApplication().getSettings()
.getCustomRenderProperty(p.getAttrName());
includedPrefs.add(pref);
}
@ -729,14 +731,14 @@ public class ConfigureMapMenu {
.setId(id)
.setIcon(icon).setListener(clickListener);
boolean selected = false;
for (OsmandSettings.CommonPreference<Boolean> p : prefs) {
for (CommonPreference<Boolean> p : prefs) {
if (p.get()) {
selected = true;
break;
}
}
if (!selected && includedPrefs.size() > 0) {
for (OsmandSettings.CommonPreference<String> p : includedPrefs) {
for (CommonPreference<String> p : includedPrefs) {
if (!Algorithms.isEmpty(p.get())) {
selected = true;
break;
@ -773,17 +775,17 @@ public class ConfigureMapMenu {
return null;
}
protected String getDescription(final List<OsmandSettings.CommonPreference<Boolean>> prefs,
final List<OsmandSettings.CommonPreference<String>> includedPrefs) {
protected String getDescription(final List<CommonPreference<Boolean>> prefs,
final List<CommonPreference<String>> includedPrefs) {
int count = 0;
int enabled = 0;
for (OsmandSettings.CommonPreference<Boolean> p : prefs) {
for (CommonPreference<Boolean> p : prefs) {
count++;
if (p.get()) {
enabled++;
}
}
for (OsmandSettings.CommonPreference<String> p : includedPrefs) {
for (CommonPreference<String> p : includedPrefs) {
count++;
if (!Algorithms.isEmpty(p.get())) {
enabled++;
@ -856,11 +858,11 @@ public class ConfigureMapMenu {
prefs.get(i).set(tempPrefs[i]);
selected |= tempPrefs[i];
}
final List<OsmandSettings.CommonPreference<String>> includedPrefs = new ArrayList<>();
final List<CommonPreference<String>> includedPrefs = new ArrayList<>();
if (customRulesIncluded != null) {
for (RenderingRuleProperty p : customRulesIncluded) {
if (p.getAttrName().equals(HIKING_ROUTES_OSMC_ATTR)) {
final OsmandSettings.CommonPreference<String> pref = activity.getMyApplication().getSettings()
final CommonPreference<String> pref = activity.getMyApplication().getSettings()
.getCustomRenderProperty(p.getAttrName());
includedPrefs.add(pref);
if (hikingRouteOSMCValue == 0) {
@ -894,7 +896,7 @@ public class ConfigureMapMenu {
if (customRulesIncluded != null) {
for (RenderingRuleProperty p : customRulesIncluded) {
if (!p.isBoolean()) {
final OsmandSettings.CommonPreference<String> pref = activity.getMyApplication().getSettings()
final CommonPreference<String> pref = activity.getMyApplication().getSettings()
.getCustomRenderProperty(p.getAttrName());
View spinnerView = View.inflate(new ContextThemeWrapper(activity, themeRes), R.layout.spinner_rule_layout, null);
@ -1031,7 +1033,7 @@ public class ConfigureMapMenu {
final String propertyDescr = SettingsActivity.getStringPropertyDescription(view.getContext(),
p.getAttrName(), p.getName());
if (p.isBoolean()) {
final OsmandSettings.CommonPreference<Boolean> pref = view.getApplication().getSettings()
final CommonPreference<Boolean> pref = view.getApplication().getSettings()
.getCustomRenderBooleanProperty(p.getAttrName());
return ContextMenuItem.createBuilder(propertyName)
.setId(id)
@ -1047,7 +1049,7 @@ public class ConfigureMapMenu {
.setSelected(pref.get())
.createItem();
} else {
final OsmandSettings.CommonPreference<String> pref = view.getApplication().getSettings()
final CommonPreference<String> pref = view.getApplication().getSettings()
.getCustomRenderProperty(p.getAttrName());
final String descr;
if (!Algorithms.isEmpty(pref.get())) {

View file

@ -27,7 +27,7 @@ import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemTwoChoicesButton.OnBo
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerItem;
import net.osmand.plus.helpers.FontCache;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.bottomsheets.BasePreferenceBottomSheet;
import net.osmand.render.RenderingRuleProperty;
import net.osmand.render.RenderingRuleStorageProperties;

View file

@ -10,8 +10,9 @@ import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.LayerTransparencySeekbarMode;
import net.osmand.plus.rastermaps.LayerTransparencySeekbarMode;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.MapActivityLayers;
@ -39,9 +40,9 @@ public class RasterMapMenu {
final OsmandSettings settings = app.getSettings();
final OsmandRasterMapsPlugin plugin = OsmandPlugin.getEnabledPlugin(OsmandRasterMapsPlugin.class);
assert plugin != null;
final OsmandSettings.CommonPreference<Integer> mapTransparencyPreference;
final OsmandSettings.CommonPreference<String> mapTypePreference;
final OsmandSettings.CommonPreference<String> exMapTypePreference;
final CommonPreference<Integer> mapTransparencyPreference;
final CommonPreference<String> mapTypePreference;
final CommonPreference<String> exMapTypePreference;
final LayerTransparencySeekbarMode currentMapTypeSeekbarMode =
type == RasterMapType.OVERLAY ? LayerTransparencySeekbarMode.OVERLAY : LayerTransparencySeekbarMode.UNDERLAY;
@StringRes final int mapTypeString;
@ -62,7 +63,7 @@ public class RasterMapMenu {
throw new RuntimeException("Unexpected raster map type");
}
final OsmandSettings.CommonPreference<Boolean> hidePolygonsPref =
final CommonPreference<Boolean> hidePolygonsPref =
mapActivity.getMyApplication().getSettings().getCustomRenderBooleanProperty("noPolygons");
String mapTypeDescr = mapTypePreference.get();
@ -181,8 +182,8 @@ public class RasterMapMenu {
@NonNull
public static Boolean isSeekbarVisible(OsmandApplication app, RasterMapType type) {
final OsmandSettings.LayerTransparencySeekbarMode currentMapTypeSeekbarMode =
type == RasterMapType.OVERLAY ? OsmandSettings.LayerTransparencySeekbarMode.OVERLAY : OsmandSettings.LayerTransparencySeekbarMode.UNDERLAY;
final LayerTransparencySeekbarMode currentMapTypeSeekbarMode =
type == RasterMapType.OVERLAY ? LayerTransparencySeekbarMode.OVERLAY : LayerTransparencySeekbarMode.UNDERLAY;
LayerTransparencySeekbarMode seekbarMode = app.getSettings().LAYER_TRANSPARENCY_SEEKBAR_MODE.get();
return seekbarMode == LayerTransparencySeekbarMode.UNDEFINED || seekbarMode == currentMapTypeSeekbarMode;
}

View file

@ -19,7 +19,7 @@ import androidx.fragment.app.FragmentManager;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton;

View file

@ -23,7 +23,7 @@ import net.osmand.map.WorldRegion;
import net.osmand.map.WorldRegion.RegionParams;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.base.BasicProgressAsyncTask;

View file

@ -21,6 +21,7 @@ import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentManager;
import net.osmand.AndroidUtils;
import net.osmand.FileUtils;
import net.osmand.IProgress;
import net.osmand.plus.OnDismissDialogFragmentListener;
import net.osmand.plus.OsmandApplication;
@ -71,7 +72,7 @@ public class DataStoragePlaceDialogFragment extends BottomSheetDialogFragment {
File internalStorage = getInternalStorageDirectory(activity);
File external1Storage = getExternal1StorageDirectory(activity);
if (external1Storage != null && external1Storage.exists() && OsmandSettings.isWritable(external1Storage)) {
if (external1Storage != null && external1Storage.exists() && FileUtils.isWritable(external1Storage)) {
deviceStorage = external1Storage;
deviceStorageType = OsmandSettings.EXTERNAL_STORAGE_TYPE_EXTERNAL_FILE;
deviceStorageName = getString(R.string.storage_directory_external);
@ -246,7 +247,7 @@ public class DataStoragePlaceDialogFragment extends BottomSheetDialogFragment {
};
public boolean saveFilesLocation(int type, File selectedFile, Activity context) {
boolean wr = OsmandSettings.isWritable(selectedFile);
boolean wr = FileUtils.isWritable(selectedFile);
if (wr) {
((OsmandApplication) context.getApplication())
.setExternalStorageDirectory(type, selectedFile.getAbsolutePath());

View file

@ -1,20 +1,6 @@
package net.osmand.plus.activities;
package net.osmand.plus.helpers;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import net.osmand.Location;
import net.osmand.PlatformUtil;
import net.osmand.StateChangedListener;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings.DayNightMode;
import net.osmand.util.SunriseSunset;
import org.apache.commons.logging.Log;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
@ -22,6 +8,20 @@ import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.LocationManager;
import net.osmand.Location;
import net.osmand.PlatformUtil;
import net.osmand.StateChangedListener;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.helpers.enums.DayNightMode;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.util.SunriseSunset;
import org.apache.commons.logging.Log;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
/**
* Class to help determine if we want to render day or night map - it uses the
* DayNightMode enumeration for its behavior<BR>

View file

@ -80,6 +80,10 @@ import net.osmand.plus.OsmAndConstants;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.helpers.enums.SpeedConstants;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.Version;
@ -93,7 +97,6 @@ import net.osmand.plus.dialogs.GpxAppearanceAdapter;
import net.osmand.plus.dialogs.GpxAppearanceAdapter.AppearanceListItem;
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
import net.osmand.plus.routing.RouteCalculationResult;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.render.RenderingRuleProperty;
import net.osmand.render.RenderingRulesStorage;
import net.osmand.router.RouteStatisticsHelper;
@ -514,9 +517,9 @@ public class GpxUiHelper {
} else {
final View apprTitleView = View.inflate(new ContextThemeWrapper(activity, themeRes), R.layout.select_gpx_appearance_title, null);
final OsmandSettings.CommonPreference<String> prefWidth
final CommonPreference<String> prefWidth
= app.getSettings().getCustomRenderProperty(CURRENT_TRACK_WIDTH_ATTR);
final OsmandSettings.CommonPreference<String> prefColor
final CommonPreference<String> prefColor
= app.getSettings().getCustomRenderProperty(CURRENT_TRACK_COLOR_ATTR);
updateAppearanceTitle(activity, app, trackWidthProp, renderer, apprTitleView, prefWidth.get(), prefColor.get());
@ -574,7 +577,7 @@ public class GpxUiHelper {
if (SHOW_START_FINISH_ATTR.equals(entry.getKey())) {
app.getSettings().SHOW_START_FINISH_ICONS.set("true".equals(entry.getValue()));
} else {
final OsmandSettings.CommonPreference<String> pref
final CommonPreference<String> pref
= app.getSettings().getCustomRenderProperty(entry.getKey());
pref.set(entry.getValue());
}
@ -1039,7 +1042,7 @@ public class GpxUiHelper {
private static float setupAxisDistance(OsmandApplication ctx, AxisBase axisBase, float meters) {
OsmandSettings settings = ctx.getSettings();
OsmandSettings.MetricsConstants mc = settings.METRIC_SYSTEM.get();
MetricsConstants mc = settings.METRIC_SYSTEM.get();
float divX;
String format1 = "{0,number,0.#} ";
@ -1048,10 +1051,10 @@ public class GpxUiHelper {
float granularity = 1f;
int mainUnitStr;
float mainUnitInMeters;
if (mc == OsmandSettings.MetricsConstants.KILOMETERS_AND_METERS) {
if (mc == MetricsConstants.KILOMETERS_AND_METERS) {
mainUnitStr = R.string.km;
mainUnitInMeters = METERS_IN_KILOMETER;
} else if (mc == OsmandSettings.MetricsConstants.NAUTICAL_MILES) {
} else if (mc == MetricsConstants.NAUTICAL_MILES) {
mainUnitStr = R.string.nm;
mainUnitInMeters = METERS_IN_ONE_NAUTICALMILE;
} else {
@ -1065,10 +1068,10 @@ public class GpxUiHelper {
if (meters >= 100 * mainUnitInMeters ||
meters > 9.99f * mainUnitInMeters ||
meters > 0.999f * mainUnitInMeters ||
mc == OsmandSettings.MetricsConstants.MILES_AND_FEET && meters > 0.249f * mainUnitInMeters ||
mc == OsmandSettings.MetricsConstants.MILES_AND_METERS && meters > 0.249f * mainUnitInMeters ||
mc == OsmandSettings.MetricsConstants.MILES_AND_YARDS && meters > 0.249f * mainUnitInMeters ||
mc == OsmandSettings.MetricsConstants.NAUTICAL_MILES && meters > 0.99f * mainUnitInMeters) {
mc == MetricsConstants.MILES_AND_FEET && meters > 0.249f * mainUnitInMeters ||
mc == MetricsConstants.MILES_AND_METERS && meters > 0.249f * mainUnitInMeters ||
mc == MetricsConstants.MILES_AND_YARDS && meters > 0.249f * mainUnitInMeters ||
mc == MetricsConstants.NAUTICAL_MILES && meters > 0.99f * mainUnitInMeters) {
divX = mainUnitInMeters;
if (fmt == null) {
@ -1078,13 +1081,13 @@ public class GpxUiHelper {
} else {
fmt = null;
granularity = 1f;
if (mc == OsmandSettings.MetricsConstants.KILOMETERS_AND_METERS || mc == OsmandSettings.MetricsConstants.MILES_AND_METERS) {
if (mc == MetricsConstants.KILOMETERS_AND_METERS || mc == MetricsConstants.MILES_AND_METERS) {
divX = 1f;
mainUnitStr = R.string.m;
} else if (mc == OsmandSettings.MetricsConstants.MILES_AND_FEET) {
} else if (mc == MetricsConstants.MILES_AND_FEET) {
divX = 1f / FEET_IN_ONE_METER;
mainUnitStr = R.string.foot;
} else if (mc == OsmandSettings.MetricsConstants.MILES_AND_YARDS) {
} else if (mc == MetricsConstants.MILES_AND_YARDS) {
divX = 1f / YARDS_IN_ONE_METER;
mainUnitStr = R.string.yard;
} else {
@ -1306,8 +1309,8 @@ public class GpxUiHelper {
boolean drawFilled,
boolean calcWithoutGaps) {
OsmandSettings settings = ctx.getSettings();
OsmandSettings.MetricsConstants mc = settings.METRIC_SYSTEM.get();
boolean useFeet = (mc == OsmandSettings.MetricsConstants.MILES_AND_FEET) || (mc == OsmandSettings.MetricsConstants.MILES_AND_YARDS);
MetricsConstants mc = settings.METRIC_SYSTEM.get();
boolean useFeet = (mc == MetricsConstants.MILES_AND_FEET) || (mc == MetricsConstants.MILES_AND_YARDS);
boolean light = settings.isLightContent();
final float convEle = useFeet ? 3.28084f : 1.0f;
@ -1408,19 +1411,19 @@ public class GpxUiHelper {
divX = setupAxisDistance(ctx, xAxis, calcWithoutGaps ? analysis.totalDistanceWithoutGaps : analysis.totalDistance);
}
OsmandSettings.SpeedConstants sps = settings.SPEED_SYSTEM.get();
SpeedConstants sps = settings.SPEED_SYSTEM.get();
float mulSpeed = Float.NaN;
float divSpeed = Float.NaN;
final String mainUnitY = sps.toShortString(ctx);
if (sps == OsmandSettings.SpeedConstants.KILOMETERS_PER_HOUR) {
if (sps == SpeedConstants.KILOMETERS_PER_HOUR) {
mulSpeed = 3.6f;
} else if (sps == OsmandSettings.SpeedConstants.MILES_PER_HOUR) {
} else if (sps == SpeedConstants.MILES_PER_HOUR) {
mulSpeed = 3.6f * METERS_IN_KILOMETER / METERS_IN_ONE_MILE;
} else if (sps == OsmandSettings.SpeedConstants.NAUTICALMILES_PER_HOUR) {
} else if (sps == SpeedConstants.NAUTICALMILES_PER_HOUR) {
mulSpeed = 3.6f * METERS_IN_KILOMETER / METERS_IN_ONE_NAUTICALMILE;
} else if (sps == OsmandSettings.SpeedConstants.MINUTES_PER_KILOMETER) {
} else if (sps == SpeedConstants.MINUTES_PER_KILOMETER) {
divSpeed = METERS_IN_KILOMETER / 60;
} else if (sps == OsmandSettings.SpeedConstants.MINUTES_PER_MILE) {
} else if (sps == SpeedConstants.MINUTES_PER_MILE) {
divSpeed = METERS_IN_ONE_MILE / 60;
} else {
mulSpeed = 1f;
@ -1571,8 +1574,8 @@ public class GpxUiHelper {
}
OsmandSettings settings = ctx.getSettings();
boolean light = settings.isLightContent();
OsmandSettings.MetricsConstants mc = settings.METRIC_SYSTEM.get();
boolean useFeet = (mc == OsmandSettings.MetricsConstants.MILES_AND_FEET) || (mc == OsmandSettings.MetricsConstants.MILES_AND_YARDS);
MetricsConstants mc = settings.METRIC_SYSTEM.get();
boolean useFeet = (mc == MetricsConstants.MILES_AND_FEET) || (mc == MetricsConstants.MILES_AND_YARDS);
final float convEle = useFeet ? 3.28084f : 1.0f;
final float totalDistance = calcWithoutGaps ? analysis.totalDistanceWithoutGaps : analysis.totalDistance;

View file

@ -20,7 +20,8 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.routing.VoiceRouter.VoiceMessageListener;
import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.routing.VoiceRouter.VoiceMessageListener;
import org.apache.commons.logging.Log;

View file

@ -24,6 +24,9 @@ import net.osmand.plus.TargetPointsHelper.TargetPoint;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.IntermediatePointsDialog;
import net.osmand.plus.base.PointImageDrawable;
import net.osmand.plus.helpers.enums.DrivingRegion;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.helpers.enums.SpeedConstants;
import net.osmand.plus.poi.PoiUIFilter;
import net.osmand.plus.render.RenderingIcons;
import net.osmand.plus.routing.AlarmInfo;
@ -31,8 +34,6 @@ import net.osmand.plus.routing.AlarmInfo.AlarmInfoType;
import net.osmand.plus.routing.RouteCalculationResult;
import net.osmand.plus.routing.VoiceRouter;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.MetricsConstants;
import net.osmand.util.MapUtils;
import java.util.ArrayList;
@ -193,7 +194,7 @@ public class WaypointHelper {
return found;
}
public AlarmInfo getMostImportantAlarm(OsmandSettings.SpeedConstants sc, boolean showCameras) {
public AlarmInfo getMostImportantAlarm(SpeedConstants sc, boolean showCameras) {
Location lastProjection = app.getRoutingHelper().getLastProjection();
float mxspeed = route.getCurrentMaxSpeed();
float delta = app.getSettings().SPEED_LIMIT_EXCEED_KMH.get() / 3.6f;
@ -291,7 +292,7 @@ public class WaypointHelper {
}
public AlarmInfo calculateMostImportantAlarm(RouteDataObject ro, Location loc, MetricsConstants mc,
OsmandSettings.SpeedConstants sc, boolean showCameras) {
SpeedConstants sc, boolean showCameras) {
float mxspeed = ro.getMaximumSpeed(ro.bearingVsRouteDirection(loc));
float delta = app.getSettings().SPEED_LIMIT_EXCEED_KMH.get() / 3.6f;
AlarmInfo speedAlarm = createSpeedAlarm(sc, mxspeed, loc, delta);
@ -331,7 +332,7 @@ public class WaypointHelper {
return null;
}
private static AlarmInfo createSpeedAlarm(OsmandSettings.SpeedConstants sc, float mxspeed, Location loc, float delta) {
private static AlarmInfo createSpeedAlarm(SpeedConstants sc, float mxspeed, Location loc, float delta) {
AlarmInfo speedAlarm = null;
if (mxspeed != 0 && loc != null && loc.hasSpeed() && mxspeed != RouteDataObject.NONE_MAX_SPEED) {
if (loc.getSpeed() > mxspeed + delta) {
@ -790,7 +791,7 @@ public class WaypointHelper {
} else if (type == ALARMS) {
//assign alarm list icons manually for now
String typeString = ((AlarmInfo) point).getType().toString();
OsmandSettings.DrivingRegion region = app.getSettings().DRIVING_REGION.get();
DrivingRegion region = app.getSettings().DRIVING_REGION.get();
if (typeString.equals("SPEED_CAMERA")) {
return AppCompatResources.getDrawable(uiCtx, R.drawable.mx_highway_speed_camera);
} else if (typeString.equals("BORDER_CONTROL")) {

View file

@ -0,0 +1,27 @@
package net.osmand.plus.helpers.enums;
import android.content.Context;
import net.osmand.plus.R;
public enum AngularConstants {
DEGREES(R.string.shared_string_degrees, "°"),
DEGREES360(R.string.shared_string_degrees, "°"),
MILLIRADS(R.string.shared_string_milliradians, "mil");
private final int key;
private final String unit;
AngularConstants(int key, String unit) {
this.key = key;
this.unit = unit;
}
public String toHumanString(Context ctx) {
return ctx.getString(key);
}
public String getUnitSymbol() {
return unit;
}
}

View file

@ -0,0 +1,19 @@
package net.osmand.plus.helpers.enums;
import net.osmand.plus.R;
public enum AutoZoomMap {
FARTHEST(R.string.auto_zoom_farthest, 1f, 15.5f),
FAR(R.string.auto_zoom_far, 1.4f, 17f),
CLOSE(R.string.auto_zoom_close, 2f, 19f);
public final float coefficient;
public final int name;
public final float maxZoom;
AutoZoomMap(int name, float coefficient, float maxZoom) {
this.name = name;
this.coefficient = coefficient;
this.maxZoom = maxZoom;
}
}

View file

@ -0,0 +1,62 @@
package net.osmand.plus.helpers.enums;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import net.osmand.plus.R;
public enum DayNightMode {
AUTO(R.string.daynight_mode_auto, R.drawable.ic_action_map_sunset),
DAY(R.string.daynight_mode_day, R.drawable.ic_action_map_day),
NIGHT(R.string.daynight_mode_night, R.drawable.ic_action_map_night),
SENSOR(R.string.daynight_mode_sensor, R.drawable.ic_action_map_light_sensor);
private final int key;
@DrawableRes
private final int drawableRes;
DayNightMode(@StringRes int key, @DrawableRes int drawableRes) {
this.key = key;
this.drawableRes = drawableRes;
}
public String toHumanString(Context ctx) {
return ctx.getString(key);
}
@DrawableRes
public int getIconRes() {
return drawableRes;
}
public boolean isSensor() {
return this == SENSOR;
}
public boolean isAuto() {
return this == AUTO;
}
public boolean isDay() {
return this == DAY;
}
public boolean isNight() {
return this == NIGHT;
}
public static DayNightMode[] possibleValues(Context context) {
SensorManager mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
Sensor mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
boolean isLightSensorEnabled = mLight != null;
if (isLightSensorEnabled) {
return DayNightMode.values();
} else {
return new DayNightMode[]{AUTO, DAY, NIGHT};
}
}
}

View file

@ -0,0 +1,62 @@
package net.osmand.plus.helpers.enums;
import android.content.Context;
import net.osmand.plus.R;
import java.util.Locale;
/**
* Class represents specific for driving region
* Signs, leftHandDriving
*/
public enum DrivingRegion {
EUROPE_ASIA(R.string.driving_region_europe_asia, MetricsConstants.KILOMETERS_AND_METERS, false),
US(R.string.driving_region_us, MetricsConstants.MILES_AND_FEET, false),
CANADA(R.string.driving_region_canada, MetricsConstants.KILOMETERS_AND_METERS, false),
UK_AND_OTHERS(R.string.driving_region_uk, MetricsConstants.MILES_AND_METERS, true),
JAPAN(R.string.driving_region_japan, MetricsConstants.KILOMETERS_AND_METERS, true),
AUSTRALIA(R.string.driving_region_australia, MetricsConstants.KILOMETERS_AND_METERS, true);
public final boolean leftHandDriving;
public final MetricsConstants defMetrics;
public final int name;
DrivingRegion(int name, MetricsConstants def, boolean leftHandDriving) {
this.name = name;
defMetrics = def;
this.leftHandDriving = leftHandDriving;
}
public boolean isAmericanTypeSigns() {
return this == DrivingRegion.AUSTRALIA ||
this == DrivingRegion.US ||
this == DrivingRegion.CANADA;
}
public String getDescription(Context ctx) {
return ctx.getString(leftHandDriving ? R.string.left_side_navigation : R.string.right_side_navigation) +
", " +
defMetrics.toHumanString(ctx).toLowerCase();
}
public static DrivingRegion getDrivingRegionByLocale() {
Locale df = Locale.getDefault();
if (df == null) {
return DrivingRegion.EUROPE_ASIA;
}
if (df.getCountry().equalsIgnoreCase(Locale.US.getCountry())) {
return DrivingRegion.US;
} else if (df.getCountry().equalsIgnoreCase(Locale.CANADA.getCountry())) {
return DrivingRegion.CANADA;
} else if (df.getCountry().equalsIgnoreCase(Locale.JAPAN.getCountry())) {
return DrivingRegion.JAPAN;
} else if (df.getCountry().equalsIgnoreCase("au")) {
return DrivingRegion.AUSTRALIA;
} else if (df.getCountry().equalsIgnoreCase(Locale.UK.getCountry())) {
return DrivingRegion.UK_AND_OTHERS;
}
return DrivingRegion.EUROPE_ASIA;
}
}

View file

@ -0,0 +1,29 @@
package net.osmand.plus.helpers.enums;
import android.content.Context;
import net.osmand.plus.R;
public enum MetricsConstants {
KILOMETERS_AND_METERS(R.string.si_km_m, "km-m"),
MILES_AND_FEET(R.string.si_mi_feet, "mi-f"),
MILES_AND_METERS(R.string.si_mi_meters, "mi-m"),
MILES_AND_YARDS(R.string.si_mi_yard, "mi-y"),
NAUTICAL_MILES(R.string.si_nm, "nm");
private final int key;
private final String ttsString;
MetricsConstants(int key, String ttsString) {
this.key = key;
this.ttsString = ttsString;
}
public String toHumanString(Context ctx) {
return ctx.getString(key);
}
public String toTTSString() {
return ttsString;
}
}

View file

@ -0,0 +1,32 @@
package net.osmand.plus.helpers.enums;
import android.content.Context;
import net.osmand.plus.R;
public enum SpeedConstants {
KILOMETERS_PER_HOUR(R.string.km_h, R.string.si_kmh, false),
MILES_PER_HOUR(R.string.mile_per_hour, R.string.si_mph, true),
METERS_PER_SECOND(R.string.m_s, R.string.si_m_s, false),
MINUTES_PER_MILE(R.string.min_mile, R.string.si_min_m, true),
MINUTES_PER_KILOMETER(R.string.min_km, R.string.si_min_km, false),
NAUTICALMILES_PER_HOUR(R.string.nm_h, R.string.si_nm_h, true);
public final int key;
public final int descr;
public final boolean imperial;
SpeedConstants(int key, int descr, boolean imperial) {
this.key = key;
this.descr = descr;
this.imperial = imperial;
}
public String toHumanString(Context ctx) {
return ctx.getString(descr);
}
public String toShortString(Context ctx) {
return ctx.getString(key);
}
}

View file

@ -0,0 +1,38 @@
package net.osmand.plus.helpers.enums;
import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import net.osmand.plus.R;
public enum TracksSortByMode {
BY_DATE(R.string.sort_last_modified, R.drawable.ic_action_time_start),
BY_NAME_ASCENDING(R.string.sort_name_ascending, R.drawable.ic_action_sort_by_name_ascending),
BY_NAME_DESCENDING(R.string.sort_name_descending, R.drawable.ic_action_sort_by_name_descending);
private final int iconId;
private final int nameId;
TracksSortByMode(int nameId, int iconId) {
this.nameId = nameId;
this.iconId = iconId;
}
public boolean isByName() {
return this == BY_NAME_ASCENDING || this == BY_NAME_DESCENDING;
}
public boolean isByDate() {
return this == BY_DATE;
}
@StringRes
public int getNameId() {
return nameId;
}
@DrawableRes
public int getIconId() {
return iconId;
}
}

View file

@ -17,6 +17,8 @@ import net.osmand.AndroidNetworkUtils.OnRequestsResultListener;
import net.osmand.AndroidNetworkUtils.RequestResponse;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.inapp.InAppPurchases.InAppPurchase;

View file

@ -35,6 +35,8 @@ import androidx.fragment.app.FragmentManager;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.activities.LocalIndexHelper;
@ -49,7 +51,6 @@ import net.osmand.plus.inapp.InAppPurchaseHelper.InAppPurchaseListener;
import net.osmand.plus.inapp.InAppPurchaseHelper.InAppPurchaseTaskType;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription;
import net.osmand.plus.resources.IncrementalChangesManager;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.util.Algorithms;
import java.io.File;
@ -312,7 +313,7 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
}
public void add(LocalIndexInfo info) {
OsmandSettings.CommonPreference<Boolean> preference = preferenceLiveUpdatesOn(
CommonPreference<Boolean> preference = preferenceLiveUpdatesOn(
info.getFileName(), app.getSettings());
if (preference.get()) {
dataShouldUpdate.add(info);
@ -324,8 +325,8 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
public void notifyLiveUpdatesChanged() {
Set<LocalIndexInfo> changedSet = new HashSet<>();
for (LocalIndexInfo localIndexInfo : dataShouldUpdate) {
OsmandSettings.CommonPreference<Boolean> preference =
preferenceLiveUpdatesOn(localIndexInfo.getFileName(), app.getSettings());
CommonPreference<Boolean> preference =
preferenceLiveUpdatesOn(localIndexInfo.getFileName(), getSettings());
if (!preference.get()) {
changedSet.add(localIndexInfo);
}
@ -334,8 +335,8 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
dataShouldNotUpdate.addAll(changedSet);
changedSet.clear();
for (LocalIndexInfo localIndexInfo : dataShouldNotUpdate) {
OsmandSettings.CommonPreference<Boolean> preference =
preferenceLiveUpdatesOn(localIndexInfo.getFileName(), app.getSettings());
CommonPreference<Boolean> preference =
preferenceLiveUpdatesOn(localIndexInfo.getFileName(), getSettings());
if (preference.get()) {
changedSet.add(localIndexInfo);
}
@ -473,10 +474,10 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
String fileName = li.getFileName();
PendingIntent alarmIntent = getPendingIntent(ctx, fileName);
if (enable) {
final OsmandSettings.CommonPreference<Integer> updateFrequencyPreference =
preferenceUpdateFrequency(fileName, app.getSettings());
final OsmandSettings.CommonPreference<Integer> timeOfDayPreference =
preferenceTimeOfDayToUpdate(fileName, app.getSettings());
final CommonPreference<Integer> updateFrequencyPreference =
preferenceUpdateFrequency(fileName, getSettings());
final CommonPreference<Integer> timeOfDayPreference =
preferenceTimeOfDayToUpdate(fileName, getSettings());
UpdateFrequency updateFrequency = UpdateFrequency.values()[updateFrequencyPreference.get()];
TimeOfDay timeOfDayToUpdate = TimeOfDay.values()[timeOfDayPreference.get()];
setAlarmForPendingIntent(alarmIntent, alarmMgr, updateFrequency, timeOfDayToUpdate);
@ -570,7 +571,7 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
public void bindLocalIndexInfo(@NonNull final String item, boolean isLastChild) {
OsmandApplication context = fragment.getMyActivity().getMyApplication();
final OsmandSettings.CommonPreference<Boolean> shouldUpdatePreference =
final CommonPreference<Boolean> shouldUpdatePreference =
preferenceLiveUpdatesOn(item, fragment.getSettings());
IncrementalChangesManager changesManager = context.getResourceManager().getChangesManager();
@ -600,7 +601,7 @@ public class LiveUpdatesFragment extends BaseOsmAndFragment implements InAppPurc
Algorithms.getFileNameWithoutExtension(new File(item));
final long timestamp = changesManager.getTimestamp(fileNameWithoutExtension);
final long lastCheck = preferenceLastCheck(item, fragment.getSettings()).get();
OsmandSettings.CommonPreference<Boolean> liveUpdateOn = preferenceLiveUpdatesOn(item, fragment.getSettings());
CommonPreference<Boolean> liveUpdateOn = preferenceLiveUpdatesOn(item, fragment.getSettings());
if(liveUpdateOn.get() && lastCheck != DEFAULT_LAST_CHECK) {
String lastCheckString = formatDateTime(fragment.getActivity(), lastCheck );
descriptionTextView.setText(context.getString(R.string.last_update, lastCheckString));

View file

@ -8,6 +8,7 @@ import android.os.AsyncTask;
import androidx.annotation.NonNull;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.OsmandActionBarActivity;
@ -32,7 +33,7 @@ public class LiveUpdatesHelper {
public static final int DEFAULT_LAST_CHECK = -1;
private static <T> OsmandSettings.CommonPreference<T> checkPref(OsmandSettings.CommonPreference<T> p) {
private static <T> CommonPreference<T> checkPref(CommonPreference<T> p) {
if (p.isSet()) {
T vl = p.get();
p = p.makeGlobal();
@ -44,37 +45,37 @@ public class LiveUpdatesHelper {
}
return p;
}
public static OsmandSettings.CommonPreference<Boolean> preferenceForLocalIndex(
public static CommonPreference<Boolean> preferenceForLocalIndex(
String fileName, OsmandSettings settings) {
final String settingId = fileName + LIVE_UPDATES_ON_POSTFIX;
return checkPref(settings.registerBooleanPreference(settingId, false));
}
public static OsmandSettings.CommonPreference<Boolean> preferenceLiveUpdatesOn(
public static CommonPreference<Boolean> preferenceLiveUpdatesOn(
String fileName, OsmandSettings settings) {
final String settingId = fileName + LIVE_UPDATES_ON_POSTFIX;
return checkPref(settings.registerBooleanPreference(settingId, false));
}
public static OsmandSettings.CommonPreference<Boolean> preferenceDownloadViaWiFi(
public static CommonPreference<Boolean> preferenceDownloadViaWiFi(
String fileName, OsmandSettings settings) {
final String settingId = fileName + DOWNLOAD_VIA_WIFI_POSTFIX;
return checkPref(settings.registerBooleanPreference(settingId, false));
}
public static OsmandSettings.CommonPreference<Integer> preferenceUpdateFrequency(
public static CommonPreference<Integer> preferenceUpdateFrequency(
String fileName, OsmandSettings settings) {
final String settingId = fileName + UPDATE_TIMES_POSTFIX;
return checkPref(settings.registerIntPreference(settingId, UpdateFrequency.HOURLY.ordinal()));
}
public static OsmandSettings.CommonPreference<Integer> preferenceTimeOfDayToUpdate(
public static CommonPreference<Integer> preferenceTimeOfDayToUpdate(
String fileName, OsmandSettings settings) {
final String settingId = fileName + TIME_OF_DAY_TO_UPDATE_POSTFIX;
return checkPref(settings.registerIntPreference(settingId, TimeOfDay.NIGHT.ordinal()));
}
public static OsmandSettings.CommonPreference<Long> preferenceLastCheck(
public static CommonPreference<Long> preferenceLastCheck(
String fileName, OsmandSettings settings) {
final String settingId = fileName + LAST_UPDATE_ATTEMPT_ON_POSTFIX;
return checkPref(settings.registerLongPreference(settingId, DEFAULT_LAST_CHECK));

View file

@ -23,6 +23,7 @@ import androidx.fragment.app.DialogFragment;
import net.osmand.AndroidUtils;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.download.AbstractDownloadActivity;
@ -85,7 +86,7 @@ public class LiveUpdatesSettingsDialogFragment extends DialogFragment {
final long lastCheck = preferenceLastCheck(fileName, getSettings()).get();
OsmandSettings.CommonPreference<Boolean> preference = preferenceLiveUpdatesOn(fileName,
CommonPreference<Boolean> preference = preferenceLiveUpdatesOn(fileName,
getSettings());
if (preference.get() && lastCheck != DEFAULT_LAST_CHECK) {
String lastCheckString = formatDateTime(getActivity(), lastCheck);
@ -94,13 +95,13 @@ public class LiveUpdatesSettingsDialogFragment extends DialogFragment {
lastUpdateTextView.setVisibility(View.GONE);
}
final OsmandSettings.CommonPreference<Boolean> liveUpdatePreference =
final CommonPreference<Boolean> liveUpdatePreference =
preferenceForLocalIndex(fileName, getSettings());
final OsmandSettings.CommonPreference<Boolean> downloadViaWiFiPreference =
final CommonPreference<Boolean> downloadViaWiFiPreference =
preferenceDownloadViaWiFi(fileName, getSettings());
final OsmandSettings.CommonPreference<Integer> updateFrequencyPreference =
final CommonPreference<Integer> updateFrequencyPreference =
preferenceUpdateFrequency(fileName, getSettings());
final OsmandSettings.CommonPreference<Integer> timeOfDayPreference =
final CommonPreference<Integer> timeOfDayPreference =
preferenceTimeOfDayToUpdate(fileName, getSettings());
downloadOverWiFiCheckBox.setChecked(!liveUpdatePreference.get() || downloadViaWiFiPreference.get());

View file

@ -9,6 +9,7 @@ import androidx.annotation.NonNull;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.download.AbstractDownloadActivity;
@ -50,7 +51,7 @@ public class PerformLiveUpdateAsyncTask
activity.setSupportProgressBarIndeterminateVisibility(true);
}
final OsmandApplication myApplication = getMyApplication();
OsmandSettings.CommonPreference<Long> lastCheckPreference =
CommonPreference<Long> lastCheckPreference =
LiveUpdatesHelper.preferenceLastCheck(localIndexFileName, myApplication.getSettings());
lastCheckPreference.set(System.currentTimeMillis());
}
@ -148,7 +149,7 @@ public class PerformLiveUpdateAsyncTask
public static void tryRescheduleDownload(@NonNull Context context,
@NonNull OsmandSettings settings,
@NonNull String localIndexFileName) {
final OsmandSettings.CommonPreference<Integer> updateFrequencyPreference =
final CommonPreference<Integer> updateFrequencyPreference =
preferenceUpdateFrequency(localIndexFileName, settings);
final Integer frequencyOrdinal = updateFrequencyPreference.get();
if (LiveUpdatesHelper.UpdateFrequency.values()[frequencyOrdinal]

View file

@ -4,7 +4,7 @@ import android.view.View;
import androidx.annotation.NonNull;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.mapcontextmenu.MenuBuilder.CollapseExpandListener;
public class CollapsableView {

View file

@ -58,6 +58,8 @@ import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.LockableScrollView;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.MainContextMenuItemsSettings;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.UiUtilities.DialogButtonType;
@ -74,7 +76,6 @@ import net.osmand.plus.mapcontextmenu.MenuController.TitleProgressController;
import net.osmand.plus.mapcontextmenu.controllers.TransportStopController;
import net.osmand.plus.routepreparationmenu.ChooseRouteFragment;
import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.transport.TransportStopRoute;
import net.osmand.plus.views.AnimateDraggingMapThread;
import net.osmand.plus.views.OsmandMapTileView;
@ -642,7 +643,7 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
// Action buttons
ContextMenuAdapter adapter = menu.getActionsContextMenuAdapter(false);
List<ContextMenuItem> items = adapter.getVisibleItems();
List<String> mainIds = ((OsmandSettings.MainContextMenuItemsSettings) mapActivity.getMyApplication()
List<String> mainIds = ((MainContextMenuItemsSettings) mapActivity.getMyApplication()
.getSettings().CONTEXT_MENU_ACTIONS_ITEMS.get()).getMainIds();
ContextMenuAdapter mainAdapter = new ContextMenuAdapter(requireMyApplication());
ContextMenuAdapter additionalAdapter = new ContextMenuAdapter(requireMyApplication());

View file

@ -36,8 +36,7 @@ import net.osmand.plus.mapcontextmenu.CollapsableView;
import net.osmand.plus.mapcontextmenu.MenuBuilder;
import net.osmand.plus.osmedit.OsmEditingPlugin;
import net.osmand.plus.poi.PoiUIFilter;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.MetricsConstants;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.views.layers.POIMapLayer;
import net.osmand.plus.widgets.TextViewEx;
import net.osmand.plus.widgets.tools.ClickableSpanTouchListener;
@ -70,7 +69,7 @@ public class AmenityMenuBuilder extends MenuBuilder {
private static final String WIKI_LINK = ".wikipedia.org/w";
public final static Log LOG = PlatformUtil.getLog(AmenityMenuBuilder.class);
private final static DecimalFormat DF = new DecimalFormat("#.##");
private OsmandSettings.MetricsConstants metricSystem;
private MetricsConstants metricSystem;
private final Amenity amenity;
@ -714,10 +713,10 @@ public class AmenityMenuBuilder extends MenuBuilder {
case "seamark_height":
if (Algorithms.isFloat(value)) {
double valueAsDouble = Double.valueOf(value);
if (metricSystem == OsmandSettings.MetricsConstants.MILES_AND_FEET) {
if (metricSystem == MetricsConstants.MILES_AND_FEET) {
formattedValue = String.valueOf(DF.format(valueAsDouble * OsmAndFormatter.FEET_IN_ONE_METER))
+ " " + mapActivity.getResources().getString(R.string.foot);
} else if (metricSystem == OsmandSettings.MetricsConstants.MILES_AND_YARDS) {
} else if (metricSystem == MetricsConstants.MILES_AND_YARDS) {
formattedValue = String.valueOf(DF.format(valueAsDouble * OsmAndFormatter.YARDS_IN_ONE_METER))
+ " " + mapActivity.getResources().getString(R.string.yard);
} else {

View file

@ -13,7 +13,7 @@ import androidx.core.content.ContextCompat;
import net.osmand.data.PointDescription;
import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.helpers.MapMarkerDialogHelper;
@ -56,7 +56,7 @@ public class MapMarkerMenuController extends MenuController {
public void buttonPressed() {
MapActivity activity = getMapActivity();
if (activity != null) {
OsmandSettings.OsmandPreference<Boolean> indication
OsmandPreference<Boolean> indication
= activity.getMyApplication().getSettings().MARKERS_DISTANCE_INDICATION_ENABLED;
if (!indication.get()) {
indication.set(true);

View file

@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
@ -83,7 +84,7 @@ public class CoordinateInputBottomSheetDialogFragment extends MenuBottomSheetDia
@Override
public void onClick(View v) {
if (listener != null) {
OsmandSettings.CommonPreference<Boolean> pref = settings.COORDS_INPUT_TWO_DIGITS_LONGTITUDE;
CommonPreference<Boolean> pref = settings.COORDS_INPUT_TWO_DIGITS_LONGTITUDE;
pref.set(!pref.get());
listener.onInputSettingsChanged();
}
@ -108,7 +109,7 @@ public class CoordinateInputBottomSheetDialogFragment extends MenuBottomSheetDia
@Override
public void onClick(View v) {
if (listener != null) {
OsmandSettings.CommonPreference<Boolean> pref = settings.COORDS_INPUT_USE_RIGHT_SIDE;
CommonPreference<Boolean> pref = settings.COORDS_INPUT_USE_RIGHT_SIDE;
pref.set(!pref.get());
listener.onHandChanged();
}

View file

@ -67,6 +67,7 @@ import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.OsmAndLocationProvider.OsmAndCompassListener;
import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.Version;
@ -1023,7 +1024,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
}
private void changeOsmandKeyboardSetting() {
OsmandSettings.OsmandPreference<Boolean> pref = getMyApplication().getSettings().COORDS_INPUT_USE_OSMAND_KEYBOARD;
OsmandPreference<Boolean> pref = getMyApplication().getSettings().COORDS_INPUT_USE_OSMAND_KEYBOARD;
pref.set(!pref.get());
}

View file

@ -32,8 +32,7 @@ import com.github.ksoichiro.android.observablescrollview.ScrollState;
import net.osmand.AndroidUtils;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.MapMarkersMode;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;

View file

@ -0,0 +1,37 @@
package net.osmand.plus.mapmarkers;
import android.content.Context;
import net.osmand.plus.R;
public enum MapMarkersMode {
TOOLBAR(R.string.shared_string_topbar),
WIDGETS(R.string.shared_string_widgets),
NONE(R.string.shared_string_none);
private final int key;
MapMarkersMode(int key) {
this.key = key;
}
public String toHumanString(Context ctx) {
return ctx.getString(key);
}
public boolean isToolbar() {
return this == TOOLBAR;
}
public boolean isWidgets() {
return this == WIDGETS;
}
public boolean isNone() {
return this == NONE;
}
public static MapMarkersMode[] possibleValues(Context context) {
return new MapMarkersMode[]{TOOLBAR, WIDGETS, NONE};
}
}

View file

@ -14,7 +14,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.AndroidUtils;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.base.BottomSheetDialogFragment;
import net.osmand.plus.helpers.AndroidUiHelper;
@ -63,7 +62,7 @@ public class OptionsBottomSheetDialogFragment extends BottomSheetDialogFragment
}
((ImageView) mainView.findViewById(R.id.sort_by_icon)).setImageDrawable(getContentIcon(R.drawable.ic_sort_waypoint_dark));
OsmandSettings.MapMarkersMode mode = getMyApplication().getSettings().MAP_MARKERS_MODE.get();
MapMarkersMode mode = getMyApplication().getSettings().MAP_MARKERS_MODE.get();
int displayedCount = getMyApplication().getSettings().DISPLAYED_MARKERS_WIDGETS_COUNT.get();
ImageView showDirectionIcon = (ImageView) mainView.findViewById(R.id.show_direction_icon);
int imageResId = 0;

View file

@ -1,6 +1,5 @@
package net.osmand.plus.measurementtool;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
@ -61,6 +60,7 @@ import net.osmand.plus.measurementtool.OptionsBottomSheetDialogFragment.OptionsF
import net.osmand.plus.measurementtool.RouteBetweenPointsBottomSheetDialogFragment.RouteBetweenPointsDialogMode;
import net.osmand.plus.measurementtool.RouteBetweenPointsBottomSheetDialogFragment.RouteBetweenPointsDialogType;
import net.osmand.plus.measurementtool.RouteBetweenPointsBottomSheetDialogFragment.RouteBetweenPointsFragmentListener;
import net.osmand.plus.measurementtool.SaveGpxRouteAsyncTask.SaveGpxRouteListener;
import net.osmand.plus.measurementtool.SelectedPointBottomSheetDialogFragment.SelectedPointFragmentListener;
import net.osmand.plus.measurementtool.adapter.MeasurementToolAdapter;
import net.osmand.plus.measurementtool.adapter.MeasurementToolAdapter.MeasurementAdapterListener;
@ -83,6 +83,8 @@ import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarView;
import net.osmand.router.RoutePlannerFrontEnd.GpxRouteApproximation;
import java.io.File;
import java.lang.ref.WeakReference;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@ -145,9 +147,6 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
private MeasurementEditingContext editingCtx = new MeasurementEditingContext();
private LatLon initialPoint;
private OsmandApplication app;
private MapActivity mapActivity;
private MeasurementToolLayer measurementToolLayer;
enum SaveType {
ROUTE_POINT,
@ -160,6 +159,10 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
SHOW_IS_SAVED_FRAGMENT
}
protected MeasurementEditingContext getEditingCtx() {
return editingCtx;
}
private void setEditingCtx(MeasurementEditingContext editingCtx) {
this.editingCtx = editingCtx;
}
@ -168,7 +171,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
this.initialPoint = initialPoint;
}
void setMode(int mode, boolean on) {
private void setMode(int mode, boolean on) {
int modes = this.modes;
if (on) {
modes |= mode;
@ -207,7 +210,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
@Nullable Bundle savedInstanceState) {
final MapActivity mapActivity = (MapActivity) getActivity();
if (mapActivity == null) {
return null;
@ -1059,7 +1062,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
}
@Nullable
GpxData setupGpxData(@Nullable GPXFile gpxFile) {
private GpxData setupGpxData(@Nullable GPXFile gpxFile) {
GpxData gpxData = null;
if (gpxFile != null) {
QuadRect rect = gpxFile.getRect();
@ -1524,25 +1527,118 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
return displayedName;
}
private void saveNewGpx(File dir, String fileName, boolean showOnMap, SaveType saveType, FinalSaveAction finalSaveAction) {
saveGpx(dir, fileName, showOnMap, null, null, saveType, finalSaveAction);
private void saveNewGpx(@NonNull File dir, @NonNull String fileName, boolean showOnMap, SaveType saveType, FinalSaveAction finalSaveAction) {
saveGpx(new File(dir, fileName), null, null, saveType, finalSaveAction, showOnMap);
}
private void saveExistingGpx(GPXFile gpx, boolean showOnMap, ActionType actionType, SaveType saveType,
FinalSaveAction finalSaveAction) {
saveGpx(null, null, showOnMap, gpx, actionType, saveType, finalSaveAction);
private void saveExistingGpx(@NonNull GPXFile gpx, boolean showOnMap, ActionType actionType,
SaveType saveType, FinalSaveAction finalSaveAction) {
saveGpx(new File(gpx.path), gpx, actionType, saveType, finalSaveAction, showOnMap);
}
@SuppressLint("StaticFieldLeak")
private void saveGpx(final File dir,
final String fileName,
final boolean showOnMap,
final GPXFile gpxFile,
final ActionType actionType,
final SaveType saveType,
final FinalSaveAction finalSaveAction) {
private void saveGpx(@NonNull final File outFile, @Nullable GPXFile gpxFile, final ActionType actionType,
SaveType saveType, final FinalSaveAction finalSaveAction, final boolean showOnMap) {
SaveGpxRouteListener saveGpxRouteListener = new SaveGpxRouteListener() {
@Override
public void gpxSavingFinished(Exception warning, GPXFile savedGpxFile, File backupFile) {
onGpxSaved(warning, savedGpxFile, outFile, backupFile, actionType, finalSaveAction, showOnMap);
}
};
new SaveGPX(this, gpxFile, dir, fileName, saveType, showOnMap, actionType, finalSaveAction, app, mapActivity, measurementToolLayer, nightMode).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
SaveGpxRouteAsyncTask saveTask = new SaveGpxRouteAsyncTask(this, outFile, gpxFile, actionType, saveType, showOnMap, saveGpxRouteListener);
saveTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
private void onGpxSaved(Exception warning, GPXFile savedGpxFile, final File outFile, final File backupFile,
final ActionType actionType, FinalSaveAction finalSaveAction, final boolean showOnMap) {
MapActivity mapActivity = getMapActivity();
if (mapActivity == null) {
return;
}
mapActivity.refreshMap();
if (warning == null) {
if (editingCtx.isNewData() && savedGpxFile != null) {
QuadRect rect = savedGpxFile.getRect();
TrkSegment segment = savedGpxFile.getNonEmptyTrkSegment();
GpxData gpxData = new GpxData(savedGpxFile, rect, ActionType.EDIT_SEGMENT, segment);
editingCtx.setGpxData(gpxData);
updateToolbar();
}
if (isInEditMode()) {
editingCtx.setChangesSaved();
dismiss(mapActivity);
} else {
switch (finalSaveAction) {
case SHOW_SNACK_BAR_AND_CLOSE:
final WeakReference<MapActivity> mapActivityRef = new WeakReference<>(mapActivity);
snackbar = Snackbar.make(mapActivity.getLayout(),
MessageFormat.format(getString(R.string.gpx_saved_sucessfully), outFile.getName()),
Snackbar.LENGTH_LONG)
.setAction(R.string.shared_string_undo, new OnClickListener() {
@Override
public void onClick(View view) {
MapActivity mapActivity = mapActivityRef.get();
if (mapActivity != null) {
OsmandApplication app = mapActivity.getMyApplication();
FileUtils.removeGpxFile(app, outFile);
if (backupFile != null) {
FileUtils.renameGpxFile(app, backupFile, outFile);
GPXFile gpx = GPXUtilities.loadGPXFile(outFile);
setupGpxData(gpx);
if (showOnMap) {
showGpxOnMap(app, gpx, actionType, false);
}
} else {
setupGpxData(null);
}
setMode(UNDO_MODE, true);
MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(),
editingCtx, modes);
}
}
})
.addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
if (event != DISMISS_EVENT_ACTION) {
editingCtx.setChangesSaved();
}
super.onDismissed(transientBottomBar, event);
}
});
snackbar.getView().<TextView>findViewById(com.google.android.material.R.id.snackbar_action)
.setAllCaps(false);
UiUtilities.setupSnackbar(snackbar, nightMode);
snackbar.show();
dismiss(mapActivity, false);
break;
case SHOW_IS_SAVED_FRAGMENT:
editingCtx.setChangesSaved();
SavedTrackBottomSheetDialogFragment.showInstance(mapActivity.getSupportFragmentManager(),
outFile.getAbsolutePath());
dismiss(mapActivity);
break;
case SHOW_TOAST:
editingCtx.setChangesSaved();
if (savedGpxFile != null && !savedGpxFile.showCurrentTrack) {
Toast.makeText(mapActivity,
MessageFormat.format(getString(R.string.gpx_saved_sucessfully), outFile.getAbsolutePath()),
Toast.LENGTH_LONG).show();
}
}
}
} else {
Toast.makeText(mapActivity, warning.getMessage(), Toast.LENGTH_LONG).show();
}
}
protected static void showGpxOnMap(OsmandApplication app, GPXFile gpx, ActionType actionType, boolean isNewGpx) {
SelectedGpxFile sf = app.getSelectedGpxHelper().selectGpxFile(gpx, true, false);
if (sf != null && !isNewGpx) {
if (actionType == ActionType.ADD_SEGMENT || actionType == ActionType.EDIT_SEGMENT) {
sf.processPoints(app);
}
}
}
private void updateUndoRedoButton(boolean enable, View view) {
@ -1575,7 +1671,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
updateToolbar();
}
void updateToolbar() {
private void updateToolbar() {
MapActivity mapActivity = getMapActivity();
if (mapActivity == null) {
return;
@ -1706,7 +1802,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
}
}
void dismiss(@NonNull MapActivity mapActivity) {
private void dismiss(@NonNull MapActivity mapActivity) {
dismiss(mapActivity, true);
}
@ -1928,5 +2024,4 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
public boolean isNightModeForMapControls() {
return nightMode;
}
}
}

View file

@ -1,297 +0,0 @@
package net.osmand.plus.measurementtool;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.snackbar.Snackbar;
import net.osmand.FileUtils;
import net.osmand.GPXUtilities;
import net.osmand.data.QuadRect;
import net.osmand.plus.GpxSelectionHelper;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.Version;
import net.osmand.plus.activities.MapActivity;
import net.osmand.util.Algorithms;
import java.io.File;
import java.lang.ref.WeakReference;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import static net.osmand.IndexConstants.GPX_FILE_EXT;
class SaveGPX extends AsyncTask<Void, Void, Exception> {
private final MeasurementToolFragment measurementToolFragment;
private final GPXUtilities.GPXFile gpxFile;
private final File dir;
private final String fileName;
private final MeasurementToolFragment.SaveType saveType;
private final boolean showOnMap;
private final GpxData.ActionType actionType;
private final MeasurementToolFragment.FinalSaveAction finalSaveAction;
private final OsmandApplication app;
@SuppressLint("StaticFieldLeak")
private final MapActivity mapActivity;
private MeasurementToolLayer measurementToolLayer;
private boolean nightMode;
private ProgressDialog progressDialog;
private File backupFile;
private File outFile;
private GPXUtilities.GPXFile savedGpxFile;
public MeasurementEditingContext editingCtx = new MeasurementEditingContext();
private static final int UNDO_MODE = 0x8;
public SaveGPX(MeasurementToolFragment measurementToolFragment, GPXUtilities.GPXFile gpxFile, File dir, String fileName, MeasurementToolFragment.SaveType saveType, boolean showOnMap, GpxData.ActionType actionType, MeasurementToolFragment.FinalSaveAction finalSaveAction, OsmandApplication app, MapActivity mapActivity, MeasurementToolLayer measurementToolLayer, boolean nightMode) {
this.measurementToolFragment = measurementToolFragment;
this.gpxFile = gpxFile;
this.dir = dir;
this.fileName = fileName;
this.saveType = saveType;
this.showOnMap = showOnMap;
this.actionType = actionType;
this.finalSaveAction = finalSaveAction;
this.app = app;
this.mapActivity = mapActivity;
this.measurementToolLayer = measurementToolLayer;
this.nightMode = nightMode;
}
@Override
protected void onPreExecute() {
measurementToolFragment.cancelModes();
if (mapActivity != null) {
progressDialog = new ProgressDialog(mapActivity);
progressDialog.setMessage(measurementToolFragment.getString(R.string.saving_gpx_tracks));
progressDialog.show();
}
}
@Override
protected Exception doInBackground(Void... voids) {
if (app == null) {
return null;
}
List<GPXUtilities.WptPt> points = editingCtx.getPoints();
GPXUtilities.TrkSegment before = editingCtx.getBeforeTrkSegmentLine();
GPXUtilities.TrkSegment after = editingCtx.getAfterTrkSegmentLine();
if (gpxFile == null) {
outFile = new File(dir, fileName);
String trackName = fileName.substring(0, fileName.length() - GPX_FILE_EXT.length());
GPXUtilities.GPXFile gpx = new GPXUtilities.GPXFile(Version.getFullVersion(app));
if (measurementToolLayer != null) {
if (saveType == MeasurementToolFragment.SaveType.LINE) {
GPXUtilities.TrkSegment segment = new GPXUtilities.TrkSegment();
if (editingCtx.hasRoute()) {
segment.points.addAll(editingCtx.getRoutePoints());
} else {
segment.points.addAll(before.points);
segment.points.addAll(after.points);
}
GPXUtilities.Track track = new GPXUtilities.Track();
track.name = trackName;
track.segments.add(segment);
gpx.tracks.add(track);
} else if (saveType == MeasurementToolFragment.SaveType.ROUTE_POINT) {
if (editingCtx.hasRoute()) {
GPXUtilities.GPXFile newGpx = editingCtx.exportRouteAsGpx(trackName);
if (newGpx != null) {
gpx = newGpx;
}
}
gpx.addRoutePoints(points);
}
}
Exception res = GPXUtilities.writeGpxFile(outFile, gpx);
gpx.path = outFile.getAbsolutePath();
savedGpxFile = gpx;
if (showOnMap) {
showGpxOnMap(app, gpx, true);
}
return res;
} else {
GPXUtilities.GPXFile gpx = gpxFile;
outFile = new File(gpx.path);
backupFile = FileUtils.backupFile(app, outFile);
String trackName = Algorithms.getFileNameWithoutExtension(outFile);
if (measurementToolLayer != null) {
if (measurementToolFragment.isPlanRouteMode()) {
if (saveType == MeasurementToolFragment.SaveType.LINE) {
GPXUtilities.TrkSegment segment = new GPXUtilities.TrkSegment();
if (editingCtx.hasRoute()) {
segment.points.addAll(editingCtx.getRoutePoints());
} else {
segment.points.addAll(before.points);
segment.points.addAll(after.points);
}
GPXUtilities.Track track = new GPXUtilities.Track();
track.name = trackName;
track.segments.add(segment);
gpx.tracks.add(track);
} else if (saveType == MeasurementToolFragment.SaveType.ROUTE_POINT) {
if (editingCtx.hasRoute()) {
GPXUtilities.GPXFile newGpx = editingCtx.exportRouteAsGpx(trackName);
if (newGpx != null) {
gpx = newGpx;
}
}
gpx.addRoutePoints(points);
}
} else if (actionType != null) {
GpxData gpxData = editingCtx.getGpxData();
switch (actionType) {
case ADD_SEGMENT: {
List<GPXUtilities.WptPt> snappedPoints = new ArrayList<>();
snappedPoints.addAll(before.points);
snappedPoints.addAll(after.points);
gpx.addTrkSegment(snappedPoints);
break;
}
case ADD_ROUTE_POINTS: {
gpx.replaceRoutePoints(points);
break;
}
case EDIT_SEGMENT: {
if (gpxData != null) {
GPXUtilities.TrkSegment segment = new GPXUtilities.TrkSegment();
segment.points.addAll(points);
gpx.replaceSegment(gpxData.getTrkSegment(), segment);
}
break;
}
case OVERWRITE_SEGMENT: {
if (gpxData != null) {
List<GPXUtilities.WptPt> snappedPoints = new ArrayList<>();
snappedPoints.addAll(before.points);
snappedPoints.addAll(after.points);
GPXUtilities.TrkSegment segment = new GPXUtilities.TrkSegment();
segment.points.addAll(snappedPoints);
gpx.replaceSegment(gpxData.getTrkSegment(), segment);
}
break;
}
}
} else {
gpx.addRoutePoints(points);
}
}
Exception res = null;
if (!gpx.showCurrentTrack) {
res = GPXUtilities.writeGpxFile(outFile, gpx);
}
savedGpxFile = gpx;
if (showOnMap) {
showGpxOnMap(app, gpx, false);
}
return res;
}
}
private void showGpxOnMap(OsmandApplication app, GPXUtilities.GPXFile gpx, boolean isNewGpx) {
GpxSelectionHelper.SelectedGpxFile sf = app.getSelectedGpxHelper().selectGpxFile(gpx, true, false);
if (sf != null && !isNewGpx) {
if (actionType == GpxData.ActionType.ADD_SEGMENT || actionType == GpxData.ActionType.EDIT_SEGMENT) {
sf.processPoints(app);
}
}
}
@Override
protected void onPostExecute(Exception warning) {
onGpxSaved(warning);
}
private void onGpxSaved(Exception warning) {
if (mapActivity == null) {
return;
}
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
mapActivity.refreshMap();
if (warning == null) {
if (editingCtx.isNewData() && savedGpxFile != null) {
QuadRect rect = savedGpxFile.getRect();
GPXUtilities.TrkSegment segment = savedGpxFile.getNonEmptyTrkSegment();
GpxData gpxData = new GpxData(savedGpxFile, rect, GpxData.ActionType.EDIT_SEGMENT, segment);
editingCtx.setGpxData(gpxData);
measurementToolFragment.updateToolbar();
}
if (measurementToolFragment.isInEditMode()) {
editingCtx.setChangesSaved();
measurementToolFragment.dismiss(mapActivity);
} else {
switch (finalSaveAction) {
case SHOW_SNACK_BAR_AND_CLOSE:
final WeakReference<MapActivity> mapActivityRef = new WeakReference<>(mapActivity);
Snackbar snackbar = Snackbar.make(mapActivity.getLayout(),
MessageFormat.format(measurementToolFragment.getString(R.string.gpx_saved_sucessfully), outFile.getName()),
Snackbar.LENGTH_LONG)
.setAction(R.string.shared_string_undo, new View.OnClickListener() {
@Override
public void onClick(View view) {
MapActivity mapActivity = mapActivityRef.get();
if (mapActivity != null) {
if (outFile != null) {
OsmandApplication app = mapActivity.getMyApplication();
FileUtils.removeGpxFile(app, outFile);
if (backupFile != null) {
FileUtils.renameGpxFile(app, backupFile, outFile);
GPXUtilities.GPXFile gpx = GPXUtilities.loadGPXFile(outFile);
measurementToolFragment.setupGpxData(gpx);
if (showOnMap) {
showGpxOnMap(app, gpx, false);
}
} else {
measurementToolFragment.setupGpxData(null);
}
}
measurementToolFragment.setMode(UNDO_MODE, true);
MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager()
);
}
}
})
.addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
if (event != DISMISS_EVENT_ACTION) {
editingCtx.setChangesSaved();
}
super.onDismissed(transientBottomBar, event);
}
});
snackbar.getView().<TextView>findViewById(com.google.android.material.R.id.snackbar_action)
.setAllCaps(false);
UiUtilities.setupSnackbar(snackbar, nightMode);
snackbar.show();
measurementToolFragment.dismiss(mapActivity);
break;
case SHOW_IS_SAVED_FRAGMENT:
editingCtx.setChangesSaved();
SavedTrackBottomSheetDialogFragment.showInstance(mapActivity.getSupportFragmentManager(),
outFile.getAbsolutePath());
measurementToolFragment.dismiss(mapActivity);
break;
case SHOW_TOAST:
editingCtx.setChangesSaved();
if (!savedGpxFile.showCurrentTrack) {
Toast.makeText(mapActivity,
MessageFormat.format(measurementToolFragment.getString(R.string.gpx_saved_sucessfully), outFile.getAbsolutePath()),
Toast.LENGTH_LONG).show();
}
}
}
} else {
Toast.makeText(mapActivity, warning.getMessage(), Toast.LENGTH_LONG).show();
}
}
}

View file

@ -0,0 +1,210 @@
package net.osmand.plus.measurementtool;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import net.osmand.AndroidUtils;
import net.osmand.FileUtils;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.Track;
import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.measurementtool.GpxData.ActionType;
import net.osmand.plus.measurementtool.MeasurementToolFragment.SaveType;
import net.osmand.util.Algorithms;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import static net.osmand.IndexConstants.GPX_FILE_EXT;
class SaveGpxRouteAsyncTask extends AsyncTask<Void, Void, Exception> {
private WeakReference<MeasurementToolFragment> fragmentRef;
private ProgressDialog progressDialog;
private SaveType saveType;
private ActionType actionType;
private File outFile;
private File backupFile;
private GPXFile gpxFile;
private GPXFile savedGpxFile;
private boolean showOnMap;
private SaveGpxRouteListener saveGpxRouteListener;
public SaveGpxRouteAsyncTask(MeasurementToolFragment fragment, File outFile, GPXFile gpxFile,
ActionType actionType, SaveType saveType, boolean showOnMap, SaveGpxRouteListener saveGpxRouteListener) {
fragmentRef = new WeakReference<>(fragment);
this.outFile = outFile;
this.showOnMap = showOnMap;
this.gpxFile = gpxFile;
this.actionType = actionType;
this.saveType = saveType;
this.saveGpxRouteListener = saveGpxRouteListener;
}
@Override
protected void onPreExecute() {
MeasurementToolFragment fragment = fragmentRef.get();
if (fragment != null && fragment.getContext() != null) {
fragment.cancelModes();
Context ctx = fragment.getContext();
progressDialog = new ProgressDialog(ctx);
progressDialog.setMessage(ctx.getString(R.string.saving_gpx_tracks));
progressDialog.show();
}
}
@Override
protected Exception doInBackground(Void... voids) {
MeasurementToolFragment fragment = fragmentRef.get();
if (fragment == null || fragment.getActivity() == null) {
return null;
}
MapActivity mapActivity = (MapActivity) fragment.getActivity();
OsmandApplication app = mapActivity.getMyApplication();
MeasurementToolLayer measurementLayer = mapActivity.getMapLayers().getMeasurementToolLayer();
MeasurementEditingContext editingCtx = fragment.getEditingCtx();
List<WptPt> points = editingCtx.getPoints();
TrkSegment before = editingCtx.getBeforeTrkSegmentLine();
TrkSegment after = editingCtx.getAfterTrkSegmentLine();
if (gpxFile == null) {
String fileName = outFile.getName();
String trackName = fileName.substring(0, fileName.length() - GPX_FILE_EXT.length());
GPXFile gpx = new GPXFile(Version.getFullVersion(app));
if (measurementLayer != null) {
if (saveType == MeasurementToolFragment.SaveType.LINE) {
TrkSegment segment = new TrkSegment();
if (editingCtx.hasRoute()) {
segment.points.addAll(editingCtx.getRoutePoints());
} else {
segment.points.addAll(before.points);
segment.points.addAll(after.points);
}
Track track = new Track();
track.name = trackName;
track.segments.add(segment);
gpx.tracks.add(track);
} else if (saveType == MeasurementToolFragment.SaveType.ROUTE_POINT) {
if (editingCtx.hasRoute()) {
GPXFile newGpx = editingCtx.exportRouteAsGpx(trackName);
if (newGpx != null) {
gpx = newGpx;
}
}
gpx.addRoutePoints(points);
}
}
Exception res = GPXUtilities.writeGpxFile(outFile, gpx);
gpx.path = outFile.getAbsolutePath();
savedGpxFile = gpx;
if (showOnMap) {
MeasurementToolFragment.showGpxOnMap(app, gpx, actionType, true);
}
return res;
} else {
GPXFile gpx = gpxFile;
backupFile = FileUtils.backupFile(app, outFile);
String trackName = Algorithms.getFileNameWithoutExtension(outFile);
if (measurementLayer != null) {
if (fragment.isPlanRouteMode()) {
if (saveType == MeasurementToolFragment.SaveType.LINE) {
TrkSegment segment = new TrkSegment();
if (editingCtx.hasRoute()) {
segment.points.addAll(editingCtx.getRoutePoints());
} else {
segment.points.addAll(before.points);
segment.points.addAll(after.points);
}
Track track = new Track();
track.name = trackName;
track.segments.add(segment);
gpx.tracks.add(track);
} else if (saveType == MeasurementToolFragment.SaveType.ROUTE_POINT) {
if (editingCtx.hasRoute()) {
GPXFile newGpx = editingCtx.exportRouteAsGpx(trackName);
if (newGpx != null) {
gpx = newGpx;
}
}
gpx.addRoutePoints(points);
}
} else if (actionType != null) {
GpxData gpxData = editingCtx.getGpxData();
switch (actionType) {
case ADD_SEGMENT: {
List<WptPt> snappedPoints = new ArrayList<>();
snappedPoints.addAll(before.points);
snappedPoints.addAll(after.points);
gpx.addTrkSegment(snappedPoints);
break;
}
case ADD_ROUTE_POINTS: {
gpx.replaceRoutePoints(points);
break;
}
case EDIT_SEGMENT: {
if (gpxData != null) {
TrkSegment segment = new TrkSegment();
segment.points.addAll(points);
gpx.replaceSegment(gpxData.getTrkSegment(), segment);
}
break;
}
case OVERWRITE_SEGMENT: {
if (gpxData != null) {
List<WptPt> snappedPoints = new ArrayList<>();
snappedPoints.addAll(before.points);
snappedPoints.addAll(after.points);
TrkSegment segment = new TrkSegment();
segment.points.addAll(snappedPoints);
gpx.replaceSegment(gpxData.getTrkSegment(), segment);
}
break;
}
}
} else {
gpx.addRoutePoints(points);
}
}
Exception res = null;
if (!gpx.showCurrentTrack) {
res = GPXUtilities.writeGpxFile(outFile, gpx);
}
savedGpxFile = gpx;
if (showOnMap) {
MeasurementToolFragment.showGpxOnMap(app, gpx, actionType, false);
}
return res;
}
}
@Override
protected void onPostExecute(Exception warning) {
MeasurementToolFragment fragment = fragmentRef.get();
if (fragment != null && progressDialog != null && AndroidUtils.isActivityNotDestroyed(fragment.getActivity())) {
progressDialog.dismiss();
}
if (saveGpxRouteListener != null) {
saveGpxRouteListener.gpxSavingFinished(warning, savedGpxFile, backupFile);
}
}
public interface SaveGpxRouteListener {
void gpxSavingFinished(Exception warning, GPXFile savedGpxFile, File backupFile);
}
}

View file

@ -25,6 +25,7 @@ import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.helpers.GpxTrackAdapter;
import net.osmand.plus.helpers.GpxTrackAdapter.OnItemClickListener;
import net.osmand.plus.helpers.GpxUiHelper.GPXInfo;
import net.osmand.plus.helpers.enums.TracksSortByMode;
import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter;
import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter.HorizontalSelectionAdapterListener;
@ -38,7 +39,6 @@ import java.util.Map;
import static net.osmand.plus.SimplePopUpMenuItemAdapter.*;
import static net.osmand.plus.helpers.GpxUiHelper.getSortedGPXFilesInfo;
import static net.osmand.plus.settings.backend.OsmandSettings.*;
import static net.osmand.util.Algorithms.collectDirs;
public class SelectFileBottomSheet extends BottomSheetBehaviourDialogFragment {

View file

@ -13,7 +13,8 @@ import androidx.preference.Preference;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmAndAppCustomization;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.helpers.FontCache;
@ -288,11 +289,11 @@ public class MonitoringSettingsFragment extends BaseSettingsFragment
@Override
public void onApplyPreferenceChange(String prefId, boolean applyToAllProfiles, Object newValue) {
if (SAVE_GLOBAL_TRACK_INTERVAL.equals(prefId)) {
OsmandSettings.OsmandPreference pref = settings.getPreference(prefId);
OsmandPreference pref = settings.getPreference(prefId);
if (newValue instanceof Boolean) {
applyPreference(settings.SAVE_GLOBAL_TRACK_REMEMBER.getId(), applyToAllProfiles, false);
} else if (pref instanceof OsmandSettings.CommonPreference
&& !((OsmandSettings.CommonPreference) pref).hasDefaultValueForMode(getSelectedAppMode())) {
} else if (pref instanceof CommonPreference
&& !((CommonPreference) pref).hasDefaultValueForMode(getSelectedAppMode())) {
applyPreference(SAVE_GLOBAL_TRACK_INTERVAL, applyToAllProfiles, newValue);
applyPreference(settings.SAVE_GLOBAL_TRACK_REMEMBER.getId(), applyToAllProfiles, true);
}

View file

@ -84,7 +84,7 @@ import net.osmand.plus.mapmarkers.CoordinateInputDialogFragment;
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
import net.osmand.plus.osmedit.OsmEditingPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.TracksSortByMode;
import net.osmand.plus.helpers.enums.TracksSortByMode;
import java.io.File;
import java.text.DateFormat;

View file

@ -50,14 +50,14 @@ import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.TrackActivity;
import net.osmand.plus.dialogs.GpxAppearanceAdapter;
import net.osmand.plus.measurementtool.GpxData;
import net.osmand.plus.myplaces.TrackBitmapDrawer.TrackBitmapDrawerListener;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.track.GpxSplitType;
import net.osmand.plus.track.SplitTrackAsyncTask;
import net.osmand.plus.track.SplitTrackAsyncTask.SplitTrackListener;

View file

@ -25,6 +25,12 @@ import net.osmand.osm.PoiType;
import net.osmand.osm.edit.Entity;
import net.osmand.plus.*;
import net.osmand.plus.ContextMenuAdapter.ItemClickListener;
import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.EnumAdapter;
import net.osmand.plus.activities.EnumAdapter.IEnumWithResource;
import net.osmand.plus.activities.MapActivity;
@ -342,7 +348,7 @@ public class OsmEditingPlugin extends OsmandPlugin {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int pos, boolean isChecked, int[] viewCoordinates) {
if (itemId == R.string.layer_osm_bugs) {
OsmandSettings.OsmandPreference<Boolean> showOsmBugs = settings.SHOW_OSM_BUGS;
OsmandPreference<Boolean> showOsmBugs = settings.SHOW_OSM_BUGS;
showOsmBugs.set(isChecked);
adapter.getItem(pos).setColorRes(showOsmBugs.get() ?
R.color.osmand_orange : ContextMenuItem.INVALID_ID);
@ -365,7 +371,7 @@ public class OsmEditingPlugin extends OsmandPlugin {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int pos, boolean isChecked, int[] viewCoordinates) {
if (itemId == R.string.layer_osm_edits) {
OsmandSettings.OsmandPreference<Boolean> showOsmEdits = settings.SHOW_OSM_EDITS;
OsmandPreference<Boolean> showOsmEdits = settings.SHOW_OSM_EDITS;
showOsmEdits.set(isChecked);
adapter.getItem(pos).setColorRes(showOsmEdits.get() ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
adapter.notifyDataSetChanged();

View file

@ -14,8 +14,8 @@ import net.osmand.plus.DialogListItemAdapter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;

View file

@ -7,7 +7,6 @@ import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.text.format.Time;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
@ -27,6 +26,8 @@ import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
@ -34,20 +35,15 @@ import net.osmand.plus.dashboard.tools.DashFragmentData;
import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.quickaction.QuickActionType;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
import net.osmand.plus.views.AnimateDraggingMapThread;
import net.osmand.plus.views.layers.MapInfoLayer;
import net.osmand.plus.views.OsmandMapLayer.DrawSettings;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.mapwidgets.widgets.TextInfoWidget;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_MARK_AS_PARKING_LOC;

View file

@ -6,8 +6,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.DayNightMode;
import net.osmand.plus.helpers.enums.DayNightMode;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.quickaction.QuickAction;
@ -27,9 +26,9 @@ public class DayNightModeAction extends QuickAction {
@Override
public void execute(MapActivity activity) {
if (activity.getMyApplication().getDaynightHelper().isNightMode()) {
activity.getMyApplication().getSettings().DAYNIGHT_MODE.set(OsmandSettings.DayNightMode.DAY);
activity.getMyApplication().getSettings().DAYNIGHT_MODE.set(DayNightMode.DAY);
} else {
activity.getMyApplication().getSettings().DAYNIGHT_MODE.set(OsmandSettings.DayNightMode.NIGHT);
activity.getMyApplication().getSettings().DAYNIGHT_MODE.set(DayNightMode.NIGHT);
}
}

View file

@ -0,0 +1,22 @@
package net.osmand.plus.rastermaps;
import android.content.Context;
import net.osmand.plus.R;
public enum LayerTransparencySeekbarMode {
OVERLAY(R.string.overlay_transparency),
UNDERLAY(R.string.map_transparency),
OFF(R.string.shared_string_off),
UNDEFINED(R.string.shared_string_none);
private final int key;
LayerTransparencySeekbarMode(int key) {
this.key = key;
}
public String toHumanString(Context ctx) {
return ctx.getString(key);
}
}

View file

@ -16,7 +16,6 @@ import com.google.gson.reflect.TypeToken;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.LayerTransparencySeekbarMode;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
@ -137,7 +136,7 @@ public class MapOverlayAction extends SwitchableAction<Pair<String, String>> {
if (settings.LAYER_TRANSPARENCY_SEEKBAR_MODE.get() == LayerTransparencySeekbarMode.UNDEFINED) {
settings.LAYER_TRANSPARENCY_SEEKBAR_MODE.set(LayerTransparencySeekbarMode.OVERLAY);
}
if (settings.LAYER_TRANSPARENCY_SEEKBAR_MODE.get() == OsmandSettings.LayerTransparencySeekbarMode.OVERLAY) {
if (settings.LAYER_TRANSPARENCY_SEEKBAR_MODE.get() == LayerTransparencySeekbarMode.OVERLAY) {
activity.getMapLayers().getMapControlsLayer().showTransparencyBar(settings.MAP_OVERLAY_TRANSPARENCY, true);
}
} else {

View file

@ -15,8 +15,8 @@ import com.google.gson.reflect.TypeToken;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.LayerTransparencySeekbarMode;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
@ -144,7 +144,7 @@ public class MapUnderlayAction extends SwitchableAction<Pair<String, String>> {
}
final OsmandSettings.CommonPreference<Boolean> hidePolygonsPref =
final CommonPreference<Boolean> hidePolygonsPref =
activity.getMyApplication().getSettings().getCustomRenderBooleanProperty("noPolygons");
hidePolygonsPref.set(hasUnderlay);

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