Merge branch 'master' into WikipediaSearchBanner

This commit is contained in:
vshcherb 2020-07-03 23:18:36 +02:00 committed by GitHub
commit 69958481aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
39 changed files with 443 additions and 220 deletions

View file

@ -41,13 +41,14 @@ public class GeneralRouter implements VehicleRouter {
public static final String VEHICLE_HEIGHT = "height";
public static final String VEHICLE_WEIGHT = "weight";
public static final String VEHICLE_WIDTH = "width";
public static final String VEHICLE_LENGTH = "length";
private static boolean USE_CACHE = true;
public static long TIMER = 0;
private final RouteAttributeContext[] objectAttributes;
public final Map<String, String> attributes;
private final Map<String, RoutingParameter> parameters;
private final Map<String, RoutingParameter> parameters;
private final Map<String, Integer> universalRules;
private final List<String> universalRulesById;
private final Map<String, BitSet> tagRuleMask;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View file

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M20,8H17.19C16.74,7.22 16.12,6.55 15.37,6.04L17,4.41L15.59,3L13.42,5.17C12.96,5.06 12.49,5 12,5C11.51,5 11.04,5.06 10.59,5.17L8.41,3L7,4.41L8.62,6.04C7.88,6.55 7.26,7.22 6.81,8H4V10H6.09C6.04,10.33 6,10.66 6,11V12H4V14H6V15C6,15.34 6.04,15.67 6.09,16H4V18H6.81C7.85,19.79 9.78,21 12,21C14.22,21 16.15,19.79 17.19,18H20V16H17.91C17.96,15.67 18,15.34 18,15V14H20V12H18V11C18,10.66 17.96,10.33 17.91,10H20V8ZM14,16H10V14H14V16ZM14,12H10V10H14V12Z"
android:fillColor="#ffffff"/>
</vector>

View file

@ -0,0 +1,23 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M5,14H7V22H5V14Z"
android:strokeAlpha="0.8"
android:fillColor="#ffffff"
android:fillAlpha="0.8"/>
<path
android:pathData="M19,2H5V14H10.6736C11.7971,11.6351 14.2076,10 17,10L16,8L19,2Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M17,10L19,14H10.6736C11.797,11.6351 14.2076,10 17,10Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillAlpha="0.5"/>
<path
android:pathData="M17,22C19.7614,22 22,19.7614 22,17C22,14.2386 19.7614,12 17,12C14.2386,12 12,14.2386 12,17C12,19.7614 14.2386,22 17,22ZM20,16H14V18H20V16Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
</vector>

View file

@ -3833,4 +3833,6 @@
<string name="poi_traffic_signals_arrow">Pfeil</string>
<string name="poi_traffic_signals_vibration">Vibrieren</string>
<string name="poi_give_box">Give box</string>
<string name="poi_city_block">Stadtteil</string>
<string name="poi_borough">Bezirk</string>
</resources>

View file

@ -1896,7 +1896,7 @@
<string name="poi_clothes_women">inaj</string>
<string name="poi_clothes_underwear">subvestoj</string>
<string name="poi_clothes_men">viraj</string>
<string name="poi_clothes_wedding">roboj geedziĝaj</string>
<string name="poi_clothes_wedding">edziniĝaj roboj</string>
<string name="poi_clothes_sports">sportaj</string>
<string name="poi_clothes_babies">bebaj</string>
<string name="poi_clothes_denim">ĝinzoŝtofaj</string>

View file

@ -25,9 +25,10 @@
<dimen name="map_alarm_size">116dp</dimen>
<dimen name="map_alarm_bottom_text_margin">12dp</dimen>
<dimen name="map_alarm_text_size">35sp</dimen>
<dimen name="map_alarm_text_top_padding">30dp</dimen>
<dimen name="map_alarm_bottom_text_size">22sp</dimen>
<dimen name="map_alarm_bottom_margin">140dp</dimen>
<dimen name="map_alarm_bottom_si_text_size">12sp</dimen>
<dimen name="map_alarm_bottom_margin">131dp</dimen>
<dimen name="map_alarm_bottom_margin_land">81dp</dimen>
<dimen name="map_widget_icon">36dp</dimen>
@ -89,8 +90,6 @@
<dimen name="measurement_tool_button_padding">12dp</dimen>
<dimen name="measurement_tool_button_height">54dp</dimen>
<dimen name="shadow_height">8dp</dimen>
<!--Route info-->
<dimen name="route_info_buttons_padding_left_right">33dp</dimen>
<dimen name="route_info_button_go_margin">5dp</dimen>

View file

@ -2922,7 +2922,7 @@
<string name="poi_health_specialty_reiki_yes">Reiki</string>
<string name="poi_health_specialty_herbalism_yes">Kruidengeneeskunde</string>
<string name="poi_health_specialty_chiropractic_yes">Chiropractie</string>
<string name="poi_fitness_centre">Fitness centrum</string>
<string name="poi_fitness_centre">Fitnesscentrum</string>
<string name="poi_dojo">Dojo</string>
<string name="poi_gaelic_games">Keltische spelen</string>
<string name="poi_netball">Netbal</string>
@ -3580,4 +3580,36 @@
<string name="poi_amusement_arcade">Speelhal</string>
<string name="poi_barbecue_grill">Barbecue: ja</string>
<string name="poi_outpost">Pick-up punt</string>
<string name="poi_taxi_office">Taxikantoor</string>
<string name="poi_changing_table_fee_no">Gebruik verschoontafel: gratis</string>
<string name="poi_changing_table_fee_yes">Gebruik verschoontafel: niet gratis</string>
<string name="poi_changing_table_count">Aantal verschoontafels</string>
<string name="poi_changing_table_location_unisex_toilet">Locatie verschoontafel: unisextoilet</string>
<string name="poi_changing_table_location_female_toilet">Locatie verschoontafel: damestoilet</string>
<string name="poi_changing_table_location_male_toilet">Locatie verschoontafel: herentoilet</string>
<string name="poi_changing_table_location_room">Locatie verschoontafel: kamer</string>
<string name="poi_changing_table_limited">Verschoontafel: beperkt</string>
<string name="poi_changing_table_no">Verschoontafel: nee</string>
<string name="poi_changing_table_yes">Verschoontafel: ja</string>
<string name="poi_defibrillator_location">Locatie</string>
<string name="poi_hazard_additional_contamination">Gevaar: verontreiniging</string>
<string name="poi_hazard_additional_minefield">Gevaar: mijnenveld</string>
<string name="poi_hazard_additional_avalanche">Gevaar: lawine</string>
<string name="poi_hazard_additional_flood">Gevaar: overstroming</string>
<string name="poi_hazard_additional_nuclear">Gevaar: nucleair</string>
<string name="poi_hazard_additional_rockfall">Gevaar: vallend gesteente</string>
<string name="poi_hazard_additional_erosion">Gevaar: erosie</string>
<string name="poi_change_delete">Verwijderd object</string>
<string name="poi_flare">Gasfakkel</string>
<string name="poi_park_ride_ferry">Veerpont</string>
<string name="poi_park_ride_tram">Tram</string>
<string name="poi_park_ride_hov">HOV</string>
<string name="poi_park_ride_metro">Metro</string>
<string name="poi_park_ride_bus">Lijnbus</string>
<string name="poi_park_ride_train">Trein</string>
<string name="poi_denotation_landmark">Herkenningspunt</string>
<string name="poi_denotation_natural_monument">Natuurlijk monument</string>
<string name="poi_childcare">Kinderopvang</string>
<string name="poi_toll_gantry">Tolportaal</string>
<string name="poi_atoll">Atol</string>
</resources>

View file

@ -871,7 +871,7 @@
<string name="recording_is_recorded">Audio/video wordt opgenomen. Om te stoppen, tik op het AV-widget.</string>
<string name="recording_playing">Een geluidsfragment van de gekozen opname wordt afgespeeld.\n%1$s</string>
<string name="recording_open_external_player">Externe speler openen</string>
<string name="recording_delete_confirm">Wil je deze opname wissen?</string>
<string name="recording_delete_confirm">Wil je dit object verwijderen\?</string>
<string name="recording_unavailable">niet beschikbaar</string>
<string name="recording_context_menu_arecord">Audionotitie opnemen</string>
<string name="recording_context_menu_vrecord">Videonotitie opnemen</string>

View file

@ -18,7 +18,7 @@
<string name="base_world_map">Основна карта света</string>
<string name="local_index_tile_data_expire">Истиче(минута): %1$s</string>
<string name="local_index_tile_data_maxzoom">Максимално увеличање: %1$s</string>
<string name="edit_tilesource_elliptic_tile">Елиптични приказ земљине кугле</string>
<string name="edit_tilesource_elliptic_tile">Елиптична Меркатор пројекција</string>
<string name="edit_tilesource_maxzoom">Максимално увеличање</string>
<string name="edit_tilesource_minzoom">Минимално увеличање</string>
<string name="edit_tilesource_url_to_load">URL</string>
@ -324,7 +324,7 @@
<string name="notes">A/V белешке</string>
<string name="online_map">Карта са мреже</string>
<string name="roads_only">Само путеви</string>
<string name="free">"Слободно %1$s "</string>
<string name="free">Слободно %1$s</string>
<string name="device_memory">Складиште уређаја</string>
<string name="plugin_ski_name">Преглед скијашке карте</string>
<string name="plugin_nautical_name">Преглед поморске карте</string>
@ -720,12 +720,12 @@
<string name="selected_gpx_info_show">\n\nПритисните и држите ради приказа карте</string>
<string name="delay_navigation_start">Аутоматски покрени водича за скретање</string>
<string name="local_index_gpx_info_show">\n\nПритисните и држите за могућности</string>
<string name="gpx_info_subtracks">"Подпутање: %1$s "</string>
<string name="gpx_info_waypoints">"Пролазне тачке: %1$s "</string>
<string name="gpx_info_distance">"Растојање: %1$s (%2$s тачака) "</string>
<string name="gpx_info_start_time">"Почетно време: %1$tF, %1$tT "</string>
<string name="gpx_info_end_time">"Време завршетка: %1$tF, %1$tT "</string>
<string name="gpx_info_average_speed">"Просечна брзина: %1$s "</string>
<string name="gpx_info_subtracks">Подпутање: %1$s</string>
<string name="gpx_info_waypoints">Пролазне тачке: %1$s</string>
<string name="gpx_info_distance">Растојање: %1$s (%2$s тачака)</string>
<string name="gpx_info_start_time">Почетно време: %1$tF, %1$tT</string>
<string name="gpx_info_end_time">Време завршетка: %1$tF, %1$tT</string>
<string name="gpx_info_average_speed">Просечна брзина: %1$s</string>
<string name="gpx_info_maximum_speed">Највећа брзина: %1$s</string>
<string name="gpx_info_avg_altitude">Просечна висина: %1$s</string>
<string name="gpx_info_diff_altitude">Распон висине: %1$s</string>
@ -1408,7 +1408,7 @@
<string name="show_guide_line_descr">Приказуј вођице од свог положаја до положаја активне ознаке.</string>
<string name="show_arrows_descr">Приказуј једну или две стрелице које показују правац активних ознака.</string>
<string name="distance_indication_descr">Изаберите начин приказа растојања до активних ознака.</string>
<string name="active_markers_descr">Одаберите број показивача правца:</string>
<string name="active_markers_descr">Одаберите број показивача правца.</string>
<string name="digits_quantity">Број децималних бројки</string>
<string name="show_number_pad">Приказуј бројчану ставку</string>
<string name="shared_string_paste">Налепи</string>
@ -2050,7 +2050,7 @@
<string name="group_deleted">Група избрисана</string>
<string name="rendering_attr_whiteWaterSports_name">Спортови на брзацима</string>
<string name="complex_route_calculation_failed">Брзо израчунавање пута није успело (%s), пребацујем се на споро израчунавање.</string>
<string name="local_index_tile_data_zooms">Скинутих зумирања: %1$s</string>
<string name="local_index_tile_data_zooms">Скинутих зум нивоа: %1$s</string>
<string name="driving_region_descr">Одаберите регион вожње: САД, Европа, Уједињено Краљевство, Азија и остало.</string>
<string name="layer_hillshade">Слој са осенченим рељефима</string>
<string name="native_app_allocated_memory">Укупно меморије</string>
@ -2477,18 +2477,18 @@
\nСнимљене путање се могу делити са пријатељима или слати на ОСМ. Спортисти могу да користе снимљене путање да прате своје тренинге. Директно у OsmAnd-у може да се ради основна анализа путања, као што су рачунање брзине круга, просечна брзина итд. Наравно, путање се даље могу анализирати у другим специјалним алатима за анализу.</string>
<string name="rendering_attr_pisteGrooming_name">Равнање стазе</string>
<string name="rendering_attr_alpineHiking_name">Алпска скала за планинарење (SAC)</string>
<string name="osmand_plus_extended_description_part8">Приближна покривеност карте и квалитет:
\n • Западна Европа: ****
\n • Источна Европа: ***
\n • Русија: ***
\n • Северна Америка: ***
\n • Јужна Америка: **
\n • Азија: **
\n • Јапан &amp; Кореја: ***
\n • Блиски исток: **
\n • Африка: **
\n • Антарктик: *
\n Већина држава на свету се може скинути
<string name="osmand_plus_extended_description_part8">Приближна покривеност карте и квалитет:
\n • Западна Европа: ****
\n • Источна Европа: ***
\n • Русија: ***
\n • Северна Америка: ***
\n • Јужна Америка: **
\n • Азија: **
\n • Јапан и Кореја: ***
\n • Блиски исток: **
\n • Африка: **
\n • Антарктик: *
\n Већина држава на свету се може скинути
\n Од Авганистана до Шри Ланке, горе од Аљаске до Аустралије. Аргентина, Бразил, Канада, Француска, Немачка, Мексико, Велика Британија, Шпанија, …
\n</string>
<string name="osmand_srtm_long_description_1000_chars">Овај додатак омогућава приказ слоја изохипси и рељефа изнад стандардних OsmAnd карти. Ову функционалност ће највише знати да цене спортисти, планинари, трекери и свако кога занима рељефна структура предела.
@ -2503,25 +2503,25 @@
\n Белешка 1: Ваши стари фајлови неће вити дирани (али можете их Ви сами обрисати).
\n Белешка 2: У новој локацији за складиште, неће бити могуће делити фајлове између OsmAnd и OsmAnd+ апликација.</string>
<string name="disable_complex_routing_descr">Искључи двофазно усмеравање за навођење у колима.</string>
<string name="edit_tilesource_successfully">Извор сличице %1$s сачуван</string>
<string name="edit_tilesource_successfully">Извор плочица %1$s сачуван</string>
<string name="rendering_attr_hikingRoutesOSMC_name">Слој над картом са симболима за пешачење</string>
<string name="show_warnings_descr">Подесите упозорења у саобраћају (ограничења брзине, форсирана заустављања, лежећи полицајци, тунели), радаре и податке о траци.</string>
<string name="osmand_extended_description_part4">Скијање
\n OsmAnd додатак за скијашке мапе Вам омогућава да видите стазе за скијање уз њихову тежину и додатне информације, као што су положај ски лифтова и осталих објеката.</string>
<string name="osmand_extended_description_part8">OsmAnd је софтвер отвореног кода на коме се активно ради. Свако може да допринесе апликација тако што ће да пријављује грешке, побољшава преводе или да програмира нове функционалности. Додатно, пројекат се ослања на новчане прилоге да би се финансирао развој и тестирање нових функција.
\n
\n Приближна покривеност карте и квалитет:
\n • Западна Европа: ****
\n • Источна Европа: ***
\n • Русија: ***
\n • Северна Америка: ***
\n • Јужна Америка: **
\n • Азија: **
\n • Јапан &amp; Кореја: ***
\n • Блиски исток: **
\n • Африка: **
\n • Антарктик: *
\n Већина држава на свету се може скинути!
<string name="osmand_extended_description_part8">OsmAnd је софтвер отвореног кода на коме се активно ради. Свако може да допринесе апликација тако што ће да пријављује грешке, побољшава преводе или да програмира нове функционалности. Додатно, пројекат се ослања на новчане прилоге да би се финансирао развој и тестирање нових функција.
\n
\n Приближна покривеност карте и квалитет:
\n • Западна Европа: ****
\n • Источна Европа: ***
\n • Русија: ***
\n • Северна Америка: ***
\n • Јужна Америка: **
\n • Азија: **
\n • Јапан и Кореја: ***
\n • Блиски исток: **
\n • Африка: **
\n • Антарктик: *
\n Већина држава на свету се може скинути!
\n Добијте поузданог навигатора у Вашој држави - било да је то Француска, Немачка, Мексико, Велика Британија, Холандија, САД, Русија, Бразил или нека друга.</string>
<string name="pref_overlay">Слој изнад / испод</string>
<string name="overlay_transparency_descr">Подесите провидност горњег слоја.</string>
@ -2546,15 +2546,17 @@
\n • Опција GPX снимања Вам омогућава да снимити Ваше путовање и да га делите
\n • Уз још додатака можете да укључите и изохипсе и рељеф</string>
<string name="osmand_extended_description_part6">Шетање, планинарење, градске туре
\n • Карта Вам показује стазе за пешачење и планинарење
\n • Карта Вам показује стазе за пешачење и планинарење
\n • Википедија на Вашем језику Вам може рећи много за време тура по граду
\n • Станице јавног превоза (аутобуси, трамваји, возови), укључујући и имена линија ће Вам помоћи кретање по непознатом граду
\n • GPS навођење у режиму пешачења Вам прави путању користећи путеве на којима се може проћи пешке
\n • Отпремајте и пратите GPX путање или снимајте и делите Ваше сопствене</string>
<string name="osmand_extended_description_part7">Допринесите ОСМ-у
\n • Пријављујте грешке у подацима
\n • Отпремајте GPX путање директно из апликације
\n • Додајте тачке од интереса и отпремајте их директно на ОСМ (или касније ако нисте на мрежи)</string>
\n • Отпремајте и пратите GPX путање или снимајте и делите Ваше сопствене
\n</string>
<string name="osmand_extended_description_part7">Допринесите ОСМ-у
\n • Пријављујте грешке у подацима
\n • Отпремајте GPX путање директно из апликације
\n • Додајте тачке од интереса и отпремајте их директно на ОСМ (или касније ако нисте на мрежи)
\n</string>
<string name="osmand_plus_short_description_80_chars">Глобални преглед карти на мобилним уређајима &amp; навигација за ОСМ карте на мрежи и ван мреже</string>
<string name="osmand_plus_extended_description_part7">Допринесите директно ОСМ-у
\n • Пријављујте грешке у подацима
@ -2899,7 +2901,7 @@
<string name="choose_track_file_to_follow">Одаберите фајл путање за праћење</string>
<string name="voice_announcements">Гласовне најаве</string>
<string name="intermediate_destinations">Успутна одредишта</string>
<string name="arrive_at_time">"Долазак у %1$s "</string>
<string name="arrive_at_time">Долазак у %1$s</string>
<string name="routeInfo_roadClass_name">Тип пута</string>
<string name="routeInfo_surface_name">Подлога</string>
<string name="routeInfo_smoothness_name">Углачаност</string>
@ -3478,7 +3480,7 @@
<string name="osm_authorization_success">Провера идентитета успела</string>
<string name="rearrange_categories">Преуреди категорије</string>
<string name="add_new_custom_category_button_promo">Можете да додате нове произвољне категорије означавајући једну или више потребних категорија.</string>
<string name="reset_to_default_category_button_promo">Ресетовање на подразумевано ће ресетовати редослед сортирања на подразумевано стање после инсталације.</string>
<string name="reset_to_default_category_button_promo">Ресетовање на подразумевано ће поставити редослед сортирања на подразумевано стање после инсталације.</string>
<string name="shared_string_available">Доступно</string>
<string name="add_custom_category">Додај произвољну категорију</string>
<string name="rendering_attr_streetLightingNight_name">Прикажи само ноћу</string>
@ -3487,10 +3489,10 @@
<string name="ltr_or_rtl_combine_via_slash">%1$s/%2$s</string>
<string name="sunset_at">Сунце залази у %1$s</string>
<string name="sunrise_at">Сунце излази у %1$s</string>
<string name="accessibility_mode_disabled">Режим приступачности је искључен на Вашем систему.</string>
<string name="accessibility_mode_disabled">Режим приступачности је искључен на вашем Андроид систему.</string>
<string name="use_system_screen_timeout">Користи системско време одлагања гашења екрана</string>
<string name="use_system_screen_timeout_promo">Подразумевано је искључено, ако OsmAnd ради у предњем плану, екран неће да се гаси.
\n
<string name="use_system_screen_timeout_promo">Подразумевано је искључено: Док OsmAnd ради у предњем плану, екран неће да се гаси.
\n
\nАко је укључено, OsmAnd ће користити системско време одлагања гашења екрана.</string>
<string name="clear_recorded_data">Очисти снимљене податке</string>
<string name="copy_coordinates">Копирај координате</string>
@ -3662,7 +3664,7 @@
<string name="vessel_width_limit_description">Подесите ширину пловила и избегните уске мостове</string>
<string name="use_volume_buttons_as_zoom_descr">Укључите да омогућите контролу нивоа увећања са дугмићима за јачину звука.</string>
<string name="use_volume_buttons_as_zoom">Дугмићи за јачину звука за зумирање</string>
<string name="shared_string_uninstall_and_restart">"Деинсталирај и поново покрени"</string>
<string name="shared_string_uninstall_and_restart">Деинсталирај и поново покрени</string>
<string name="speed_cameras_removed_descr">Овај уређај нема радаре.</string>
<string name="app_mode_inline_skates">Ролери</string>
<string name="speed_cameras_restart_descr">Поновно покретање је потребно да се потпуно избришу подаци о радарима.</string>
@ -3752,4 +3754,56 @@
<string name="some_articles_may_not_available_in_lang">Неки чланци са Википедија су можда доступни на Вашем језику.</string>
<string name="lang_zhyue">Кантонски</string>
<string name="lang_zhminnan">Јужномински</string>
<string name="shared_string_hillshade">Сенке брда</string>
<string name="select_track_file">Изаберите фајл стазе</string>
<string name="shared_string_resume">Настави</string>
<string name="hillshade_description">Мапа сенка брда користи тамне нијансе за приказивање нагиба, врхова и низина.</string>
<string name="slope_description">При нагибу користе се боје за визуелизацију стрмине терена.</string>
<string name="terrain_slider_description">Поставите минимални и максимални ниво зума, при коме ће слој бити приказан.</string>
<string name="hillshade_download_description">Додатне мапе су потребне да бисте видели сенке брда на мапи.</string>
<string name="slope_download_description">Додатне мапе су потребне да бисте видели нагибе на мапи.</string>
<string name="slope_read_more">Можете прочитати више о нагибима у %1$е.</string>
<string name="terrain_empty_state_text">Омогућите да би видели сенке брда или мапе нагиба. Можете прочитати више о овим врстама карта на нашем сајту.</string>
<string name="import_complete_description">Сви подаци %1$S су увезени, можете да употребите дугмад испод да би сте отворили неопходни део апликације ради управљања њима.</string>
<string name="checking_for_duplicate_description">Османд проверава %1$S постојање дупликата са постојећим елементима у апликацији.
\n
\nТо може да потраје неко време.</string>
<string name="download_slope_maps">Нагиби</string>
<string name="ui_customization_description">Прилагодите количину елемената у \"Фиоци\", \"Подешавању мапе\" и \"Контекст менију\".
\n
\nОнемогућите некоришћене додатке да сакријете све њихове контроле. %1$е.</string>
<string name="ui_customization_short_descr">Елементи Фиоке, Контекст мени</string>
<string name="context_menu_actions">Акције Контекст менија</string>
<string name="osm_live_payment_subscription_management">Наплатом ће бити оптерећен ваш Гугл Плеј налог при потврди куповине.
\n
\n Претплата се аутоматски обнавља уколико није отказана пре датума обнове. Ваш налог биће задужен периодом обнове (месец / три месеца / годину дана) само на дан обнове.
\n
\n Претплатама можете управљати и отказати их тако што ћете отићи на ваша Гугл Плеј подешавања.</string>
<string name="release_3_7">• Нове офлајн мапе нагиба
\n
\n • Пуно прилагођавање Фаворита и ГПКС тачака прилагођавање боја, икона, облика
\n
\n • Прилагођавање редоследа елемената \"Контекст менија\", \"Подешавање мапе\" и \"Кутије\"
\n
\n • Википедија као посебан слој у Подешавању мапе, изаберите само потребне језике
\n
\n • Направите свој ТОИ филтер / мапу са пуном флексибилношћу
\n
\n • Додата могућност да се поврате подешавања корисничких профила
\n
\n • Целовите ГПКС руте са подршком за саобраћајне траке и целовита упутства скретања
\n
\n • Исправљене величине корисничког интерфејса на таблетама
\n
\n • Исправљени багови са РТЛ
\n
\n</string>
<string name="gpx_parse_error">OsmAnd GPX није добро формиран, молимо обратите се тиму подршке ради даље истраге.</string>
<string name="turn_screen_on_power_button_disabled">Онемогућено. Захтева \'Држи екран упаљеним\' под \'Тајмаут после буђења\'.</string>
<string name="turn_screen_on_wake_time_descr">Одаберите тајмаут екрана после буђења. (\"%1$s\" се односи на тајмаут.)</string>
<string name="map_source_zoom_levels_descr">Утиче на екран када се користи као мапа или подслој/надслој.
\n
\n%1$s: Мапа је ограничена одабраним нивоом зума.
\n
\n%2$s: су нивои при којима ће оригиналне плочице бити видљиве, а умањење или увећање биће изван ових вредности.</string>
</resources>

View file

@ -141,15 +141,14 @@
<dimen name="map_route_planning_land_width_minus_shadow">306dp</dimen>
<dimen name="map_route_planning_max_height">330dp</dimen>
<dimen name="map_minwidth_widget">100dp</dimen>
<dimen name="map_widget_text_size">23sp</dimen>
<dimen name="map_top_widget_text_size">22sp</dimen>
<dimen name="map_widget_text_size_small">15sp</dimen>
<dimen name="map_button_text_size">18sp</dimen>
<dimen name="map_alarm_text_size">25sp</dimen>
<dimen name="map_alarm_text_top_padding">20dp</dimen>
<dimen name="map_alarm_bottom_text_size">16sp</dimen>
<dimen name="map_alarm_bottom_si_text_size">8sp</dimen>
<dimen name="map_widget_text_bottom_margin">1sp</dimen>
<dimen name="map_widget_text_small_bottom_margin">3sp</dimen>
<dimen name="map_widget_icon_margin">2dp</dimen>
@ -275,6 +274,7 @@
<dimen name="bottom_sheet_text_spacing_multiplier" format="float">1.25</dimen>
<dimen name="bottom_sheet_info_spacing_multiplier" format="float">1.5</dimen>
<dimen name="bottom_sheet_big_item_height">128dp</dimen>
<dimen name="bottom_sheet_top_shadow_height">8dp</dimen>
<dimen name="action_bar_image_width_land">236dp</dimen>
<dimen name="action_bar_image_top_margin_land">68dp</dimen>
@ -285,7 +285,6 @@
<dimen name="map_markers_recycler_view_padding_bottom">52dp</dimen>
<dimen name="map_markers_recycler_view_padding_top">10dp</dimen>
<dimen name="shadow_height">5dp</dimen>
<dimen name="map_marker_title_height">28dp</dimen>
<dimen name="fab_recycler_view_padding_bottom">88dp</dimen>

View file

@ -13,8 +13,11 @@
-->
<string name="plugin_wikipedia_description">Get information about points of interest from Wikipedia. It is your pocket offline guide - just enable Wikipedia plugin and enjoy articles about objects around you.</string>
<string name="search_download_wikipedia_maps">Download Wikipedia maps</string>
<string name="quick_action_remove_next_destination_descr">The current destination point on the route will be deleted. If it will be the Destination, navigation will stop.</string>
<string name="please_provide_point_name_error">Please provide a name for the point</string>
<string name="use_volume_buttons_as_zoom">Volume buttons as zoom</string>
<string name="use_volume_buttons_as_zoom_descr">Enable to control the map zoom level with device volume buttons.</string>
<string name="quick_action_remove_next_destination">Delete next destination point</string>
<string name="app_mode_inline_skates">Inline skates</string>
<string name="speed_cameras_removed_descr">This device doesn\'t have speed cameras.</string>
<string name="shared_string_uninstall_and_restart">Uninstall and Restart</string>
@ -87,6 +90,7 @@
<string name="screen_control">Screen control</string>
<string name="shared_string_always">Always</string>
<string name="gpx_parse_error">OsmAnd GPX is not well formed, please contact the support team to investigate further.</string>
<string name="lenght_limit_description">Provide your vehicle length, some routes restrictions may be applied for long vehicles.</string>
<string name="weight_limit_description">Provide your vehicle weight, some route restrictions may apply for heavy vehicles.</string>
<string name="height_limit_description">Provide your vehicle height, some route restrictions may apply for high vehicles.</string>
<string name="width_limit_description">Provide your vehicle width some route restrictions may apply for wide vehicles.</string>

View file

@ -5,7 +5,7 @@ import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.PorterDuff;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Editable;
@ -28,7 +28,6 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
@ -308,21 +307,25 @@ public class FavoritesSearchFragment extends DialogFragment {
private FavouritesDbHelper helper;
private LatLon location;
private Drawable arrowImage;
List<FavouritePoint> points = new ArrayList<>();
Filter myFilter;
private Set<?> filter;
private int enabledColor;
private int disabledColor;
private int disabledIconColor;
public FavoritesSearchListAdapter(OsmandApplication app, Activity activity) {
super(app, R.layout.search_list_item);
this.app = app;
this.activity = activity;
this.helper = app.getFavorites();
location = app.getSettings().getLastKnownMapLocation();
arrowImage = AppCompatResources.getDrawable(activity, R.drawable.ic_direction_arrow);
arrowImage.mutate();
arrowImage.setColorFilter(ContextCompat.getColor(activity, R.color.color_distance), PorterDuff.Mode.MULTIPLY);
boolean light = app.getSettings().isLightContent();
enabledColor = light ? R.color.text_color_primary_light : R.color.text_color_primary_dark;
disabledColor = light ? R.color.text_color_secondary_light : R.color.text_color_secondary_dark;
disabledIconColor = light ? R.color.icon_color_default_light : R.color.icon_color_default_dark;
}
public void setAccessibilityAssistant(AccessibilityAssistant accessibilityAssistant) {
@ -335,15 +338,11 @@ public class FavoritesSearchFragment extends DialogFragment {
Set<?> flt = filter;
for (FavoriteGroup key : gs) {
if (flt == null || flt.contains(key)) {
for (FavouritePoint p : key.getPoints()) {
if (p.isVisible()) {
points.add(p);
}
}
points.addAll(key.getPoints());
} else {
ArrayList<FavouritePoint> list = new ArrayList<>();
for (FavouritePoint p : key.getPoints()) {
if (p.isVisible() && flt.contains(p)) {
if (flt.contains(p)) {
list.add(p);
}
}
@ -353,11 +352,15 @@ public class FavoritesSearchFragment extends DialogFragment {
Collections.sort(points, new Comparator<FavouritePoint>() {
@Override
public int compare(FavouritePoint p1, FavouritePoint p2) {
int d1 = (int) (MapUtils.getDistance(p1.getLatitude(), p1.getLongitude(),
location.getLatitude(), location.getLongitude()));
int d2 = (int) (MapUtils.getDistance(p2.getLatitude(), p2.getLongitude(),
location.getLatitude(), location.getLongitude()));
return d1 < d2 ? -1 : (d1 == d2 ? 0 : 1);
if (p1.isVisible() && p2.isVisible() || !p1.isVisible() && !p2.isVisible()) {
int d1 = (int) (MapUtils.getDistance(p1.getLatitude(), p1.getLongitude(),
location.getLatitude(), location.getLongitude()));
int d2 = (int) (MapUtils.getDistance(p2.getLatitude(), p2.getLongitude(),
location.getLatitude(), location.getLongitude()));
return d1 < d2 ? -1 : (d1 == d2 ? 0 : 1);
} else {
return (p1.isVisible() == p2.isVisible()) ? 0 : (p1.isVisible() ? -1 : 1);
}
}
});
notifyDataSetChanged();
@ -459,24 +462,26 @@ public class FavoritesSearchFragment extends DialogFragment {
}
if (point != null) {
boolean visible = point.isVisible();
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
TextView title = (TextView) view.findViewById(R.id.title);
TextView subtitle = (TextView) view.findViewById(R.id.subtitle);
imageView.setImageDrawable(PointImageDrawable.getFromFavorite(activity,
helper.getColorWithCategory(point, getResources().getColor(R.color.color_favorite)),
false, point));
int color = visible
? app.getFavorites().getColorWithCategory(point, getResources().getColor(R.color.color_favorite))
: ContextCompat.getColor(app, disabledIconColor);
imageView.setImageDrawable(PointImageDrawable.getFromFavorite(activity, color, false, point));
title.setText(point.getDisplayName(app));
title.setTypeface(Typeface.DEFAULT, visible ? Typeface.NORMAL : Typeface.ITALIC);
title.setTextColor(getResources().getColor(visible ? enabledColor : disabledColor));
int dist = (int) (MapUtils.getDistance(point.getLatitude(), point.getLongitude(),
location.getLatitude(), location.getLongitude()));
String distance = OsmAndFormatter.getFormattedDistance(dist, app) + " ";
ImageView direction = (ImageView) view.findViewById(R.id.direction);
direction.setImageDrawable(arrowImage);
direction.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_direction_arrow, visible ? R.color.color_distance : disabledColor));
TextView distanceText = (TextView) view.findViewById(R.id.distance);
distanceText.setText(distance);
distanceText.setTextColor(app.getResources().getColor(R.color.color_distance));
distanceText.setTextColor(visible ? getResources().getColor(enabledColor) : getResources().getColor(disabledColor));
subtitle.setText(point.getCategory().length() == 0 ? app.getString(R.string.shared_string_favorites) : point.getCategoryDisplayName(app));
}
}
@ -531,11 +536,11 @@ public class FavoritesSearchFragment extends DialogFragment {
} else {
gName = g.getName().toLowerCase();
}
if (g.isVisible() && gName.contains(cs)) {
if (gName.contains(cs)) {
filter.add(g);
} else {
for (FavouritePoint fp : g.getPoints()) {
if (fp.isVisible() && fp.getName().toLowerCase().contains(cs)) {
if (fp.getName().toLowerCase().contains(cs)) {
filter.add(fp);
}
}

View file

@ -559,27 +559,9 @@ public abstract class MenuController extends BaseMenuController implements Colla
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
if (openingHoursInfo != null) {
StringBuilder sb = new StringBuilder();
int colorOpen = mapActivity.getResources().getColor(R.color.ctx_menu_amenity_opened_text_color);
int colorClosed = mapActivity.getResources().getColor(R.color.ctx_menu_amenity_closed_text_color);
int[] pos = new int[openingHoursInfo.size()];
for (int i = 0; i < openingHoursInfo.size(); i++) {
OpeningHours.Info info = openingHoursInfo.get(i);
if (sb.length() > 0) {
sb.append("\n");
}
sb.append(info.getInfo());
pos[i] = sb.length();
}
SpannableString infoStr = new SpannableString(sb.toString());
int k = 0;
for (int i = 0; i < openingHoursInfo.size(); i++) {
OpeningHours.Info info = openingHoursInfo.get(i);
infoStr.setSpan(new ForegroundColorSpan(info.isOpened() ? colorOpen : colorClosed), k, pos[i], 0);
k = pos[i];
}
return infoStr;
return getSpannableOpeningHours(openingHoursInfo, colorOpen, colorClosed);
} else if (shouldShowMapSize()) {
return mapActivity.getString(R.string.file_size_in_mb, indexItem.getArchiveSizeMB());
}
@ -597,6 +579,29 @@ public abstract class MenuController extends BaseMenuController implements Colla
return 0;
}
public static SpannableString getSpannableOpeningHours(List<OpeningHours.Info> openingHoursInfo,
int colorOpen,
int colorClosed) {
StringBuilder sb = new StringBuilder();
int[] pos = new int[openingHoursInfo.size()];
for (int i = 0; i < openingHoursInfo.size(); i++) {
OpeningHours.Info info = openingHoursInfo.get(i);
if (sb.length() > 0) {
sb.append("\n");
}
sb.append(info.getInfo());
pos[i] = sb.length();
}
SpannableString infoStr = new SpannableString(sb.toString());
int k = 0;
for (int i = 0; i < openingHoursInfo.size(); i++) {
OpeningHours.Info info = openingHoursInfo.get(i);
infoStr.setSpan(new ForegroundColorSpan(info.isOpened() ? colorOpen : colorClosed), k, pos[i], 0);
k = pos[i];
}
return infoStr;
}
private boolean shouldShowMapSize() {
return indexItem != null && !downloaded;
}

View file

@ -11,6 +11,8 @@ import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@ -163,7 +165,7 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
}
});
view.findViewById(R.id.buttons_divider).setVisibility(View.VISIBLE);
View saveButton = view.findViewById(R.id.right_bottom_button);
final View saveButton = view.findViewById(R.id.right_bottom_button);
saveButton.setVisibility(View.VISIBLE);
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
@ -183,11 +185,27 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
UiUtilities.setupDialogButton(nightMode, cancelButton, UiUtilities.DialogButtonType.SECONDARY, R.string.shared_string_cancel);
UiUtilities.setupDialogButton(nightMode, saveButton, UiUtilities.DialogButtonType.PRIMARY, R.string.shared_string_save);
TextInputLayout nameCaption = (TextInputLayout) view.findViewById(R.id.name_caption);
final TextInputLayout nameCaption = (TextInputLayout) view.findViewById(R.id.name_caption);
nameCaption.setHint(getString(R.string.shared_string_name));
nameEdit = (EditText) view.findViewById(R.id.name_edit);
nameEdit.setText(getNameInitValue());
nameEdit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
checkEmptyName(s, nameCaption, saveButton);
}
});
checkEmptyName(nameEdit.getText(), nameCaption, saveButton);
nameIcon = (ImageView) view.findViewById(R.id.name_icon);
TextView categoryEdit = view.findViewById(R.id.groupName);
if (categoryEdit != null) {
@ -289,6 +307,16 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
return view;
}
private void checkEmptyName(Editable name, TextInputLayout nameCaption, View saveButton) {
if (name.toString().trim().isEmpty()) {
nameCaption.setError(app.getString(R.string.please_provide_point_name_error));
saveButton.setEnabled(false);
} else {
nameCaption.setError(null);
saveButton.setEnabled(true);
}
}
private ViewTreeObserver.OnGlobalLayoutListener getOnGlobalLayoutListener() {
return new ViewTreeObserver.OnGlobalLayoutListener() {
@Override

View file

@ -11,7 +11,6 @@ import net.osmand.data.LatLon;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.osmedit.OsmEditingPlugin;
import net.osmand.plus.quickaction.QuickAction;
import net.osmand.plus.quickaction.QuickActionType;
@ -23,7 +22,7 @@ public class AddOSMBugAction extends QuickAction {
public static final QuickActionType TYPE = new QuickActionType(12,
"osmbug.add", AddOSMBugAction.class).
nameRes(R.string.quick_action_add_osm_bug).iconRes(R.drawable.ic_action_bug_dark).
nameRes(R.string.quick_action_add_osm_bug).iconRes(R.drawable.ic_action_osm_note_add).
category(QuickActionType.CREATE_CATEGORY);
public AddOSMBugAction() {

View file

@ -182,7 +182,7 @@ public class EditPOIMenuController extends MenuController {
}
return iconResId;
} else if (osmPoint.getGroup() == OsmPoint.Group.BUG) {
return R.drawable.ic_action_bug_dark;
return R.drawable.ic_action_osm_note_add;
} else {
return 0;
}

View file

@ -58,7 +58,7 @@ public class ExportOptionsBottomSheetDialogFragment extends MenuBottomSheetDialo
BaseBottomSheetItem osmNotesItem = new BottomSheetItemWithDescription.Builder()
.setDescription(String.valueOf(osmNotesCount))
.setIcon(getContentIcon(R.drawable.ic_action_bug_dark))
.setIcon(getContentIcon(R.drawable.ic_action_osm_note))
.setTitle(getString(R.string.osm_notes))
.setLayoutId(R.layout.bottom_sheet_item_with_right_descr)
.setDisabled(!(osmNotesCount > 0))

View file

@ -79,9 +79,9 @@ public class OsmBugMenuController extends MenuController {
@Override
public Drawable getRightIcon() {
if (bug.isOpened()) {
return getIcon(R.drawable.ic_action_info_dark, R.color.osm_bug_unresolved_icon_color);
return getIcon(R.drawable.ic_action_osm_note_unresolved, R.color.osm_bug_unresolved_icon_color);
} else {
return getIcon(R.drawable.ic_action_info_dark, R.color.osm_bug_resolved_icon_color);
return getIcon(R.drawable.ic_action_osm_note_resolved, R.color.osm_bug_resolved_icon_color);
}
}

View file

@ -295,7 +295,7 @@ public class OsmEditingPlugin extends OsmandPlugin {
} else {
adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.context_menu_item_open_note, mapActivity)
.setId(MAP_CONTEXT_MENU_OPEN_OSM_NOTE)
.setIcon(R.drawable.ic_action_bug_dark)
.setIcon(R.drawable.ic_action_osm_note_add)
.setOrder(OPEN_OSM_NOTE_ITEM_ORDER)
.setListener(listener)
.createItem());
@ -337,7 +337,7 @@ public class OsmEditingPlugin extends OsmandPlugin {
.setId(OSM_NOTES)
.setTitleId(R.string.layer_osm_bugs, mapActivity)
.setSelected(settings.SHOW_OSM_BUGS.get())
.setIcon(R.drawable.ic_action_bug_dark)
.setIcon(R.drawable.ic_action_osm_note)
.setColor(settings.SHOW_OSM_BUGS.get() ? R.color.osmand_orange : ContextMenuItem.INVALID_ID)
.setSecondaryIcon(R.drawable.ic_action_additional_option)
.setListener(new ContextMenuAdapter.OnRowItemClick() {

View file

@ -287,7 +287,7 @@ public class OsmEditsAdapter extends ArrayAdapter<Object> {
}
return app.getUIUtilities().getIcon(iconResId, colorResId);
} else if (point.getGroup() == OsmPoint.Group.BUG) {
return app.getUIUtilities().getIcon(R.drawable.ic_action_bug_dark, R.color.color_distance);
return app.getUIUtilities().getIcon(R.drawable.ic_action_osm_note, R.color.color_distance);
}
return null;
}

View file

@ -123,7 +123,7 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo
if (child.getGroup() == Group.POI) {
icon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_info_dark, R.color.color_distance));
} else if (child.getGroup() == Group.BUG) {
icon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_bug_dark, R.color.color_distance));
icon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_osm_note, R.color.color_distance));
}
TextView descr = (TextView) v.findViewById(R.id.description);

View file

@ -9,6 +9,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import net.osmand.data.FavouritePoint.BackgroundType;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.data.RotatedTileBox;
@ -26,6 +27,8 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static net.osmand.data.FavouritePoint.DEFAULT_BACKGROUND_TYPE;
public class OsmEditsLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider,
ContextMenuLayer.IMoveObjectProvider {
private static final int startZoom = 10;
@ -79,17 +82,21 @@ public class OsmEditsLayer extends OsmandMapLayer implements ContextMenuLayer.IC
}
}
private void drawPoint(Canvas canvas, OsmPoint o, float x, float y) {
private void drawPoint(Canvas canvas, OsmPoint osmPoint, float x, float y) {
float textScale = activity.getMyApplication().getSettings().TEXT_SCALE.get();
int iconId = getIconId(o);
int iconId = getIconId(osmPoint);
BackgroundType backgroundType = DEFAULT_BACKGROUND_TYPE;
if (osmPoint.getGroup() == OsmPoint.Group.BUG) {
backgroundType = BackgroundType.COMMENT;
}
PointImageDrawable pointImageDrawable = PointImageDrawable.getOrCreate(activity,
ContextCompat.getColor(activity, R.color.created_poi_icon_color), true,
iconId);
ContextCompat.getColor(activity, R.color.created_poi_icon_color), true, false,
iconId, backgroundType);
pointImageDrawable.setAlpha(0.8f);
pointImageDrawable.drawPoint(canvas, x, y, textScale, false);
int offsetY = backgroundType.getOffsetY(activity, textScale);
pointImageDrawable.drawPoint(canvas, x, y - offsetY, textScale, false);
}
public int getIconId(OsmPoint osmPoint) {
if (osmPoint.getGroup() == OsmPoint.Group.POI) {
OpenstreetmapPoint osmP = (OpenstreetmapPoint) osmPoint;
@ -115,7 +122,7 @@ public class OsmEditsLayer extends OsmandMapLayer implements ContextMenuLayer.IC
}
return iconResId;
} else if (osmPoint.getGroup() == OsmPoint.Group.BUG) {
return R.drawable.ic_action_bug_dark;
return R.drawable.mm_special_symbol_plus;
} else {
return 0;
}

View file

@ -109,7 +109,7 @@ public class OsmNotesMenu {
adapter.addItem(new ContextMenuItem.ItemBuilder()
.setTitleId(osmNotesStringId, mapActivity)
.setDescription(mapActivity.getString(R.string.switch_osm_notes_visibility_desc))
.setIcon(R.drawable.ic_action_bug_dark)
.setIcon(R.drawable.ic_action_osm_note)
.setColor(toggleIconColorId)
.setListener(l)
.setSelected(showOsmBugs)

View file

@ -16,7 +16,7 @@ public class ShowHideOSMBugAction extends QuickAction {
public static final QuickActionType TYPE = new QuickActionType(24,
"osmbug.showhide", ShowHideOSMBugAction.class).
nameRes(R.string.quick_action_showhide_osmbugs_title).iconRes(R.drawable.ic_action_bug_dark).nonEditable().
nameRes(R.string.quick_action_showhide_osmbugs_title).iconRes(R.drawable.ic_action_osm_note).nonEditable().
category(QuickActionType.CONFIGURE_MAP);

View file

@ -15,6 +15,7 @@ import com.google.gson.reflect.TypeToken;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.quickaction.actions.NavRemoveNextDestination;
import net.osmand.plus.quickaction.actions.ShowHideMapillaryAction;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
@ -236,6 +237,7 @@ public class QuickActionRegistry {
quickActionTypes.add(NavStartStopAction.TYPE);
quickActionTypes.add(NavResumePauseAction.TYPE);
quickActionTypes.add(SwitchProfileAction.TYPE);
quickActionTypes.add(NavRemoveNextDestination.TYPE);
OsmandPlugin.registerQuickActionTypesPlugins(quickActionTypes);
Map<Integer, QuickActionType> quickActionTypesInt = new TreeMap<>();

View file

@ -0,0 +1,55 @@
package net.osmand.plus.quickaction.actions;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.TargetPointsHelper;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.other.DestinationReachedMenu;
import net.osmand.plus.quickaction.QuickAction;
import net.osmand.plus.quickaction.QuickActionType;
public class NavRemoveNextDestination extends QuickAction {
public static final QuickActionType TYPE = new QuickActionType(34,
"nav.destination.remove", NavRemoveNextDestination.class)
.nameRes(R.string.quick_action_remove_next_destination)
.iconRes(R.drawable.ic_action_navigation_skip_destination)
.nonEditable()
.category(QuickActionType.NAVIGATION);
public NavRemoveNextDestination() {
super(TYPE);
}
public NavRemoveNextDestination(QuickAction quickAction) {
super(quickAction);
}
@Override
public void execute(MapActivity activity) {
TargetPointsHelper targetsHelper = activity.getMyApplication().getTargetPointsHelper();
if (targetsHelper.getIntermediatePoints().size() > 0) {
targetsHelper.removeWayPoint(true, 0);
} else {
DestinationReachedMenu.show(activity);
}
}
@Override
public void drawUI(ViewGroup parent, MapActivity activity) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.quick_action_with_text, parent, false);
((TextView) view.findViewById(R.id.text)).setText(R.string.quick_action_remove_next_destination_descr);
parent.addView(view);
}
@Override
public boolean isActionEnable(OsmandApplication app) {
return app.getRoutingHelper().isRouteCalculated();
}
}

View file

@ -2,6 +2,7 @@ package net.osmand.plus.search;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.SpannableString;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -14,7 +15,9 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.appcompat.view.ContextThemeWrapper;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.fragment.app.FragmentActivity;
@ -31,6 +34,7 @@ import net.osmand.plus.UiUtilities.UpdateLocationViewCache;
import net.osmand.plus.chooseplan.ChoosePlanDialogFragment;
import net.osmand.plus.search.listitems.QuickSearchBannerListItem;
import net.osmand.plus.search.listitems.QuickSearchFreeBannerListItem;
import net.osmand.plus.mapcontextmenu.MenuController;
import net.osmand.plus.search.listitems.QuickSearchHeaderListItem;
import net.osmand.plus.search.listitems.QuickSearchListItem;
import net.osmand.plus.search.listitems.QuickSearchListItemType;
@ -460,19 +464,17 @@ public class QuickSearchListAdapter extends ArrayAdapter<QuickSearchListItem> {
&& ((Amenity) listItem.getSearchResult().object).getOpeningHours() != null) {
Amenity amenity = (Amenity) listItem.getSearchResult().object;
OpeningHoursParser.OpeningHours rs = OpeningHoursParser.parseOpenedHours(amenity.getOpeningHours());
if (rs != null) {
Calendar inst = Calendar.getInstance();
inst.setTimeInMillis(System.currentTimeMillis());
boolean worksNow = !amenity.isClosed() && rs.isOpenedForTime(inst);
inst.setTimeInMillis(System.currentTimeMillis() + 30 * 60 * 1000); // 30 minutes later
boolean worksLater = rs.isOpenedForTime(inst);
int colorId = worksNow ? worksLater ? R.color.color_ok : R.color.color_intermediate : R.color.color_warning;
if (rs != null && rs.getInfo() != null) {
int colorOpen = R.color.ctx_menu_amenity_opened_text_color;
int colorClosed = R.color.ctx_menu_amenity_closed_text_color;
SpannableString openHours = MenuController.getSpannableOpeningHours(
rs.getInfo(),
ContextCompat.getColor(app, colorOpen),
ContextCompat.getColor(app, colorClosed));
int colorId = rs.isOpenedForTime(Calendar.getInstance()) ? colorOpen : colorClosed;
timeLayout.setVisibility(View.VISIBLE);
timeIcon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_time_16, colorId));
timeText.setTextColor(app.getResources().getColor(colorId));
String rt = amenity.isClosed() ? app.getResources().getString(R.string.poi_operational_status_closed) : rs.getCurrentRuleTime(inst);
timeText.setText(rt == null ? "" : rt);
timeText.setText(openHours);
} else {
timeLayout.setVisibility(View.GONE);
}

View file

@ -39,7 +39,9 @@ import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Arrays;
import java.util.Locale;
public class VehicleParametersBottomSheet extends BasePreferenceBottomSheet {
@ -78,7 +80,7 @@ public class VehicleParametersBottomSheet extends BasePreferenceBottomSheet {
final TextView metric = mainView.findViewById(R.id.metric);
metric.setText(app.getString(preference.getAssets().getMetricRes()));
final RecyclerView recyclerView = mainView.findViewById(R.id.recycler_view);
final DecimalFormat df = new DecimalFormat("#.####");
final DecimalFormat df = new DecimalFormat("#.####", new DecimalFormatSymbols(Locale.US));
text = mainView.findViewById(R.id.text_edit);
try {
currentValue = Float.parseFloat(preference.getValue());
@ -86,7 +88,7 @@ public class VehicleParametersBottomSheet extends BasePreferenceBottomSheet {
currentValue = 0.0f;
}
selectedItem = preference.getEntryFromValue(preference.getValue());
String currentValueStr = currentValue == 0.0f ? "" : String.valueOf(df.format(currentValue + 0.01f));
String currentValueStr = currentValue == 0.0f ? "" : df.format(currentValue + 0.01f);
text.setText(currentValueStr);
text.clearFocus();
text.setOnTouchListener(new View.OnTouchListener() {
@ -133,7 +135,7 @@ public class VehicleParametersBottomSheet extends BasePreferenceBottomSheet {
selectedItem = item;
currentValue = preference.getValueFromEntries(selectedItem);
String currentValueStr = currentValue == 0.0f
? "" : String.valueOf(df.format(currentValue + 0.01f));
? "" : df.format(currentValue + 0.01f);
text.setText(currentValueStr);
if (text.hasFocus()) {
text.setSelection(text.getText().length());
@ -157,17 +159,18 @@ public class VehicleParametersBottomSheet extends BasePreferenceBottomSheet {
}
private ViewTreeObserver.OnGlobalLayoutListener getOnGlobalLayoutListener() {
final int buttonsHeight = getResources().getDimensionPixelSize(R.dimen.dialog_button_ex_height);
return new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect visibleDisplayFrame = new Rect();
int buttonsHeight = getResources().getDimensionPixelSize(R.dimen.dialog_button_ex_height);
int shadowHeight = getResources().getDimensionPixelSize(R.dimen.bottom_sheet_top_shadow_height);
final ScrollView scrollView = getView().findViewById(R.id.scroll_view);
scrollView.getWindowVisibleDisplayFrame(visibleDisplayFrame);
boolean showTopShadow;
int contentHeight = visibleDisplayFrame.bottom - visibleDisplayFrame.top - buttonsHeight;
if (contentHeightPrevious != contentHeight) {
if (scrollView.getHeight() > contentHeight) {
if (scrollView.getHeight() + shadowHeight > contentHeight) {
scrollView.getLayoutParams().height = contentHeight;
showTopShadow = false;
} else {

View file

@ -19,7 +19,10 @@ public enum VehicleSizeAssets {
R.string.height_limit_description, R.string.shared_string_meters, R.string.m),
WEIGHT(VEHICLE_WEIGHT, GeneralRouterProfile.CAR, R.drawable.img_help_weight_limit_day,
R.drawable.img_help_weight_limit_night,
R.string.weight_limit_description, R.string.shared_string_tones, R.string.metric_ton);
R.string.weight_limit_description, R.string.shared_string_tones, R.string.metric_ton),
LENGTH(VEHICLE_LENGTH, GeneralRouterProfile.CAR, R.drawable.img_help_length_limit_day,
R.drawable.img_help_length_limit_night,
R.string.lenght_limit_description, R.string.shared_string_meters, R.string.m);
String routerParameterName;
GeneralRouterProfile routerProfile;

View file

@ -180,7 +180,8 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
} else if ((!param.equals(GeneralRouter.USE_SHORTEST_WAY) || am.isDerivedRoutingFrom(ApplicationMode.CAR))
&& !param.equals(GeneralRouter.VEHICLE_HEIGHT)
&& !param.equals(GeneralRouter.VEHICLE_WEIGHT)
&& !param.equals(GeneralRouter.VEHICLE_WIDTH)) {
&& !param.equals(GeneralRouter.VEHICLE_WIDTH)
&& !param.equals(GeneralRouter.VEHICLE_LENGTH)) {
otherRoutingParameters.add(routingParameter);
}
}
@ -253,7 +254,8 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
straightAngle.setPersistent(false);
straightAngle.setKey(settings.ROUTE_STRAIGHT_ANGLE.getId());
straightAngle.setTitle(getString(R.string.recalc_angle_dialog_title));
straightAngle.setSummary(String.format(getString(R.string.shared_string_angle_param), (int) am.getStrAngle()));
straightAngle.setSummary(String.format(getString(R.string.shared_string_angle_param),
String.valueOf((int) am.getStrAngle())));
straightAngle.setLayoutResource(R.layout.preference_with_descr);
straightAngle.setIcon(getRoutingPrefIcon("routing_recalc_distance")); //TODO change for appropriate icon when available
getPreferenceScreen().addPreference(straightAngle);

View file

@ -4,11 +4,11 @@ import android.content.Context;
import android.graphics.drawable.Drawable;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.activities.SettingsBaseActivity;
import net.osmand.plus.routing.RouteProvider.RouteService;
@ -26,6 +26,7 @@ import net.osmand.router.GeneralRouter.GeneralRouterProfile;
import java.util.Map;
import static net.osmand.plus.activities.SettingsNavigationActivity.showSeekbarSettingsDialog;
import static net.osmand.router.GeneralRouter.*;
public class VehicleParametersFragment extends BaseSettingsFragment implements OnPreferenceChanged {
@ -36,12 +37,7 @@ public class VehicleParametersFragment extends BaseSettingsFragment implements O
@Override
protected void setupPreferences() {
OsmandApplication app = getMyApplication();
if (app == null) {
return;
}
ApplicationMode mode = getSelectedAppMode();
Preference vehicleParametersInfo = findPreference("vehicle_parameters_info");
vehicleParametersInfo.setIcon(getContentIcon(R.drawable.ic_action_info_dark));
vehicleParametersInfo.setTitle(getString(R.string.route_parameters_info, mode.toHumanString()));
@ -51,21 +47,12 @@ public class VehicleParametersFragment extends BaseSettingsFragment implements O
GeneralRouter router = app.getRouter(mode);
if (router != null) {
GeneralRouterProfile routerProfile = router.getProfile();
Map<String, GeneralRouter.RoutingParameter> parameters = router.getParameters();
GeneralRouter.RoutingParameter vehicleHeight = parameters.get(GeneralRouter.VEHICLE_HEIGHT);
if (vehicleHeight != null) {
setupCustomRoutingPropertyPref(vehicleHeight, routerProfile);
}
GeneralRouter.RoutingParameter vehicleWeight = parameters.get(GeneralRouter.VEHICLE_WEIGHT);
if (vehicleWeight != null) {
setupCustomRoutingPropertyPref(vehicleWeight, routerProfile);
}
GeneralRouter.RoutingParameter vehicleWidth = parameters.get(GeneralRouter.VEHICLE_WIDTH);
if (vehicleWidth != null) {
setupCustomRoutingPropertyPref(vehicleWidth, routerProfile);
}
if (router.getProfile() != GeneralRouterProfile.PUBLIC_TRANSPORT) {
Map<String, RoutingParameter> parameters = router.getParameters();
setupCustomRoutingPropertyPref(parameters.get(VEHICLE_HEIGHT), routerProfile);
setupCustomRoutingPropertyPref(parameters.get(VEHICLE_WEIGHT), routerProfile);
setupCustomRoutingPropertyPref(parameters.get(VEHICLE_WIDTH), routerProfile);
setupCustomRoutingPropertyPref(parameters.get(VEHICLE_LENGTH), routerProfile);
if (routerProfile != GeneralRouterProfile.PUBLIC_TRANSPORT) {
setupDefaultSpeedPref();
}
}
@ -74,17 +61,16 @@ public class VehicleParametersFragment extends BaseSettingsFragment implements O
}
}
private void setupCustomRoutingPropertyPref(GeneralRouter.RoutingParameter parameter,
private void setupCustomRoutingPropertyPref(@Nullable RoutingParameter parameter,
GeneralRouterProfile routerProfile) {
OsmandApplication app = getMyApplication();
if (app == null) {
if (parameter == null) {
return;
}
String parameterId = parameter.getId();
String title = SettingsBaseActivity.getRoutingStringPropertyName(app, parameterId, parameter.getName());
String description = SettingsBaseActivity.getRoutingStringPropertyDescription(app, parameterId, parameter.getDescription());
String defValue = parameter.getType() == GeneralRouter.RoutingParameterType.NUMERIC
String description = SettingsBaseActivity.getRoutingStringPropertyDescription(app, parameterId,
parameter.getDescription());
String defValue = parameter.getType() == RoutingParameterType.NUMERIC
? ROUTING_PARAMETER_NUMERIC_DEFAULT : ROUTING_PARAMETER_SYMBOLIC_DEFAULT;
OsmandSettings.StringPreference pref = (OsmandSettings.StringPreference) app.getSettings()
.getCustomRoutingProperty(parameterId, defValue);
@ -125,10 +111,10 @@ public class VehicleParametersFragment extends BaseSettingsFragment implements O
return;
}
Preference defaultSpeedPref = new Preference(ctx);
defaultSpeedPref.setKey(GeneralRouter.DEFAULT_SPEED);
defaultSpeedPref.setKey(DEFAULT_SPEED);
defaultSpeedPref.setTitle(R.string.default_speed_setting_title);
defaultSpeedPref.setSummary(R.string.default_speed_setting_descr);
defaultSpeedPref.setIcon(getPreferenceIcon(GeneralRouter.DEFAULT_SPEED));
defaultSpeedPref.setIcon(getPreferenceIcon(DEFAULT_SPEED));
defaultSpeedPref.setLayoutResource(R.layout.preference_with_descr);
getPreferenceScreen().addPreference(defaultSpeedPref);
}
@ -136,7 +122,7 @@ public class VehicleParametersFragment extends BaseSettingsFragment implements O
@Override
protected void onBindPreferenceViewHolder(Preference preference, PreferenceViewHolder holder) {
super.onBindPreferenceViewHolder(preference, holder);
if (!GeneralRouter.DEFAULT_SPEED.equals(preference.getKey()) && preference instanceof ListPreferenceEx) {
if (!DEFAULT_SPEED.equals(preference.getKey()) && preference instanceof ListPreferenceEx) {
ImageView imageView = (ImageView) holder.findViewById(android.R.id.icon);
if (imageView != null) {
Object currentValue = ((ListPreferenceEx) preference).getValue();
@ -157,7 +143,7 @@ public class VehicleParametersFragment extends BaseSettingsFragment implements O
@Override
public boolean onPreferenceClick(Preference preference) {
if (preference.getKey().equals(GeneralRouter.DEFAULT_SPEED)) {
if (preference.getKey().equals(DEFAULT_SPEED)) {
RouteService routeService = getSelectedAppMode().getRouteService();
boolean defaultSpeedOnly = routeService == RouteService.STRAIGHT || routeService == RouteService.DIRECT_TO;
showSeekbarSettingsDialog(getActivity(), defaultSpeedOnly, getSelectedAppMode());
@ -194,14 +180,16 @@ public class VehicleParametersFragment extends BaseSettingsFragment implements O
private Drawable getPreferenceIcon(String prefId) {
switch (prefId) {
case GeneralRouter.DEFAULT_SPEED:
case DEFAULT_SPEED:
return getPersistentPrefIcon(R.drawable.ic_action_speed);
case GeneralRouter.VEHICLE_HEIGHT:
case VEHICLE_HEIGHT:
return getPersistentPrefIcon(R.drawable.ic_action_height_limit);
case GeneralRouter.VEHICLE_WEIGHT:
case VEHICLE_WEIGHT:
return getPersistentPrefIcon(R.drawable.ic_action_weight_limit);
case GeneralRouter.VEHICLE_WIDTH:
case VEHICLE_WIDTH:
return getPersistentPrefIcon(R.drawable.ic_action_width_limit);
case VEHICLE_LENGTH:
return getPersistentPrefIcon(R.drawable.ic_action_length_limit);
default:
return null;
}

View file

@ -7,6 +7,10 @@ import androidx.preference.DialogPreference;
import net.osmand.plus.R;
import net.osmand.plus.settings.bottomsheets.VehicleSizeAssets;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
public class SizePreference extends DialogPreference {
private String[] entries;
@ -85,7 +89,8 @@ public class SizePreference extends DialogPreference {
String persistedString = getValue();
if (!persistedString.equals(defaultValue)) {
try {
persistedString = String.valueOf(Float.parseFloat(persistedString) + 0.01f);
final DecimalFormat df = new DecimalFormat("#.####", new DecimalFormatSymbols(Locale.US));
persistedString = df.format(Float.parseFloat(persistedString) + 0.01f);
summary = String.format(getContext().getString(R.string.ltr_or_rtl_combine_via_space),
persistedString, getContext().getString(assets.getMetricShortRes()));
} catch (NumberFormatException e) {

View file

@ -5,6 +5,7 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
@ -24,7 +25,6 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import net.osmand.AndroidUtils;
import net.osmand.Location;
import net.osmand.binary.RouteDataObject;
import net.osmand.data.LatLon;
@ -62,6 +62,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static android.util.TypedValue.COMPLEX_UNIT_PX;
public class RouteInfoWidgetsFactory {
public NextTurnInfoWidget createNextInfoControl(final Activity activity,
@ -1230,32 +1232,32 @@ public class RouteInfoWidgetsFactory {
AndroidUiHelper.updateVisibility(layout, visible);
return true;
}
public void setVisibility(boolean visibility) {
layout.setVisibility(visibility ? View.VISIBLE : View.GONE);
}
}
public static class AlarmWidget {
public static class AlarmWidget {
private View layout;
private ImageView icon;
private TextView text;
private TextView bottomText;
private TextView widgetText;
private TextView widgetBottomText;
private OsmandSettings settings;
private RoutingHelper rh;
private MapViewTrackingUtilities trackingUtilities;
private OsmAndLocationProvider locationProvider;
private WaypointHelper wh;
private int imgId;
private String textString;
private String bottomTextString;
private String cachedText;
private String cachedBottomText;
public AlarmWidget(final OsmandApplication app, MapActivity ma) {
layout = ma.findViewById(R.id.map_alarm_warning);
icon = (ImageView) ma.findViewById(R.id.map_alarm_warning_icon);
text = (TextView) ma.findViewById(R.id.map_alarm_warning_text);
bottomText = (TextView) ma.findViewById(R.id.map_alarm_warning_text_bottom);
widgetText = (TextView) ma.findViewById(R.id.map_alarm_warning_text);
widgetBottomText = (TextView) ma.findViewById(R.id.map_alarm_warning_text_bottom);
settings = app.getSettings();
rh = ma.getRoutingHelper();
trackingUtilities = ma.getMapViewTrackingUtilities();
@ -1292,15 +1294,17 @@ public class RouteInfoWidgetsFactory {
String bottomText = "";
OsmandSettings.DrivingRegion region = settings.DRIVING_REGION.get();
boolean americanType = region.isAmericanTypeSigns();
if(alarm.getType() == AlarmInfoType.SPEED_LIMIT) {
if(region == OsmandSettings.DrivingRegion.CANADA) {
boolean isCanadianRegion = region == OsmandSettings.DrivingRegion.CANADA;
if (alarm.getType() == AlarmInfoType.SPEED_LIMIT) {
if (isCanadianRegion) {
locimgId = R.drawable.warnings_speed_limit_ca;
} else if(americanType){
bottomText = settings.SPEED_SYSTEM.get().toShortString(settings.getContext());
} else if (americanType) {
locimgId = R.drawable.warnings_speed_limit_us;
//else case is done by drawing red ring
//else case is done by drawing red ring
}
text = alarm.getIntValue() +"";
} else if(alarm.getType() == AlarmInfoType.SPEED_CAMERA) {
text = alarm.getIntValue() + "";
} else if (alarm.getType() == AlarmInfoType.SPEED_CAMERA) {
locimgId = R.drawable.warnings_speed_camera;
} else if(alarm.getType() == AlarmInfoType.BORDER_CONTROL) {
locimgId = R.drawable.warnings_border_control;
@ -1357,23 +1361,33 @@ public class RouteInfoWidgetsFactory {
}
}
if(visible) {
if(locimgId != imgId) {
if (locimgId != imgId) {
imgId = locimgId;
icon.setImageResource(locimgId);
}
if (!Algorithms.objectEquals(text, this.textString)) {
textString = text;
this.text.setText(this.textString);
if (alarm.getType() == AlarmInfoType.SPEED_LIMIT && americanType) {
this.text.setPadding(0, AndroidUtils.dpToPx(layout.getContext(), 20f), 0, 0);
Resources res = layout.getContext().getResources();
if (!Algorithms.objectEquals(text, cachedText)) {
cachedText = text;
widgetText.setText(cachedText);
if (alarm.getType() == AlarmInfoType.SPEED_LIMIT && americanType && !isCanadianRegion) {
int topPadding = res.getDimensionPixelSize(R.dimen.map_alarm_text_top_padding);
widgetText.setPadding(0, topPadding, 0, 0);
} else {
this.text.setPadding(0, 0, 0, 0);
widgetText.setPadding(0, 0, 0, 0);
}
}
if (!Algorithms.objectEquals(bottomText, this.bottomTextString)) {
bottomTextString = bottomText;
this.bottomText.setText(this.bottomTextString);
this.bottomText.setTextColor(ContextCompat.getColor(layout.getContext(),
if (!Algorithms.objectEquals(bottomText, cachedBottomText)) {
cachedBottomText = bottomText;
widgetBottomText.setText(cachedBottomText);
if (alarm.getType() == AlarmInfoType.SPEED_LIMIT && isCanadianRegion) {
int bottomPadding = res.getDimensionPixelSize(R.dimen.map_button_margin);
widgetBottomText.setPadding(0, 0, 0, bottomPadding);
widgetBottomText.setTextSize(COMPLEX_UNIT_PX, res.getDimensionPixelSize(R.dimen.map_alarm_bottom_si_text_size));
} else {
widgetBottomText.setPadding(0, 0, 0, 0);
widgetBottomText.setTextSize(COMPLEX_UNIT_PX, res.getDimensionPixelSize(R.dimen.map_alarm_bottom_text_size));
}
widgetBottomText.setTextColor(ContextCompat.getColor(layout.getContext(),
americanType ? R.color.color_black : R.color.color_white));
}
}