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); } }