diff --git a/OsmAnd/res/drawable-hdpi/ic_action_sort_door_to_door.png b/OsmAnd/res/drawable-hdpi/ic_action_sort_door_to_door.png
new file mode 100644
index 0000000000..97fc7e63f7
Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_action_sort_door_to_door.png differ
diff --git a/OsmAnd/res/drawable-hdpi/ic_action_sort_reverse_order.png b/OsmAnd/res/drawable-hdpi/ic_action_sort_reverse_order.png
new file mode 100644
index 0000000000..7eaa60a5c7
Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/ic_action_sort_reverse_order.png differ
diff --git a/OsmAnd/res/drawable-mdpi/ic_action_sort_door_to_door.png b/OsmAnd/res/drawable-mdpi/ic_action_sort_door_to_door.png
new file mode 100644
index 0000000000..e4bda56bd1
Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_action_sort_door_to_door.png differ
diff --git a/OsmAnd/res/drawable-mdpi/ic_action_sort_reverse_order.png b/OsmAnd/res/drawable-mdpi/ic_action_sort_reverse_order.png
new file mode 100644
index 0000000000..0027b2720a
Binary files /dev/null and b/OsmAnd/res/drawable-mdpi/ic_action_sort_reverse_order.png differ
diff --git a/OsmAnd/res/drawable-xhdpi/ic_action_sort_door_to_door.png b/OsmAnd/res/drawable-xhdpi/ic_action_sort_door_to_door.png
new file mode 100644
index 0000000000..0d44ab584b
Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_action_sort_door_to_door.png differ
diff --git a/OsmAnd/res/drawable-xhdpi/ic_action_sort_reverse_order.png b/OsmAnd/res/drawable-xhdpi/ic_action_sort_reverse_order.png
new file mode 100644
index 0000000000..071740d589
Binary files /dev/null and b/OsmAnd/res/drawable-xhdpi/ic_action_sort_reverse_order.png differ
diff --git a/OsmAnd/res/drawable-xxhdpi/ic_action_sort_door_to_door.png b/OsmAnd/res/drawable-xxhdpi/ic_action_sort_door_to_door.png
new file mode 100644
index 0000000000..ceb759260b
Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_action_sort_door_to_door.png differ
diff --git a/OsmAnd/res/drawable-xxhdpi/ic_action_sort_reverse_order.png b/OsmAnd/res/drawable-xxhdpi/ic_action_sort_reverse_order.png
new file mode 100644
index 0000000000..a69685c1d9
Binary files /dev/null and b/OsmAnd/res/drawable-xxhdpi/ic_action_sort_reverse_order.png differ
diff --git a/OsmAnd/res/drawable/keyboard_item_dark_bg.xml b/OsmAnd/res/drawable/keyboard_item_dark_bg.xml
new file mode 100644
index 0000000000..b4a642e69e
--- /dev/null
+++ b/OsmAnd/res/drawable/keyboard_item_dark_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/drawable/keyboard_item_light_bg.xml b/OsmAnd/res/drawable/keyboard_item_light_bg.xml
new file mode 100644
index 0000000000..6c0b9d69b2
--- /dev/null
+++ b/OsmAnd/res/drawable/keyboard_item_light_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout-land/fragment_plan_route.xml b/OsmAnd/res/layout-land/fragment_plan_route.xml
index fdb701f691..7123151125 100644
--- a/OsmAnd/res/layout-land/fragment_plan_route.xml
+++ b/OsmAnd/res/layout-land/fragment_plan_route.xml
@@ -51,33 +51,53 @@
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+
+
+
+
+
+
-
-
+ android:textSize="@dimen/default_sub_text_size"
+ tools:text="3 markers"/>
diff --git a/OsmAnd/res/layout/fragment_coordinate_input_dialog.xml b/OsmAnd/res/layout/fragment_coordinate_input_dialog.xml
index e1a67fc667..bd3c04fbbc 100644
--- a/OsmAnd/res/layout/fragment_coordinate_input_dialog.xml
+++ b/OsmAnd/res/layout/fragment_coordinate_input_dialog.xml
@@ -68,33 +68,39 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
-
+ android:layout_height="wrap_content"
+ app:labelText="@string/navigate_point_latitude">
-
+
-
+ android:layout_height="wrap_content"
+ app:labelText="@string/navigate_point_longitude">
-
+
@@ -104,17 +110,24 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
-
+ android:layout_height="wrap_content"
+ app:labelText="@string/shared_string_name">
-
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/fragment_marker_coordinate_input_bottom_sheet_dialog.xml b/OsmAnd/res/layout/fragment_marker_coordinate_input_bottom_sheet_dialog.xml
new file mode 100644
index 0000000000..e970fe8da9
--- /dev/null
+++ b/OsmAnd/res/layout/fragment_marker_coordinate_input_bottom_sheet_dialog.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml b/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml
new file mode 100644
index 0000000000..cd2b841a19
--- /dev/null
+++ b/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/fragment_marker_options_bottom_sheet_dialog.xml b/OsmAnd/res/layout/fragment_marker_options_bottom_sheet_dialog.xml
index 66cfb182c6..eb047321cc 100644
--- a/OsmAnd/res/layout/fragment_marker_options_bottom_sheet_dialog.xml
+++ b/OsmAnd/res/layout/fragment_marker_options_bottom_sheet_dialog.xml
@@ -111,6 +111,7 @@
android:background="?attr/dashboard_divider"/>
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+
+
+
+
+
+
-
-
+ android:textSize="@dimen/default_sub_text_size"
+ tools:text="3 markers"/>
diff --git a/OsmAnd/res/layout/input_coordinate_keyboard_item.xml b/OsmAnd/res/layout/input_coordinate_keyboard_item.xml
index 34d5446a4c..6c467df338 100644
--- a/OsmAnd/res/layout/input_coordinate_keyboard_item.xml
+++ b/OsmAnd/res/layout/input_coordinate_keyboard_item.xml
@@ -1,16 +1,19 @@
-
\ No newline at end of file
diff --git a/OsmAnd/res/layout/map_marker_item_new.xml b/OsmAnd/res/layout/map_marker_item_new.xml
index 98c29f7025..96c4cff626 100644
--- a/OsmAnd/res/layout/map_marker_item_new.xml
+++ b/OsmAnd/res/layout/map_marker_item_new.xml
@@ -7,11 +7,21 @@
android:descendantFocusability="blocksDescendants"
android:orientation="vertical">
-
+ tools:visibility="visible">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/use_location_card.xml b/OsmAnd/res/layout/use_location_card.xml
deleted file mode 100644
index 7178fc7fbb..0000000000
--- a/OsmAnd/res/layout/use_location_card.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/OsmAnd/res/values-ar/phrases.xml b/OsmAnd/res/values-ar/phrases.xml
index 617466d3ef..7caa517a9c 100644
--- a/OsmAnd/res/values-ar/phrases.xml
+++ b/OsmAnd/res/values-ar/phrases.xml
@@ -1582,4 +1582,29 @@
مسار جري
مضمار سباق
الرماية
+ دائرة دوران
+ نقطة دوران في مجرى مائي
+ غابة محمية
+ أرض صناعية سابقة
+ حقل أخضر
+ يعمل
+ منجم تعدين
+ ممر منجم
+ مقياس الغاز
+ صومعة
+ مأمور
+ حافظة رضيع
+ بولينج 9 دبابيس
+ بولينج 10 دبابيس
+ الكرة الحديدية
+ ركوب الدراجات
+ حقل هوكي
+ غولف
+ كرة السلة الهولندية
+ المضرب
+ تزحلق بالعجلات
+ الرماية
+ ركوب الأمواج
+ عمل فني
+ ميدان معركة
diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml
index 8ef4336b4b..487dbb7bfe 100644
--- a/OsmAnd/res/values-de/phrases.xml
+++ b/OsmAnd/res/values-de/phrases.xml
@@ -198,7 +198,7 @@
Fast Food
Fährhafen
Feuerlöscher
- Brandschutzklappe
+ Brandpatsche
Löschschlauch
Hydrant
Feuerwehr
@@ -433,12 +433,12 @@
Fischgeschäft
Ankerplatz
Ankerplatz
- Signalfeuer (Schifffahrtszeichen)
+ Bake (Seezeichen)
Untiefenbake (Kardinal)
Fahrrinnenbake (Lateral)
Mitte-Fahrwasser-Bake
Sonderzeichen-Bake
- Anlegestelle
+ Landesteg
Seezeichenbrücke
Seezeichengebäude
Untiefentonne (Kardinal)
@@ -647,7 +647,7 @@
Wikipedia
Benutzerdefiniert
- Luftverkehr
+ Seilbahntransport
Weinhandlung
Medizinische Versorgung
@@ -1567,7 +1567,7 @@
Iglesia ni Cristo
Mennoniten
Quäker
- Vereinigung „Assemblies of God”
+ Assemblies of God
Bekenntnisfrei
Nazaräer
Vereinigte Methodisten
@@ -2550,7 +2550,7 @@
Offizieller Name
Seezeichen Deich
- Delphin
+ Dalbe
Wegweiser: Forstabteilung
Wegweiser: Forstparzelle
@@ -2964,14 +2964,14 @@
Sonnenuhr
- Werbeträger: Mast
- Werbeträger: Wand
- Werbeträger: Baum
- Werbeträger: Sockel
- Werbeträger: Boden
- Werbeträger: Decke
- Werbeträger: Dach
- Werbeträger: Turm
+ Anbringung: Mast
+ Anbringung: Wand
+ Anbringung: Baum
+ Anbringung: Sockel
+ Anbringung: Boden
+ Anbringung: Decke
+ Anbringung: Dach
+ Anbringung: Turm
Aquakultur
Aquakultur: Garnelen
@@ -2993,7 +2993,7 @@
Gewächshaus
Ausgabe: Dampf
- Werbeträger: hängend
+ Anbringung: hängend
Generalkonsulat
Honorarkonsulat
Schwerkraft
@@ -3001,10 +3001,10 @@
Ausgangsleistung: heißes Wasser
Ausgangsleistung: Druckluft
Ausgangsleistung: Biogas
- Werbeträger: Plakatwand
+ Anbringung: Werbetafel
Hochkommissar
- Feuerwehrmann
+ Feuerwehrbetreiber
Anzahl Wickeltische
@@ -3093,7 +3093,7 @@
Fahrradwerkstatt
Dienstleistung
Selbstbedienung
- Dosieren
+ Rezeptur
Typ
Bewertung in Sternen
Konfession
@@ -3268,7 +3268,7 @@
Esslokal
Yakiniku
Udon
- Bierstube
+ Brasserie
Yakitori
Teriyaki
diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml
index 91e0310cc4..89f75ad541 100644
--- a/OsmAnd/res/values-es-rAR/phrases.xml
+++ b/OsmAnd/res/values-es-rAR/phrases.xml
@@ -471,7 +471,7 @@
Fuente
Ruinas históricas
Piedra rúnica
- Naufragio
+ Pecio/naufragio
Barco histórico
Mina histórica
Monumento
diff --git a/OsmAnd/res/values-es-rUS/phrases.xml b/OsmAnd/res/values-es-rUS/phrases.xml
index 11abc5162e..7208ec90e1 100644
--- a/OsmAnd/res/values-es-rUS/phrases.xml
+++ b/OsmAnd/res/values-es-rUS/phrases.xml
@@ -446,7 +446,7 @@
Fuente
Ruinas históricas
Piedra rúnica
- Naufragio
+ Pecio/naufragio
Barco histórico
Mina histórica
Monumento
diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml
index 1f4b2f9c66..2aca6248cb 100644
--- a/OsmAnd/res/values-fa/strings.xml
+++ b/OsmAnd/res/values-fa/strings.xml
@@ -764,9 +764,7 @@
OsmAnd حتی در زمانی که صفحه خاموش است در حال اجرا میماند
فضای کافی برای دانلود %1$s مگابایت وجود ندارد (فضای خالی: %2$s).
- آیا {0} فایل را دانلود میکنید؟
-حافظه استفاده شده {1} مگابایت است.
-(حافظه قابل استفاده {2} مگابایت است.)
+ آیا {0} فایل را دانلود میکنید؟ حافظهٔ استفاده شده {1} مگابایت است. (حافظهٔ قابلاستفاده {2} مگابایت است.)
تم شفاف
کتابخانه بومی بر روی این دستگاه پشتیبانی نمیشود.
@@ -1387,7 +1385,7 @@
دستگاه های متصل
- OsMo گروه
+ گروههای OsMo
شروع خودکار پس از راه اندازی و ارسال موقعیت
شروع خودکار سفر
شناسه شخصی ردیاب
@@ -1440,7 +1438,7 @@
انقضاء در
شرح
خط مشی
- شناسه گروه
+ ID گروه
نام گروه
پیوند به گروه
پیوستن
@@ -1799,11 +1797,14 @@
"آزاد %1$s… "
پیشفرض
جادههای کنتراست بالا
- نمیتوان به سرور OsMo متصل شد:
-- اتصال اینترنتی خود را بررسی کنید؛
-- تنظیمات را بررسی کنید؛
-- توییتر ما را بررسی کنید: https://twitter.com/OsMomobi
- کاربر ناشناس قادر به:\n- ایجاد گروه نیست؛\n- همزمان سازی گروهها و دستگاهها با سرور نمیباشد؛\n- مدیریت گروهها و دستگاهها در دفتر خصوصی نمیباشد.
+ نمیتوان به سرور OsMo متصل شد:
+\n- اتصال اینترنتی خود را بررسی کنید؛
+\n- تنظیمات را بررسی کنید؛
+\n- توییتر ما را بررسی کنید: https://twitter.com/OsMomobi
+ کاربر ناشناس نمیتواند:
+\n- گروه بسازد؛
+\n- گروهها و دستگاهها را با سرور همگام کند؛
+\n- گروهها و دستگاهها را در یک پیشخوان شخصی روی وبسایت مدیریت کند.
اروپا - هلند
به روزرسانی وجود ندارد
بهروزرسانی پویا
@@ -1856,18 +1857,18 @@
غیرفعال
رنگبندی براساس دامنه مسیر
رنگبندی براساس OSMC
- اشتراک گذاری موقعیت
- آدرسی مشخص نشد
+ اشتراکگذاری موقعیت
+ آدرسی پیدا نشد
نزدیک
- مخقی کردن
- پائینترین کیفیت
+ مخفیکردن
+ پایینترین کیفیت
بالاترین کیفیت
کیفیت ویدئوی خروجی
- انتخاب کیفیت ویدئوی خروجی
+ کیفیت ویدئوی خروجی را انتخاب کنید
قالب صدای خروجی
- انتخاب فرمت صدای خروجی
+ قالب صدای خروجی را انتخاب کنید
لطفاً نوع درست POI را انتخاب کنید یا از این مرحله رد شوید
- کلید منو به عوض نشان دادن منو داشبورد را نشان میدهد
+ کلید منو پیشخوان را نشان میدهد، نه منو را
دسترسی از نقشه
نسخهها
بازخورد
@@ -1895,11 +1896,10 @@
مسیر فعلی
نقشه را جابهجا کنید تا جای نشان عوض شود
- مرتب سازی
- انتخاب فایل GPX %s
- ما به اطلاعات شما برای ارائه خدمات نیازمندیم
- آیا {0} فایل را دانلود میکنید؟
-اکنون فضای خالی {2} MB است. شما نیازمند {3} MB فضای خالی و {1} MB فضای اضافی هستید.
+ مرتبسازی
+ %s فایل GPX انتخاب شده است
+ برای اینکه اطلاعاتی دربارهٔ مشارکتها را برایتان ارسال کنیم، نوشتن آن لازم است
+ آیا {0} فایل را دانلود میکنید؟ {3} مگابایت برای ذخیرهسازی موقت و {1} مگابایت برای ذخیرهسازی دائمی صرف شده است. (فضای موجود {2} مگابایت است.)
نوع
ضبط چند تایی
انجام شده
@@ -1968,71 +1968,71 @@
اتوبوس
قطار
ما را دنبال کنید
- مسیر پیامهای صوتی
- نشان دادن مقصد به صورت صوتی
- مسیر پیام لمسی
- اعلان مقصد از طریق ویبره
- فعال کردن مسیریاب OSM آنلاین (بتا)
- مسیریاب آنلان OSM
- مقصد مشخص نیست
+ بازخورد صوتی برای مسیریابی
+ نشاندادن جهت مقصد با پیام صوتی
+ بازخورد لمسی برای مسیریابی
+ نشاندادن جهت مقصد از طریق لرزاندن
+ فعالکردن مسیریابی از روی تغییرات OSM Live (آزمایشی)
+ مسیریابی با OSM Live
+ مقصد را مشخص نکردهاید
حالت آهن ربای گوشی
وضعیت نسبی
- هنگامی که مسیر درست است آنرا تغییر نده
- هنگامی که از مسیر خارج شدید مسیر جدید را اتوماتیک تعیین میکند
- عدم تغییر مسیر یا مقصد اشتباه
- در صورت انتخاب مقصد نادرست مسیر اتوماتیک تغییر کند
- اعلام هوشمند اتوماتیک
- در صورت تغییر مقصد آنرا اعلام کن
- اعلام دوره اتوماتیک
- حداقل زمان تکرار اعلامها
- رنگ پیش فرض
- انتخاب دسته بندی
+ با خارجشدن از مسیر، مسیر تازهای پیدا نکن
+ هنگامی که از مسیر خارج شوید، برنامه بهصورت خودکار مسیریابی تازهای انجام نمیدهد
+ هنگام حرکت در جهت مخالف، مسیر تازهای پیدا نکن
+ وقتی دارید فقط در جهت مخالف حرکت میکنید، بهصورت خودکار مسیریابی مجدد نمیکند
+ اعلام هوشمند خودکار
+ فقط اگر جهتم از سمت نقطهٔ مقصد منحرف شد، اعلام کن
+ بازهٔ زمانی اعلام خودکار
+ حداقل زمان تکرار اعلامها
+ رنگ پیشفرض
+ انتخاب دسته
نام
- دسته بندی
+ دسته
توضیحات
نقشه به موقعیت متصل شد
- جمع کردن
- باز کردن
- لیست خالیست
+ لیست جمعشده
+ لیست بازشده
+ لیست خالی
لیست درختی
نصب نیست
- باز
+ بازکردن
برو به بالا
حالت نقشه
باریک
متوسط
- کلفت
- لطفا در نقشه علامت بزنید
+ ضخیم
+ لطفاً نشانها را از طریق نقشه اضافه کنید
هیچ نقطه ای پیدا نشد
گزارش
- اکنون برنامه اجازه ذخیره سازی در کارت حافظه را دارد. برنامه را ببندید و دوباره اجرا کنید.
+ اکنون برنامه اجازهٔ ذخیرهسازی در کارت حافظه را دارد. برنامه را ببندید و دوباره اجرا کنید.
برو بالا
برو پایین
پایان مسیریابی
- اجتناب از جاده
- پوشه ذخیره سازی فقط خواندنی است. پوشه ذخیره سازی به طور موقت به حافظه داخلی تغییر پیدا کرد. لطفا مکان ذخیره سازی معتبر را انتخاب نمایید.
+ اجتناب از جادهٔ
+ "پوشهٔ ذخیرهسازی فقطخواندنی است. پوشهٔ ذخیرهسازی بهطور موقت به حافظهٔ داخلی تغییر کرد. لطفاً مکان ذخیرهسازی معتبر را انتخاب نمایید."
اشتراک گذاری حافظه
نوار بالا
گزارش کامل
- پیدا کردن مجدد مسیر
- OpenStreetMap یوزر و پسورد
- کمک مالی
- تعداد گیرنده ها
- اصلاح %1$s، رتبه %2$s، اصلاح نهایی %3$s
- رتبه بند ویراستاران OSM
- اشتراک آنلاین OSM
+ پیداکردن مجدد مسیر
+ نام کاربری و رمز عبور OpenStreetMap
+ کمکهای مالی
+ تعداد گیرندگان
+ اصلاحات: %1$s، رتبه: %2$s، کل اصلاحات: %3$s
+ رتبهبندی ویرایشگران OSM
+ اشتراک OSM Live
اشتراک
اسم جهانی
- اسم من را در گزارش نشان نده
- پشتیبانی منطقه ای
- هزینه ماهانه
+ اسم من را در گزارشها نشان نده
+ منطقهٔ پشتیبانیشده
+ هزینهٔ ماهانه
پرداخت ماهیانه
فعال
- غیر فعال
- لطفا آدرس ایمیل درست وارد کنید
- اسم جهانی را وارد کنید
- تشکر از شما برای به اشتراک به روز رسانی آنلاین!
- بخشی از کمکهای مالی شما پرداخت میشود به کاربرانی که در آن منطقه اصلاحات نقشه را انجام میدهند.
+ غیرفعال
+ لطفاً نشانی ایمیل معتبر وارد کنید
+ لطفاً اسم جهانی را وارد کنید
+ سپاسگزاریم که مشترک بهروزرسانیهای زنده شدید!
+ "بخشی از کمکهای مالی شما به کاربرانی پرداخت میشود که در آن منطقه اصلاحات نقشه را انجام میدهند."
تنظیمات اشتراک
زوم خودکار روشن/خاموش
انتخاب خیابان
@@ -2187,4 +2187,62 @@
\n • اضافهشدن بومیسازیهای بیشتر و پشتیبانی از نامهای محلی
\n
\n • رفع بسیاری از مشکلات دیگر و بهبود عملکرد برنامه
+ لطفاً ابتدا اشتراک OSM Live را بخرید
+ با این اشتراک میتوانید نقشههای سرتاسر جهان را بهصورت ساعتی بهروز کنید. بخشی از درآمد حاصله به جامعهٔ OSM برمیگردد وصرف هر یک از مشارکتهای OSM میشود. اگر OSM و OsmAnd را دوست دارید و مایلید از آنها پشتیبانی کنید، بهترین راه همین تهیهٔ اشتراک است.
+ نشان نقشه را انتخاب کنید
+ نشانهای دیگر
+ آپلود بهصورت ناشناس
+ نوار تنظیم شفافیت رانشان بده
+ فضای ذخیرهسازی ناکافی است! {3} مگابایت برای ذخیرهسازی موقت و {1} مگابایت برای ذخیرهسازی دائمی لازم است. فضای موجود فقط {2} مگابایت است.
+ آپلود یادداشت OSM
+ اولین نشان نقشه
+ دومین نشان نقشه
+ نوار ابزار
+ ابزارکها
+ آیا همهٔ نقاط را به نشانهای نقشه اضافه میکنید؟
+ افزودن به نشانهای نقشه
+ انتخاب نشانهای نقشه
+ برعکسکردن ترتیب
+ فعالکذدن ویژگی نشانهای نقشه
+ آیا همهٔ نشانهای فعال را حذف میکنید؟
+ آیا تاریخچهٔ نشانهای نقشه را پاک میکنید؟
+ نشانهای فعال
+ نشانهای نقشه
+ نشان نقشه
+ توصیه میکنیم رسم چندضلعیها را غیرفعال کنید.
+ مسیرهای MTB را نشان بده
+ چندضلعیها را نشان بده
+ وضعیت
+ ذخیرهکردن تغییرات
+ نشانی ایمیل
+ اشیای زیر زمین
+ اطلاعات وجود ندارد
+ حذف
+ بیشتر بخوانید
+ میتوانید بهروزرسانیهای دانلودشده را حذف کنید تا به نسخهٔ اولیهٔ نقشه برگردید
+ جاده مسدود است
+ انتخاب
+ عوضکردن مبدأ با مقصد
+ آیکونهای POI
+ حذف شد
+ حذف شدند
+ مبدأ
+ انتخاب نشده
+ هنگامی که فضای استفادهشده بیشتر از حجم فضای ذخیرهسازی میشود قطعهها را جایگزین کن
+ طول هر کدام از قطعات ضبطشده نباید از مدتزمان تعیینشده بیشتر باشد
+ حجم فضای ذخیرهسازی
+ مقدار فضای موجود برای همهٔ قطعات ضبطشده
+ بهروزرسانیهای زنده
+ نقشههای موجود
+ راهنمای صوتی را انتخاب کنید
+ برای زبان خودتان راهنمای صوتی را انتخاب یا دانلود کنید
+ جادههایی را انتخاب کنید که باید در هنگام مسیریابی از آنها اجتناب شود
+ برنامه اجازهٔ دسترسی به موقعیت مکانی را ندارد.
+ برنامه اجازهٔ دسترسی به دوربین را ندارد.
+ برنامه اجازهٔ دسترسی به میکروفون را ندارد.
+ مسافت:
+ مدت زمان:
+ راه مالرو
+ بیترِیت صدا
+ بیترِیت صدا را انتخاب کنید
diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml
index 09b270def6..d728132ac2 100644
--- a/OsmAnd/res/values-fr/strings.xml
+++ b/OsmAnd/res/values-fr/strings.xml
@@ -2952,4 +2952,11 @@ représentant la zone : %1$s x %2$s
Enregistrer comme trace
Déplacer vers l\'historique
Le groupe sera supprimé au prochain démarrage
+ Marques
+ Format des coordonnées
+ Utiliser le clavier système
+ Définissez le format des coordonnées avec de démarrer. Vous pourrez les modifier plus tard dans les Options.
+ Saisie rapide des coordonnées
+ Éviter les routes sur glace, les fjords
+ Éviter les routes sur glace et les fjords
diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml
index 91e0c85070..2bd97bb803 100644
--- a/OsmAnd/res/values-pl/strings.xml
+++ b/OsmAnd/res/values-pl/strings.xml
@@ -2840,7 +2840,7 @@ Reprezentuje obszar: %1$s x %2$s
Wskaźnik odległości
Kolejność sortowania
Opcje znacznika
- Wybierz w jaki sposób wskazywać odległość i kierunek do znaczników mapy na ekranie:
+ Proszę wybrać w jaki sposób wskazywać odległość i kierunek do znaczników mapy na ekranie:
Zmiana orientacji mapy
Wybiera prędkość, poniżej której orientacja mapy zmieni się z „względem kierunku ruchu” na „względem kompasu”
Wszystkie znaczniki mapy przeniesiono do historii
@@ -2865,4 +2865,5 @@ Reprezentuje obszar: %1$s x %2$s
Wyświetl strzałki na mapie
Wyświetl minione
Ukryj minione
+ Wprowadź współrzędne
diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml
index 4c0452df16..79c918fd57 100644
--- a/OsmAnd/res/values-uk/strings.xml
+++ b/OsmAnd/res/values-uk/strings.xml
@@ -1526,7 +1526,7 @@
Обчислити маршрут OsmAnd для першого та останнього сегментів маршруту
Чи Ви хочете використовувати відображення треку для навігації?
Додати як наступний пункт призначення
- Обрати GPX…
+ Виберіть GPX…
Виберіть пункт призначення
Виберіть на мапі
Закладки
@@ -2232,7 +2232,7 @@
Вилучити всі активні позначки?
Очистити історію позначок мапи?
Поточні позназчки
- Позначки мапи
+ Маркери мапи
Позначка мапи
Рекомендується вимкнути показ полігонів.
Файл GPX з координатами нотаток
diff --git a/OsmAnd/res/values/colors.xml b/OsmAnd/res/values/colors.xml
index ddca75eb3b..82634e5bfa 100644
--- a/OsmAnd/res/values/colors.xml
+++ b/OsmAnd/res/values/colors.xml
@@ -264,4 +264,6 @@
#525e66
+ #545454
+
\ No newline at end of file
diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index 7da72138f3..909569a780 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -9,6 +9,13 @@
3. All your modified/created strings are in the top of the file (to make easier find what\'s translated).
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
-->
+ Markers
+ Coordinates format
+ Use system keyboard
+ Choose coordinate format before start. You can always change it by tapping Options.
+ Fast Coordinates input
+ Avoid ice roads, fords
+ Avoid ice roads and fords
Use location
Add your location as first point to plan perfect route.
My Location
diff --git a/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java b/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java
index 09fef6e6c1..754822a9c9 100644
--- a/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java
+++ b/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java
@@ -338,7 +338,7 @@ public class MapMarkersHelper {
mapMarker.pointDescription.setName(address);
}
markersDbHelper.updateMarker(mapMarker);
- updateMarker(mapMarker);
+ refreshMarker(mapMarker);
}
}, null);
ctx.getGeocodingLookupService().lookupAddress(lookupRequest);
@@ -553,13 +553,19 @@ public class MapMarkersHelper {
public void deselectAllActiveMarkers() {
for (MapMarker m : mapMarkers) {
- m.selected = false;
+ if (m.selected) {
+ m.selected = false;
+ markersDbHelper.updateMarker(m);
+ }
}
}
public void selectAllActiveMarkers() {
for (MapMarker m : mapMarkers) {
- m.selected = true;
+ if (!m.selected) {
+ m.selected = true;
+ markersDbHelper.updateMarker(m);
+ }
}
}
@@ -807,20 +813,20 @@ public class MapMarkersHelper {
listeners.remove(l);
}
- private void updateMarker(MapMarker marker) {
+ private void refreshMarker(MapMarker marker) {
for (MapMarkerChangedListener l : listeners) {
l.onMapMarkerChanged(marker);
}
}
- private void updateMarkers() {
+ private void refreshMarkers() {
for (MapMarkerChangedListener l : listeners) {
l.onMapMarkersChanged();
}
}
public void refresh() {
- updateMarkers();
+ refreshMarkers();
}
private void cancelAddressRequests() {
diff --git a/OsmAnd/src/net/osmand/plus/OsmandTextFieldBoxes.java b/OsmAnd/src/net/osmand/plus/OsmandTextFieldBoxes.java
new file mode 100644
index 0000000000..77f321df5f
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/OsmandTextFieldBoxes.java
@@ -0,0 +1,88 @@
+package net.osmand.plus;
+
+import android.content.Context;
+import android.support.v4.view.ViewCompat;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+
+import studio.carbonylgroup.textfieldboxes.TextFieldBoxes;
+
+public class OsmandTextFieldBoxes extends TextFieldBoxes {
+
+ private boolean useOsmandKeyboard;
+
+ public void setUseOsmandKeyboard(boolean useOsmandKeyboard) {
+ this.useOsmandKeyboard = useOsmandKeyboard;
+ }
+
+ public OsmandTextFieldBoxes(Context context) {
+ super(context);
+ }
+
+ public OsmandTextFieldBoxes(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public OsmandTextFieldBoxes(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ if (editText != null) {
+ this.panel.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if(!OsmandTextFieldBoxes.this.isActivated()) {
+ OsmandTextFieldBoxes.this.activate(true);
+ }
+
+ OsmandTextFieldBoxes.this.setHasFocus(true);
+ if (!useOsmandKeyboard) {
+ OsmandTextFieldBoxes.this.inputMethodManager.showSoftInput(OsmandTextFieldBoxes.this.editText, InputMethodManager.SHOW_IMPLICIT);
+ }
+ }
+ });
+
+ this.iconImageButton.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ select();
+ }
+ });
+ }
+ }
+
+ public void select() {
+ if(!OsmandTextFieldBoxes.this.isActivated()) {
+ OsmandTextFieldBoxes.this.activate(true);
+ }
+
+ OsmandTextFieldBoxes.this.setHasFocus(true);
+ if (!useOsmandKeyboard) {
+ OsmandTextFieldBoxes.this.inputMethodManager.showSoftInput(OsmandTextFieldBoxes.this.editText, InputMethodManager.SHOW_IMPLICIT);
+ }
+ }
+
+ @Override
+ public void activate(boolean animated) {
+ super.activate(animated);
+ }
+
+ @Override
+ protected void deactivate() {
+ if(this.editText.getText().toString().isEmpty()) {
+ ViewCompat.animate(this.floatingLabel).alpha(1.0F).scaleX(1.0F).scaleY(1.0F).translationY(0.0F).setDuration((long)this.ANIMATION_DURATION);
+ this.editTextLayout.setVisibility(View.INVISIBLE);
+ if(this.editText.hasFocus()) {
+ if (!useOsmandKeyboard) {
+ this.inputMethodManager.hideSoftInputFromWindow(this.editText.getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
+ }
+ this.editText.clearFocus();
+ }
+ }
+
+ this.activated = false;
+ }
+}
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java
index 37aa6dca77..4824ea7102 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java
@@ -50,6 +50,7 @@ import net.osmand.plus.views.ContextMenuLayer;
import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController;
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarControllerType;
+import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
import java.lang.ref.WeakReference;
@@ -703,7 +704,7 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
mapActivity.getDashboard().setDashboardVisibility(true, DashboardOnMap.DashboardType.MAP_MARKERS);
} else {
mapActivity.getMapActions().addMapMarker(latLon.getLatitude(), latLon.getLongitude(),
- getPointDescriptionForTarget());
+ getPointDescriptionForMarker());
}
} else {
mapActivity.getMapActions().addAsTarget(latLon.getLatitude(), latLon.getLongitude(),
@@ -880,6 +881,15 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
}
}
+ public PointDescription getPointDescriptionForMarker() {
+ PointDescription pd = getPointDescriptionForTarget();
+ if (Algorithms.isEmpty(pd.getName()) && !nameStr.equals(PointDescription.getAddressNotFoundStr(mapActivity))) {
+ return new PointDescription(PointDescription.POINT_TYPE_MAP_MARKER, nameStr);
+ } else {
+ return pd;
+ }
+ }
+
public void setBaseFragmentVisibility(boolean visible) {
WeakReference fragmentRef = findMenuFragment();
if (fragmentRef != null) {
diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputBottomSheetDialogFragment.java
new file mode 100644
index 0000000000..413e330aae
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputBottomSheetDialogFragment.java
@@ -0,0 +1,261 @@
+package net.osmand.plus.mapmarkers;
+
+import android.content.DialogInterface;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.Nullable;
+import android.support.v4.content.ContextCompat;
+import android.support.v7.widget.SwitchCompat;
+import android.view.ContextThemeWrapper;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.CompoundButton;
+import android.widget.ImageView;
+import android.widget.RadioButton;
+import android.widget.TextView;
+
+import net.osmand.AndroidUtils;
+import net.osmand.data.PointDescription;
+import net.osmand.plus.R;
+import net.osmand.plus.activities.MapActivity;
+import net.osmand.plus.base.BottomSheetDialogFragment;
+import net.osmand.plus.helpers.AndroidUiHelper;
+
+public class CoordinateInputBottomSheetDialogFragment extends BottomSheetDialogFragment {
+
+ public final static String TAG = "CoordinateInputBottomSheetDialogFragment";
+
+ private boolean portrait;
+ private View mainView;
+ private boolean night;
+ private int coordinateFormat = -1;
+ private boolean useOsmandKeyboard = true;
+ private CoordinateInputFormatChangeListener listener;
+ private boolean shouldClose;
+
+ public void setListener(CoordinateInputFormatChangeListener listener) {
+ this.listener = listener;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Bundle args = getArguments();
+ if (args != null) {
+ coordinateFormat = args.getInt(CoordinateInputDialogFragment.COORDINATE_FORMAT);
+ useOsmandKeyboard = args.getBoolean(CoordinateInputDialogFragment.USE_OSMAND_KEYBOARD);
+ } else {
+ shouldClose = true;
+ }
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ final MapActivity mapActivity = (MapActivity) getActivity();
+ portrait = AndroidUiHelper.isOrientationPortrait(getActivity());
+ night = !mapActivity.getMyApplication().getSettings().isLightContent();
+ final int themeRes = night ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
+
+ mainView = View.inflate(new ContextThemeWrapper(getContext(), themeRes), coordinateFormat == -1 ?
+ R.layout.fragment_marker_coordinate_input_bottom_sheet_dialog : R.layout.fragment_marker_coordinate_input_options_bottom_sheet_helper, container);
+ if (portrait) {
+ AndroidUtils.setBackground(getActivity(), mainView, night, R.drawable.bg_bottom_menu_light, R.drawable.bg_bottom_menu_dark);
+ }
+
+ if (night) {
+ ((TextView) mainView.findViewById(R.id.coordinate_input_title)).setTextColor(getResources().getColor(R.color.ctx_menu_info_text_dark));
+ }
+
+ ImageView degreesIcon = (ImageView) mainView.findViewById(R.id.degrees_icon);
+ TextView degreesText = (TextView) mainView.findViewById(R.id.degrees_text);
+ if (coordinateFormat == PointDescription.FORMAT_DEGREES) {
+ degreesIcon.setImageDrawable(getIcon(R.drawable.ic_action_coordinates_latitude, R.color.dashboard_blue));
+ degreesText.setTextColor(ContextCompat.getColor(mapActivity, R.color.dashboard_blue));
+ ((RadioButton) mainView.findViewById(R.id.degrees_radio_button)).setChecked(true);
+ } else {
+ degreesIcon.setImageDrawable(getContentIcon(R.drawable.ic_action_coordinates_latitude));
+ }
+ degreesText.setText(PointDescription.formatToHumanString(getContext(), PointDescription.FORMAT_DEGREES));
+
+ ImageView minutesIcon = (ImageView) mainView.findViewById(R.id.minutes_icon);
+ TextView minutesText = (TextView) mainView.findViewById(R.id.minutes_text);
+ if (coordinateFormat == PointDescription.FORMAT_MINUTES) {
+ minutesIcon.setImageDrawable(getIcon(R.drawable.ic_action_coordinates_latitude, R.color.dashboard_blue));
+ minutesText.setTextColor(ContextCompat.getColor(mapActivity, R.color.dashboard_blue));
+ ((RadioButton) mainView.findViewById(R.id.minutes_radio_button)).setChecked(true);
+ } else {
+ minutesIcon.setImageDrawable(getContentIcon(R.drawable.ic_action_coordinates_latitude));
+ }
+ minutesText.setText(PointDescription.formatToHumanString(getContext(), PointDescription.FORMAT_MINUTES));
+
+ ImageView secondsIcon = (ImageView) mainView.findViewById(R.id.seconds_icon);
+ TextView secondsText = (TextView) mainView.findViewById(R.id.seconds_text);
+ if (coordinateFormat == PointDescription.FORMAT_SECONDS) {
+ secondsIcon.setImageDrawable(getIcon(R.drawable.ic_action_coordinates_latitude, R.color.dashboard_blue));
+ secondsText.setTextColor(ContextCompat.getColor(mapActivity, R.color.dashboard_blue));
+ ((RadioButton) mainView.findViewById(R.id.seconds_radio_button)).setChecked(true);
+ } else {
+ secondsIcon.setImageDrawable(getContentIcon(R.drawable.ic_action_coordinates_latitude));
+ }
+ secondsText.setText(PointDescription.formatToHumanString(getContext(), PointDescription.FORMAT_SECONDS));
+
+ if (coordinateFormat != -1) {
+ ((CompoundButton) mainView.findViewById(R.id.use_system_keyboard_switch)).setChecked(!useOsmandKeyboard);
+ ((ImageView) mainView.findViewById(R.id.use_system_keyboard_icon)).setImageDrawable(getContentIcon(R.drawable.ic_action_keyboard));
+ mainView.findViewById(R.id.use_system_keyboard_row).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ useOsmandKeyboard = !useOsmandKeyboard;
+ ((CompoundButton) mainView.findViewById(R.id.use_system_keyboard_switch)).setChecked(!useOsmandKeyboard);
+ if (listener != null) {
+ listener.onKeyboardChanged(useOsmandKeyboard);
+ }
+ }
+ });
+ highlightSelectedItem(true);
+ }
+
+ View.OnClickListener formatChangeListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ highlightSelectedItem(false);
+ switch (view.getId()) {
+ case R.id.degrees_row:
+ coordinateFormat = PointDescription.FORMAT_DEGREES;
+ break;
+ case R.id.minutes_row:
+ coordinateFormat = PointDescription.FORMAT_MINUTES;
+ break;
+ case R.id.seconds_row:
+ coordinateFormat = PointDescription.FORMAT_SECONDS;
+ break;
+ default:
+ throw new IllegalArgumentException("Unsupported format");
+ }
+ highlightSelectedItem(true);
+ if (listener != null) {
+ listener.onCoordinateFormatChanged(coordinateFormat);
+ }
+ if (shouldClose) {
+ dismiss();
+ }
+ }
+ };
+
+ mainView.findViewById(R.id.degrees_row).setOnClickListener(formatChangeListener);
+ mainView.findViewById(R.id.minutes_row).setOnClickListener(formatChangeListener);
+ mainView.findViewById(R.id.seconds_row).setOnClickListener(formatChangeListener);
+
+ mainView.findViewById(R.id.cancel_row).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ dismiss();
+ if (shouldClose && listener != null) {
+ listener.onCancel();
+ }
+ }
+ });
+
+ final int screenHeight = AndroidUtils.getScreenHeight(getActivity());
+ final int statusBarHeight = AndroidUtils.getStatusBarHeight(getActivity());
+ final int navBarHeight = AndroidUtils.getNavBarHeight(getActivity());
+
+ mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ final View scrollView = mainView.findViewById(R.id.marker_coordinate_input_scroll_view);
+ int scrollViewHeight = scrollView.getHeight();
+ int dividerHeight = AndroidUtils.dpToPx(getContext(), 1);
+ int cancelButtonHeight = getContext().getResources().getDimensionPixelSize(R.dimen.bottom_sheet_cancel_button_height);
+ int spaceForScrollView = screenHeight - statusBarHeight - navBarHeight - dividerHeight - cancelButtonHeight;
+ if (scrollViewHeight > spaceForScrollView) {
+ scrollView.getLayoutParams().height = spaceForScrollView;
+ scrollView.requestLayout();
+ }
+
+ if (!portrait) {
+ if (screenHeight - statusBarHeight - mainView.getHeight()
+ >= AndroidUtils.dpToPx(getActivity(), 8)) {
+ AndroidUtils.setBackground(getActivity(), mainView, false,
+ R.drawable.bg_bottom_sheet_topsides_landscape_light, R.drawable.bg_bottom_sheet_topsides_landscape_dark);
+ } else {
+ AndroidUtils.setBackground(getActivity(), mainView, false,
+ R.drawable.bg_bottom_sheet_sides_landscape_light, R.drawable.bg_bottom_sheet_sides_landscape_dark);
+ }
+ }
+
+ ViewTreeObserver obs = mainView.getViewTreeObserver();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ obs.removeOnGlobalLayoutListener(this);
+ } else {
+ obs.removeGlobalOnLayoutListener(this);
+ }
+ }
+ });
+
+ return mainView;
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ if (!portrait) {
+ final Window window = getDialog().getWindow();
+ WindowManager.LayoutParams params = window.getAttributes();
+ params.width = getActivity().getResources().getDimensionPixelSize(R.dimen.landscape_bottom_sheet_dialog_fragment_width);
+ window.setAttributes(params);
+ }
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ super.onCancel(dialog);
+ if (shouldClose && listener != null) {
+ listener.onCancel();
+ }
+ }
+
+ @Override
+ protected Drawable getContentIcon(@DrawableRes int id) {
+ return getIcon(id, night ? R.color.ctx_menu_info_text_dark : R.color.on_map_icon_color);
+ }
+
+ private void highlightSelectedItem(boolean check) {
+ int iconColor = check ? R.color.dashboard_blue : night ? R.color.ctx_menu_info_text_dark : R.color.on_map_icon_color;
+ int textColor = ContextCompat.getColor(getContext(), check ? (night ? R.color.color_dialog_buttons_dark : R.color.dashboard_blue) : night ? R.color.color_white : R.color.color_black);
+ switch (coordinateFormat) {
+ case PointDescription.FORMAT_DEGREES:
+ ((TextView) mainView.findViewById(R.id.degrees_text)).setTextColor(textColor);
+ ((ImageView) mainView.findViewById(R.id.degrees_icon)).setImageDrawable((getIcon(R.drawable.ic_action_coordinates_latitude, iconColor)));
+ ((RadioButton) mainView.findViewById(R.id.degrees_radio_button)).setChecked(check);
+ break;
+ case PointDescription.FORMAT_MINUTES:
+ ((TextView) mainView.findViewById(R.id.minutes_text)).setTextColor(textColor);
+ ((ImageView) mainView.findViewById(R.id.minutes_icon)).setImageDrawable((getIcon(R.drawable.ic_action_coordinates_latitude, iconColor)));
+ ((RadioButton) mainView.findViewById(R.id.minutes_radio_button)).setChecked(check);
+ break;
+ case PointDescription.FORMAT_SECONDS:
+ ((TextView) mainView.findViewById(R.id.seconds_text)).setTextColor(textColor);
+ ((ImageView) mainView.findViewById(R.id.seconds_icon)).setImageDrawable((getIcon(R.drawable.ic_action_coordinates_latitude, iconColor)));
+ ((RadioButton) mainView.findViewById(R.id.seconds_radio_button)).setChecked(check);
+ break;
+ }
+ }
+
+ interface CoordinateInputFormatChangeListener {
+
+ void onCoordinateFormatChanged(int format);
+
+ void onKeyboardChanged(boolean useOsmandKeyboard);
+
+ void onCancel();
+
+ }
+}
diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java
index e3cc6b2e56..151bddc2fc 100644
--- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java
+++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java
@@ -5,29 +5,56 @@ import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
-import android.support.v4.content.ContextCompat;
+import android.support.v4.app.Fragment;
import android.support.v7.widget.Toolbar;
+import android.text.Editable;
+import android.text.InputFilter;
import android.text.InputType;
+import android.text.TextWatcher;
import android.view.LayoutInflater;
-import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
-import android.view.WindowManager;
+import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.GridView;
-import android.widget.TextView;
+import android.widget.ImageView;
+import net.osmand.AndroidUtils;
+import net.osmand.data.PointDescription;
+import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
+import net.osmand.plus.OsmandTextFieldBoxes;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
+import net.osmand.plus.widgets.TextViewEx;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import studio.carbonylgroup.textfieldboxes.ExtendedEditText;
public class CoordinateInputDialogFragment extends DialogFragment {
public static final String TAG = "CoordinateInputDialogFragment";
+ public static final String COORDINATE_FORMAT = "coordinate_format";
+ public static final String USE_OSMAND_KEYBOARD = "use_osmand_keyboard";
+
+ private static final int DELETE_BUTTON_POSITION = 9;
+ private static final int CLEAR_BUTTON_POSITION = 11;
+ private static final int DEGREES_MAX_LENGTH = 6;
+ private static final int MINUTES_MAX_LENGTH = 9;
+ private static final int SECONDS_MAX_LENGTH = 12;
+
private boolean lightTheme;
+ private EditText focusedEditText;
+ private boolean useOsmandKeyboard = true;
+ private int coordinateFormat = -1;
+ private List textFieldBoxes;
+ private ExtendedEditText nameEditText;
+ private List extendedLatLonEditTexts;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -36,6 +63,10 @@ public class CoordinateInputDialogFragment extends DialogFragment {
lightTheme = app.getSettings().OSMAND_THEME.get() == OsmandSettings.OSMAND_LIGHT_THEME;
int themeId = lightTheme ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme;
setStyle(STYLE_NO_FRAME, themeId);
+
+ CoordinateInputBottomSheetDialogFragment fragment = new CoordinateInputBottomSheetDialogFragment();
+ fragment.setListener(createCoordinateInputFormatChangeListener());
+ fragment.show(getMapActivity().getSupportFragmentManager(), CoordinateInputBottomSheetDialogFragment.TAG);
}
@Nullable
@@ -43,11 +74,14 @@ public class CoordinateInputDialogFragment extends DialogFragment {
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final View mainView = inflater.inflate(R.layout.fragment_coordinate_input_dialog, container);
final MapActivity mapActivity = getMapActivity();
+ final IconsCache ic = getMyApplication().getIconsCache();
+
+ Fragment coordinateInputBottomSheetDialogFragment = mapActivity.getSupportFragmentManager().findFragmentByTag(CoordinateInputBottomSheetDialogFragment.TAG);
+ if (coordinateInputBottomSheetDialogFragment != null) {
+ ((CoordinateInputBottomSheetDialogFragment) coordinateInputBottomSheetDialogFragment).setListener(createCoordinateInputFormatChangeListener());
+ }
Toolbar toolbar = (Toolbar) mainView.findViewById(R.id.coordinate_input_toolbar);
- if (!lightTheme) {
- toolbar.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.actionbar_dark_color));
- }
toolbar.setNavigationIcon(getMyApplication().getIconsCache().getIcon(R.drawable.ic_arrow_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@@ -60,51 +94,238 @@ public class CoordinateInputDialogFragment extends DialogFragment {
optionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
-
+ CoordinateInputBottomSheetDialogFragment fragment = new CoordinateInputBottomSheetDialogFragment();
+ Bundle args = new Bundle();
+ args.putInt(COORDINATE_FORMAT, coordinateFormat);
+ args.putBoolean(USE_OSMAND_KEYBOARD, useOsmandKeyboard);
+ fragment.setArguments(args);
+ fragment.setListener(createCoordinateInputFormatChangeListener());
+ fragment.show(getMapActivity().getSupportFragmentManager(), CoordinateInputBottomSheetDialogFragment.TAG);
}
});
- final EditText latitudeEditText = (EditText) mainView.findViewById(R.id.latitude_edit_text);
- final EditText longitudeEditText = (EditText) mainView.findViewById(R.id.longitude_edit_text);
- final EditText nameEditText = (EditText) mainView.findViewById(R.id.name_edit_text);
+ textFieldBoxes = new ArrayList<>();
+ final OsmandTextFieldBoxes latitudeBox = (OsmandTextFieldBoxes) mainView.findViewById(R.id.latitude_box);
+ textFieldBoxes.add(latitudeBox);
+ final OsmandTextFieldBoxes longitudeBox = (OsmandTextFieldBoxes) mainView.findViewById(R.id.longitude_box);
+ textFieldBoxes.add(longitudeBox);
+ final OsmandTextFieldBoxes nameBox = (OsmandTextFieldBoxes) mainView.findViewById(R.id.name_box);
+ textFieldBoxes.add(nameBox);
- View.OnTouchListener editTextOnTouchListener = new View.OnTouchListener() {
+ extendedLatLonEditTexts = new ArrayList<>();
+ final ExtendedEditText latitudeEditText = (ExtendedEditText) mainView.findViewById(R.id.latitude_edit_text);
+ extendedLatLonEditTexts.add(latitudeEditText);
+ final ExtendedEditText longitudeEditText = (ExtendedEditText) mainView.findViewById(R.id.longitude_edit_text);
+ extendedLatLonEditTexts.add(longitudeEditText);
+ nameEditText = (ExtendedEditText) mainView.findViewById(R.id.name_edit_text);
+
+ final View.OnFocusChangeListener focusChangeListener = new View.OnFocusChangeListener() {
@Override
- public boolean onTouch(View view, MotionEvent motionEvent) {
- EditText editText = null;
+ public void onFocusChange(View view, boolean b) {
+ ExtendedEditText editText = null;
+ OsmandTextFieldBoxes fieldBox = null;
switch (view.getId()) {
case R.id.latitude_edit_text:
editText = latitudeEditText;
+ fieldBox = latitudeBox;
break;
case R.id.longitude_edit_text:
editText = longitudeEditText;
+ fieldBox = longitudeBox;
break;
case R.id.name_edit_text:
editText = nameEditText;
+ fieldBox = nameBox;
break;
}
- if (editText != null) {
- editText.requestFocus();
+ if (fieldBox != null) {
+ if (b) {
+ fieldBox.setHasFocus(true);
+ focusedEditText = editText;
+ } else {
+ fieldBox.setHasFocus(false);
+ focusedEditText = null;
+ }
}
- return true;
}
};
- latitudeEditText.setOnTouchListener(editTextOnTouchListener);
- longitudeEditText.setOnTouchListener(editTextOnTouchListener);
- nameEditText.setOnTouchListener(editTextOnTouchListener);
+ TextWatcher textWatcher = new TextWatcher() {
+ int len = 0;
+
+ @Override
+ public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+ if (focusedEditText != null) {
+ String str = focusedEditText.getText().toString();
+ len = str.length();
+ }
+ }
+
+ @Override
+ public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable editable) {
+ if (focusedEditText != null && focusedEditText != nameEditText) {
+ String str = focusedEditText.getText().toString();
+ int strLength = str.length();
+ if (strLength == 2 && len < strLength) {
+ String strToAppend;
+ if (coordinateFormat == PointDescription.FORMAT_DEGREES) {
+ strToAppend = ".";
+ } else {
+ strToAppend = ":";
+ }
+ focusedEditText.append(strToAppend);
+ } else if (strLength == 5 && coordinateFormat != PointDescription.FORMAT_DEGREES && len < strLength) {
+ String strToAppend;
+ if (coordinateFormat == PointDescription.FORMAT_MINUTES) {
+ strToAppend = ".";
+ } else {
+ strToAppend = ":";
+ }
+ focusedEditText.append(strToAppend);
+ } else if (strLength == 8 && coordinateFormat == PointDescription.FORMAT_SECONDS && len < strLength) {
+ focusedEditText.append(".");
+ } else if ((strLength == DEGREES_MAX_LENGTH && coordinateFormat == PointDescription.FORMAT_DEGREES)
+ || (strLength == MINUTES_MAX_LENGTH && coordinateFormat == PointDescription.FORMAT_MINUTES)
+ || (strLength == SECONDS_MAX_LENGTH && coordinateFormat == PointDescription.FORMAT_SECONDS)) {
+ if (focusedEditText == latitudeEditText) {
+ longitudeBox.select();
+ } else {
+ nameBox.select();
+ }
+ }
+ }
+ }
+ };
+
+ latitudeEditText.setOnFocusChangeListener(focusChangeListener);
+ longitudeEditText.setOnFocusChangeListener(focusChangeListener);
+ nameEditText.setOnFocusChangeListener(focusChangeListener);
+
+ latitudeEditText.addTextChangedListener(textWatcher);
+ longitudeEditText.addTextChangedListener(textWatcher);
+ nameEditText.addTextChangedListener(textWatcher);
+
+ changeKeyboardInBoxes();
+ changeKeyboardInEditTexts();
+
+ View keyboardLayout = mainView.findViewById(R.id.keyboard_layout);
+ AndroidUtils.setBackground(mapActivity, keyboardLayout, !lightTheme, R.drawable.bg_bottom_menu_light, R.drawable.bg_bottom_menu_dark);
String[] keyboardItems = new String[] { "1", "2", "3",
"4", "5", "6",
"7", "8", "9",
getString(R.string.shared_string_delete), "0", getString(R.string.shared_string_clear) };
- GridView keyboardGrid = (GridView) mainView.findViewById(R.id.keyboard_grid_view);
- KeyboardAdapter keyboardAdapter = new KeyboardAdapter(mapActivity, keyboardItems);
+ final GridView keyboardGrid = (GridView) mainView.findViewById(R.id.keyboard_grid_view);
+ final KeyboardAdapter keyboardAdapter = new KeyboardAdapter(mapActivity, keyboardItems);
keyboardGrid.setAdapter(keyboardAdapter);
+ keyboardGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> adapterView, View view, int i, long l) {
+ if (focusedEditText != null) {
+ switch (i) {
+ case DELETE_BUTTON_POSITION:
+ String str = focusedEditText.getText().toString();
+ if (str.length() > 0) {
+ str = str.substring(0, str.length() - 1);
+ focusedEditText.setText(str);
+ }
+ break;
+ case CLEAR_BUTTON_POSITION:
+ focusedEditText.setText("");
+ break;
+ default:
+ focusedEditText.append(keyboardAdapter.getItem(i));
+ }
+ }
+ }
+ });
+
+ final ImageView showHideKeyBoardIcon = (ImageView) mainView.findViewById(R.id.show_hide_keyboard_icon);
+ final View keyboardDivider = mainView.findViewById(R.id.keyboard_divider);
+ showHideKeyBoardIcon.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_arrow_down));
+ showHideKeyBoardIcon.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ int keyboardVisibility = keyboardGrid.getVisibility();
+ if (keyboardVisibility == View.VISIBLE) {
+ keyboardGrid.setVisibility(View.GONE);
+ keyboardDivider.setVisibility(View.GONE);
+ showHideKeyBoardIcon.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_arrow_up));
+ } else {
+ keyboardGrid.setVisibility(View.VISIBLE);
+ keyboardDivider.setVisibility(View.VISIBLE);
+ showHideKeyBoardIcon.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_arrow_down));
+ }
+ }
+ });
return mainView;
}
+ @Override
+ public void onDestroyView() {
+ focusedEditText = null;
+ if (getDialog() != null && getRetainInstance()) {
+ getDialog().setDismissMessage(null);
+ }
+ super.onDestroyView();
+ }
+
+ private CoordinateInputBottomSheetDialogFragment.CoordinateInputFormatChangeListener createCoordinateInputFormatChangeListener() {
+ return new CoordinateInputBottomSheetDialogFragment.CoordinateInputFormatChangeListener() {
+ @Override
+ public void onCoordinateFormatChanged(int format) {
+ coordinateFormat = format;
+ changeEditTextLengths();
+ }
+
+ @Override
+ public void onKeyboardChanged(boolean useOsmandKeyboard) {
+ CoordinateInputDialogFragment.this.useOsmandKeyboard = useOsmandKeyboard;
+ changeKeyboardInBoxes();
+ changeKeyboardInEditTexts();
+ }
+
+ @Override
+ public void onCancel() {
+ dismiss();
+ }
+ };
+ }
+
+ private void changeEditTextLengths() {
+ int maxLength;
+ if (coordinateFormat == PointDescription.FORMAT_DEGREES) {
+ maxLength = DEGREES_MAX_LENGTH;
+ } else if (coordinateFormat == PointDescription.FORMAT_MINUTES) {
+ maxLength = MINUTES_MAX_LENGTH;
+ } else {
+ maxLength = SECONDS_MAX_LENGTH;
+ }
+ InputFilter[] filtersArray = new InputFilter[] {new InputFilter.LengthFilter(maxLength)};
+ for (ExtendedEditText extendedEditText : extendedLatLonEditTexts) {
+ extendedEditText.setFilters(filtersArray);
+ }
+ }
+
+ public void changeKeyboardInBoxes() {
+ for (OsmandTextFieldBoxes textFieldBox : textFieldBoxes) {
+ textFieldBox.setUseOsmandKeyboard(useOsmandKeyboard);
+ }
+ }
+
+ public void changeKeyboardInEditTexts() {
+ for (ExtendedEditText extendedEditText : extendedLatLonEditTexts) {
+ extendedEditText.setInputType(useOsmandKeyboard ? InputType.TYPE_NULL : InputType.TYPE_CLASS_TEXT);
+ }
+ nameEditText.setInputType(useOsmandKeyboard ? InputType.TYPE_NULL : InputType.TYPE_CLASS_TEXT);
+ }
+
private MapActivity getMapActivity() {
return (MapActivity) getActivity();
}
@@ -119,6 +340,7 @@ public class CoordinateInputDialogFragment extends DialogFragment {
return false;
}
CoordinateInputDialogFragment fragment = new CoordinateInputDialogFragment();
+ fragment.setRetainInstance(true);
fragment.show(mapActivity.getSupportFragmentManager(), TAG);
return true;
} catch (RuntimeException e) {
@@ -128,8 +350,8 @@ public class CoordinateInputDialogFragment extends DialogFragment {
private class KeyboardAdapter extends ArrayAdapter {
- KeyboardAdapter(@NonNull Context context, String[] items) {
- super(context, 0, items);
+ KeyboardAdapter(@NonNull Context context, @NonNull String[] objects) {
+ super(context, 0, objects);
}
@NonNull
@@ -138,8 +360,16 @@ public class CoordinateInputDialogFragment extends DialogFragment {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.input_coordinate_keyboard_item, parent, false);
}
+ convertView.setBackgroundResource(lightTheme ? R.drawable.keyboard_item_light_bg : R.drawable.keyboard_item_dark_bg);
- ((TextView) convertView.findViewById(R.id.keyboard_item)).setText(getItem(position));
+ TextViewEx keyboardItem = (TextViewEx) convertView.findViewById(R.id.keyboard_item);
+// if (position == DELETE_BUTTON_POSITION || position == CLEAR_BUTTON_POSITION) {
+// keyboardItem.setTextSize(getResources().getDimension(R.dimen.default_list_text_size));
+// } else {
+// keyboardItem.setTextSize(getResources().getDimension(R.dimen.map_button_text_size));
+// }
+
+ keyboardItem.setText(getItem(position));
return convertView;
}
diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java
index 490c78da22..c6a7a27b51 100644
--- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java
+++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java
@@ -21,7 +21,7 @@ import java.util.Random;
public class MapMarkersDbHelper {
- private static final int DB_VERSION = 9;
+ private static final int DB_VERSION = 10;
public static final String DB_NAME = "map_markers_db";
private static final String MARKERS_TABLE_NAME = "map_markers";
@@ -37,6 +37,7 @@ public class MapMarkersDbHelper {
private static final String MARKERS_COL_COLOR = "marker_color";
private static final String MARKERS_COL_NEXT_KEY = "marker_next_key";
private static final String MARKERS_COL_DISABLED = "marker_disabled";
+ private static final String MARKERS_COL_SELECTED = "marker_selected";
private static final String MARKERS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " +
MARKERS_TABLE_NAME + " (" +
@@ -51,7 +52,8 @@ public class MapMarkersDbHelper {
MARKERS_COL_GROUP_KEY + " TEXT, " +
MARKERS_COL_COLOR + " int, " +
MARKERS_COL_NEXT_KEY + " TEXT, " +
- MARKERS_COL_DISABLED + " int);";
+ MARKERS_COL_DISABLED + " int, " + // 1 = true, 0 = false
+ MARKERS_COL_SELECTED + " int);"; // 1 = true, 0 = false
private static final String MARKERS_TABLE_SELECT = "SELECT " +
MARKERS_COL_ID + ", " +
@@ -65,7 +67,8 @@ public class MapMarkersDbHelper {
MARKERS_COL_GROUP_KEY + ", " +
MARKERS_COL_COLOR + ", " +
MARKERS_COL_NEXT_KEY + ", " +
- MARKERS_COL_DISABLED +
+ MARKERS_COL_DISABLED + ", " +
+ MARKERS_COL_SELECTED +
" FROM " + MARKERS_TABLE_NAME;
private static final String GROUPS_TABLE_NAME = "map_markers_groups";
@@ -134,6 +137,12 @@ public class MapMarkersDbHelper {
" SET " + MARKERS_COL_DISABLED + " = ? " +
"WHERE " + MARKERS_COL_DISABLED + " IS NULL", new Object[]{0});
}
+ if (oldVersion < 10) {
+ db.execSQL("ALTER TABLE " + MARKERS_TABLE_NAME + " ADD " + MARKERS_COL_SELECTED + " int");
+ db.execSQL("UPDATE " + MARKERS_TABLE_NAME +
+ " SET" + MARKERS_COL_SELECTED + " = ? " +
+ "WHERE " + MARKERS_COL_SELECTED + " IS NULL", new Object[]{0});
+ }
}
private void saveExistingMarkersToDb() {
@@ -319,10 +328,10 @@ public class MapMarkersDbHelper {
"WHERE " + MARKERS_COL_NEXT_KEY + " = ?", new Object[]{marker.id, TAIL_NEXT_VALUE});
}
- db.execSQL("INSERT INTO " + MARKERS_TABLE_NAME + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
+ db.execSQL("INSERT INTO " + MARKERS_TABLE_NAME + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
new Object[]{marker.id, marker.getLatitude(), marker.getLongitude(), descr, active,
currentTime, visited, marker.groupName, marker.groupKey, marker.colorIndex,
- marker.history ? HISTORY_NEXT_VALUE : TAIL_NEXT_VALUE, 0});
+ marker.history ? HISTORY_NEXT_VALUE : TAIL_NEXT_VALUE, 0, 0});
}
public List getMarkersFromGroup(MarkersSyncGroup group) {
@@ -398,6 +407,7 @@ public class MapMarkersDbHelper {
String groupKey = query.getString(8);
int colorIndex = query.getInt(9);
String nextKey = query.getString(10);
+ boolean selected = query.getInt(12) == 1;
LatLon latLon = new LatLon(lat, lon);
MapMarker marker = new MapMarker(latLon, PointDescription.deserializeFromString(desc, latLon),
@@ -409,6 +419,7 @@ public class MapMarkersDbHelper {
marker.groupName = groupName;
marker.groupKey = groupKey;
marker.nextKey = nextKey;
+ marker.selected = selected;
return marker;
}
@@ -437,9 +448,10 @@ public class MapMarkersDbHelper {
MARKERS_COL_LAT + " = ?, " +
MARKERS_COL_LON + " = ?, " +
MARKERS_COL_DESCRIPTION + " = ?, " +
- MARKERS_COL_COLOR + " = ? " +
+ MARKERS_COL_COLOR + " = ?, " +
+ MARKERS_COL_SELECTED + " = ? " +
"WHERE " + MARKERS_COL_ID + " = ?",
- new Object[]{marker.getLatitude(), marker.getLongitude(), descr, marker.colorIndex, marker.id});
+ new Object[]{marker.getLatitude(), marker.getLongitude(), descr, marker.colorIndex, marker.selected, marker.id});
} finally {
db.close();
}
diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java
index e571d25b4a..dd5c0206ed 100644
--- a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java
+++ b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java
@@ -1,6 +1,7 @@
package net.osmand.plus.mapmarkers;
import android.graphics.drawable.Drawable;
+import android.os.Build;
import android.os.Bundle;
import android.support.annotation.DrawableRes;
import android.support.annotation.Nullable;
@@ -14,6 +15,7 @@ import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
@@ -22,11 +24,14 @@ import android.widget.Toast;
import net.osmand.AndroidUtils;
import net.osmand.Location;
import net.osmand.data.LatLon;
+import net.osmand.data.RotatedTileBox;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.IconsCache;
import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.MapMarkersHelper.MapMarker;
+import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
+import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.MapViewTrackingUtilities;
@@ -40,9 +45,11 @@ import net.osmand.plus.views.MapMarkersLayer;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory;
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController;
+import net.osmand.util.MapUtils;
+
+import java.util.List;
import static net.osmand.plus.OsmandSettings.LANDSCAPE_MIDDLE_RIGHT_CONSTANT;
-import static net.osmand.plus.OsmandSettings.MIDDLE_TOP_CONSTANT;
public class PlanRouteFragment extends Fragment implements OsmAndLocationListener {
@@ -56,6 +63,8 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
private int previousMapPosition;
private int selectedCount = 0;
+ private int toolbarHeight;
+
private Location location;
private boolean locationUpdateStarted;
@@ -69,6 +78,7 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
private ImageView upDownIconIv;
private TextView distanceTv;
private TextView timeTv;
+ private TextView countTv;
@Nullable
@Override
@@ -88,6 +98,8 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
hideMarkersListFragment();
}
+ toolbarHeight = mapActivity.getResources().getDimensionPixelSize(R.dimen.dashboard_map_toolbar);
+
iconsCache = mapActivity.getMyApplication().getIconsCache();
nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls();
final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
@@ -102,6 +114,7 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
distanceTv = (TextView) mainView.findViewById(R.id.markers_distance_text_view);
timeTv = (TextView) mainView.findViewById(R.id.markers_time_text_view);
+ countTv = (TextView) mainView.findViewById(R.id.markers_count_text_view);
enterPlanRouteMode();
@@ -129,15 +142,20 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
@Override
public void onClick(View view) {
int activeMarkersCount = markersHelper.getMapMarkers().size();
- if (selectedCount == activeMarkersCount) {
+ if (selectedCount == activeMarkersCount && markersHelper.isStartFromMyLocation()) {
markersHelper.deselectAllActiveMarkers();
+ markersHelper.setStartFromMyLocation(false);
selectedCount = 0;
} else {
markersHelper.selectAllActiveMarkers();
+ markersHelper.setStartFromMyLocation(true);
selectedCount = activeMarkersCount;
}
adapter.notifyDataSetChanged();
+ updateText();
updateSelectButton();
+ showMarkersRouteOnMap();
+ mapActivity.refreshMap();
}
});
@@ -161,7 +179,9 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
toolbarController.setOnBackButtonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- quit(false);
+ if (quit(false)) {
+ MapMarkersDialogFragment.showInstance(mapActivity);
+ }
}
});
mapActivity.showTopToolbar(toolbarController);
@@ -183,11 +203,18 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
@Override
public void onItemClick(View view) {
int pos = markersRv.getChildAdapterPosition(view);
- MapMarker marker = adapter.getItem(pos);
- selectedCount = marker.selected ? selectedCount - 1 : selectedCount + 1;
- marker.selected = !marker.selected;
+ if (pos == 0) {
+ markersHelper.setStartFromMyLocation(!mapActivity.getMyApplication().getSettings().ROUTE_MAP_MARKERS_START_MY_LOC.get());
+ } else {
+ MapMarker marker = adapter.getItem(pos);
+ selectedCount = marker.selected ? selectedCount - 1 : selectedCount + 1;
+ marker.selected = !marker.selected;
+ markersHelper.updateMapMarker(marker, false);
+ }
adapter.notifyItemChanged(pos);
updateSelectButton();
+ updateText();
+ showMarkersRouteOnMap();
}
@Override
@@ -201,7 +228,14 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
toPosition = holder.getAdapterPosition();
if (toPosition >= 0 && fromPosition >= 0 && toPosition != fromPosition) {
mapActivity.getMyApplication().getMapMarkersHelper().checkAndFixActiveMarkersOrderIfNeeded();
- adapter.notifyDataSetChanged();
+ mapActivity.getMyApplication().getSettings().MAP_MARKERS_ORDER_BY_MODE.set(OsmandSettings.MapMarkersOrderByMode.CUSTOM);
+ mapActivity.refreshMap();
+ try {
+ adapter.notifyDataSetChanged();
+ } catch (Exception e) {
+ // to avoid crash because of:
+ // java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
+ }
}
}
});
@@ -211,6 +245,34 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
markersRv.setLayoutManager(new LinearLayoutManager(getContext()));
markersRv.setAdapter(adapter);
+ final int screenH = AndroidUtils.getScreenHeight(mapActivity);
+ final int statusBarH = AndroidUtils.getStatusBarHeight(mapActivity);
+ final int navBarH = AndroidUtils.getNavBarHeight(mapActivity);
+ final int availableHeight = (screenH - statusBarH - navBarH) / 2;
+
+ mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ if (portrait) {
+ int upDownRowH = mainView.findViewById(R.id.up_down_row).getHeight();
+ int buttonsRowH = mainView.findViewById(R.id.buttons_row).getHeight();
+ int listContainerH = availableHeight - upDownRowH - buttonsRowH;
+ View listContainer = mainView.findViewById(R.id.markers_list_container);
+ listContainer.getLayoutParams().height = listContainerH;
+ listContainer.requestLayout();
+ }
+
+ showMarkersList();
+
+ ViewTreeObserver obs = mainView.getViewTreeObserver();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ obs.removeOnGlobalLayoutListener(this);
+ } else {
+ obs.removeGlobalOnLayoutListener(this);
+ }
+ }
+ });
+
return view;
}
@@ -278,6 +340,7 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
public void onApplicationModeItemClick(ApplicationMode mode) {
appMode = mode;
setupAppModesBtn();
+ updateText();
}
};
}
@@ -310,10 +373,11 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
}
if (appMode == null) {
- appMode = mapActivity.getMyApplication().getSettings().getApplicationMode();
+ appMode = ApplicationMode.DEFAULT;
}
setupAppModesBtn();
+ showMarkersRouteOnMap();
mapActivity.refreshMap();
updateText();
updateSelectButton();
@@ -331,6 +395,7 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
public void onClick(View view) {
SnapToRoadBottomSheetDialogFragment fragment = new SnapToRoadBottomSheetDialogFragment();
fragment.setListener(createSnapToRoadFragmentListener());
+ fragment.setRemoveDefaultMode(false);
fragment.show(mapActivity.getSupportFragmentManager(), SnapToRoadBottomSheetDialogFragment.TAG);
}
});
@@ -367,24 +432,50 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
mapActivity.findViewById(R.id.snap_to_road_image_button).setVisibility(View.GONE);
mainView.findViewById(R.id.snap_to_road_progress_bar).setVisibility(View.GONE);
+ markersLayer.clearRoute();
mapActivity.refreshMap();
}
}
private void updateText() {
- distanceTv.setText("1.39 km,");
- timeTv.setText("~ 45 min.");
+ MapActivity mapActivity = getMapActivity();
+ if (mapActivity != null) {
+ boolean defaultMode = appMode.getStringKey().equals(ApplicationMode.DEFAULT.getStringKey());
+
+ float dist = 0;
+ Location myLoc = mapActivity.getMyApplication().getLocationProvider().getLastStaleKnownLocation();
+ boolean useLocation = myLoc != null && mapActivity.getMyApplication().getSettings().ROUTE_MAP_MARKERS_START_MY_LOC.get();
+ List markers = markersHelper.getSelectedMarkersLatLon();
+ if (useLocation ? markers.size() > 0 : markers.size() > 1) {
+ if (useLocation) {
+ dist += MapUtils.getDistance(myLoc.getLatitude(), myLoc.getLongitude(),
+ markers.get(0).getLatitude(), markers.get(0).getLongitude());
+ }
+ for (int i = 1; i < markers.size(); i++) {
+ dist += MapUtils.getDistance(markers.get(i - 1), markers.get(i));
+ }
+ }
+ distanceTv.setText(OsmAndFormatter.getFormattedDistance(dist, mapActivity.getMyApplication()) + (defaultMode ? "" : ","));
+
+ if (defaultMode) {
+ timeTv.setText("");
+ } else {
+ int seconds = (int) (dist / appMode.getDefaultSpeed());
+ timeTv.setText("~ " + OsmAndFormatter.getFormattedDuration(seconds, mapActivity.getMyApplication()));
+ }
+
+ countTv.setText(mapActivity.getString(R.string.shared_string_markers) + ": " + selectedCount);
+ }
}
private void updateSelectButton() {
- if (selectedCount == markersHelper.getMapMarkers().size()) {
+ if (selectedCount == markersHelper.getMapMarkers().size() && markersHelper.isStartFromMyLocation()) {
((TextView) mainView.findViewById(R.id.select_all_button)).setText(getString(R.string.shared_string_deselect_all));
} else {
((TextView) mainView.findViewById(R.id.select_all_button)).setText(getString(R.string.shared_string_select_all));
}
}
-
private void updateLocationUi() {
final MapActivity mapActivity = (MapActivity) getActivity();
if (mapActivity != null && adapter != null) {
@@ -422,7 +513,6 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
MapMarkersLayer markersLayer = getMapMarkersLayer();
if (mapActivity != null && markersLayer != null) {
markersListOpened = true;
- markersLayer.setMarkersListOpened(true);
upDownIconIv.setImageDrawable(getContentIcon(R.drawable.ic_action_arrow_down));
View listContainer = mainView.findViewById(R.id.markers_list_container);
if (portrait && listContainer != null) {
@@ -432,9 +522,7 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
}
OsmandMapTileView tileView = mapActivity.getMapView();
previousMapPosition = tileView.getMapPosition();
- if (portrait) {
- tileView.setMapPosition(MIDDLE_TOP_CONSTANT);
- } else {
+ if (!portrait) {
tileView.setMapPosition(LANDSCAPE_MIDDLE_RIGHT_CONSTANT);
}
mapActivity.refreshMap();
@@ -446,7 +534,6 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
MapMarkersLayer markersLayer = getMapMarkersLayer();
if (mapActivity != null && markersLayer != null) {
markersListOpened = false;
- markersLayer.setMarkersListOpened(false);
upDownIconIv.setImageDrawable(getContentIcon(R.drawable.ic_action_arrow_up));
View listContainer = mainView.findViewById(R.id.markers_list_container);
if (portrait && listContainer != null) {
@@ -506,6 +593,55 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
}
}
+ private void showMarkersRouteOnMap() {
+ MapActivity mapActivity = getMapActivity();
+ if (mapActivity != null) {
+ List points = markersHelper.getSelectedMarkersLatLon();
+ mapActivity.getMapLayers().getMapMarkersLayer().setRoute(points);
+ showRouteOnMap(points);
+ }
+ }
+
+ private void showRouteOnMap(List points) {
+ MapActivity mapActivity = getMapActivity();
+ if (points.size() > 0 && mapActivity != null) {
+ OsmandMapTileView mapView = mapActivity.getMapView();
+ double left = 0, right = 0;
+ double top = 0, bottom = 0;
+ Location myLocation = mapActivity.getMyApplication().getLocationProvider().getLastStaleKnownLocation();
+ if (mapActivity.getMyApplication().getMapMarkersHelper().isStartFromMyLocation() && myLocation != null) {
+ left = myLocation.getLongitude();
+ right = myLocation.getLongitude();
+ top = myLocation.getLatitude();
+ bottom = myLocation.getLatitude();
+ }
+ for (LatLon l : points) {
+ if (left == 0) {
+ left = l.getLongitude();
+ right = l.getLongitude();
+ top = l.getLatitude();
+ bottom = l.getLatitude();
+ } else {
+ left = Math.min(left, l.getLongitude());
+ right = Math.max(right, l.getLongitude());
+ top = Math.max(top, l.getLatitude());
+ bottom = Math.min(bottom, l.getLatitude());
+ }
+ }
+
+ RotatedTileBox tb = mapView.getCurrentRotatedTileBox().copy();
+ int tileBoxWidthPx = 0;
+ int tileBoxHeightPx = 0;
+
+ if (portrait) {
+ tileBoxHeightPx = 3 * (tb.getPixHeight() - mainView.getHeight() - toolbarHeight) / 4;
+ } else {
+ tileBoxWidthPx = tb.getPixWidth() - mainView.findViewById(R.id.up_down_row).getWidth();
+ }
+ mapView.fitRectToMap(left, right, top, bottom, tileBoxWidthPx, tileBoxHeightPx, toolbarHeight * 3 / 2);
+ }
+ }
+
public boolean quit(boolean hideMarkersListFirst) {
if (markersListOpened && hideMarkersListFirst) {
hideMarkersList();
@@ -520,7 +656,6 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene
if (markersListOpened) {
hideMarkersList();
}
- markersHelper.deselectAllActiveMarkers();
activity.getSupportFragmentManager().beginTransaction().remove(this).commitAllowingStateLoss();
}
diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersGroupsAdapter.java b/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersGroupsAdapter.java
index 017e820089..ee065546e5 100644
--- a/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersGroupsAdapter.java
+++ b/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersGroupsAdapter.java
@@ -281,7 +281,7 @@ public class MapMarkersGroupsAdapter extends RecyclerView.Adapter 1) {
+ month = Character.toUpperCase(month.charAt(0)) + month.substring(1);
+ }
+ String day = new SimpleDateFormat("dd", Locale.getDefault()).format(date);
+ descr = month + " " + day;
}
- } else {
- Date date = new Date(marker.creationDate);
- String month = new SimpleDateFormat("MMM", Locale.getDefault()).format(date);
- if (month.length() > 1) {
- month = Character.toUpperCase(month.charAt(0)) + month.substring(1);
- }
- String day = new SimpleDateFormat("dd", Locale.getDefault()).format(date);
- descr = month + " " + day;
- }
- holder.description.setText(descr);
+ holder.description.setText(descr);
- if (location != null) {
- holder.distance.setTextColor(ContextCompat.getColor(mapActivity, useCenter
- ? R.color.color_distance : R.color.color_myloc_distance));
- float dist = (float) MapUtils.getDistance(location.getLatitude(), location.getLongitude(),
- marker.getLatitude(), marker.getLongitude());
- holder.distance.setText(OsmAndFormatter.getFormattedDistance(dist, mapActivity.getMyApplication()));
+ if (location != null) {
+ holder.distance.setVisibility(View.VISIBLE);
+ holder.distance.setTextColor(ContextCompat.getColor(mapActivity, useCenter
+ ? R.color.color_distance : R.color.color_myloc_distance));
+ float dist = (float) MapUtils.getDistance(location.getLatitude(), location.getLongitude(),
+ marker.getLatitude(), marker.getLongitude());
+ holder.distance.setText(OsmAndFormatter.getFormattedDistance(dist, mapActivity.getMyApplication()));
+ }
}
}
@Override
public int getItemCount() {
- return markers.size();
+ return markers.size() + 1;
}
public MapMarker getItem(int position) {
- return markers.get(position);
+ return markers.get(position - 1);
}
@Override
@@ -160,7 +168,10 @@ public class MapMarkersListAdapter extends RecyclerView.Adapter modes = new ArrayList<>(ApplicationMode.values(settings));
- modes.remove(ApplicationMode.DEFAULT);
+ if (removeDefaultMode) {
+ modes.remove(ApplicationMode.DEFAULT);
+ }
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
diff --git a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java
index 4565e7c740..c605af3095 100644
--- a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java
@@ -727,8 +727,8 @@ public class MapControlsLayer extends OsmandMapLayer {
routePlanningBtn.updateVisibility(showButtons);
menuControl.updateVisibility(showButtons);
- mapZoomIn.updateVisibility(!routeDialogOpened && !isInExpandedRouteMode());
- mapZoomOut.updateVisibility(!routeDialogOpened && !isInExpandedRouteMode());
+ mapZoomIn.updateVisibility(!routeDialogOpened);
+ mapZoomOut.updateVisibility(!routeDialogOpened);
compassHud.updateVisibility(!routeDialogOpened && !trackDialogOpened && shouldShowCompass()
&& !isInMeasurementToolMode() && !isInPlanRouteMode());
@@ -814,7 +814,7 @@ public class MapControlsLayer extends OsmandMapLayer {
backToLocationControl.iv.setContentDescription(mapActivity.getString(R.string.map_widget_back_to_loc));
}
boolean visible = !(tracked && rh.isFollowingMode());
- backToLocationControl.updateVisibility(visible && !dialogOpened && !isInExpandedRouteMode());
+ backToLocationControl.updateVisibility(visible && !dialogOpened);
if (app.accessibilityEnabled()) {
backToLocationControl.iv.setClickable(enabled && visible);
}
@@ -1136,10 +1136,6 @@ public class MapControlsLayer extends OsmandMapLayer {
return mapActivity.getMapLayers().getMapMarkersLayer().isInPlanRouteMode();
}
- private boolean isInExpandedRouteMode() {
- return mapActivity.getMapLayers().getMapMarkersLayer().isMarkersListOpened();
- }
-
public static View.OnLongClickListener getOnClickMagnifierListener(final OsmandMapTileView view) {
return new View.OnLongClickListener() {
diff --git a/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java b/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java
index 15cdc2ec9c..d4132bc769 100644
--- a/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java
@@ -69,7 +69,7 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
private float[] calculations = new float[2];
private final RenderingLineAttributes lineAttrs = new RenderingLineAttributes("measureDistanceLine");
- private final RenderingLineAttributes textAttrs = new RenderingLineAttributes("rulerCircle");
+ private final RenderingLineAttributes textAttrs = new RenderingLineAttributes("rulerLineFont");
private Paint paint;
private Path path;
private List route = new ArrayList<>();
@@ -77,12 +77,10 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
private TIntArrayList tx = new TIntArrayList();
private TIntArrayList ty = new TIntArrayList();
private Path linePath = new Path();
- private String distanceText;
private ContextMenuLayer contextMenuLayer;
private boolean inPlanRouteMode;
- private boolean markersListOpened;
public MapMarkersLayer(MapActivity map) {
this.map = map;
@@ -100,14 +98,6 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
this.inPlanRouteMode = inPlanRouteMode;
}
- public boolean isMarkersListOpened() {
- return inPlanRouteMode && markersListOpened;
- }
-
- public void setMarkersListOpened(boolean markersListOpened) {
- this.markersListOpened = markersListOpened;
- }
-
private void initUI() {
bitmapPaint = new Paint();
bitmapPaint.setDither(true);
@@ -141,8 +131,8 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
paint.setAlpha(200);
float textSize = TEXT_SIZE * map.getResources().getDisplayMetrics().density;
+ textAttrs.paint.setTextSize(textSize);
textAttrs.paint2.setTextSize(textSize);
- textAttrs.paint3.setTextSize(textSize);
widgetsFactory = new MapMarkersWidgetsFactory(map);
@@ -219,25 +209,18 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
}
@Override
- public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode) {
-
- Location myLoc = map.getMyApplication().getLocationProvider().getLastStaleKnownLocation();
- widgetsFactory.updateInfo(myLoc == null
- ? tileBox.getCenterLatLon() : new LatLon(myLoc.getLatitude(), myLoc.getLongitude()), tileBox.getZoom());
+ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode) {
OsmandSettings settings = map.getMyApplication().getSettings();
-
- if (tileBox.getZoom() < 3 || !settings.USE_MAP_MARKERS.get()) {
- return;
- }
-
+ Location myLoc = map.getMyApplication().getLocationProvider().getLastStaleKnownLocation();
MapMarkersHelper markersHelper = map.getMyApplication().getMapMarkersHelper();
+ List activeMapMarkers = markersHelper.getMapMarkers();
+
if (route.size() > 0) {
path.reset();
boolean first = true;
- Location myLocation = map.getMapViewTrackingUtilities().getMyLocation();
- if (markersHelper.isStartFromMyLocation() && myLocation != null) {
- int locationX = tileBox.getPixXFromLonNoRot(myLocation.getLongitude());
- int locationY = tileBox.getPixYFromLatNoRot(myLocation.getLatitude());
+ if (markersHelper.isStartFromMyLocation() && myLoc != null) {
+ int locationX = tileBox.getPixXFromLonNoRot(myLoc.getLongitude());
+ int locationY = tileBox.getPixYFromLatNoRot(myLoc.getLatitude());
path.moveTo(locationX, locationY);
first = false;
}
@@ -254,12 +237,10 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
canvas.drawPath(path, paint);
}
- List activeMapMarkers = markersHelper.getMapMarkers();
-
if (settings.SHOW_LINES_TO_FIRST_MARKERS.get() && myLoc != null) {
lineAttrs.updatePaints(view, nightMode, tileBox);
textAttrs.updatePaints(view, nightMode, tileBox);
- textAttrs.paint2.setStyle(Paint.Style.FILL);
+ textAttrs.paint.setStyle(Paint.Style.FILL);
int locX = (int) tileBox.getPixXFromLatLon(myLoc.getLatitude(), myLoc.getLongitude());
int locY = (int) tileBox.getPixYFromLatLon(myLoc.getLatitude(), myLoc.getLongitude());
@@ -286,6 +267,7 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
float generalDist = (float) MapUtils.getDistance(myLoc.getLatitude(), myLoc.getLongitude(), marker.getLatitude(), marker.getLongitude());
String generalDistSt = OsmAndFormatter.getFormattedDistance(generalDist, view.getApplication());
boolean locationInvisible = locX < 0 || locX > tileBox.getPixWidth() || locY < 0 || locY > tileBox.getPixHeight();
+ String distanceText;
if (locationInvisible) {
float centerToMarkerDist = (float) MapUtils.getDistance(tileBox.getLatLonFromPixel(pos[0], pos[1]), marker.getLatitude(), marker.getLongitude());
String centerToMarkerDistSt = OsmAndFormatter.getFormattedDistance(centerToMarkerDist, view.getApplication());
@@ -298,7 +280,7 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
distanceText = generalDistSt;
}
Rect bounds = new Rect();
- textAttrs.paint2.getTextBounds(distanceText, 0, distanceText.length(), bounds);
+ textAttrs.paint.getTextBounds(distanceText, 0, distanceText.length(), bounds);
float hOffset = pm.getLength() / 2 - bounds.width() / 2;
lineAttrs.paint.setColor(colors[marker.colorIndex]);
@@ -309,18 +291,32 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
}
if (locX >= markerX) {
canvas.rotate(180, pos[0], pos[1]);
- canvas.drawTextOnPath(distanceText, linePath, hOffset, bounds.height() + VERTICAL_OFFSET, textAttrs.paint3);
canvas.drawTextOnPath(distanceText, linePath, hOffset, bounds.height() + VERTICAL_OFFSET, textAttrs.paint2);
+ canvas.drawTextOnPath(distanceText, linePath, hOffset, bounds.height() + VERTICAL_OFFSET, textAttrs.paint);
canvas.rotate(-180, pos[0], pos[1]);
} else {
- canvas.drawTextOnPath(distanceText, linePath, hOffset, -VERTICAL_OFFSET, textAttrs.paint3);
canvas.drawTextOnPath(distanceText, linePath, hOffset, -VERTICAL_OFFSET, textAttrs.paint2);
+ canvas.drawTextOnPath(distanceText, linePath, hOffset, -VERTICAL_OFFSET, textAttrs.paint);
}
canvas.rotate(tileBox.getRotate(), tileBox.getCenterPixelX(), tileBox.getCenterPixelY());
}
}
+ }
- for (MapMarker marker : activeMapMarkers) {
+ @Override
+ public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode) {
+ Location myLoc = map.getMyApplication().getLocationProvider().getLastStaleKnownLocation();
+ widgetsFactory.updateInfo(myLoc == null
+ ? tileBox.getCenterLatLon() : new LatLon(myLoc.getLatitude(), myLoc.getLongitude()), tileBox.getZoom());
+ OsmandSettings settings = map.getMyApplication().getSettings();
+
+ if (tileBox.getZoom() < 3 || !settings.USE_MAP_MARKERS.get()) {
+ return;
+ }
+
+ MapMarkersHelper markersHelper = map.getMyApplication().getMapMarkersHelper();
+
+ for (MapMarker marker : markersHelper.getMapMarkers()) {
if (isLocationVisible(tileBox, marker) && !overlappedByWaypoint(marker)
&& !isInMotion(marker)) {
Bitmap bmp = getMapMarkerBitmap(marker.colorIndex);
@@ -336,9 +332,8 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
if (settings.SHOW_ARROWS_TO_FIRST_MARKERS.get()) {
LatLon loc = tileBox.getCenterLatLon();
- List mapMarkers = markersHelper.getMapMarkers();
int i = 0;
- for (MapMarker marker : mapMarkers) {
+ for (MapMarker marker : markersHelper.getMapMarkers()) {
if (!isLocationVisible(tileBox, marker) && !isInMotion(marker)) {
canvas.save();
net.osmand.Location.distanceBetween(loc.getLatitude(), loc.getLongitude(),
@@ -414,12 +409,12 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
@Override
public boolean disableSingleTap() {
- return false;
+ return inPlanRouteMode;
}
@Override
public boolean disableLongPressOnMap() {
- return false;
+ return inPlanRouteMode;
}
@Override
diff --git a/OsmAnd/src/net/osmand/plus/views/MapQuickActionLayer.java b/OsmAnd/src/net/osmand/plus/views/MapQuickActionLayer.java
index f5129c680a..f08e20539a 100644
--- a/OsmAnd/src/net/osmand/plus/views/MapQuickActionLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/MapQuickActionLayer.java
@@ -41,6 +41,7 @@ public class MapQuickActionLayer extends OsmandMapLayer implements QuickActionRe
private final ContextMenuLayer contextMenuLayer;
private final MeasurementToolLayer measurementToolLayer;
+ private final MapMarkersLayer mapMarkersLayer;
private ImageView contextMarker;
private final MapActivity mapActivity;
private final OsmandApplication app;
@@ -66,6 +67,7 @@ public class MapQuickActionLayer extends OsmandMapLayer implements QuickActionRe
settings = activity.getMyApplication().getSettings();
quickActionRegistry = activity.getMapLayers().getQuickActionRegistry();
measurementToolLayer = mapActivity.getMapLayers().getMeasurementToolLayer();
+ mapMarkersLayer = mapActivity.getMapLayers().getMapMarkersLayer();
}
@@ -323,6 +325,7 @@ public class MapQuickActionLayer extends OsmandMapLayer implements QuickActionRe
contextMenuLayer.isInChangeMarkerPositionMode() ||
contextMenuLayer.isInGpxDetailsMode() ||
measurementToolLayer.isInMeasurementMode() ||
+ mapMarkersLayer.isInPlanRouteMode() ||
mapActivity.getContextMenu().isVisible() && !mapActivity.getContextMenu().findMenuFragment().get().isRemoving() ||
mapActivity.getContextMenu().isVisible() && mapActivity.getContextMenu().findMenuFragment().get().isAdded() ||
mapActivity.getContextMenu().getMultiSelectionMenu().isVisible() && mapActivity.getContextMenu().getMultiSelectionMenu().getFragmentByTag().isAdded() ||
diff --git a/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java b/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java
index d605728a18..583d5d42db 100644
--- a/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java
@@ -76,10 +76,9 @@ public class RulerControlLayer extends OsmandMapLayer {
private Bitmap centerIconNight;
private Paint bitmapPaint;
private RenderingLineAttributes lineAttrs;
+ private RenderingLineAttributes lineFontAttrs;
private RenderingLineAttributes circleAttrs;
private RenderingLineAttributes circleAttrsAlt;
- private float circleTextSize;
- private float lineTextSize;
private Handler handler;
@@ -122,8 +121,12 @@ public class RulerControlLayer extends OsmandMapLayer {
lineAttrs = new RenderingLineAttributes("rulerLine");
- circleTextSize = TEXT_SIZE * mapActivity.getResources().getDisplayMetrics().density;
- lineTextSize = DISTANCE_TEXT_SIZE * mapActivity.getResources().getDisplayMetrics().density;
+ float circleTextSize = TEXT_SIZE * mapActivity.getResources().getDisplayMetrics().density;
+ float lineTextSize = DISTANCE_TEXT_SIZE * mapActivity.getResources().getDisplayMetrics().density;
+
+ lineFontAttrs = new RenderingLineAttributes("rulerLineFont");
+ lineFontAttrs.paint.setTextSize(lineTextSize);
+ lineFontAttrs.paint2.setTextSize(lineTextSize);
circleAttrs = new RenderingLineAttributes("rulerCircle");
circleAttrs.paint2.setTextSize(circleTextSize);
@@ -179,6 +182,8 @@ public class RulerControlLayer extends OsmandMapLayer {
public void onDraw(Canvas canvas, RotatedTileBox tb, DrawSettings settings) {
if (rulerModeOn()) {
lineAttrs.updatePaints(view, settings, tb);
+ lineFontAttrs.updatePaints(view, settings, tb);
+ lineFontAttrs.paint.setStyle(Style.FILL);
circleAttrs.updatePaints(view, settings, tb);
circleAttrs.paint2.setStyle(Style.FILL);
circleAttrsAlt.updatePaints(view, settings, tb);
@@ -221,14 +226,7 @@ public class RulerControlLayer extends OsmandMapLayer {
}
if (mode == RulerMode.FIRST || mode == RulerMode.SECOND) {
updateData(tb, center);
- RenderingLineAttributes attrs;
- if (mode == RulerMode.FIRST) {
- circleAttrs.paint2.setTextSize(circleTextSize);
- circleAttrs.paint3.setTextSize(circleTextSize);
- attrs = circleAttrs;
- } else {
- attrs = circleAttrsAlt;
- }
+ RenderingLineAttributes attrs = mode == RulerMode.FIRST ? circleAttrs : circleAttrsAlt;
for (int i = 1; i <= cacheDistances.size(); i++) {
drawCircle(canvas, tb, i, center, attrs);
}
@@ -268,22 +266,19 @@ public class RulerControlLayer extends OsmandMapLayer {
private void drawTextOnCenterOfPath(Canvas canvas, float x1, float x2, Path path, String text) {
PathMeasure pm = new PathMeasure(path, false);
Rect bounds = new Rect();
- circleAttrs.paint2.getTextBounds(text, 0, text.length(), bounds);
+ lineFontAttrs.paint.getTextBounds(text, 0, text.length(), bounds);
float hOffset = pm.getLength() / 2 - bounds.width() / 2;
- circleAttrs.paint2.setTextSize(lineTextSize);
- circleAttrs.paint3.setTextSize(lineTextSize);
-
if (x1 >= x2) {
float[] pos = new float[2];
pm.getPosTan(pm.getLength() / 2, pos, null);
canvas.rotate(180, pos[0], pos[1]);
- canvas.drawTextOnPath(text, path, hOffset, bounds.height() + VERTICAL_OFFSET, circleAttrs.paint3);
- canvas.drawTextOnPath(text, path, hOffset, bounds.height() + VERTICAL_OFFSET, circleAttrs.paint2);
+ canvas.drawTextOnPath(text, path, hOffset, bounds.height() + VERTICAL_OFFSET, lineFontAttrs.paint2);
+ canvas.drawTextOnPath(text, path, hOffset, bounds.height() + VERTICAL_OFFSET, lineFontAttrs.paint);
canvas.rotate(-180, pos[0], pos[1]);
} else {
- canvas.drawTextOnPath(text, path, hOffset, -VERTICAL_OFFSET, circleAttrs.paint3);
- canvas.drawTextOnPath(text, path, hOffset, -VERTICAL_OFFSET, circleAttrs.paint2);
+ canvas.drawTextOnPath(text, path, hOffset, -VERTICAL_OFFSET, lineFontAttrs.paint2);
+ canvas.drawTextOnPath(text, path, hOffset, -VERTICAL_OFFSET, lineFontAttrs.paint);
}
}