This commit is contained in:
GaidamakUA 2016-01-11 14:54:54 +02:00
commit 5362feabe1
69 changed files with 3481 additions and 574 deletions

View file

@ -51,9 +51,6 @@ public class EntityParser {
mo.setLocation(l.getLatitude(), l.getLongitude());
}
}
if (mo.getName().length() == 0) {
setNameFromOperator(mo, tags);
}
if (mo.getName().length() == 0) {
setNameFromRef(mo, tags);
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="500"
android:repeatCount="0"/>
</set>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="500"
android:repeatCount="0"/>
</set>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/popup_bg_color"/>
<corners android:radius="5dp"/>
</shape>

View file

@ -52,13 +52,13 @@
android:layout_gravity="start"
android:visibility="gone" >
<com.github.ksoichiro.android.observablescrollview.ObservableListView
<net.osmand.plus.views.controls.DynamicListView
android:id="@+id/dash_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/bg_color"
android:fadeScrollbars="true" >
</com.github.ksoichiro.android.observablescrollview.ObservableListView>
</net.osmand.plus.views.controls.DynamicListView>
</FrameLayout>
</LinearLayout>

View file

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/plan_route_info"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:background="@color/color_transparent">
<FrameLayout
android:id="@+id/plan_route_info"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_transparent"
android:clickable="true">
<LinearLayout
android:id="@+id/main_view"
@ -18,53 +19,47 @@
<LinearLayout
android:id="@+id/ModesLayout"
android:layout_width="fill_parent"
android:layout_height="@dimen/list_item_height"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:id="@+id/dividerModesLayout"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:background="@color/dashboard_divider_dark"
android:focusable="false"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="@dimen/list_item_height"
android:orientation="horizontal">
<LinearLayout
android:layout_width="fill_parent"
android:id="@+id/app_modes"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="left"
android:orientation="horizontal"/>
<LinearLayout
android:id="@+id/app_modes"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="left"
android:orientation="horizontal"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="@dimen/list_content_padding"
android:orientation="horizontal"
android:visibility="gone">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="@dimen/list_content_padding"
android:orientation="horizontal"
android:visibility="gone">
<ImageView
android:id="@+id/waypoints"
android:layout_width="@dimen/list_item_height"
android:layout_height="@dimen/list_item_height"
android:background="?attr/dashboard_button"
android:scaleType="center"
android:src="@drawable/map_action_waypoints"/>
</LinearLayout>
<ImageView
android:id="@+id/waypoints"
android:layout_width="@dimen/list_item_height"
android:layout_height="@dimen/list_item_height"
android:background="?attr/dashboard_button"
android:scaleType="center"
android:src="@drawable/map_action_waypoints"/>
</LinearLayout>
</FrameLayout>
</LinearLayout>
<View
android:id="@+id/dividerModesLayout"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dashboard_divider_dark"
android:focusable="false"/>
</LinearLayout>
<ScrollView
@ -252,8 +247,8 @@
android:id="@+id/Info"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/list_item_height"
android:background="?attr/dashboard_button"
android:minHeight="@dimen/list_item_height"
android:orientation="horizontal">
<ImageView
@ -269,9 +264,9 @@
android:id="@+id/InfoIcon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/list_content_padding"
android:layout_marginRight="@dimen/list_content_padding"
android:layout_gravity="center_vertical"
android:contentDescription="@string/info_button"
android:scaleType="center"
android:src="@drawable/ic_action_info_dark"/>
@ -309,9 +304,9 @@
android:id="@+id/DurationIcon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/list_content_padding"
android:layout_marginRight="@dimen/list_content_padding"
android:layout_gravity="center_vertical"
android:contentDescription="@string/info_button"
android:scaleType="center"
android:src="@drawable/ic_action_time"/>
@ -350,8 +345,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|left"
android:layout_weight="1"
android:layout_margin="8dp"
android:layout_weight="1"
android:textSize="@dimen/default_desc_text_size"/>
<ImageView

View file

@ -61,12 +61,12 @@
android:layout_height="wrap_content"
android:background="?attr/bg_color" />
<com.github.ksoichiro.android.observablescrollview.ObservableListView
<net.osmand.plus.views.controls.DynamicListView
android:id="@+id/dash_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadeScrollbars="true" >
</com.github.ksoichiro.android.observablescrollview.ObservableListView>
</net.osmand.plus.views.controls.DynamicListView>
</FrameLayout>
<include layout="@layout/dashboard_toolbar"/>

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:minHeight="40dp"
android:minHeight="48dp"
android:layout_marginBottom="5dp">
<ImageView
@ -24,15 +24,16 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:textSize="@dimen/default_list_text_size" />
android:textSize="@dimen/default_desc_text_size" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/default_list_text_size"
android:textColor="@color/sherpafy_selection"
android:textStyle="bold"
android:textSize="@dimen/default_desc_text_size"
android:textColor="@color/color_myloc_distance"
android:layout_gravity="center_vertical"
android:layout_marginRight="8dp" />
android:layout_marginRight="16dp" />
</LinearLayout>

View file

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:minHeight="50dp"
android:layout_marginBottom="5dp">
<LinearLayout
android:id="@+id/firstCellContainer"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:background="?attr/selectableItemBackground"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:text="@string/search_radius_proximity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textSize="@dimen/default_desc_text_size" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="@dimen/default_desc_text_size"
android:textColor="@color/color_myloc_distance"
android:layout_gravity="center_vertical"
android:layout_marginTop="2dp"
android:text="500 m"
android:layout_marginRight="16dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/secondCellContainer"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:background="?attr/selectableItemBackground"
android:orientation="vertical">
<TextView
android:id="@+id/titleEx"
android:text="@string/shared_string_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textSize="@dimen/default_desc_text_size" />
<TextView
android:id="@+id/descriptionEx"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="@dimen/default_desc_text_size"
android:textColor="@color/color_myloc_distance"
android:layout_gravity="center_vertical"
android:layout_marginTop="2dp"
android:text="Cinema"
android:layout_marginRight="16dp" />
</LinearLayout>
</LinearLayout>

View file

@ -11,7 +11,6 @@
android:id="@+id/context_menu_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:orientation="vertical">
<LinearLayout
@ -26,6 +25,7 @@
android:id="@+id/context_menu_top_shadow_all"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:background="?attr/bg_map_context_menu"
android:orientation="vertical">

View file

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/plan_route_info"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:background="@color/color_transparent">
<FrameLayout
android:id="@+id/plan_route_info"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_transparent"
android:clickable="true">
<LinearLayout
android:id="@+id/main_view"
@ -18,53 +19,46 @@
<LinearLayout
android:id="@+id/ModesLayout"
android:layout_width="fill_parent"
android:layout_height="@dimen/list_item_height"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:id="@+id/dividerModesLayout"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:background="@color/dashboard_divider_dark"
android:focusable="false"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="@dimen/list_item_height"
android:orientation="horizontal">
<LinearLayout
android:layout_width="fill_parent"
android:id="@+id/app_modes"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="left"
android:orientation="horizontal"/>
<LinearLayout
android:id="@+id/app_modes"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="left"
android:orientation="horizontal"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="@dimen/list_content_padding"
android:orientation="horizontal"
android:visibility="gone">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="@dimen/list_content_padding"
android:orientation="horizontal"
android:visibility="gone">
<ImageView
android:id="@+id/waypoints"
android:layout_width="@dimen/list_item_height"
android:layout_height="@dimen/list_item_height"
android:background="?attr/dashboard_button"
android:scaleType="center"
android:src="@drawable/map_action_waypoints"/>
</LinearLayout>
<ImageView
android:id="@+id/waypoints"
android:layout_width="@dimen/list_item_height"
android:layout_height="@dimen/list_item_height"
android:background="?attr/dashboard_button"
android:scaleType="center"
android:src="@drawable/map_action_waypoints"/>
</LinearLayout>
</FrameLayout>
</LinearLayout>
<View
android:id="@+id/dividerModesLayout"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dashboard_divider_dark"
android:focusable="false"/>
</LinearLayout>
<ScrollView
@ -252,8 +246,8 @@
android:id="@+id/Info"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/list_item_height"
android:background="?attr/dashboard_button"
android:minHeight="@dimen/list_item_height"
android:orientation="horizontal">
<ImageView
@ -269,9 +263,9 @@
android:id="@+id/InfoIcon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/list_content_padding"
android:layout_marginRight="@dimen/list_content_padding"
android:layout_gravity="center_vertical"
android:contentDescription="@string/info_button"
android:scaleType="center"
android:src="@drawable/ic_action_info_dark"/>
@ -309,9 +303,9 @@
android:id="@+id/DurationIcon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/list_content_padding"
android:layout_marginRight="@dimen/list_content_padding"
android:layout_gravity="center_vertical"
android:contentDescription="@string/info_button"
android:scaleType="center"
android:src="@drawable/ic_action_time"/>

View file

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/popup_bg"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingRight="16dp"
android:paddingLeft="16dp"
android:singleLine="true"
android:textColor="@color/popup_text_color"
android:text="Item deleted"
android:textSize="@dimen/default_list_text_size"/>
<View
android:layout_width="1dp"
android:layout_height="fill_parent"
android:layout_marginBottom="15dp"
android:layout_marginTop="15dp"
android:layout_weight="0"
android:background="@color/popup_separator_color"/>
<Button
android:id="@+id/undo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:background="?attr/selectableItemBackground"
android:text="UNDO"
android:textColor="@color/popup_text_color"/>
</LinearLayout>

View file

@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_marginBottom="5dp"
android:layout_marginRight="3dp"
android:paddingRight="16dp"
android:layout_marginTop="5dp"
android:gravity="center_vertical"
android:minHeight="40dp"
android:minHeight="48dp"
android:orientation="horizontal">
<ProgressBar
@ -17,16 +18,17 @@
android:layout_gravity="center_vertical"
android:layout_marginLeft="4dp"/>
<TextView
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/header_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="8dp"
android:layout_marginLeft="16dp"
android:layout_weight="1"
android:ellipsize="end"
android:singleLine="true"
android:textSize="@dimen/default_list_text_size_large"/>
style="@style/DashboardSubHeader"
osmand:typeface="@string/font_roboto_medium"/>
<include layout="@layout/check_item_rel"/>

View file

@ -3,63 +3,103 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/view_transparent_selection"
android:id="@+id/package_delivered_layout"
android:minHeight="48dp"
android:minHeight="50dp"
android:descendantFocusability="blocksDescendants">
<ImageView
android:id="@+id/waypoint_icon"
android:layout_marginLeft="8dp"
android:src="@drawable/ic_action_fav_dark"
android:layout_height="25dp"
android:layout_width="25dp"
android:layout_width="56dp"
android:layout_gravity="center_vertical" />
<TextView
android:id="@+id/waypoint_dist"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
android:layout_gravity="center_vertical"
android:textColor="@color/wpt_distance_color"
android:maxLines="2"
android:textStyle="bold"
android:textSize="@dimen/default_desc_text_size"/>
<TextView
android:id="@+id/waypoint_text"
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
android:maxLines="2"
android:ellipsize="end"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:textSize="@dimen/default_list_text_size" />
android:gravity="center"
android:layout_gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/waypoint_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="2"
android:ellipsize="end"
android:layout_gravity="center_vertical"
android:textSize="@dimen/default_list_text_size" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:orientation="horizontal">
<TextView
android:id="@+id/waypoint_dist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:textColor="@color/color_myloc_distance"
android:maxLines="1"
android:textSize="@dimen/default_sub_text_size"/>
<TextView
android:id="@+id/waypoint_desc_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxLines="1"
android:ellipsize="end"
android:layout_gravity="bottom"
android:layout_weight="1"
android:textColor="@color/secondary_text_dark"
android:textSize="@dimen/default_sub_text_size" />
</LinearLayout>
</LinearLayout>
<ImageButton
android:id="@+id/all_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="48dp"
android:layout_height="48dp"
android:contentDescription="@string/shared_string_more"
android:layout_gravity="center_vertical"
android:layout_marginRight="2dp"
android:visibility="gone"
android:focusable="false"
android:scaleType="center"
style="@style/Widget.AppCompat.ActionButton"
android:src="@drawable/ic_action_core_overflow_dark" />
android:src="@drawable/map_overflow_menu_white" />
<ImageButton
android:id="@+id/info_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="48dp"
android:layout_height="48dp"
android:contentDescription="@string/shared_string_close"
android:layout_gravity="center_vertical"
android:layout_marginRight="4dp"
android:layout_marginRight="2dp"
style="@style/Widget.AppCompat.ActionButton"
android:focusable="false"
android:src="@drawable/ic_action_gremove_dark" />
android:scaleType="center"
android:src="@drawable/ic_action_remove_dark" />
<ImageView
android:id="@+id/info_move"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_vertical"
android:layout_marginRight="2dp"
android:focusable="false"
android:clickable="false"
android:scaleType="center"
android:src="@drawable/ic_flat_list_dark"
android:tag="DragIcon"
android:visibility="gone"/>
</LinearLayout>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="switch_to_raster_map_to_see">Vektorové mapy toto místo neobsahují. Mapová data můžete stáhnout v Nastaveních (Spravovat mapové soubory), nebo se přepněte na online mapy.</string>
<string name="send_files_to_osm">Nahrát GPX soubory do OSM?</string>
@ -159,7 +160,7 @@
<string name="shared_string_rename">Přejmenovat</string>
<string name="poi_filter_nominatim">Online POI filtr \'Nominatim\'</string>
<string name="search_position_current_location_search">Hledané polohy…</string>
<string name="search_position_current_location_found">Poloha [nalezeno]</string>
<string name="search_position_current_location_found">Moje poloha [nalezeno]</string>
<string name="search_position_address">Adresy…</string>
<string name="search_position_favorites">Oblíbených…</string>
<string name="search_position_undefined">Nedefinováno</string>
@ -791,7 +792,7 @@
<string name="show_warnings_title">Dopravní upozornění…</string>
<string name="show_warnings_descr">Zobrazit omezení rychlosti, rychlostní radary, retardéry a řazení do pruhů</string>
<string name="map_widget_show_ruler">Měřítko</string>
<string name="map_widget_transparent">Průhledné ovládání</string>
<string name="map_widget_transparent">Průhledné nástroje</string>
<string name="email">E-mail</string>
<string name="layer_map_appearance">Nastavení obrazovky</string>
<string name="int_continuosly">Souvisle</string>
@ -1873,7 +1874,7 @@
<string name="no_address_found">Adresa nebyla určena</string>
<string name="looking_up_address">Vyhledávání adres</string>
<string name="route_distance">Vzdálenost:</string>
<string name="route_duration">Potřebný čas:</string>
<string name="route_duration">Čas:</string>
<string name="rendering_attr_horseRoutes_name">Stezka pro koně</string>
<string name="only_download_over_wifi">Stahovat jen přes WiFi</string>
<string name="no_location_permission">Aplikace nemá povolen přístup k poloze.</string>
@ -1883,4 +1884,33 @@
<string name="live_update">Okamžité aktualizace</string>
<string name="update_now">Aktualizovat nyní</string>
<string name="missing_write_external_storage_permission">Aplikace nemá povolen přístup k SD kartě</string>
</resources>
<string name="item_deleted">Položka smazána</string>
<string name="n_items_deleted">vymazaných položek</string>
<string name="shared_string_undo_all">VRÁTIT ZPĚT VŠE</string>
<string name="shared_string_type">Typ</string>
<string name="starting_point">Počáteční bod</string>
<string name="shared_string_not_selected">Nevybrané</string>
<string name="rec_split">Rozdělení nahrávky</string>
<string name="rec_split_title">Použít rozdělení nahrávání</string>
<string name="rec_split_desc">Přepsat záznamy když použité místo přesáhne velikost úložiště</string>
<string name="rec_split_clip_length">Délka záznamu</string>
<string name="rec_split_clip_length_desc">Délka každého záznamu nebude delší než zadaný interval</string>
<string name="rec_split_storage_size">Velikost úložiště</string>
<string name="rec_split_storage_size_desc">Velikost prostoru, který může být použit nahranými záznamy</string>
<string name="live_updates">Okamžité aktualizace</string>
<string name="available_maps">Dostupné mapy</string>
<string name="select_voice_provider">Zvolte hlasové pokyny</string>
<string name="select_voice_provider_descr">Vyberte nebo stáhněte hlasové pokyny pro váš jazyk</string>
<string name="impassable_road_desc">Vyberte cesty, které chcete vynechat při navigaci</string>
<string name="shared_string_sound">Zvuk</string>
<string name="last_update">Poslední aktualizace: %s</string>
<string name="update_time">Čas aktualizace</string>
<string name="updates_size">Velikost aktualizace</string>
<string name="last_map_change">Poslední změna mapy: %s</string>
<string name="hourly">Každou hodinu</string>
<string name="daily">Každý den</string>
<string name="weekly">Jednou týdně</string>
<string name="morning">Ráno</string>
<string name="Night">V noci</string>
<string name="select_month_and_country">Vyberte měsíc a krajinu</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="srtm_paid_version_msg">Overvej at købe Højdekurve udvidelsen (\'Contour lines\') på Google Play for at støtte den videre udvikling.</string>
<string name="av_def_action_video">Optag video</string>
<string name="av_def_action_audio">Optag audio</string>
@ -489,7 +490,7 @@
<string name="file_with_name_already_exist">Der eksisterer allerede en fil med samme navn.</string>
<string name="local_index_upload_gpx_description">Send GPX-filer til OSM netværket. De vil blive brugt til at forbedre kort.</string>
<string name="local_index_items_uploaded">%1$d af %2$d poster overført.</string>
<string name="local_index_items_uploaded">%1$d af %2$d emner overført.</string>
<string name="local_index_mi_upload_gpx">Send til OSM</string>
<string name="show_more_map_detail">Vis flere kortdetaljer</string>
<string name="favorite_home_category">Hjem</string>
@ -778,7 +779,7 @@
<string name="amenity_type_landuse">Arealanvendelse</string>
<string name="amenity_type_sustenance">Mad og drikke</string>
<string name="voice_is_not_available_msg">Stemmevejledning er ikke tilgængelig. Gå til \'Indstillinger\' → \'Generelt\' → \'Stemmevejledning\' og vælg eller hent en stemmevejledning.</string>
<string name="items_were_selected">{0} enheder valgt</string>
<string name="items_were_selected">{0} emner valgt</string>
<string name="filter_existing_indexes">Hentet</string>
<string name="fast_route_mode">Hurtigste rute</string>
<string name="fast_route_mode_descr">Aktiver for at beregne den hurtigste rute. Deaktiver for at beregne korteste rute </string>
@ -1613,7 +1614,7 @@
<string name="traffic_warning_calming">Trafikdæmpning</string>
<string name="traffic_warning_speed_camera">Fartkamera</string>
<string name="traffic_warning">Trafikadvarsel</string>
<string name="local_index_description">Klik på et eksisterende element for at se flere detaljer, langt tryk for at deaktivere eller slette. Aktuelle data på enhed (%1$s ledig):</string>
<string name="local_index_description">Klik på et eksisterende emne for at se flere detaljer, langt tryk for at deaktivere eller slette. Aktuelle data på enhed (%1$s ledig):</string>
<string name="text_size_descr">Vælg tekststørrelsen på kortet.</string>
<string name="text_size">Tekststørrelse</string>
<string name="fav_point_dublicate">Favoritnavn dublet</string>
@ -2209,8 +2210,8 @@
<string name="rec_split_desc">Omskriv klip når den brugte plads overstiger opbevaring størrelse</string>
<string name="rec_split_clip_length">Kliplængde</string>
<string name="rec_split_clip_length_desc">Længden af hver optaget klip bliver ikke længere end det angivne tidsinterval</string>
<string name="rec_split_storage_size">Opbevaring størrelse</string>
<string name="rec_split_storage_size_desc">Mængden af plads, der kan være besat af alle optagede klip</string>
<string name="rec_split_storage_size">Lagerplads</string>
<string name="rec_split_storage_size_desc">Mængden af lagerplads, der kan være optaget af alle optagne klip</string>
<string name="hourly">Time</string>
<string name="daily">Daglig</string>
<string name="weekly">Ugentlig</string>
@ -2218,4 +2219,10 @@
<string name="Night">Aften</string>
<string name="shared_string_not_selected">Ikke markeret</string>
</resources>
<string name="select_month_and_country">Vælg måned og land</string>
<string name="shared_string_type">Type</string>
<string name="starting_point">Udgangspunkt</string>
<string name="item_deleted">Emne slettet</string>
<string name="n_items_deleted">Emner slettet</string>
<string name="shared_string_undo_all">FORTRYD ALLE</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="no_address_found">Keine Adresse bekannt</string>
<string name="shared_string_near">Nähe</string>
<string name="regions">Regionen</string>
@ -1991,4 +1992,8 @@
<string name="Night">Nachts</string>
<string name="shared_string_not_selected">Nicht ausgewählt</string>
</resources>
<string name="select_month_and_country">Wähle Monat und Land</string>
<string name="shared_string_type">Typ</string>
<string name="starting_point">Startpunkt</string>
<string name="shared_string_undo_all">Alles rückgängig machen</string>
</resources>

View file

@ -202,17 +202,17 @@
<string name="poi_parking_entrance">Entrada del estacionamiento</string>
<string name="poi_garages">Garajes</string>
<string name="poi_public_transport_platform">Andén de transporte público</string>
<string name="poi_public_transport_platform_bus">Andén de colectivo</string>
<string name="poi_public_transport_platform_trolleybus">Andén de trolebús</string>
<string name="poi_public_transport_platform">Parada de transporte público</string>
<string name="poi_public_transport_platform_bus">Parada de colectivo</string>
<string name="poi_public_transport_platform_trolleybus">Parada de trolebús</string>
<string name="poi_bus_stop">Parada de colectivo</string>
<string name="poi_public_transport_stop_position">Punto de detención de transporte público</string>
<string name="poi_public_transport_platform_tram">Andén de tranvía</string>
<string name="poi_public_transport_platform_tram">Parada de tranvía</string>
<string name="poi_tram_stop">Parada de tranvía</string>
<string name="poi_public_transport_station">Estación de transporte público</string>
<string name="poi_bus_station">Estación de colectivo</string>
<string name="poi_railway_station">Estación de tren</string>
<string name="poi_railway_platform">Andén de tren</string>
<string name="poi_railway_platform">Parada de tren</string>
<string name="poi_halt">Parada de tren</string>
<string name="poi_subway_entrance">Entrada de subte</string>
<string name="poi_subway_station">Estación de subte</string>
@ -1017,8 +1017,8 @@
<string name="poi_recycling_fridge_and_freezer">Heladeras y congeladores</string>
<string name="poi_recycling_furniture">Muebles</string>
<string name="poi_recycling_diapers">Pañales</string>
<string name="poi_recycling_car_batteries">Baterías de autos</string>
<string name="poi_recycling_cars">Autos</string>
<string name="poi_recycling_car_batteries">Baterías de automóviles</string>
<string name="poi_recycling_cars">Automóviles</string>
<string name="poi_recycling_bicycles">Bicicletas</string>
<string name="poi_shower">Duchas</string>
@ -1659,7 +1659,7 @@
<string name="poi_diaper_no">Sin cambiador de pañales</string>
<string name="poi_diaper_room">Habitación para cambio de pañales</string>
<string name="poi_car_wash_no">Lavado de autos: No</string>
<string name="poi_car_wash_no">Sin lavadero de automóviles</string>
<string name="poi_maxstay">Estadía máxima</string>
@ -1944,8 +1944,8 @@
<string name="poi_service_bicycle_rental_no">No alquila bicicletas</string>
<string name="poi_service_bicycle_pump_yes">Infla de bicicletas</string>
<string name="poi_service_bicycle_pump_no">No infla bicicletas</string>
<string name="poi_service_bicycle_diy_yes">Autoservicio para bicicletas</string>
<string name="poi_service_bicycle_diy_no">Sin autoservicio de herramientas para bicicletas</string>
<string name="poi_service_bicycle_diy_yes">Con autoservicio para bicicletas</string>
<string name="poi_service_bicycle_diy_no">Sin autoservicio para bicicletas</string>
<string name="poi_service_bicycle_cleaning_yes">Limpia bicicletas</string>
<string name="poi_service_bicycle_cleaning_no">No limpia bicicletas</string>
<string name="poi_service_bicycle_chaintool_yes">Con herramientas para cadenas de bicicletas</string>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="rendering_attr_hideHouseNumbers_name">Ocultar números de casa</string>
<string name="copying_osmand_file_failed">Falló al copiar archivos</string>
@ -51,7 +52,7 @@
<string name="waypoint_visit_after">Visitar luego</string>
<string name="waypoint_visit_before">Visitar antes</string>
<string name="simulate_your_location">Simular su ubicación</string>
<string name="short_location_on_map">Lat %1$s\nLon %2$s</string>
<string name="short_location_on_map">Lat %1$s\n Lon %2$s</string>
<string name="tips_and_tricks_descr">Preguntas frecuentes, cambios recientes y otros</string>
<string name="routing_settings_2">Ajustes de navegación</string>
<string name="general_settings_2">Ajustes generales</string>
@ -1827,7 +1828,7 @@
<string name="offline_maps_and_navigation">Mapas y navegación
\nsin conexión</string>
<string name="commit_poi">Enviar PDI</string>
<string name="routing_attr_avoid_shuttle_train_name">Evitar tren de enlace</string>
<string name="routing_attr_avoid_shuttle_train_name">Evitar trenes de enlace</string>
<string name="routing_attr_avoid_shuttle_train_description">Evite tomar trenes de enlace</string>
<string name="plugin_settings">Complementos</string>
<string name="tab_title_basic">Básico</string>
@ -2022,7 +2023,7 @@
<string name="update_time">Tiempo de actualización</string>
<string name="rec_split">Dividir grabación</string>
<string name="rec_split">División de grabación</string>
<string name="rec_split_title">Usar la división de grabación</string>
<string name="rec_split_desc">Reescribir clips al exceder el espacio de almacenamiento utilizado</string>
<string name="rec_split_clip_length">Duración del clip</string>
@ -2032,10 +2033,16 @@
<string name="updates_size">Actualizaciones: %s</string>
<string name="last_map_change">Último cambio de mapa: %s</string>
<string name="hourly">Cada hora</string>
<string name="daily">Diariamente</string>
<string name="weekly">Semanalmente</string>
<string name="daily">Diario</string>
<string name="weekly">Semanal</string>
<string name="morning">Mañana</string>
<string name="Night">Noche</string>
<string name="shared_string_not_selected">No seleccionado</string>
</resources>
<string name="select_month_and_country">Elige mes y país</string>
<string name="shared_string_type">Tipo</string>
<string name="starting_point">Punto de partida</string>
<string name="item_deleted">Elemento borrado</string>
<string name="n_items_deleted">elementos borrados</string>
<string name="shared_string_undo_all">DESHACER TODO</string>
</resources>

View file

@ -75,7 +75,7 @@
<string name="poi_kitchen">Muebles de cocina</string>
<string name="poi_medical_supply">Artículos médicos</string>
<string name="poi_mobile_phone">Tienda de telefonía móvil</string>
<string name="poi_motorcycle">Motocicletas</string>
<string name="poi_motorcycle">Tienda de motocicletas</string>
<string name="poi_musical_instrument">Instrumentos musicales</string>
<string name="poi_newsagent">Agencia de noticias</string>
<string name="poi_optician">Óptica</string>
@ -378,7 +378,7 @@
<string name="poi_greengrocer">Verdulería</string>
<string name="poi_dairy">Alimentos frescos</string>
<string name="poi_vending_machine">Máquina expendedora</string>
<string name="poi_bicycle">Bicicletería</string>
<string name="poi_bicycle">Tienda de bicicletas</string>
<string name="poi_chemist">Higiene personal y del hogar</string>
<string name="poi_anime">Tienda de anime</string>
<string name="poi_boutique">Boutique de moda</string>
@ -392,7 +392,7 @@
<string name="poi_clothes_children">Ropa infantil</string>
<string name="poi_shoes">Zapatería</string>
<string name="poi_copyshop">Tienda de fotocopiado</string>
<string name="poi_curtain">Cortinas</string>
<string name="poi_curtain">Tienda de cortinas</string>
<string name="poi_doityourself">Mejoras para el hogar</string>
<string name="poi_fishing">Equipos de pesca</string>
<string name="poi_frame">Tienda de marcos</string>
@ -403,7 +403,7 @@
<string name="poi_radiotechnics">Tienda de radiotecnia</string>
<string name="poi_tobacco">Tabaquería</string>
<string name="poi_vacuum_cleaner">Aspiradoras</string>
<string name="poi_sewing">Costuras</string>
<string name="poi_sewing">Tienda de telas</string>
<string name="poi_grit_bin">Contenedor de arena</string>
<string name="poi_traffic_calming_cushion">Cojín</string>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="layer_map_appearance">Configurar pantalla</string>
<string name="show_lanes">Mostrar carriles</string>
@ -2037,4 +2038,10 @@
<string name="Night">Por la noche</string>
<string name="shared_string_not_selected">No seleccionado</string>
</resources>
<string name="select_month_and_country">Seleccione mes y país</string>
<string name="shared_string_type">Tipo</string>
<string name="starting_point">Punto de partida</string>
<string name="item_deleted">Elemento eliminado</string>
<string name="n_items_deleted">elementos eliminados</string>
<string name="shared_string_undo_all">DESHACER TODO</string>
</resources>

View file

@ -18,7 +18,7 @@
<string name="poi_ambulance_station">Station d\'ambulances</string>
<string name="poi_archaeological_site">Site archéologique</string>
<string name="poi_archery">Tir à l\'arc</string>
<string name="poi_architect">Architecte</string>
<string name="poi_architect">Cabinet d\'architecte</string>
<string name="poi_arts_centre">Centre artistique</string>
<string name="poi_artwork">Œuvre dart</string>
<string name="poi_athletics">Athlétisme</string>
@ -820,7 +820,7 @@
<string name="poi_wiki_lang_th">Wiki thaïlandais</string>
<string name="poi_camera">Appareils photos et lentilles</string>
<string name="poi_religious">Lieu de culte</string>
<string name="poi_barrier_entrance">Entrée</string>
<string name="poi_barrier_entrance">Passage ouvert dans un mur ou une barrière</string>
<string name="poi_entrance_main">Entrée principale</string>
<string name="poi_entrance">Entrée</string>
<string name="poi_entrance_exit">Sortie</string>
@ -874,7 +874,7 @@
<string name="poi_height_restrictor">Limiteur de hauteur</string>
<string name="poi_horse_stile">Échalier à chevaux</string>
<string name="poi_stile">Échalier</string>
<string name="poi_kissing_gate">Portillon à chicane</string>
<string name="poi_kissing_gate">Barrière sélective</string>
<string name="poi_sally_port">Poterne</string>
<string name="poi_swing_gate">Portillon pivotant</string>
<string name="poi_icn_ref">Noeud du réseau cycliste international</string>
@ -967,7 +967,7 @@
<string name="poi_seasonal_summer">Eté</string>
<string name="poi_seasonal_autumn">Automne</string>
<string name="poi_seasonal_winter">Hiver</string>
<string name="poi_animal_shelter_dog">Refuge pour chiens (chenil)</string>
<string name="poi_animal_shelter_dog">Refuge pour chiens</string>
<string name="poi_animal_shelter_cat">Refuge pour chats</string>
<string name="poi_animal_shelter_dog_cat">Refuge pour chiens et chats</string>
<string name="poi_animal_shelter_bird">Refuge pour oiseaux</string>
@ -1087,7 +1087,7 @@
<string name="poi_ele">Hauteur au dessus du niveau de la mer</string>
<string name="poi_start_date">Date de début</string>
<string name="poi_wheelchair">Fauteuil roulant</string>
<string name="poi_wheelchair_no">Fauteuil roulant interdit</string>
<string name="poi_wheelchair_no">Non accessible en fauteuil roulant</string>
<string name="poi_wheelchair_limited">Fauteuil roulant partiel</string>
<string name="poi_wholesale">Vente en gros</string>
@ -1217,10 +1217,10 @@
<string name="poi_internet_access_yes">Accès Internet : Oui</string>
<string name="poi_internet_access_no">Accès Internet : Non</string>
<string name="poi_content_water">Contenu : Eau</string>
<string name="poi_content_oil">Contenu : Pétrole</string>
<string name="poi_content_fuel">Contenu : Fioul</string>
<string name="poi_content_biomass">Contenu : Biomasse</string>
<string name="poi_content_water">Contenu : eau</string>
<string name="poi_content_oil">Contenu : pétrole</string>
<string name="poi_content_fuel">Contenu : fioul</string>
<string name="poi_content_biomass">Contenu : biomasse</string>
<string name="poi_trade_agricultural_supplies">Fournitures agricoles</string>
<string name="poi_trade_building_supplies">Fournitures pour la construction</string>
<string name="poi_inscription">Inscription</string>
@ -1324,8 +1324,8 @@
<string name="poi_diet_halal_only">Repas halal uniquement</string>
<string name="poi_diet_halal_yes">Plats halals</string>
<string name="poi_diet_halal_no">Plats halals : Non</string>
<string name="poi_takeaway_yes">A emporter</string>
<string name="poi_takeaway_only">A emporter uniquement</string>
<string name="poi_takeaway_yes">À emporter</string>
<string name="poi_takeaway_only">À emporter uniquement</string>
<string name="poi_cocktails_yes">Cocktails</string>
@ -1569,7 +1569,7 @@
<string name="poi_microbrewery_yes">Micro brasserie</string>
<string name="poi_microbrewery_no">Pas de micro brasserie</string>
<string name="poi_takeaway_no">Pas de vente à emporter</string>
<string name="poi_takeaway_no">Sur place</string>
<string name="poi_outdoor_seating_yes">Terrasse</string>
<string name="poi_outdoor_seating_no">Pas de terrasse</string>
<string name="poi_car_wash_no">Lavage auto : non</string>
@ -1822,4 +1822,54 @@
<string name="poi_parking_carports">Type : abri pour véhicules</string>
<string name="poi_parking_garage_boxes">Type : garages fermés</string>
<string name="poi_node_networks">Réseaux de randonnée/de cyclisme</string>
<string name="poi_ford_stepping_stones">Pierres de gué</string>
<string name="poi_traffic_calming_island">Îlot central</string>
<string name="poi_aerialway_pylon">Pylône de remontée mécanique</string>
<string name="poi_power_tower">Pylône électrique</string>
<string name="poi_power_pole">Poteau de ligne électrique</string>
<string name="poi_cooling_tower">Tour de refroidissement</string>
<string name="poi_lighting_tower">Pylône d\'éclairage</string>
<string name="poi_recycling_organic">Organique</string>
<string name="poi_recycling_white_goods">Produits blancs</string>
<string name="poi_recycling_hydrargyrum">Mercure</string>
<string name="poi_recycling_styrofoam">Mousse de polystyrène</string>
<string name="poi_recycling_plasterboard">Plaque de plâtre</string>
<string name="poi_brownfield">Friche industrielle</string>
<string name="poi_greenfield">Zone verte</string>
<string name="poi_bunker_silo">Silo couloir</string>
<string name="poi_paediatrics">Pédiatrie</string>
<string name="poi_tourism_yes">Objet touristique</string>
<string name="poi_religion_unitarian_universalist">Universaliste unitarien</string>
<string name="poi_religion_multifaith">Multiconfessionnelle</string>
<string name="poi_religion_jain">Jaïniste</string>
<string name="poi_religion_bahai">Bahaïste</string>
<string name="poi_religion_tenrikyo">Tenrikyō</string>
<string name="poi_religion_zoroastrian">Zoroastrisme</string>
<string name="poi_denomination_sunni">Sunnisme</string>
<string name="poi_denomination_shia">Chiisme</string>
<string name="poi_denomination_uniting">Unifiée</string>
<string name="poi_denomination_mennonite">Mennonitisme</string>
<string name="poi_denomination_nondenominational">Sans dénomination</string>
<string name="poi_denomination_congregational">Congrégationaliste</string>
<string name="poi_denomination_dutch_reformed">Église réformée néerlandaise</string>
<string name="poi_denomination_ethiopian_orthodox_tewahedo">Église éthiopienne orthodoxe</string>
<string name="poi_denomination_unitarian">Unitariste</string>
<string name="poi_denomination_coptic_orthodox">Église copte orthodoxe</string>
<string name="poi_denomination_wesleyan">Wesleyaniste</string>
<string name="poi_denomination_shaktism">Shakti</string>
<string name="poi_denomination_shingon_shu">Shingon</string>
<string name="poi_denomination_mahayana">Bouddhiste mahāyāna</string>
<string name="poi_debris">Gravats</string>
<string name="poi_jersey_barrier">Mur Jersey</string>
<string name="poi_vk">VKontakte</string>
<string name="poi_content_silage">Contenu : ensilage</string>
<string name="poi_content_manure">Contenu : fumier</string>
<string name="poi_nudism_permissive">Nudisme autorisé</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="offline_edition">Modifications hors-ligne</string>
<string name="offline_edition_descr">Toujours utiliser l\'édition hors-ligne</string>
@ -2097,4 +2098,17 @@
<string name="morning">Matin</string>
<string name="Night">Nuit</string>
</resources>
<string name="select_month_and_country">Choisissez un mois et un pays</string>
<string name="item_deleted">Élément supprimé</string>
<string name="n_items_deleted">Éléments supprimés</string>
<string name="shared_string_undo_all">Tout annuler</string>
<string name="starting_point">Point de départ</string>
<string name="rec_split">Intervalle d\'enregistrement</string>
<string name="rec_split_title">Utiliser un intervalle d\'enregistrement</string>
<string name="rec_split_desc">Écraser les enregistrements quand l\'espace utilisé dépasse la capacité de stockage</string>
<string name="rec_split_clip_length">Durée de l\'enregistrement</string>
<string name="rec_split_clip_length_desc">La longueur de chaque enregistrement ne sera plus par intervalle de temps</string>
<string name="rec_split_storage_size">Espace de stockage</string>
<string name="rec_split_storage_size_desc">Espace maximum alloué pour tous les enregistrements</string>
<string name="shared_string_type">Type</string>
</resources>

View file

@ -802,4 +802,18 @@
<string name="poi_aeroway_terminal">Terminal aeroportuaria</string>
<string name="poi_water_works">Obras hidráulicas</string>
<string name="poi_cooling_tower">Torre de refrixeración</string>
<string name="poi_trash_disposal">Eliminación de lixo</string>
<string name="poi_landuse">Uso do solo</string>
<string name="poi_accomodation">Aloxamento</string>
<string name="poi_farm">Produtos agrícolas polos labregos</string>
<string name="poi_greengrocer">Tenda de verduras</string>
<string name="poi_confectionery">Pastelaría</string>
<string name="poi_pastry">Confeitaría</string>
<string name="poi_vending_machine">Máquina vendedora</string>
<string name="poi_baby_goods">Produtos de bebés</string>
<string name="poi_furnace">Tenda de calefacción</string>
<string name="poi_garden_furniture">Mobiliario do xardín</string>
<string name="poi_glaziery">Tenda de vidro</string>
<string name="poi_tableware">Tenda de vaixela</string>
<string name="poi_ticket">Billeteira</string>
</resources>

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,138 @@
<?xml version='1.0' encoding='utf-8'?>
<resources><string name="poi_shop_food">חנות מזון</string>
<string name="poi_shop">חנות</string>
<string name="poi_emergency">שרותי חירום</string>
<string name="poi_transportation">תחבורה</string>
<string name="poi_road_obstacle">חסימות דרכים</string>
<string name="poi_filling_station">תחנת דלק</string>
<string name="poi_personal_transport">תחבורה אישית</string>
<string name="poi_public_transport">תחבורה ציבורית</string>
<string name="poi_air_transport">תחבורה אווירית</string>
<string name="poi_water_transport">תחבורה ימית</string>
<string name="poi_bicycle_transport">רכיבת אופניים</string>
<string name="poi_aerialway_transport">תחבורת כבלים</string>
<string name="poi_node_networks">רשת נקודות הליכה/רכיבה</string>
<string name="poi_hiking_routes">שבילי הליכה</string>
<string name="poi_traffic_enforcement">גורמי אכיפה תחבורתיים</string>
<string name="poi_man_made">מעשה ידי אדם</string>
<string name="poi_transport_construction">אמצעי תחבורה בבניה</string>
<string name="poi_water_supply">אספקת מים</string>
<string name="poi_power">תחנות כח</string>
<string name="poi_communication">תקשורת</string>
<string name="poi_trash_disposal">אתר פינוי אשפה</string>
<string name="poi_landuse">שימושי קרקע</string>
<string name="poi_education">חינוך</string>
<string name="poi_administrative">אדמניסטרטיבי</string>
<string name="poi_healthcare">בריאות</string>
<string name="poi_office">משרד</string>
<string name="poi_sport">ספורט</string>
<string name="poi_tourism">תיירות</string>
<string name="poi_sightseeing">אתרים</string>
<string name="poi_accomodation">לינה</string>
<string name="poi_internet_access">גישה לאינטרנט</string>
<string name="poi_entertainment">בילוי</string>
<string name="poi_club">מועדון</string>
<string name="poi_sustenance">מזון</string>
<string name="poi_cafe_and_restaurant">בית קפה ומסעדות</string>
<string name="poi_service">שרותים</string>
<string name="poi_craft">מלאכת יד</string>
<string name="poi_finance">פיננסים</string>
<string name="poi_natural">טבע</string>
<string name="poi_seamark">נקודת ציון ימית</string>
<string name="poi_military">צבא</string>
<string name="poi_osmwiki">ויקיפדיה</string>
<string name="poi_user_defined_other">אחר (מוגדר על ידי המשתמש)</string>
<string name="poi_palaeontological_site">אתר פליאונטולוגי</string>
<string name="poi_bakery">מאפיה</string>
<string name="poi_alcohol">חנות משקאות</string>
<string name="poi_cheese">חנות גבינות</string>
<string name="poi_chocolate">חנות שוקולד</string>
<string name="poi_coffee">חנות קפה</string>
<string name="poi_convenience">חנות נוחות</string>
<string name="poi_mall">מרכז קניות</string>
<string name="poi_beverages">חנות משקאות</string>
<string name="poi_butcher">שוק בשר</string>
<string name="poi_deli">מעדניה</string>
<string name="poi_farm">חנות מוצרי חווה</string>
<string name="poi_seafood">חנות מאכלי ים</string>
<string name="poi_ice_cream">גלידריה</string>
<string name="poi_supermarket">סופרמרקט</string>
<string name="poi_tea">חנות תה</string>
<string name="poi_pasta">חנות פסטה</string>
<string name="poi_pastry">חנות מאפים</string>
<string name="poi_dairy">חלביה</string>
<string name="poi_vending_machine">מכונת ממכר אוטומטית</string>
<string name="poi_wine">חנות יין</string>
<string name="poi_books">חנות ספרים</string>
<string name="poi_bicycle">חנות אופניים</string>
<string name="poi_anime">חנות אנימה</string>
<string name="poi_antiques">חנות עתיקות</string>
<string name="poi_art">גלריה</string>
<string name="poi_baby_goods">מוצרי תינוקות</string>
<string name="poi_bag">חנות תיקים</string>
<string name="poi_bathroom_furnishing">חנות מוצרי אמבטיה</string>
<string name="poi_bed">חנות מיטות</string>
<string name="poi_boutique">חנות אופנה</string>
<string name="poi_camera">חנות מצלמות</string>
<string name="poi_carpet">חנות שטיחים</string>
<string name="poi_charity">תרומות וסיוע</string>
<string name="poi_chemist">בית מרקחת</string>
<string name="poi_clothes">חנות בגדים</string>
<string name="poi_clothes_children">חנות בגדי ילדים</string>
<string name="poi_shoes">חנות נעליים</string>
<string name="poi_candles">חנות נרות</string>
<string name="poi_computer">חנות מחשבים</string>
<string name="poi_copyshop">ציוד משרדי והעתקות</string>
<string name="poi_curtain">חנות וילונות</string>
<string name="poi_fabric">חנות בדים</string>
<string name="poi_dive">ציוד צלילה</string>
<string name="poi_doityourself">עשה זאת בעצמך</string>
<string name="poi_doors">חנות דלתות</string>
<string name="poi_erotic">חנות סקס</string>
<string name="poi_fashion">חנות אופנה</string>
<string name="poi_fishing">ציוד דייג</string>
<string name="poi_florist">חנות פרחים</string>
<string name="poi_frame">חנות מסגרות</string>
<string name="poi_furnace">חנות תנורים</string>
<string name="poi_furniture">חנות רהיטים</string>
<string name="poi_garden_centre">מרכז גינון</string>
<string name="poi_garden_furniture">רהיטי גן</string>
<string name="poi_gas">חנות גז</string>
<string name="poi_general">כל-בו</string>
<string name="poi_gift">חנות מתנות</string>
<string name="poi_hifi">חנות מערכות סטראו</string>
<string name="poi_houseware">חנות מוצרי בית</string>
<string name="poi_hunting">ציוד צייד</string>
<string name="poi_interior_decoration">חנות עיצוב פנים</string>
<string name="poi_jewelry">חנות תכשיטים</string>
<string name="poi_kiosk">קיוסק</string>
<string name="poi_kitchen">רהיטי וציוד מטבח</string>
<string name="poi_leather">חנות מוצרי עור</string>
<string name="poi_medical_supply">אספקה רפואית</string>
<string name="poi_mobile_phone">חנות טלפונים ניידים</string>
<string name="poi_motorcycle">חנות אופנועים</string>
<string name="poi_music">חנות מוסיקה</string>
<string name="poi_musical_instrument">חנות כלי נגינה</string>
<string name="poi_newsagent">סוכנות חדשות</string>
<string name="poi_optician">אופטומטריסט</string>
<string name="poi_organic">חנות מזון אורגני</string>
<string name="poi_outdoor">חנות ציוד טבע</string>
<string name="poi_paint">חנות ציור</string>
<string name="poi_pet">חנות בעלי חיים</string>
<string name="poi_photo">צלמניה</string>
<string name="poi_radiotechnics">חנות אלקטרוניקה</string>
<string name="poi_second_hand">חנות יד שניה</string>
<string name="poi_scuba_diving_shop">חנות ציוד צלילה</string>
<string name="poi_sports">מוצרי ספורט</string>
<string name="poi_stationery">מוצרי סדקית</string>
<string name="poi_tableware">חנות כלי שולחן</string>
<string name="poi_ticket">משרד כרטיסים</string>
<string name="poi_tobacco">חנות עישון</string>
<string name="poi_toys">חנות צעצועים</string>
<string name="poi_trade">חנות מסחר</string>
<string name="poi_tyres">חנות צמיגים</string>
<string name="poi_vacuum_cleaner">חנות שואבי אבק</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="shared_string_no">לא</string>
<string name="shared_string_yes">כן</string>
<string name="close_changeset">סגירת ערכת השינויים</string>
@ -1103,7 +1104,7 @@
<string name="use_kalman_filter_compass_descr">ניתן להשתמש במסנן קלמן למניעת סטיות מצפן</string>
<string name="local_indexes_cat_srtm">נתוני קווי מתאר</string>
<string name="wait_current_task_finished">נא להמתין להשלמת המשימה הנוכחית</string>
<string name="shared_string_downloading">"בהורדה …"</string>
<string name="shared_string_downloading">בהורדה</string>
<string name="delete_point">מחיקת נקודה</string>
<string name="plugin_distance_point_time">זמן</string>
<string name="plugin_distance_point_hdop">דיוק</string>
@ -1132,4 +1133,44 @@
<string name="please_select_address">נא לבחור בעיר או ברחוב תחילה</string>
<string name="context_menu_item_destination_point">הגדרה כיעד</string>
<string name="destination_point">יעד %1$s</string>
</resources>
<string name="available_maps">מפות זמינות</string>
<string name="item_deleted">הפריט נמחק</string>
<string name="n_items_deleted">פריטים נמחקו</string>
<string name="shared_string_type">סוג</string>
<string name="starting_point">נקודת המוצא</string>
<string name="shared_string_not_selected">לא נבחר</string>
<string name="rec_split_clip_length">אורך סרטון</string>
<string name="rec_split_clip_length_desc">האורך של כל סרטון מוקלט לא יהיה גדול ממרווח הזמן המוגדר</string>
<string name="rec_split_storage_size_desc">כמות המקום המותרת לאחסון כל הסרטונים המוקלטים</string>
<string name="live_updates">עדכונים חיים</string>
<string name="select_voice_provider">בחירת הנחיה קולית</string>
<string name="select_voice_provider_descr">יש לבחור או להוריד הנחיה קולית עבור שפתך</string>
<string name="impassable_road_desc">בחירת דרכים מהן יש להמנע במהלך הניווט</string>
<string name="shared_string_sound">קול</string>
<string name="no_location_permission">ליישום אין הרשאה להשתמש במידע מיקום.</string>
<string name="no_camera_permission">ליישום אין הרשאה להשתמש במצלמה.</string>
<string name="no_microphone_permission">ליישום אין הרשאה להשתמש במיקרופון.</string>
<string name="route_distance">מרחק:</string>
<string name="route_duration">זמן:</string>
<string name="shared_string_near">ליד</string>
<string name="shared_string_undo_all">ביטול הכל</string>
<string name="rec_split">פיצול הקלטות</string>
<string name="rec_split_title">שימוש בפיצול הקלטות</string>
<string name="rec_split_desc">דרוס סרטונים קיימים אם המקום הנדרש עולה על כמות המקום המוקצה</string>
<string name="rec_split_storage_size">הקצאת מקום</string>
<string name="no_address_found">לא נקבעה כתובת</string>
<string name="shared_string_hide">הסתרה</string>
<string name="av_video_quality_low">איכות וידאו נמוכה</string>
<string name="av_video_quality_high">איכות וידאו גבוהה</string>
<string name="av_video_quality">איכות וידאו</string>
<string name="av_video_quality_descr">בחירה רמת האיכות לוידאו</string>
<string name="av_audio_format">פורמט שמע</string>
<string name="av_audio_format_descr">בחירת הפורמט להקלטת שמע</string>
<string name="av_audio_bitrate">קצב סיביות להקלטת שמע</string>
<string name="av_audio_bitrate_descr">בחירת קצב הסיביות להקלטת שמע</string>
<string name="please_specify_poi_type_only_from_list">נא לבחור את סוג נקודת העניין מהרשימה</string>
<string name="access_from_map_description">כפתור התפריט מציג את לוח המחוונים ולא את התפריט</string>
<string name="access_from_map">גישה מתצוגת המפה</string>
<string name="show_on_start_description">במצב כבוי תוצג המפה מיד עם הכניסה ליישום</string>
<string name="show_on_start">תצוגה בכניסה ליישום</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="send_files_to_osm">GPX fájl küldése OSM-re?</string>
<string name="gpx_visibility_txt">Láthatóság</string>
<string name="gpx_tags_txt">Címkék</string>
@ -179,7 +180,7 @@
<string name="poi_filter_nominatim">Online Nominatim</string>
<string name="search_position_current_location_search">Pozíció keresése…</string>
<string name="search_position_current_location_found">Pozíció [Megtalálva]</string>
<string name="search_position_current_location_found">Pozícióm (megtalálva)</string>
<string name="search_position_address">Cím…</string>
<string name="search_position_favorites">Kedvencek…</string>
<string name="search_position_undefined">Meghatározatlan</string>
@ -878,7 +879,7 @@
<string name="map_widget_show_ruler">Lépték</string>
<string name="map_widget_view_direction">Látómező</string>
<string name="map_widget_transparent">Átlátszó téma</string>
<string name="map_widget_transparent">Átlátszó gombok</string>
<string name="gps_wakeup_interval">GPS helymeghatározási időköz: %s</string>
@ -2067,4 +2068,14 @@
<string name="update">Frissítési gyakoriság</string>
<string name="missing_write_external_storage_permission">Az alkalmazásnak nincs jogosultsága elérni az SD kártyát.</string>
<string name="last_update">Utolsó frissítés: %s</string>
</resources>
<string name="shared_string_not_selected">Nincs kiválasztva</string>
<string name="update_time">Frissítés ideje</string>
<string name="updates_size">Frissítés mérete</string>
<string name="last_map_change">Utolsó térképmódosítás: %s</string>
<string name="hourly">Óránként</string>
<string name="daily">Naponta</string>
<string name="weekly">Hetente</string>
<string name="morning">Reggel</string>
<string name="Night">Este</string>
<string name="select_month_and_country">Hónap és ország kiválasztása</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="use_fluorescent_overlays">Sovrapposizioni fluorescenti</string>
<string name="use_fluorescent_overlays_descr">Usa colori fluorescenti per visualizzare tracce e percorsi</string>
<string name="offline_edition">Modifiche offline</string>
@ -2131,4 +2132,10 @@
<string name="Night">Notte</string>
<string name="shared_string_not_selected">Non selezionato</string>
</resources>
<string name="shared_string_type">Tipo</string>
<string name="starting_point">Punto di partenza</string>
<string name="select_month_and_country">Scegli il mese e lo stato</string>
<string name="item_deleted">Oggetto cancellato</string>
<string name="n_items_deleted">oggetti cancellati</string>
<string name="shared_string_undo_all">Annulla tutto</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="local_indexes_cat_av">زانیاری دەنگ/ڤیدیۆ</string>
<string name="stop_routing_confirm">دڵنیای له وەی که ئه ته وێت ناڤیگێشن راگریت</string>
@ -64,4 +65,6 @@
<string name="shared_string_and">û</string>
<string name="shared_string_edit">Sazkirin</string>
<string name="available_maps">Nexeyen kû hane</string>
</resources>
<string name="rendering_category_details">Berfireh</string>
<string name="rendering_category_hide">Veşera</string>
</resources>

View file

@ -36,4 +36,53 @@
<string name="poi_curtain">पडद्याचे दुकान</string>
<string name="poi_florist">फुलांचे दुकान</string>
<string name="poi_furniture">फर्निचर</string>
<string name="poi_judo">ज्युदो</string>
<string name="poi_badminton">बॅडमिंटन</string>
<string name="poi_microwave_oven_yes">मायक्रोव्हेव ओवन: हो</string>
<string name="poi_microwave_oven_no">मायक्रोव्हेव ओवन: नाही</string>
<string name="poi_billiards">बिलियर्डस</string>
<string name="poi_sustenance">खाद्य</string>
<string name="poi_finance">आर्थिक</string>
<string name="poi_military">सैन्य</string>
<string name="poi_confectionery">मिठाई</string>
<string name="poi_ice_cream">आइसक्रीम पार्लर</string>
<string name="poi_shoes">चपलांचे दुकान</string>
<string name="poi_candles">मेणबत्त्यांचे दुकान</string>
<string name="poi_doors">दरवाजे</string>
<string name="poi_gift">भेटवस्तूंचे दुकान</string>
<string name="poi_herbalist">वनौषधी दुकान</string>
<string name="poi_hunting">शिकारीचे साहित्य</string>
<string name="poi_jewelry">दागिन्याचे दुकान</string>
<string name="poi_medical_supply">वैद्यकीय पुरवठा</string>
<string name="poi_musical_instrument">वाद्ये</string>
<string name="poi_music">संगीत दुकान</string>
<string name="poi_paint">रंगाचे दुकान</string>
<string name="poi_pet">पाळीव प्राण्यांचे दुकान</string>
<string name="poi_toys">खेळण्यांचे दुकान</string>
<string name="poi_cosmetics">सौंदर्य प्रसाधने</string>
<string name="poi_watches">घड्याळांचे दुकान</string>
<string name="poi_weapons">शस्त्रांचे दुकान</string>
<string name="poi_police">पोलिस</string>
<string name="poi_village">गाव</string>
<string name="poi_town">तालुका</string>
<string name="poi_city">शहर</string>
<string name="poi_fireworks">फटाक्यांचे दुकान</string>
<string name="poi_aerialway_length">लांबी</string>
<string name="poi_wiki_lang_ne">नेपाळी विकि</string>
<string name="poi_wiki_lang_gu">गुजराती विकि</string>
<string name="poi_wiki_lang_pnb">पंजाबी विकि</string>
<string name="poi_wiki_lang_ur">उर्दु विकि</string>
<string name="poi_wiki_lang_ta">तामिळ विकि</string>
<string name="poi_wiki_lang_ml">मल्ल्याळम विकि</string>
<string name="poi_wiki_lang_mr">मराठी विकि</string>
<string name="poi_wiki_lang_la">लॅटिन विकि</string>
<string name="poi_wiki_lang_bn">बंगाली विकि</string>
<string name="poi_temperature">तापमान</string>
<string name="poi_building_type_church">इमारत प्रकार: चर्च</string>
<string name="poi_building_type_mosque">इमारत प्रकार: मशिद</string>
<string name="poi_building_type_temple">इमारत प्रकार: मंदिर</string>
<string name="poi_square">चौक</string>
</resources>

View file

@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources><string name="left_side_navigation">डाव्या बाजूने ड्रायव्हिंग</string>
<?xml version='1.0' encoding='utf-8'?>
<resources><string name="left_side_navigation">डाव्या बाजूने ड्रायव्हिंग</string>
<string name="unknown_location">अजून स्थान माहित नाही</string>
<string name="modify_transparency">पारदर्शकता बदला ( - पारदर्शक, २५५ - अपारदर्शक)</string>
<string name="confirm_interrupt_download">फाइल डाउनलोड थांबवायचे का?</string>
<string name="local_indexes_cat_tile">ऑनलाइन नकाशे (टाइल्स)</string>
<string name="local_indexes_cat_map">ऑफलाइन नकाशे (वेक्टर)</string>
<string name="local_indexes_cat_map">साधारण नकाशे (वेक्टर)</string>
<string name="map_online_data">ऑनलाइन नकाशे (टाइल्स)</string>
<string name="map_online_data_descr">ऑनलाइन नकाशे वापरा (डाउनलोड करून एसडी कार्ड वार साठवा)</string>
<string name="shared_string_online_maps">ऑनलाइन नकाशे</string>
@ -78,10 +79,10 @@
<string name="index_name_europe">युरोप</string>
<string name="index_name_france">युरोप - फ्रान्स</string>
<string name="index_name_germany">युरोप - जर्मनी</string>
<string name="index_name_russia">युरोप/आशिया - रशिया</string>
<string name="index_name_russia">रशिया</string>
<string name="index_name_africa">अफ्रिका</string>
<string name="index_name_asia">आशिया</string>
<string name="index_name_oceania">ओशेनिया</string>
<string name="index_name_oceania">ऑस्ट्रेलिया आणि ओशेनिया</string>
<string name="amenity_type_osmwiki">विकिपेडिया (ऑफलाइन)</string>
<string name="routing_settings">दिशादर्शन</string>
@ -109,7 +110,7 @@
<string name="shared_string_rename">नाव बदला</string>
<string name="search_position_current_location_search">स्थान शोधत आहे …</string>
<string name="search_position_current_location_found">स्थान (सापडले)</string>
<string name="search_position_current_location_found">माझे स्थान (सापडले)</string>
<string name="search_position_address">पत्ता …</string>
<string name="search_position_favorites">आवडती ठिकाणे…</string>
@ -353,7 +354,7 @@
<string name="please_select_address">प्रथम शहर किंवा रस्ता निवडा</string>
<string name="plugin_distance_point_time">वेळ</string>
<string name="plugin_distance_point_hdop">अचूकपणा</string>
<string name="street_name">रस्त</string>
<string name="street_name">रस्त्याचे नाव</string>
<string name="hno">घर क्रमांक</string>
<string name="select_address_activity">पत्ता निवडा</string>
<string name="map_widget_gps_info">जिपिएस माहिती</string>
@ -384,8 +385,8 @@
<string name="download_select_map_types">इतर नकाशे</string>
<string name="download_roads_only_item">फक्त रस्ते</string>
<string name="download_regular_maps">साधारण नकाश</string>
<string name="download_roads_only_maps">फक्त रस्त्याचे नकाशे</string>
<string name="download_regular_maps">साधारण नकाश</string>
<string name="download_roads_only_maps">फक्त रस्त्याचा नकाशा</string>
<string name="rendering_attr_noAdminboundaries_name">सीमा लपवा</string>
<string name="map_widget_max_speed">वेग मर्यादा</string>
@ -508,4 +509,4 @@
<string name="welmode_download_maps">नकाशे डाउनलोड करा</string>
<string name="current_route">सद्ध्याचा मार्ग</string>
<string name="shared_string_do_not_use">वापरू नका</string>
</resources>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="layer_map_appearance">Configureer scherm</string>
<string name="show_lanes">Toon rijstroken</string>
@ -2156,4 +2157,10 @@
<string name="Night">\'s avonds</string>
<string name="shared_string_not_selected">Niet geselecteerd</string>
</resources>
<string name="select_month_and_country">Kies maand en kaart</string>
<string name="starting_point">Startpunt</string>
<string name="shared_string_type">Type</string>
<string name="item_deleted">Item verwijderd</string>
<string name="n_items_deleted">items verwijderd</string>
<string name="shared_string_undo_all">Alles terugzetten</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources><string name="shared_string_my_places">Meus locais</string>
<?xml version='1.0' encoding='utf-8'?>
<resources><string name="shared_string_my_places">Meus locais</string>
<string name="days_behind">dias atrás</string>
<string name="watch">Ver</string>
<string name="rendering_attr_pisteGrooming_name">Pista de preparação</string>
@ -1984,4 +1985,10 @@
<string name="morning">Pela manhã</string>
<string name="Night">À noite</string>
<string name="shared_string_not_selected">Nada selecionado</string>
</resources>
<string name="select_month_and_country">Selecione o mês e o país</string>
<string name="shared_string_type">Tipo</string>
<string name="starting_point">Ponto de partida</string>
<string name="item_deleted">Item apagado</string>
<string name="n_items_deleted">itens apagados</string>
<string name="shared_string_undo_all">DESFAZER TUDO</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources><string name="amenity_type_administrative">Administrativo</string>
<?xml version='1.0' encoding='utf-8'?>
<resources><string name="amenity_type_administrative">Administrativo</string>
<string name="amenity_type_barrier">Barreira</string>
<string name="amenity_type_education">Educação</string>
<string name="amenity_type_emergency">Emergência</string>
@ -1967,4 +1968,10 @@ Afghanistan, Albania, Algeria, Andorra, Angola, Anguilla, Antigua and Barbuda, A
<string name="anonymous_user_hint">Um utilizador anónimo não pode:\n- Criar grupos;\n- Sincronizar grupos e dispositivos com o servidor;\n- Gerir grupos e dispositivos num escritório privado.</string>
<string name="anonymous_user">Utilizador anónimo</string>
<string name="logged_as">Ligado como %1$s</string>
</resources>
<string name="shared_string_not_selected">Não seleccionado</string>
<string name="select_month_and_country">Escolha Mês e País</string>
<string name="updates_size">Tamanho das actualizações</string>
<string name="poi_context_menu_modify_osm_change">Modificar edição OSM</string>
<string name="use_dashboard_btn">Usar Painel</string>
<string name="use_drawer_btn">Usar Menú</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources><string name="background_service_is_enabled_question">Serviciul sleep încă rulează în background. Doriți să-l opriți?</string>
<?xml version='1.0' encoding='utf-8'?>
<resources><string name="background_service_is_enabled_question">Serviciul sleep încă rulează în background. Doriți să-l opriți?</string>
<string name="close_changeset">Închide setul de modificări</string>
@ -1537,12 +1538,12 @@
<string name="routing_attr_avoid_shuttle_train_name">Evită transfer tren</string>
<string name="traffic_warning_hazard">Pericol</string>
<string name="routing_attr_avoid_shuttle_train_description">Evită transfer tren</string>
<string name="no_updates_available">Nu sunt disponibile update-uri.</string>
<string name="no_updates_available">Nu sunt disponibile actualizări.</string>
<string name="rendering_attr_currentTrackWidth_name">Lățime GPX</string>
<string name="download_live_updates">Update-uri in timp real</string>
<string name="rendering_value_boldOutline_name">Bold contur</string>
<string name="av_locations">Locații</string>
<string name="av_locations_descr">Fișier GPX cu notări locații</string>
<string name="av_locations_descr">Fișier GPX cu locații cu notițe</string>
<string name="rendering_value_red_name">Roșu</string>
<string name="rendering_value_translucent_red_name">Roșu transparent</string>
<string name="rendering_value_translucent_orange_name">Portocaliu transparent</string>
@ -1574,4 +1575,192 @@
<string name="osm_edit_deleted_poi">OSM POI sters</string>
<string name="context_menu_item_open_note">Deschideti OSM Notite</string>
<string name="osm_edit_reopened_note">OSM Notite redeschis</string>
</resources>
<string name="item_deleted">Articol șters</string>
<string name="n_items_deleted">articole șterse</string>
<string name="shared_string_undo_all">Restaurează toate</string>
<string name="shared_string_type">Tip</string>
<string name="starting_point">Punct de plecare</string>
<string name="shared_string_not_selected">Neselectat</string>
<string name="rec_split">Înregistrări divizate</string>
<string name="rec_split_title">Utilizează înregistrări divizate</string>
<string name="rec_split_desc">Suprascrie clipurile când spațiul utilizat depășește memoria de stocare</string>
<string name="rec_split_clip_length">Lungime clip</string>
<string name="rec_split_clip_length_desc">Lungimea fiecărei înregistrări nu va mai specifica intervalul de timp</string>
<string name="rec_split_storage_size">Mărimea memoriei de stocare</string>
<string name="rec_split_storage_size_desc">Dimensiunea spațiului de stocare pentru toate clipurile înregistrate</string>
<string name="live_updates">Actualizări live</string>
<string name="available_maps">Hărți disponibile</string>
<string name="select_voice_provider">Selectează vocea pentru ghidare</string>
<string name="select_voice_provider_descr">Selectează sau descarcă vocea pentru ghidări pentru limba ta</string>
<string name="impassable_road_desc">Selectează drumurile pe care dorești sa le eviți pe perioada navigării</string>
<string name="shared_string_sound">Sunet</string>
<string name="no_location_permission">Aplicația nu are permisiunea de a accesa datele de localizare.</string>
<string name="no_camera_permission">Aplicația nu are permisiunea de a accesa camera.</string>
<string name="no_microphone_permission">Aplicația nu are permisiunea de a accesa microfonul.</string>
<string name="route_distance">Distanța:</string>
<string name="route_duration">Timp:</string>
<string name="rendering_attr_horseRoutes_name">Rute pentru călărie</string>
<string name="no_address_found">Nici o adresă determinată</string>
<string name="shared_string_near">Apropiere</string>
<string name="shared_string_hide">Ascunde</string>
<string name="av_video_quality_low">Calitate slabă</string>
<string name="av_video_quality_high">Calitate mare</string>
<string name="av_video_quality">Calitate înregistrării video</string>
<string name="av_video_quality_descr">Selectează calitatea înregistrării video</string>
<string name="av_audio_format">Format audio</string>
<string name="av_audio_format_descr">Selectează formatul audio</string>
<string name="av_audio_bitrate">Bitrate audio</string>
<string name="av_audio_bitrate_descr">Selectează bitrate-ul audio</string>
<string name="please_specify_poi_type_only_from_list">Selectează tipul corect al punctului de interes sau ignoră-l</string>
<string name="access_from_map_description">Butonul de meniu lansează panoul frontal, nu meniul propriu-zis</string>
<string name="show_on_start_description">\'Închide\' Lansează harta direct pe ecran</string>
<string name="copied_to_clipboard">Copiat în clipboard</string>
<string name="release_2_2">" • O interfață nouă cu context sensibil la atingere locațiilor pe hartă și alte ecrane\n\n • Harta este lansată direct, doar dacă nu este selectată \'Afișează panoul frontal la pornire\'\n\n • Configurează ce elemente să fie afișate pe panoul frontal\n\n • Ignoră panoul frontal dacă dorești utilizarea meniurilor în aplicație\n\n • Descărcarea hărților sau a regiunilor se poate face direct prin atingere pe harta lumii\n\n • Căutarea punctelor de interes (POI) suportă mai multe criterii\n\n • Îmbunatățirea editarării punctelor de interes (POI) și OSM\n\n • Refăcută structura de descărcare a hărților și a interfeței\n\n și multe altele... "</string>
<string name="osm_edit_commented_note">Comentați nota OSM</string>
<string name="osm_edit_removed_note">Nota OSM ștearsă</string>
<string name="osm_edit_created_note">Creată nota OSM</string>
<string name="osn_bug_name">Notă OSM</string>
<string name="osn_add_dialog_title">Crează notă</string>
<string name="osn_comment_dialog_title">Adaugă comentariu</string>
<string name="osn_reopen_dialog_title">Redeschide nota</string>
<string name="osn_close_dialog_title">Închide nota</string>
<string name="osn_add_dialog_success">Notă creată cu succes</string>
<string name="osn_add_dialog_error">S-a produs o excepție: nota nu a fost creată</string>
<string name="osn_close_dialog_success">Nota a fost închisă cu succes</string>
<string name="osn_close_dialog_error">S-a produs o excepție: nota nu a fost închisă</string>
<string name="shared_string_commit">Comite</string>
<string name="context_menu_item_delete_waypoint">Ștergi punctul de referință GPX?</string>
<string name="context_menu_item_edit_waypoint">Editează punctul de referință GPX</string>
<string name="shared_string_location">Locație</string>
<string name="share_osm_edits_subject">Editări OSM împărțite prin OsmAnd</string>
<string name="lang_nds">Low German</string>
<string name="lang_mk">Macedonian</string>
<string name="read_more">Citește mai multe</string>
<string name="whats_new">Ce-i nou în</string>
<string name="rendering_attr_hideProposed_name">Ascunde obiectele propuse</string>
<string name="shared_string_update">Actualizează</string>
<string name="shared_string_upload">Încarcă (upload)</string>
<string name="osm_edit_created_poi">Crează punct de interes OSM (OSM POI)</string>
<string name="world_map_download_descr">World basemap (harta de bază a lumii ce acoperă întreaga lume fară detalii) lipsește sau învechită. Luați în considerare descărcarea harții World basemap.</string>
<string name="shared_string_qr_code">Cod QR</string>
<string name="map_downloaded">Hartă descarcată</string>
<string name="map_downloaded_descr">Harta pentru %1$s a fost descărcată. Navigați înapoi la vizualizarea hărții pentru a o folosi.</string>
<string name="go_to_map">Mergi la hartă</string>
<string name="shared_string_send">Trimite</string>
<string name="favorite_category_dublicate_message">Numele categoriei specificate există deja. Definiți alt nume.</string>
<string name="simulate_initial_startup_descr">Simulează ca și când aplicația ar fi pentru prima oară lansată, celelalte setari rămân neschimbate</string>
<string name="simulate_initial_startup">Simulează lansarea inițială</string>
<string name="share_menu_location">Împărtășește locația</string>
<string name="favorite_category_name">Numele categoriei</string>
<string name="favorite_category_add_new_title">Adaugă o categorie</string>
<string name="regions">Regiuni</string>
<string name="region_maps">Hărțile regiunilor</string>
<string name="world_maps">Hărțile lumii</string>
<string name="hillshade_layer_disabled">Vizualizarea umbrelor de relief e dezactivată</string>
<string name="srtm_plugin_disabled">Vizualizarea liniilor de contur e dezactivată</string>
<string name="favorite_category_add_new">Adaugă</string>
<string name="favorite_category_select">Selectează categorie</string>
<string name="default_speed_system_descr">Definește sistemul de măsurare a vitezei</string>
<string name="default_speed_system">Măsurarea vitezei</string>
<string name="si_nm">Mile nautice</string>
<string name="si_kmh">Kilometri pe oră</string>
<string name="si_mph">Mile pe oră</string>
<string name="si_m_s">Metri pe secundă</string>
<string name="si_min_km">Minute pe kilometru</string>
<string name="si_min_m">Minute per milă</string>
<string name="si_nm_h">Mile nautice pe oră (knot)</string>
<string name="nm_h">nm/h</string>
<string name="nm">nm</string>
<string name="min_mile">min/m</string>
<string name="min_km">min/km</string>
<string name="m_s">m/s</string>
<string name="shared_string_trip_recording">Înregistrează călătoria</string>
<string name="shared_string_navigation">Navigare</string>
<string name="osmand_running_in_background">Rulează în fundal</string>
<string name="favourites_edit_dialog_title">Informații favorite</string>
<string name="simulate_your_location_stop_descr">Oprește simularea poziției</string>
<string name="simulate_your_location_descr">Simulează utilizând o rută calculată sau o înregistrare GPX</string>
<string name="looking_up_address">Adresa căutată</string>
<string name="lang_fy">Frysk (?)</string>
<string name="lang_als">Albaneză (Tosk)</string>
<string name="share_geo">geo:</string>
<string name="rendering_attr_currentTrackColor_description">Culoare GPX</string>
<string name="rendering_attr_currentTrackWidth_description">Grosime GPX</string>
<string name="lang_tl">Tagalog (limba)</string>
<string name="lang_az">Azeră</string>
<string name="lang_br">Bretonă</string>
<string name="lang_sq">Albaneză</string>
<string name="lang_is">Islandeză</string>
<string name="lang_bpy">Limba Bishnupriya</string>
<string name="lang_nv">Limba Navajo</string>
<string name="lang_ga">Irlandeză</string>
<string name="lang_la">Latină</string>
<string name="lang_ku">Curdă</string>
<string name="lang_ta">Limba Tamil</string>
<string name="lang_ml">Limba Malayalam</string>
<string name="lang_lb">Luxemburgheză</string>
<string name="lang_os">Osețiană</string>
<string name="lang_eo">Limba Esperanto</string>
<string name="lang_es_ar">Spaniolă argentiniană</string>
<string name="lang_nb">Dialect Bokmål (Norvegia)</string>
<string name="lang_vo">Limba Volapuk</string>
<string name="lang_th">Tailandeză</string>
<string name="lang_te">Limba Telugu</string>
<string name="lang_nn">Norvegiană (Nynorsk)</string>
<string name="lang_new">Nepaleză Newar / Nepal Bhasa</string>
<string name="lang_ms">Malaieziană</string>
<string name="lang_ht">Haitiană</string>
<string name="lang_gl">Galițiană</string>
<string name="lang_et">Estoniană</string>
<string name="lang_ceb">Limba Cebuano</string>
<string name="disable_recording_once_app_killed">Previne logarea automată</string>
<string name="disable_recording_once_app_killed_descrp">Logarea punctelor GPX este oprita cand aplicația este distrusă (folosind lista aplicațiilor recente). (Indicatorul ce indică funcționarea în fundal a OsmAnd dispare din bara de notificări a Android-ului)</string>
<string name="shared_string_import2osmand">Importă în OsmAnd</string>
<string name="read_full_article">Citește tot articolul (online)</string>
<string name="shared_string_wikipedia">Wikipedia (wiki)</string>
<string name="local_indexes_cat_wiki">Wikipedia (wiki)</string>
<string name="shared_string_show_details">Arată detalii</string>
<string name="osm_edit_context_menu_delete">Șterge editarea OSM</string>
<string name="rendering_value_disabled_name">Dezactivată</string>
<string name="rendering_value_walkingRoutesScopeOSMC_name">Colorează în funcție de destinația calătoriei</string>
<string name="rendering_value_walkingRoutesOSMC_name">Colorează în funcție de OSMC</string>
<string name="osmo_share_my_location">Împărtășește poziția mea</string>
<string name="shared_string_logoff">Deconectare</string>
<string name="rendering_attr_hideHouseNumbers_name">Ascunde numarul casei</string>
<string name="application_dir_change_warning3">Dorești ca OsmAnd să copie de asemenea și fișierele de date la noua destinție?</string>
<string name="specified_directiory_not_writeable">Hărțile nu pot fi create în directorul selectat</string>
<string name="copying_osmand_file_failed">Copierea fișierelor a eșuat</string>
<string name="storage_directory_external">Memoria externă</string>
<string name="storage_directory_multiuser">Stocare pentru utilizatori multipli</string>
<string name="storage_directory_internal_app">Memoria internă aplicației</string>
<string name="storage_directory_manual">Manual specificată</string>
<string name="storage_directory_default">Memoria internă</string>
<string name="storage_directory">Locația hărților</string>
<string name="shared_string_copy">Copie</string>
<string name="filter_poi_hint">Filtrează după nume</string>
<string name="search_poi_category_hint">Caută prin toate punctele de interes</string>
<string name="shared_string_open">Deschide</string>
<string name="rendering_attr_OSMMapperAssistant_name">Asistent mapare OSM</string>
<string name="agps_info">Info A-GPS</string>
<string name="shared_string_manage">Administrează</string>
<string name="shared_string_edit">Editează</string>
<string name="shared_string_places">Locații</string>
<string name="shared_string_search">Căutare</string>
<string name="shared_string_show_description">Vezi descrierea</string>
<string name="shared_string_message">Mesaj</string>
<string name="agps_data_last_downloaded">Ultima dată de descărcare a datele A-GPS: %1$s</string>
<string name="confirm_usage_speed_cameras">În multe țari (Germania, Franța, Italia și altele) utilizarea avertizarilor pentru camerele de viteză nu este permisă de lege. OsmAnd nu este responsabilă pentru încălcarea legii în acest sens. Apasă Da dacă ești eligibil pentru a utiliza această funcționalitate.</string>
<string name="welmode_download_maps">Hărți descărcate</string>
<string name="welcome_select_region">Pentru a reflecta corect semnele si reglementarile de trafic, alege regiunea in care conduci:</string>
<string name="welcome_text">OsmAnd ofera vizualizarea și navigarea offline pe hărți la nivel global!</string>
<string name="welcome_header">Bun venit</string>
<string name="current_route">Traseul curent</string>
<string name="osm_changes_added_to_local_edits">Schimbările OSM adăugate in setul de schimbări locale</string>
<string name="mark_to_delete">Marchează pentru ștergere</string>
<string name="osmo_grop_name_length_alert">Numele grupului trebuie să aibă cel puțin 3 caractere!</string>
<string name="local_recordings_delete_all_confirm">Dorești ștergerea notei %1$d ?</string>
<string name="local_osm_changes_upload_all_confirm">Dorești încărcarea (upload) pe OSM a %1$d schimbări?</string>
<string name="confirmation_to_clear_history">Dorești ștergerea istoricului?</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="rendering_attr_horseRoutes_name">Конные маршруты</string>
<string name="av_video_quality_low">Низкое качество</string>
@ -204,7 +205,7 @@
<string name="map_version_changed_info">На сервере данных были найдены файлы, не совместимые с данной версией программы. Для их использования, пожалуйста, обновите приложение.</string>
<string name="poi_filter_nominatim">Nominatim (Интернет)</string>
<string name="search_position_current_location_search">Поиск позиции…</string>
<string name="search_position_current_location_found">Точка [Найдена]</string>
<string name="search_position_current_location_found">Моя позиция (найдена)</string>
<string name="search_position_address">Адрес…</string>
<string name="search_position_favorites">Избранные…</string>
<string name="search_position_undefined">Неопределенно</string>
@ -874,7 +875,7 @@
<string name="show_warnings_title">Показывать сигналы…</string>
<string name="map_widget_show_ruler">Линейка</string>
<string name="map_widget_view_direction">Направление взгляда</string>
<string name="map_widget_transparent">Прозрачность</string>
<string name="map_widget_transparent">Прозрачные виджеты</string>
<string name="int_continuosly">Постоянно</string>
<string name="gps_wakeup_interval">Интервал пробуждения GPS: %s</string>
<string name="map_widget_day_night">Дневной/ночной режим</string>
@ -1806,7 +1807,7 @@
<string name="downloads">Загрузки</string>
<string name="show_free_version_banner">Показывать баннер бесплатной версии</string>
<string name="show_free_version_banner_description">Даже если у вас купленная версия вы также можете видеть баннер для бесплатной версии</string>
<string name="confirm_download_roadmaps">Вы уверены, что хотите скачать карту автодорог, даже если у вас есть полная карта?</string>
<string name="confirm_download_roadmaps">Вы уверены, что хотите скачать карту автодорог, хотя у вас уже есть стандартная (полная) карта?</string>
<string name="value_downloaded_of_max">%1$.1f из %2$.1f Мб</string>
<string name="file_size_in_mb">%.1f МБ</string>
<string name="update_all">Обновить все (%1$s МБ)</string>
@ -1857,7 +1858,7 @@
<string name="whats_new">Что нового в</string>
<string name="save_poi_without_poi_type_message">Вы действительно хотите сохранить POI без указания типа?</string>
<string name="route_distance">Расстояние:</string>
<string name="route_duration">Время в пути:</string>
<string name="route_duration">Время:</string>
<string name="access_from_map_description">Кнопка меню открывает домашнюю страницу</string>
<string name="access_from_map">Доступ с карты</string>
<string name="context_menu_item_delete_waypoint">Удалить точку GPX?</string>
@ -1869,4 +1870,20 @@
<string name="only_download_over_wifi">Загружать только через WiFi</string>
<string name="update_now">Обновить сейчас</string>
<string name="missing_write_external_storage_permission">Приложению не разрешена запись на карту памяти</string>
</resources>
<string name="available_maps">Доступные карты</string>
<string name="starting_point">Начальный пункт</string>
<string name="shared_string_not_selected">Не выбрано</string>
<string name="rec_split_storage_size">Размер хранилища</string>
<string name="shared_string_sound">Звук</string>
<string name="no_location_permission">У приложения нет доступа к информации о местоположении.</string>
<string name="no_camera_permission">У приложения нет доступа к камере.</string>
<string name="no_microphone_permission">У приложения нет доступа к микрофону.</string>
<string name="last_update">Последнее обновление: %s</string>
<string name="last_map_change">Последнее изменение карты: %s</string>
<string name="hourly">Каждый час</string>
<string name="daily">Ежедневно</string>
<string name="weekly">Еженедельно</string>
<string name="select_month_and_country">Выберите месяц и страну</string>
<string name="poi_dialog_reopen">Открыть повторно</string>
<string name="impassable_road_desc">Выберите дороги, которых следует избегать при навигации</string>
</resources>

View file

@ -269,7 +269,7 @@
<string name="poi_rugby_league">Rugby a 13</string>
<string name="poi_skating">Patinàgiu</string>
<string name="poi_skateboard">Skateboard</string>
<string name="poi_soccer">Fubalu</string>
<string name="poi_soccer">Fùbalu</string>
<string name="poi_swimming">Piscina</string>
<string name="poi_tennis">Tennis</string>
<string name="poi_toboggan">Toboga</string>
@ -1888,4 +1888,14 @@
<string name="poi_health_specialty_biochemistry_yes">Ispetzializatzione mèiga: biochìmica clìnica</string>
<string name="poi_official_name">Nùmene ufitziale</string>
</resources>
<string name="poi_gaelic_games">Giogos gaèlicos</string>
<string name="poi_running">Cursa</string>
<string name="poi_netball">Netball</string>
<string name="poi_karting">Karting</string>
<string name="poi_badminton">Bàdminton</string>
<string name="poi_judo">Judo</string>
<string name="poi_disc_golf">Disc golf</string>
<string name="poi_futsal">Fùbalu a 5</string>
<string name="poi_boxing">Pugiladu (boxe)</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="always_center_position_on_map">Ammustra sa positzione semper a su tzentru</string>
<string name="voice_pref_title">Boghe</string>
<string name="misc_pref_title">Mistura</string>
@ -2073,4 +2074,7 @@
<string name="Night">Note</string>
<string name="updates_size">Mannària agiornamentos</string>
</resources>
<string name="select_month_and_country">Ischerta mese e istadu</string>
<string name="shared_string_type">Casta</string>
<string name="starting_point">Puntu de incumintzu</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="recording_context_menu_show">Zobraziť</string>
<string name="recording_photo_description">Fotografia %1$s %2$s</string>
@ -1914,4 +1915,10 @@
<string name="morning">Ráno</string>
<string name="Night">V noci</string>
</resources>
<string name="shared_string_type">Typ</string>
<string name="starting_point">Východzí bod</string>
<string name="select_month_and_country">Zvoľte mesiac a krajinu</string>
<string name="item_deleted">Položka vymazaná</string>
<string name="n_items_deleted">položiek vymazaných</string>
<string name="shared_string_undo_all">VŠETKO VRÁTIŤ SPÄŤ</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="search_button">Poišči</string>
<string name="search_activity">Iskanje podatkov</string>
@ -2077,4 +2078,10 @@
<string name="rec_split">Razdelilnik posnetkov</string>
<string name="rec_split_title">Uporabi razdelilnik posnetkov</string>
<string name="rec_split_desc">Prepiši starejše posnetke, ko velikost posnetka preseže omejitev</string>
</resources>
<string name="item_deleted">Predmet je izbrisan</string>
<string name="n_items_deleted">izbrisanih predmetov</string>
<string name="shared_string_undo_all">Razveljavi vse</string>
<string name="shared_string_type">Vrsta</string>
<string name="starting_point">Začetna točka</string>
<string name="select_month_and_country">Izberite mesec in državo</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="screen_is_locked">För att låsa upp skärmen tryck på låsikonen</string>
<string name="ChooseCountry">Välj land</string>
<string name="choose_city">Välj stad</string>
@ -2057,4 +2058,10 @@
<string name="weekly">Varje vecka</string>
<string name="morning">Morgon</string>
<string name="shared_string_not_selected">Inte markerad</string>
</resources>
<string name="select_month_and_country">Välj månad och land</string>
<string name="shared_string_type">Typ</string>
<string name="starting_point">Startpunkt</string>
<string name="item_deleted">post raderad</string>
<string name="n_items_deleted">poster raderade</string>
<string name="shared_string_undo_all">ÅNGRA ALLA</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources><string name="close_changeset">Değişiklik listesini kapat</string>
<?xml version='1.0' encoding='utf-8'?>
<resources><string name="close_changeset">Değişiklik listesini kapat</string>
<string name="zxing_barcode_scanner_not_found">ZXing Barcode Scanner uygulaması kurulu değil. Uygulama marketinde aramak ister misiniz?</string>
<string name="rendering_attr_roadColors_description">Yol renk şemasını seç:</string>
<string name="rendering_attr_roadColors_name">Yol renk şeması</string>
@ -2024,4 +2025,5 @@
<string name="Night">Gece</string>
<string name="updates_size">Güncelleme boyutu</string>
</resources>
<string name="select_month_and_country">Ayı ve ülke seçin</string>
</resources>

View file

@ -343,4 +343,5 @@
<string name="poi_recycling_computers">Комп\'ютери</string>
<string name="poi_recycling_tyres">Покришки</string>
<string name="poi_recycling_tv_monitor">Телевізори, монітори</string>
</resources>
<string name="poi_node_networks">Пішохідні/велосипедні вузли маршрутів</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="asap">Швидко</string>
<string name="route_roundabout">Круговий рух : %1$d з’їзд</string>
@ -243,7 +244,7 @@
<string name="poi_filter_nominatim">Nominatim (Інтернет)</string>
<string name="search_position_current_location_search">Пошук позиції…</string>
<string name="search_position_current_location_found">Точка (знайдена)</string>
<string name="search_position_current_location_found">Моя позиція (знайдена)</string>
<string name="search_position_address">Адреса…</string>
<string name="search_position_favorites">Закладки…</string>
<string name="search_position_undefined">Невизначено</string>
@ -1054,7 +1055,7 @@
<string name="map_widget_fluorescent">Флуоресцентні маршрути</string>
<string name="map_widget_show_ruler">Лінійка</string>
<string name="map_widget_transparent">Прозорість</string>
<string name="map_widget_transparent">Прозорість віджетів</string>
<string name="gps_wakeup_interval">Інтервал пробудження GPS: %s</string>
@ -2222,5 +2223,19 @@ OsmAnd має відкриті сирці і активно розвиваєть
<string name="no_camera_permission">Додаток не має дозволу на використання камери.</string>
<string name="no_microphone_permission">Додаток не має дозволу на використання мікрофону.</string>
<string name="route_distance">Відстань:</string>
<string name="route_duration">Час в дорозі:</string>
</resources>
<string name="route_duration">Час:</string>
<string name="rec_split_storage_size">Розмір сховища</string>
<string name="live_updates">Автоматичні оновлення</string>
<string name="available_maps">Доступні мапи</string>
<string name="select_voice_provider">Виберіть голосові вказівки</string>
<string name="select_voice_provider_descr">Виберіть або завантажте голосові вказівки для вашої мови</string>
<string name="impassable_road_desc">Виберіть дороги, яких ви бажаєте уникати під час навігації</string>
<string name="shared_string_sound">Звук</string>
<string name="poi_deleted_localy">POI буде видалено після того, як ви завантажите ваші зміни</string>
<string name="confirm_download_roadmaps">Ви впевнені, що бажаєте завантажити карти доріг при наяаності стандартної (повної) мапи?</string>
<string name="missing_write_external_storage_permission">Додаток не має дозволу для запису на SD-карту</string>
<string name="last_update">Останнє оновлення: %s</string>
<string name="last_map_change">Остання зміна мапи: %s</string>
<string name="hourly">Щогодинно</string>
<string name="daily">Щоденно</string>
</resources>

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="rendering_attr_roadColors_description">選擇道路的色彩調配:</string>
<string name="rendering_attr_roadColors_name">道路的色彩調配</string>
<string name="map_widget_show_destination_arrow">顯示目的地方向</string>
@ -2064,4 +2065,10 @@
<string name="Night">夜間</string>
<string name="shared_string_not_selected">未選取</string>
</resources>
<string name="select_month_and_country">選擇月份與國家</string>
<string name="shared_string_type">類型</string>
<string name="starting_point">起始標點</string>
<string name="item_deleted">項目已刪除</string>
<string name="n_items_deleted">項目已刪除</string>
<string name="shared_string_undo_all">全部取消</string>
</resources>

View file

@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="popup_bg_color">#EE666666</color>
<color name="popup_separator_color">#BBBBBB</color>
<color name="popup_text_color">#FFFFFF</color>
<color name="primary_text_light">#de000000</color>
<color name="secondary_text_light">#8a000000</color>
<color name="primary_text_dark">#ffffffff</color>

View file

@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="undo_bottom_offset">15dp</dimen>
<dimen name="touch_slop">32dp</dimen>
<dimen name="list_item_height">50dp</dimen>
<dimen name="list_header_height">40dp</dimen>
<dimen name="dashboard_map_top_padding">240dp</dimen>

View file

@ -9,6 +9,11 @@
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
-->
<string name="item_deleted">Item deleted</string>
<string name="n_items_deleted">items deleted</string>
<string name="shared_string_undo_all">UNDO ALL</string>
<string name="shared_string_type">Type</string>
<string name="starting_point">Starting point</string>
<string name="shared_string_not_selected">Not selected</string>
<string name="rec_split">Recorder Split</string>
<string name="rec_split_title">Use Recorder Split</string>

View file

@ -299,6 +299,11 @@
<!-- PopUpMenu -->
<style name="Animations.PopUpMenu"/>
<style name="Animations.PopUpMenu.Fade">
<item name="@android:windowEnterAnimation">@anim/popup_show</item>
<item name="@android:windowExitAnimation">@anim/popup_hide</item>
</style>
<style name="Animations.PopUpMenu.Left">
<item name="@android:windowEnterAnimation">@anim/grow_from_bottomleft_to_topright</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_topright_to_bottomleft</item>

View file

@ -83,8 +83,13 @@ public class CurrentPositionHelper {
}
}
};
if (!app.getRoutingHelper().startTaskInRouteThreadIfPossible(run) && result != null) {
result.publish(null);
if (!app.getRoutingHelper().startTaskInRouteThreadIfPossible(run)) {
if (result != null) {
result.publish(null);
}
if (geoCoding != null) {
geoCoding.publish(null);
}
}
}
}

View file

@ -29,7 +29,8 @@ public class TargetPointsHelper {
private PointDescription pointDescription;
public int index;
public boolean intermediate;
public boolean start;
public TargetPoint(LatLon point, PointDescription name) {
this.point = point;
this.pointDescription = name;
@ -66,7 +67,15 @@ public class TargetPointsHelper {
}
return null;
}
public static TargetPoint createStartPoint(LatLon point, PointDescription name) {
if (point != null) {
TargetPoint target = new TargetPoint(point, name);
target.start = true;
return target;
}
return null;
}
public double getLatitude() {
return point.getLatitude();
@ -97,7 +106,7 @@ public class TargetPointsHelper {
private void readFromSettings(OsmandSettings settings) {
pointToNavigate = TargetPoint.create(settings.getPointToNavigate(), settings.getPointNavigateDescription());
pointToStart = TargetPoint.create(settings.getPointToStart(), settings.getStartPointDescription());
pointToStart = TargetPoint.createStartPoint(settings.getPointToStart(), settings.getStartPointDescription());
intermediatePoints.clear();
List<LatLon> ips = settings.getIntermediatePoints();
List<String> desc = settings.getIntermediatePointDescriptions(ips.size());
@ -285,7 +294,7 @@ public class TargetPointsHelper {
}
public void reorderAllTargetPoints(List<TargetPoint> point, boolean updateRoute){
public void reorderAllTargetPoints(List<TargetPoint> point, boolean updateRoute) {
settings.clearPointToNavigate();
if (point.size() > 0) {
List<TargetPoint> subList = point.subList(0, point.size() - 1);

View file

@ -30,7 +30,7 @@ public class Version {
} else if (isGooglePlayEnabled(ctx)) {
return "market://search?q=pname:";
}
return "http://osmand.net/apps?";
return "http://osmand.net/apps?id=";
}
private static boolean isAmazonEnabled(OsmandApplication ctx) {

View file

@ -102,11 +102,11 @@ public class MapActivityActions implements DialogProvider {
TargetPointsHelper targets = getMyApplication().getTargetPointsHelper();
targets.navigateToPoint(new LatLon(latitude, longitude), true, targets.getIntermediatePoints().size() + 1,
pd);
openIntermediateEditPointsDialog();
openIntermediatePointsDialog();
}
public void editWaypoints() {
openIntermediateEditPointsDialog();
openIntermediatePointsDialog();
}
private Bundle enhance(Bundle aBundle, double latitude, double longitude, String name) {

View file

@ -96,7 +96,7 @@ public class DashWaypointsFragment extends DashLocationFragment {
View dv = getActivity().getLayoutInflater().inflate(R.layout.divider, null);
favorites.addView(dv);
View v = WaypointDialogHelper.updateWaypointItemView(false, null, getMyApplication(),
getActivity(), null, ps, null, !getMyApplication().getSettings().isLightContent());
getActivity(), null, ps, null, !getMyApplication().getSettings().isLightContent(), true);
favorites.addView(v);
}
@ -142,7 +142,21 @@ public class DashWaypointsFragment extends DashLocationFragment {
view.findViewById(R.id.group_image).setVisibility(View.GONE);
boolean target = helper.getPointToNavigate() == point;
int id = target ? R.drawable.list_destination : R.drawable.list_intermediate;
int id;
if (!target) {
if (getMyApplication().getSettings().isLightContent()) {
id = R.drawable.widget_intermediate_day;
} else {
id = R.drawable.widget_intermediate_night;
}
} else {
if (getMyApplication().getSettings().isLightContent()) {
id = R.drawable.widget_target_day;
} else {
id = R.drawable.widget_target_night;
}
}
((ImageView) view.findViewById(R.id.favourite_icon)).setImageDrawable(getMyApplication().getIconsCache()
.getIcon(id, 0));
DashLocationView dv = new DashLocationView(direction, label, new LatLon(point.getLatitude(),

View file

@ -35,6 +35,7 @@ import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCal
import com.github.ksoichiro.android.observablescrollview.ScrollState;
import net.osmand.PlatformUtil;
import net.osmand.ValueHolder;
import net.osmand.data.LatLon;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuAdapter.OnContextMenuClick;
@ -44,7 +45,7 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.IntermediatePointsDialog;
import net.osmand.plus.TargetPointsHelper.TargetPoint;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dashboard.tools.DashFragmentData;
import net.osmand.plus.dashboard.tools.DashboardSettingsDialogFragment;
@ -57,8 +58,14 @@ import net.osmand.plus.helpers.WaypointHelper.LocationPointWrapper;
import net.osmand.plus.mapcontextmenu.other.RoutePreferencesMenu;
import net.osmand.plus.mapcontextmenu.other.RoutePreferencesMenu.LocalRoutingParameter;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelper.IRouteInformationListener;
import net.osmand.plus.views.DownloadedRegionsLayer;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.controls.DynamicListView;
import net.osmand.plus.views.controls.DynamicListViewCallbacks;
import net.osmand.plus.views.controls.StableArrayAdapter;
import net.osmand.plus.views.controls.SwipeDismissListViewTouchListener;
import net.osmand.plus.views.controls.SwipeDismissListViewTouchListener.Undoable;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@ -72,7 +79,7 @@ import static android.util.TypedValue.COMPLEX_UNIT_DIP;
/**
*/
public class DashboardOnMap implements ObservableScrollViewCallbacks {
public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicListViewCallbacks, IRouteInformationListener {
private static final org.apache.commons.logging.Log LOG =
PlatformUtil.getLog(DashboardOnMap.class);
private static final String TAG = "DashboardOnMap";
@ -106,7 +113,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
private ArrayAdapter<?> listAdapter;
private OnItemClickListener listAdapterOnClickListener;
private SwipeDismissListViewTouchListener swipeDismissListener;
private boolean visible = false;
private DashboardType visibleType;
@ -173,7 +180,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
waypointDialogHelper = new WaypointDialogHelper(mapActivity);
landscape = !AndroidUiHelper.isOrientationPortrait(mapActivity);
dashboardView = (FrameLayout) mapActivity.findViewById(R.id.dashboard);
View.OnClickListener listener = new View.OnClickListener() {
final View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
hideDashboard();
@ -182,6 +189,75 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
toolbar = ((Toolbar) dashboardView.findViewById(R.id.toolbar));
ObservableScrollView scrollView = ((ObservableScrollView) dashboardView.findViewById(R.id.main_scroll));
listView = (ListView) dashboardView.findViewById(R.id.dash_list_view);
//listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listView.setDrawSelectorOnTop(true);
((DynamicListView) listView).setDynamicListViewCallbacks(this);
// Create a ListView-specific touch listener. ListViews are given special treatment because
// by default they handle touches for their list items... i.e. they're in charge of drawing
// the pressed state (the list selector), handling list item clicks, etc.
swipeDismissListener = new SwipeDismissListViewTouchListener(
listView,
new SwipeDismissListViewTouchListener.DismissCallbacks() {
@Override
public boolean canDismiss(int position) {
boolean res = false;
if (listAdapter instanceof StableArrayAdapter) {
List<Object> activeObjects = ((StableArrayAdapter) listAdapter).getActiveObjects();
Object obj = listAdapter.getItem(position);
res = activeObjects.contains(obj);
}
return res;
}
@Override
public Undoable onDismiss(final int position) {
final Object item;
final StableArrayAdapter stableAdapter;
final int activeObjPos;
if (listAdapter instanceof StableArrayAdapter) {
stableAdapter = (StableArrayAdapter) listAdapter;
item = stableAdapter.getItem(position);
stableAdapter.setNotifyOnChange(false);
stableAdapter.remove(item);
stableAdapter.getObjects().remove(item);
activeObjPos = stableAdapter.getActiveObjects().indexOf(item);
stableAdapter.getActiveObjects().remove(item);
stableAdapter.notifyDataSetChanged();
} else {
item = null;
stableAdapter = null;
activeObjPos = 0;
}
return new Undoable() {
@Override
public void undo() {
if (item != null) {
stableAdapter.setNotifyOnChange(false);
stableAdapter.insert(item, position);
stableAdapter.getObjects().add(position, item);
stableAdapter.getActiveObjects().add(activeObjPos, item);
stableAdapter.updateIdMap();
onItemsSwapped(stableAdapter.getActiveObjects());
}
}
};
}
@Override
public void onHidePopup() {
if (listAdapter instanceof StableArrayAdapter) {
StableArrayAdapter stableAdapter = (StableArrayAdapter) listAdapter;
stableAdapter.updateIdMap();
onItemsSwapped(stableAdapter.getActiveObjects());
}
}
});
gradientToolbar = mapActivity.getResources().getDrawable(R.drawable.gradient_toolbar).mutate();
if (AndroidUiHelper.isOrientationPortrait(mapActivity)) {
this.portrait = true;
@ -211,7 +287,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM));
shadow.setScaleType(ScaleType.FIT_XY);
shadowContainer.addView(shadow);
((FrameLayout)paddingView).addView(shadowContainer);
((FrameLayout) paddingView).addView(shadowContainer);
listView.addHeaderView(paddingView);
listBackgroundView = mapActivity.findViewById(R.id.dash_list_background);
}
@ -248,8 +324,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
TextView tv = (TextView) dashboardView.findViewById(R.id.toolbar_text);
tv.setText("");
boolean waypointsVisible = visibleType == DashboardType.WAYPOINTS || visibleType == DashboardType.WAYPOINTS_FLAT;
boolean waypointsEdit = visibleType == DashboardType.WAYPOINTS_EDIT;
if (waypointsVisible || waypointsEdit) {
if (waypointsVisible) {
tv.setText(R.string.waypoints);
} else if (visibleType == DashboardType.CONFIGURE_MAP) {
tv.setText(R.string.configure_map);
@ -283,25 +358,6 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
});
if (waypointsVisible && getMyApplication().getWaypointHelper().getAllPoints().size() > 0) {
if (mapActivity.getMyApplication().getTargetPointsHelper().getIntermediatePoints().size() > 0) {
sort.setVisibility(View.VISIBLE);
sort.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideDashboard();
IntermediatePointsDialog.openIntermediatePointsDialog(mapActivity, getMyApplication(), true);
}
});
}
edit.setVisibility(View.VISIBLE);
edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setDashboardVisibility(true, DashboardType.WAYPOINTS_EDIT);
}
});
if (getMyApplication().getWaypointHelper().isRouteCalculated()) {
flat.setVisibility(View.VISIBLE);
final boolean flatNow = visibleType == DashboardType.WAYPOINTS_FLAT;
@ -317,17 +373,17 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
});
}
}
if (waypointsEdit) {
ok.setVisibility(View.VISIBLE);
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mapActivity.getMyApplication().getWaypointHelper().removeVisibleLocationPoint(deletedPoints);
hideDashboard();
}
});
}
// if (waypointsEdit) {
// ok.setVisibility(View.VISIBLE);
// ok.setOnClickListener(new View.OnClickListener() {
//
// @Override
// public void onClick(View v) {
mapActivity.getMyApplication().getWaypointHelper().removeVisibleLocationPoint(deletedPoints);
// hideDashboard();
// }
// });
// }
if (visibleType == DashboardType.DASHBOARD || visibleType == DashboardType.LIST_MENU) {
settingsButton.setVisibility(View.VISIBLE);
settingsButton.setOnClickListener(new View.OnClickListener() {
@ -552,7 +608,12 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
open(dashboardView.findViewById(R.id.animateContent), animation);
updateLocation(true, true, false);
// addOrUpdateDashboardFragments();
mapActivity.getRoutingHelper().addListener(this);
} else {
if (swipeDismissListener != null) {
swipeDismissListener.discardUndo();
}
mapActivity.getRoutingHelper().removeListener(this);
mapActivity.getMapViewTrackingUtilities().setDashboard(null);
hide(dashboardView.findViewById(R.id.animateContent), animation);
mapActivity.findViewById(R.id.MapHudButtonsOverlay).setVisibility(View.VISIBLE);
@ -607,10 +668,15 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
private void updateListAdapter() {
ContextMenuAdapter cm = null;
if (DashboardType.WAYPOINTS == visibleType || DashboardType.WAYPOINTS_FLAT == visibleType) {
ArrayAdapter<Object> listAdapter = waypointDialogHelper.getWaypointsDrawerAdapter(false, deletedPoints, mapActivity, running,
StableArrayAdapter listAdapter = waypointDialogHelper.getWaypointsDrawerAdapter(true, deletedPoints, mapActivity, running,
DashboardType.WAYPOINTS_FLAT == visibleType, nightMode);
OnItemClickListener listener = waypointDialogHelper.getDrawerItemClickListener(mapActivity, running,
listAdapter);
DynamicListView dynamicListView = (DynamicListView) listView;
dynamicListView.setItemsList(listAdapter.getObjects());
dynamicListView.setActiveItemsList(listAdapter.getActiveObjects());
updateListAdapter(listAdapter, listener);
} else if (DashboardType.WAYPOINTS_EDIT == visibleType) {
deletedPoints.clear();
@ -643,7 +709,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
boolean nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls();
if (this.nightMode != nightMode) {
this.nightMode = nightMode;
applyDayNightMode();
applyDayNightMode();
}
final ArrayAdapter<?> listAdapter = cm.createListAdapter(mapActivity, !nightMode);
OnItemClickListener listener = getOptionsMenuOnClickListener(cm, listAdapter);
@ -1087,4 +1153,72 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
return settings.registerBooleanPreference(SHOULD_SHOW + tag, true).makeGlobal().get();
}
}
@Override
public void onItemSwapping(int position) {
if (swipeDismissListener != null) {
swipeDismissListener.setEnabled(false);
}
}
@Override
public void onItemsSwapped(final List<Object> items) {
getMyApplication().runInUIThread(new Runnable() {
@Override
public void run() {
if (visibleType == DashboardType.WAYPOINTS) {
List<TargetPoint> allTargets = new ArrayList<>();
if (items != null) {
for (Object obj : items) {
if (obj instanceof LocationPointWrapper) {
LocationPointWrapper p = (LocationPointWrapper) obj;
if (p.getPoint() instanceof TargetPoint) {
TargetPoint t = (TargetPoint) p.getPoint();
if (!t.start) {
t.intermediate = true;
allTargets.add(t);
}
}
}
}
if (allTargets.size() > 0) {
allTargets.get(allTargets.size() - 1).intermediate = false;
}
}
getMyApplication().getTargetPointsHelper().reorderAllTargetPoints(allTargets, false);
newRouteIsCalculated(false, null);
getMyApplication().getTargetPointsHelper().updateRouteAndReferesh(true);
if (swipeDismissListener != null) {
swipeDismissListener.setEnabled(true);
}
}
}
}, 50);
}
@Override
public void newRouteIsCalculated(boolean newRoute, ValueHolder<Boolean> showToast) {
if ((DashboardType.WAYPOINTS == visibleType || DashboardType.WAYPOINTS_FLAT == visibleType)
&& listAdapter != null && listAdapter instanceof StableArrayAdapter) {
StableArrayAdapter stableAdapter = (StableArrayAdapter) listAdapter;
waypointDialogHelper.reloadListAdapter(stableAdapter);
if (listView instanceof DynamicListView) {
DynamicListView dynamicListView = (DynamicListView) listView;
dynamicListView.setItemsList(stableAdapter.getObjects());
dynamicListView.setActiveItemsList(stableAdapter.getActiveObjects());
}
}
}
@Override
public void routeWasCancelled() {
}
@Override
public void onWindowVisibilityChanged(int visibility) {
if (visibility != View.VISIBLE && swipeDismissListener != null) {
swipeDismissListener.discardUndo();
}
}
}

View file

@ -74,7 +74,7 @@ public class AvoidSpecificRoads {
ImageButton remove = (ImageButton) v.findViewById(R.id.info_close);
remove.setVisibility(View.VISIBLE);
remove.setImageDrawable(app.getIconsCache().getContentIcon(
R.drawable.ic_action_gremove_dark));
R.drawable.ic_action_remove_dark));
remove.setOnClickListener(new View.OnClickListener() {
@Override

View file

@ -4,8 +4,6 @@ import android.app.Activity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnDismissListener;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AlertDialog;
@ -19,18 +17,20 @@ import android.widget.ImageView;
import android.widget.TextView;
import net.osmand.AndroidUtils;
import net.osmand.Location;
import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon;
import net.osmand.data.LocationPoint;
import net.osmand.data.PointDescription;
import net.osmand.data.RotatedTileBox;
import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.TargetPointsHelper.TargetPoint;
import net.osmand.plus.activities.IntermediatePointsDialog;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.helpers.WaypointHelper.LocationPointWrapper;
import net.osmand.plus.poi.PoiUIFilter;
import net.osmand.plus.views.AnimateDraggingMapThread;
import net.osmand.plus.views.controls.StableArrayAdapter;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
@ -62,39 +62,74 @@ public class WaypointDialogHelper {
public static void updatePointInfoView(final OsmandApplication app, final Activity activity,
View localView, final LocationPointWrapper ps,
final boolean mapCenter, final boolean nightMode) {
final boolean mapCenter, final boolean nightMode,
final boolean edit) {
WaypointHelper wh = app.getWaypointHelper();
final LocationPoint point = ps.getPoint();
TextView text = (TextView) localView.findViewById(R.id.waypoint_text);
AndroidUtils.setTextPrimaryColor(activity, text, nightMode);
TextView textShadow = (TextView) localView.findViewById(R.id.waypoint_text_shadow);
localView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showOnMap(app, activity, point, mapCenter);
}
});
TextView textDist = (TextView) localView.findViewById(R.id.waypoint_dist);
((ImageView) localView.findViewById(R.id.waypoint_icon)).setImageDrawable(ps.getDrawable(activity, app));
int dist = -1;
if (!wh.isRouteCalculated()) {
if (activity instanceof MapActivity) {
dist = (int) MapUtils.getDistance(((MapActivity) activity).getMapView().getLatitude(), ((MapActivity) activity)
.getMapView().getLongitude(), point.getLatitude(), point.getLongitude());
}
} else {
dist = wh.getRouteDistance(ps);
if (!edit) {
localView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showOnMap(app, activity, point, mapCenter);
}
});
}
TextView textDist = (TextView) localView.findViewById(R.id.waypoint_dist);
((ImageView) localView.findViewById(R.id.waypoint_icon)).setImageDrawable(ps.getDrawable(activity, app, nightMode));
int dist = -1;
boolean startPoint = ps.type == WaypointHelper.TARGETS && ((TargetPoint) ps.point).start;
if (!startPoint) {
if (!wh.isRouteCalculated()) {
if (activity instanceof MapActivity) {
dist = (int) MapUtils.getDistance(((MapActivity) activity).getMapView().getLatitude(), ((MapActivity) activity)
.getMapView().getLongitude(), point.getLatitude(), point.getLongitude());
}
} else {
dist = wh.getRouteDistance(ps);
}
}
String pointDescription = "";
TextView descText = (TextView) localView.findViewById(R.id.waypoint_desc_text);
if (descText != null) {
AndroidUtils.setTextSecondaryColor(activity, descText, nightMode);
switch (ps.type) {
case WaypointHelper.TARGETS:
TargetPoint targetPoint = (TargetPoint) ps.point;
if (targetPoint.start) {
pointDescription = activity.getResources().getString(R.string.starting_point);
} else {
pointDescription = targetPoint.getPointDescription(activity).getTypeName();
}
break;
case WaypointHelper.FAVORITES:
FavouritePoint favPoint = (FavouritePoint) ps.point;
pointDescription = favPoint.getCategory();
break;
}
}
if (dist > 0) {
String dd = OsmAndFormatter.getFormattedDistance(dist, app);
if (ps.deviationDistance > 0) {
dd += "\n+" + OsmAndFormatter.getFormattedDistance(ps.deviationDistance, app);
dd += " +" + OsmAndFormatter.getFormattedDistance(ps.deviationDistance, app);
}
textDist.setText(dd);
if (!Algorithms.isEmpty(pointDescription)) {
pointDescription = "" + pointDescription;
}
} else {
textDist.setText("");
}
if (descText != null) {
descText.setText(pointDescription);
}
String descr;
PointDescription pd = point.getPointDescription(app);
if (Algorithms.isEmpty(pd.getName())) {
@ -113,18 +148,50 @@ public class WaypointDialogHelper {
// 0);
}
private List<Object> getActivePoints(List<Object> points) {
List<Object> activePoints = new ArrayList<>();
for (Object p : points) {
if (p instanceof LocationPointWrapper) {
LocationPointWrapper w = (LocationPointWrapper) p;
if (w.type == WaypointHelper.TARGETS && !((TargetPoint) w.point).start) {
activePoints.add(p);
}
}
}
return activePoints;
}
public ArrayAdapter<Object> getWaypointsDrawerAdapter(
public StableArrayAdapter getWaypointsDrawerAdapter(
final boolean edit, final List<LocationPointWrapper> deletedPoints,
final MapActivity ctx, final int[] running, final boolean flat, final boolean nightMode) {
final List<Object> points;
if (flat) {
points = new ArrayList<Object>(waypointHelper.getAllPoints());
} else {
points = getPoints();
}
return new ArrayAdapter<Object>(ctx,
R.layout.waypoint_reached, R.id.title, points) {
List<Object> activePoints = getActivePoints(points);
return new StableArrayAdapter(ctx,
R.layout.waypoint_reached, R.id.title, points, activePoints) {
@Override
public boolean isEnabled(int position) {
Object obj = getItem(position);
boolean labelView = (obj instanceof Integer);
boolean topDividerView = (obj instanceof Boolean) && ((Boolean) obj);
boolean bottomDividerView = (obj instanceof Boolean) && !((Boolean) obj);
boolean enabled = !labelView && !topDividerView && !bottomDividerView;
if (enabled && obj instanceof RadiusItem) {
int type = ((RadiusItem) obj).type;
enabled = type != WaypointHelper.POI;
}
return enabled;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
@ -139,58 +206,79 @@ public class WaypointDialogHelper {
final int type = ((RadiusItem) obj).type;
v = createItemForRadiusProximity(ctx, type, running, position, thisAdapter, nightMode);
//Drawable d = new ColorDrawable(mapActivity.getResources().getColor(R.color.dashboard_divider_light));
if (nightMode) {
v.setBackgroundColor(mapActivity.getResources().getColor(R.color.bg_color_dark));
} else {
v.setBackgroundColor(mapActivity.getResources().getColor(R.color.bg_color_light));
}
AndroidUtils.setListItemBackground(mapActivity, v, nightMode);
} else if (labelView) {
v = createItemForCategory(ctx, (Integer) obj, running, position, thisAdapter, nightMode);
if (nightMode) {
v.setBackgroundColor(mapActivity.getResources().getColor(R.color.bg_color_dark));
} else {
v.setBackgroundColor(mapActivity.getResources().getColor(R.color.bg_color_light));
}
AndroidUtils.setListItemBackground(mapActivity, v, nightMode);
} else if (topDividerView) {
v = ctx.getLayoutInflater().inflate(R.layout.card_top_divider, null);
} else if (bottomDividerView) {
v = ctx.getLayoutInflater().inflate(R.layout.card_bottom_divider, null);
} else if (obj instanceof LocationPointWrapper) {
LocationPointWrapper point = (LocationPointWrapper) obj;
v = updateWaypointItemView(edit, deletedPoints, app, ctx, v, point, this, nightMode);
if (nightMode) {
v.setBackgroundColor(mapActivity.getResources().getColor(R.color.bg_color_dark));
} else {
v.setBackgroundColor(mapActivity.getResources().getColor(R.color.bg_color_light));
}
v = updateWaypointItemView(edit, deletedPoints, app, ctx, v, point, this,
nightMode, flat);
AndroidUtils.setListItemBackground(mapActivity, v, nightMode);
}
return v;
}
};
}
public static View updateWaypointItemView(final boolean edit, final List<LocationPointWrapper> deletedPoints,
final OsmandApplication app, final Activity ctx, View v, final LocationPointWrapper point,
final ArrayAdapter adapter, final boolean nightMode) {
final OsmandApplication app, final Activity ctx, View v,
final LocationPointWrapper point,
final ArrayAdapter adapter, final boolean nightMode,
final boolean flat) {
if (v == null || v.findViewById(R.id.info_close) == null) {
v = ctx.getLayoutInflater().inflate(R.layout.waypoint_reached, null);
}
updatePointInfoView(app, ctx, v, point, true, nightMode);
updatePointInfoView(app, ctx, v, point, true, nightMode, edit);
View more = v.findViewById(R.id.all_points);
View move = v.findViewById(R.id.info_move);
View remove = v.findViewById(R.id.info_close);
if (!edit) {
remove.setVisibility(View.GONE);
move.setVisibility(View.GONE);
more.setVisibility(View.GONE);
} else if (point.type == WaypointHelper.TARGETS && !flat) {
if (((TargetPoint) point.point).start) {
remove.setVisibility(View.GONE);
move.setVisibility(View.GONE);
more.setVisibility(View.VISIBLE);
((ImageButton) more).setImageDrawable(app.getIconsCache().getContentIcon(
R.drawable.map_overflow_menu_white, !nightMode));
more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//hideDashboard();
IntermediatePointsDialog.openIntermediatePointsDialog(ctx, app, true);
}
});
} else {
remove.setVisibility(View.GONE);
move.setVisibility(View.VISIBLE);
more.setVisibility(View.GONE);
((ImageView) move).setImageDrawable(app.getIconsCache().getContentIcon(
R.drawable.ic_flat_list_dark, !nightMode));
}
} else {
remove.setVisibility(View.VISIBLE);
move.setVisibility(View.GONE);
more.setVisibility(View.GONE);
((ImageButton) remove).setImageDrawable(app.getIconsCache().getContentIcon(
R.drawable.ic_action_gremove_dark, !nightMode));
R.drawable.ic_action_remove_dark, !nightMode));
remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ArrayList<LocationPointWrapper> arr = new ArrayList<>();
arr.add(point);
app.getWaypointHelper().removeVisibleLocationPoint(arr);
deletedPoints.add(point);
if (adapter != null) {
adapter.setNotifyOnChange(false);
adapter.remove(point);
adapter.notifyDataSetChanged();
}
@ -204,19 +292,56 @@ public class WaypointDialogHelper {
protected View createItemForRadiusProximity(final FragmentActivity ctx, final int type, final int[] running,
final int position, final ArrayAdapter<Object> thisAdapter, boolean nightMode) {
View v;
IconsCache iconsCache = app.getIconsCache();
v = ctx.getLayoutInflater().inflate(R.layout.drawer_list_radius, null);
AndroidUtils.setTextPrimaryColor(mapActivity, (TextView) v.findViewById(R.id.title), nightMode);
final TextView radius = (TextView) v.findViewById(R.id.description);
((ImageView) v.findViewById(R.id.waypoint_icon)).setImageDrawable(iconsCache.getContentIcon(R.drawable.ic_poi_radius_dark, !nightMode));
radius.setText(OsmAndFormatter.getFormattedDistance(waypointHelper.getSearchDeviationRadius(type), app));
radius.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
selectDifferentRadius(type, running, position, thisAdapter, mapActivity);
}
if (type == WaypointHelper.POI) {
v = ctx.getLayoutInflater().inflate(R.layout.drawer_list_radius_ex, null);
AndroidUtils.setTextPrimaryColor(mapActivity, (TextView) v.findViewById(R.id.titleEx), nightMode);
String descEx = waypointHelper.getPoiFilter() == null ? ctx.getString(R.string.poi) : waypointHelper
.getPoiFilter().getName();
((TextView) v.findViewById(R.id.title)).setText(ctx.getString(R.string.search_radius_proximity) + ":");
((TextView) v.findViewById(R.id.titleEx)).setText(ctx.getString(R.string.shared_string_type) + ":");
final TextView radiusEx = (TextView) v.findViewById(R.id.descriptionEx);
radiusEx.setText(descEx);
v.findViewById(R.id.secondCellContainer).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
running[0] = position;
thisAdapter.notifyDataSetInvalidated();
MapActivity map = (MapActivity) ctx;
final PoiUIFilter[] selected = new PoiUIFilter[1];
AlertDialog dlg = map.getMapLayers().selectPOIFilterLayer(map.getMapView(), selected);
dlg.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
enableType(running, thisAdapter, type, true);
}
});
}
});
});
AndroidUtils.setTextPrimaryColor(mapActivity, (TextView) v.findViewById(R.id.title), nightMode);
final TextView radius = (TextView) v.findViewById(R.id.description);
radius.setText(OsmAndFormatter.getFormattedDistance(waypointHelper.getSearchDeviationRadius(type), app));
v.findViewById(R.id.firstCellContainer).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
selectDifferentRadius(type, running, position, thisAdapter, mapActivity);
}
});
} else {
v = ctx.getLayoutInflater().inflate(R.layout.drawer_list_radius, null);
((TextView) v.findViewById(R.id.title)).setText(ctx.getString(R.string.search_radius_proximity));
AndroidUtils.setTextPrimaryColor(mapActivity, (TextView) v.findViewById(R.id.title), nightMode);
final TextView radius = (TextView) v.findViewById(R.id.description);
radius.setText(OsmAndFormatter.getFormattedDistance(waypointHelper.getSearchDeviationRadius(type), app));
radius.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
selectDifferentRadius(type, running, position, thisAdapter, mapActivity);
}
});
}
return v;
}
@ -249,26 +374,6 @@ public class WaypointDialogHelper {
TextView tv = (TextView) v.findViewById(R.id.header_text);
AndroidUtils.setTextPrimaryColor(mapActivity, tv, nightMode);
tv.setText(getHeader(type, checked, ctx));
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (type == WaypointHelper.POI && btn.isChecked()) {
running[0] = position;
thisAdapter.notifyDataSetInvalidated();
MapActivity map = (MapActivity) ctx;
final PoiUIFilter[] selected = new PoiUIFilter[1];
AlertDialog dlg = map.getMapLayers().selectPOIFilterLayer(map.getMapView(), selected);
dlg.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (selected != null) {
enableType(running, thisAdapter, type, true);
}
}
});
}
}
});
return v;
}
@ -305,11 +410,7 @@ public class WaypointDialogHelper {
protected void onPostExecute(Void result) {
running[0] = -1;
listAdapter.clear();
for (Object point : getPoints()) {
listAdapter.add(point);
}
listAdapter.notifyDataSetChanged();
reloadListAdapter(listAdapter);
}
}.execute((Void) null);
}
@ -372,15 +473,24 @@ public class WaypointDialogHelper {
protected void onPostExecute(Void result) {
running[0] = -1;
listAdapter.clear();
for (Object point : getPoints()) {
listAdapter.add(point);
}
listAdapter.notifyDataSetChanged();
reloadListAdapter(listAdapter);
}
}.execute((Void) null);
}
public void reloadListAdapter(ArrayAdapter<Object> listAdapter) {
listAdapter.setNotifyOnChange(false);
listAdapter.clear();
List<Object> points = getPoints();
for (Object point : points) {
listAdapter.add(point);
}
if (listAdapter instanceof StableArrayAdapter) {
((StableArrayAdapter) listAdapter).updateObjects(points, getActivePoints(points));
}
listAdapter.notifyDataSetChanged();
}
protected String getHeader(int type, boolean checked, Activity ctx) {
String str = ctx.getString(R.string.waypoints);
switch (type) {
@ -397,8 +507,7 @@ public class WaypointDialogHelper {
str = ctx.getString(R.string.waypoints);
break;
case WaypointHelper.POI:
str = waypointHelper.getPoiFilter() == null || !checked ? ctx.getString(R.string.poi) : waypointHelper
.getPoiFilter().getName();
str = ctx.getString(R.string.poi);
break;
}
return str;
@ -416,7 +525,33 @@ public class WaypointDialogHelper {
points.add(true);
}
points.add(i);
if ((i == WaypointHelper.POI || i == WaypointHelper.FAVORITES || i == WaypointHelper.WAYPOINTS)
if (i == WaypointHelper.TARGETS && rc) {
TargetPoint start = app.getTargetPointsHelper().getPointToStart();
if (start == null) {
LatLon latLon;
Location loc = app.getLocationProvider().getLastKnownLocation();
if (loc != null) {
latLon = new LatLon(loc.getLatitude(), loc.getLongitude());
} else {
latLon = new LatLon(mapActivity.getMapView().getLatitude(),
mapActivity.getMapView().getLongitude());
}
start = TargetPoint.createStartPoint(latLon,
new PointDescription(PointDescription.POINT_TYPE_MY_LOCATION,
mapActivity.getString(R.string.shared_string_my_location)));
} else {
String oname = start.getOnlyName().length() > 0 ? start.getOnlyName()
: (mapActivity.getString(R.string.route_descr_map_location)
+ " " + mapActivity.getString(R.string.route_descr_lat_lon, start.getLatitude(), start.getLongitude()));
start = TargetPoint.createStartPoint(new LatLon(start.getLatitude(), start.getLongitude()),
new PointDescription(PointDescription.POINT_TYPE_LOCATION,
oname));
}
points.add(new LocationPointWrapper(null, WaypointHelper.TARGETS, start, 0f, 0));
} else if ((i == WaypointHelper.POI || i == WaypointHelper.FAVORITES || i == WaypointHelper.WAYPOINTS)
&& rc) {
if (waypointHelper.isTypeEnabled(i)) {
points.add(new RadiusItem(i));
@ -435,6 +570,11 @@ public class WaypointDialogHelper {
if (!(a instanceof MapActivity)) {
return;
}
app.getSettings().setMapLocationToShow(locationPoint.getLatitude(), locationPoint.getLongitude(),
15, locationPoint.getPointDescription(a), false, locationPoint);
MapActivity.launchMapActivityMoveToTop(a);
/*
MapActivity ctx = (MapActivity) a;
AnimateDraggingMapThread thread = ctx.getMapView().getAnimatedDraggingThread();
int fZoom = ctx.getMapView().getZoom() < 15 ? 15 : ctx.getMapView().getZoom();
@ -467,15 +607,9 @@ public class WaypointDialogHelper {
new LatLon(locationPoint.getLatitude(), locationPoint.getLongitude()),
locationPoint.getPointDescription(ctx),
locationPoint);
/*
ctx.getMapLayers().getContextMenuLayer().setSelectedObject(locationPoint);
ctx.getMapLayers()
.getContextMenuLayer()
.setLocation(new LatLon(locationPoint.getLatitude(), locationPoint.getLongitude()),
PointDescription.getSimpleName(locationPoint, ctx));
*/
}
}
*/
}
}

View file

@ -19,6 +19,8 @@ import net.osmand.data.Amenity.AmenityRoutePoint;
import net.osmand.data.LocationPoint;
import net.osmand.data.PointDescription;
import net.osmand.osm.PoiType;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings.MetricsConstants;
@ -33,6 +35,7 @@ import net.osmand.plus.routing.AlarmInfo.AlarmInfoType;
import net.osmand.plus.routing.RouteCalculationResult;
import net.osmand.plus.routing.VoiceRouter;
import net.osmand.util.MapUtils;
import android.content.Context;
import android.graphics.drawable.Drawable;
@ -48,7 +51,7 @@ public class WaypointHelper {
private static final int LONG_ANNOUNCE_RADIUS = 700;
private static final int SHORT_ANNOUNCE_RADIUS = 150;
private static final int ALARMS_ANNOUNCE_RADIUS = 150;
// don't annoy users by lots of announcements
private static final int APPROACH_POI_LIMIT = 3;
private static final int ANNOUNCE_POI_LIMIT = 3;
@ -62,26 +65,25 @@ public class WaypointHelper {
public static final int ALARMS = 4;
public static final int MAX = 5;
public static final int[] SEARCH_RADIUS_VALUES = {50, 100, 150, 250, 500, 1000, 1500};
private List<List<LocationPointWrapper>> locationPoints = new ArrayList<List<LocationPointWrapper>>();
private ConcurrentHashMap<LocationPoint, Integer> locationPointsStates = new ConcurrentHashMap<LocationPoint, Integer>();
private TIntArrayList pointsProgress = new TIntArrayList();
private RouteCalculationResult route;
private long announcedAlarmTime;
public WaypointHelper(OsmandApplication application) {
app = application;
}
public List<LocationPointWrapper> getWaypoints(int type) {
if(type == TARGETS) {
if (type == TARGETS) {
return getTargets(new ArrayList<WaypointHelper.LocationPointWrapper>());
}
if(type >= locationPoints.size()) {
if (type >= locationPoints.size()) {
return Collections.emptyList();
}
return locationPoints.get(type);
@ -98,21 +100,21 @@ public class WaypointHelper {
}
public void removeVisibleLocationPoint(LocationPointWrapper lp) {
if(lp.type < locationPoints.size()) {
if (lp.type < locationPoints.size()) {
locationPoints.get(lp.type).remove(lp);
}
}
public void removeVisibleLocationPoint(List<LocationPointWrapper> points) {
List<TargetPoint> ps = app.getTargetPointsHelper().getIntermediatePointsWithTarget();
boolean[] checkedIntermediates = null;
for (LocationPointWrapper lp : points) {
if (lp.type == TARGETS) {
if(checkedIntermediates == null) {
if (checkedIntermediates == null) {
checkedIntermediates = new boolean[ps.size()];
Arrays.fill(checkedIntermediates, true);
}
if(((TargetPoint) lp.point).intermediate) {
if (((TargetPoint) lp.point).intermediate) {
checkedIntermediates[((TargetPoint) lp.point).index] = false;
} else {
checkedIntermediates[ps.size() - 1] = false;
@ -121,33 +123,33 @@ public class WaypointHelper {
locationPoints.get(lp.type).remove(lp);
}
}
if(checkedIntermediates != null) {
if (checkedIntermediates != null) {
IntermediatePointsDialog.commitPointsRemoval(app, checkedIntermediates);
}
}
public LocationPointWrapper getMostImportantLocationPoint(List<LocationPointWrapper> list ) {
public LocationPointWrapper getMostImportantLocationPoint(List<LocationPointWrapper> list) {
//Location lastProjection = app.getRoutingHelper().getLastProjection();
if(list != null) {
if (list != null) {
list.clear();
}
LocationPointWrapper found = null;
for (int type = 0; type < locationPoints.size(); type++) {
if(type == ALARMS || type == TARGETS) {
if (type == ALARMS || type == TARGETS) {
continue;
}
int kIterator = pointsProgress.get(type);
List<LocationPointWrapper> lp = locationPoints.get(type);
while(kIterator < lp.size()) {
while (kIterator < lp.size()) {
LocationPointWrapper lwp = lp.get(kIterator);
if(lp.get(kIterator).routeIndex < route.getCurrentRoute()) {
if (lp.get(kIterator).routeIndex < route.getCurrentRoute()) {
// skip
} else {
if(route.getDistanceToPoint(lwp.routeIndex) <= LONG_ANNOUNCE_RADIUS ) {
if(found == null || found.routeIndex < lwp.routeIndex) {
if (route.getDistanceToPoint(lwp.routeIndex) <= LONG_ANNOUNCE_RADIUS) {
if (found == null || found.routeIndex < lwp.routeIndex) {
found = lwp;
if(list != null) {
if (list != null) {
list.add(lwp);
}
}
@ -159,7 +161,7 @@ public class WaypointHelper {
}
return found;
}
public AlarmInfo getMostImportantAlarm(MetricsConstants mc, boolean showCameras) {
Location lastProjection = app.getRoutingHelper().getLastProjection();
float mxspeed = route.getCurrentMaxSpeed();
@ -196,30 +198,30 @@ public class WaypointHelper {
}
return mostImportant;
}
public void enableWaypointType(int type, boolean enable) {
//An item will be displayed in the Waypoint list if either "Show..." or "Announce..." is selected for it in the Navigation settings
//Keep both "Show..." and "Announce..." Nav settings in sync when user changes what to display in the Waypoint list, as follows:
if(type == ALARMS) {
if (type == ALARMS) {
app.getSettings().SHOW_TRAFFIC_WARNINGS.set(enable);
app.getSettings().SPEAK_TRAFFIC_WARNINGS.set(enable);
app.getSettings().SHOW_PEDESTRIAN.set(enable);
app.getSettings().SPEAK_PEDESTRIAN.set(enable);
//But do not implicitly change speed_cam settings here because of legal restrictions in some countries, so Nav settings must prevail
} else if(type == POI) {
} else if (type == POI) {
app.getSettings().SHOW_NEARBY_POI.set(enable);
app.getSettings().ANNOUNCE_NEARBY_POI.set(enable);
} else if(type == FAVORITES) {
} else if (type == FAVORITES) {
app.getSettings().SHOW_NEARBY_FAVORITES.set(enable);
app.getSettings().ANNOUNCE_NEARBY_FAVORITES.set(enable);
} else if(type == WAYPOINTS) {
} else if (type == WAYPOINTS) {
app.getSettings().SHOW_WPT.set(enable);
app.getSettings().ANNOUNCE_WPT.set(enable);
}
recalculatePoints(route, type, locationPoints);
}
public void recalculatePoints(int type){
public void recalculatePoints(int type) {
recalculatePoints(route, type, locationPoints);
}
@ -227,17 +229,17 @@ public class WaypointHelper {
public boolean isTypeConfigurable(int waypointType) {
return waypointType != TARGETS;
}
public boolean isTypeVisible(int waypointType) {
boolean vis = app.getAppCustomization().isWaypointGroupVisible(waypointType, route);
if(!vis) {
if (!vis) {
return false;
}
return vis;
}
public boolean isTypeEnabled(int type) {
if(type == ALARMS) {
if (type == ALARMS) {
return showAlarms() || announceAlarms();
} else if (type == POI) {
//no SHOW item in nav settings, hence only query ANNOUNCE here (makes inital Waypoint dialogue consistent with nav settings)
@ -254,12 +256,12 @@ public class WaypointHelper {
}
return true;
}
public AlarmInfo calculateMostImportantAlarm(RouteDataObject ro, Location loc,
MetricsConstants mc, boolean showCameras) {
public AlarmInfo calculateMostImportantAlarm(RouteDataObject ro, Location loc,
MetricsConstants mc, boolean showCameras) {
boolean direction = true;
if(loc.hasBearing()) {
double diff = MapUtils.alignAngleDifference(ro.directionRoute(0, true) -
if (loc.hasBearing()) {
double diff = MapUtils.alignAngleDifference(ro.directionRoute(0, true) -
loc.getBearing() / (2 * Math.PI));
direction = Math.abs(diff) < Math.PI;
}
@ -279,8 +281,8 @@ public class WaypointHelper {
AlarmInfo info = AlarmInfo.createAlarmInfo(typeRule, 0, loc);
if (info != null) {
if (info.getType() != AlarmInfoType.SPEED_CAMERA || showCameras) {
long ms = System.currentTimeMillis() ;
if(ms - announcedAlarmTime > 50 * 1000) {
long ms = System.currentTimeMillis();
if (ms - announcedAlarmTime > 50 * 1000) {
announcedAlarmTime = ms;
getVoiceRouter().announceAlarm(info.getType());
}
@ -319,15 +321,15 @@ public class WaypointHelper {
List<LocationPointWrapper> approachPoints = new ArrayList<LocationPointWrapper>();
List<LocationPointWrapper> announcePoints = new ArrayList<LocationPointWrapper>();
List<LocationPointWrapper> lp = locationPoints.get(type);
if(lp != null) {
if (lp != null) {
int kIterator = pointsProgress.get(type);
while(kIterator < lp.size() && lp.get(kIterator).routeIndex < currentRoute) {
while (kIterator < lp.size() && lp.get(kIterator).routeIndex < currentRoute) {
kIterator++;
}
pointsProgress.set(type, kIterator);
while(kIterator < lp.size()) {
while (kIterator < lp.size()) {
LocationPointWrapper lwp = lp.get(kIterator);
if(route.getDistanceToPoint(lwp.routeIndex) > LONG_ANNOUNCE_RADIUS * 2){
if (route.getDistanceToPoint(lwp.routeIndex) > LONG_ANNOUNCE_RADIUS * 2) {
break;
}
LocationPoint point = lwp.point;
@ -350,7 +352,7 @@ public class WaypointHelper {
kIterator++;
}
if (!announcePoints.isEmpty()) {
if(announcePoints.size() > ANNOUNCE_POI_LIMIT) {
if (announcePoints.size() > ANNOUNCE_POI_LIMIT) {
announcePoints = announcePoints.subList(0, ANNOUNCE_POI_LIMIT);
}
if (type == WAYPOINTS) {
@ -364,7 +366,7 @@ public class WaypointHelper {
}
}
if (!approachPoints.isEmpty()) {
if(approachPoints.size() > APPROACH_POI_LIMIT) {
if (approachPoints.size() > APPROACH_POI_LIMIT) {
approachPoints = approachPoints.subList(0, APPROACH_POI_LIMIT);
}
if (type == WAYPOINTS) {
@ -373,10 +375,10 @@ public class WaypointHelper {
getVoiceRouter().approachPoi(lastKnownLocation, approachPoints);
} else if (type == ALARMS) {
EnumSet<AlarmInfoType> ait = EnumSet.noneOf(AlarmInfoType.class);
for(LocationPointWrapper pw : approachPoints) {
for (LocationPointWrapper pw : approachPoints) {
ait.add(((AlarmInfo) pw.point).getType());
}
for(AlarmInfoType t : ait) {
for (AlarmInfoType t : ait) {
app.getRoutingHelper().getVoiceRouter().announceAlarm(t);
}
} else if (type == FAVORITES) {
@ -392,11 +394,11 @@ public class WaypointHelper {
protected VoiceRouter getVoiceRouter() {
return app.getRoutingHelper().getVoiceRouter();
}
public boolean isRouteCalculated() {
return route != null && !route.isEmpty();
}
public List<LocationPointWrapper> getAllPoints() {
List<LocationPointWrapper> points = new ArrayList<WaypointHelper.LocationPointWrapper>();
List<List<LocationPointWrapper>> local = locationPoints;
@ -418,8 +420,8 @@ public class WaypointHelper {
for (int k = 0; k < wts.size(); k++) {
final int index = wts.size() - k - 1;
TargetPoint tp = wts.get(index);
int routeIndex ;
if(route == null) {
int routeIndex;
if (route == null) {
routeIndex = k == 0 ? Integer.MAX_VALUE : index;
} else {
routeIndex = k == 0 ? route.getImmutableAllLocations().size() - 1 : route.getIndexOfIntermediate(k - 1);
@ -435,7 +437,7 @@ public class WaypointHelper {
this.locationPoints = new ArrayList<List<LocationPointWrapper>>();
}
public void setNewRoute(RouteCalculationResult route) {
List<List<LocationPointWrapper>> locationPoints = new ArrayList<List<LocationPointWrapper>>();
recalculatePoints(route, -1, locationPoints);
@ -459,7 +461,7 @@ public class WaypointHelper {
sortList(array);
}
}
if((type == ALARMS || all)) {
if ((type == ALARMS || all)) {
final List<LocationPointWrapper> array = clearAndGetArray(locationPoints, ALARMS);
calculateAlarms(route, array);
sortList(array);
@ -473,26 +475,26 @@ public class WaypointHelper {
sortList(array);
}
}
if((type == POI || all)) {
if ((type == POI || all)) {
final List<LocationPointWrapper> array = clearAndGetArray(locationPoints, POI);
if(showPOI()) {
if (showPOI()) {
calculatePoi(route, array);
sortList(array);
}
}
}
}
private float dist(LocationPoint l, List<Location> locations, int[] ind) {
float dist = Float.POSITIVE_INFINITY;
// Special iterations because points stored by pairs!
for (int i = 1; i < locations.size(); i ++) {
for (int i = 1; i < locations.size(); i++) {
final double ld = MapUtils.getOrthogonalDistance(
l.getLatitude(), l.getLongitude(),
locations.get(i - 1).getLatitude(), locations.get(i - 1).getLongitude(),
l.getLatitude(), l.getLongitude(),
locations.get(i - 1).getLatitude(), locations.get(i - 1).getLongitude(),
locations.get(i).getLatitude(), locations.get(i).getLongitude());
if(ld < dist){
if(ind != null) {
if (ld < dist) {
if (ind != null) {
ind[0] = i;
}
dist = (float) ld;
@ -517,7 +519,7 @@ public class WaypointHelper {
public int compare(LocationPointWrapper olhs, LocationPointWrapper orhs) {
int lhs = olhs.routeIndex;
int rhs = orhs.routeIndex;
if(lhs == rhs) {
if (lhs == rhs) {
return Float.compare(olhs.deviationDistance, orhs.deviationDistance);
}
return lhs < rhs ? -1 : 1;
@ -545,31 +547,30 @@ public class WaypointHelper {
}
private void calculateAlarms(RouteCalculationResult route, List<LocationPointWrapper> array) {
for(AlarmInfo i : route.getAlarmInfo()) {
if(i.getType() == AlarmInfoType.SPEED_CAMERA) {
if(app.getSettings().SHOW_CAMERAS.get() || app.getSettings().SPEAK_SPEED_CAMERA.get()){
LocationPointWrapper lw = new LocationPointWrapper(route, ALARMS, i, 0, i.getLocationIndex());
for (AlarmInfo i : route.getAlarmInfo()) {
if (i.getType() == AlarmInfoType.SPEED_CAMERA) {
if (app.getSettings().SHOW_CAMERAS.get() || app.getSettings().SPEAK_SPEED_CAMERA.get()) {
LocationPointWrapper lw = new LocationPointWrapper(route, ALARMS, i, 0, i.getLocationIndex());
lw.setAnnounce(app.getSettings().SPEAK_SPEED_CAMERA.get());
array.add(lw);
}
} else {
if(app.getSettings().SHOW_TRAFFIC_WARNINGS.get() || app.getSettings().SPEAK_TRAFFIC_WARNINGS.get()){
LocationPointWrapper lw = new LocationPointWrapper(route, ALARMS, i, 0, i.getLocationIndex());
if (app.getSettings().SHOW_TRAFFIC_WARNINGS.get() || app.getSettings().SPEAK_TRAFFIC_WARNINGS.get()) {
LocationPointWrapper lw = new LocationPointWrapper(route, ALARMS, i, 0, i.getLocationIndex());
lw.setAnnounce(app.getSettings().SPEAK_TRAFFIC_WARNINGS.get());
array.add(lw);
}
}
}
}
private List<LocationPointWrapper> clearAndGetArray(List<List<LocationPointWrapper>> array,
int ind) {
while(array.size() <= ind) {
int ind) {
while (array.size() <= ind) {
array.add(new ArrayList<WaypointHelper.LocationPointWrapper>());
}
array.get(ind).clear();
@ -578,13 +579,13 @@ public class WaypointHelper {
private void findLocationPoints(RouteCalculationResult rt, int type, List<LocationPointWrapper> locationPoints,
List<? extends LocationPoint> points, boolean announce) {
List<? extends LocationPoint> points, boolean announce) {
List<Location> immutableAllLocations = rt.getImmutableAllLocations();
int[] ind = new int[1];
for(LocationPoint p : points) {
for (LocationPoint p : points) {
float dist = dist(p, immutableAllLocations, ind);
int rad = getSearchDeviationRadius(type);
if(dist <= rad) {
if (dist <= rad) {
LocationPointWrapper lpw = new LocationPointWrapper(rt, type, p, dist, ind[0]);
lpw.setAnnounce(announce);
locationPoints.add(lpw);
@ -597,10 +598,11 @@ public class WaypointHelper {
public PoiUIFilter getPoiFilter() {
return app.getPoiFilters().getFilterById(app.getSettings().SELECTED_POI_FILTER_FOR_MAP.get());
}
public boolean showPOI() {
return app.getSettings().SHOW_NEARBY_POI.get();
}
public boolean announcePOI() {
return app.getSettings().ANNOUNCE_NEARBY_POI.get();
}
@ -608,15 +610,15 @@ public class WaypointHelper {
public boolean showGPXWaypoints() {
return app.getSettings().SHOW_WPT.get();
}
public boolean announceGPXWaypoints() {
return app.getSettings().ANNOUNCE_WPT.get();
}
public boolean showFavorites() {
return app.getSettings().SHOW_NEARBY_FAVORITES.get();
}
public boolean announceFavorites() {
return app.getSettings().ANNOUNCE_NEARBY_FAVORITES.get();
}
@ -637,10 +639,10 @@ public class WaypointHelper {
boolean announce = true;
RouteCalculationResult route;
int type;
public LocationPointWrapper() {
}
public LocationPointWrapper(RouteCalculationResult rt, int type, LocationPoint point, float deviationDistance, int routeIndex) {
this.route = rt;
this.type = type;
@ -648,11 +650,11 @@ public class WaypointHelper {
this.deviationDistance = deviationDistance;
this.routeIndex = routeIndex;
}
public void setAnnounce(boolean announce) {
this.announce = announce;
}
public float getDeviationDistance() {
return deviationDistance;
}
@ -662,10 +664,8 @@ public class WaypointHelper {
}
public Drawable getDrawable(Context uiCtx, OsmandApplication app) {
if(type == POI) {
public Drawable getDrawable(Context uiCtx, OsmandApplication app, boolean nightMode) {
if (type == POI) {
Amenity amenity = ((AmenityLocationPoint) point).a;
PoiType st = amenity.getType().getPoiTypeByKeyName(amenity.getSubType());
if (st != null) {
@ -678,36 +678,57 @@ public class WaypointHelper {
}
}
return null;
} else if(type == TARGETS) {
int i = !((TargetPoint)point).intermediate? R.drawable.list_destination :
R.drawable.list_intermediate;
return uiCtx.getResources().getDrawable(i);
} else if(type == FAVORITES || type == WAYPOINTS) {
} else if (type == TARGETS) {
IconsCache iconsCache = app.getIconsCache();
if (((TargetPoint) point).start) {
if (app.getTargetPointsHelper().getPointToStart() == null) {
ApplicationMode appMode = app.getSettings().getApplicationMode();
return uiCtx.getResources().getDrawable(appMode.getResourceLocationDay());
} else {
return iconsCache.getContentIcon(R.drawable.ic_action_marker_dark, !nightMode);
}
} else if (((TargetPoint) point).intermediate) {
if (!nightMode) {
return iconsCache.getIcon(R.drawable.widget_intermediate_day, 0, 0f);
} else {
return iconsCache.getIcon(R.drawable.widget_intermediate_night, 0, 0f);
}
} else {
if (!nightMode) {
return iconsCache.getIcon(R.drawable.widget_target_day, 0, 0f);
} else {
return iconsCache.getIcon(R.drawable.widget_target_night, 0, 0f);
}
}
} else if (type == FAVORITES || type == WAYPOINTS) {
return FavoriteImageDrawable.getOrCreate(uiCtx, point.getColor(), false);
} else if(type == ALARMS) {
} else if (type == ALARMS) {
//assign alarm list icons manually for now
if(((AlarmInfo) point).getType().toString() == "SPEED_CAMERA") {
if (((AlarmInfo) point).getType().toString().equals("SPEED_CAMERA")) {
return uiCtx.getResources().getDrawable(R.drawable.mx_highway_speed_camera);
} else if(((AlarmInfo) point).getType().toString() == "BORDER_CONTROL") {
} else if (((AlarmInfo) point).getType().toString().equals("BORDER_CONTROL")) {
return uiCtx.getResources().getDrawable(R.drawable.mx_barrier_border_control);
} else if(((AlarmInfo) point).getType().toString() == "RAILWAY") {
if(app.getSettings().DRIVING_REGION.get().americanSigns){
} else if (((AlarmInfo) point).getType().toString().equals("RAILWAY")) {
if (app.getSettings().DRIVING_REGION.get().americanSigns) {
return uiCtx.getResources().getDrawable(R.drawable.list_warnings_railways_us);
} else {
return uiCtx.getResources().getDrawable(R.drawable.list_warnings_railways);
}
} else if(((AlarmInfo) point).getType().toString() == "TRAFFIC_CALMING") {
if(app.getSettings().DRIVING_REGION.get().americanSigns){
} else if (((AlarmInfo) point).getType().toString().equals("TRAFFIC_CALMING")) {
if (app.getSettings().DRIVING_REGION.get().americanSigns) {
return uiCtx.getResources().getDrawable(R.drawable.list_warnings_traffic_calming_us);
} else {
return uiCtx.getResources().getDrawable(R.drawable.list_warnings_traffic_calming);
}
} else if(((AlarmInfo) point).getType().toString() == "TOLL_BOOTH") {
} else if (((AlarmInfo) point).getType().toString().equals("TOLL_BOOTH")) {
return uiCtx.getResources().getDrawable(R.drawable.mx_toll_booth);
} else if(((AlarmInfo) point).getType().toString() == "STOP") {
} else if (((AlarmInfo) point).getType().toString().equals("STOP")) {
return uiCtx.getResources().getDrawable(R.drawable.list_stop);
} else if(((AlarmInfo) point).getType().toString() == "PEDESTRIAN") {
if(app.getSettings().DRIVING_REGION.get().americanSigns){
} else if (((AlarmInfo) point).getType().toString().equals("PEDESTRIAN")) {
if (app.getSettings().DRIVING_REGION.get().americanSigns) {
return uiCtx.getResources().getDrawable(R.drawable.list_warnings_pedestrian_us);
} else {
return uiCtx.getResources().getDrawable(R.drawable.list_warnings_pedestrian);
@ -715,15 +736,17 @@ public class WaypointHelper {
} else {
return null;
}
} else {
return null;
}
}
@Override
public int hashCode() {
return ((point == null) ? 0 : point.hashCode());
}
@Override
public boolean equals(Object obj) {
if (this == obj)
@ -740,15 +763,15 @@ public class WaypointHelper {
return false;
return true;
}
}
public int getSearchDeviationRadius(int type){
public int getSearchDeviationRadius(int type) {
return type == POI ? poiSearchDeviationRadius : searchDeviationRadius;
}
public void setSearchDeviationRadius(int type, int radius){
if(type == POI) {
public void setSearchDeviationRadius(int type, int radius) {
if (type == POI) {
this.poiSearchDeviationRadius = radius;
} else {
this.searchDeviationRadius = radius;
@ -758,7 +781,7 @@ public class WaypointHelper {
private class AmenityLocationPoint implements LocationPoint {
Amenity a;
public AmenityLocationPoint(Amenity a) {
this.a = a;
}
@ -773,10 +796,10 @@ public class WaypointHelper {
return a.getLocation().getLongitude();
}
@Override
public PointDescription getPointDescription(Context ctx) {
return new PointDescription(PointDescription.POINT_TYPE_POI,
return new PointDescription(PointDescription.POINT_TYPE_POI,
OsmAndFormatter.getPoiStringWithoutType(a, app.getSettings().MAP_PREFERRED_LOCALE.get()));
}

View file

@ -474,7 +474,6 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
addAsTargetAction.dlg.setButton(Dialog.BUTTON_NEGATIVE, mapActivity.getResources().getString(R.string.shared_string_skip), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
cancelSearch = true;
searchingAddress = false;
}
});
addAsTargetAction.dlg.show();

View file

@ -143,13 +143,12 @@ public abstract class MenuTitleController {
protected void acquireStreetName() {
if (searchingAddress) {
cancelSearch = true;
searchingAddress = false;
getMapActivity().getMyApplication().runInUIThread(new Runnable() {
@Override
public void run() {
acquireStreetName();
}
}, 50);
}, 100);
return;
}

View file

@ -65,6 +65,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener {
private boolean selectFromMapForTarget;
private boolean showMenu = false;
private boolean visible;
private MapActivity mapActivity;
private MapControlsLayer mapControlsLayer;
public static final String TARGET_SELECT = "TARGET_SELECT";
@ -290,8 +291,8 @@ public class MapRouteInfoMenu implements IRouteInformationListener {
});
ImageView fromIcon = (ImageView) parentView.findViewById(R.id.fromIcon);
ApplicationMode appMode = mapActivity.getMyApplication().getSettings().getApplicationMode();
if (targets.getPointToStart() == null) {
ApplicationMode appMode = mapActivity.getMyApplication().getSettings().getApplicationMode();
fromIcon.setImageDrawable(mapActivity.getResources().getDrawable(appMode.getResourceLocationDay()));
} else {
fromIcon.setImageDrawable(mapActivity.getMyApplication().getIconsCache().getContentIcon(R.drawable.ic_action_marker_dark, isLight()));
@ -375,7 +376,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener {
}
public boolean isVisible() {
return findMenuFragment() != null;
return visible;
}
public WeakReference<MapRouteInfoMenuFragment> findMenuFragment() {
@ -602,29 +603,34 @@ public class MapRouteInfoMenu implements IRouteInformationListener {
}
public void onDismiss() {
visible = false;
mapActivity.getMapView().setMapPositionX(0);
mapActivity.getMapView().refreshMap();
AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_route_land_left_margin), false);
AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_right_widgets_panel), true);
AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_left_widgets_panel), true);
if (switched) {
mapControlsLayer.switchToRouteFollowingLayout();
}
}
public void show() {
visible = true;
switched = mapControlsLayer.switchToRoutePlanningLayout();
boolean refreshMap = !switched;
boolean portrait = AndroidUiHelper.isOrientationPortrait(mapActivity);
if (!portrait) {
mapActivity.getMapView().setMapPositionX(1);
mapActivity.getMapView().refreshMap();
refreshMap = true;
}
if (refreshMap) {
mapActivity.refreshMap();
}
MapRouteInfoMenuFragment.showInstance(mapActivity);
if (!AndroidUiHelper.isXLargeDevice(mapActivity)) {
AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_right_widgets_panel), false);
AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_left_widgets_panel), false);
}
if (!portrait) {
AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_route_land_left_margin), true);
@ -635,6 +641,8 @@ public class MapRouteInfoMenu implements IRouteInformationListener {
WeakReference<MapRouteInfoMenuFragment> fragmentRef = findMenuFragment();
if (fragmentRef != null) {
fragmentRef.get().dismiss();
} else {
visible = false;
}
}
@ -677,7 +685,8 @@ public class MapRouteInfoMenu implements IRouteInformationListener {
label.setText(row.text);
Drawable icon = mapActivity.getMyApplication().getIconsCache().getContentIcon(row.iconId);
label.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
label.setCompoundDrawablePadding(dpToPx(12f));
label.setCompoundDrawablePadding(dpToPx(16f));
label.setPadding(dpToPx((16f)), 0, 0, 0);
return label;
}

View file

@ -609,20 +609,21 @@ public class RoutingHelper {
voiceRouter.newRouteIsCalculated(newRoute);
}
}
app.getWaypointHelper().setNewRoute(res);
app.runInUIThread(new Runnable() {
@Override
public void run() {
ValueHolder<Boolean> showToast = new ValueHolder<Boolean>();
showToast.value = true;
Iterator<WeakReference<IRouteInformationListener>> it = listeners.iterator();
while(it.hasNext()) {
while (it.hasNext()) {
WeakReference<IRouteInformationListener> ref = it.next();
IRouteInformationListener l = ref.get();
if(l == null) {
if (l == null) {
it.remove();
} else {
l.newRouteIsCalculated(newRoute, showToast);
l.newRouteIsCalculated(newRoute, showToast);
}
}
if (showToast.value) {
@ -635,9 +636,6 @@ public class RoutingHelper {
}
}
});
app.getWaypointHelper().setNewRoute(res);
}
public int getLeftDistance(){

View file

@ -492,7 +492,7 @@ public class MapControlsLayer extends OsmandMapLayer {
((System.currentTimeMillis() - touchEvent < TIMEOUT_TO_SHOW_BUTTONS) && routeFollowingMode);
updateMyLocation(rh, dialogOpened);
boolean showButtons = (showRouteCalculationControls || !routeFollowingMode);
routePlanningBtn.setIconResId(routeFollowingMode ? R.drawable.ic_action_gabout_dark : R.drawable.map_directions);
//routePlanningBtn.setIconResId(routeFollowingMode ? R.drawable.ic_action_gabout_dark : R.drawable.map_directions);
if (routePlanningMode || routeFollowingMode) {
routePlanningBtn.setIconResId(R.drawable.map_start_navigation);
routePlanningBtn.setIconColorId(R.color.color_myloc_distance);
@ -508,7 +508,7 @@ public class MapControlsLayer extends OsmandMapLayer {
compassHud.updateVisibility(!dialogOpened);
layersHud.updateVisibility(!dialogOpened);
if (routeFollowingMode || routePlanningMode) {
if (routePlanningMode || routeFollowingMode) {
mapAppModeShadow.setVisibility(View.GONE);
} else {
if (mapView.isZooming()) {
@ -534,7 +534,7 @@ public class MapControlsLayer extends OsmandMapLayer {
updateCompass(isNight);
for (MapHudButton mc : controls) {
mc.update(mapActivity.getMyApplication(), nightMode != null && nightMode.isNightMode());
mc.update(mapActivity.getMyApplication(), isNight);
}
}

View file

@ -0,0 +1,709 @@
package net.osmand.plus.views.controls;
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.support.annotation.NonNull;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.AbsListView;
import android.widget.HeaderViewListAdapter;
import android.widget.ListAdapter;
import com.github.ksoichiro.android.observablescrollview.ObservableListView;
import java.util.List;
public class DynamicListView extends ObservableListView {
public final String TAG_DRAG_ICON = "DragIcon";
protected final int SMOOTH_SCROLL_AMOUNT_AT_EDGE = 15;
protected final int MOVE_DURATION = 150;
protected List<Object> mItemsList;
protected List<Object> mActiveItemsList;
private DynamicListViewCallbacks dCallbacks;
private int mLastEventY = -1;
protected int mDownY = -1;
protected int mDownX = -1;
private int mTotalOffset = 0;
private boolean mCellIsMobile = false;
private boolean mIsMobileScrolling = false;
private int mSmoothScrollAmountAtEdge = 0;
private boolean itemsSwapped = false;
protected final int INVALID_ID = -1;
private long mAboveItemId = INVALID_ID;
private long mMobileItemId = INVALID_ID;
private long mBelowItemId = INVALID_ID;
private BitmapDrawable mHoverCell;
private Rect mHoverCellCurrentBounds;
private Rect mHoverCellOriginalBounds;
protected final int INVALID_POINTER_ID = -1;
private int mActivePointerId = INVALID_POINTER_ID;
private boolean mIsWaitingForScrollFinish = false;
private int mScrollState = OnScrollListener.SCROLL_STATE_IDLE;
public DynamicListView(Context context) {
super(context);
init(context);
}
public DynamicListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public DynamicListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public void init(Context context) {
setOnScrollListener(mScrollListener);
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
mSmoothScrollAmountAtEdge = (int) (SMOOTH_SCROLL_AMOUNT_AT_EDGE / metrics.density);
}
public void setDynamicListViewCallbacks(DynamicListViewCallbacks callbacks) {
dCallbacks = callbacks;
}
/**
* Creates the hover cell with the appropriate bitmap and of appropriate
* size. The hover cell's BitmapDrawable is drawn on top of the bitmap every
* single time an invalidate call is made.
*/
private BitmapDrawable getAndAddHoverView(View v) {
int w = v.getWidth();
int h = v.getHeight();
int top = v.getTop();
int left = v.getLeft();
Bitmap b = getBitmapFromView(v);
BitmapDrawable drawable = new BitmapDrawable(getResources(), b);
mHoverCellOriginalBounds = new Rect(left, top, left + w, top + h);
mHoverCellCurrentBounds = new Rect(mHoverCellOriginalBounds);
drawable.setBounds(mHoverCellCurrentBounds);
return drawable;
}
/**
* Returns a bitmap showing a screenshot of the view passed in.
*/
private Bitmap getBitmapFromView(View v) {
Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
v.draw(canvas);
Bitmap bitmapOut = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvasOut = new Canvas(bitmapOut);
canvasOut.drawColor(Color.TRANSPARENT);
Paint p = new Paint();
p.setAlpha(200);
canvasOut.drawBitmap(bitmap, 0, 0, p);
return bitmapOut;
}
public StableArrayAdapter getStableAdapter() {
ListAdapter listAdapter = getAdapter();
if (listAdapter instanceof HeaderViewListAdapter) {
listAdapter = ((HeaderViewListAdapter) listAdapter).getWrappedAdapter();
}
if (listAdapter instanceof StableArrayAdapter) {
return (StableArrayAdapter) listAdapter;
}
return null;
}
/**
* Stores a reference to the views above and below the item currently
* corresponding to the hover cell. It is important to note that if this
* item is either at the top or bottom of the list, mAboveItemId or mBelowItemId
* may be invalid.
*/
private void updateNeighborViewsForID(long itemID) {
ListAdapter adapter = getAdapter();
int position = getPositionForID(itemID);
int pos = position;
mAboveItemId = INVALID_ID;
while (mAboveItemId == INVALID_ID && pos > 0) {
pos--;
mAboveItemId = adapter.getItemId(pos);
if (mAboveItemId != INVALID_ID) {
Object obj = adapter.getItem(pos);
if (mActiveItemsList == null || !mActiveItemsList.contains(obj)) {
mAboveItemId = INVALID_ID;
}
}
}
pos = position;
mBelowItemId = INVALID_ID;
while (mBelowItemId == INVALID_ID && pos < mItemsList.size()) {
pos++;
mBelowItemId = adapter.getItemId(pos);
if (mBelowItemId != INVALID_ID) {
Object obj = adapter.getItem(pos);
if (mActiveItemsList == null || !mActiveItemsList.contains(obj)) {
mBelowItemId = INVALID_ID;
}
}
}
}
/**
* Retrieves the view in the list corresponding to itemID
*/
public View getViewForID(long itemID) {
if (itemID != INVALID_ID) {
int firstVisiblePosition = getFirstVisiblePosition();
ListAdapter adapter = getAdapter();
for (int i = 0; i < getChildCount(); i++) {
View v = getChildAt(i);
int position = firstVisiblePosition + i;
long id = adapter.getItemId(position);
if (id == itemID) {
return v;
}
}
}
return null;
}
public void setAllVisible() {
for (int i = 0; i < getChildCount(); i++) {
View v = getChildAt(i);
if (v != null && v.getVisibility() != VISIBLE) {
v.setVisibility(VISIBLE);
}
}
}
/**
* Retrieves the position in the list corresponding to itemID
*/
public int getPositionForID(long itemID) {
View v = getViewForID(itemID);
if (v == null) {
return -1;
} else {
return getPositionForView(v);
}
}
/**
* dispatchDraw gets invoked when all the child views are about to be drawn.
* By overriding this method, the hover cell (BitmapDrawable) can be drawn
* over the listview's items whenever the listview is redrawn.
*/
@Override
protected void dispatchDraw(@NonNull Canvas canvas) {
super.dispatchDraw(canvas);
if (mHoverCell != null) {
mHoverCell.draw(canvas);
}
}
@Override
public boolean onTouchEvent(@NonNull MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
if (!mCellIsMobile && mHoverCell == null) {
mDownX = (int) event.getX();
mDownY = (int) event.getY();
mActivePointerId = event.getPointerId(0);
// Find the view that the user pressed their finger down on.
View v = findViewAtPositionWithTag(getRootView(), (int) event.getRawX(), (int) event.getRawY(), TAG_DRAG_ICON);
// If the view contains a tag set to "DragIcon", it means that the user wants to
// reorder the list item.
if ((v != null) && (v.getTag() != null) && (v.getTag().equals(TAG_DRAG_ICON))) {
mTotalOffset = 0;
int position = pointToPosition(mDownX, mDownY);
if (position != INVALID_POSITION) {
Object item = getAdapter().getItem(position);
if (mActiveItemsList == null || mActiveItemsList.contains(item)) {
int itemNum = position - getFirstVisiblePosition();
itemsSwapped = false;
View selectedView = getChildAt(itemNum);
mMobileItemId = getAdapter().getItemId(position);
mHoverCell = getAndAddHoverView(selectedView);
selectedView.setVisibility(INVISIBLE);
mCellIsMobile = true;
updateNeighborViewsForID(mMobileItemId);
if (dCallbacks != null) {
dCallbacks.onItemSwapping(position);
}
}
}
}
}
break;
case MotionEvent.ACTION_MOVE:
if (mActivePointerId == INVALID_POINTER_ID) {
break;
}
int pointerIndex = event.findPointerIndex(mActivePointerId);
mLastEventY = (int) event.getY(pointerIndex);
int deltaY = mLastEventY - mDownY;
if (mCellIsMobile && mHoverCell != null) {
mHoverCellCurrentBounds.offsetTo(mHoverCellOriginalBounds.left,
mHoverCellOriginalBounds.top + deltaY + mTotalOffset);
mHoverCell.setBounds(mHoverCellCurrentBounds);
invalidate();
handleCellSwitch();
mIsMobileScrolling = false;
handleMobileCellScroll();
return false;
}
break;
case MotionEvent.ACTION_UP:
touchEventsEnded();
break;
case MotionEvent.ACTION_CANCEL:
touchEventsCancelled();
break;
case MotionEvent.ACTION_POINTER_UP:
/* If a multitouch event took place and the original touch dictating
* the movement of the hover cell has ended, then the dragging event
* ends and the hover cell is animated to its corresponding position
* in the listview. */
pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >>
MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = event.getPointerId(pointerIndex);
if (pointerId == mActivePointerId) {
touchEventsEnded();
}
break;
default:
break;
}
return super.onTouchEvent(event);
}
/**
* This method determines whether the hover cell has been shifted far enough
* to invoke a cell swap. If so, then the respective cell swap candidate is
* determined and the data set is changed. Upon posting a notification of the
* data set change, a layout is invoked to place the cells in the right place.
* Using a ViewTreeObserver and a corresponding OnPreDrawListener, we can
* offset the cell being swapped to where it previously was and then animate it to
* its new position.
*/
private void handleCellSwitch() {
final int deltaY = mLastEventY - mDownY;
final int deltaYTotal = mHoverCellOriginalBounds.top + mTotalOffset + deltaY;
View belowView = getViewForID(mBelowItemId);
View mobileView = getViewForID(mMobileItemId);
View aboveView = getViewForID(mAboveItemId);
boolean isBelow = (belowView != null) && (deltaYTotal > belowView.getTop());
boolean isAbove = (aboveView != null) && (deltaYTotal < aboveView.getTop());
if (isBelow || isAbove) {
final long switchItemID = isBelow ? mBelowItemId : mAboveItemId;
View switchView = isBelow ? belowView : aboveView;
final int originalItem = getPositionForView(mobileView) - getHeaderViewsCount();
final int switchItem = getPositionForView(switchView) - getHeaderViewsCount();
swapElements(originalItem, switchItem);
getStableAdapter().notifyDataSetChanged();
mDownY = mLastEventY;
final int switchViewStartTop = switchView.getTop();
if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.KITKAT) {
mobileView.setVisibility(View.VISIBLE);
switchView.setVisibility(View.INVISIBLE);
}
updateNeighborViewsForID(mMobileItemId);
final ViewTreeObserver observer = getViewTreeObserver();
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
observer.removeOnPreDrawListener(this);
View switchView = getViewForID(switchItemID);
mTotalOffset += deltaY;
int switchViewNewTop = switchView.getTop();
int delta = switchViewStartTop - switchViewNewTop;
switchView.setTranslationY(delta);
if (android.os.Build.VERSION.SDK_INT < 12) {
ViewCompat.animate(switchView)
.translationY(0)
.setDuration(MOVE_DURATION);
} else {
ObjectAnimator animator = ObjectAnimator.ofFloat(switchView,
View.TRANSLATION_Y, 0);
animator.setDuration(MOVE_DURATION);
animator.start();
}
return true;
}
});
}
}
private void swapElements(int indexOne, int indexTwo) {
Object obj1 = mItemsList.get(indexOne);
Object obj2 = mItemsList.get(indexTwo);
mItemsList.set(indexOne, obj2);
mItemsList.set(indexTwo, obj1);
int index1 = mActiveItemsList.indexOf(obj1);
int index2 = mActiveItemsList.indexOf(obj2);
if (index1 != -1 && index2 != -1) {
mActiveItemsList.set(index1, obj2);
mActiveItemsList.set(index2, obj1);
itemsSwapped = true;
}
}
/**
* Resets all the appropriate fields to a default state while also animating
* the hover cell back to its correct location.
*/
private void touchEventsEnded() {
final View mobileView = getViewForID(mMobileItemId);
if (mCellIsMobile || mIsWaitingForScrollFinish) {
mCellIsMobile = false;
mIsWaitingForScrollFinish = false;
mIsMobileScrolling = false;
mActivePointerId = INVALID_POINTER_ID;
// If the autoscroller has not completed scrolling, we need to wait for it to
// finish in order to determine the final location of where the hover cell
// should be animated to.
if (mScrollState != OnScrollListener.SCROLL_STATE_IDLE) {
mIsWaitingForScrollFinish = true;
return;
}
mHoverCellCurrentBounds.offsetTo(mHoverCellOriginalBounds.left, mobileView.getTop());
if (android.os.Build.VERSION.SDK_INT < 12) {
finishTouch();
} else {
/**
* This TypeEvaluator is used to animate the BitmapDrawable back to its
* final location when the user lifts his finger by modifying the
* BitmapDrawable's bounds.
*/
TypeEvaluator<Rect> sBoundEvaluator = new TypeEvaluator<Rect>() {
public Rect evaluate(float fraction, Rect startValue, Rect endValue) {
return new Rect(interpolate(startValue.left, endValue.left, fraction),
interpolate(startValue.top, endValue.top, fraction),
interpolate(startValue.right, endValue.right, fraction),
interpolate(startValue.bottom, endValue.bottom, fraction));
}
public int interpolate(int start, int end, float fraction) {
return (int) (start + fraction * (end - start));
}
};
ObjectAnimator hoverViewAnimator = ObjectAnimator.ofObject(mHoverCell, "bounds",
sBoundEvaluator, mHoverCellCurrentBounds);
hoverViewAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
invalidate();
}
});
hoverViewAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
setEnabled(false);
}
@Override
public void onAnimationEnd(Animator animation) {
finishTouch();
}
});
hoverViewAnimator.start();
}
} else {
touchEventsCancelled();
}
}
/**
* Resets all the appropriate fields to a default state.
*/
private void touchEventsCancelled() {
if (mCellIsMobile) {
finishTouch();
}
mCellIsMobile = false;
mIsMobileScrolling = false;
mActivePointerId = INVALID_POINTER_ID;
}
private void finishTouch() {
mAboveItemId = INVALID_ID;
mMobileItemId = INVALID_ID;
mBelowItemId = INVALID_ID;
setAllVisible();
mHoverCell = null;
setEnabled(true);
invalidate();
processSwapped();
}
private void processSwapped() {
if (itemsSwapped) {
itemsSwapped = false;
if (dCallbacks != null) {
dCallbacks.onItemsSwapped(mActiveItemsList);
}
}
}
/**
* Determines whether this listview is in a scrolling state invoked
* by the fact that the hover cell is out of the bounds of the listview;
*/
private void handleMobileCellScroll() {
mIsMobileScrolling = handleMobileCellScroll(mHoverCellCurrentBounds);
}
/**
* This method is in charge of determining if the hover cell is above
* or below the bounds of the listview. If so, the listview does an appropriate
* upward or downward smooth scroll so as to reveal new items.
*/
public boolean handleMobileCellScroll(Rect r) {
int offset = computeVerticalScrollOffset();
int height = getHeight();
int extent = computeVerticalScrollExtent();
int range = computeVerticalScrollRange();
int hoverViewTop = r.top;
int hoverHeight = r.height();
if (hoverViewTop <= 0 && offset > 0) {
smoothScrollBy(-mSmoothScrollAmountAtEdge, 0);
return true;
}
if (hoverViewTop + hoverHeight >= height && (offset + extent) < range) {
smoothScrollBy(mSmoothScrollAmountAtEdge, 0);
return true;
}
return false;
}
public void setItemsList(List<Object> itemsList) {
mItemsList = itemsList;
}
/*
* Define items which can be moved
* mActiveItemsList == null means all items are movable
*/
public void setActiveItemsList(List<Object> mActiveItemsList) {
this.mActiveItemsList = mActiveItemsList;
}
/**
* This scroll listener is added to the listview in order to handle cell swapping
* when the cell is either at the top or bottom edge of the listview. If the hover
* cell is at either edge of the listview, the listview will begin scrolling. As
* scrolling takes place, the listview continuously checks if new cells became visible
* and determines whether they are potential candidates for a cell swap.
*/
private AbsListView.OnScrollListener mScrollListener = new AbsListView.OnScrollListener() {
private int mPreviousFirstVisibleItem = -1;
private int mPreviousVisibleItemCount = -1;
private int mCurrentFirstVisibleItem;
private int mCurrentVisibleItemCount;
private int mCurrentScrollState;
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
mCurrentFirstVisibleItem = firstVisibleItem;
mCurrentVisibleItemCount = visibleItemCount;
mPreviousFirstVisibleItem = (mPreviousFirstVisibleItem == -1) ? mCurrentFirstVisibleItem
: mPreviousFirstVisibleItem;
mPreviousVisibleItemCount = (mPreviousVisibleItemCount == -1) ? mCurrentVisibleItemCount
: mPreviousVisibleItemCount;
checkAndHandleFirstVisibleCellChange();
checkAndHandleLastVisibleCellChange();
mPreviousFirstVisibleItem = mCurrentFirstVisibleItem;
mPreviousVisibleItemCount = mCurrentVisibleItemCount;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
mCurrentScrollState = scrollState;
mScrollState = scrollState;
isScrollCompleted();
}
/**
* This method is in charge of invoking 1 of 2 actions. Firstly, if the listview
* is in a state of scrolling invoked by the hover cell being outside the bounds
* of the listview, then this scrolling event is continued. Secondly, if the hover
* cell has already been released, this invokes the animation for the hover cell
* to return to its correct position after the listview has entered an idle scroll
* state.
*/
private void isScrollCompleted() {
if (mCurrentVisibleItemCount > 0 && mCurrentScrollState == SCROLL_STATE_IDLE) {
if (mCellIsMobile && mIsMobileScrolling) {
handleMobileCellScroll();
} else if (mIsWaitingForScrollFinish) {
touchEventsEnded();
}
}
}
/**
* Determines if the listview scrolled up enough to reveal a new cell at the
* top of the list. If so, then the appropriate parameters are updated.
*/
public void checkAndHandleFirstVisibleCellChange() {
if (mCurrentFirstVisibleItem != mPreviousFirstVisibleItem) {
if (mCellIsMobile && mMobileItemId != INVALID_ID) {
updateNeighborViewsForID(mMobileItemId);
handleCellSwitch();
}
}
}
/**
* Determines if the listview scrolled down enough to reveal a new cell at the
* bottom of the list. If so, then the appropriate parameters are updated.
*/
public void checkAndHandleLastVisibleCellChange() {
int currentLastVisibleItem = mCurrentFirstVisibleItem + mCurrentVisibleItemCount;
int previousLastVisibleItem = mPreviousFirstVisibleItem + mPreviousVisibleItemCount;
if (currentLastVisibleItem != previousLastVisibleItem) {
if (mCellIsMobile && mMobileItemId != INVALID_ID) {
updateNeighborViewsForID(mMobileItemId);
handleCellSwitch();
}
}
}
};
/**
* Returns the most inner view that contains the xy coordinate.
*
* @param v This method gets called recursively. The initial call should be the root view.
* @param x The X location to be tested.
* @param y The Y location to be tested.
* @return Returns the most inner view that contains the XY coordinate or null if no view could be found.
*/
private View findViewAtPositionWithTag(View v, int x, int y, String tag) {
View vXY = null;
if (v instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) v;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
View c = viewGroup.getChildAt(i);
int loc[] = new int[2];
c.getLocationOnScreen(loc);
if ((x >= loc[0] && (x <= (loc[0] + c.getWidth()))) && (y >= loc[1] && (y <= (loc[1] + c.getHeight())))) {
vXY = c;
View viewAtPosition = findViewAtPositionWithTag(c, x, y, tag);
if ((viewAtPosition != null) && (viewAtPosition.getTag() != null) && viewAtPosition.getTag().equals(tag)) {
vXY = viewAtPosition;
break;
}
}
}
}
return vXY;
}
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
if (dCallbacks != null) {
dCallbacks.onWindowVisibilityChanged(visibility);
}
}
}

View file

@ -0,0 +1,12 @@
package net.osmand.plus.views.controls;
import java.util.List;
public interface DynamicListViewCallbacks {
void onItemsSwapped(final List<Object> items);
void onItemSwapping(final int position);
void onWindowVisibilityChanged(int visibility);
}

View file

@ -0,0 +1,71 @@
package net.osmand.plus.views.controls;
import android.content.Context;
import android.support.annotation.NonNull;
import android.widget.ArrayAdapter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
public class StableArrayAdapter extends ArrayAdapter<Object> {
final int INVALID_ID = -1;
List<Object> objects;
List<Object> activeObjects;
HashMap<Object, Integer> mIdMap = new HashMap<>();
public StableArrayAdapter(Context context, int textViewResourceId, int titleId,
List<Object> objects, List<Object> activeObjects) {
super(context, textViewResourceId, titleId, objects);
updateObjects(objects, activeObjects);
}
public List<Object> getObjects() {
return objects;
}
public List<Object> getActiveObjects() {
return activeObjects;
}
public void updateObjects(List<Object> objects, List<Object> activeObjects) {
this.objects = objects;
this.activeObjects = activeObjects;
updateIdMap();
}
public void updateIdMap() {
HashMap<Object, Integer> idMap = new HashMap<>();
for (int i = 0; i < objects.size(); ++i) {
idMap.put(objects.get(i), i);
}
mIdMap = idMap;
}
@Override
public Object getItem(int position) {
return objects.get(position);
}
@Override
public long getItemId(int position) {
if (position < 0 || position >= mIdMap.size()) {
return INVALID_ID;
}
Object item = getItem(position);
if (mIdMap.containsKey(item)) {
return mIdMap.get(item);
} else {
return INVALID_ID;
}
}
@Override
public boolean hasStableIds() {
return true;
}
}

View file

@ -0,0 +1,885 @@
package net.osmand.plus.views.controls;
/*
* Copyright 2013 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Rect;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.v4.animation.AnimatorCompatHelper;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPropertyAnimatorListener;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.ViewPropertyAnimator;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import net.osmand.plus.R;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
/**
* A {@link View.OnTouchListener} that makes the list items in a {@link ListView}
* dismissable. {@link ListView} is given special treatment because by default it handles touches
* for its list items... i.e. it's in charge of drawing the pressed state (the list selector),
* handling list item clicks, etc.
* <p/>
* <p>After creating the listener, the caller should also call
* {@link ListView#setOnScrollListener(AbsListView.OnScrollListener)}, passing
* in the scroll listener returned by {@link #makeScrollListener()}. If a scroll listener is
* already assigned, the caller should still pass scroll changes through to this listener. This will
* ensure that this {@link SwipeDismissListViewTouchListener} is paused during list view
* scrolling.</p>
* <p/>
* <p>Example usage:</p>
* <p/>
* <pre>
* SwipeDismissListViewTouchListener touchListener =
* new SwipeDismissListViewTouchListener(
* listView,
* new SwipeDismissListViewTouchListener.OnDismissCallback() {
* public void onDismiss(ListView listView, int[] reverseSortedPositions) {
* for (int position : reverseSortedPositions) {
* adapter.remove(adapter.getItem(position));
* }
* adapter.notifyDataSetChanged();
* }
* });
* listView.setOnTouchListener(touchListener);
* listView.setOnScrollListener(touchListener.makeScrollListener());
* </pre>
* <p/>
* <p>This class Requires API level 12 or later due to use of {@link
* ViewPropertyAnimator}.</p>
* <p/>
*/
public class SwipeDismissListViewTouchListener implements View.OnTouchListener {
// Cached ViewConfiguration and system-wide constant values
private int mSlop;
private int mMinFlingVelocity;
private int mMaxFlingVelocity;
private long mAnimationTime;
// Fixed properties
private ListView mListView;
private DismissCallbacks mCallbacks;
private int mViewWidth = 1; // 1 and not 0 to prevent dividing by zero
// Transient properties
//private List<PendingDismissData> mPendingDismisses = new ArrayList<PendingDismissData>();
private int mDismissAnimationRefCount = 0;
private float mDownX;
private boolean mSwiping;
private VelocityTracker mVelocityTracker;
private int mDownPosition;
private View mSwipeDownView;
private boolean mSwipePaused;
private PopupWindow mUndoPopup;
private int mValidDelayedMsgId;
private Handler mHideUndoHandler = new HideUndoPopupHandler();
private Button mUndoButton;
private UndoStyle mUndoStyle = UndoStyle.SINGLE_POPUP;
private boolean mTouchBeforeAutoHide = false;
private SwipeDirection mSwipeDirection = SwipeDirection.BOTH;
private int mUndoHideDelay = 5000;
private int mSwipingLayout;
private final Object[] mAnimationLock = new Object[0];
private List<Undoable> mUndoActions = new ArrayList<>();
private SortedSet<PendingDismissData> mPendingDismisses = new TreeSet<>();
private List<View> mAnimatedViews = new LinkedList<>();
private View mSwipeDownChild;
private TextView mUndoPopupTextView;
private float mScreenDensity;
/**
* Defines the direction in which list items can be swiped out to delete them.
* Use {@code #setSwipeDirection(SwipeDirection)}
* to change the default behavior.
*/
public enum SwipeDirection {
/**
* The user can swipe each item into both directions (left and right) to delete it.
*/
BOTH,
/**
* The user can only swipe the items to the beginning of the item to
* delete it. The start of an item is in Left-To-Right languages the left
* side and in Right-To-Left languages the right side. Before API level
* 17 this is always the left side.
*/
START,
/**
* The user can only swipe the items to the end of the item to delete it.
* This is in Left-To-Right languages the right side in Right-To-Left
* languages the left side. Before API level 17 this will always be the
* right side.
*/
END
}
/**
* Extend this abstract class and return it from
* {@code OnDismissCallback#onDismiss(EnhancedListView, int)}
* to let the user undo the deletion you've done with your {@code OnDismissCallback}.
* You have at least to implement the {@link #undo()} method, and can override {@link #discard()}
* and {@link #getTitle()} to offer more functionality. See the README file for example implementations.
*/
public abstract static class Undoable {
/**
* This method must undo the deletion you've done in
* OnDismissCallback.onDismiss(ListView, int) and reinsert
* the element into the adapter.
* <p/>
* In the most implementations, you will only remove the list item from your adapter
* in the {@code onDismiss} method and delete it from the database (or your permanent
* storage) in {@link #discard()}. In that case you only need to reinsert the item
* to the adapter.
*/
public abstract void undo();
/**
* Returns the individual undo message for this undo. This will be displayed in the undo
* window, beside the undo button. The default implementation returns {@code null},
* what will lead in a default message to be displayed in the undo window.
* Don't call the super method, when overriding this method.
*
* @return The title for a special string.
*/
public String getTitle() {
return null;
}
/**
* Discard the undo, meaning the user has no longer the possibility to undo the deletion.
* Implement this, to finally delete your stuff from permanent storages like databases
* (whereas in onKeyDown(int, android.view.KeyEvent) you should only remove it from the
* list adapter).
*/
public void discard() {
}
}
/**
* Defines the style in which <i>undos</i> should be displayed and handled in the list.
*/
public enum UndoStyle {
/**
* Shows a popup window, that allows the user to undo the last
* dismiss. If another element is deleted, the undo popup will undo that deletion.
* The user is only able to undo the last deletion.
*/
SINGLE_POPUP,
/**
* Shows a popup window, that allows the user to undo the last dismiss.
* If another item is deleted, this will be added to the chain of undos. So pressing
* undo will undo the last deletion, pressing it again will undo the deletion before that,
* and so on. As soon as the popup vanished (e.g. because {@link #setUndoHideDelay(int) autoHideDelay}
* is over) all saved undos will be discarded.
*/
MULTILEVEL_POPUP,
/**
* Shows a popup window, that allows the user to undo the last dismisses.
* If another item is deleted, while there is still an undo popup visible, the label
* of the button changes to <i>Undo all</i> and a press on the button, will discard
* all stored undos. As soon as the popup vanished (e.g. because {@link #setUndoHideDelay(int) autoHideDelay}
* is over) all saved undos will be discarded.
*/
COLLAPSED_POPUP
}
private class PendingDismissData implements Comparable<PendingDismissData> {
public int position;
/**
* The view that should get swiped out.
*/
public View view;
/**
* The whole list item view.
*/
public View childView;
PendingDismissData(int position, View view, View childView) {
this.position = position;
this.view = view;
this.childView = childView;
}
@Override
public int compareTo(@NonNull PendingDismissData other) {
// Sort by descending position
return other.position - position;
}
}
private class UndoClickListener implements View.OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
@Override
public void onClick(View v) {
if (!mUndoActions.isEmpty()) {
switch (mUndoStyle) {
case SINGLE_POPUP:
mUndoActions.get(0).undo();
mUndoActions.clear();
break;
case COLLAPSED_POPUP:
Collections.reverse(mUndoActions);
for (Undoable undo : mUndoActions) {
undo.undo();
}
mUndoActions.clear();
break;
case MULTILEVEL_POPUP:
mUndoActions.get(mUndoActions.size() - 1).undo();
mUndoActions.remove(mUndoActions.size() - 1);
break;
}
}
// Dismiss dialog or change text
if (mUndoActions.isEmpty()) {
if (mUndoPopup.isShowing()) {
mUndoPopup.dismiss();
}
} else {
changePopupText();
changeButtonLabel();
}
mValidDelayedMsgId++;
}
}
private class HideUndoPopupHandler extends Handler {
/**
* Subclasses must implement this to receive messages.
*/
@Override
public void handleMessage(Message msg) {
if (msg.what == mValidDelayedMsgId) {
discardUndo();
}
}
}
/**
* The callback interface used by {@link SwipeDismissListViewTouchListener} to inform its client
* about a successful dismissal of one or more list item positions.
*/
public interface DismissCallbacks {
/**
* Called to determine whether the given position can be dismissed.
*/
boolean canDismiss(int position);
/**
* Called when the user has indicated they she would like to dismiss one or more list item
* positions.
*
* @param position Position to dismiss
*/
Undoable onDismiss(int position);
/**
* Called when popup is going to be hidden after time expired (not when UNDO clicked)
*/
void onHidePopup();
}
/**
* Constructs a new swipe-to-dismiss touch listener for the given list view.
*
* @param listView The list view whose items should be dismissable.
* @param callbacks The callback to trigger when the user has indicated that she would like to
* dismiss one or more list items.
*/
public SwipeDismissListViewTouchListener(ListView listView, DismissCallbacks callbacks) {
ViewConfiguration vc = ViewConfiguration.get(listView.getContext());
mSlop = vc.getScaledTouchSlop();
mMinFlingVelocity = vc.getScaledMinimumFlingVelocity() * 16;
mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity();
mAnimationTime = listView.getContext().getResources().getInteger(
android.R.integer.config_shortAnimTime);
mListView = listView;
mCallbacks = callbacks;
// Initialize undo popup
LayoutInflater inflater = (LayoutInflater) listView.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View undoView = inflater.inflate(R.layout.undo_popup, null);
mUndoButton = (Button) undoView.findViewById(R.id.undo);
mUndoButton.setOnClickListener(new UndoClickListener());
mUndoButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// If the user touches the screen invalidate the current running delay by incrementing
// the valid message id. So this delay won't hide the undo popup anymore
mValidDelayedMsgId++;
return false;
}
});
mUndoPopupTextView = (TextView) undoView.findViewById(R.id.text);
mUndoPopup = new PopupWindow(undoView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, false);
mUndoPopup.setAnimationStyle(R.style.Animations_PopUpMenu_Fade);
mScreenDensity = listView.getResources().getDisplayMetrics().density;
// END initialize undo popup
mListView.setOnTouchListener(this);
// Setting this scroll listener is required to ensure that during ListView scrolling,
// we don't look for swipes.
mListView.setOnScrollListener(makeScrollListener());
}
/**
* Enables or disables (pauses or resumes) watching for swipe-to-dismiss gestures.
*
* @param enabled Whether or not to watch for gestures.
*/
public void setEnabled(boolean enabled) {
mSwipePaused = !enabled;
}
/**
* Sets the undo style of this list.
*
* @param undoStyle The style of this listview.
*/
public void setUndoStyle(UndoStyle undoStyle) {
mUndoStyle = undoStyle;
}
/**
* Sets the time in milliseconds after which the undo popup automatically disappears.
* The countdown will start when the user touches the screen. If you want to start the countdown
* immediately when the popups appears, call {@link #setRequireTouchBeforeDismiss(boolean)} with
* {@code false}.
*
* @param hideDelay The delay in milliseconds.
*/
public void setUndoHideDelay(int hideDelay) {
mUndoHideDelay = hideDelay;
}
/**
* Sets whether another touch on the view is required before the popup counts down to dismiss
* the undo popup. By default this is set to {@code true}.
*
* @param touchBeforeDismiss Whether the screen needs to be touched before the countdown starts.
* @see #setUndoHideDelay(int)
*/
public void setRequireTouchBeforeDismiss(boolean touchBeforeDismiss) {
mTouchBeforeAutoHide = touchBeforeDismiss;
}
/**
* Sets the directions in which a list item can be swiped to delete.
* By default this is set to {@link SwipeDirection#BOTH} so that an item
* can be swiped into both directions.
*/
public void setSwipeDirection(SwipeDirection direction) {
mSwipeDirection = direction;
}
/**
* Sets the id of the view, that should be moved, when the user swipes an item.
* Only the view with the specified id will move, while all other views in the list item, will
* stay where they are. This might be usefull to have a background behind the view that is swiped
* out, to stay where it is (and maybe explain that the item is going to be deleted).
* If you never call this method (or call it with 0), the whole view will be swiped. Also if there
* is no view in a list item, with the given id, the whole view will be swiped.
*/
public void setSwipingLayout(int swipingLayoutId) {
mSwipingLayout = swipingLayoutId;
}
/**
* Discard all stored undos and hide the undo popup dialog.
* This method must be called in {@link android.app.Activity#onStop()}. Otherwise
* might not be called for several items, what might
* break your data consistency.
*/
public void discardUndo() {
for (Undoable undoable : mUndoActions) {
undoable.discard();
}
mUndoActions.clear();
if (mCallbacks != null) {
mCallbacks.onHidePopup();
}
if (mUndoPopup.isShowing()) {
mUndoPopup.dismiss();
}
}
/**
* Delete the list item at the specified position. This will animate the item sliding out of the
* list and then collapsing until it vanished (same as if the user slides out an item).
* <p/>
* NOTE: If you are using list headers, be aware, that the position argument must take care of
* them. Meaning 0 references the first list header. So if you want to delete the first list
* item, you have to pass the number of list headers as {@code position}. Most of the times
* that shouldn't be a problem, since you most probably will evaluate the position which should
* be deleted in a way, that respects the list headers.
*/
public void delete(int position) {
if (mCallbacks == null) {
throw new IllegalStateException("You must set an OnDismissCallback, before deleting items.");
}
if (position < 0 || position >= mListView.getCount()) {
throw new IndexOutOfBoundsException(String.format("Tried to delete item %d. #items in list: %d", position, mListView.getCount()));
}
View childView = mListView.getChildAt(position - mListView.getFirstVisiblePosition());
View view = null;
if (mSwipingLayout > 0) {
view = childView.findViewById(mSwipingLayout);
}
if (view == null) {
view = childView;
}
slideOutView(view, childView, position, true);
}
/**
* Slide out a view to the right or left of the list. After the animation has finished, the
* view will be dismissed by calling {@link #performDismiss(android.view.View, android.view.View, int)}.
*
* @param view The view, that should be slided out.
* @param childView The whole view of the list item.
* @param position The item position of the item.
* @param toRightSide Whether it should slide out to the right side.
*/
private void slideOutView(final View view, final View childView, final int position, boolean toRightSide) {
// Only start new animation, if this view isn't already animated (too fast swiping bug)
synchronized (mAnimationLock) {
if (mAnimatedViews.contains(view)) {
return;
}
++mDismissAnimationRefCount;
mAnimatedViews.add(view);
}
ViewCompat.animate(view)
.translationX(toRightSide ? mViewWidth : -mViewWidth)
.alpha(0)
.setDuration(mAnimationTime)
.setListener(new ViewPropertyAnimatorListener() {
@Override
public void onAnimationStart(View view) {
}
@Override
public void onAnimationEnd(View view) {
performDismiss(view, childView, position);
}
@Override
public void onAnimationCancel(View view) {
}
});
}
/**
* Returns an {@link AbsListView.OnScrollListener} to be added to the {@link
* ListView} using {@link ListView#setOnScrollListener(AbsListView.OnScrollListener)}.
* If a scroll listener is already assigned, the caller should still pass scroll changes through
* to this listener. This will ensure that this {@link SwipeDismissListViewTouchListener} is
* paused during list view scrolling.</p>
*
* @see SwipeDismissListViewTouchListener
*/
public AbsListView.OnScrollListener makeScrollListener() {
return new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
setEnabled(scrollState != AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL);
}
@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {
}
};
}
@Override
public boolean onTouch(View view, MotionEvent ev) {
if (mViewWidth < 2) {
mViewWidth = mListView.getWidth();
}
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
if (mSwipePaused) {
return false;
}
// TODO: ensure this is a finger, and set a flag
// Find the child view that was touched (perform a hit test)
Rect rect = new Rect();
int childCount = mListView.getChildCount();
int[] listViewCoords = new int[2];
mListView.getLocationOnScreen(listViewCoords);
int x = (int) ev.getRawX() - listViewCoords[0];
int y = (int) ev.getRawY() - listViewCoords[1];
View child;
for (int i = mListView.getHeaderViewsCount(); i < childCount; i++) {
child = mListView.getChildAt(i);
if (child != null) {
child.getHitRect(rect);
if (rect.contains(x, y)) {
// if a specific swiping layout has been giving, use this to swipe.
if (mSwipingLayout > 0) {
View swipingView = child.findViewById(mSwipingLayout);
if (swipingView != null) {
mSwipeDownView = swipingView;
mSwipeDownChild = child;
break;
}
}
// If no swiping layout has been found, swipe the whole child
mSwipeDownView = mSwipeDownChild = child;
break;
}
}
}
if (mSwipeDownView != null) {
// test if the item should be swiped
int position = mListView.getPositionForView(mSwipeDownView) - mListView.getHeaderViewsCount();
if (mCallbacks == null || mCallbacks.canDismiss(position)) {
mDownX = ev.getRawX();
mDownPosition = position;
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(ev);
} else {
// set back to null to revert swiping
mSwipeDownView = mSwipeDownChild = null;
}
}
return false;
}
case MotionEvent.ACTION_CANCEL: {
if (mVelocityTracker == null) {
break;
}
if (mSwipeDownView != null && mSwiping) {
// cancel
ViewCompat.animate(mSwipeDownView)
.translationX(0)
.alpha(1)
.setDuration(mAnimationTime)
.setListener(null);
}
mVelocityTracker.recycle();
mVelocityTracker = null;
mDownX = 0;
mSwipeDownView = mSwipeDownChild = null;
mDownPosition = ListView.INVALID_POSITION;
mSwiping = false;
break;
}
case MotionEvent.ACTION_UP: {
if (mVelocityTracker == null) {
break;
}
float deltaX = ev.getRawX() - mDownX;
mVelocityTracker.addMovement(ev);
mVelocityTracker.computeCurrentVelocity(1000);
float velocityX = Math.abs(mVelocityTracker.getXVelocity());
float velocityY = Math.abs(mVelocityTracker.getYVelocity());
boolean dismiss = false;
boolean dismissRight = false;
if (Math.abs(deltaX) > mViewWidth / 2 && mSwiping) {
dismiss = true;
dismissRight = deltaX > 0;
} else if (mMinFlingVelocity <= velocityX && velocityX <= mMaxFlingVelocity
&& velocityY < velocityX && mSwiping && isSwipeDirectionValid(mVelocityTracker.getXVelocity())
&& deltaX >= mViewWidth * 0.2f) {
dismiss = true;
dismissRight = mVelocityTracker.getXVelocity() > 0;
}
if (dismiss) {
// dismiss
slideOutView(mSwipeDownView, mSwipeDownChild, mDownPosition, dismissRight);
} else if (mSwiping) {
// Swipe back to regular position
ViewCompat.animate(mSwipeDownView)
.translationX(0)
.alpha(1)
.setDuration(mAnimationTime)
.setListener(null);
}
mVelocityTracker = null;
mDownX = 0;
mSwipeDownView = null;
mSwipeDownChild = null;
mDownPosition = AbsListView.INVALID_POSITION;
mSwiping = false;
break;
}
case MotionEvent.ACTION_MOVE: {
if (mVelocityTracker == null || mSwipePaused) {
break;
}
mVelocityTracker.addMovement(ev);
float deltaX = ev.getRawX() - mDownX;
// Only start swipe in correct direction
if (isSwipeDirectionValid(deltaX)) {
ViewParent parent = mListView.getParent();
if (parent != null) {
// If we swipe don't allow parent to intercept touch (e.g. like NavigationDrawer does)
// otherwise swipe would not be working.
parent.requestDisallowInterceptTouchEvent(true);
}
if (Math.abs(deltaX) > mSlop) {
mSwiping = true;
mListView.requestDisallowInterceptTouchEvent(true);
// Cancel ListView's touch (un-highlighting the item)
MotionEvent cancelEvent = MotionEvent.obtain(ev);
cancelEvent.setAction(MotionEvent.ACTION_CANCEL
| (ev.getActionIndex()
<< MotionEvent.ACTION_POINTER_INDEX_SHIFT));
mListView.onTouchEvent(cancelEvent);
}
} else {
// If we swiped into wrong direction, act like this was the new
// touch down point
mDownX = ev.getRawX();
deltaX = 0;
}
if (mSwiping) {
mSwipeDownView.setTranslationX(deltaX);
mSwipeDownView.setAlpha(Math.max(0f, Math.min(1f,
1f - 2f * Math.abs(deltaX) / mViewWidth)));
return true;
}
break;
}
}
return false;
}
/**
* Animate the dismissed list item to zero-height and fire the dismiss callback when
* all dismissed list item animations have completed.
*
* @param dismissView The view that has been slided out.
* @param listItemView The list item view. This is the whole view of the list item, and not just
* the part, that the user swiped.
* @param dismissPosition The position of the view inside the list.
*/
private void performDismiss(final View dismissView, final View listItemView, final int dismissPosition) {
final ViewGroup.LayoutParams lp = listItemView.getLayoutParams();
final int originalLayoutHeight = lp.height;
if (android.os.Build.VERSION.SDK_INT < 12) {
mPendingDismisses.add(new PendingDismissData(dismissPosition, dismissView, listItemView));
finishDismiss(dismissView, originalLayoutHeight);
} else {
int originalHeight = listItemView.getHeight();
ValueAnimator animator = ValueAnimator.ofInt(originalHeight, 1).setDuration(mAnimationTime);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
finishDismiss(dismissView, originalLayoutHeight);
}
});
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
lp.height = (Integer) valueAnimator.getAnimatedValue();
listItemView.setLayoutParams(lp);
}
});
mPendingDismisses.add(new PendingDismissData(dismissPosition, dismissView, listItemView));
animator.start();
}
}
private void finishDismiss(View dismissView, int originalLayoutHeight) {
// Make sure no other animation is running. Remove animation from running list, that just finished
boolean noAnimationLeft;
synchronized (mAnimationLock) {
--mDismissAnimationRefCount;
mAnimatedViews.remove(dismissView);
noAnimationLeft = mDismissAnimationRefCount == 0;
}
if (noAnimationLeft) {
// No active animations, process all pending dismisses.
for (PendingDismissData dismiss : mPendingDismisses) {
if (mUndoStyle == UndoStyle.SINGLE_POPUP) {
for (Undoable undoable : mUndoActions) {
undoable.discard();
}
mUndoActions.clear();
}
Undoable undoable = mCallbacks.onDismiss(dismiss.position);
if (undoable != null) {
mUndoActions.add(undoable);
}
mValidDelayedMsgId++;
}
if (!mUndoActions.isEmpty()) {
changePopupText();
changeButtonLabel();
// Show undo popup
float yLocationOffset = mListView.getResources().getDimension(R.dimen.undo_bottom_offset);
mUndoPopup.setWidth((int) Math.min(mScreenDensity * 400, mListView.getWidth() * 0.9f));
mUndoPopup.showAtLocation(mListView,
Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM,
0, (int) yLocationOffset);
// Queue the dismiss only if required
if (!mTouchBeforeAutoHide) {
// Send a delayed message to hide popup
mHideUndoHandler.sendMessageDelayed(mHideUndoHandler.obtainMessage(mValidDelayedMsgId),
mUndoHideDelay);
}
}
ViewGroup.LayoutParams lp;
for (PendingDismissData pendingDismiss : mPendingDismisses) {
pendingDismiss.view.setAlpha(1f);
pendingDismiss.view.setTranslationX(0);
lp = pendingDismiss.childView.getLayoutParams();
lp.height = originalLayoutHeight;
pendingDismiss.childView.setLayoutParams(lp);
}
mPendingDismisses.clear();
}
}
/**
* Changes the text of the undo popup. If more then one item can be undone, the number of deleted
* items will be shown. If only one deletion can be undone, the title of this deletion (or a default
* string in case the title is {@code null}) will be shown.
*/
private void changePopupText() {
String msg = null;
if (mUndoActions.size() > 1) {
msg = mUndoActions.size() + " " + mListView.getResources().getString(R.string.n_items_deleted);
} else if (mUndoActions.size() >= 1) {
// Set title from single undoable or when no multiple deletion string
// is given
msg = mUndoActions.get(mUndoActions.size() - 1).getTitle();
if (msg == null) {
msg = mListView.getResources().getString(R.string.item_deleted);
}
}
mUndoPopupTextView.setText(msg);
}
/**
* Changes the label of the undo button.
*/
private void changeButtonLabel() {
String msg;
if (mUndoActions.size() > 1 && mUndoStyle == UndoStyle.COLLAPSED_POPUP) {
msg = mListView.getResources().getString(R.string.shared_string_undo_all);
} else {
msg = mListView.getResources().getString(R.string.shared_string_undo);
}
mUndoButton.setText(msg);
}
private boolean isSwipeDirectionValid(float deltaX) {
int rtlSign = 1;
// On API level 17 and above, check if we are in a Right-To-Left layout
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
if (mListView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
rtlSign = -1;
}
}
// Check if swipe has been done in the correct direction
switch (mSwipeDirection) {
default:
case BOTH:
return true;
case START:
return rtlSign * deltaX < 0;
case END:
return rtlSign * deltaX > 0;
}
}
}

View file

@ -321,7 +321,7 @@ public class MapInfoWidgetsFactory {
boolean updated = updateVisibility(waypointInfoBar, true);
// pass top bar to make it clickable
WaypointDialogHelper.updatePointInfoView(map.getMyApplication(), map, topBar,
pnt, true, !map.getMyApplication().getSettings().isLightContent());
pnt, true, !map.getMyApplication().getSettings().isLightContent(), false);
if (updated || changed) {
ImageView all = (ImageView) waypointInfoBar.findViewById(R.id.waypoint_more);
ImageView remove = (ImageView) waypointInfoBar.findViewById(R.id.waypoint_close);