Merge branch 'master' of https://github.com/osmandapp/Osmand into Wiki

# Conflicts:
#	OsmAnd/res/values-it/strings.xml
#	OsmAnd/res/values-zh-rTW/strings.xml
This commit is contained in:
Vitaliy 2020-04-16 16:18:09 +03:00
commit 309da9c907
76 changed files with 3183 additions and 757 deletions

View file

@ -72,6 +72,10 @@ public interface OsmAndCustomizationConstants {
//Map Context Menu Actions:
String MAP_CONTEXT_MENU_ACTIONS = "point.actions.";
String MAP_CONTEXT_MENU_ADD_ID = MAP_CONTEXT_MENU_ACTIONS + "add";
String MAP_CONTEXT_MENU_MARKER_ID = MAP_CONTEXT_MENU_ACTIONS + "marker";
String MAP_CONTEXT_MENU_SHARE_ID = MAP_CONTEXT_MENU_ACTIONS + "share";
String MAP_CONTEXT_MENU_MORE_ID = MAP_CONTEXT_MENU_ACTIONS + "more";
String MAP_CONTEXT_MENU_DIRECTIONS_FROM_ID = MAP_CONTEXT_MENU_ACTIONS + "directions_from";
String MAP_CONTEXT_MENU_SEARCH_NEARBY = MAP_CONTEXT_MENU_ACTIONS + "search_nearby";
String MAP_CONTEXT_MENU_CHANGE_MARKER_POSITION = MAP_CONTEXT_MENU_ACTIONS + "change_m_position";

View file

@ -39,7 +39,6 @@ import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
@ -346,7 +345,7 @@ public class SearchUICore {
}
}
public void setFilterOrders(Map<String, Integer> filterOrders) {
public void setFilterOrders(List<String> filterOrders) {
for (SearchCoreAPI capi : apis) {
if (capi instanceof SearchAmenityTypesAPI) {
((SearchAmenityTypesAPI) capi).setFilterOrders(filterOrders);

View file

@ -639,7 +639,7 @@ public class SearchCoreFactory {
private List<CustomSearchPoiFilter> customPoiFilters = new ArrayList<>();
private TIntArrayList customPoiFiltersPriorites = new TIntArrayList();
private MapPoiTypes types;
private Map<String, Integer> filterOrders = new HashMap<>();
private List<String> filterOrders = new ArrayList<>();
public SearchAmenityTypesAPI(MapPoiTypes types) {
super(ObjectType.POI_TYPE);
@ -656,7 +656,7 @@ public class SearchCoreFactory {
this.customPoiFiltersPriorites.add(priority);
}
public void setFilterOrders(Map<String, Integer> filterOrders) {
public void setFilterOrders(List<String> filterOrders) {
this.filterOrders = filterOrders;
}
@ -737,8 +737,8 @@ public class SearchCoreFactory {
res.firstUnknownWordMatches = startMatch.matches(res.localeName);
if (showTopFiltersOnly) {
String stdFilterId = getStandardFilterId(pt);
if (filterOrders.containsKey(stdFilterId)) {
res.priority = SEARCH_AMENITY_TYPE_PRIORITY + filterOrders.get(stdFilterId);
if (filterOrders.contains(stdFilterId)) {
res.priority = SEARCH_AMENITY_TYPE_PRIORITY + filterOrders.indexOf(stdFilterId);
resultMatcher.publish(res);
}
} else {
@ -754,8 +754,8 @@ public class SearchCoreFactory {
res.object = csf;
res.objectType = ObjectType.POI_TYPE;
if (showTopFiltersOnly) {
if (filterOrders.containsKey(csf.getFilterId())) {
res.priority = SEARCH_AMENITY_TYPE_PRIORITY + filterOrders.get(csf.getFilterId());
if (filterOrders.contains(csf.getFilterId())) {
res.priority = SEARCH_AMENITY_TYPE_PRIORITY + filterOrders.indexOf(csf.getFilterId());
resultMatcher.publish(res);
}
} else {

View file

@ -160,8 +160,8 @@
<string name="by_name">Ada göre</string>
<string name="by_group">Gruba göre</string>
<string name="shared_string_sort_by">Sıralama kriteri</string>
<string name="choose_osmand_desc">Kişilerin haritada görüntüleneceği OsmAnd versiyonunu seçin.</string>
<string name="choose_osmand">Kullanılacak OsmAnd versiyonunu seçin</string>
<string name="choose_osmand_desc">Kişilerin haritada görüntüleneceği OsmAnd sürümünü seçin.</string>
<string name="choose_osmand">Kullanılacak OsmAnd sürümünü seçin</string>
<string name="disable_all_sharing_desc">Konum paylaşımını tüm seçili sohbetlere kapatır (%1$d).</string>
<string name="disable_all_sharing">Tüm paylaşımı devre dışı bırak</string>
<string name="turn_off_all">Hepsini kapat</string>
@ -176,7 +176,7 @@
<string name="connected_account">Bağlı hesap</string>
<string name="shared_string_account">Hesap</string>
<string name="in_time">%1$s içinde</string>
<string name="osmand_connect_desc">Konumları görüntülemek için OsmAnd Tracker\'ın kullandığı OsmAnd versiyonunu seçin.</string>
<string name="osmand_connect_desc">Konumları görüntülemek için OsmAnd Tracker\'ın kullandığı OsmAnd sürümünü seçin.</string>
<string name="osmand_connect">OsmAnd bağlan</string>
<string name="location_history_desc">Belirli bir süre içinde hareket etmemiş kişileri gizle.</string>
<string name="location_history">Konum geçmişi</string>
@ -213,7 +213,7 @@
<string name="show_on_map">Haritada göster</string>
<string name="app_name">OsmAnd Çevrim İçi GPS İzleyici</string>
<string name="phone_number_title">Telefon numarası</string>
<string name="phone_number_descr">Uluslararası formatta telefon numarası</string>
<string name="phone_number_descr">Uluslararası biçimde telefon numarası</string>
<string name="shared_string_password">Parola</string>
<string name="enter_code">Kodu girin</string>
<string name="authentication_code">Kimlik doğrulama kodu</string>
@ -240,8 +240,8 @@
<string name="show_users_on_map">Kullanıcıları haritada göster</string>
<string name="active_chats">Aktif sohbetler</string>
<string name="shared_string_authorization">Yetkilendirme</string>
<string name="shared_string_authorization_descr">Lütfen Telegram telefon numaranızı uluslararası formatta girin</string>
<string name="shared_string_welcome">Hoşgeldiniz</string>
<string name="shared_string_authorization_descr">Lütfen Telegram telefon numaranızı uluslararası biçimde girin</string>
<string name="shared_string_welcome">Hoş geldiniz</string>
<string name="shared_string_hour_short">sa</string>
<string name="shared_string_minute_short">dk</string>
<string name="shared_string_second_short">sn</string>
@ -251,7 +251,7 @@
<string name="timeline">Zaman çizelgesi</string>
<string name="time_zone_descr">Konum mesajlarınızda gösterilecek saat dilimini seçin.</string>
<string name="time_zone">Saat dilimi</string>
<string name="units_and_formats">Birimler ve formatlar</string>
<string name="units_and_formats">Birimler ve biçimler</string>
<string name="unit_of_length_descr">Mesafe ölçüm birimini değiştir.</string>
<string name="unit_of_length">Uzunluk birimleri</string>
<string name="unit_of_speed_system_descr">Hız birimini tanımlayın.</string>

View file

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,22C17.5228,22 22,17.5228 22,12C22,6.4771 17.5228,2 12,2C6.4771,2 2,6.4771 2,12C2,17.5228 6.4771,22 12,22Z"
android:strokeAlpha="0.2"
android:fillColor="#ffffff"
android:fillType="evenOdd"
android:fillAlpha="0.2"/>
<path
android:pathData="M9,9L15,15M15,9L9,15"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#ffffff"
android:strokeLineCap="round"/>
</vector>

View file

@ -0,0 +1,31 @@
<?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:id="@+id/item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:gravity="center"
android:orientation="vertical"
android:paddingTop="@dimen/context_menu_main_actions_padding_top"
android:paddingBottom="@dimen/context_menu_main_actions_padding_bottom">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/context_menu_main_actions_icon_margin"
android:scaleType="center" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/ctx_menu_buttons_text_color"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular" />
</LinearLayout>

View file

@ -8,11 +8,7 @@
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<include layout="@layout/global_preference_toolbar" />
</com.google.android.material.appbar.AppBarLayout>
android:layout_height="wrap_content" />
<FrameLayout
android:layout_width="match_parent"

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="?attr/activity_background_color"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<include layout="@layout/global_preference_toolbar" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/list_background_color"
tools:listitem="@layout/list_item_ui_customization" />
</LinearLayout>

View file

@ -47,23 +47,4 @@
tools:listitem="@layout/gpx_track_select_item">
</androidx.recyclerview.widget.RecyclerView>
<LinearLayout
android:id="@+id/buttons_container"
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="vertical"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/content_padding_small"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingBottom="@dimen/content_padding_small">
<include
android:id="@+id/dismiss_button"
layout="@layout/bottom_sheet_dialog_button"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>

View file

@ -2,7 +2,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/settings_divider_margin_start"
android:layout_height="wrap_content"
android:minHeight="@dimen/settings_divider_margin_start"
android:background="?attr/selectableItemBackground"
android:orientation="horizontal">
@ -21,7 +22,7 @@
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/list_content_padding"
android:layout_marginLeft="@dimen/list_content_padding"
android:layout_marginEnd="@dimen/list_content_padding"

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:id="@+id/image_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/activity_background_basic"
tools:paddingEnd="56dp"
tools:paddingStart="56dp"
tools:paddingTop="16dp">
<ImageView
android:id="@+id/device_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
tools:src="@drawable/img_settings_device_top_dark" />
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
tools:src="@drawable/img_settings_customize_configure_map_night" />
</FrameLayout>
<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/content_padding"
android:letterSpacing="0.02"
android:lineSpacingExtra="@dimen/line_spacing_extra_description"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
tools:text="@string/ui_customization_description" />
</LinearLayout>

View file

@ -0,0 +1,93 @@
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/list_background_color"
android:minHeight="@dimen/list_item_move_header_min_height"
android:orientation="vertical">
<View
android:id="@+id/divider"
android:background="?attr/dashboard_divider"
android:layout_width="match_parent"
android:layout_height="1dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/bottom_sheet_icon_margin"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingBottom="@dimen/bottom_sheet_icon_margin"
android:visibility="gone"
tools:visibility="visible"
android:src="@drawable/ic_action_item_move"
android:tint="?attr/secondary_icon_color" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="vertical"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:letterSpacing="@dimen/description_letter_spacing"
android:paddingTop="@dimen/list_header_settings_top_margin"
android:singleLine="true"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="@string/plugin_settings" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:letterSpacing="@dimen/description_letter_spacing"
android:paddingBottom="@dimen/list_header_settings_top_margin"
android:lineSpacingExtra="@dimen/line_spacing_extra_description"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular"
tools:text="@string/list_of_installed_plugins" />
</LinearLayout>
<ImageView
android:id="@+id/move_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/bottom_sheet_icon_margin"
android:paddingEnd="@dimen/content_padding"
android:visibility="gone"
tools:visibility="visible"
android:paddingRight="@dimen/content_padding"
android:paddingBottom="@dimen/bottom_sheet_icon_margin"
android:src="@drawable/ic_action_item_move"
android:tint="?attr/secondary_icon_color" />
</LinearLayout>
</LinearLayout>

View file

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="@dimen/setting_list_item_large_height"
android:orientation="horizontal">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginEnd="@dimen/list_content_padding_large"
android:layout_marginRight="@dimen/list_content_padding_large"
tools:src="@drawable/ic_action_layers" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
tools:text="Configure Map" />
<TextView
android:id="@+id/sub_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
tools:text="Items: 15 of 16" />
</LinearLayout>
</LinearLayout>

View file

@ -419,136 +419,7 @@
android:paddingStart="@dimen/map_widget_icon_margin"
android:paddingEnd="@dimen/map_widget_icon_margin">
<LinearLayout
android:id="@+id/context_menu_fav_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="?selectableItemBackground"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="@dimen/context_menu_main_actions_padding_bottom"
android:paddingTop="@dimen/context_menu_main_actions_padding_top">
<ImageView
android:id="@+id/context_menu_fav_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/context_menu_main_actions_icon_margin"
android:scaleType="center"
android:src="@drawable/map_action_fav_dark"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/context_menu_fav_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/ctx_menu_buttons_text_color"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular"
tools:text="@string/shared_string_add"/>
</LinearLayout>
<LinearLayout
android:id="@+id/context_menu_route_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="?selectableItemBackground"
android:clickable="true"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="@dimen/context_menu_main_actions_padding_bottom"
android:paddingTop="@dimen/context_menu_main_actions_padding_top">
<ImageView
android:id="@+id/context_menu_route_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/context_menu_main_actions_icon_margin"
android:scaleType="center"
android:src="@drawable/map_action_flag_dark"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/context_menu_route_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/ctx_menu_buttons_text_color"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular"
tools:text="@string/shared_string_marker"/>
</LinearLayout>
<LinearLayout
android:id="@+id/context_menu_share_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="?selectableItemBackground"
android:clickable="true"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="@dimen/context_menu_main_actions_padding_bottom"
android:paddingTop="@dimen/context_menu_main_actions_padding_top">
<ImageView
android:id="@+id/context_menu_share_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/context_menu_main_actions_icon_margin"
android:scaleType="center"
android:src="@drawable/map_action_gshare_dark"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/context_menu_share_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/shared_string_share"
android:textColor="@color/ctx_menu_buttons_text_color"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular"/>
</LinearLayout>
<LinearLayout
android:id="@+id/context_menu_more_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="?selectableItemBackground"
android:clickable="true"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="@dimen/context_menu_main_actions_padding_bottom"
android:paddingTop="@dimen/context_menu_main_actions_padding_top">
<ImageView
android:id="@+id/context_menu_more_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/context_menu_main_actions_icon_margin"
android:scaleType="center"
android:src="@drawable/map_overflow_menu_white"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/context_menu_more_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/shared_string_actions"
android:textColor="@color/ctx_menu_buttons_text_color"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular"/>
</LinearLayout>
<!--Filled programmatically-->
</LinearLayout>

View file

@ -47,7 +47,7 @@
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:ellipsize="marquee"
android:paddingLeft="@dimen/content_padding"
android:paddingLeft="0dp"
android:paddingRight="@dimen/content_padding"
android:paddingTop="@dimen/content_padding_half"
android:paddingBottom="@dimen/content_padding_half"
@ -56,7 +56,7 @@
osmand:typeface="@string/font_roboto_regular"
tools:text="@string/poi_aerialway_transport"
android:paddingEnd="@dimen/content_padding"
android:paddingStart="@dimen/content_padding" />
android:paddingStart="0dp" />
<ImageView
android:id="@+id/move_icon"

View file

@ -4,9 +4,19 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="?attr/list_background_color"
android:gravity="center_vertical">
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="@dimen/content_padding_small"
android:background="?attr/dashboard_divider"
android:visibility="gone"
tools:visibility="visible" />
<LinearLayout
android:id="@+id/selectable_list_item"
android:layout_width="match_parent"
@ -70,6 +80,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:letterSpacing="@dimen/description_letter_spacing"
android:lineSpacingExtra="@dimen/line_spacing_extra_description"
android:maxLines="4"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"

View file

@ -0,0 +1,77 @@
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/actionModeBackground"
android:minHeight="@dimen/toolbar_height"
osmand:contentInsetLeft="0dp"
osmand:contentInsetStart="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageButton
android:id="@+id/close_button"
style="@style/Widget.AppCompat.Toolbar.Button.Navigation"
android:layout_width="@dimen/toolbar_height"
android:layout_height="@dimen/toolbar_height"
android:contentDescription="@string/access_shared_string_navigate_up"
android:src="@drawable/ic_action_mode_back"
android:tint="?attr/app_bar_primary_item_color"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="vertical"
android:paddingTop="@dimen/content_padding_half"
android:paddingBottom="@dimen/content_padding_half">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:letterSpacing="@dimen/text_button_letter_spacing"
android:maxLines="2"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:textColor="?attr/app_bar_primary_item_color"
android:textSize="@dimen/dialog_header_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="@string/routing_settings_2" />
<TextView
android:id="@+id/toolbar_subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="?attr/pstsInactiveTextColor"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:textAppearance="@style/TextAppearance.ContextMenuSubtitle"
android:visibility="gone"
tools:text="Some description" />
</LinearLayout>
<include
layout="@layout/profile_button_small"
android:layout_width="@dimen/route_info_toolbar_button_size"
android:layout_height="@dimen/route_info_toolbar_button_size"
android:layout_marginLeft="@dimen/content_padding_half"
android:layout_marginRight="@dimen/content_padding_half" />
</LinearLayout>
</androidx.appcompat.widget.Toolbar>

View file

@ -13,11 +13,11 @@
<string name="shared_string_status">Addad</string>
<string name="shared_string_read_more">Γer uggar</string>
<string name="shared_string_hide">Ffer</string>
<string name="route_stops_before">%1$s ad yahbes uqbel</string>
<string name="route_stops_before">%1$s n uneḥbus uqbel</string>
<string name="coords_search">Asemmezdi n unadi</string>
<string name="advanced_coords_search">Asemmezdi asurif n unadi</string>
<string name="back_to_search">Tuγalin γer unadi</string>
<string name="shared_string_location">Adγar</string>
<string name="shared_string_location">Adig</string>
<string name="read_more">Γer uggar</string>
<string name="whats_new">Dacu i d amaynut deg</string>
<string name="shared_string_update">Sedγi</string>
@ -51,7 +51,7 @@
<string name="shared_string_show">Sken</string>
<string name="shared_string_add">Rnu</string>
<string name="share_note">Bḍu tazmilt</string>
<string name="notes">Tizmilin</string>
<string name="notes">Tizmilin A/V</string>
<string name="gps_status">Addad n GPS</string>
<string name="home_button">Tinefrent tagejdant</string>
<string name="rendering_category_hide">Ffer</string>
@ -66,7 +66,7 @@
<string name="lang_zh">Tacinwatt</string>
<string name="lang_en">Tagnizit</string>
<string name="lang_en_gb">Tagnizit (Tagldit i ddukklen)</string>
<string name="lang_af">Afrikanz</string>
<string name="lang_af">Tafrikanst</string>
<string name="lang_al">Talbanit</string>
<string name="lang_ar">Taɛrabt</string>
<string name="lang_hy">Tarmanit</string>
@ -92,7 +92,7 @@
<string name="lang_pt">Tapurtugit</string>
<string name="lang_ro">Tarumanit</string>
<string name="lang_ru">Tarusit</string>
<string name="lang_sr">Tasirbit</string>
<string name="lang_sr">Tasiṛbit (Sirilik)</string>
<string name="lang_sl">Tasluvinit</string>
<string name="lang_es">Taspenyulit</string>
<string name="lang_tr">Taṭurkit</string>
@ -146,10 +146,10 @@
<string name="city_type_village">Taddart</string>
<string name="city_type_town">Tiγremt</string>
<string name="shared_string_gpx_route">Abrid n GPX</string>
<string name="button_upgrade_osmandplus">Sedγi OsmAnd+</string>
<string name="button_upgrade_osmandplus">Leqqem OsmAnd+</string>
<string name="search_position_address">Tansa …</string>
<string name="filename_input">Isem n ufaylu :</string>
<string name="favorite_home_category">Axxam</string>
<string name="filename_input">Isem n ufaylu:</string>
<string name="favorite_home_category">Agejdan</string>
<string name="favorite_friends_category">Imdukal</string>
<string name="shared_string_others">Wiyyaḍ</string>
<string name="shared_string_name">Isem</string>
@ -159,7 +159,7 @@
<string name="yard">yd</string>
<string name="amenity_type_barrier">Ugur</string>
<string name="amenity_type_education">Asegmi</string>
<string name="amenity_type_finance">Aẓref</string>
<string name="amenity_type_finance">Tadrimt</string>
<string name="amenity_type_healthcare">Tadawsa</string>
<string name="amenity_type_historic">Amazray</string>
<string name="amenity_type_other">Wayeḍ</string>
@ -176,11 +176,11 @@
<string name="address">Tansa</string>
<string name="data_settings">Isefka</string>
<string name="ChooseCountry">Fren tamurt</string>
<string name="app_mode_car">Takeṛṛust</string>
<string name="app_mode_car">Anehheṛ</string>
<string name="app_mode_pedestrian">Amsebrid</string>
<string name="position_on_map_center">Talemmast</string>
<string name="position_on_map_bottom">Ddaw</string>
<string name="search_address_city">Tamdint</string>
<string name="search_address_city">Tiɣremt</string>
<string name="search_address_building">Azadaγ</string>
<string name="search_address_street_option">Ger iberdan</string>
<string name="poi_action_add">rnu</string>
@ -189,14 +189,14 @@
<string name="poi_dialog_opening_hours">Ldi</string>
<string name="app_name_osmand">OsmAnd</string>
<string name="building_number">Uṭṭun n Uzadaγ</string>
<string name="show_gpx">Sken GPX</string>
<string name="show_gpx">Sken isefka GPX</string>
<string name="roads">Iberdan</string>
<string name="buy"></string>
<string name="value_downloaded_of_max">%1$.1f ɣef %2$.1f MB</string>
<string name="file_size_in_mb">%.1f MB</string>
<string name="value_downloaded_of_max">%1$.1f ɣef %2$.1f MAṬ</string>
<string name="file_size_in_mb">%.1f MAṬ</string>
<string name="update_all">Sedγi iten akk (%1$s MB)</string>
<string name="enter_country_name">Ger isem n tmurt</string>
<string name="other_menu_group">Wiyya</string>
<string name="enter_country_name">Sekcem isem n tmurt</string>
<string name="other_menu_group">Waye</string>
<string name="update">Sedγi</string>
<string name="update_now">Sedγi tura</string>
<string name="last_update">Asedγi aneggaru : %s</string>
@ -205,17 +205,17 @@
<string name="weekly">Yal imalas</string>
<string name="morning">Azal</string>
<string name="night">Iḍ</string>
<string name="dist_away_from_my_location">Gmi %1$s ɣef</string>
<string name="dist_away_from_my_location">Nadi %1$s s lbeɛd</string>
<string name="search_categories">Taggayin</string>
<string name="city_type_neighbourhood">Azniq</string>
<string name="map_widget_search">Anadi</string>
<string name="shared_string_is_open_24_7">Taneldit 24/7</string>
<string name="follow_us">Ḍfer aγ</string>
<string name="access_category_choice">Fren taggayt</string>
<string name="shared_string_move_up">Ali</string>
<string name="shared_string_move_down">Ader</string>
<string name="road_blocked">Yergel webrid</string>
<string name="shared_string_type">Anaw</string>
<string name="shared_string_move_up">Ali</string>
<string name="shared_string_move_down">Ader</string>
<string name="road_blocked">Yergel ubrid</string>
<string name="shared_string_type">"Type "</string>
<string name="live_updates">Isdγiten usriden</string>
<string name="route_duration">Tanazagt :</string>
<string name="no_inet_connection">Ulac tuqqna n Internet</string>
@ -233,7 +233,7 @@
<string name="type_city_town">Sekcem tiγremt neγ tamdint</string>
<string name="type_postcode">Sekcem angal n tesreqqest</string>
<string name="select_city">Ffren tamdint</string>
<string name="select_postcode">Ffren angal n tesreqqest</string>
<string name="select_postcode">Ffren angal n unadi</string>
<string name="rendering_attr_hideWaterPolygons_description">Aman</string>
<string name="rendering_attr_hideWaterPolygons_name">Ffer aman</string>
<string name="route_kr">Ttef tama tayeffust t defred</string>
@ -246,14 +246,14 @@
<string name="shared_string_address">Tansa</string>
<string name="favourites_edit_dialog_category">Taggayt</string>
<string name="search_history_street">Abrid : {0}, {1}</string>
<string name="search_offline_address">Anadi mebla tuqna</string>
<string name="search_online_address">Anadi s tuqna</string>
<string name="search_offline_address">Anadi s war tuqqna</string>
<string name="search_online_address">Anadi s tuqqna</string>
<string name="search_address">Nadi γef tansa</string>
<string name="search_address_region">Tamnaḍt</string>
<string name="search_address_street">Abrid</string>
<string name="add_favorite_dialog_default_favourite_name">Menyif</string>
<string name="favourites_context_menu_add">Rnu d amenyaf</string>
<string name="favourites">Imenyafen</string>
<string name="favourites">Inurifen</string>
<string name="empty_state_favourites">Rnu ɣer imenyafen</string>
<string name="wrong_input">Yir anekcam</string>
<string name="shared_string_options">Iγewwaṛen</string>
@ -292,8 +292,8 @@
<string name="shared_string_road">Abrid</string>
<string name="shared_string_finish">Fakk</string>
<string name="shared_string_sort">Smizzwer</string>
<string name="descendingly">amnusruy</string>
<string name="ascendingly">igemmen</string>
<string name="descendingly">Z-A</string>
<string name="ascendingly">A-Z</string>
<string name="order_by">Asmizzwer s :</string>
<string name="shared_string_list">Tabdart</string>
<string name="shared_string_groups">Igrawen</string>
@ -308,7 +308,7 @@
<string name="mapillary_menu_date_from">Seg</string>
<string name="shared_string_permissions">Tisirag</string>
<string name="shared_string_install">Sbedd</string>
<string name="nothing_found">Ulac ayen yettwafen :(</string>
<string name="nothing_found">Ulac ayen yettwafen</string>
<string name="srtm_color_scheme">Initen n ugrudem n tedbelt</string>
<string name="favorite_group_name">Isem n wegraw</string>
<string name="shared_string_overview">Agzul</string>
@ -318,15 +318,15 @@
<string name="driving_region_automatic">Awurman</string>
<string name="shared_string_gpx_track">Abrid</string>
<string name="shared_string_max">Afellay</string>
<string name="shared_string_start_time">Akud n tazwara</string>
<string name="shared_string_start_time">Temps de début</string>
<string name="shared_string_end_time">Asrag n tagara</string>
<string name="shared_string_color">Ini</string>
<string name="shared_string_move">Senkez</string>
<string name="shared_string_gpx_tracks">Iberdan</string>
<string name="shared_string_time">Akud</string>
<string name="rendering_value_high_name">Awriran</string>
<string name="rendering_value_high_name">Haut</string>
<string name="rendering_value_medium_w_name">D alemmas</string>
<string name="rendering_value_low_name">Yuder</string>
<string name="rendering_value_low_name">Faible</string>
<string name="shared_string_appearance">Udem</string>
<string name="shared_string_notifications">Ilγa</string>
<string name="shared_string_continue">Kemmel</string>
@ -340,18 +340,18 @@
<string name="storage_free_space">Amkan yellan</string>
<string name="get_started">Aha bdu tura</string>
<string name="postcode">Tangalt n lpusṭa</string>
<string name="app_mode_bus">Taɣsert n yisakacen</string>
<string name="app_mode_bus">Azrug</string>
<string name="access_shared_string_not_installed">Ur yebdid ara</string>
<string name="access_widget_expand">Snefli</string>
<string name="report">Aṛabul</string>
<string name="report">Aneqqis</string>
<string name="donations">Tiwsiwin</string>
<string name="osm_live_subscribe_btn">Jerred</string>
<string name="osm_live_subscribe_btn">S\'abonner</string>
<string name="osm_live_active">Urmid</string>
<string name="osm_live_not_active">Insa</string>
<string name="osm_live_subscription_settings">Iγewwaṛen n ujerred</string>
<string name="shared_string_toolbar">Tafeggagt n ifecka</string>
<string name="shared_string_widgets">Iwiǧiten</string>
<string name="shared_string_reverse_order">Tti amizwer</string>
<string name="shared_string_reverse_order">Tti asmizzwer</string>
<string name="shared_string_save_changes">Sekles asnifel</string>
<string name="shared_string_remove">Kkes</string>
<string name="shared_string_select">Fren</string>
@ -363,7 +363,7 @@
<string name="osn_comment_dialog_title">Rnu awennit</string>
<string name="osb_comment_dialog_message">Izen</string>
<string name="osb_comment_dialog_author">Isem n umeskar</string>
<string name="shared_string_commit">Commit</string>
<string name="shared_string_commit">Wennet</string>
<string name="lang_nds">Talmanit n wadda</string>
<string name="lang_mk">Tamasidunit</string>
<string name="shared_string_upload">Sali</string>
@ -371,8 +371,8 @@
<string name="favorite_category_name">Isem n taggayt</string>
<string name="favorite_category_select">Fren taggayt</string>
<string name="si_nm">Miles iwlalen</string>
<string name="si_kmh">Kilometr deg ssaɛa</string>
<string name="si_mph">Miles deg usrag</string>
<string name="si_kmh">Kilometr deg usrag</string>
<string name="si_mph">Imilen deg usrag</string>
<string name="shared_string_navigation">Assilel</string>
<string name="download_live_updates">Isdγiten usriden</string>
<string name="rendering_value_orange_name">Ačinawi</string>
@ -380,7 +380,7 @@
<string name="rendering_value_pink_name">Axuxi</string>
<string name="rendering_value_brown_name">Aqahwi</string>
<string name="light_theme">Aceɛlal</string>
<string name="lang_bn">Tabelgalit</string>
<string name="lang_bn">Tabengalit</string>
<string name="lang_az">Tazeṛbayǧant</string>
<string name="lang_br">Tabrutunt</string>
<string name="lang_sq">Talbanit</string>
@ -407,13 +407,13 @@
<string name="osmand_parking_time_left">id iguran</string>
<string name="your_edits">Tiẓrigin-ik</string>
<string name="general_settings_2">Iγewwaren imuta</string>
<string name="shared_string_dismiss">Agwi</string>
<string name="shared_string_do_not_use">Ur tseqdac ara sakin</string>
<string name="shared_string_dismiss">Aggi</string>
<string name="shared_string_do_not_use">Ur seqdac ara</string>
<string name="shared_string_off">Insa</string>
<string name="shared_string_previous">Ar deffir</string>
<string name="shared_string_previous">Ɣer deffir</string>
<string name="shared_string_next">Ar zdat</string>
<string name="shared_string_enable">Rmed</string>
<string name="shared_string_disable"/>
<string name="shared_string_disable">Désactiver</string>
<string name="shared_string_enabled">Urmid</string>
<string name="shared_string_disabled">Yensa</string>
<string name="shared_string_selected">Yettwafren</string>
@ -432,10 +432,10 @@
<string name="shared_string_more_actions">Ugar n tigawin</string>
<string name="shared_string_refresh">Sismeḍ</string>
<string name="shared_string_download">Sider</string>
<string name="shared_string_downloading">Asider</string>
<string name="shared_string_downloading">Azdam…</string>
<string name="shared_string_close">Mdel</string>
<string name="shared_string_exit">Tufγa</string>
<string name="shared_string_collapse">Seggelmes</string>
<string name="shared_string_collapse">Ḍfes</string>
<string name="shared_string_show_on_map">"Sken γef tkarḍa"</string>
<string name="shared_string_map">Takarḍa</string>
<string name="shared_string_favorite">Menyif</string>
@ -443,23 +443,23 @@
<string name="shared_string_tracks">Iberdan-iw</string>
<string name="shared_string_audio">Imesli</string>
<string name="shared_string_video">Ividyuten</string>
<string name="shared_string_accessibility">Ittuseblel i tuffart</string>
<string name="shared_string_accessibility">Tuffart</string>
<string name="watch">Ɛass</string>
<string name="version_settings"/>
<string name="version_settings">Ileqman</string>
<string name="proxy_pref_title">Apṛuksi</string>
<string name="settings_privacy">Tabaḍnit</string>
<string name="shared_string_gpx_points">Tineqqiḍin</string>
<string name="rendering_value__name">Amezwer</string>
<string name="rendering_value_default_name">Amezwer</string>
<string name="rendering_value__name">Lexṣas</string>
<string name="rendering_value_default_name">Lexṣas</string>
<string name="dash_download_manage">Sefrek</string>
<string name="navigate_point_zone">Tamnaḍt</string>
<string name="download_tab_local">Adigan</string>
<string name="coordinates">Asemmezdi asurif n unadi</string>
<string name="coordinates">Tisidag</string>
<string name="map_widget_top">Afeggag n waddad</string>
<string name="anonymous_user">Aseqdac udrig</string>
<string name="traffic_warning_speed_camera">Takamiṛat n urured</string>
<string name="stop_navigation_service">Seḥbes</string>
<string name="int_hour">h</string>
<string name="int_hour">s</string>
<string name="duration">Tanzagt</string>
<string name="distance">Ameccaq</string>
<string name="average">Talemmast</string>
@ -475,7 +475,7 @@
<string name="local_index_gpx_info_show">"
\n
\nIγewwaṛen n usiti γezzifen"</string>
<string name="gpx_selection_segment_title"/>
<string name="gpx_selection_segment_title">Segment</string>
<string name="misc_pref_title"/>
<string name="localization_pref_title">Asideg</string>
<string name="lang_pt_br">Tapurtugit (Birizil)</string>
@ -485,7 +485,7 @@
<string name="lang_fi">Tafinit</string>
<string name="lang_kn">Takannadat</string>
<string name="lang_lv">Talitunit</string>
<string name="lang_no">Tanurvijit</string>
<string name="lang_no">Tanurvijit Bukmal</string>
<string name="lang_fa">Tafarsit</string>
<string name="lang_pl">Tapulunit</string>
<string name="lang_zh_cn">Tacinwat (Taḥerfit)</string>
@ -494,7 +494,7 @@
<string name="lang_sv">Taswidit</string>
<string name="lang_zh_tw">Tacinwat (Tamansayt)</string>
<string name="lang_cy">Takusit</string>
<string name="about_version">Lqem :</string>
<string name="about_version">"Lqem: "</string>
<string name="shared_string_about">Γef</string>
<string name="edit_tilesource_url_to_load">URL</string>
<string name="driving_region_australia">Usṭralya</string>
@ -504,7 +504,7 @@
<string name="plugin_distance_point">Taneqqiḍt</string>
<string name="distance_measurement_start_editing">Bdu taẓrigt</string>
<string name="other_location">Nniḍen</string>
<string name="website">Asmel web</string>
<string name="website">Asmel n web</string>
<string name="prefer_in_routing_title">Smenyifi …</string>
<string name="recording_unavailable">ulac</string>
<string name="recording_context_menu_play">Urar</string>
@ -515,44 +515,44 @@
<string name="map_widget_parking">Aneγsar</string>
<string name="map_widget_speed">Arured</string>
<string name="map_widget_distance">Taniγert</string>
<string name="map_widget_altitude">Talqayt</string>
<string name="map_widget_altitude">Awrir</string>
<string name="osmand_parking_minutes">Tisdatin</string>
<string name="osmand_parking_warning">Γur-k</string>
<string name="osmand_parking_pm">MD</string>
<string name="osmand_parking_am">FT</string>
<string name="gpxup_public">Azayez</string>
<string name="gpxup_private">Uslig</string>
<string name="navigate_point_format">Amasal</string>
<string name="navpoint_search_desc">Asemmezdi asurif n unadi</string>
<string name="navigate_point_format">Format</string>
<string name="navpoint_search_desc">Tisidag</string>
<string name="plugins_screen">Iseγzaf</string>
<string name="prefs_plugins">Iseγzaf</string>
<string name="gpx_visibility_txt">Tamanit</string>
<string name="gpx_tags_txt">Imyerren</string>
<string name="gpx_visibility_txt">Tametwalant</string>
<string name="gpx_tags_txt">Tibzimin</string>
<string name="default_buttons_support">Tallelt</string>
<string name="info_button">Talγut</string>
<string name="accessibility_mode">Sermed askar n tuffart</string>
<string name="altitude">Talqayt</string>
<string name="accessibility_mode">Askar n tnekcumt</string>
<string name="altitude">Awrir</string>
<string name="arrival_distance_factor_normally">Amagnu</string>
<string name="local_openstreetmap_uploading">Asali</string>
<string name="local_openstreetmap_uploading">Asali...</string>
<string name="index_name_asia">Asya</string>
<string name="amenity_type_user_defined">Aseqdac arussin</string>
<string name="routing_settings">Assilel</string>
<string name="routing_settings">Asnirem</string>
<string name="global_settings">Iγewwaren Imuta</string>
<string name="city_type_city">Tiγremt</string>
<string name="search_position_favorites">Imenyafen …</string>
<string name="search_position_undefined">Aranbadu</string>
<string name="search_position_undefined">D arbadu</string>
<string name="select_search_position">Taneṣlit :</string>
<string name="favorite_places_category">Idigen</string>
<string name="favorite_places_category">Imukan</string>
<string name="shared_string_release">Yeffeγ-d</string>
<string name="local_index_mi_restore">Rmed</string>
<string name="local_index_mi_restore">Sermed</string>
<string name="local_index_mi_backup">Sexsi</string>
<string name="incomplete_locale">ur immid ara</string>
<string name="context_menu_item_share_location">bḍu adɣar</string>
<string name="amenity_type_administrative">Tikerrist n tebdelt</string>
<string name="incomplete_locale">arummid</string>
<string name="context_menu_item_share_location">Bḍu adγar</string>
<string name="amenity_type_administrative">Tadbelant</string>
<string name="amenity_type_entertainment">Asedhu</string>
<string name="amenity_type_office">Tanarit</string>
<string name="amenity_type_shop">Taḥanut</string>
<string name="poi_filter_custom_filter">Imzizdig udmawan</string>
<string name="amenity_type_shop">Tiɣin</string>
<string name="poi_filter_custom_filter">Imsizdeg udmawan</string>
<string name="filter_existing_indexes">Yettwasider-d</string>
<string name="rotate_map_bearing_opt">Ar tnila n umussu</string>
<string name="send_report">Azen aneqqis</string>
@ -562,8 +562,8 @@
<string name="int_min">tas.</string>
<string name="search_poi_filter">Imzizdig</string>
<string name="menu_mute_off">Imesli yermed</string>
<string name="map_orientation_portrait">Tafrist</string>
<string name="map_orientation_landscape">Agama</string>
<string name="map_orientation_portrait">S teẓɣzi</string>
<string name="map_orientation_landscape">S tehri</string>
<string name="transport_Stop">Seḥbes</string>
<string name="favorite">Menyif</string>
<string name="uploading">Asali …</string>
@ -574,48 +574,48 @@
<string name="finished_task">Immed</string>
<string name="additional_settings">Iγewwaren imernan</string>
<string name="mark_point">Asaḍas</string>
<string name="search_button">Nadi</string>
<string name="search_activity">Nadi</string>
<string name="app_mode_bicycle">Azlalam</string>
<string name="navigate_point_latitude">Tarrut</string>
<string name="search_button">Rechercher</string>
<string name="search_activity">Rechercher</string>
<string name="app_mode_bicycle">Tilḥin s uvilo</string>
<string name="navigate_point_latitude">Turrut</string>
<string name="navigate_point_longitude">Tazegrart</string>
<string name="search_address_building_option">Azadaγ</string>
<string name="poi_dialog_comment">Awennit</string>
<string name="default_buttons_commit">Commit</string>
<string name="default_buttons_commit">Wennet</string>
<string name="filter_current_poiButton">Imzizdig</string>
<string name="edit_filter_save_as_menu_item">Sekles s yisem</string>
<string name="email">imayl</string>
<string name="get_plugin">Awi</string>
<string name="rate_this_app">Rnu tazmilt i usnas</string>
<string name="try_again">Ɛreḍ tikkelt nniḍen</string>
<string name="shared_string_undo">SEFSEX</string>
<string name="shared_string_undo">Err-d</string>
<string name="shared_string_skip">Zgel</string>
<string name="tab_title_basic">Azadur</string>
<string name="tab_title_advanced">Anadi anemhal</string>
<string name="next_proceed">Ar zdat</string>
<string name="tab_title_advanced">Talqayt</string>
<string name="next_proceed">Ɣer zdat</string>
<string name="contact_info">Talγut n unermes</string>
<string name="are_you_sure">Tebγiḍ ?</string>
<string name="new_version">Lqem amaynut</string>
<string name="features_menu_group">Timeẓluyin</string>
<string name="features_menu_group">Timahalin</string>
<string name="plugins_menu_group">Iseγzaf</string>
<string name="faq_item">Isteqsiyen FAQ</string>
<string name="faq_item_description">Isteqsiyen i d-yettuγalen s waṭas</string>
<string name="versions_item">Ileqman</string>
<string name="feedback">Tikti</string>
<string name="contact_us">Nemes-aɣ-d</string>
<string name="number_of_edits">"Amḍan n ibeddlilen "</string>
<string name="contact_us">Anermis</string>
<string name="number_of_edits">Amḍan n ibeddlilen</string>
<string name="quick_action_add_favorite">Rnut d amenyaf</string>
<string name="favorite_autofill_toast_text">" yekles γer "</string>
<string name="favorite_empty_place_name">Amḍiq</string>
<string name="quick_action_add_category">Rnu taggayt tamaynutt</string>
<string name="quick_action_add_navigation">Assilel</string>
<string name="quick_action_add_navigation">Asnirem</string>
<string name="quick_action_bug_message">Izen</string>
<string name="retry">Ɛreḍ tikkelt nniḍen</string>
<string name="add_point_before">Rnu tanqiḍt γer sdeffir</string>
<string name="add_point_after">Rnu tanqiḍt γer sdat</string>
<string name="search_map_hint">Nadi γef tiγremt naγ tama</string>
<string name="search_map_hint">Tiγremt neγ tamnaḍt</string>
<string name="lang_lb">Taluksumburgit</string>
<string name="shared_string_show_description">Sekned aglam-is</string>
<string name="shared_string_show_description">Sken aglam.</string>
<string name="lang_vi">Tabyatnamit</string>
<string name="context_menu_item_search">Nadi di liqrib</string>
<string name="empty_state_osm_edits">Rnu neγ ẓreg ifarisen n OSM</string>
@ -625,13 +625,13 @@
<string name="select_street">Fren abrid</string>
<string name="context_menu_item_open_note">Ldi tamawt n OSM</string>
<string name="search_poi_category_hint">Aru kra iw nadi γef kullec</string>
<string name="shared_string_my_favorites">Imenyafen-iw</string>
<string name="shared_string_my_favorites">Inurifen</string>
<string name="route_tr">Bren γer tama tayeffust t edfreḍ</string>
<string name="route_tl">Bren γer tama tazelmaṭ t edfraḍ</string>
<string name="modify_the_search_query">Ẓreg asuter n unadi.</string>
<string name="shared_string_added">Iţwarna</string>
<string name="marker_activated">Creḍ %s immed.</string>
<string name="empty_state_av_notes">Ṭṭef tizmilin !</string>
<string name="empty_state_av_notes">Ṭṭef tizmilin!</string>
<string name="shared_string_more_without_dots">Ugar</string>
<string name="favourites_group">Taggayt Ismenyifen</string>
<string name="add_group">Rnu agraw</string>
@ -658,9 +658,9 @@
<string name="without_time_limit">Ulac tilist deg wakud</string>
<string name="group_deleted">Agraw ittwakes</string>
<string name="shared_string_example">Amedya</string>
<string name="change_default_settings">Beddl iɣewwaṛen imezwar</string>
<string name="change_default_settings">Beddl iɣewwaṛen</string>
<string name="discard_changes">Suref i usnifel</string>
<string name="apply_to_current_profile">"Snes i umaɣnu amiran %1$s"</string>
<string name="apply_to_current_profile">Snes kan i \"%1$s\"</string>
<string name="apply_to_all_profiles">Snes i imavnuyen meṛṛa</string>
<string name="start_up_message_pref">Izen n usenker</string>
<string name="appearance">Arwes</string>
@ -668,4 +668,184 @@
<string name="switch_profile">Beddel amaɣnu</string>
<string name="application_profile_changed">Amaɣnu n usnas ittwabddel ɣer \"%s\"</string>
<string name="rendering_value_black_name">Aberkan</string>
<string name="shared_string_languages">Tutlayin</string>
<string name="shared_string_language">Tutlayt</string>
<string name="shared_string_all_languages">Akk tutlayin</string>
<string name="shared_string_min">Adday</string>
<string name="n_items_of_z">%1$s ɣef %2$s</string>
<string name="shared_string_transparency">Afrawan</string>
<string name="shared_string_legend">Tawaṭṭfa</string>
<string name="shared_string_circle">Tawinest</string>
<string name="shared_string_square">Amkuẓ</string>
<string name="shared_string_importing">Akter</string>
<string name="replace_all">Selselsi imeṛṛa</string>
<string name="shared_string_preparing">Aheyyi</string>
<string name="shared_string_angle">Angle</string>
<string name="index_name_antarctica">Antartique</string>
<string name="shared_string_menu">Menu</string>
<string name="shared_string_available">Yewjed</string>
<string name="monitoring_notification">Ilɣa</string>
<string name="ltr_or_rtl_combine_via_colon">%1$s: %2$s</string>
<string name="ltr_or_rtl_combine_via_space">%1$s %2$s</string>
<string name="rendering_value_thick_name">Zzur</string>
<string name="personal_category_name">Udmawan</string>
<string name="street_city">%1$s, %2$s</string>
<string name="shared_string_revert">Tti</string>
<string name="rendering_value_white_name">Amellal</string>
<string name="shared_string_maps">Tikarḍiwin</string>
<string name="shared_sting_tiles">Inegzumen</string>
<string name="rendering_attr_piste_difficulty_connection_name">Tuqqna</string>
<string name="rendering_attr_piste_difficulty_undefined_name">D arbadu</string>
<string name="rendering_attr_piste_difficulty_advanced_name">Talqayt</string>
<string name="rendering_attr_piste_difficulty_easy_name">Fessus</string>
<string name="rendering_attr_piste_type_nordic_name">Agafan</string>
<string name="rendering_attr_piste_type_connection_name">Tuqqna</string>
<string name="shared_string_other">Wayeḍ</string>
<string name="reset_to_default">Err-d azalen s lexṣas</string>
<string name="analytics_pref_title">Analytics</string>
<string name="price_free">Ilelli</string>
<string name="years_5">Iseggassen</string>
<string name="years_2_4">Iseggassen</string>
<string name="year">Iseggasen</string>
<string name="months_5">Igguren</string>
<string name="months_2_4">Igguren</string>
<string name="month">Aggur</string>
<string name="weeks_5">Imalasen</string>
<string name="weeks_2_4">Imalasen</string>
<string name="week">Amalas</string>
<string name="days_5">Ussan</string>
<string name="days_2_4">Ussan</string>
<string name="day">Ass</string>
<string name="lang_oc">Tuksitant</string>
<string name="shared_string_default">Lexṣas</string>
<string name="rendering_attr_tracktype_grade5_name">Fessus</string>
<string name="sett_generic_ext_input">Anasiw</string>
<string name="sett_no_ext_input">Ula yiwen</string>
<string name="shared_string_crash">Ɣli</string>
<string name="new_profile">Nouveau profil</string>
<string name="shared_string_icon">D tignit n wesnas</string>
<string name="profile_alert_need_save_title">Sekles ibeddilen</string>
<string name="profile_type_descr_string">Anaw: %s</string>
<string name="app_mode_taxi">Aṭaksi</string>
<string name="shared_string_allow">Sireg</string>
<string name="shared_string_no_thank_you">Ala, tanmirt</string>
<string name="shared_string_privacy_policy">Tasertit tabaḍnit</string>
<string name="button_rate">Afmiḍi</string>
<string name="rendering_attr_undefined_name">D arbadu</string>
<string name="rendering_attr_highway_class_path_name">Avrid</string>
<string name="rendering_attr_highway_class_steps_name">Imecwaṛen</string>
<string name="rendering_attr_highway_class_bridleway_name">Aɣaras n yimnayen</string>
<string name="rendering_attr_highway_class_track_name">Piste</string>
<string name="rendering_attr_highway_class_service_name">Ameẓlu</string>
<string name="rendering_attr_highway_class_street_name">Abrid</string>
<string name="rendering_attr_highway_class_road_name">Abrid</string>
<string name="rendering_attr_highway_class_motorway_name">Abrid agejdan</string>
<string name="rendering_attr_smoothness_bad_name">Dirit</string>
<string name="rendering_attr_smoothness_good_name">Igerrez</string>
<string name="rendering_attr_surface_wood_name">Amadeɣ</string>
<string name="rendering_attr_surface_metal_name">Métal</string>
<string name="rendering_attr_surface_stone_name">Ablaḍ</string>
<string name="rendering_attr_surface_snow_name">Adfel</string>
<string name="rendering_attr_surface_mud_name">Ixmiṛ</string>
<string name="rendering_attr_surface_sand_name">Ijdi</string>
<string name="work_button">Amahil</string>
<string name="shared_string_height">Teɣzi</string>
<string name="shared_string_width">Largeur</string>
<string name="route_way">Abrid</string>
<string name="shared_string_launch">Sker</string>
<string name="osm_live_subscriptions">Ijerriden</string>
<string name="osm_live_payment_annual_title">S useggas</string>
<string name="osm_live_payment_monthly_title">Yal aggur</string>
<string name="shared_string_restore">Err-d</string>
<string name="shared_string_bookmark">Signet</string>
<string name="download_all">Sider meṛṛa</string>
<string name="show_images">Sken tugniwin</string>
<string name="start_editing">Bdu taẓrigt</string>
<string name="download_file">Sidered afaylu</string>
<string name="update_is_available">Yella ulqem</string>
<string name="shared_string_wifi_only">Ala ɣef Wi-Fi</string>
<string name="shared_string_only_with_wifi">Ala ɣef Wi-Fi</string>
<string name="shared_string_do">Eg</string>
<string name="shared_string_wikivoyage">Wikasikel</string>
<string name="shared_string_contents">Igburen</string>
<string name="shared_string_read">Ɣeṛ</string>
<string name="shared_string_explore">Snirem</string>
<string name="shared_string_result">Agmuḍ</string>
<string name="shared_string_total">Amatu</string>
<string name="north_abbreviation">G</string>
<string name="south_abbreviation">N</string>
<string name="west_abbreviation">M</string>
<string name="east_abbreviation">S</string>
<string name="shared_string_current">Amiran</string>
<string name="day_off_label">off</string>
<string name="lang_lo">Talawsit</string>
<string name="tap_on_map_to_hide_interface">Askar n ugdil aččuran</string>
<string name="coordinates_format">Amasal n tsidegt</string>
<string name="date_added">Iţwarna</string>
<string name="of">%1$d ɣef %2$d</string>
<string name="mapillary_menu_title_dates">Azemz</string>
<string name="shared_string_to">I</string>
<string name="edit_name">Ẓreg isem</string>
<string name="change_color">Snifel ini</string>
<string name="routing_attr_relief_smoothness_factor_more_plains_name">Plat</string>
<string name="shared_string_slope">Taseksert</string>
<string name="add_new_folder">Rnu akaram d amaynu</string>
<string name="max_speed">Arured afellay</string>
<string name="shared_string_action_name">Isem n tigawt</string>
<string name="quick_action_map_style_action">Rnu aɣanib n tkarḍa</string>
<string name="dialog_add_action_title">Rnu tigawt</string>
<string name="quick_action_new_action">Rnu tigawt</string>
<string name="quick_action_item_action">Tigawt %d</string>
<string name="lang_sr_latn">Tasiṛbit (Talaṭinit)</string>
<string name="clear_tile_data">Sfeḍ akk izwal</string>
<string name="downloads">Téléchargements</string>
<string name="poi_remove_success">Yettwakkes</string>
<string name="search_address_top_text">Tansa</string>
<string name="items_were_selected">{0} n yiferdisen ttwafernen</string>
<string name="amenity_type_natural">Agaman</string>
<string name="mile_per_hour">m/tasint</string>
<string name="bg_service_screen_unlock">Serreḥ</string>
<string name="bg_service_screen_lock">Sekkeṛ</string>
<string name="map_widget_reset">Err-d azalen s lexṣas</string>
<string name="map_widget_lock_screen">Sekkeṛ</string>
<string name="recording_default_name">Asekles</string>
<string name="intermediate_points_change_order">Beddel asmizzwer</string>
<string name="choose_osmand_theme">Asentel n usnas</string>
<string name="files_limit">%1$d n yifyla i d-yeqqimen</string>
<string name="distance_measurement_clear_route">Sfeḍ akk tineqqidin</string>
<string name="driving_region_us">Iwanaken-Yeddukklen-N-Temrikt</string>
<string name="driving_region_japan">Japun</string>
<string name="lang_uk">Tukranit</string>
<string name="lang_sc">Tasardit</string>
<string name="lang_mr">Tamaratit</string>
<string name="gpx_selection_points">%1$s
\nn tneqqidin</string>
<string name="proxy_port_title">Tabburt n Apṛuksi</string>
<string name="proxy_host_title">Asenneftaɣ Apṛuksi</string>
<string name="shared_string_photo">Tawlaft</string>
<string name="shared_string_io_error">Tuccḍa I/O</string>
<string name="shared_string_download_successful">Yettwasider-d</string>
<string name="shared_string_clear_all">Sfeḍ kullec</string>
<string name="action_delete">Tukksa n tigawt</string>
<string name="action_modify">Abedden n tigawt</string>
<string name="action_create">Timerna n tigawt</string>
<string name="lang_ceb">Tacibwanit</string>
<string name="lang_gl">Tagalisyant</string>
<string name="lang_ms">Amalizi</string>
<string name="lang_nn">Tanurvijit Nynorsk</string>
<string name="lang_te">Tatilugut</string>
<string name="lang_th">Taṭaylundit</string>
<string name="lang_vo">Volapük</string>
<string name="lang_nb">Tanurvijit Bukmal</string>
<string name="lang_ga">Tirlandit</string>
<string name="lang_nv">Navajo</string>
<string name="lang_tl">Tafilippinit</string>
<string name="no_updates_available">Ulac ileqman iwejden</string>
<string name="m_s">m/s</string>
<string name="osb_comment_dialog_success">Awennityettwarna</string>
<string name="av_audio_bitrate">Aktum ameslaw</string>
<string name="osm_live_month_cost">Azal i waggur</string>
<string name="rendering_value_thin_name">Fin</string>
<string name="access_shared_string_navigate_up">Aller vers le haut</string>
<string name="coords_format">Amasal n tsidegt</string>
</resources>

View file

@ -3620,4 +3620,18 @@ Abasta l\'àrea: %1$s x %2$s</string>
<string name="shared_string_language">Llengua</string>
<string name="shared_string_all_languages">Tots els idiomes</string>
<string name="wiki_menu_download_descr">Es necessiten mapes addicionals per veure els PDIs de la Viquipèdia al mapa.</string>
<string name="ui_customization">Personalització de la IU</string>
<string name="context_menu_actions">Accions del menú contextual</string>
<string name="reorder_or_hide_from">Reordena o amaga els elements des del %1$s.</string>
<string name="shared_string_divider">Divisor</string>
<string name="divider_descr">Elements per sota daquest punt separats per un divisor.</string>
<string name="shared_string_hidden">Amagat</string>
<string name="hidden_items_descr">Aquests elements no es mostren al menú, però les opcions o els connectors que representen continuen funcionant.</string>
<string name="reset_items_descr">La configuració es restablirà a l\'estat original després d\'amagar-se.</string>
<string name="main_actions_descr">Les accions principals només contenen 4 botons.</string>
<string name="main_actions">Accions principals</string>
<string name="additional_actions_descr">Podeu accedir a aquesta acció prement el botó \"Accions\".</string>
<string name="move_inside_category">Només podeu moure els elements dins d\'aquesta categoria.</string>
<string name="developer_plugin">Connector per a desenvolupadors</string>
<string name="shared_string_items">Elements</string>
</resources>

View file

@ -3344,4 +3344,39 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="shared_string_language">Jazyk</string>
<string name="shared_string_all_languages">Všechny jazyky</string>
<string name="index_name_antarctica">Antarktida</string>
<string name="route_recalculation_dist_descr">Trasa bude přepočítána, pokud vzdálenost od trasy bude větší než uvedený parametr</string>
<string name="route_recalculation_dist_title">Minimální vzdálenost pro přepočítání trasy</string>
<string name="ltr_or_rtl_triple_combine_via_dash">%1$s — %2$s — %3$s</string>
<string name="shared_string_menu">Menu</string>
<string name="plugin_disabled_descr">Tento modul je samostatnou aplikací. Pokud ho nadále nehodláte používat, budete ho muset odstranit samostatně.
\n
\nModul zůstane v zařízení i po odstranění aplikace OsmAnd.</string>
<string name="plugin_disabled">Modul vypnutý</string>
<string name="open_settings">Otevřít nastavení</string>
<string name="no_recalculation_setting">Vypnout přepočítávání</string>
<string name="please_provide_profile_name_message">Zadejte prosím název profilu</string>
<string name="select_data_to_import">Vyberte data k importu.</string>
<string name="import_duplicates_title">Některé položky již existují</string>
<string name="import_duplicates_description">OsmAnd již má položky se stejnými názvy jako ty importované.
\n
\nZvolte akci.</string>
<string name="keep_both_desc">Importované položky budou přidány s prefixem</string>
<string name="keep_both">Ponechat obě</string>
<string name="replace_all">Nahradit vše</string>
<string name="replace_all_desc">Aktuální položky budou nahrazeny položkami ze souboru</string>
<string name="listed_exist">Zobrazený %1$s již existuje v OsmAnd.</string>
<string name="shared_string_profiles">Profily</string>
<string name="shared_string_quick_actions">Rychlé akce</string>
<string name="shared_string_nothing_selected">Nic není vybráno</string>
<string name="shared_string_poi_types">Typy POI</string>
<string name="shared_string_preparing">Připravuji</string>
<string name="shared_string_app_default_w_val">Výchozí hodnota (%s)</string>
<string name="recalc_angle_dialog_title">Minimální úhel mezi mojí polohou a trasou</string>
<string name="recalc_angle_dialog_descr">Dokud nebude trasa přepočítána, zobrazí se navíc rovný úsek mezi aktuální polohou a vypočítanou trasou</string>
<string name="profile_type_custom_string">Vlastní profil</string>
<string name="import_rendering_file">Importovat soubor vykreslování</string>
<string name="select_track_file">Vyberte soubor stopy</string>
<string name="wikipedia_poi_languages_promo">Některé články Wikipedie nemusí být dostupné ve vašem jazyce. Zvolte jazyky, v nichž se články Wikipedie objeví na mapě.
\nBěhem čtení článku budete moci přepínat mezi všemi dostupnými jazyky.</string>
<string name="wiki_menu_download_descr">Pro zobrazení bodů zájmu Wikipedie jsou potřeba další mapy.</string>
</resources>

View file

@ -3,9 +3,9 @@
<string name="srtm_paid_version_msg">Overvej at betale for \'Højdekurve\' udvidelsen for at støtte videre udvikling.</string>
<string name="av_def_action_video">Optag video</string>
<string name="av_def_action_audio">Optag lyd</string>
<string name="av_widget_action_descr">Vælg standard modulhandling.</string>
<string name="av_widget_action_descr">Standard modulhandling:</string>
<string name="av_widget_action">Standard modulhandling</string>
<string name="av_video_format_descr">Vælg videoformat.</string>
<string name="av_video_format_descr">Videoformat:</string>
<string name="av_use_external_recorder_descr">Brug systemoptager for video.</string>
<string name="av_use_external_recorder">Brug systemoptager</string>
<string name="av_settings_descr">Konfigurer lyd- og videoindstillinger.</string>
@ -22,7 +22,7 @@
<string name="srtm_paid_version_title">Højdekurver</string>
<string name="recording_context_menu_vrecord">Optag videonote</string>
<string name="layer_recordings">Optagelser</string>
<string name="recording_can_not_be_played">Optagelse kan ikke afspilles</string>
<string name="recording_can_not_be_played">Optagelse kunne ikke afspilles.</string>
<string name="recording_context_menu_delete">Slet optagelse</string>
<string name="recording_context_menu_play">Afspil</string>
<string name="recording_description">Optagelse %1$s %3$s %2$s</string>
@ -33,7 +33,7 @@
\n
\nDe globale data (mellem 70° nord og 70° syd) er baseret på målinger af SRTM (Shuttle Radar Topografi Mission) og ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), et billeddannende instrument ombord på Terra satellitten, flagskibet i NASAs Earth Observering system. ASTER er et samarbejde mellem NASA, Japans Ministry of Economy, Trade and Industry (METI), og Japan Space Systems (J-spacesystems)."</string>
<string name="map_widget_distancemeasurement">Afstandsmåling</string>
<string name="audionotes_location_not_defined">Placering der skal tilknyttes til noten er ikke defineret endnu. “Brug placering…“ til at knytte en note til den angivne placering.</string>
<string name="audionotes_location_not_defined">Tryk på \'Brug placering...\' for at tilføje en note til placeringen.</string>
<string name="map_widget_audionotes">Lydnoter</string>
<string name="audionotes_plugin_description">Lyd-/videonoter udvidelse giver funktionalitet til at tage lyd-/foto-/videonoter under en tur, enten ved hjælp en knap på skærmen, eller direkte fra kontekstmenuen for en position på kortet.</string>
<string name="audionotes_plugin_name">Lyd-/videonoter</string>
@ -55,8 +55,8 @@
<string name="map_widget_max_speed">Hastighedsgrænse</string>
<string name="no_buildings_found">Ingen bygninger fundet.</string>
<string name="incremental_search_city">Søg efter by trinvist</string>
<string name="search_villages_and_postcodes">Søg flere landsbyer/postnummer</string>
<string name="dropbox_plugin_description">Dropbox udvidelsen gør det muligt at synkronisere spor og lyd-/videonoter med en Dropbox-konto.</string>
<string name="search_villages_and_postcodes">Søg efter flere landsbyer/postnumre</string>
<string name="dropbox_plugin_description">Synkroniser spor og lyd-/videonoter med en Dropbox-konto.</string>
<string name="rendering_attr_showRoadMaps_description">Vælg, hvornår der skal vises kort kun med veje:</string>
<string name="rendering_attr_showRoadMaps_name">Kort kun med veje</string>
<string name="safe_mode_description">Kør program i fejlsikret tilstand (for langsommere Android i stedet for oprindelige kode).</string>
@ -123,7 +123,7 @@
<string name="max_speed_none">Ingen</string>
<string name="index_name_openmaps">OpenMaps EU</string>
<string name="dropbox_plugin_name">Dropbox udvidelse</string>
<string name="av_def_action_choose">Vælg ved forespørgsel</string>
<string name="av_def_action_choose">På anmodning\?</string>
<string name="av_use_external_camera_descr">Brug systemprogram til foto.</string>
<string name="av_use_external_camera">Brug kamera</string>
<string name="monitoring_control_start">GPX</string>
@ -183,11 +183,11 @@
<string name="osmand_parking_hours">Timer</string>
<string name="osmand_parking_minutes">Minutter</string>
<string name="osmand_parking_position_description_add_time">Bilen er parkeret kl.</string>
<string name="select_animate_speedup">Vælg hastighed for rutesimulering</string>
<string name="select_animate_speedup">Hastighed for rutesimulering:</string>
<string name="global_app_allocated_memory_descr">Tildelt hukommelse %1$s MB (Android grænse %2$s MB, Dalvik %3$s MB).</string>
<string name="global_app_allocated_memory">Tildelt hukommelse</string>
<string name="native_app_allocated_memory_descr">Samlet indbygget hukommelse tildelt af programmet %1$s MB (Dalvik %2$s MB, andre %3$s MB).
Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</string>
\nProportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</string>
<string name="native_app_allocated_memory">Total indbygget hukommelse</string>
<string name="starting_point_too_far">Udgangspunktet er for langt fra nærmeste vej.</string>
<string name="shared_location">Delt placering</string>
@ -243,8 +243,8 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="offline_navigation_not_available">Offline navigation er midlertidig utilgængelig.</string>
<string name="left_side_navigation">Venstrekørsel</string>
<string name="left_side_navigation_descr">For lande, hvor man kører i venstre side af vejen.</string>
<string name="unknown_from_location">Udgangspunktet endnu ikke fastlagt</string>
<string name="unknown_location">Position endnu ikke kendt</string>
<string name="unknown_from_location">Udgangspunktet endnu ikke fastlagt.</string>
<string name="unknown_location">Position endnu ikke kendt.</string>
<string name="modify_transparency">Indstil gennemsigtighed (0-transparent, 255-uigennemsigtig)</string>
<string name="confirm_interrupt_download">Annuller hentning\?</string>
<string name="first_time_msg">Tak for at du bruger OsmAnd. Hent data for offline brug via \'Indstillinger\' → \'Administrer kortfiler\' for at se kort, søge adresser, finde interessepunkter (IP), kolllektivtrafik og mere.</string>
@ -350,7 +350,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="local_openstreetmap_delete">Slet redigering</string>
<string name="local_openstreetmap_descr_title">Asynkron OSM-redigering:</string>
<string name="local_openstreetmap_settings">OSM interessepunkter/noter gemt på enheden</string>
<string name="local_openstreetmap_settings_descr">Vis og administrer OSM interessepunkter/noter registreret i database på enheden.</string>
<string name="local_openstreetmap_settings_descr">Vis og administrer OSM interessepunkter/noter i enhedens database.</string>
<string name="live_monitoring_interval_descr">Indstil interval for onlinesporing.</string>
<string name="live_monitoring_interval">Interval for online sporing</string>
<string name="live_monitoring_url_descr">Angiv webadressen med parametersyntaks: lat={0}, lon={1}, tidspunkt={2}, hdop={3}, højde={4}, hastighed={5}, kurs={6}.</string>
@ -374,7 +374,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="index_name_other">Verdens- og emnekort</string>
<string name="index_name_wiki">Globale Wikipedia interessepunkter</string>
<string name="index_name_voice">Talemeddelelser (optaget, begrænset funktionalitet)</string>
<string name="index_name_tts_voice">Talemeddelelser (TTS generator, anbefalet)</string>
<string name="index_name_tts_voice">Talemeddelelser (TTS, foretrukket)</string>
<string name="amenity_type_user_defined">Brugerdefineret</string>
<string name="fav_export_confirmation">Fil med tidligere eksporterede Favoritter eksisterer allerede. Overskriv?</string>
<string name="profile_settings">Profilspecifikke indstillinger</string>
@ -395,9 +395,8 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="amenity_type_osmwiki">Wikipedia (offline)</string>
<string name="routing_settings">Navigation</string>
<string name="download_files_not_enough_space">Der er ikke nok ledig plads til at hente %1$s MB (ledig: %2$s).</string>
<string name="download_files_question_space">Hent {0} filer?
Lagerplads brugt {1} MB.
(Ledig plads {2} MB.)</string>
<string name="download_files_question_space">Hent {0} filer\?
\n{1} MB (af {2} MB) vil blive anvendt.</string>
<string name="use_transparent_map_theme">Gennemsigtigt tema</string>
<string name="native_library_not_supported">Indbygget bibliotek understøttes ikke på enheden.</string>
<string name="init_native_library">Initialisere indbygget bibliotek…</string>
@ -416,7 +415,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="animate_route_off">Stop simulering</string>
<string name="animate_route">Start simulering</string>
<string name="file_can_not_be_renamed">Filen kunne ikke omdøbes.</string>
<string name="file_with_name_already_exists">Der eksisterer allerede en fil med det navn.</string>
<string name="file_with_name_already_exists">En fil med dette navn findes allerede.</string>
<string name="shared_string_gpx_route">GPX-rute</string>
<string name="poi_query_by_name_matches_categories">Flere kategorier af interessepunkter fundet som matcher forespørgslen:</string>
<string name="data_to_search_poi_not_available">Lokale data til at søge interessepunkter findes ikke.</string>
@ -538,7 +537,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
\n\t
\n\tFor at anvende aktiver \'Menu\' → \'Konfigurer kort\' → \'Vælg kortkilde…\' → \'Offline vektor-kort\'.</string>
<string name="choose_audio_stream">Lydkanal for talevejledning</string>
<string name="choose_audio_stream_descr">Vælg højttaler til at afspille talevejledning.</string>
<string name="choose_audio_stream_descr">Vælg højttaler for talevejledning.</string>
<string name="voice_stream_voice_call">Telefonopkaldslyd (til at afbryde Bluetooth bilradio)</string>
<string name="voice_stream_notification">Meddelelselyd</string>
<string name="voice_stream_music">Medie-/navigationslyd</string>
@ -564,7 +563,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="error_doing_search">Kunne ikke udføre offline søgning.</string>
<string name="search_osm_offline">Søg efter geografisk placering</string>
<string name="system_locale">System</string>
<string name="preferred_locale_descr">Vælg sprog (træder i kraft ved genstart).</string>
<string name="preferred_locale_descr">Vælg sprog (træder i kraft efter genstart).</string>
<string name="preferred_locale">Sprog</string>
<string name="incomplete_locale">ufuldstændig</string>
<string name="unit_of_length_descr">Ændr enhed for afstand.</string>
@ -623,10 +622,10 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="install_selected_build">"Installer OsmAnd: {0} - {1} - {2} MB ?"</string>
<string name="loading_builds_failed">Hentning af versionslisten for OsmAnd mislykkedes</string>
<string name="loading_builds">Indlæser OsmAnd-versioner…</string>
<string name="select_build_to_install">Vælg en OsmAnd-version</string>
<string name="select_build_to_install">Vælg en OsmAnd-version, der skal installeres</string>
<string name="contribution_activity">Installer version</string>
<string name="gps_status_app_not_found">GPS-status program er ikke installeret. Søg på Play butik?</string>
<string name="voice_is_not_available_title">Ingen talevejledning valgt</string>
<string name="voice_is_not_available_title">Vælg en talevejledningspakke</string>
<string name="daynight_mode_day">Dag</string>
<string name="daynight_mode_night">Nat</string>
<string name="daynight_mode_auto">Solopgang/-nedgang</string>
@ -795,8 +794,8 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="voice_data_initializing">Initialiserer taledata…</string>
<string name="voice_data_not_supported">Ikke understøttet version af taledata</string>
<string name="voice_data_corrupted">De angivne taledata er fejlbehæftet</string>
<string name="voice_data_unavailable">De valgte taledata er ikke tilgængelig</string>
<string name="opening_hours_not_supported">Åbningstider format kan ikke ændres</string>
<string name="voice_data_unavailable">Den valgte talevejledningspakke er ikke tilgængelig</string>
<string name="opening_hours_not_supported">Kan ikke ændre åbningstidsformatet.</string>
<string name="transport_stop_to_go_out">Vælg stoppestedet for afstigning</string>
<string name="transport_stops_to_pass">stoppesteder der skal passeres</string>
<string name="show_transport_over_map_description">Vis stoppesteder for kollektivtrafik på kortet.</string>
@ -823,7 +822,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="hint_search_online">Online-søgning: husnummer, gade, by</string>
<string name="search_online_address">Online søgning</string>
<string name="max_level_download_tile">Maks online zoom</string>
<string name="max_level_download_tile_descr">Gennemse ikke online-kortbrikket for zoom-niveauer ud over dette.</string>
<string name="max_level_download_tile_descr">Gennemse ikke online-kort for zoom-niveauer ud over dette.</string>
<string name="osmand_routing_experimental">OsmAnd offline-navigation er en eksperimentel funktion og den virker ikke for længere afstande end ca. 20 km.
\n
\nNavigationen skiftes midlertidig til online CloudMade tjenesten.</string>
@ -831,7 +830,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="route_general_information">Total afstand %1$s, rejsetid %2$d t %3$d m.</string>
<string name="router_service_descr">Online eller offline navigationstjeneste.</string>
<string name="router_service">Navigationstjeneste</string>
<string name="sd_dir_not_accessible">Datalagringsmappen på hukommelseskortet er ikke tilgængelig!</string>
<string name="sd_dir_not_accessible">Lagringsmappen på hukommelseskortet er ikke tilgængelig!</string>
<string name="download_question_exist">Offline-data for {0} eksisterer allerede ({1}). Opdater ({2})?</string>
<string name="download_question">Hent {0} - {1}?</string>
<string name="address">Adresse</string>
@ -871,15 +870,15 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="finished_task">Færdig</string>
<string name="use_online_routing_descr">Brug internettet til at beregne rute.</string>
<string name="use_online_routing">Brug online-navigation</string>
<string name="osm_settings_descr">Indstillinger for OpenStreetMap.org (OSM), som kræves for bidrag til OSM.</string>
<string name="osm_settings_descr">Angiv indstillinger for OpenStreetMap.org (OSM), som er nødvendige for overførelse til OSM.</string>
<string name="data_settings_descr">Angiv sprog, hent/genindlæs data.</string>
<string name="data_settings">Data</string>
<string name="osm_settings">OSM-redigering</string>
<string name="osm_settings">OpenStreetMap redigering</string>
<string name="additional_settings">Yderligere indstillinger</string>
<string name="save_current_track_descr">Gem det aktuelle spor som en GPX-fil nu.</string>
<string name="save_current_track">Gem det aktuelle spor</string>
<string name="save_track_interval">Logningsinterval under navigation</string>
<string name="save_track_interval_descr">Vælg logningsinterval for optagelse af spor under navigation.</string>
<string name="save_track_interval_descr">Angiv logningsinterval for optagelse af spor under navigation</string>
<string name="save_track_to_gpx_descrp">GPX-spor gemmes automatisk i tracks-mappen under navigation.</string>
<string name="save_track_to_gpx">Automatisk optagelse af spor under navigation</string>
<string name="update_tile">Opdater kort</string>
@ -898,7 +897,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="map_view_3d">3D-kortvisning</string>
<string name="show_poi_over_map_description">Vis den sidst anvendte IP overlejring.</string>
<string name="show_poi_over_map">Vis IP overlejring</string>
<string name="map_tile_source_descr">Vælg kilde til onlinekort eller cachelagrede kortbrikker</string>
<string name="map_tile_source_descr">Vælg kilde til onlinekort eller cachelagrede kortbrikker.</string>
<string name="map_tile_source">Kilde til kortbrikker</string>
<string name="map_source">Kortkilde</string>
<string name="use_internet">Brug internettet</string>
@ -937,10 +936,10 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="incremental_search_street">Søg efter gader trinvist</string>
<string name="navigate_point_format_DMS">DDD MM SS.S</string>
<string name="street_name">Gadenavn</string>
<string name="select_address_activity">Vælg adresse</string>
<string name="select_address_activity">Angiv adresse</string>
<string name="favourites_list_activity">Vælg Favorit</string>
<string name="hno">Husnummer</string>
<string name="choose_osmand_theme_descr">Vælg udseende på programmet.</string>
<string name="choose_osmand_theme_descr">Tilpas udseende på programmet.</string>
<string name="choose_osmand_theme">Tema</string>
<string name="accessibility_options">Indstillinger for tilgængelighed</string>
<string name="monitoring_settings">Optag ture</string>
@ -973,26 +972,26 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="distance_measurement_clear_route">Slet alle punkter</string>
<string name="plugin_distance_point_ele">højde</string>
<string name="osmand_distance_planning_plugin_description">Udvidelsen aktiverer et kortmodul som gør det muligt at oprette spor ved at trykke på kortet, eller ved at bruge eller ændre eksisterende GPX-filer, til at planlægge en tur og måle afstanden mellem punkter. Resultaterne kan gemmes som en GPX-fil, som senere kan bruges til vejledning.</string>
<string name="osmand_distance_planning_plugin_name">Afstandsberegner &amp; planlægningsværktøj</string>
<string name="osmand_distance_planning_plugin_name">Afstandsberegner og planlægningsværktøj</string>
<string name="use_distance_measurement_help">* Tryk for at markere et punkt.
\n* Tryk og hold for at slette tidligere punkt.
\n* Tryk og hold på et punkt for at se og vedhæfte beskrivelse.
\n* Tryk på målemodul for at se flere handlinger.</string>
<string name="delete_point">Slet punkt</string>
<string name="local_osm_changes_backup_failed">Kunne ikke sikkerhedskopiere OSM ændringer</string>
<string name="local_osm_changes_backup_failed">Kunne ikke sikkerhedskopiere OSM ændringer.</string>
<string name="local_osm_changes_backup_successful">OSM-ændringsfilen %1$s genereret</string>
<string name="local_osm_changes_backup">Sikkerhedskopiering efterhånden som OSM ændres</string>
<string name="intermediate_items_sort_by_distance">Sorter fra dør til dør</string>
<string name="search_street_in_neighborhood_cities">Søg efter gade i nabolagets byer</string>
<string name="intermediate_items_sort_return">Optimeret rækkefølge af mellemliggende destinationer på vej til destinationen.</string>
<string name="please_select_address">Vælg først en by eller gade</string>
<string name="please_select_address">Angiv by eller gade først</string>
<string name="context_menu_item_destination_point">Vælg som destination</string>
<string name="destination_point">Destinationen %1$s</string>
<string name="av_camera_focus">Kameraets fokustype</string>
<string name="av_camera_focus_descr">Vælg fokustypen for det interne kamera.</string>
<string name="av_camera_focus_descr">Kamerafokustilstand:</string>
<string name="av_camera_focus_auto">Autofokus</string>
<string name="av_camera_focus_hiperfocal">Hyperfocal fokus</string>
<string name="av_camera_focus_infinity">Uendelig fokus</string>
<string name="av_camera_focus_infinity">Fokus er sat til uendeligt</string>
<string name="av_camera_focus_macro">Makrofokustilstand (nærbillede)</string>
<string name="av_camera_focus_edof">Udvidet dybdeskarphed (EDOF)</string>
<string name="av_camera_focus_continuous">Kameraet forsøger løbende at fokusere</string>
@ -1013,7 +1012,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="context_menu_item_directions_to">Rutevejledning til</string>
<string name="context_menu_item_directions_from">Rutevejledning fra</string>
<string name="speak_title">Meddel…</string>
<string name="speak_descr">Konfigurer til at meddele gadenavne, trafikadvarsler (tvungne stop, vejbump), fartkameraadvarsler, hastighedsgrænser.</string>
<string name="speak_descr">Konfigurer meddelse af gadenavne, trafikadvarsler (tvungne stop, vejbump), fartkameraadvarsler og hastighedsgrænser.</string>
<string name="speak_street_names">Gadenavne (talesyntese)</string>
<string name="driving_region_japan">Japan</string>
<string name="driving_region_us">USA</string>
@ -1056,10 +1055,10 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="app_mode_boat">Båd</string>
<string name="app_mode_aircraft">Fly</string>
<string name="map_widget_map_rendering">Kort-rendering</string>
<string name="app_modes_choose_descr">Vælg de profiler der skal være synlige.</string>
<string name="app_modes_choose_descr">Vælg viste profiler.</string>
<string name="app_modes_choose">Programprofiler</string>
<string name="amenity_type_seamark">Sømærke</string>
<string name="speech_rate_descr">Angiv talehastigheden for talesyntese.</string>
<string name="speech_rate_descr">Angiv talehastigheden for tekst-til-tale.</string>
<string name="speech_rate">Talehastighed</string>
<string name="complex_route_calculation_failed">Hurtig ruteberegning mislykkedes (%s), går tilbage til langsom beregning.</string>
<string name="disable_complex_routing_descr">Deaktiver to-faset ruteplanlægning til bilnavigation.</string>
@ -1089,7 +1088,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="route_info">Ruteinfo</string>
<string name="select_gpx">Vælg GPX…</string>
<string name="route_preferences">Ruteindstillinger</string>
<string name="route_descr_select_destination">Vælg destination</string>
<string name="route_descr_select_destination">Angiv destination</string>
<string name="keep_and_add_destination_point">Tilføj som efterfølgende destination</string>
<string name="use_displayed_track_for_navigation">Brug vist spor til navigation?</string>
<string name="calculate_osmand_route_without_internet">Offline beregning af rutesegment</string>
@ -1149,7 +1148,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="voice_pref_title">Tale</string>
<string name="misc_pref_title">Diverse</string>
<string name="localization_pref_title">Lokalisering</string>
<string name="interrupt_music_descr">Stemmemeddelelser pause, ikke bare dæmpe musikafspilning.</string>
<string name="interrupt_music_descr">Stemmemeddelelser sætter musikafspilningen på pause.</string>
<string name="interrupt_music">Pause musik</string>
<string name="share_route_as_gpx">Del rute som GPX-fil</string>
<string name="share_route_subject">Ruten delt via OsmAnd</string>
@ -1195,7 +1194,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="gpx_split_interval">Opdelingsinterval</string>
<string name="loading_smth">Indlæser %1$s…</string>
<string name="save_as_favorites_points">Gem som en gruppe af Favoritter</string>
<string name="select_destination_and_intermediate_points">Vælg destinationer</string>
<string name="select_destination_and_intermediate_points">Angiv destinationer</string>
<string name="layer_amenity_label">Overlejring af IP-etiketter</string>
<string name="create_poi_link_to_osm_doc">
<u>Online OSM</u> kort klassificering med billeder.</string>
@ -1203,8 +1202,8 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="show_zoom_buttons_navigation">Vis zoom-knapperne</string>
<string name="sort_by_distance">Sorter efter afstand</string>
<string name="sort_by_name">Sorter efter navn</string>
<string name="none_selected_gpx">Ingen GPX-filer er valgt. Tryk og hold for at vælge en.</string>
<string name="local_index_select_gpx_file">Vælg at få vist</string>
<string name="none_selected_gpx">Angiv først en GPX-fil med et langt tryk.</string>
<string name="local_index_select_gpx_file">Vælg et spor</string>
<string name="no_index_file_to_download">Ingenting at hente, kontroller internetforbindelsen.</string>
<string name="rendering_attr_hideBuildings_name">Bygninger</string>
<string name="rendering_attr_hideNonVehicleHighways_name">Gang- og cykelstier</string>
@ -1223,7 +1222,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="lang_he">Hebræisk</string>
<string name="forward">Frem</string>
<string name="home">Betjeningspanel</string>
<string name="live_monitoring_m_descr">Send sporing til en bestemt webtjeneste, hvis GPX-logning er aktiveret.</string>
<string name="live_monitoring_m_descr">Send sporing til en bestemt webtjeneste, hvis GPX-logning er slået til.</string>
<string name="live_monitoring_m">Online sporing (GPX nødvendig)</string>
<string name="live_monitoring_start">Start online sporing</string>
<string name="live_monitoring_stop">Stop online sporing</string>
@ -1257,10 +1256,10 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="arrival_distance_factor_at_last">Ved de sidste meter</string>
<string name="rendering_attr_coloredBuildings_name">Farvekod bygninger efter type</string>
<string name="av_camera_pic_size">Kamera billedstørrelse</string>
<string name="av_camera_pic_size_descr">Vælg billedstørrelsen for det interne kamera.</string>
<string name="av_camera_pic_size_descr">Angiv kamerabilledstørrelse</string>
<string name="rendering_value_car_name">Bil</string>
<string name="rendering_value_bicycle_name">Cykel</string>
<string name="rendering_value_pedestrian_name">Fodgænger</string>
<string name="rendering_value_pedestrian_name">Til fods</string>
<string name="rendering_value_browse_map_name">Gennemse kort</string>
<string name="download_additional_maps">Hent manglende kort %1$s (%2$d MB)?</string>
<string name="shared_string_waypoints">Rutepunkter</string>
@ -1279,9 +1278,9 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="rendering_attr_publicTransportMode_name">Bus-, trolleybus-, shuttlebusruter</string>
<string name="save_track_to_gpx_globally">Log spor til GPX-fil</string>
<string name="save_track_interval_globally">Logningsinterval</string>
<string name="save_track_to_gpx_globally_descr">Generel positionsslogning til en GPX-fil kan slås til/fra med \'GPX-logning\' på hovedskærmen.</string>
<string name="save_track_to_gpx_globally_descr">Generel positionsslogning til en GPX-fil kan slås til eller fra med GPX-logning udvidelsen på kortet.</string>
<string name="confirm_every_run">Spørg altid</string>
<string name="save_global_track_interval_descr">Vælg logningsinterval for den almindelige optagelse af spor (aktiveres via \'GPX-logning\' på hovedskærmen).</string>
<string name="save_global_track_interval_descr">Angiv logningsinterval for den almindelige optagelse af spor (aktiveres via \'GPX-logning\' på hovedskærmen).</string>
<string name="save_global_track_interval">Generelt logningsinterval</string>
<string name="traffic_warning_speed_limit">Hastighedsgrænse</string>
<string name="traffic_warning_border_control">Grænsekontrol</string>
@ -1369,9 +1368,9 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="enable_proxy_title">Aktiver HTTP proxy</string>
<string name="enable_proxy_descr">Konfigurer en HTTP-proxy for alle netværksanmodninger.</string>
<string name="proxy_host_title">Proxy vært</string>
<string name="proxy_host_descr">Konfigurer proxy værtsnavn (f.eks. 127.0.0.1).</string>
<string name="proxy_host_descr">Angiv proxy værtsnavn (f.eks. 127.0.0.1).</string>
<string name="proxy_port_title">Proxy port</string>
<string name="proxy_port_descr">Konfigurer proxy portnummer (f.eks. 8118).</string>
<string name="proxy_port_descr">Angiv proxy portnummer (f.eks. 8118).</string>
<string name="rendering_attr_streetLighting_name">Gadebelysning</string>
<string name="version_settings_descr">Hent aktuelle udviklingsversioner.</string>
<string name="version_settings">Versioner</string>
@ -1391,7 +1390,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="device_memory">Lagerplads</string>
<string name="rendering_attr_pisteRoutes_name">Skiløjper</string>
<string name="roads_only">Kun veje</string>
<string name="notes">Noter</string>
<string name="notes">A/V-noter</string>
<string name="online_map">Online kort</string>
<string name="watch">Vis</string>
<string name="share_note">Del note</string>
@ -1529,7 +1528,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="welcome_text">OsmAnd tilbyder globale offline kortvisninger, og offline navigation.</string>
<string name="confirm_usage_speed_cameras">I mange lande (Tyskland, Frankrig, Italien og andre) er anvendelse af fartkamera advarsler ikke tilladt ved lov. OsmAnd påtager sig ikke ansvaret, hvis loven overtrædes. Tryk kun på Ja, hvis det er berettiget at bruge denne funktion.</string>
<string name="agps_info">A-GPS information</string>
<string name="agps_data_last_downloaded">A-GPS data sidst hentet: %1$s</string>
<string name="agps_data_last_downloaded">A-GPS data hentet: %1$s</string>
<string name="shared_string_message">Meddelelse</string>
<string name="shared_string_do_not_use">Brug ikke</string>
<string name="shared_string_address">Adresse</string>
@ -1574,7 +1573,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="local_recordings_delete_all_confirm">Slet %1$d noter. Bekræft?</string>
<string name="disable_recording_once_app_killed">Forhindre uafhængig logning</string>
<string name="disable_recording_once_app_killed_descrp">Hvis markeret vil GPX-logning blive stoppet, når programmet afsluttes (via seneste programmer). OsmAnd-baggrundsmeddelse forsvinder fra meddelelseslinjen.</string>
<string name="gps_network_not_enabled">Placeringtjenesten er ikke aktiveret. Aktiver?</string>
<string name="gps_network_not_enabled">Placeringtjenesten er slukket. Slå det til\?</string>
<string name="archive_wikipedia_data">Der er gamle inkompatible Wikipedia data. Skal de arkiveres?</string>
<string name="download_wikipedia_files">Hent yderligere data fra Wikipedia (%1$s MB)?</string>
<string name="lang_vo">Volapyk</string>
@ -1609,7 +1608,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="lang_lb">Luxembourgsk</string>
<string name="lang_os">Ossetisk</string>
<string name="lang_eo">Esperanto</string>
<string name="restart_is_required">Genstart manuelt for at anvende alle ændringer.</string>
<string name="restart_is_required">Der er behov for en genstart for at anvende ændringen.</string>
<string name="rendering_attr_currentTrackColor_name">GPX-farve</string>
<string name="rendering_attr_currentTrackWidth_name">GPX-bredde</string>
<string name="rendering_value_red_name">Rød</string>
@ -1633,7 +1632,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="rate_this_app">Bedøm OsmAnd</string>
<string name="rate_this_app_long">Vurder OsmAnd på Google Play</string>
<string name="user_hates_app_get_feedback">Fortæl os hvorfor.</string>
<string name="user_hates_app_get_feedback_long">Fortæl os hvad du ønsker at ændre i OsmAnd.</string>
<string name="user_hates_app_get_feedback_long">Fortæl om eventuelle forslag.</string>
<string name="download_live_updates">Realtidsopdateringer</string>
<string name="delete_change">Slet ændring</string>
<string name="try_again">Prøv igen</string>
@ -1641,7 +1640,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="failed_to_upload">Overførsel mislykkedes</string>
<string name="successfully_uploaded_pattern">Overført {0}/{1}</string>
<string name="no_updates_available">Ingen opdateringer tilgængelige</string>
<string name="we_really_care_about_your_opinion">Vi interesserer os for din mening og tilbagemelding er vigtig for os.</string>
<string name="we_really_care_about_your_opinion">Din mening og tilbagemelding værdsættes.</string>
<string name="rendering_value_boldOutline_name">Fed kontur</string>
<string name="traffic_warning_hazard">Fare</string>
<string name="dahboard_options_dialog_title">Konfigurer betjeningspanel</string>
@ -1829,9 +1828,9 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="route_distance">Afstand:</string>
<string name="route_duration">Varighed:</string>
<string name="missing_write_external_storage_permission">OsmAnd mangler tilladelse til at bruge hukommelseskortet</string>
<string name="no_location_permission">Har ikke tilladelse til at bruge placeringsdata.</string>
<string name="no_camera_permission">OsmAnd har ikke tilladelse til at bruge kameraet.</string>
<string name="no_microphone_permission">OsmAnd har ikke tilladelse til at bruge mikrofonen.</string>
<string name="no_location_permission">Giv adgang til placeringsdata.</string>
<string name="no_camera_permission">Giv adgang til kameraet.</string>
<string name="no_microphone_permission">Giv adgang til mikrofon.</string>
<string name="impassable_road_desc">Vælg veje, der skal undgås under navigation.</string>
<string name="shared_string_sound">Lyd</string>
<string name="select_voice_provider">Vælg talevejledning</string>
@ -1896,9 +1895,10 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="shared_string_toolbar">Værktøjslinie</string>
<string name="shared_string_widgets">Moduler</string>
<string name="download_files_error_not_enough_space">Ikke nok plads!
  Brug for {3} MB midlertidigt, {1} MB permanent lagerplads.
  Tilgængelig lagerplads er kun {2} MB.</string>
<string name="download_files_question_space_with_temp">Hent {0} filer? Lagerplads brugt {3} MB midlertidigt, {1} MB permanent. ({2} MB ledig plads.)</string>
\nBrug for {3} MB midlertidigt, {1} MB permanent.
\n(Tilgængelig lagerplads er kun {2} MB.)</string>
<string name="download_files_question_space_with_temp">Hent {0} filer\?
\n{3} MB brugt midlertidigt, {1} MB permanent. (af {2} MB.)</string>
<string name="upload_osm_note">Overfør OSM-note</string>
<string name="upload_anonymously">Overfør anonymt</string>
<string name="upload_osm_note_description">Overfør OSM-noter anonymt eller ved brug af OpenStreetMap.org-profil.</string>
@ -1926,9 +1926,9 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="osm_live_region_desc">En del af donationen vil blive sendt til OSM-brugere, som indsender ændringer til kortet i det pågældende område.</string>
<string name="osm_live_subscription_settings">Indstillinger for abonnement</string>
<string name="osm_live_ask_for_purchase">Køb først OsmAnd Live-abonnement</string>
<string name="osm_live_header">"Abonnementet giver timebaserede opdateringer til alle kort i hele verden.
<string name="osm_live_header">Abonnementet giver timebaserede opdateringer til alle kort i hele verden.
\nEn del af indtægten går tilbage til OSM-fællesskabet og udbetales for hvert OSM-bidrag.
\nHvis du ønsker at støtte og få support fra OsmAnd og OSM, er dette en god måde at gøre det på."</string>
\nHvis du ønsker at støtte og få support fra OsmAnd og OSM, er dette en god måde at gøre det på.</string>
<string name="recalculate_route">Genberegn ruten</string>
<string name="shared_string_topbar">Topbjælke</string>
<string name="storage_directory_shared">Delt hukommelse</string>
@ -1938,7 +1938,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="shared_string_move_up">Flyt ↑</string>
<string name="shared_string_move_down">Flyt ↓</string>
<string name="full_report">Fuldstændig rapport</string>
<string name="open_street_map_login_and_pass">OpenStreetMap brugernavn og adgangskode</string>
<string name="open_street_map_login_and_pass">OSM brugernavn og adgangskode</string>
<string name="storage_permission_restart_is_required">Programmet har nu lov til at skrive til ekstern lager, men en genstart er påkrævet.</string>
<string name="report">Rapport</string>
<string name="file_name_containes_illegal_char">Filnavnet indeholder ikke tilladte tegn</string>
@ -2085,7 +2085,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="shared_string_record">Optag</string>
<string name="gpx_logging_no_data">Ingen data</string>
<string name="trip_rec_notification_settings">Aktiver hurtig optagelse</string>
<string name="trip_rec_notification_settings_desc">Vis en systemmeddelelse, der giver mulighed for at starte optagelse af turen.</string>
<string name="trip_rec_notification_settings_desc">Vis en systemmeddelelse, der tillader optagelse af turen.</string>
<string name="shared_string_notifications">Meddelelser</string>
<string name="gpx_no_tracks_title">Endnu ingen GPX-filer</string>
<string name="gpx_no_tracks_title_folder">Tilføj også GPX-filer til mappen</string>
@ -2140,11 +2140,11 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
<string name="quick_action_add_marker_descr">En knap til at tilføje en kortmarkør på skærmens centrum.</string>
<string name="quick_action_add_gpx_descr">En knap til at tilføje et GPX-rutepunkt midt på skærmen.</string>
<string name="quick_action_take_audio_note_descr">En knap til at tilføje en lydnote midt på skærmen.</string>
<string name="quick_action_take_video_note_descr">"En knap til attilføj en videonote midt på skærmen."</string>
<string name="quick_action_take_photo_note_descr">"En knap til at tilføje en fotonote midt på skærmen."</string>
<string name="quick_action_take_video_note_descr">En knap til at tilføje en videonote midt på skærmen.</string>
<string name="quick_action_take_photo_note_descr">En knap til at tilføje en fotonote midt på skærmen.</string>
<string name="quick_action_add_osm_bug_descr">En knap til at tilføje en OSM-note midt på skærmen.</string>
<string name="quick_action_add_poi_descr">En knap yik at tilføje et interessepunkt midt på skærmen.</string>
<string name="quick_action_navigation_voice_descr">"En til/fra-knap for at deaktiverer eller aktivere stemmevejledning under navigation."</string>
<string name="quick_action_navigation_voice_descr">En til/fra-knap for at deaktiverer eller aktivere stemmevejledning under navigation.</string>
<string name="quick_action_add_parking_descr">En knap til at tilføje en parkeringsplads midt på skærmen.</string>
<string name="favorite_autofill_toast_text">" gemt i "</string>
<string name="favorite_empty_place_name">Sted</string>
@ -2195,7 +2195,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB).</stri
Repræsenterer område: %1$s x %2$s</string>
<string name="quick_action_map_overlay_switch">Kortoverlejring er ændret til \"%s\".</string>
<string name="quick_action_map_underlay_switch">Kortunderlejring er ændret til \"%s\".</string>
<string name="quick_action_page_list_descr">"En knap til at gennemløber nedenstående liste."</string>
<string name="quick_action_page_list_descr">En knap til at gennemløber nedenstående liste.</string>
<string name="auto_split_recording_title">Opdel automatisk optagelser efter et ophold</string>
<string name="auto_split_recording_descr">Start et nyt segment efter ophold på 6 min., et nyt spor efter 2 timer eller en ny fil efter et længere ophold, hvis datoen er ændret.</string>
<string name="rendering_attr_depthContours_description">Vis dybdekonturer og -punkter.</string>
@ -2224,7 +2224,7 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="average_speed">Gennemsnitshastighed</string>
<string name="shared_string_gpx_track">Spor</string>
<string name="points_delete_multiple_succesful">Punkter slettet.</string>
<string name="points_delete_multiple">Slet %1$d, punkter. Sikker?</string>
<string name="points_delete_multiple">Slet %1$d punkter. Bekræft\?</string>
<string name="route_points_category_name">Sving at passere på ruten</string>
<string name="track_points_category_name">Rutepunkter, interessepunkter, navngivne objekter</string>
<string name="add_new_folder">Tilføj ny mappe</string>
@ -2383,8 +2383,8 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="quick_action_add_first_intermediate_desc">Tryk på genvejen for at tilføje et første mellemliggende punkt på skærmens centrum.</string>
<string name="quick_action_auto_zoom">Automatisk kortzoom til/fra</string>
<string name="quick_action_auto_zoom_desc">Tryk på genvejsknappen skifter den hastighedafhænige kortzoom til/fra.</string>
<string name="quick_action_auto_zoom_on">"Aktiver automatisk zoom"</string>
<string name="quick_action_auto_zoom_off">"Deaktiver automatisk zoom"</string>
<string name="quick_action_auto_zoom_on">Aktiver automatisk zoom</string>
<string name="quick_action_auto_zoom_off">Deaktiver automatisk zoom</string>
<string name="shared_string_paused">Pauset</string>
<string name="type_city_town">Indtast by/bydel/sted</string>
<string name="type_postcode">Indtast postnummer</string>
@ -2897,7 +2897,7 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="choose_track_file_to_follow">Vælg den sporfil, der skal følges</string>
<string name="voice_announcements">Stemmemeddelelser</string>
<string name="arrive_at_time">Ankommer %1$s</string>
<string name="quick_action_switch_day_night_descr">En til/fra-knap til at skifte mellem dag- og nattilstand</string>
<string name="quick_action_switch_day_night_descr">En til/fra-knap til at skifte mellem dag- og nattilstand.</string>
<string name="routeInfo_roadClass_name">Vejtype</string>
<string name="routeInfo_surface_name">Overflade</string>
<string name="routeInfo_smoothness_name">Jævnhed</string>
@ -2917,7 +2917,7 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="exit_at">Stå af ved</string>
<string name="sit_on_the_stop">Stig på ved stoppested</string>
<string name="quick_action_show_hide_gpx_tracks">Vis/skjul GPX spor</string>
<string name="quick_action_show_hide_gpx_tracks_descr">Tryk på genvejssknappen viser eller skjuler valgte GPX spor på kortet</string>
<string name="quick_action_show_hide_gpx_tracks_descr">En knap til at vise eller skjule valgte GPX-spor på kortet.</string>
<string name="quick_action_gpx_tracks_hide">Skjul GPX spor</string>
<string name="quick_action_gpx_tracks_show">Vis GPX spor</string>
<string name="add_destination_query">Angiv en destination først</string>
@ -2941,8 +2941,8 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="use_osm_live_public_transport_description">Aktivér offentlig transport for OsmAnd Live ændringer.</string>
<string name="use_osm_live_public_transport">OsmAnd Live offentlig transport</string>
<string name="add_start_and_end_points">Tilføj afgangs-og ankomststed</string>
<string name="route_add_start_point">Tilføj startpunkt</string>
<string name="route_descr_select_start_point">Vælg startpunkt</string>
<string name="route_add_start_point">Tilføj udgangspunkt</string>
<string name="route_descr_select_start_point">Vælg udgangspunkt</string>
<string name="rendering_attr_surface_sand_name">Sand</string>
<string name="rendering_attr_surface_grass_name">Græs</string>
<string name="rendering_attr_surface_grass_paver_name">Befæstet græs</string>
@ -2980,8 +2980,7 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="quick_action_day_night_mode">%s tilstand</string>
<string name="avoid_pt_types">Undgå transporttyper…</string>
<string name="avoid_pt_types_descr">Vælg offentlige transporttyper, der skal undgåes ved navigation:</string>
<string name="save_poi_value_exceed_length">Den maksimale længde af tag \"%s\" er 255 tegn.
\nForkort for at fortsætte.</string>
<string name="save_poi_value_exceed_length">Forkort længden af mærket \"%s\" til mindre end 255 tegn.</string>
<string name="rendering_attr_surface_unpaved_name">Ikke befæstet</string>
<string name="rendering_attr_surface_ground_name">Jord</string>
<string name="rendering_attr_surface_dirt_name">Ubehandlet</string>
@ -3033,9 +3032,9 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="dont_move_maps">Flyt ikke</string>
<string name="public_transport_ped_route_title">Ruten til fods er ca %1$s og kan være hurtigere end offentlig transport</string>
<string name="public_transport_no_route_title">Kunne desværre ikke finde en rute, der passer til indstillingerne.</string>
<string name="public_transport_try_ped">Prøv fodgængernavigationen.</string>
<string name="public_transport_try_ped">Prøv navigation til fods.</string>
<string name="public_transport_try_change_settings">Prøv at ændre indstillinger.</string>
<string name="public_transport_calc_pedestrian">Beregn fodgængerruten</string>
<string name="public_transport_calc_pedestrian">Beregn rute til fods</string>
<string name="public_transport_type">Transporttype</string>
<string name="searching_gps">Søger efter GPS</string>
<string name="coordinates_widget">Koordinat modul</string>
@ -3050,9 +3049,9 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="visited_screens">Besøgte skærme</string>
<string name="colleted_data">Indsamlede data</string>
<string name="collected_data_descr">Definer hvilke data der deles med OsmAnd.</string>
<string name="downloaded_maps_collect_descr">Hjælper med at forstå, hvilke kort over hvilke regioner og lande der er mest populære.</string>
<string name="visited_screens_collect_descr">Hjælper med at forstå hvilke funktioner i OsmAnd der er mest populære.</string>
<string name="privacy_and_security_change_descr">Ved at trykke på \"Tillad\" accepteres vores %1$s</string>
<string name="downloaded_maps_collect_descr">Hjælper os med at forstå populariteten af land- og regionskort.</string>
<string name="visited_screens_collect_descr">Hjælper os med at forstå populariteten af OsmAnd-funktionens.</string>
<string name="privacy_and_security_change_descr">Tryk på \"Tillad\" accepterer %1$s</string>
<string name="settings_privacy_and_security">Privatliv og sikkerhed</string>
<string name="settings_privacy_and_security_desc">Vælg hvilke data der deles</string>
<string name="shared_string_no_thank_you">Nej tak</string>
@ -3143,7 +3142,7 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="shared_string_crash">Nedbrud</string>
<string name="last_launch_crashed">Sidste kørsel af OsmAnd mislykkedes. Hjælp med at forbedre OsmAnd ved at dele fejlmeddelelsen.</string>
<string name="app_mode_ufo">UFO</string>
<string name="release_3_4">"• Anvendelsesprofiler: opret en brugervalgt profil med en brugervalgt ikon og farve
<string name="release_3_4">• Anvendelsesprofiler: opret en brugervalgt profil med en brugervalgt ikon og farve
\n
\n • Tilpas alle profilers standard- og min/max hastigheder
\n
@ -3161,7 +3160,7 @@ Repræsenterer område: %1$s x %2$s</string>
\n
\n• Andre fejlrettelser
\n
\n"</string>
\n</string>
<string name="app_mode_personal_transporter">Person transport</string>
<string name="app_mode_monowheel">Monowheel</string>
<string name="app_mode_scooter">Scooter</string>
@ -3185,9 +3184,9 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="rendering_attr_highway_class_track_grade4_name">Grad 4</string>
<string name="rendering_attr_highway_class_track_grade5_name">Grad 5</string>
<string name="external_input_device">Eksterne inputenheder</string>
<string name="external_input_device_descr">Vælg en enhed, såsom et generisk tastatur eller WunderLINQ for ekstern kontrol.</string>
<string name="external_input_device_descr">Vælg en ekstern kontrolenhed, såsom et tastatur eller WunderLINQ.</string>
<string name="sett_no_ext_input">Ingen</string>
<string name="sett_generic_ext_input">Generisk tastatur</string>
<string name="sett_generic_ext_input">Tastatur</string>
<string name="sett_wunderlinq_ext_input">WunderLINQ</string>
<string name="sett_parrot_ext_input">Parrot</string>
<string name="turn_on_profile_desc">Aktiver mindst en programprofil, for at bruge denne indstilling.</string>
@ -3230,8 +3229,8 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="months_3">Tre måneder</string>
<string name="price_free">Gratis</string>
<string name="get_discount_title">Få %1$d %2$s med %3$s rabat.</string>
<string name="get_discount_first_part">%1$s for første %2$s</string>
<string name="get_discount_first_few_part">%1$s for første %2$s</string>
<string name="get_discount_first_part">%1$s for de første %2$s</string>
<string name="get_discount_first_few_part">%1$s for de første %2$s</string>
<string name="get_discount_second_part">derefter %1$s</string>
<string name="cancel_subscription">Annuller abonnement</string>
<string name="price_and_discount">%1$s • Spar %2$s</string>
@ -3246,8 +3245,8 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="apply_to_current_profile">Anvend kun for \"%1$s\"</string>
<string name="apply_to_all_profiles">Anvend på alle profiler</string>
<string name="start_up_message_pref">Startmeddelelse</string>
<string name="turn_screen_on_info">Vis kort under navigationen ovenpå låseskærmen.</string>
<string name="route_parameters_info">Indstillingerne påvirker beregningen af ruten. Vil kun blive anvendt på den valgte profil: %1$s.</string>
<string name="turn_screen_on_info">Vis kort på låseskærmen under navigation.</string>
<string name="route_parameters_info">Indstillinger for routing i den valgte profil \"%1$s\".</string>
<string name="wake_time">Vågnetid</string>
<string name="units_and_formats">Enheder &amp; formater</string>
<string name="appearance">Udseende</string>
@ -3329,11 +3328,11 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="shared_string_memory_kb_desc">%1$s KB</string>
<string name="data_storage_preference_summary">%1$s • %2$s</string>
<string name="data_storage_space_description">%1$s GB ledig (af %2$s GB)</string>
<string name="track_storage_directory">Overvåg lagringsmappen</string>
<string name="track_storage_directory_descrp">Spor kan gemmes i optagemappen eller i månedlige eller daglige mapper.</string>
<string name="store_tracks_in_rec_directory">Gem optagede spor i optagemappen</string>
<string name="store_tracks_in_daily_directories">Gem optagede spor i daglige mapper</string>
<string name="store_tracks_in_daily_directories_descrp">Gem optagede spor i undermapper pr. optagelsesdag (fx. 2018-01-01).</string>
<string name="track_storage_directory">Mappe til lagring af spor</string>
<string name="track_storage_directory_descrp">Spor kan gemmes i \'rec\' mappen eller i månedlige eller daglige mapper.</string>
<string name="store_tracks_in_rec_directory">Optag spor til \'rec\' mappen</string>
<string name="store_tracks_in_daily_directories">Optag spor i daglige mapper</string>
<string name="store_tracks_in_daily_directories_descrp">Optag spor i undermapper pr. optagelsesdag (f.eks. 2018-01-01).</string>
<string name="shared_string_memory_used_tb_desc">%1$s TB brugt</string>
<string name="shared_string_memory_used_gb_desc">%1$s GB brugt</string>
<string name="shared_string_memory_used_mb_desc">%1$s MB brugt</string>
@ -3374,7 +3373,7 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="quick_action_hillshade_hide">Skjul reliefskygger</string>
<string name="quick_action_show_hide_hillshade">Vis/skjul reliefskygger</string>
<string name="rendering_value_white_name">Hvid</string>
<string name="tts_initialization_error">Kan ikke starte tekst-til-tale-program</string>
<string name="tts_initialization_error">Tekst-til-tale-programmet kan ikke startes.</string>
<string name="simulate_your_location_gpx_descr">Simuler positionen ved hjælp af et optaget GPX-spor.</string>
<string name="export_profile">Eksportér profil</string>
<string name="exported_osmand_profile">OsmAnd profil: %1$s</string>
@ -3393,19 +3392,19 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="clear_confirmation_msg">Ryd %1$s\?</string>
<string name="download_map_dialog">Dialogboksen Hent kort</string>
<string name="dialogs_and_notifications_title">Dialoger og meddelelser</string>
<string name="dialogs_and_notifications_descr">Kontrol af popup-vinduer, dialoger og meddelelser, der OsmAnd vis under brug.</string>
<string name="dialogs_and_notifications_descr">Styr popop indstillinger, dialogbokse og meddelelser.</string>
<string name="rendering_attr_showCycleNodeNetworkRoutes_name">Vis cykelrute-knudepunkter</string>
<string name="rendering_value_walkingRoutesOSMCNodes_name">Node netværk</string>
<string name="rendering_value_walkingRoutesOSMCNodes_name">Nodenetværk</string>
<string name="suggested_maps">Foreslåede kort</string>
<string name="suggested_maps_descr">Disse kort skal bruges med udvidelser</string>
<string name="suggested_maps_descr">Disse kort er nødvendige for udvidelser.</string>
<string name="added_profiles">Tilføjede profiler</string>
<string name="added_profiles_descr">Udbidelse tilføjer ny profil til OsmAnd</string>
<string name="added_profiles_descr">Profiler tilføjet af udvidelse</string>
<string name="shared_string_turn_off">Sluk</string>
<string name="new_plugin_added">Ny udvidelse tilføjet</string>
<string name="join_segments">Forbind segmenter</string>
<string name="add_new_profile_q">Tilføj den nye profil \'%1$s\'\?</string>
<string name="save_heading">Medtag overskrift</string>
<string name="save_heading_descr">Gem overskrift til hvert TrackPoint under optagelsen.</string>
<string name="save_heading">Medtag retning</string>
<string name="save_heading_descr">Gem retning for hvert sporpunkt under optagelse.</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Personlig</string>
@ -3426,17 +3425,17 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="selected_profile">Valgte profil</string>
<string name="default_speed_dialog_msg">Estimerer ankomsttidspunkt for ukendte vejtyper og begrænser hastigheden for alle veje (kan påvirke ruten)</string>
<string name="reset_confirmation_descr">Ved at klikke på %1$s, slettes alle ændringer.</string>
<string name="reset_all_profile_settings_descr">Alle profilindstillinger nulstilles.</string>
<string name="reset_all_profile_settings_descr">Alle profilindstillinger nulstilles til standardværdier.</string>
<string name="reset_all_profile_settings">Nulstil alle profilindstillinger\?</string>
<string name="ltr_or_rtl_combine_via_space">%1$s %2$s</string>
<string name="ltr_or_rtl_combine_via_colon">%1$s: %2$s</string>
<string name="button_rate">Bedøm</string>
<string name="file_does_not_contain_routing_rules">\'%1$s\' filen indeholder ikke routing regler, vælg en anden fil.</string>
<string name="file_does_not_contain_routing_rules">\'%1$s\' filen indeholder ikke routing regler. Vælg en anden fil.</string>
<string name="not_support_file_type_with_ext">Vælg en understøttet %1$s udvidelsesfil i stedet.</string>
<string name="import_from_file">Importer fra fil</string>
<string name="import_routing_file">Importer routing-fil</string>
<string name="import_profile">Importer profil</string>
<string name="monitoring_prefs_descr">Navigation, lognøjagtighed</string>
<string name="monitoring_prefs_descr">Navigation, logningsnøjagtighed</string>
<string name="multimedia_notes_prefs_descr">Billedstørrelse, lyd-og videokvalitet</string>
<string name="osm_editing_prefs_descr">Log ind, adgangskode, offline redigering</string>
<string name="accessibility_prefs_descr">Vælg ikon, farve og navn</string>
@ -3455,7 +3454,7 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="osm_edits_view_descr">Se redigeringer eller OSM-fejl, der endnu ikke er overført i %1$s. Overførte punkter vises ikke længere.</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Ikonet vises under navigation eller bevægelse.</string>
<string name="select_map_icon_descr">Kortikon vises kun på kortet og skifter under navigation til navigationsikon.</string>
<string name="select_map_icon_descr">Ikon vist i hvile.</string>
<string name="logcat_buffer_descr">Kontroller og del detaljerede logfiler for programmet</string>
<string name="permission_is_required">Tilladelse kræves for at bruge denne mulighed.</string>
<string name="monitoring_min_speed_descr">Et lavhastighedsafskæringsfilter der ikke registrerer punkter under en bestemt hastighed. Kan få optagne spor til at se jævnere ud, når de ses på kortet.</string>
@ -3471,7 +3470,7 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="multimedia_use_system_camera">Brug systemprogram</string>
<string name="osm_authorization_success">Autorisationen lykkes</string>
<string name="rearrange_categories">Omarrangere kategorier</string>
<string name="create_custom_categories_list_promo">"Skift sorteringsrækkefølgen på listen, skjul unødvendige kategorier. Importer eller eksporter alle ændringer med profiler."</string>
<string name="create_custom_categories_list_promo">Skift sorteringsrækkefølgen på listen, skjul unødvendige kategorier. Importer eller eksporter alle ændringer med profiler.</string>
<string name="add_new_custom_category_button_promo">Tilføj en ny brugerdefineret kategori ved at vælge en eller nogle få nødvendige kategorier.</string>
<string name="shared_string_available">Tilgængelig</string>
<string name="add_custom_category">Tilføje brugerdefineret kategori</string>
@ -3566,19 +3565,19 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="import_profile_dialog_description">Den importerede profil indeholder yderligere data. Klik på Importer for kun at importere profildata, eller vælg yderligere data, der skal importeres.</string>
<string name="route_recalculation_dist_descr">Ruten vil blive genberegnet, hvis afstanden til ruten er længere end angivet parameter</string>
<string name="route_recalculation_dist_title">Mindste afstand for at genberegne ruten</string>
<string name="import_duplicates_description">OsmAnd allerede har elementer med de samme navne, som dem, der importeres.
<string name="import_duplicates_description">OsmAnd har allerede elementer med de samme navne, som dem, der importeres.
\n
\nVælg en aktion.</string>
<string name="listed_exist">Det angivne %1$s findes allerede.</string>
<string name="recalc_angle_dialog_title">Mindste vinkel mellem min placering og rute</string>
<string name="recalc_angle_dialog_descr">Ekstra lige segment mellem min placering og den beregnede rute vises, indtil ruten genberegnes</string>
<string name="recalc_angle_dialog_title">Mindste vinkel mellem placering og rute</string>
<string name="recalc_angle_dialog_descr">Ekstra lige segment mellem placering og den beregnede rute vises, indtil ruten genberegnes</string>
<string name="shared_string_terrain">Terræn</string>
<string name="hillshade_description">Reliefskyggekort viser hjælp af mørke nuancer skråninger, toppe og lavland.</string>
<string name="slope_description">Hældning er farvelagte visualiseringer på terræn.</string>
<string name="slope_description">Skråninger er farvelagte visualiseringer af terræn.</string>
<string name="terrain_slider_description">Angiv de min. og max. zoomniveauer, som laget vil blive vist på.</string>
<string name="hillshade_download_description">Yderligere kort er nødvendige for at se reliefskygger på kortet.</string>
<string name="slope_download_description">Yderligere kort er nødvendige for at se hældninger på kortet.</string>
<string name="slope_read_more">Læs mere om hældninger på %1$s.</string>
<string name="slope_read_more">Læs mere om skråninger på %1$s.</string>
<string name="shared_string_transparency">Gennemsigtighed</string>
<string name="shared_string_zoom_levels">Zoomniveauer</string>
<string name="shared_string_legend">Tegnforklaring</string>

View file

@ -2772,7 +2772,7 @@
<string name="poi_service_bicycle_charging_yes">Ladestation: ja</string>
<string name="poi_service_bicycle_charging_no">Ladestation: nein</string>
<string name="poi_shop_craft">Geschäft für Kunsthandwerksbedarf</string>
<string name="poi_fuel_avia_type">Kraftstoffart (avia)</string>
<string name="poi_fuel_avia_type">Kraftstoffart (Flugzeuge)</string>
<string name="poi_payment_fuel_type">Tankkarten</string>
<string name="poi_internet_access_type">Internet-Zugangsart</string>
<string name="poi_clothes_type">Art</string>

View file

@ -842,7 +842,7 @@
<string name="edit_filter_save_as_menu_item">Speichern als</string>
<string name="edit_filter_delete_dialog_title">Diesen Filter löschen\?</string>
<string name="edit_filter_delete_message">Filter %1$s gelöscht</string>
<string name="edit_filter_create_message">Filter %1$s erstellt</string>
<string name="edit_filter_create_message">Filter \'%1$s\' erstellt</string>
<string name="offline_navigation_not_available">OsmAnd-Offline-Navigation steht zur Zeit nicht zur Verfügung.</string>
<string name="left_side_navigation">Linksverkehr</string>
<string name="left_side_navigation_descr">Für Länder, in denen man auf der linken Straßenseite fährt.</string>
@ -3626,4 +3626,5 @@ Lon %2$s</string>
<string name="shared_string_language">Sprache</string>
<string name="shared_string_all_languages">Alle Sprachen</string>
<string name="wiki_menu_download_descr">Zusätzliche Karten werden benötigt um Wikipedia-POIs auf der Karte anzuzeigen.</string>
<string name="developer_plugin">Entwickler-Plugin</string>
</resources>

View file

@ -3602,4 +3602,10 @@ Indikas lokon: %1$s x %2$s"</string>
<string name="shared_string_language">Lingvo</string>
<string name="shared_string_all_languages">Ĉiuj lingvoj</string>
<string name="wiki_menu_download_descr">Kromaj mapoj estas necesaj por vidigi punktojn de Vikipedio sur la mapo.</string>
<string name="main_actions_descr">Ĉefaj agoj povas enhavi nur 4 butonojn.</string>
<string name="main_actions">Ĉefaj agoj</string>
<string name="additional_actions_descr">Vi povas aliri tiun ĉi agojn per la butono “agoj”.</string>
<string name="move_inside_category">Vi povas movi elementojn nur ene tiu ĉi kategorio.</string>
<string name="developer_plugin">Programista kromprogramo</string>
<string name="shared_string_items">Elementoj</string>
</resources>

View file

@ -171,14 +171,14 @@
<string name="poi_migration">Ufficio migrazione</string>
<string name="poi_tax_inspection">Guardia di finanza</string>
<string name="poi_office_administrative">Ufficio amministrativo</string>
<string name="poi_city">Città capoluogo di provincia</string>
<string name="poi_town">Città</string>
<string name="poi_city">Città</string>
<string name="poi_town">Cittadina</string>
<string name="poi_village">Paese</string>
<string name="poi_hamlet">Borgo-contrada</string>
<string name="poi_isolated_dwelling">Insediamento rurale isolato</string>
<string name="poi_hamlet">Piccolo borgo</string>
<string name="poi_isolated_dwelling">Abitazione isolata</string>
<string name="poi_suburb">Grande quartiere</string>
<string name="poi_neighbourhood">Quartiere</string>
<string name="poi_locality">Località</string>
<string name="poi_locality">Località non popolata</string>
<string name="poi_pharmacy">Farmacia</string>
<string name="poi_hospital">Ospedale</string>
<string name="poi_doctors">Medico</string>
@ -481,7 +481,7 @@
<string name="poi_islet">Isoletta</string>
<string name="poi_observatory">Osservatorio</string>
<string name="poi_astronomical_observatory">Osservatorio astronomico</string>
<string name="poi_place_farm">Fattoria</string>
<string name="poi_place_farm">Fattoria o cascina</string>
<string name="poi_occupational_therapist">Terapista occupazionale</string>
<string name="poi_office_telecommunication">Ufficio telecomunicazioni</string>
<string name="poi_american_football">Football americano</string>
@ -699,7 +699,7 @@
<string name="poi_club">Club</string>
<string name="poi_pasta">Pasta</string>
<string name="poi_fuel_type">Tipo di carburante</string>
<string name="poi_fuel_avia_type">Tipo di carburante (avia)</string>
<string name="poi_fuel_avia_type">Tipo di carburante (aeroplani)</string>
<string name="poi_payment_type">Tipo di pagamento</string>
<string name="poi_payment_fuel_type">Carte carburante</string>
<string name="poi_additional_type">Ulteriori</string>

View file

@ -58,9 +58,9 @@
<string name="pref_vector_map">Impostazioni della mappa vettoriale</string>
<string name="delete_confirmation_msg">Eliminare %1$s?</string>
<string name="city_type_suburb">Frazione</string>
<string name="city_type_hamlet">Borgata</string>
<string name="city_type_village">Villaggio</string>
<string name="city_type_town">Città</string>
<string name="city_type_hamlet">Piccolo borgo</string>
<string name="city_type_village">Paese</string>
<string name="city_type_town">Cittadina</string>
<string name="city_type_city">Città</string>
<string name="animate_route_off">Ferma animazione</string>
<string name="animate_route">Avvia animazione</string>
@ -3464,7 +3464,7 @@ Rappresenta l\'area: %1$s x %2$s</string>
<string name="select_map_icon_descr">Icona visualizzata da fermi.</string>
<string name="search_offline_geo_error">Impossibile analizzare il dato geo \'%s\'.</string>
<string name="monitoring_min_speed_descr">Questo è un filtro delle basse velocità per non registrare i punti inferiori a una data velocità. Questo può permettere di registrare tracce dall\'aspetto più pulito quando visualizzate sulla mappa.</string>
<string name="monitoring_min_speed_descr_side_effect">Effetto collaterale: alle tue tracce mancheranno tutte le sezioni in cui il criterio della velocità non sarà soddisfatto (es. quando spingi la tua bici in una elevata pendenza). Altrettanto non ci saranno informazioni nei periodi di riposo o ristoro. Questo ha effetto su tutte le analisi ed elaborazione dei dati, come quando si prova a determinare la lunghezza totale del tuo percorso, il tempo in movimento, o la velocità media.</string>
<string name="monitoring_min_speed_descr_side_effect">Effetto collaterale: alle tue tracce mancheranno tutte le sezioni in cui il criterio della velocità non sarà soddisfatto (es. quando spingi la tua bici in un\'elevata pendenza). Altrettanto non ci saranno informazioni nei periodi di riposo o ristoro. Questo ha effetto su tutte le analisi ed elaborazione dei dati, come quando si prova a determinare la lunghezza totale del tuo percorso, il tempo in movimento, o la velocità media.</string>
<string name="monitoring_min_speed_descr_recommendation">Raccomandazione: prova prima a utilizzare il sensore del movimento attraverso la registrazione del filtro del minimo dislocamento (B), potrebbe produrre migliori risultati, e perderai meno dati. Se le tue tracce continuano a essere sporche a basse velocità, prova con valori maggiori di zero. Si prega di notare che alcune misurazioni possono non riportare nessuna velocità (alcuni metodi basti sulle reti), in questi casi non registrerai alcun dato.</string>
<string name="monitoring_min_speed_descr_remark">Osservazione: controllo velocità &gt; 0 : molti chip GPS riportano un valore di velocità solo se l\'algoritmo determina che tu sei in movimento, e nessuno invece se non lo sei. Quindi utilizzando l\'impostazione &gt; 0 nel filtro, in un certo senso utilizza il sensore di movimento del chip GPS. Ma anche se non filtrati qui nel momento della registrazione, comunque utilizziamo questa caratteristica nell\'analisi dei nostri file GPX per determinare al distanza corretta, es. il valore visualizzato in questo campo è la distanza registrata finché si è in movimento.</string>
<string name="monitoring_min_accuracy_descr">Questo registrerà solo punti misurati con un\'accuratezza minima (in metri/piedi, come riportati da Android per il tuo chipset). L\'accuratezza si riferisce alla variabilità di misure ripetute, e non è direttamente correlato alla precisione, che definisce quanto la tua misurazione è vicina alla vera posizione.</string>
@ -3540,7 +3540,7 @@ Rappresenta l\'area: %1$s x %2$s</string>
<string name="shared_string_custom_rendering_style">Stile di rappresentazione personalizzato</string>
<string name="shared_string_include_data">Include dati addizionali</string>
<string name="import_profile_dialog_description">Il profilo importato contiene datti aggiuntivi. Clicca Importa per importare solo i dati del profilo o scegli i dati aggiuntivi da importare.</string>
<string name="export_profile_dialog_description">Puoi selezionare dati aggiuntivi da esportare unitamente al profilo.</string>
<string name="export_profile_dialog_description">Puoi selezionare dati aggiuntivi da esportare assieme al profilo.</string>
<string name="index_name_antarctica">Antartide</string>
<string name="navigation_notification_desc">Mostra le notifiche di sistema con le istruzioni di navigazione durante la navigazione.</string>
<string name="navigation_notification">Notifiche di navigazione</string>
@ -3618,9 +3618,9 @@ Rappresenta l\'area: %1$s x %2$s</string>
<string name="settings_item_read_error">Non posso leggere %1$s.</string>
<string name="settings_item_write_error">Non posso scrivere %1$s.</string>
<string name="settings_item_import_error">Non posso importare %1$s.</string>
<string name="wiki_menu_download_descr">Mappe aggiuntive sono necessarie per visualizzare i PDI Wikipedia sulla mappa.</string>
<string name="wiki_menu_download_descr">Sono necessarie mappe aggiuntive per visualizzare sulla mappa i PDI Wikipedia.</string>
<string name="select_track_file">Scegli il file della traccia</string>
<string name="shared_string_languages">Lingue</string>
<string name="shared_string_language">Lingua</string>
<string name="shared_string_all_languages">Tutti i linguaggi</string>
<string name="shared_string_all_languages">Tutte le lingue</string>
</resources>

View file

@ -449,7 +449,7 @@ POIの更新は利用できません</string>
\'\'{0}\'\' が追加されました。</string>
<string name="favourites_context_menu_edit">お気に入りを編集</string>
<string name="favourites_context_menu_delete">お気に入りを削除</string>
<string name="favourites_remove_dialog_msg">お気に入り地点を削除しますか? \'%s\'</string>
<string name="favourites_remove_dialog_msg">お気に入り地点\'%s\'を削除しますか?</string>
<string name="favourites_remove_dialog_success">お気に入り地点 {0}
は削除されました。</string>
<string name="osb_comment_dialog_message">メッセージ</string>
@ -1923,7 +1923,7 @@ POIの更新は利用できません</string>
<string name="last_update">最後の更新: %s</string>
<string name="update_time">更新時間</string>
<string name="updates_size">更新ファイルのサイズ</string>
<string name="last_map_change">後のマップ更新: %s</string>
<string name="last_map_change">マップ更新: %s</string>
<string name="hourly">毎時間</string>
<string name="daily">毎日</string>
<string name="weekly">毎週</string>
@ -2051,7 +2051,7 @@ POIの更新は利用できません</string>
<string name="get_it">入手する</string>
<string name="si_mi_meters">マイル/メートル</string>
<string name="skip_map_downloading">マップのダウンロードをスキップ</string>
<string name="skip_map_downloading_desc">オフライン用マップがインストールされていません。マップはこの画面にてリスト内から選択、あるいは後から\'メニューの%1$s\'にてダウンロードすることができます。</string>
<string name="skip_map_downloading_desc">オフライン用マップがインストールされていません。マップはこのリスト内から選択、あるいは後からでもメニューの\'%1$s\'からダウンロードすることができます。</string>
<string name="search_another_country">別の地域を選択</string>
<string name="search_map">マップを検索しています…</string>
<string name="no_inet_connection">インターネット接続なし</string>
@ -2573,7 +2573,7 @@ POIの更新は利用できません</string>
<string name="show_passed">通過済みも表示</string>
<string name="hide_passed">通過済みは非表示</string>
<string name="import_track_desc">ファイル %1$s は経由地点を含んでいません、それでも経路としてインポートしますか?</string>
<string name="marker_activated">マーカー[%s]がアクティブ化されました。</string>
<string name="marker_activated">マーカー%sがアクティブ化されました。</string>
<string name="one_tap_active_descr">コンテキストメニューを開かずにマップ上のマーカーをタップするだけで1番目のマーカーとしてアクティブ化させます。</string>
<string name="one_tap_active">ワンタップアクティブ</string>
<string name="empty_state_av_notes">場所に関するメモをつけよう!</string>
@ -2655,7 +2655,7 @@ POIの更新は利用できません</string>
<string name="read_wikipedia_offline">オフラインでWikipedia記事を読む</string>
<string name="maps_you_need_descr">ブックマークした記事より、次のマップをダウンロードすることをお勧めします:</string>
<string name="popular_destinations">人気の目的地</string>
<string name="travel_card_download_descr">Wikivoyageの旅行ガイドを事前にダウンロードすれば、インターネット接続なしで世界各地の観光場所を知ることができます。</string>
<string name="travel_card_download_descr">Wikivoyageの旅行ガイドをダウンロードしておけば、オフライン環境でも世界各地の観光名所を知ることができます。</string>
<string name="start_editing_card_image_text">誰でも自由に編集できる世界規模の旅行ガイドです。</string>
<string name="welcome_to_open_beta_description">『旅行ガイド』はWikivoyageをベースとした機能です。オープンβ時に限り無料で全ての機能を利用できます。旅行ガイドは将来的にOsmAndのサブスクリプション登録者や、OsmAnd+の利用者に提供される予定です。</string>
<string name="start_editing_card_description">あなたもWikivoyageの記事を編集できます。場所に関する知識、旅先での経験、魅力あるスポットはもちろん注意事項なども共有できます。</string>

View file

@ -3499,4 +3499,7 @@
<string name="settings_item_read_error">Kunne ikke lese %1$s.</string>
<string name="settings_item_import_error">Kunne ikke importere %1$s.</string>
<string name="settings_item_write_error">Kunne ikke skrive %1$s.</string>
<string name="shared_string_languages">Språk</string>
<string name="shared_string_language">Språk</string>
<string name="shared_string_all_languages">Alle språk</string>
</resources>

View file

@ -3612,4 +3612,23 @@
<string name="shared_string_language">Язык</string>
<string name="shared_string_all_languages">Все языки</string>
<string name="wiki_menu_download_descr">Для просмотра POI Википедии на карте необходимы дополнительные карты.</string>
<string name="ui_customization_description">Настройка количества элементов в разделах \"Панель\", \"Настройка карты\" и контекстном меню.
\n
\nМожно отключить неиспользуемые плагины, чтобы скрыть их элементы управления из приложения %1$s.</string>
<string name="ui_customization_short_descr">Элементы панели, контекстное меню</string>
<string name="shared_string_drawer">Панель</string>
<string name="divider_descr">Элементы ниже разделенные делителем.</string>
<string name="shared_string_items">Элементы</string>
<string name="ui_customization">Настройка интерфейса</string>
<string name="context_menu_actions">Действия контекстного меню</string>
<string name="reorder_or_hide_from">Изменить порядок или скрыть элементы из %1$s.</string>
<string name="shared_string_divider">Разделитель</string>
<string name="shared_string_hidden">Скрыто</string>
<string name="hidden_items_descr">Эти элементы скрыты из меню, но представляемые ими функции или плагины продолжают работать.</string>
<string name="reset_items_descr">Настройки будут сброшены в исходное состояние после скрытия.</string>
<string name="main_actions_descr">Основные действия содержат только 4 кнопки.</string>
<string name="main_actions">Основные действия</string>
<string name="additional_actions_descr">Доступ к этим действиям происходит нажатием кнопки \"Действия\".</string>
<string name="move_inside_category">Перемещать элементы можно только внутри данной категории.</string>
<string name="developer_plugin">Плагин для разработчиков</string>
</resources>

View file

@ -2898,7 +2898,7 @@
<string name="poi_animal_shelter_horse">Kone</string>
<string name="poi_animal_shelter_mammal">Cicavce</string>
<string name="poi_animal_shelter_fish">Ryby</string>
<string name="poi_information_route_marker">Značenie trasy</string>
<string name="poi_information_route_marker">Turistická/trasová značka</string>
<string name="poi_bridge_movable_swing">Typ pohyblivého mostu: otočný</string>
<string name="poi_bridge_movable_lift">Typ pohyblivého mostu: zdvíhací</string>
<string name="poi_bridge_movable_drawbridge">Typ pohyblivého mostu: padací</string>
@ -3273,7 +3273,7 @@
<string name="poi_denomination_maronite">Maronitský</string>
<string name="poi_denomination_mahayana">Mahájana</string>
<string name="poi_deadlock">Zamrznutí</string>
<string name="poi_information_trail_blaze">Turistická značka</string>
<string name="poi_information_trail_blaze">Turistická/trasová značka</string>
<string name="poi_memorial_koshinto"/>
<string name="poi_memorial_jizo"/>
<string name="poi_memorial_prasat"/>
@ -3552,4 +3552,6 @@
<string name="poi_bath_open_air_no">Nie</string>
<string name="poi_resort_hunting">Poľovnícka základňa</string>
<string name="poi_dive_centre">Potápačské centrum</string>
<string name="poi_video_telephone">Video</string>
<string name="poi_sms">SMS</string>
</resources>

View file

@ -3604,4 +3604,11 @@ Zodpovedá oblasti: %1$s x %2$s</string>
<string name="settings_item_read_error">Nepodarilo sa prečítať %1$s.</string>
<string name="settings_item_write_error">Nepodarilo sa zapísať %1$s.</string>
<string name="settings_item_import_error">Nepodarilo sa importovať %1$s.</string>
<string name="select_track_file">Zvoľte súbor stopy</string>
<string name="shared_string_languages">Jazyky</string>
<string name="shared_string_language">Jazyk</string>
<string name="shared_string_all_languages">Všetky jazyky</string>
<string name="wikipedia_poi_languages_promo">Niektoré články Wikipedia nemusia byť dostupné vo vašom jazyku. Zvoľte jazyky, v ktorých sa články Wikipedia budú zobrazovať na mape.
\nPri čítaní článku budete môcť prepínať medzi všetkými dostupnými jazykmi.</string>
<string name="wiki_menu_download_descr">Pre zobrazenie bodov Wikipedie na mape sú potrebné ďalšie mapy.</string>
</resources>

View file

@ -1108,8 +1108,8 @@
<string name="poi_socket_type3_output_filter">Tip 3 çıkış</string>
<string name="poi_socket_cee_blue_output_filter">CEE mavi çıkış</string>
<string name="poi_socket_schuko_output_filter">Schuko çıkışı</string>
<string name="poi_glacier_type">Buzul tipi</string>
<string name="poi_checkpoint_type">Kontrol noktası tipi</string>
<string name="poi_glacier_type">Buzul türü</string>
<string name="poi_checkpoint_type">Kontrol noktası türü</string>
<string name="poi_bulk_purchase">Toplu satın alma</string>
<string name="poi_landfill_waste_nuclear">Nükleer atık</string>
<string name="poi_brownfield">Terkedilmiş endüstriyel bölge</string>
@ -1480,10 +1480,10 @@
<string name="poi_piste_grooming_skating">Paten</string>
<string name="poi_piste_grooming_no">Hayır</string>
<string name="poi_piste_grooming_mogul">Tümsek</string>
<string name="poi_garden_type_residential">Bahçe tipi: konut</string>
<string name="poi_garden_type_community">Bahçe tipi: topluluk</string>
<string name="poi_garden_type_private">Bahçe tipi: özel</string>
<string name="poi_garden_type_botanical">Bahçe tipi: botanik</string>
<string name="poi_garden_type_residential">Bahçe türü: konut</string>
<string name="poi_garden_type_community">Bahçe türü: topluluk</string>
<string name="poi_garden_type_private">Bahçe türü: özel</string>
<string name="poi_garden_type_botanical">Bahçe türü: botanik</string>
<string name="poi_garden_style_kitchen">Bahçe tarzı: mutfak</string>
<string name="poi_garden_style_rosarium">Bahçe tarzı: gül bahçesi</string>
<string name="poi_garden_style_french">Bahçe tarzı: Fransız</string>
@ -1904,8 +1904,8 @@
<string name="poi_internet_access_type_wlan">Wi-Fi</string>
<string name="poi_internet_access_type_terminal">Terminal</string>
<string name="poi_internet_access_type_wired">Kablolu</string>
<string name="poi_internet_access_type_public">İnternet erişim tipi: genel</string>
<string name="poi_internet_access_type_service">İnternet erişim tipi: servis</string>
<string name="poi_internet_access_type_public">İnternet erişim türü: genel</string>
<string name="poi_internet_access_type_service">İnternet erişim türü: servis</string>
<string name="poi_internet_access_type_no">İnternet erişimi yok</string>
<string name="poi_maxwidth">Maksimum genişlik</string>
<string name="poi_iata">IATA kodu</string>
@ -1990,14 +1990,14 @@
<string name="poi_bridge_structure_viaduct">Köprü yapısı: viyadük</string>
<string name="poi_bridge_structure_aqueduct">Köprü yapısı: su kemeri</string>
<string name="poi_bridge_structure_log">Köprü yapısı: kütük</string>
<string name="poi_bridge_type_movable">Köprü tipi: hareketli</string>
<string name="poi_bridge_movable_bascule">Hareketli köprü tipi: baskül</string>
<string name="poi_bridge_movable_swing">Hareketli köprü tipi: döner</string>
<string name="poi_bridge_movable_lift">Hareketli köprü tipi: asansör</string>
<string name="poi_bridge_movable_drawbridge">Hareketli köprü tipi: açılır asma</string>
<string name="poi_bridge_movable_submersible">Hareketli köprü tipi: suya batırılabilir</string>
<string name="poi_bridge_movable_transporter">Hareketli köprü tipi: taşıyıcı</string>
<string name="poi_bridge_movable_retractable">Hareketli köprü tipi: geri çekilebilir</string>
<string name="poi_bridge_type_movable">Köprü türü: hareketli</string>
<string name="poi_bridge_movable_bascule">Hareketli köprü türü: baskül</string>
<string name="poi_bridge_movable_swing">Hareketli köprü türü: döner</string>
<string name="poi_bridge_movable_lift">Hareketli köprü türü: asansör</string>
<string name="poi_bridge_movable_drawbridge">Hareketli köprü türü: açılır asma</string>
<string name="poi_bridge_movable_submersible">Hareketli köprü türü: suya batırılabilir</string>
<string name="poi_bridge_movable_transporter">Hareketli köprü türü: taşıyıcı</string>
<string name="poi_bridge_movable_retractable">Hareketli köprü türü: geri çekilebilir</string>
<string name="poi_lit_yes">Aydınlatma: evet</string>
<string name="poi_lit_no">Aydınlatma: hayır</string>
<string name="poi_surface_unpaved">Yüzey: kaplamasız</string>
@ -2164,14 +2164,14 @@
<string name="poi_shoes_men">Erkek</string>
<string name="poi_shoes_orthopedic">Ortopedik</string>
<string name="poi_historic_manor">Tarihi malikane</string>
<string name="poi_castle_type_stately">Kale tipi: malikane</string>
<string name="poi_castle_type_defensive">Kale tipi: savunma</string>
<string name="poi_castle_type_fortress">Kale tipi: hisar</string>
<string name="poi_castle_type_palace">Kale tipi: saray</string>
<string name="poi_castle_type_kremlin">Kale tipi: kremlin</string>
<string name="poi_castle_type_defensive_stately">Kale tipi: savunma, malikane</string>
<string name="poi_castle_type_castrum">Kale tipi: castrum</string>
<string name="poi_castle_type_shiro">Kale tipi: shiro</string>
<string name="poi_castle_type_stately">Kale türü: malikane</string>
<string name="poi_castle_type_defensive">Kale türü: savunma</string>
<string name="poi_castle_type_fortress">Kale türü: hisar</string>
<string name="poi_castle_type_palace">Kale türü: saray</string>
<string name="poi_castle_type_kremlin">Kale türü: kremlin</string>
<string name="poi_castle_type_defensive_stately">Kale türü: savunma, malikane</string>
<string name="poi_castle_type_castrum">Kale türü: castrum</string>
<string name="poi_castle_type_shiro">Kale türü: shiro</string>
<string name="poi_massage_thai">Tay</string>
<string name="poi_massage_sexual">Cinsel</string>
<string name="poi_massage_chinese">Çin</string>

View file

@ -41,7 +41,7 @@
<string name="show_warnings_title">Uyarıları göster…</string>
<string name="use_compass_navigation">Pusulayı kullan</string>
<string name="avoid_motorway">Otoyol yok</string>
<string name="auto_zoom_map_descr">Hızınıza göre zoom seviyesi (harita mevcut konumla senkronize edilirken).</string>
<string name="auto_zoom_map_descr">Hızınıza göre yakınlaştırma seviyesi (geçerli konum ile harita eşzamanlandığında).</string>
<string name="auto_zoom_map">Haritayı kendiliğinden yakınlaştır</string>
<string name="filterpoi_activity">POI filtresi yarat</string>
<string name="recalculate_route_to_your_location">Ulaşım modu:</string>
@ -88,7 +88,7 @@
<string name="recording_photo_description">Fotoğraf %1$s %2$s</string>
<string name="av_def_action_picture">Fotoğraf çek</string>
<string name="recording_context_menu_precord">Fotoğraf çek</string>
<string name="dropbox_plugin_description">İzlenen yolları ve ses/video notlarını Dropbox hesabınızla senkronize edin.</string>
<string name="dropbox_plugin_description">İzlenen yolları ve ses/video notlarını Dropbox hesabınızla eşzamanlayın.</string>
<string name="dropbox_plugin_name">Dropbox eklentisi</string>
<string name="intermediate_points_change_order">Sıralamayı değiştir</string>
<string name="srtm_paid_version_msg">Lütfen geliştirilmesinin devamını desteklemek için \'Eş yükselti eğrileri\' eklentisini satın almayı göz önünde bulundurun.</string>
@ -97,8 +97,8 @@
<string name="av_def_action_audio">Ses kaydet</string>
<string name="av_widget_action_descr">Öntanımlı widget eylemi:</string>
<string name="av_widget_action">Öntanımlı widget eylemi</string>
<string name="av_video_format_descr">Video çıkış formatı:</string>
<string name="av_video_format">Video formatı</string>
<string name="av_video_format_descr">Video çıkış biçimi:</string>
<string name="av_video_format">Video çıkış biçimi</string>
<string name="av_use_external_recorder_descr">Video için sistem kayıt cihazını kullanın.</string>
<string name="av_use_external_recorder">Dahili kaydediciyi kullan</string>
<string name="av_settings_descr">Ses ve video ayarlarını ayarlayın.</string>
@ -184,7 +184,7 @@
\n
\n OsmAnd+, çok geniş ölçekte global OpenStreetMap (OSM) verilerine erişim sağlayan açık kaynaklı bir yazılımsal navigasyon uygulamasıdır. Tüm harita verileri (vektör veya tile haritaları) çevrim dışı kullanım için telefonun hafıza kartında saklanabilir. Adım adım sesli rehberlik de dahil olmak üzere çevrim dışı ve çevrim içi yönlendirme işlevi de sunulmaktadır.
\n
\n OsmAnd+, uygulamanın ücretli versiyonudur, onu satın alarak projeyi desteklemekte, yeni özelliklerin gelişimini finanse etmekte ve en son güncellemeleri almaktasınız
\n OsmAnd+, uygulamanın ücretli sürümüdür, onu satın alarak projeyi desteklemekte, yeni özelliklerin gelişimini finanse etmekte ve en son güncellemeleri almaktasınız
\n.
\n Temel özelliklerden bazıları:
\n - Eksiksiz çevrim dışı işlevsellik (indirilen vektör veya tile haritalarını cihazda saklayın)
@ -543,7 +543,7 @@
<string name="local_openstreetmap_uploadall">tümünü yükle</string>
<string name="local_openstreetmap_upload">Düzenlemeyi OSM\'ye yükle</string>
<string name="local_openstreetmap_delete">Düzenlemeyi sil</string>
<string name="local_openstreetmap_descr_title">Asenkron OSM düzenleme:</string>
<string name="local_openstreetmap_descr_title">Eşzamansız OSM düzenleme:</string>
<string name="local_openstreetmap_settings">Cihazda kayıtlı OSM POI\'leri/notları</string>
<string name="local_openstreetmap_settings_descr">Cihaz veri tabanınızdaki OSM-POI\'lerini/notlarını görüntüleyin ve yönetin.</string>
<string name="live_monitoring_interval_descr">Çevrim içi izleme aralığını belirtin.</string>
@ -582,7 +582,7 @@
<string name="native_library_not_supported">Yerel kütüphane bu aygıtta desteklenmiyor.</string>
<string name="init_native_library">Yerel kütüphane başlatılıyor…</string>
<string name="choose_auto_follow_route">Harita görünümünü otomatik olarak ortala</string>
<string name="choose_auto_follow_route_descr">Harita görünümünün geçerli konumla senkronize edilmesine kadar geçen süre.</string>
<string name="choose_auto_follow_route_descr">Geçerli konum ile harita görünümünü eşzamanlamaya kadar geçecek süre.</string>
<string name="auto_follow_route_navigation">Otomatik-sadece merkezi nav</string>
<string name="auto_follow_route_navigation_descr">Otomatik-navigasyon yaparken sadece merkezi harita görünümü.</string>
<string name="auto_follow_location_enabled">Haritayı kullanırken görünümü otomatik olarak ortala.</string>
@ -633,7 +633,7 @@
<string name="local_index_gpx_info_show">"
\n
\nSeçenekler için uzun bas"</string>
<string name="local_index_installed">Yerel Versiyon</string>
<string name="local_index_installed">Yerel sürüm</string>
<string name="local_index_items_backuped">%1$d/%2$d öge devre dışı bırakıldı.</string>
<string name="local_index_items_deleted">%1$d/%2$d öge silindi.</string>
<string name="local_index_items_restored">%1$d/%2$d öge aktifleştirildi.</string>
@ -712,7 +712,7 @@
<string name="website">Web sitesi</string>
<string name="monitoring_settings">Seyahat kaydetme</string>
<string name="monitoring_settings_descr">Seyahatlerinizi nasıl kaydedeceğinizi ayarlayın.</string>
<string name="contribution_activity">Yükleme versiyonu</string>
<string name="contribution_activity">Yükleme sürümü</string>
<string name="choose_osmand_theme_descr">Uygulama görünümünü özelleştirin.</string>
<string name="choose_osmand_theme">Uygulama gövdesi</string>
<string name="accessibility_options">Erişilebilirlik ayarları</string>
@ -721,7 +721,7 @@
<string name="local_openstreetmap_act_title">OSM değişiklikleri</string>
<string name="shared_string_more_actions">Diğer komutlar</string>
<string name="local_indexes_cat_srtm">Eş yükselti eğrileri</string>
<string name="about_version">Versiyon:</string>
<string name="about_version">Sürüm :</string>
<string name="shared_string_about">Hakkında</string>
<string name="about_settings_descr">Sürüm bilgisi, lisanslar, proje üyeleri</string>
<string name="local_index_tile_data_expire">Sona erecek (dakika): %1$s</string>
@ -766,7 +766,7 @@
<string name="search_address_building">Bina</string>
<string name="search_address_building_option">Bina</string>
<string name="search_address_street_option">Kesişen sokak</string>
<string name="navigate_point_top_text">Seçilen formatta enlem ve boylam girin (D - derece, M - dakika, S - saniye)</string>
<string name="navigate_point_top_text">Seçilen biçimde enlem ve boylam girin (D - derece, M - dakika, S - saniye)</string>
<string name="navigate_point_latitude">Enlem</string>
<string name="navigate_point_longitude">Boylam</string>
<string name="search_near_map">Mevcut harita konumu yakınlarında ara</string>
@ -928,7 +928,7 @@
<string name="edit_filter_delete_dialog_title">Bu filtreyi sil\?</string>
<string name="edit_filter_delete_message">\'%1$s\' filtresi silindi</string>
<string name="edit_filter_create_message">\'%1$s\' filtresi oluşturuldu</string>
<string name="av_camera_focus">Kamera odaklama tipi</string>
<string name="av_camera_focus">Kamera odaklama türü</string>
<string name="av_camera_focus_descr">Kamera odak modu:</string>
<string name="av_camera_focus_auto">Otomatik odaklama</string>
<string name="av_camera_focus_edof">Genişletilmiş alan derinliği (EDOF)</string>
@ -1381,7 +1381,7 @@
<string name="closing_at">Kapanış</string>
<string name="contact_info">İletişim Bilgileri</string>
<string name="add_opening_hours">ılış saatleri ekle</string>
<string name="poi_dialog_poi_type">POI Tipi</string>
<string name="poi_dialog_poi_type">POI Türü</string>
<string name="number_of_rows_in_dash">Dash %1$s satır sayısı</string>
<string name="please_specify_poi_type">POI türü belirtiniz.</string>
<string name="working_days">İş Günleri</string>
@ -1395,7 +1395,7 @@
<string name="av_camera_focus_hiperfocal">Hiperodak odak</string>
<string name="av_camera_pic_size">Kamera resim boyutu</string>
<string name="av_camera_pic_size_descr">Kamera resim boyutunu ayarlayın</string>
<string name="navigation_intent_invalid">Geçersiz format:%s</string>
<string name="navigation_intent_invalid">Geçersiz biçim:%s</string>
<string name="plugin_install_needs_network">Bu eklentiyi yüklemek için çevrim içi olmanız gerekmektedir.</string>
<string name="get_plugin">Al</string>
<string name="use_fast_recalculation">Akıllı rota yeniden hesaplama</string>
@ -1449,7 +1449,7 @@
<string name="previous_run_crashed">Son Osmand çalıştırmak çöktü. Log dosya {0} olduğunu. Sorunu bildirmek ve günlük dosyasını ekleyiniz.</string>
<string name="osm_settings_descr">OSM gönderimleri için gereken OpenStreetMap.org (OSM) ayarlarını belirtin.</string>
<string name="reload_tile">Sayfaya kiremit</string>
<string name="opening_hours_not_supported">Çalışma saatleri formatı değiştirilemez.</string>
<string name="opening_hours_not_supported">Çalışma saatleri biçimi değiştirilemez.</string>
<string name="transport_stop_to_go_out">Kurtulmak için durdurmak seçin</string>
<string name="transport_to_go_after">Önceki mesafe</string>
<string name="transport_to_go_before">Sonraki mesafe</string>
@ -1472,7 +1472,7 @@
<string name="layer_gpx_layer">GPX dosyaları</string>
<string name="transport_context_menu">Durakta ulaşım aracı ara</string>
<string name="rotate_map_to_bearing">Harita yönlendirme</string>
<string name="version_index_is_not_supported">Endeksin versiyonu \'\' {0} \'desteklenmiyor</string>
<string name="version_index_is_not_supported">\'\'{0}\'\' indeks sürümü desteklenmemektedir</string>
<string name="osmand_routing_experimental">OsmAnd çevrim dışı navigasyon deneysel bir özelliktir ve yaklaşık 20 km\'den daha uzun mesafelerde çalışmaz.
\n
\nNavigasyon geçici olarak çevrim içi CloudMade servisine geçti.</string>
@ -1487,7 +1487,7 @@
<string name="indexing_map">Dizin Oluşturma haritası</string>
<string name="indexing_poi">Dizin Oluşturma POI …</string>
<string name="indexing_transport">Dizin Oluşturma taşımacılığı</string>
<string name="old_map_index_is_not_supported">Artık kullanılmayan harita veri formatı \'\'{0}\'\', desteklenmiyor</string>
<string name="old_map_index_is_not_supported">Artık kullanılmayan harita veri biçimi \'\'{0}\'\', desteklenmiyor</string>
<string name="poi_filter_namefinder">Çevrim içi NameFinder</string>
<string name="reading_cached_tiles">Önbelleğe fayans okunuyor …</string>
<string name="version_index_is_big_for_memory">Index \'\' {0} \'belleğe sığmadı</string>
@ -1751,7 +1751,7 @@
<string name="search_radius_proximity">İçinde</string>
<string name="anonymous_user_hint">Anonim kullanıcılar şunları yapamaz:
\n- Grup oluşturmak;
\n- Grupları ve aygıtları sunucu ile senkronize etmek;
\n- Grupları ve aygıtları sunucu ile eşzamanlamak;
\n- Web sitesindeki kişisel kontrol panelinde grupları ve aygıtları yönetmek.</string>
<string name="anonymous_user">Anonim Kullanıcı</string>
<string name="logged_as">%1$s olarak giriş</string>
@ -1889,7 +1889,7 @@
<string name="donations">Bağışlar</string>
<string name="number_of_recipients">Alıcıların sayısı</string>
<string name="osm_user_stat">%1$s , rütbe %2$s , toplam düzenlemeleri %3$s düzenler</string>
<string name="osm_editors_ranking">OSM Editör sıralaması</string>
<string name="osm_editors_ranking">OSM Düzenleyici sıralaması</string>
<string name="osm_live_subscription">OsmAnd Live aboneliği</string>
<string name="osm_live_subscribe_btn">Abone ol</string>
<string name="osm_live_email_desc">Yaptığınız katkılar hakkında size bilgi vermek için gerekli.</string>
@ -1935,7 +1935,7 @@
<string name="access_disable_offroute_recalc_descr">Rotadan çıkıldıktan sonra rota yeniden hesaplanmaz.</string>
<string name="access_disable_wrong_direction_recalc">Aksi yönde iken rota yeniden-hesaplanmasın</string>
<string name="access_disable_wrong_direction_recalc_descr">Sadece ters yönde hareket ederken rota yeniden hesaplanmaz.</string>
<string name="access_default_color">Ön tanımlı renk</string>
<string name="access_default_color">Öntanımlı renk</string>
<string name="access_category_choice">Kategori seç</string>
<string name="access_hint_enter_name">Ad gir</string>
<string name="access_hint_enter_category">Kategori gir</string>
@ -2090,9 +2090,9 @@
<string name="context_menu_item_modify_note">OSM notunu değiştir</string>
<string name="make_round_trip_descr">Kalkış noktasının bir kopyasını hedef olarak ekleyin.</string>
<string name="make_round_trip">Gidiş-dönüş seyahat yap</string>
<string name="coordinates_format">Koordinat formatı</string>
<string name="coordinates_format">Koordinat biçimi</string>
<string name="use_system_keyboard">Sistemde tanımlı klavyeyi kullan</string>
<string name="fast_coordinates_input_descr">Koordinat giriş formatını seçin. Bunu her zaman \'Seçenekler\'den değiştirebilirsiniz.</string>
<string name="fast_coordinates_input_descr">Koordinat giriş biçimini seçin. Bunu her zaman \'Seçenekler\'den değiştirebilirsiniz.</string>
<string name="fast_coordinates_input">Hızlı koordinat girişi</string>
<string name="routing_attr_avoid_ice_roads_fords_name">Buzlu yol veya nehir geçişleri yok</string>
<string name="routing_attr_avoid_ice_roads_fords_description">Buzlu yollardan ve nehir geçişlerinden kaçınır.</string>
@ -2112,7 +2112,7 @@
<string name="empty_state_av_notes_desc">Widget veya içerik menüsünü kullanarak, harita üzerinde her nokta için ses, video veya fotoğraf notları al.</string>
<string name="notes_by_date">Tarihe göre OSM notları</string>
<string name="by_date">Tarihe göre</string>
<string name="by_type">Tipe göre</string>
<string name="by_type">Türe göre</string>
<string name="shared_string_more_without_dots">Daha fazla</string>
<string name="appearance_on_the_map">Harita üzerinde görünüş</string>
<string name="favourites_group">Favoriler kategorisi</string>
@ -2137,7 +2137,7 @@
<string name="enter_new_name">Yeni isim gir</string>
<string name="shared_string_back">Geri</string>
<string name="shared_string_view">Görünüm</string>
<string name="wrong_format">Yanlış format</string>
<string name="wrong_format">Yanlış biçim</string>
<string name="shared_string_markers">İşaretçiler</string>
<string name="my_location">Konumum</string>
<string name="shared_string_finish">Bitir</string>
@ -2401,7 +2401,7 @@
<string name="files_failed">%1$d dosya kopyalanamadı (%2$s).</string>
<string name="dont_move_maps">Taşıma</string>
<string name="public_transport_calc_pedestrian">Yürüme rotasını hesapla</string>
<string name="public_transport_type">Transfer tipi</string>
<string name="public_transport_type">Tıma türü</string>
<string name="send_log">Rapor gönder</string>
<string name="routing_attr_avoid_tram_name">Tramvay yok</string>
<string name="routing_attr_avoid_tram_description">Tramvaylardan kaçınır</string>
@ -2418,7 +2418,7 @@
<string name="shared_string_degrees">Dereceler</string>
<string name="avoid_pt_types_descr">Kaçınılacak toplu taşıma türlerini seçin:</string>
<string name="quick_action_day_night_mode">%s modu</string>
<string name="avoid_pt_types">Geçersiz taşıma tipleri…</string>
<string name="avoid_pt_types">Kaçınılacak taşıma türleri…</string>
<string name="shared_string_walk">Yürü</string>
<string name="public_transport_warning_title">Toplu taşıma rotaları beta aşamasındadır.</string>
<string name="add_intermediate">Ara nokta ekle</string>
@ -2577,8 +2577,8 @@
<string name="press_again_to_change_the_map_orientation">Harita yönünü değiştirmek için tekrar dokunun</string>
<string name="shared_string_min_speed">En düşük hız</string>
<string name="shared_string_max_speed">En yüksek hız</string>
<string name="default_speed_setting_title">Ön tanımlı hız</string>
<string name="default_speed_setting_descr">Ön tanımlı hız ayarlarını değiştir</string>
<string name="default_speed_setting_title">Öntanımlı hız</string>
<string name="default_speed_setting_descr">Öntanımlı hız ayarlarını değiştir</string>
<string name="minmax_speed_dialog_title">En düşük/en yüksek hız ayarı</string>
<string name="new_profile">Yeni profil</string>
<string name="shared_string_crash">Çökme</string>
@ -2590,12 +2590,12 @@
<string name="week">Hafta</string>
<string name="weeks_2_4">Haftalar</string>
<string name="configure_profile_info">Profil için ayarlar:</string>
<string name="utm_format_descr">OsmAnd, UTM NATO formatına benzer ancak aynı olmayan UTM Standard kullanmaktadır.</string>
<string name="utm_format_descr">OsmAnd, UTM NATO biçimine benzer ancak aynı olmayan UTM Standard biçimini kullanmaktadır.</string>
<string name="shared_string_example">Örnek</string>
<string name="navigate_point_format_utm">UTM Standart</string>
<string name="navigate_point_format_olc">Konum Kodunu Aç</string>
<string name="coordinates_format_info">Seçilen format uygulama boyunca uygulanacaktır.</string>
<string name="pref_selected_by_default_for_profiles">Bu ayar profiller için ön tanımlı olarak seçilidir: %s</string>
<string name="coordinates_format_info">Seçilen biçim uygulama boyunca uygulanacaktır.</string>
<string name="pref_selected_by_default_for_profiles">Bu ayar profiller için öntanımlı olarak seçilidir: %s</string>
<string name="change_default_settings">Ayarı değiştir</string>
<string name="discard_changes">Değişikliği iptal et</string>
<string name="apply_to_current_profile">Sadece \"%1$s\"e uygula</string>
@ -2605,7 +2605,7 @@
<string name="turn_screen_on_info">Navigasyon sırasında haritayı kilit ekranında göster.</string>
<string name="route_parameters_info">Seçili profildeki yönlendirme ayarları \"%1$s\".</string>
<string name="wake_time">Uyanma zamanı</string>
<string name="units_and_formats">Birimler ve formatlar</string>
<string name="units_and_formats">Birimler ve biçimler</string>
<string name="appearance">Görünüm</string>
<string name="map_look_descr">Harita görünümü</string>
<string name="map_look">Harita görünümü</string>
@ -2616,7 +2616,7 @@
<string name="screen_alerts_descr">Navigasyon sırasında sol altta gösterilen uyarılar.</string>
<string name="switch_profile">Profil değiştir</string>
<string name="language_and_output">Dil ve çıkış</string>
<string name="reset_to_default">Ön tanımlılara sıfırla</string>
<string name="reset_to_default">Öntanımlılara sıfırla</string>
<string name="manage_profiles_descr">Profil oluşturma, içe aktarma, düzenleme</string>
<string name="manage_profiles">Uygulama profillerini yönet…</string>
<string name="application_profile_changed">Uygulama profili \"%s\" olarak değiştirildi</string>
@ -2625,7 +2625,7 @@
<string name="osmand_plus_extended_description_part1">OsmAnd+ (OSM Automated Navigation Directions), özgür, dünya çapında ve yüksek kaliteli OSM verilerine erişim sağlayan bir harita ve navigasyon uygulamasıdır.
\n Sesli ve görüntülü navigasyonun, POI\'leri (points of interest) görüntülemenin, GPX yolları oluşturma ve yönetmenin, eş yükselti eğrileri görselleştirmenin ve irtifa bilgilerini kullanmanın, araç, bisiklet, yaya modları arasında tercih yapmanın, OSM düzenleme ve daha fazlasının keyfini çıkarın.
\n
\n OsmAnd+ uygulamanın ücretli versiyonudur. Satın alarak, projeyi desteklemekte, yeni özelliklerin geliştirilmesini finanse etmekte ve en son güncellemeleri almaktasınız.
\n OsmAnd+ uygulamanın ücretli sürümüdür. Satın alarak, projeyi desteklemekte, yeni özelliklerin geliştirilmesini finanse etmekte ve en son güncellemeleri almaktasınız.
\n
\n Ana özelliklerden bazıları:</string>
<string name="make_osmand_better_descr">OsmAnd\'ın anonim uygulama kullanım verilerini toplamasına ve işlemesine izin ver. Konumunuz veya haritada görüntülediğiniz yerler hakkında veri toplanmaz.
@ -2643,7 +2643,7 @@
<string name="app_mode_ufo">UFO</string>
<string name="release_3_4">• Uygulama profilleri: Özel bir simge ve renk ile kendi ihtiyaçlarınız için özel bir profil oluşturun
\n
\n • Şimdi herhangi bir profilin ön tanımlı ve minimum/maksimum hızlarını özelleştirin
\n • Şimdi herhangi bir profilin öntanımlı ve minimum/maksimum hızlarını özelleştirin
\n
\n • Mevcut koordinatlar için bir widget eklendi
\n
@ -2696,7 +2696,7 @@
<string name="rendering_attr_showLez_description">Haritada Düşük Emisyon Bölgelerini göster. Yönlendirmeyi etkilemez.</string>
<string name="rendering_attr_showLez_name">Düşük Emisyon Bölgelerini göster</string>
<string name="temporary_conditional_routing">Geçici sınırlamaları göz önünde bulundurun</string>
<string name="shared_string_default">Ön tanımlı</string>
<string name="shared_string_default">Öntanımlı</string>
<string name="app_mode_wagon">Vagon</string>
<string name="app_mode_pickup_truck">Kamyonet</string>
<string name="weeks_5">Hafta</string>
@ -2729,7 +2729,7 @@
<string name="screen_alerts">Ekran uyarıları</string>
<string name="route_parameters_descr">Rota parametrelerini yapılandır</string>
<string name="route_parameters">Rota parametreleri</string>
<string name="shared_string_by_default">Ön tanımlı olarak</string>
<string name="shared_string_by_default">Öntanımlı olarak</string>
<string name="download_detailed_map">Bu alanı görüntülemek için detaylı %s haritasını indirin.</string>
<string name="access_shared_string_navigate_up">Yukarı git</string>
<string name="access_smart_autoannounce">Akıllı otomatik duyuru</string>
@ -2820,7 +2820,7 @@
<string name="will_open_tomorrow_at">Yarın şu saatte açılıyor</string>
<string name="show_closed_notes">Kapalı notları göster</string>
<string name="switch_osm_notes_visibility_desc">Haritada OSM notlarını göster/gizle.</string>
<string name="gpx_file_desc">GPX - JOSM veya diğer OSM editörlerine aktarmak için uygundur.</string>
<string name="gpx_file_desc">GPX - JOSM veya diğer OSM düzenleyicilerine aktarmak için uygundur.</string>
<string name="osc_file_desc">OSC - OSM\'ye aktarmak için uygundur.</string>
<string name="osc_file">OSC dosyası</string>
<string name="choose_file_type">Dosya türünü seçin</string>
@ -2883,10 +2883,10 @@
<string name="nautical_render_descr">Deniz navigasyonu için. Şamandıralar, deniz fenerleri, nehir yolları, deniz şeritleri ve işaretleri, limanlar, deniz kenarı hizmetleri ve eş derinlik eğrilerini içermektedir.</string>
<string name="ski_map_render_descr">Kayak yapmak için. Pistler, telesiyejler, kros kayak yolları vb. içermektedir. İkincil harita nesnelerini karartır.</string>
<string name="light_rs_render_descr">Basit sürüş tarzı. Yumuşak gece modu, eş yükselti eğrileri, turuncu tarzdaki zıtlaştırılmış yollar, ikincil harita nesnelerini karartma.</string>
<string name="topo_render_descr">Yürüyüş, doğa yürüyüşü ve doğa bisikleti için. Dış mekanda okunabilir. Zıtlaştırılmış yollar ve doğal nesneler, farklı rota tipleri, gelişmiş eş yükselti eğrisi seçenekleri, ekstra detaylar. Yüzey bütünlüğünün ayarlanması yol kalitesini ayırt eder. Gece modu yok.</string>
<string name="topo_render_descr">Yürüyüş, doğa yürüyüşü ve doğa bisikleti için. Dış mekanda okunabilir. Zıtlaştırılmış yollar ve doğal nesneler, farklı rota türleri, gelişmiş eş yükselti eğrisi seçenekleri, ekstra detaylar. Yüzey bütünlüğünün ayarlanması yol kalitesini ayırt eder. Gece modu yok.</string>
<string name="mapnik_render_descr">Eski öntanımlı \'Mapnik\' tarzı. \'Mapnik\' ile benzer renkler.</string>
<string name="default_render_descr">Genel amaçlı stil. Yoğun şehirler temiz bir şekilde gösterilmiştir. Eş yükselti eğrileri, rotalar, yüzey kalitesi, erişim kısıtlamaları, yol kalkanları, SAC ölçeğine göre yol görselleştirme, akarsu sporları öğeleri içermektedir.</string>
<string name="touring_view_render_descr">Yüksek zıtlık ve maksimum ayrıntı ile gezi tarzı. OsmAnd öntanımlı stilinin tüm seçenekleri ile birlikte, mümkün olduğu kadar çok ayrıntıyı, özellikle de yolları, patikaları ve seyahat etmenin diğer yollarını gösterir. Yol tipleri arasındaki \"touring atlas\" ayrımını kaldırın. Gündüz, gece ve dış mekan kullanımı için uygundur.</string>
<string name="touring_view_render_descr">Yüksek zıtlık ve maksimum ayrıntı ile gezi tarzı. OsmAnd öntanımlı stilinin tüm seçenekleri ile birlikte, mümkün olduğu kadar çok ayrıntıyı, özellikle de yolları, patikaları ve seyahat etmenin diğer yollarını gösterir. Yol türleri arasındaki \"touring atlas\" ayrımını kaldırın. Gündüz, gece ve dış mekan kullanımı için uygundur.</string>
<string name="off_road_render_descr">\'Topo\' stiline dayalı arazi sürüşleri ve yeşil uydu görüntüleriyle alt tabaka olarak kullanım için. Ana yol kalınlığı azaltılmış, izlenen yollar, patikalar, bisiklet ve diğer rotaların kalınlığı arttırılmıştır.</string>
<string name="unirs_render_descr">Yaya ve bisiklet yollarının kontrastını artırmak için öntanımlı stilin değiştirilmesi. Eski Mapnik renklerini kullanır.</string>
<string name="shared_string_gpx_file">GPX dosyası</string>
@ -3370,7 +3370,7 @@
<string name="delete_profiles_descr">\'Uygula\'ya dokunmak, kaldırılan profilleri kalıcı olarak siler.</string>
<string name="master_profile">Ana profil</string>
<string name="select_color">Renk seç</string>
<string name="edit_profiles_descr">OsmAnd ön tanımlı profilleri silinemez, ancak (önceki ekranda) devre dışı bırakılabilir veya en altta sıralanabilir.</string>
<string name="edit_profiles_descr">OsmAnd öntanımlı profilleri silinemez, ancak (önceki ekranda) devre dışı bırakılabilir veya en altta sıralanabilir.</string>
<string name="edit_profiles">Profilleri düzenle</string>
<string name="select_nav_profile_dialog_message">\'Navigasyon türü\' rotaların nasıl hesaplandığını yönetir.</string>
<string name="profile_appearance">Profil görünümü</string>
@ -3378,7 +3378,7 @@
<string name="reorder_profiles">Profil listesini düzenle</string>
<string name="selected_profile">Seçilen profil</string>
<string name="reset_confirmation_descr">%1$s\'e dokunmak tüm değişikliklerinizi atacaktır.</string>
<string name="reset_all_profile_settings_descr">Tüm profil ayarlarını kurulum anındaki ön tanımlılarına sıfırlayın.</string>
<string name="reset_all_profile_settings_descr">Tüm profil ayarlarını kurulum anındaki öntanımlılarına sıfırlayın.</string>
<string name="reset_all_profile_settings">Tüm profil ayarları sıfırlansın mı\?</string>
<string name="ltr_or_rtl_combine_via_colon">%1$s: %2$s</string>
<string name="ltr_or_rtl_combine_via_space">%1$s %2$s</string>
@ -3430,7 +3430,7 @@
<string name="monitoring_min_speed">Minimum hız</string>
<string name="monitoring_min_accuracy">Minimum doğruluk</string>
<string name="monitoring_min_distance">Minimum yer değiştirme</string>
<string name="reset_plugin_to_default">Eklenti ayarlarını ön tanımlılara sıfırla</string>
<string name="reset_plugin_to_default">Eklenti ayarlarını öntanımlılara sıfırla</string>
<string name="multimedia_rec_split_title">Kaydedici bölmesi</string>
<string name="multimedia_use_system_camera">Sistem uygulamasını kullan</string>
<string name="multimedia_photo_play_sound">Kamera deklanşör sesi</string>
@ -3441,19 +3441,19 @@
<string name="shared_string_available">Mevcut</string>
<string name="add_custom_category">Özel kategori ekle</string>
<string name="rendering_attr_streetLightingNight_name">Sadece geceleri göster</string>
<string name="plugin_prefs_reset_successful">Tüm eklenti ayarları ön tanımlı durumuna geri yüklendi.</string>
<string name="profile_prefs_reset_successful">Tüm profil ayarları ön tanımlı durumuna geri yüklendi.</string>
<string name="plugin_prefs_reset_successful">Tüm eklenti ayarları öntanımlı durumuna geri yüklendi.</string>
<string name="profile_prefs_reset_successful">Tüm profil ayarları öntanımlı durumuna geri yüklendi.</string>
<string name="ltr_or_rtl_combine_via_slash">%1$s/%2$s</string>
<string name="sunset_at">%1$s\'de gün batımı</string>
<string name="sunrise_at">%1$s\'de gün doğumu</string>
<string name="accessibility_mode_disabled">Sisteminizde erişilebilirlik modu devre dışı.</string>
<string name="reset_to_default_category_button_promo">Ön tanımlılara sıfırla, sıralama düzenini kurulumdan sonraki ön tanımlı duruma sıfırlayacaktır.</string>
<string name="reset_to_default_category_button_promo">Öntanımlılara sıfırla, sıralama düzenini kurulumdan sonraki öntanımlı duruma sıfırlayacaktır.</string>
<string name="use_system_screen_timeout">Sistem ekran zaman aşımını kullan</string>
<string name="use_system_screen_timeout_promo">Ön tanımlı olarak devre dışıdır, OsmAnd ön planda çalışıyorsa ekran zaman aşımına uğramaz.
<string name="use_system_screen_timeout_promo">Öntanımlı olarak devre dışıdır, OsmAnd ön planda çalışıyorsa ekran zaman aşımına uğramaz.
\n
\nEtkinleştirilirse OsmAnd sistem zaman aşımı ayarlarını kullanacaktır.</string>
<string name="clear_recorded_data">Kaydedilen verileri temizle</string>
<string name="release_3_6">• Profiller: artık sırayı değiştirebilir, harita simgesini ayarlayabilir, temel profiller için tüm ayarları değiştirebilir ve bunları ön tanımlılara geri yükleyebilirsiniz
<string name="release_3_6">• Profiller: artık sırayı değiştirebilir, harita simgesini ayarlayabilir, temel profiller için tüm ayarları değiştirebilir ve bunları öntanımlılara geri yükleyebilirsiniz
\n
\n • Navigasyona çıkış numarası eklendi
\n
@ -3494,7 +3494,7 @@
<string name="import_profile_dialog_description">İçe aktarılan profil ilave veriler içermektedir. Yalnızca profil verilerini içe aktarmak için İçe Aktar\'ı tıklayın veya içe aktarılacak ilave verileri seçin.</string>
<string name="export_profile_dialog_description">Profil ile birlikte dışa aktarılacak ilave veriler seçebilirsiniz.</string>
<string name="index_name_antarctica">Antarktika</string>
<string name="shared_string_app_default_w_val">Uygulama Ön Tanımlı Değeri (%s)</string>
<string name="shared_string_app_default_w_val">Uygulama Öntanımlı Değeri (%s)</string>
<string name="no_recalculation_setting">Yeniden hesaplamayı devre dışı bırak</string>
<string name="route_recalculation_dist_title">Rotayı yeniden hesaplamak için minimum mesafe</string>
<string name="route_recalculation_dist_descr">Rotaya olan mesafe belirtilen parametreden daha uzunsa rota yeniden hesaplanacak</string>
@ -3575,4 +3575,23 @@
<string name="shared_string_language">Dil</string>
<string name="shared_string_all_languages">Tüm diller</string>
<string name="wiki_menu_download_descr">Wikipedia POI\'lerini haritada görüntülemek için ek haritalara ihtiyaç vardır.</string>
<string name="ui_customization_short_descr">Çekmece ögeleri, içerik menüsü</string>
<string name="shared_string_drawer">Çekmece</string>
<string name="reset_items_descr">Gizlendikten sonra ayarlar orijinal durumuna sıfırlanacaktır.</string>
<string name="shared_string_items">Ögeler</string>
<string name="ui_customization_description">Çekmecedeki ögelerin sayısını özelleştirin, haritayı ve içerik menüsünü yapılandırın.
\n
\n%1$s uygulamasından tüm denetimlerini gizlemek için kullanılmayan eklentileri devre dışı bırakabilirsiniz.</string>
<string name="ui_customization">Kullanıcı Arayüzü Özelleştirme</string>
<string name="context_menu_actions">İçerik menüsü eylemleri</string>
<string name="reorder_or_hide_from">%1$s\'den ögeleri yeniden sırala veya gizle.</string>
<string name="shared_string_divider">Bölücü</string>
<string name="divider_descr">Bu noktanın altındaki ögeler bir bölücü ile ayrılır.</string>
<string name="shared_string_hidden">Gizli</string>
<string name="hidden_items_descr">Bu ögeler menüden gizlenir, ancak temsil edilen seçenekler veya eklentiler hala çalışır.</string>
<string name="main_actions_descr">Ana eylemler sadece 4 düğme içerir.</string>
<string name="main_actions">Ana eylemler</string>
<string name="additional_actions_descr">Bu eylemlere “Eylemler” düğmesine dokunarak erişebilirsiniz.</string>
<string name="move_inside_category">Ögeleri yalnızca bu kategorinin içine taşıyabilirsiniz.</string>
<string name="developer_plugin">Geliştirici Eklentisi</string>
</resources>

View file

@ -3610,5 +3610,24 @@
<string name="shared_string_languages">語言</string>
<string name="shared_string_language">語言</string>
<string name="shared_string_all_languages">所有語言</string>
<string name="wiki_menu_download_descr">需要其他地圖才能在地圖上檢視維基百科的 POI。</string>
<string name="wiki_menu_download_descr">需要額外的地圖才能在地圖上檢視維基百科的 POI。</string>
<string name="ui_customization_description">在「抽屜」、「設定地圖」與情境選單中自訂項目數量。
\n
\n您可以停用未使用的外掛程式以從應用程式 %1$s 中隱藏其控制元件。</string>
<string name="ui_customization_short_descr">抽屜項目,情境選單</string>
<string name="ui_customization">自訂使用者介面</string>
<string name="shared_string_drawer">抽屜</string>
<string name="context_menu_actions">情境選單動作</string>
<string name="reorder_or_hide_from">重新排列或從 %1$s 隱藏項目。</string>
<string name="shared_string_divider">分隔符</string>
<string name="divider_descr">低於此點的元素將由分隔符分離。</string>
<string name="shared_string_hidden">已隱藏</string>
<string name="hidden_items_descr">這些項目已從選單隱藏,但對應的選項或外掛程式仍在運作中。</string>
<string name="reset_items_descr">隱藏後,設定將會重設回原始狀態。</string>
<string name="main_actions_descr">主要動作僅包含 4 個按鈕。</string>
<string name="main_actions">主要動作</string>
<string name="additional_actions_descr">您可以透過輕點「動作」按鈕來存取此動作。</string>
<string name="move_inside_category">您只能在此分類中移動項目。</string>
<string name="developer_plugin">開發者外掛程式</string>
<string name="shared_string_items">項目</string>
</resources>

View file

@ -364,4 +364,5 @@
<dimen name="slider_thumb_halo_size">12dp</dimen>
<dimen name="slider_track_height">2dp</dimen>
<dimen name="list_item_move_header_min_height">65dp</dimen>
</resources>

View file

@ -49,10 +49,27 @@
<string name="settings_item_write_error">Could not write %1$s.</string>
<string name="settings_item_read_error">Could not read %1$s.</string>
<string name="changes_applied_to_profile">Changes applied to %1$s profile.</string>
<string name="shared_string_items">Items</string>
<string name="custom_osmand_plugin">Custom OsmAnd plugin</string>
<string name="app_mode_ski_snowmobile">Snowmobile</string>
<string name="app_mode_ski_touring">Ski touring</string>
<string name="replace_point_descr">Replace another point with this</string>
<string name="developer_plugin">Developer Plugin</string>
<string name="move_inside_category">You can move items only inside this category.</string>
<string name="additional_actions_descr">You can acsess this actions by taping “Actions” button.</string>
<string name="main_actions">Main actions</string>
<string name="main_actions_descr">Main actions containt only 4 buttons.</string>
<string name="reset_items_descr">Settings will be reset to the original state after hiding.</string>
<string name="hidden_items_descr">These items are hidden from the menu, but the represented options or plugins still be working.</string>
<string name="shared_string_hidden">Hidden</string>
<string name="divider_descr">Elements below this point separated by a divider.</string>
<string name="shared_string_divider">Divider</string>
<string name="reorder_or_hide_from">Reorder or hide items from the %1$s.</string>
<string name="context_menu_actions">Context menu actions</string>
<string name="shared_string_drawer">Drawer</string>
<string name="ui_customization">UI Customization</string>
<string name="ui_customization_short_descr">Drawer items, context menu</string>
<string name="ui_customization_description">Customize the quantity of items in Drawer, Configure map and context menu.\n\nYou can disable unused plugins, to hide all its controls from the application %1$s.</string>
<string name="shared_string_min">Min</string>
<string name="shared_string_square">Square</string>
<string name="shared_string_octagon">Octagon</string>

View file

@ -52,6 +52,14 @@
android:title="@string/profile_appearance"
tools:icon="@drawable/ic_action_offroad" />
<Preference
android:key="ui_customization"
android:layout="@layout/preference_with_descr"
android:persistent="false"
android:summary="@string/ui_customization_short_descr"
android:title="@string/ui_customization"
tools:icon="@drawable/ic_action_ui_customization" />
<Preference
android:layout="@layout/simple_divider_item"
android:selectable="false" />

View file

@ -23,6 +23,7 @@ import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.IdRes;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
@ -34,6 +35,8 @@ import net.osmand.plus.activities.actions.AppModeDialog;
import net.osmand.plus.dialogs.ConfigureMapMenu;
import net.osmand.plus.dialogs.HelpArticleDialogFragment;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.OsmandSettings.ContextMenuItemsPreference;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
@ -41,11 +44,12 @@ import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.APP_PROFILES_ID;
public class ContextMenuAdapter {
private static final Log LOG = PlatformUtil.getLog(ContextMenuAdapter.class);
@ -60,6 +64,11 @@ public class ContextMenuAdapter {
private boolean profileDependent = false;
private boolean nightMode;
private ConfigureMapMenu.OnClickListener changeAppModeListener = null;
private OsmandApplication app;
public ContextMenuAdapter(OsmandApplication app) {
this.app = app;
}
public int length() {
return items.size();
@ -75,7 +84,13 @@ public class ContextMenuAdapter {
public void addItem(ContextMenuItem item) {
try {
String id = item.getId();
if (id != null) {
item.setHidden(isItemHidden(id));
item.setOrder(getItemOrder(id, item.getOrder()));
}
items.add(item.getPos(), item);
sortItemsByOrder();
} catch (IndexOutOfBoundsException ex) {
items.add(item);
}
@ -85,6 +100,10 @@ public class ContextMenuAdapter {
return items.get(position);
}
public List<ContextMenuItem> getItems() {
return items;
}
public void removeItem(int position) {
items.remove(position);
}
@ -107,7 +126,6 @@ public class ContextMenuAdapter {
this.DEFAULT_LAYOUT_ID = defaultLayoutId;
}
public void setChangeAppModeListener(ConfigureMapMenu.OnClickListener changeAppModeListener) {
this.changeAppModeListener = changeAppModeListener;
}
@ -128,16 +146,45 @@ public class ContextMenuAdapter {
});
}
private boolean isItemHidden(@NonNull String id) {
ContextMenuItemsPreference contextMenuItemsPreference = app.getSettings().getContextMenuItemsPreference(id);
if (contextMenuItemsPreference == null) {
return false;
}
List<String> hiddenIds = contextMenuItemsPreference.get().getHiddenIds();
if (!Algorithms.isEmpty(hiddenIds)) {
return hiddenIds.contains(id);
}
return false;
}
private int getItemOrder(@NonNull String id, int defaultOrder) {
ContextMenuItemsPreference contextMenuItemsPreference = app.getSettings().getContextMenuItemsPreference(id);
if (contextMenuItemsPreference == null) {
return defaultOrder;
}
List<String> orderIds = contextMenuItemsPreference.get().getOrderIds();
if (!Algorithms.isEmpty(orderIds)) {
int order = orderIds.indexOf(id);
if (order != -1) {
return order;
}
}
return defaultOrder;
}
public ArrayAdapter<ContextMenuItem> createListAdapter(final Activity activity, final boolean lightTheme) {
final int layoutId = DEFAULT_LAYOUT_ID;
final OsmandApplication app = ((OsmandApplication) activity.getApplication());
final OsmAndAppCustomization customization = app.getAppCustomization();
for (Iterator<ContextMenuItem> iterator = items.iterator(); iterator.hasNext(); ) {
String id = iterator.next().getId();
if (!TextUtils.isEmpty(id) && !customization.isFeatureEnabled(id)) {
iterator.remove();
List<ContextMenuItem> itemsToRemove = new ArrayList<>();
for (ContextMenuItem item : items) {
String id = item.getId();
if (item.isHidden() || !TextUtils.isEmpty(id) && !customization.isFeatureEnabled(id)) {
itemsToRemove.add(item);
}
}
items.removeAll(itemsToRemove);
return new ContextMenuArrayAdapter(activity, layoutId, R.id.title,
items.toArray(new ContextMenuItem[items.size()]), app, lightTheme, changeAppModeListener);
}
@ -532,4 +579,30 @@ public class ContextMenuAdapter {
}
}
}
public List<ContextMenuItem> getDefaultItems() {
String idScheme = getIdScheme();
List<ContextMenuItem> items = new ArrayList<>();
for (ContextMenuItem item : this.items) {
String id = item.getId();
if (id != null && id.startsWith(idScheme) && !APP_PROFILES_ID.equals(id)) {
items.add(item);
}
}
return items;
}
private String getIdScheme() {
String idScheme = "";
for (ContextMenuItem item : items) {
String id = item.getId();
if (id != null) {
ContextMenuItemsPreference pref = app.getSettings().getContextMenuItemsPreference(id);
if (pref != null) {
return pref.getIdScheme();
}
}
}
return idScheme;
}
}

View file

@ -30,8 +30,9 @@ public class ContextMenuItem {
private final boolean category;
private final boolean clickable;
private final boolean skipPaintingWithoutColor;
private boolean hidden;
private final int pos;
private final int order;
private int order;
private String description;
private final ContextMenuAdapter.ItemClickListener itemClickListener;
private final ContextMenuAdapter.OnIntegerValueChangedListener integerListener;
@ -153,6 +154,10 @@ public class ContextMenuItem {
return clickable;
}
public boolean isHidden() {
return hidden;
}
public int getPos() {
return pos;
}
@ -185,6 +190,10 @@ public class ContextMenuItem {
return hideDivider;
}
public void setHidden(boolean hidden) {
this.hidden = hidden;
}
public boolean shouldHideCompoundButton() {
return hideCompoundButton;
}
@ -213,6 +222,10 @@ public class ContextMenuItem {
this.progress = progress;
}
public void setOrder(int order) {
this.order = order;
}
public void setLoading(boolean loading) {
this.loading = loading;
}

View file

@ -25,6 +25,7 @@ import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import net.osmand.IndexConstants;
import net.osmand.PlatformUtil;
import net.osmand.StateChangedListener;
import net.osmand.ValueHolder;
import net.osmand.aidl.OsmandAidlApi;
@ -56,11 +57,14 @@ import net.osmand.plus.voice.CommandPlayer;
import net.osmand.render.RenderingRulesStorage;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.lang.ref.WeakReference;
import java.lang.reflect.Type;
import java.util.ArrayList;
@ -77,8 +81,14 @@ import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.CONFIGURE_MAP_ITEM_ID_SCHEME;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_ITEM_ID_SCHEME;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_ACTIONS;
public class OsmandSettings {
private static final Log LOG = PlatformUtil.getLog(OsmandSettings.class.getName());
public static final int VERSION = 1;
public interface OsmandPreference<T> {
@ -442,6 +452,10 @@ public class OsmandSettings {
}
return false;
}
} else if (preference instanceof ContextMenuItemsPreference) {
if (value instanceof ContextMenuItemsSettings) {
((ContextMenuItemsPreference) preference).setModeValue(mode, (ContextMenuItemsSettings) value);
}
}
}
return false;
@ -1102,6 +1116,131 @@ public class OsmandSettings {
addModeValue(appMode, value);
}
}
public boolean setModeValues(ApplicationMode mode, List<String> values) {
if (values == null || values.size() == 0) {
setModeValue(mode,null);
return false;
}
clearAll();
String vl = get();
for (String value : values) {
addValue(value);
if (vl == null || vl.isEmpty()) {
vl = value + delimiter;
} else {
vl = vl + value + delimiter;
}
}
return setModeValue(mode, vl);
}
}
public class ContextMenuItemsPreference extends CommonPreference<ContextMenuItemsSettings> {
@NonNull
private String idScheme;
private ContextMenuItemsPreference(String id, @NonNull String idScheme) {
super(id, new ContextMenuItemsSettings());
this.idScheme = idScheme;
}
@Override
protected ContextMenuItemsSettings getValue(Object prefs, ContextMenuItemsSettings defaultValue) {
String s = settingsAPI.getString(prefs, getId(), "");
return readValue(s);
}
@Override
protected boolean setValue(Object prefs, ContextMenuItemsSettings val) {
return settingsAPI.edit(prefs).putString(getId(), val.writeToJsonString(idScheme)).commit();
}
@Override
public ContextMenuItemsSettings parseString(String s) {
return readValue(s);
}
private ContextMenuItemsSettings readValue(String s) {
ContextMenuItemsSettings value = new ContextMenuItemsSettings();
value.readFromJsonString(s, idScheme);
return value;
}
@NonNull
public String getIdScheme() {
return idScheme;
}
}
public static class ContextMenuItemsSettings implements Serializable {
public static final String HIDDEN = "hidden";
public static final String ORDER = "order";
private List<String> hiddenIds = new ArrayList<>();
private List<String> orderIds = new ArrayList<>();
public ContextMenuItemsSettings() {
}
public ContextMenuItemsSettings(@NonNull List<String> hiddenIds, @NonNull List<String> orderIds) {
this.hiddenIds = hiddenIds;
this.orderIds = orderIds;
}
public void readFromJsonString(String jsonString, @NonNull String idScheme) {
if (Algorithms.isEmpty(jsonString)) {
return;
}
try {
JSONObject json = new JSONObject(jsonString);
hiddenIds = readIdsList(json.optJSONArray(HIDDEN), idScheme);
orderIds = readIdsList(json.optJSONArray(ORDER), idScheme);
} catch (JSONException e) {
LOG.error("Error converting to json string: " + e);
}
}
private List<String> readIdsList(JSONArray jsonArray, @NonNull String idScheme) {
List<String> list = new ArrayList<>();
if (jsonArray != null) {
for (int i = 0; i < jsonArray.length(); i++) {
String id = jsonArray.optString(i);
list.add(idScheme + id);
}
}
return list;
}
public String writeToJsonString(@NonNull String idScheme) {
try {
JSONObject json = new JSONObject();
json.put(HIDDEN, getJsonArray(hiddenIds, idScheme));
json.put(ORDER, getJsonArray(orderIds, idScheme));
return json.toString();
} catch (JSONException e) {
LOG.error("Error converting to json string: " + e);
}
return "";
}
private JSONArray getJsonArray(List<String> ids, @NonNull String idScheme) {
JSONArray jsonArray = new JSONArray();
if (ids != null && !ids.isEmpty()) {
for (String id : ids) {
jsonArray.put(id.replace(idScheme, ""));
}
}
return jsonArray;
}
public List<String> getHiddenIds() {
return Collections.unmodifiableList(hiddenIds);
}
public List<String> getOrderIds() {
return Collections.unmodifiableList(orderIds);
}
}
public class EnumIntPreference<E extends Enum<E>> extends CommonPreference<E> {
@ -3428,6 +3567,27 @@ public class OsmandSettings {
public final ListStringPreference INACTIVE_POI_FILTERS = (ListStringPreference)
new ListStringPreference("inactive_poi_filters", null, ",,").makeProfile().cache();
public final ContextMenuItemsPreference DRAWER_ITEMS =
(ContextMenuItemsPreference) new ContextMenuItemsPreference("drawer_items", DRAWER_ITEM_ID_SCHEME).makeProfile().cache();
public final ContextMenuItemsPreference CONFIGURE_MAP_ITEMS =
(ContextMenuItemsPreference) new ContextMenuItemsPreference("context_menu_items", CONFIGURE_MAP_ITEM_ID_SCHEME).makeProfile().cache();
public final ContextMenuItemsPreference CONTEXT_MENU_ACTIONS_ITEMS =
(ContextMenuItemsPreference) new ContextMenuItemsPreference("configure_map_items", MAP_CONTEXT_MENU_ACTIONS).makeProfile().cache();
public final List<ContextMenuItemsPreference> CONTEXT_MENU_ITEMS_PREFERENCES = Arrays.asList(DRAWER_ITEMS, CONFIGURE_MAP_ITEMS, CONTEXT_MENU_ACTIONS_ITEMS);
@Nullable
public ContextMenuItemsPreference getContextMenuItemsPreference(@NonNull String id) {
for (ContextMenuItemsPreference preference : CONTEXT_MENU_ITEMS_PREFERENCES) {
if (id.startsWith(preference.idScheme)) {
return preference;
}
}
return null;
}
public static final String VOICE_PROVIDER_NOT_USE = "VOICE_PROVIDER_NOT_USE";
public static final String[] TTS_AVAILABLE_VOICES = new String[]{

View file

@ -1339,12 +1339,15 @@ public class SettingsHelper {
public QuickActionsSettingsItem(@NonNull OsmandApplication app, @NonNull List<QuickAction> items) {
super(app, items);
actionRegistry = app.getQuickActionRegistry();
existingItems = actionRegistry.getQuickActions();
}
QuickActionsSettingsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
super(app, json);
}
@Override
protected void init() {
super.init();
actionRegistry = app.getQuickActionRegistry();
existingItems = actionRegistry.getQuickActions();
}
@ -1490,11 +1493,15 @@ public class SettingsHelper {
public PoiUiFilterSettingsItem(@NonNull OsmandApplication app, @NonNull List<PoiUIFilter> items) {
super(app, items);
existingItems = app.getPoiFilters().getUserDefinedPoiFilters(false);
}
PoiUiFilterSettingsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
super(app, json);
}
@Override
protected void init() {
super.init();
existingItems = app.getPoiFilters().getUserDefinedPoiFilters(false);
}
@ -1632,18 +1639,19 @@ public class SettingsHelper {
public static class MapSourcesSettingsItem extends CollectionSettingsItem<ITileSource> {
private OsmandApplication app;
private List<String> existingItemsNames;
public MapSourcesSettingsItem(@NonNull OsmandApplication app, @NonNull List<ITileSource> items) {
super(app, items);
this.app = app;
existingItemsNames = new ArrayList<>(app.getSettings().getTileSourceEntries().values());
}
MapSourcesSettingsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
super(app, json);
this.app = app;
}
@Override
protected void init() {
super.init();
existingItemsNames = new ArrayList<>(app.getSettings().getTileSourceEntries().values());
}
@ -1831,21 +1839,20 @@ public class SettingsHelper {
public static class AvoidRoadsSettingsItem extends CollectionSettingsItem<AvoidRoadInfo> {
private OsmandApplication app;
private OsmandSettings settings;
private AvoidSpecificRoads specificRoads;
public AvoidRoadsSettingsItem(@NonNull OsmandApplication app, @NonNull List<AvoidRoadInfo> items) {
super(app, items);
this.app = app;
settings = app.getSettings();
specificRoads = app.getAvoidSpecificRoads();
existingItems = new ArrayList<>(specificRoads.getImpassableRoads().values());
}
AvoidRoadsSettingsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
super(app, json);
this.app = app;
}
@Override
protected void init() {
super.init();
settings = app.getSettings();
specificRoads = app.getAvoidSpecificRoads();
existingItems = new ArrayList<>(specificRoads.getImpassableRoads().values());

View file

@ -4,7 +4,6 @@ import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
@ -39,6 +38,7 @@ import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.view.ViewCompat;
import androidx.core.widget.TintableCompoundButton;
import com.google.android.material.snackbar.BaseTransientBottomBar;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.snackbar.SnackbarContentLayout;
@ -51,8 +51,6 @@ import net.osmand.plus.widgets.TextViewEx;
import org.apache.commons.logging.Log;
import java.util.Locale;
import gnu.trove.map.hash.TLongObjectHashMap;
public class UiUtilities {
@ -414,6 +412,9 @@ public class UiUtilities {
actionView.setGravity(Gravity.CENTER_VERTICAL | Gravity.END);
container.setLayoutParams(params);
}
try {
snackbar.setAnimationMode(BaseTransientBottomBar.ANIMATION_MODE_FADE);
} catch (Throwable e) { }
}
public static void rotateImageByLayoutDirection(ImageView image, int layoutDirection) {

View file

@ -42,7 +42,7 @@ public class HelpActivity extends OsmandActionBarActivity implements AdapterView
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_help_screen);
ContextMenuAdapter contextMenuAdapter = new ContextMenuAdapter();
ContextMenuAdapter contextMenuAdapter = new ContextMenuAdapter(getMyApplication());
contextMenuAdapter.setDefaultLayoutId(R.layout.two_line_with_images_list_item);
createBeginWithOsmandItems(contextMenuAdapter);

View file

@ -137,6 +137,7 @@ import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchTab;
import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType;
import net.osmand.plus.settings.BaseSettingsFragment;
import net.osmand.plus.settings.BaseSettingsFragment.SettingsScreenType;
import net.osmand.plus.settings.ConfigureMenuItemsFragment;
import net.osmand.plus.settings.ConfigureProfileFragment;
import net.osmand.plus.settings.DataStorageFragment;
import net.osmand.plus.settings.ImportCompleteFragment;
@ -750,6 +751,11 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
importCompleteFragment.dismissFragment();
return;
}
ConfigureMenuItemsFragment configureMenuItemsFragment = getConfigureMenuItemsFragment();
if (configureMenuItemsFragment != null) {
configureMenuItemsFragment.exitFragment();
return;
}
super.onBackPressed();
}
@ -2469,6 +2475,10 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
return getFragment(ImportCompleteFragment.TAG);
}
public ConfigureMenuItemsFragment getConfigureMenuItemsFragment(){
return getFragment(ConfigureMenuItemsFragment.TAG);
}
public PointEditorFragmentNew getPointEditorFragmentNew() {
PointEditorFragmentNew pointEditorFragmentNew;
pointEditorFragmentNew = getFragment(FavoritePointEditor.TAG);

View file

@ -64,6 +64,7 @@ import net.osmand.plus.routepreparationmenu.WaypointsFragment;
import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.settings.BaseSettingsFragment;
import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment.ContextMenuItemClickListener;
import net.osmand.plus.views.BaseMapLayer;
import net.osmand.plus.views.MapControlsLayer;
import net.osmand.plus.views.MapTileLayer;
@ -98,11 +99,15 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_SEARCH_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_SETTINGS_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_TRAVEL_GUIDES_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_ADD_GPX_WAYPOINT;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_ADD_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_AVOID_ROAD;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_DIRECTIONS_FROM_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_EDIT_GPX_WP;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_MARKER_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_MEASURE_DISTANCE;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_MORE_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_SEARCH_NEARBY;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_SHARE_ID;
import static net.osmand.plus.ContextMenuAdapter.PROFILES_CHOSEN_PROFILE_TAG;
import static net.osmand.plus.ContextMenuAdapter.PROFILES_CONTROL_BUTTON_TAG;
import static net.osmand.plus.ContextMenuAdapter.PROFILES_NORMAL_PROFILE_TAG;
@ -331,10 +336,38 @@ public class MapActivityActions implements DialogProvider {
}
public void contextMenuPoint(final double latitude, final double longitude, final ContextMenuAdapter iadapter, Object selectedObj) {
final ContextMenuAdapter adapter = iadapter == null ? new ContextMenuAdapter() : iadapter;
public void addActionsToAdapter(final double latitude,
final double longitude,
final ContextMenuAdapter adapter,
Object selectedObj,
boolean all) {
ItemBuilder itemBuilder = new ItemBuilder();
adapter.addItem(itemBuilder
.setTitleId(R.string.shared_string_add, mapActivity)
.setId(MAP_CONTEXT_MENU_ADD_ID)
.setIcon(R.drawable.map_action_fav_dark)
.setOrder(0)
.createItem());
adapter.addItem(itemBuilder
.setTitleId(R.string.shared_string_marker, mapActivity)
.setId(MAP_CONTEXT_MENU_MARKER_ID)
.setIcon(R.drawable.map_action_flag_dark)
.setOrder(1)
.createItem());
adapter.addItem(itemBuilder
.setTitleId(R.string.shared_string_share, mapActivity)
.setId(MAP_CONTEXT_MENU_SHARE_ID)
.setIcon(R.drawable.map_action_gshare_dark)
.setOrder(2)
.createItem());
adapter.addItem(itemBuilder
.setTitleId(R.string.shared_string_actions, mapActivity)
.setId(MAP_CONTEXT_MENU_MORE_ID)
.setIcon(R.drawable.map_overflow_menu_white)
.setOrder(3)
.createItem());
adapter.addItem(itemBuilder
.setTitleId(R.string.context_menu_item_directions_from, mapActivity)
.setId(MAP_CONTEXT_MENU_DIRECTIONS_FROM_ID)
@ -362,22 +395,28 @@ public class MapActivityActions implements DialogProvider {
}
};
if (selectedObj instanceof WptPt
&& getMyApplication().getSelectedGpxHelper().getSelectedGPXFile((WptPt) selectedObj) != null) {
adapter.addItem(new ItemBuilder()
ContextMenuItem editGpxItem = new ItemBuilder()
.setTitleId(R.string.context_menu_item_edit_waypoint, mapActivity)
.setId(MAP_CONTEXT_MENU_EDIT_GPX_WP)
.setIcon(R.drawable.ic_action_edit_dark)
.setOrder(EDIT_GPX_WAYPOINT_ITEM_ORDER)
.setListener(listener).createItem());
} else if (!getMyApplication().getSelectedGpxHelper().getSelectedGPXFiles().isEmpty()
|| (OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class) != null)) {
adapter.addItem(new ItemBuilder()
.setListener(listener).createItem();
ContextMenuItem addGpxItem = new ItemBuilder()
.setTitleId(R.string.context_menu_item_add_waypoint, mapActivity)
.setId(MAP_CONTEXT_MENU_ADD_GPX_WAYPOINT)
.setIcon(R.drawable.ic_action_gnew_label_dark)
.setOrder(ADD_GPX_WAYPOINT_ITEM_ORDER)
.setListener(listener).createItem());
.setListener(listener).createItem();
if (all) {
adapter.addItem(editGpxItem);
adapter.addItem(addGpxItem);
} else if (selectedObj instanceof WptPt
&& getMyApplication().getSelectedGpxHelper().getSelectedGPXFile((WptPt) selectedObj) != null) {
adapter.addItem(editGpxItem);
} else if (!getMyApplication().getSelectedGpxHelper().getSelectedGPXFiles().isEmpty()
|| (OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class) != null)) {
adapter.addItem(addGpxItem);
}
adapter.addItem(itemBuilder
@ -395,12 +434,25 @@ public class MapActivityActions implements DialogProvider {
.createItem());
adapter.sortItemsByOrder();
}
public void contextMenuPoint(final double latitude, final double longitude, final ContextMenuAdapter iadapter, Object selectedObj) {
final ContextMenuAdapter adapter = iadapter == null ? new ContextMenuAdapter(getMyApplication()) : iadapter;
addActionsToAdapter(latitude, longitude, adapter, selectedObj, false);
showAdditionalActionsFragment(adapter, getContextMenuItemClickListener(latitude, longitude, adapter));
}
public void showAdditionalActionsFragment(final ContextMenuAdapter adapter, AdditionalActionsBottomSheetDialogFragment.ContextMenuItemClickListener listener) {
AdditionalActionsBottomSheetDialogFragment actionsBottomSheetDialogFragment = new AdditionalActionsBottomSheetDialogFragment();
actionsBottomSheetDialogFragment.setAdapter(adapter, listener);
actionsBottomSheetDialogFragment.show(mapActivity.getSupportFragmentManager(), AdditionalActionsBottomSheetDialogFragment.TAG);
}
public ContextMenuItemClickListener getContextMenuItemClickListener(final double latitude, final double longitude, final ContextMenuAdapter adapter) {
final ArrayAdapter<ContextMenuItem> listAdapter =
adapter.createListAdapter(mapActivity, getMyApplication().getSettings().isLightContent());
AdditionalActionsBottomSheetDialogFragment actionsBottomSheetDialogFragment = new AdditionalActionsBottomSheetDialogFragment();
actionsBottomSheetDialogFragment.setAdapter(adapter, new AdditionalActionsBottomSheetDialogFragment.ContextMenuItemClickListener() {
return new AdditionalActionsBottomSheetDialogFragment.ContextMenuItemClickListener() {
@Override
public void onItemClick(int position) {
ContextMenuItem item = adapter.getItem(position);
@ -423,10 +475,15 @@ public class MapActivityActions implements DialogProvider {
MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), new LatLon(latitude, longitude));
} else if (standardId == R.string.avoid_road) {
getMyApplication().getAvoidSpecificRoads().addImpassableRoad(mapActivity, new LatLon(latitude, longitude), true, false, null);
} else if (standardId == R.string.shared_string_add) {
mapActivity.getContextMenu().buttonFavoritePressed();
} else if (standardId == R.string.shared_string_marker) {
mapActivity.getContextMenu().buttonWaypointPressed();
} else if (standardId == R.string.shared_string_share) {
mapActivity.getContextMenu().buttonSharePressed();
}
}
});
actionsBottomSheetDialogFragment.show(mapActivity.getSupportFragmentManager(), AdditionalActionsBottomSheetDialogFragment.TAG);
};
}
public void enterDirectionsFromPoint(final double latitude, final double longitude) {
@ -648,7 +705,7 @@ public class MapActivityActions implements DialogProvider {
public ContextMenuAdapter createMainOptionsMenu() {
final OsmandMapTileView mapView = mapActivity.getMapView();
final OsmandApplication app = mapActivity.getMyApplication();
ContextMenuAdapter optionsMenuHelper = new ContextMenuAdapter();
ContextMenuAdapter optionsMenuHelper = new ContextMenuAdapter(app);
boolean nightMode = getMyApplication().getDaynightHelper().isNightModeForMapControls();
if (drawerMode == DRAWER_MODE_SWITCH_PROFILE) {

View file

@ -270,7 +270,7 @@ public class MapActivityLayers {
public void showMultichoicePoiFilterDialog(final OsmandMapTileView mapView, final DismissListener listener) {
final OsmandApplication app = getApplication();
final PoiFiltersHelper poiFilters = app.getPoiFilters();
final ContextMenuAdapter adapter = new ContextMenuAdapter();
final ContextMenuAdapter adapter = new ContextMenuAdapter(app);
final List<PoiUIFilter> list = new ArrayList<>();
for (PoiUIFilter f : poiFilters.getSortedPoiFilters(true)) {
addFilterToList(adapter, list, f, true);
@ -344,7 +344,7 @@ public class MapActivityLayers {
public void showSingleChoicePoiFilterDialog(final OsmandMapTileView mapView, final DismissListener listener) {
final OsmandApplication app = getApplication();
final PoiFiltersHelper poiFilters = app.getPoiFilters();
final ContextMenuAdapter adapter = new ContextMenuAdapter();
final ContextMenuAdapter adapter = new ContextMenuAdapter(app);
adapter.addItem(new ContextMenuItem.ItemBuilder()
.setTitleId(R.string.shared_string_search, app)
.setIcon(R.drawable.ic_action_search_dark).createItem());

View file

@ -475,7 +475,7 @@ public class SettingsNavigationActivity extends SettingsBaseActivity {
return true;
} else if (preference == autoZoom) {
final ApplicationMode am = settings.getApplicationMode();
final ContextMenuAdapter adapter = new ContextMenuAdapter();
final ContextMenuAdapter adapter = new ContextMenuAdapter(getMyApplication());
int i = 0;
int selectedIndex = -1;
adapter.addItem(ContextMenuItem.createBuilder(getString(R.string.auto_zoom_none))
@ -546,7 +546,7 @@ public class SettingsNavigationActivity extends SettingsBaseActivity {
return true;
} else if (preference == reliefFactorRouting) {
final ApplicationMode am = settings.getApplicationMode();
final ContextMenuAdapter adapter = new ContextMenuAdapter();
final ContextMenuAdapter adapter = new ContextMenuAdapter(getMyApplication());
int i = 0;
int selectedIndex = -1;
for (RoutingParameter p : reliefFactorParameters) {

View file

@ -53,6 +53,7 @@ import net.osmand.plus.inapp.InAppPurchaseHelper;
import net.osmand.plus.poi.PoiFiltersHelper;
import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin;
import net.osmand.plus.render.RendererRegistry;
import net.osmand.plus.settings.ConfigureMenuRootFragment.ScreenType;
import net.osmand.plus.srtmplugin.SRTMPlugin;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.corenative.NativeCoreContext;
@ -128,7 +129,7 @@ public class ConfigureMapMenu {
OsmandApplication app = ma.getMyApplication();
boolean nightMode = app.getDaynightHelper().isNightModeForMapControls();
int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
ContextMenuAdapter adapter = new ContextMenuAdapter();
ContextMenuAdapter adapter = new ContextMenuAdapter(app);
adapter.setDefaultLayoutId(R.layout.list_item_icon_and_menu);
adapter.addItem(new ContextMenuItem.ItemBuilder()
.setId(APP_PROFILES_ID)
@ -156,7 +157,6 @@ public class ConfigureMapMenu {
adapter.setNightMode(nightMode);
createLayersItems(customRules, adapter, ma, themeRes, nightMode);
createRenderingAttributeItems(customRules, adapter, ma, themeRes, nightMode);
return adapter;
}

View file

@ -24,7 +24,7 @@ public class RasterMapMenu {
public static ContextMenuAdapter createListAdapter(final MapActivity mapActivity,
final RasterMapType type) {
boolean nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls();
ContextMenuAdapter adapter = new ContextMenuAdapter();
ContextMenuAdapter adapter = new ContextMenuAdapter(mapActivity.getMyApplication());
adapter.setDefaultLayoutId(R.layout.list_item_icon_and_menu);
adapter.setProfileDependent(true);
adapter.setNightMode(nightMode);

View file

@ -164,7 +164,7 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement
private void showContextMenu(final LocalIndexInfo info) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final ContextMenuAdapter adapter = new ContextMenuAdapter();
final ContextMenuAdapter adapter = new ContextMenuAdapter(getMyApplication());
basicFileOperation(info, adapter);
OsmandPlugin.onContextMenuActivity(getActivity(), null, info, adapter);
@ -704,7 +704,7 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement
//hide action bar from downloadindexfragment
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
int iconColorResId = getMyApplication().getSettings().isLightContent() ? R.color.active_buttons_and_links_text_light : R.color.active_buttons_and_links_text_dark;
optionsMenuAdapter = new ContextMenuAdapter();
optionsMenuAdapter = new ContextMenuAdapter(requireMyApplication());
ItemClickListener listener = new ContextMenuAdapter.ItemClickListener() {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter,

View file

@ -1,6 +1,6 @@
package net.osmand.plus.helpers;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -15,6 +15,7 @@ import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities;
import net.osmand.IndexConstants;
import net.osmand.plus.GPXDatabase;
import net.osmand.plus.GpxDbHelper;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
@ -35,14 +36,11 @@ public class GpxTrackAdapter extends RecyclerView.Adapter<GpxTrackAdapter.TrackV
private OnItemClickListener onItemClickListener;
private UiUtilities iconsCache;
GpxTrackAdapter(Activity activity, List<GpxUiHelper.GPXInfo> gpxInfoList, boolean showCurrentGpx,
OnItemClickListener onItemClickListener) {
GpxTrackAdapter(Context ctx, List<GpxUiHelper.GPXInfo> gpxInfoList, boolean showCurrentGpx) {
this.showCurrentGpx = showCurrentGpx;
this.onItemClickListener = onItemClickListener;
app = (OsmandApplication) activity.getApplication();
app = (OsmandApplication) ctx.getApplicationContext();
boolean nightMode = app.getDaynightHelper().isNightModeForMapControls();
themedInflater = UiUtilities.getInflater(activity, nightMode);
themedInflater = UiUtilities.getInflater(ctx, nightMode);
this.gpxInfoList = gpxInfoList;
iconsCache = app.getUIUtilities();
}
@ -123,8 +121,26 @@ public class GpxTrackAdapter extends RecyclerView.Adapter<GpxTrackAdapter.TrackV
}
}
private GPXDatabase.GpxDataItem getDataItem(GpxUiHelper.GPXInfo info) {
return app.getGpxDbHelper().getItem(new File(app.getAppPath(IndexConstants.GPX_INDEX_DIR), info.getFileName()));
private GPXDatabase.GpxDataItem getDataItem(final GpxUiHelper.GPXInfo info) {
GpxDbHelper.GpxDataItemCallback gpxDataItemCallback = new GpxDbHelper.GpxDataItemCallback() {
@Override
public boolean isCancelled() {
return false;
}
@Override
public void onGpxDataItemReady(GPXDatabase.GpxDataItem item) {
if (item != null && gpxInfoList != null && info != null) {
notifyItemChanged(gpxInfoList.indexOf(info));
}
}
};
return app.getGpxDbHelper().getItem(new File(app.getAppPath(IndexConstants.GPX_INDEX_DIR), info.getFileName())
, gpxDataItemCallback);
}
void setAdapterListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
static class TrackViewHolder extends RecyclerView.ViewHolder {

View file

@ -37,8 +37,7 @@ import androidx.appcompat.widget.ListPopupWindow;
import androidx.appcompat.widget.SwitchCompat;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.fragment.app.FragmentActivity;
import com.github.mikephil.charting.charts.HorizontalBarChart;
import com.github.mikephil.charting.charts.LineChart;
@ -234,7 +233,7 @@ public class GpxUiHelper {
}
allGpxList.add(0, new GPXInfo(activity.getString(R.string.show_current_gpx_title), 0, 0));
final ContextMenuAdapter adapter = createGpxContextMenuAdapter(allGpxList, selectedGpxList, true);
final ContextMenuAdapter adapter = createGpxContextMenuAdapter(allGpxList, selectedGpxList, true, app);
return createDialog(activity, true, true, true, callbackWithObject, allGpxList, adapter, dialogThemeRes, nightMode);
}
@ -253,13 +252,13 @@ public class GpxUiHelper {
list.add(0, new GPXInfo(activity.getString(R.string.show_current_gpx_title), 0, 0));
}
final ContextMenuAdapter adapter = createGpxContextMenuAdapter(list, null, showCurrentGpx);
final ContextMenuAdapter adapter = createGpxContextMenuAdapter(list, null, showCurrentGpx, app);
return createDialog(activity, showCurrentGpx, multipleChoice, false, callbackWithObject, list, adapter, dialogThemeRes, nightMode);
}
return null;
}
public static AlertDialog selectSingleGPXFile(final Activity activity, boolean showCurrentGpx,
public static void selectSingleGPXFile(final FragmentActivity activity, boolean showCurrentGpx,
final CallbackWithObject<GPXFile[]> callbackWithObject) {
OsmandApplication app = (OsmandApplication) activity.getApplication();
int gpxDirLength = app.getAppPath(IndexConstants.GPX_INDEX_DIR).getAbsolutePath().length();
@ -279,17 +278,15 @@ public class GpxUiHelper {
list.add(new GPXInfo(gpxFile.path.substring(gpxDirLength + 1), gpxFile.modifiedTime, 0));
}
}
final ContextMenuAdapter adapter = createGpxContextMenuAdapter(list, null, showCurrentGpx);
return createSingleChoiceDialog(activity, showCurrentGpx, callbackWithObject, list, adapter);
SelectGpxTrackBottomSheet.showInstance(activity.getSupportFragmentManager(), showCurrentGpx, callbackWithObject, list);
}
return null;
}
private static ContextMenuAdapter createGpxContextMenuAdapter(List<GPXInfo> allGpxList,
List<String> selectedGpxList,
boolean showCurrentTrack) {
final ContextMenuAdapter adapter = new ContextMenuAdapter();
boolean showCurrentTrack,
OsmandApplication app) {
final ContextMenuAdapter adapter = new ContextMenuAdapter(app);
//element position in adapter
int i = 0;
for (GPXInfo gpxInfo : allGpxList) {
@ -350,65 +347,6 @@ public class GpxUiHelper {
}, dir, null, filename);
}
private static AlertDialog createSingleChoiceDialog(final Activity activity,
final boolean showCurrentGpx,
final CallbackWithObject<GPXFile[]> callbackWithObject,
final List<GPXInfo> list,
final ContextMenuAdapter adapter) {
final OsmandApplication app = (OsmandApplication) activity.getApplication();
boolean nightMode = app.getDaynightHelper().isNightModeForMapControls();
final View customLayout = UiUtilities.getInflater(activity, nightMode).inflate(R.layout.gpx_track_select_dialog, null);
AlertDialog.Builder builder = new AlertDialog.Builder(UiUtilities.getThemedContext(activity, nightMode));
builder.setView(customLayout);
final AlertDialog dlg = builder.create();
View cancelButton = customLayout.findViewById(R.id.dismiss_button);
UiUtilities.setupDialogButton(nightMode, cancelButton, UiUtilities.DialogButtonType.SECONDARY, R.string.shared_string_cancel);
TextView gpxCounter = customLayout.findViewById(R.id.counter);
gpxCounter.setText(String.valueOf(adapter.length()));
GpxTrackAdapter gpxTrackAdapter = new GpxTrackAdapter(activity, list, showCurrentGpx,
new GpxTrackAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
if (position != -1 && position < list.size()) {
if (showCurrentGpx && position == 0) {
callbackWithObject.processResult(null);
app.getSettings().LAST_SELECTED_GPX_TRACK_FOR_NEW_POINT.set(null);
} else {
String fileName = list.get(position).getFileName();
app.getSettings().LAST_SELECTED_GPX_TRACK_FOR_NEW_POINT.set(fileName);
SelectedGpxFile selectedGpxFile =
app.getSelectedGpxHelper().getSelectedFileByName(fileName);
if (selectedGpxFile != null) {
callbackWithObject.processResult(new GPXUtilities.GPXFile[]{selectedGpxFile.getGpxFile()});
} else {
File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR);
GpxUiHelper.loadGPXFileInDifferentThread(activity, callbackWithObject, dir, null, fileName);
}
}
}
dlg.dismiss();
}
});
RecyclerView recyclerView = customLayout.findViewById(R.id.gpx_track_list);
recyclerView.setAdapter(gpxTrackAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(app, LinearLayoutManager.VERTICAL, false));
dlg.setCanceledOnTouchOutside(false);
dlg.show();
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dlg.dismiss();
}
});
try {
dlg.getListView().setFastScrollEnabled(true);
} catch (Exception e) {
// java.lang.ClassCastException: com.android.internal.widget.RoundCornerListAdapter
// Unknown reason but on some devices fail
}
return dlg;
}
private static class DialogGpxDataItemCallback implements GpxDataItemCallback {
private static final int UPDATE_GPX_ITEM_MSG_ID = OsmAndConstants.UI_HANDLER_LOCATION_SERVICE + 6;
private static final long MIN_UPDATE_INTERVAL = 500;

View file

@ -0,0 +1,112 @@
package net.osmand.plus.helpers;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.view.ContextThemeWrapper;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.CallbackWithObject;
import net.osmand.GPXUtilities;
import net.osmand.IndexConstants;
import net.osmand.plus.GpxSelectionHelper;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import java.io.File;
import java.util.List;
public class SelectGpxTrackBottomSheet extends MenuBottomSheetDialogFragment {
public static final String TAG = SelectGpxTrackBottomSheet.class.getSimpleName();
protected View mainView;
protected GpxTrackAdapter adapter;
private List<GpxUiHelper.GPXInfo> gpxInfoList;
private boolean showCurrentGpx;
private CallbackWithObject<GPXUtilities.GPXFile[]> callbackWithObject;
private void setGpxInfoList(List<GpxUiHelper.GPXInfo> gpxInfoList) {
this.gpxInfoList = gpxInfoList;
}
private void setShowCurrentGpx(boolean showCurrentGpx) {
this.showCurrentGpx = showCurrentGpx;
}
private void setCallbackWithObject(CallbackWithObject<GPXUtilities.GPXFile[]> callbackWithObject) {
this.callbackWithObject = callbackWithObject;
}
@Override
public void createMenuItems(Bundle savedInstanceState) {
final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
mainView = View.inflate(new ContextThemeWrapper(getContext(), themeRes),
R.layout.gpx_track_select_dialog, null);
final RecyclerView recyclerView = mainView.findViewById(R.id.gpx_track_list);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
adapter = new GpxTrackAdapter(requireContext(), gpxInfoList, showCurrentGpx);
adapter.setAdapterListener(new GpxTrackAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
if (position != RecyclerView.NO_POSITION) {
SelectGpxTrackBottomSheet.this.onItemClick(position);
}
}
});
recyclerView.setAdapter(adapter);
TextView gpxCounter = mainView.findViewById(R.id.counter);
gpxCounter.setText(String.valueOf(adapter.getItemCount()));
items.add(new BaseBottomSheetItem.Builder().setCustomView(mainView).create());
}
private void onItemClick(int position) {
if (position != -1 && position < gpxInfoList.size()) {
OsmandApplication app = (OsmandApplication) requireActivity().getApplication();
if (showCurrentGpx && position == 0) {
callbackWithObject.processResult(null);
app.getSettings().LAST_SELECTED_GPX_TRACK_FOR_NEW_POINT.set(null);
} else {
String fileName = gpxInfoList.get(position).getFileName();
app.getSettings().LAST_SELECTED_GPX_TRACK_FOR_NEW_POINT.set(fileName);
GpxSelectionHelper.SelectedGpxFile selectedGpxFile =
app.getSelectedGpxHelper().getSelectedFileByName(fileName);
if (selectedGpxFile != null) {
callbackWithObject.processResult(new GPXUtilities.GPXFile[]{selectedGpxFile.getGpxFile()});
} else {
File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR);
Activity activity = getActivity();
if (activity != null) {
GpxUiHelper.loadGPXFileInDifferentThread(activity, callbackWithObject, dir, null, fileName);
}
}
}
}
dismiss();
}
public static void showInstance(FragmentManager fragmentManager, boolean showCurrentGpx,
CallbackWithObject<GPXUtilities.GPXFile[]> callbackWithObject, List<GpxUiHelper.GPXInfo> gpxInfoList) {
if (!fragmentManager.isStateSaved()) {
SelectGpxTrackBottomSheet fragment = new SelectGpxTrackBottomSheet();
fragment.setUsedOnMap(true);
fragment.setRetainInstance(true);
fragment.setShowCurrentGpx(showCurrentGpx);
fragment.setCallbackWithObject(callbackWithObject);
fragment.setGpxInfoList(gpxInfoList);
fragment.show(fragmentManager, SelectGpxTrackBottomSheet.TAG);
}
}
@Override
protected int getDismissButtonTextId() {
return R.string.shared_string_cancel;
}
}

View file

@ -47,6 +47,7 @@ import net.osmand.plus.mapcontextmenu.editors.RtePtEditor;
import net.osmand.plus.mapcontextmenu.editors.WptPtEditor;
import net.osmand.plus.mapcontextmenu.other.MapMultiSelectionMenu;
import net.osmand.plus.mapcontextmenu.other.ShareMenu;
import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment.ContextMenuItemClickListener;
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.transport.TransportStopRoute;
@ -1061,16 +1062,32 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
}
}
public void buttonMorePressed() {
public ContextMenuAdapter getActionsContextMenuAdapter(boolean all) {
MapActivity mapActivity = getMapActivity();
final ContextMenuAdapter menuAdapter = new ContextMenuAdapter(getMyApplication());
if (mapActivity != null) {
final ContextMenuAdapter menuAdapter = new ContextMenuAdapter();
LatLon latLon = getLatLon();
for (OsmandMapLayer layer : mapActivity.getMapView().getLayers()) {
layer.populateObjectContextMenu(latLon, getObject(), menuAdapter, mapActivity);
}
mapActivity.getMapActions().addActionsToAdapter(all ? 0 : latLon.getLatitude(), all ? 0 : latLon.getLatitude(), menuAdapter, getObject(), all);
}
return menuAdapter;
}
mapActivity.getMapActions().contextMenuPoint(latLon.getLatitude(), latLon.getLongitude(), menuAdapter, getObject());
public ContextMenuItemClickListener getContextMenuItemClickListener(ContextMenuAdapter menuAdapter) {
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
LatLon latLon = getLatLon();
return mapActivity.getMapActions().getContextMenuItemClickListener(latLon.getLatitude(), latLon.getLatitude(), menuAdapter);
}
return null;
}
public void showAdditionalActionsFragment(final ContextMenuAdapter adapter, ContextMenuItemClickListener listener) {
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
mapActivity.getMapActions().showAdditionalActionsFragment(adapter, listener);
}
}

View file

@ -51,6 +51,8 @@ import net.osmand.data.QuadPoint;
import net.osmand.data.QuadRect;
import net.osmand.data.RotatedTileBox;
import net.osmand.data.TransportRoute;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.LockableScrollView;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
@ -68,6 +70,7 @@ import net.osmand.plus.mapcontextmenu.MenuController.MenuState;
import net.osmand.plus.mapcontextmenu.MenuController.TitleButtonController;
import net.osmand.plus.mapcontextmenu.MenuController.TitleProgressController;
import net.osmand.plus.mapcontextmenu.controllers.TransportStopController;
import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment.ContextMenuItemClickListener;
import net.osmand.plus.routepreparationmenu.ChooseRouteFragment;
import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu;
import net.osmand.plus.transport.TransportStopRoute;
@ -83,6 +86,7 @@ import net.osmand.util.Algorithms;
import java.util.ArrayList;
import java.util.List;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_MORE_ID;
import static net.osmand.plus.mapcontextmenu.MenuBuilder.SHADOW_HEIGHT_TOP_DP;
@ -547,7 +551,7 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
View buttonsTopBorder = view.findViewById(R.id.buttons_top_border);
buttonsBottomBorder.setBackgroundColor(ContextCompat.getColor(mapActivity, nightMode ? R.color.ctx_menu_buttons_divider_dark : R.color.ctx_menu_buttons_divider_light));
buttonsTopBorder.setBackgroundColor(ContextCompat.getColor(mapActivity, nightMode ? R.color.ctx_menu_buttons_divider_dark : R.color.ctx_menu_buttons_divider_light));
View buttons = view.findViewById(R.id.context_menu_buttons);
LinearLayout buttons = view.findViewById(R.id.context_menu_buttons);
buttons.setBackgroundColor(ContextCompat.getColor(mapActivity, nightMode ? R.color.list_background_color_dark : R.color.activity_background_color_light));
if (!menu.buttonsVisible()) {
buttonsTopBorder.setVisibility(View.GONE);
@ -560,59 +564,31 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
}
// Action buttons
final ImageView imageFavorite = (ImageView) view.findViewById(R.id.context_menu_fav_image_view);
imageFavorite.setImageDrawable(getIcon(menu.getFavActionIconId(),
R.color.ctx_menu_buttons_icon_color));
((TextView) view.findViewById(R.id.context_menu_fav_text_view)).setText(menu.getFavActionStringId());
View favView = view.findViewById(R.id.context_menu_fav_view);
if (menu.isFavButtonEnabled()) {
favView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
menu.buttonFavoritePressed();
}
});
// TODO refactor section
ContextMenuAdapter adapter = menu.getActionsContextMenuAdapter(false);
List<ContextMenuItem> items = adapter.getItems();
ContextMenuAdapter mainAdapter = new ContextMenuAdapter(requireMyApplication());
ContextMenuAdapter additionalAdapter = new ContextMenuAdapter(requireMyApplication());
for (int i = 0; i < items.size(); i++) {
if (i < 4) {
mainAdapter.addItem(items.get(i));
} else {
deactivate(favView);
additionalAdapter.addItem(items.get(i));
}
}
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
1f
);
buttons.removeAllViews();
ContextMenuItemClickListener mainListener = menu.getContextMenuItemClickListener(mainAdapter);
ContextMenuItemClickListener additionalListener = menu.getContextMenuItemClickListener(additionalAdapter);
final ImageView imageWaypoint = (ImageView) view.findViewById(R.id.context_menu_route_image_view);
imageWaypoint.setImageDrawable(getIcon(menu.getWaypointActionIconId(),
R.color.ctx_menu_buttons_icon_color));
((TextView) view.findViewById(R.id.context_menu_route_text_view)).setText(menu.getWaypointActionStringId());
View waypointView = view.findViewById(R.id.context_menu_route_view);
if (menu.isButtonWaypointEnabled()) {
waypointView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
menu.buttonWaypointPressed();
for (int i = 0; i < 4; i++) {
buttons.addView(getActionView(items.get(i), i, mainAdapter, additionalAdapter, mainListener, additionalListener), params);
}
});
} else {
deactivate(waypointView);
}
final ImageView imageShare = (ImageView) view.findViewById(R.id.context_menu_share_image_view);
imageShare.setImageDrawable(getIcon(R.drawable.map_action_gshare_dark,
R.color.ctx_menu_buttons_icon_color));
View shareView = view.findViewById(R.id.context_menu_share_view);
shareView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
menu.buttonSharePressed();
}
});
final ImageView imageMore = (ImageView) view.findViewById(R.id.context_menu_more_image_view);
imageMore.setImageDrawable(getIcon(R.drawable.map_overflow_menu_white,
R.color.ctx_menu_buttons_icon_color));
View moreView = view.findViewById(R.id.context_menu_more_view);
moreView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
menu.buttonMorePressed();
}
});
buttons.setGravity(Gravity.CENTER);
//Bottom buttons
int bottomButtonsColor = nightMode ? R.color.ctx_menu_controller_button_text_color_dark_n : R.color.ctx_menu_controller_button_text_color_light_n;
@ -671,6 +647,38 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
return view;
}
private View getActionView(ContextMenuItem contextMenuItem,
final int position,
final ContextMenuAdapter mainAdapter,
final ContextMenuAdapter additionalAdapter,
final ContextMenuItemClickListener mainListener,
final ContextMenuItemClickListener additionalListener) {
UiUtilities uiUtilities = requireMyApplication().getUIUtilities();
LayoutInflater inflater = UiUtilities.getInflater(getMyApplication(), nightMode);
View view = inflater.inflate(R.layout.context_menu_action_item, null);
LinearLayout item = view.findViewById(R.id.item);
ImageView icon = view.findViewById(R.id.icon);
TextView title = view.findViewById(R.id.text);
icon.setImageDrawable(uiUtilities.getIcon(contextMenuItem.getIcon(), nightMode));
title.setText(contextMenuItem.getTitle());
if (contextMenuItem.getId().equals(MAP_CONTEXT_MENU_MORE_ID)) {
item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
menu.showAdditionalActionsFragment(additionalAdapter, additionalListener);
}
});
} else {
item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mainListener.onItemClick(position);
}
});
}
return view;
}
@Nullable
private TransportStopRouteAdapter createTransportStopRouteAdapter(List<TransportStopRoute> routes, boolean needMoreItem) {
OsmandApplication app = getMyApplication();
@ -1377,11 +1385,6 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
public void rebuildMenu(boolean centered) {
OsmandApplication app = getMyApplication();
if (app != null && view != null) {
final ImageView buttonFavorite = (ImageView) view.findViewById(R.id.context_menu_fav_image_view);
buttonFavorite.setImageDrawable(getIcon(menu.getFavActionIconId(), R.color.ctx_menu_buttons_icon_color));
String favActionString = getString(menu.getFavActionStringId());
((TextView) view.findViewById(R.id.context_menu_fav_text_view)).setText(favActionString);
buildHeader();
LinearLayout bottomLayout = (LinearLayout) view.findViewById(R.id.context_menu_bottom_view);

View file

@ -625,6 +625,7 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
}
public void dismiss(boolean includingMenu) {
hideKeyboard();
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
if (includingMenu) {

View file

@ -84,7 +84,7 @@ public class RoutePreferencesMenu {
Object obj = listAdapter.getItem(item);
if (obj instanceof LocalRoutingParameterGroup) {
final LocalRoutingParameterGroup group = (LocalRoutingParameterGroup) obj;
final ContextMenuAdapter adapter = new ContextMenuAdapter();
final ContextMenuAdapter adapter = new ContextMenuAdapter(app);
int i = 0;
int selectedIndex = -1;
for (LocalRoutingParameter p : group.getRoutingParameters()) {

View file

@ -475,7 +475,7 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
((FavoritesActivity) getActivity()).updateListViewFooter(footerView);
// TODO Rewrite without ContextMenuAdapter
optionsMenuAdapter = new ContextMenuAdapter();
optionsMenuAdapter = new ContextMenuAdapter(app);
ItemClickListener listener = new ContextMenuAdapter.ItemClickListener() {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, final int itemId, int pos, boolean isChecked, int[] viewCoordinates) {
@ -760,7 +760,7 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
private void moveGpx(final GpxInfo info) {
final ContextMenuAdapter menuAdapter = new ContextMenuAdapter();
final ContextMenuAdapter menuAdapter = new ContextMenuAdapter(app);
ContextMenuItem.ItemBuilder itemBuilder = new ContextMenuItem.ItemBuilder();
final List<File> dirs = new ArrayList<>();

View file

@ -26,7 +26,7 @@ public class OsmNotesMenu {
private static Integer[] zoomIntValues = {8, 9, 10, 11, 12, 13, 14, 15, 16};
public static ContextMenuAdapter createListAdapter(final MapActivity mapActivity) {
ContextMenuAdapter adapter = new ContextMenuAdapter();
ContextMenuAdapter adapter = new ContextMenuAdapter(mapActivity.getMyApplication());
boolean nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls();
adapter.setDefaultLayoutId(R.layout.list_item_icon_and_menu);
adapter.setProfileDependent(true);

View file

@ -8,6 +8,7 @@ import net.osmand.osm.AbstractPoiType;
import net.osmand.osm.MapPoiTypes;
import net.osmand.osm.PoiCategory;
import net.osmand.osm.PoiType;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
@ -26,7 +27,6 @@ import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
@ -313,17 +313,21 @@ public class PoiFiltersHelper {
return result;
}
public Map<String, Integer> getPoiFilterOrders(boolean onlyActive) {
Map<String, Integer> filterOrders = new HashMap<>();
List<PoiUIFilter> sortedFilters = getSortedPoiFilters(onlyActive);
for (PoiUIFilter filter : sortedFilters) {
filterOrders.put(filter.getFilterId(), filter.getOrder());
public List<String> getPoiFilterOrders(boolean onlyActive) {
List<String> filterOrders = new ArrayList<>();
for (PoiUIFilter filter : getSortedPoiFilters(onlyActive)) {
filterOrders.add(filter.getFilterId());
}
return filterOrders;
}
public List<PoiUIFilter> getSortedPoiFilters(boolean onlyActive) {
initPoiUIFiltersState();
ApplicationMode selectedAppMode = application.getSettings().getApplicationMode();
return getSortedPoiFilters(selectedAppMode, onlyActive);
}
public List<PoiUIFilter> getSortedPoiFilters(@NonNull ApplicationMode appMode, boolean onlyActive) {
initPoiUIFiltersState(appMode);
List<PoiUIFilter> allFilters = new ArrayList<>();
for (PoiUIFilter filter : getTopDefinedPoiFilters()) {
if (!filter.isWikiFilter()) {
@ -345,13 +349,13 @@ public class PoiFiltersHelper {
}
}
private void initPoiUIFiltersState() {
private void initPoiUIFiltersState(@NonNull ApplicationMode appMode) {
List<PoiUIFilter> allFilters = new ArrayList<>();
allFilters.addAll(getTopDefinedPoiFilters());
allFilters.addAll(getSearchPoiFilters());
refreshPoiFiltersActivation(allFilters);
refreshPoiFiltersOrder(allFilters);
refreshPoiFiltersActivation(appMode, allFilters);
refreshPoiFiltersOrder(appMode, allFilters);
//set up the biggest order to custom filter
PoiUIFilter customFilter = getCustomPOIFilter();
@ -359,8 +363,9 @@ public class PoiFiltersHelper {
customFilter.setOrder(allFilters.size());
}
private void refreshPoiFiltersOrder(List<PoiUIFilter> filters) {
Map<String, Integer> orders = getPoiFiltersOrder();
private void refreshPoiFiltersOrder(@NonNull ApplicationMode appMode,
List<PoiUIFilter> filters) {
Map<String, Integer> orders = getPoiFiltersOrder(appMode);
List<PoiUIFilter> existedFilters = new ArrayList<>();
List<PoiUIFilter> newFilters = new ArrayList<>();
if (orders != null) {
@ -392,8 +397,9 @@ public class PoiFiltersHelper {
}
}
private void refreshPoiFiltersActivation(List<PoiUIFilter> filters) {
List<String> inactiveFiltersIds = getInactivePoiFiltersIds();
private void refreshPoiFiltersActivation(@NonNull ApplicationMode appMode,
List<PoiUIFilter> filters) {
List<String> inactiveFiltersIds = getInactivePoiFiltersIds(appMode);
if (inactiveFiltersIds != null) {
for (PoiUIFilter filter : filters) {
filter.setActive(!inactiveFiltersIds.contains(filter.getFilterId()));
@ -405,16 +411,16 @@ public class PoiFiltersHelper {
}
}
public void saveFiltersOrder(List<String> filterIds) {
application.getSettings().POI_FILTERS_ORDER.setStringsList(filterIds);
public void saveFiltersOrder(ApplicationMode appMode, List<String> filterIds) {
application.getSettings().POI_FILTERS_ORDER.setStringsListForProfile(appMode, filterIds);
}
public void saveInactiveFilters(List<String> filterIds) {
application.getSettings().INACTIVE_POI_FILTERS.setStringsList(filterIds);
public void saveInactiveFilters(ApplicationMode appMode, List<String> filterIds) {
application.getSettings().INACTIVE_POI_FILTERS.setStringsListForProfile(appMode, filterIds);
}
public Map<String, Integer> getPoiFiltersOrder() {
List<String> ids = application.getSettings().POI_FILTERS_ORDER.getStringsList();
public Map<String, Integer> getPoiFiltersOrder(@NonNull ApplicationMode appMode) {
List<String> ids = application.getSettings().POI_FILTERS_ORDER.getStringsListForProfile(appMode);
if (ids == null) {
return null;
}
@ -425,8 +431,8 @@ public class PoiFiltersHelper {
return result;
}
public List<String> getInactivePoiFiltersIds() {
return application.getSettings().INACTIVE_POI_FILTERS.getStringsList();
public List<String> getInactivePoiFiltersIds(@NonNull ApplicationMode appMode) {
return application.getSettings().INACTIVE_POI_FILTERS.getStringsListForProfile(appMode);
}
private PoiFilterDbHelper openDbHelperNoPois() {

View file

@ -3,6 +3,8 @@ package net.osmand.plus.poi;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@ -19,16 +21,20 @@ import androidx.core.content.ContextCompat;
import androidx.core.view.MotionEventCompat;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.appbar.AppBarLayout;
import net.osmand.AndroidUtils;
import net.osmand.CallbackWithObject;
import net.osmand.PlatformUtil;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.profiles.SelectAppModesBottomSheetDialogFragment;
import net.osmand.plus.render.RenderingIcons;
import net.osmand.plus.views.controls.ReorderItemTouchHelperCallback;
@ -45,14 +51,14 @@ import static net.osmand.plus.poi.RearrangePoiFiltersFragment.ItemType.DESCRIPTI
import static net.osmand.plus.poi.RearrangePoiFiltersFragment.ItemType.POI;
import static net.osmand.plus.poi.RearrangePoiFiltersFragment.ItemType.SPACE;
public class RearrangePoiFiltersFragment extends DialogFragment {
public class RearrangePoiFiltersFragment extends DialogFragment implements SelectAppModesBottomSheetDialogFragment.AppModeChangedListener {
public static final String TAG = "RearrangePoiFiltersFragment";
private static final Log LOG = PlatformUtil.getLog(RearrangePoiFiltersFragment.class);
private boolean usedOnMap;
private CallbackWithObject<Boolean> resultCallback;
private OnApplyPoiFiltersState resultCallback;
private List<ListItem> items = new ArrayList<>();
private EditPoiFiltersAdapter adapter;
@ -60,6 +66,7 @@ public class RearrangePoiFiltersFragment extends DialogFragment {
private boolean activationModified;
private boolean wasReset = false;
private boolean isChanged = false;
private ApplicationMode appMode;
private HashMap<String, Integer> poiFiltersOrders = new HashMap<>();
private List<String> availableFiltersKeys = new ArrayList<>();
@ -72,6 +79,20 @@ public class RearrangePoiFiltersFragment extends DialogFragment {
setStyle(STYLE_NO_FRAME, themeId);
}
@Override
public void onPause() {
super.onPause();
if (requireActivity().isChangingConfigurations()) {
dismiss();
}
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
updateProfileButton();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@ -80,17 +101,7 @@ public class RearrangePoiFiltersFragment extends DialogFragment {
boolean nightMode = isNightMode(app, usedOnMap);
View mainView = UiUtilities.getInflater(app, nightMode).inflate(R.layout.edit_arrangement_list_fragment, container, false);
ImageButton closeButton = mainView.findViewById(R.id.close_button);
closeButton.setImageResource(R.drawable.ic_action_remove_dark);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
TextView toolbarTitle = mainView.findViewById(R.id.toolbar_title);
toolbarTitle.setText(R.string.rearrange_categories);
createToolbar(mainView, nightMode);
RecyclerView recyclerView = mainView.findViewById(R.id.profiles_list);
recyclerView.setLayoutManager(new LinearLayoutManager(app));
@ -159,15 +170,16 @@ public class RearrangePoiFiltersFragment extends DialogFragment {
applyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ApplicationMode selectedAppMode = getSelectedAppMode();
if (isChanged) {
if (activationModified) {
app.getPoiFilters().saveInactiveFilters(availableFiltersKeys);
app.getPoiFilters().saveInactiveFilters(selectedAppMode, availableFiltersKeys);
} else if (wasReset) {
app.getPoiFilters().saveInactiveFilters(null);
app.getPoiFilters().saveInactiveFilters(selectedAppMode, null);
}
if (orderModified) {
List<PoiUIFilter> dataToSave = new ArrayList<>();
for (PoiUIFilter filter : getSortedPoiUiFilters(app)) {
for (PoiUIFilter filter : getSortedPoiUiFilters(selectedAppMode, app)) {
String filterId = filter.getFilterId();
Integer order = poiFiltersOrders.get(filterId);
if (order == null) {
@ -185,13 +197,13 @@ public class RearrangePoiFiltersFragment extends DialogFragment {
for (PoiUIFilter filter : dataToSave) {
filterIds.add(filter.getFilterId());
}
app.getPoiFilters().saveFiltersOrder(filterIds);
app.getPoiFilters().saveFiltersOrder(selectedAppMode, filterIds);
} else if (wasReset) {
app.getPoiFilters().saveFiltersOrder(null);
app.getPoiFilters().saveFiltersOrder(selectedAppMode,null);
}
}
if (resultCallback != null) {
resultCallback.processResult(isChanged);
resultCallback.onApplyPoiFiltersState(selectedAppMode, isChanged);
}
dismiss();
}
@ -200,10 +212,84 @@ public class RearrangePoiFiltersFragment extends DialogFragment {
return mainView;
}
private void createToolbar(View mainView, boolean nightMode) {
AppBarLayout appbar = mainView.findViewById(R.id.appbar);
View toolbar = UiUtilities.getInflater(getContext(), nightMode).inflate(R.layout.profile_preference_toolbar_with_icon, appbar, false);
ImageButton closeButton = toolbar.findViewById(R.id.close_button);
closeButton.setImageResource(R.drawable.ic_action_remove_dark);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
TextView toolbarTitle = toolbar.findViewById(R.id.toolbar_title);
toolbarTitle.setText(R.string.rearrange_categories);
View switchProfile = toolbar.findViewById(R.id.profile_button);
if (switchProfile != null) {
switchProfile.setContentDescription(getString(R.string.switch_profile));
switchProfile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager != null) {
SelectAppModesBottomSheetDialogFragment.showInstance(fragmentManager,
RearrangePoiFiltersFragment.this, false, getSelectedAppMode(), false);
}
}
});
}
appbar.addView(toolbar);
}
protected void updateProfileButton() {
View view = getView();
if (view == null) {
return;
}
OsmandApplication app = requireMyApplication();
UiUtilities uiUtilities = app.getUIUtilities();
ApplicationMode selectedAppMode = getSelectedAppMode();
boolean nightMode = isNightMode(app, usedOnMap);
ImageView profileIcon = (ImageView) view.findViewById(R.id.profile_icon);
if (profileIcon != null) {
int iconRes = selectedAppMode.getIconRes();
int iconColor = selectedAppMode.getIconColorInfo().getColor(nightMode);
profileIcon.setImageDrawable(uiUtilities.getPaintedIcon(iconRes, iconColor));
}
View profileButton = view.findViewById(R.id.profile_button);
if (profileButton != null) {
int iconColor = getSelectedAppMode().getIconColorInfo().getColor(nightMode);
int bgColor = ContextCompat.getColor(app, nightMode ?
R.color.divider_color_dark : R.color.active_buttons_and_links_text_light);
int selectedColor = UiUtilities.getColorWithAlpha(iconColor, 0.3f);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
int bgResId = R.drawable.circle_background_light;
int selectableResId = R.drawable.ripple_circle;
Drawable bgDrawable = uiUtilities.getPaintedIcon(bgResId, bgColor);
Drawable selectable = uiUtilities.getPaintedIcon(selectableResId, selectedColor);
Drawable[] layers = {bgDrawable, selectable};
AndroidUtils.setBackground(profileButton, new LayerDrawable(layers));
} else {
int bgResId = R.drawable.circle_background_light;
Drawable bgDrawable = uiUtilities.getPaintedIcon(bgResId, bgColor);
AndroidUtils.setBackground(profileButton, bgDrawable);
}
}
}
private void initFiltersOrders(OsmandApplication app, boolean arrangementByDefault) {
poiFiltersOrders.clear();
availableFiltersKeys.clear();
List<PoiUIFilter> filters = getSortedPoiUiFilters(app);
ApplicationMode selectedAppMode = getSelectedAppMode();
List<PoiUIFilter> filters = getSortedPoiUiFilters(selectedAppMode, app);
if (arrangementByDefault) {
Collections.sort(filters, new Comparator<PoiUIFilter>() {
@Override
@ -272,21 +358,35 @@ public class RearrangePoiFiltersFragment extends DialogFragment {
adapter.setItems(items);
}
public static void showInstance(@NonNull DialogFragment parentFragment, boolean usedOnMap, CallbackWithObject<Boolean> callback) {
public static void showInstance(@NonNull ApplicationMode appMode, @NonNull DialogFragment parentFragment,
boolean usedOnMap, OnApplyPoiFiltersState callback) {
try {
RearrangePoiFiltersFragment fragment = new RearrangePoiFiltersFragment();
fragment.setUsedOnMap(usedOnMap);
fragment.setResultCallback(callback);
fragment.setSelectedAppMode(appMode);
fragment.show(parentFragment.getChildFragmentManager(), RearrangePoiFiltersFragment.TAG);
} catch (RuntimeException e) {
LOG.error("showInstance", e);
}
}
public ApplicationMode getSelectedAppMode() {
if (appMode == null) {
appMode = requireMyApplication().getSettings().getApplicationMode();
}
return appMode;
}
public void setSelectedAppMode(ApplicationMode appMode) {
this.appMode = appMode;
}
public List<ListItem> getPoiFilters(boolean isActive) {
OsmandApplication app = requireMyApplication();
ApplicationMode selectedAppMode = getSelectedAppMode();
List<ListItem> result = new ArrayList<>();
for (PoiUIFilter f : getSortedPoiUiFilters(app)) {
for (PoiUIFilter f : getSortedPoiUiFilters(selectedAppMode, app)) {
addFilterToList(result, f, isActive);
}
Collections.sort(result, new Comparator<ListItem>() {
@ -322,8 +422,9 @@ public class RearrangePoiFiltersFragment extends DialogFragment {
}
}
private static List<PoiUIFilter> getSortedPoiUiFilters(@NonNull OsmandApplication app) {
List<PoiUIFilter> filters = app.getPoiFilters().getSortedPoiFilters(false);
private static List<PoiUIFilter> getSortedPoiUiFilters(@NonNull ApplicationMode appMode,
@NonNull OsmandApplication app) {
List<PoiUIFilter> filters = app.getPoiFilters().getSortedPoiFilters(appMode, false);
//remove custom filter
for (int i = filters.size() - 1; i >= 0; i--) {
PoiUIFilter filter = filters.get(i);
@ -339,7 +440,7 @@ public class RearrangePoiFiltersFragment extends DialogFragment {
this.usedOnMap = usedOnMap;
}
public void setResultCallback(CallbackWithObject<Boolean> resultCallback) {
public void setResultCallback(OnApplyPoiFiltersState resultCallback) {
this.resultCallback = resultCallback;
}
@ -356,6 +457,13 @@ public class RearrangePoiFiltersFragment extends DialogFragment {
return false;
}
@Override
public void onAppModeChanged(ApplicationMode appMode) {
this.appMode = appMode;
updateProfileButton();
initFiltersOrders(requireMyApplication(), false);
}
public class PoiUIFilterDataObject {
String filterId;
String name;
@ -693,4 +801,8 @@ public class RearrangePoiFiltersFragment extends DialogFragment {
void onButtonClicked(int view);
}
public interface OnApplyPoiFiltersState {
void onApplyPoiFiltersState(ApplicationMode mode, boolean stateChanged);
}
}

View file

@ -22,6 +22,8 @@ import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.appbar.AppBarLayout;
import net.osmand.AndroidUtils;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmandApplication;
@ -67,6 +69,11 @@ public class EditProfilesFragment extends BaseOsmAndFragment {
nightMode = !app.getSettings().isLightContent();
View mainView = UiUtilities.getInflater(getContext(), nightMode).inflate(R.layout.edit_arrangement_list_fragment, container, false);
AppBarLayout appbar = mainView.findViewById(R.id.appbar);
View toolbar = UiUtilities.getInflater(getContext(), nightMode).inflate(R.layout.global_preference_toolbar, container, false);
appbar.addView(toolbar);
ImageButton closeButton = mainView.findViewById(R.id.close_button);
closeButton.setImageResource(R.drawable.ic_action_remove_dark);
closeButton.setOnClickListener(new View.OnClickListener() {

View file

@ -288,7 +288,7 @@ public class ShowHidePoiAction extends QuickAction {
private void showSingleChoicePoiFilterDialog(final OsmandApplication app, final MapActivity activity, final Adapter filtersAdapter) {
final PoiFiltersHelper poiFilters = app.getPoiFilters();
final ContextMenuAdapter adapter = new ContextMenuAdapter();
final ContextMenuAdapter adapter = new ContextMenuAdapter(app);
final List<PoiUIFilter> list = new ArrayList<>();

View file

@ -113,7 +113,7 @@ public class RoutingOptionsHelper {
}
public void selectVoiceGuidance(final MapActivity mapActivity, final CallbackWithObject<String> callback, ApplicationMode applicationMode) {
final ContextMenuAdapter adapter = new ContextMenuAdapter();
final ContextMenuAdapter adapter = new ContextMenuAdapter(app);
String[] entries;
final String[] entrieValues;
@ -310,7 +310,7 @@ public class RoutingOptionsHelper {
public void showLocalRoutingParameterGroupDialog(final LocalRoutingParameterGroup group, final MapActivity mapActivity, final OnClickListener listener) {
OsmandSettings settings = app.getSettings();
final ContextMenuAdapter adapter = new ContextMenuAdapter();
final ContextMenuAdapter adapter = new ContextMenuAdapter(app);
int i = 0;
int selectedIndex = -1;
for (LocalRoutingParameter p : group.getRoutingParameters()) {

View file

@ -5,6 +5,7 @@ import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
@ -14,6 +15,7 @@ import android.text.SpannableString;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.ForegroundColorSpan;
import android.text.style.StyleSpan;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
@ -44,10 +46,10 @@ import androidx.fragment.app.FragmentPagerAdapter;
import androidx.fragment.app.FragmentTransaction;
import androidx.viewpager.widget.ViewPager;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.tabs.TabLayout;
import net.osmand.AndroidUtils;
import net.osmand.CallbackWithObject;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.WptPt;
@ -66,6 +68,7 @@ import net.osmand.osm.PoiCategory;
import net.osmand.osm.PoiType;
import net.osmand.plus.AppInitializer;
import net.osmand.plus.AppInitializer.AppInitializeListener;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.LockableViewPager;
import net.osmand.plus.OsmAndFormatter;
@ -74,6 +77,7 @@ import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.Version;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.MapActivity.ShowQuickSearchMode;
@ -1238,15 +1242,40 @@ public class QuickSearchDialogFragment extends DialogFragment implements OsmAndC
app.getString(R.string.rearrange_categories), new OnClickListener() {
@Override
public void onClick(View v) {
RearrangePoiFiltersFragment.showInstance(QuickSearchDialogFragment.this, false, new CallbackWithObject<Boolean>() {
ApplicationMode appMode = app.getSettings().getApplicationMode();
RearrangePoiFiltersFragment.showInstance(appMode, QuickSearchDialogFragment.this, false,
new RearrangePoiFiltersFragment.OnApplyPoiFiltersState() {
@Override
public boolean processResult(Boolean changed) {
if (changed) {
public void onApplyPoiFiltersState(final ApplicationMode appMode, boolean stateChanged) {
if (stateChanged) {
searchHelper.refreshFilterOrders();
reloadCategoriesInternal();
}
return false;
View containerView = getView();
if (containerView != null) {
//show "Apply to all profiles" SnackBar
String modeName = appMode.toHumanString();
String text = app.getString(R.string.changes_applied_to_profile, modeName);
SpannableString message = UiUtilities.createSpannableString(text, modeName, new StyleSpan(Typeface.BOLD));
Snackbar snackbar = Snackbar.make(containerView, message, Snackbar.LENGTH_LONG)
.setAction(R.string.apply_to_all_profiles, new View.OnClickListener() {
@Override
public void onClick(View view) {
OsmandSettings settings = app.getSettings();
String orders = settings.POI_FILTERS_ORDER.getModeValue(appMode);
String inactive = settings.INACTIVE_POI_FILTERS.getModeValue(appMode);
for (ApplicationMode mode : ApplicationMode.allPossibleValues()) {
settings.POI_FILTERS_ORDER.setModeValue(mode, orders);
settings.INACTIVE_POI_FILTERS.setModeValue(mode, inactive);
}
searchHelper.refreshFilterOrders();
reloadCategoriesInternal();
}
});
UiUtilities.setupSnackbarVerticalLayout(snackbar);
snackbar.show();
}
}
});
}

View file

@ -940,9 +940,6 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl
}
});
UiUtilities.setupSnackbarVerticalLayout(snackbar);
try {
snackbar.setAnimationMode(BaseTransientBottomBar.ANIMATION_MODE_FADE);
} catch (Throwable e) { }
snackbar.show();
}
}

View file

@ -0,0 +1,473 @@
package net.osmand.plus.settings;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.AndroidUtils;
import net.osmand.PlatformUtil;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.MapActivityActions;
import net.osmand.plus.base.BaseOsmAndFragment;
import net.osmand.plus.dialogs.ConfigureMapMenu;
import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.profiles.SelectCopyAppModeBottomSheet;
import net.osmand.plus.settings.ConfigureMenuRootFragment.ScreenType;
import net.osmand.plus.settings.bottomsheets.ChangeGeneralProfilesPrefBottomSheet;
import net.osmand.plus.views.controls.ReorderItemTouchHelperCallback;
import net.osmand.plus.settings.RearrangeMenuItemsAdapter.RearrangeMenuAdapterItem;
import net.osmand.plus.settings.RearrangeMenuItemsAdapter.MenuItemsAdapterListener;
import org.apache.commons.logging.Log;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_MORE_ID;
import static net.osmand.plus.settings.RearrangeMenuItemsAdapter.AdapterItemType.BUTTON;
import static net.osmand.plus.settings.RearrangeMenuItemsAdapter.AdapterItemType.DESCRIPTION;
import static net.osmand.plus.settings.RearrangeMenuItemsAdapter.AdapterItemType.DIVIDER;
import static net.osmand.plus.settings.RearrangeMenuItemsAdapter.AdapterItemType.HEADER;
import static net.osmand.plus.settings.RearrangeMenuItemsAdapter.AdapterItemType.MENU_ITEM;
public class ConfigureMenuItemsFragment extends BaseOsmAndFragment
implements SelectCopyAppModeBottomSheet.CopyAppModePrefsListener {
public static final String TAG = ConfigureMenuItemsFragment.class.getName();
public static final int MAIN_BUTTONS_QUANTITY = 4;
private static final Log LOG = PlatformUtil.getLog(ConfigureMenuItemsFragment.class.getName());
private static final String APP_MODE_KEY = "app_mode_key";
private static final String ITEM_TYPE_KEY = "item_type_key";
private static final String ITEMS_ORDER_KEY = "items_order_key";
private static final String HIDDEN_ITEMS_KEY = "hidden_items_key";
private static final String CONFIGURE_MENU_ITEMS_TAG = "configure_menu_items_tag";
private RearrangeMenuItemsAdapter rearrangeAdapter;
private HashMap<String, Integer> menuItemsOrder;
private ContextMenuAdapter contextMenuAdapter;
private List<String> hiddenMenuItems;
private ApplicationMode appMode;
private LayoutInflater mInflater;
private OsmandApplication app;
private ScreenType screenType;
private boolean nightMode;
private boolean wasReset = false;
private boolean isChanged = false;
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putStringArrayList(HIDDEN_ITEMS_KEY, new ArrayList<>(hiddenMenuItems));
outState.putSerializable(ITEMS_ORDER_KEY, menuItemsOrder);
outState.putSerializable(ITEM_TYPE_KEY, screenType);
outState.putString(APP_MODE_KEY, appMode.getStringKey());
}
public static ConfigureMenuItemsFragment showInstance(
@NonNull FragmentManager fm,
@NonNull ApplicationMode appMode,
@NonNull ScreenType type) {
ConfigureMenuItemsFragment fragment = new ConfigureMenuItemsFragment();
fragment.setScreenType(type);
fragment.setAppMode(appMode);
fm.beginTransaction()
.replace(R.id.fragmentContainer, fragment, TAG)
.addToBackStack(CONFIGURE_MENU_ITEMS_TAG)
.commitAllowingStateLoss();
return fragment;
}
public void setAppMode(ApplicationMode appMode) {
this.appMode = appMode;
}
public ApplicationMode getAppMode() {
return appMode != null ? appMode : app.getSettings().getApplicationMode();
}
@Override
public int getStatusBarColorId() {
View view = getView();
if (view != null && Build.VERSION.SDK_INT >= 23 && !nightMode) {
view.setSystemUiVisibility(view.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
return nightMode ? R.color.activity_background_dark : R.color.activity_background_light;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = requireMyApplication();
nightMode = !app.getSettings().isLightContent();
mInflater = UiUtilities.getInflater(app, nightMode);
instantiateContextMenuAdapter();
if (savedInstanceState != null
&& savedInstanceState.containsKey(ITEM_TYPE_KEY)
&& savedInstanceState.containsKey(HIDDEN_ITEMS_KEY)
&& savedInstanceState.containsKey(ITEMS_ORDER_KEY)) {
appMode = ApplicationMode.valueOfStringKey(savedInstanceState.getString(APP_MODE_KEY), null);
screenType = (ScreenType) savedInstanceState.getSerializable(ITEM_TYPE_KEY);
hiddenMenuItems = savedInstanceState.getStringArrayList(HIDDEN_ITEMS_KEY);
menuItemsOrder = (HashMap<String, Integer>) savedInstanceState.getSerializable(ITEMS_ORDER_KEY);
} else {
hiddenMenuItems = new ArrayList<>(getSettingForScreen(app, screenType).getModeValue(appMode).getHiddenIds());
menuItemsOrder = new HashMap<>();
List<String> orderIds = getSettingForScreen(app, screenType).getModeValue(appMode).getOrderIds();
for (int i = 0; i < orderIds.size(); i++) {
menuItemsOrder.put(orderIds.get(i), i);
}
}
}
private void instantiateContextMenuAdapter() {
Activity activity = getActivity();
if (activity instanceof MapActivity) {
switch (screenType) {
case DRAWER:
MapActivityActions mapActivityActions = new MapActivityActions((MapActivity) activity);
contextMenuAdapter = mapActivityActions.createMainOptionsMenu();
break;
case CONFIGURE_MAP:
ConfigureMapMenu configureMapMenu = new ConfigureMapMenu();
contextMenuAdapter = configureMapMenu.createListAdapter((MapActivity) activity);
break;
case CONTEXT_MENU_ACTIONS:
MapContextMenu menu = ((MapActivity) activity).getContextMenu();
contextMenuAdapter = menu.getActionsContextMenuAdapter(true);
break;
}
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) {
View root = mInflater.inflate(R.layout.edit_arrangement_list_fragment, container, false);
Toolbar toolbar = root.findViewById(R.id.toolbar);
TextView toolbarTitle = root.findViewById(R.id.toolbar_title);
ImageButton toolbarButton = root.findViewById(R.id.close_button);
RecyclerView recyclerView = root.findViewById(R.id.profiles_list);
recyclerView.setPadding(0, 0, 0, (int) app.getResources().getDimension(R.dimen.dialog_button_ex_min_width));
toolbar.setBackgroundColor(nightMode
? getResources().getColor(R.color.list_background_color_dark)
: getResources().getColor(R.color.list_background_color_light));
toolbarTitle.setTextColor(nightMode
? getResources().getColor(R.color.text_color_primary_dark)
: getResources().getColor(R.color.list_background_color_dark));
toolbarButton.setImageDrawable(getPaintedContentIcon(R.drawable.ic_arrow_back, getResources().getColor(R.color.text_color_secondary_light)));
toolbarTitle.setText(screenType.titleRes);
toolbarButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
exitFragment();
}
});
rearrangeAdapter = new RearrangeMenuItemsAdapter(app, getAdapterItems());
recyclerView.setLayoutManager(new LinearLayoutManager(app));
final ItemTouchHelper touchHelper = new ItemTouchHelper(new ReorderItemTouchHelperCallback(rearrangeAdapter));
touchHelper.attachToRecyclerView(recyclerView);
MenuItemsAdapterListener listener = new MenuItemsAdapterListener() {
private int fromPosition;
private int toPosition;
@Override
public void onDragStarted(RecyclerView.ViewHolder holder) {
fromPosition = holder.getAdapterPosition();
touchHelper.startDrag(holder);
}
@Override
public void onDragOrSwipeEnded(RecyclerView.ViewHolder holder) {
toPosition = holder.getAdapterPosition();
if (toPosition >= 0 && fromPosition >= 0 && toPosition != fromPosition) {
rearrangeAdapter.notifyDataSetChanged();
}
}
@Override
public void onButtonClicked(int position) {
RearrangeMenuAdapterItem rearrangeMenuAdapterItem = rearrangeAdapter.getItem(position);
if (rearrangeMenuAdapterItem.getValue() instanceof ContextMenuItem) {
ContextMenuItem menuItemBase = (ContextMenuItem) rearrangeMenuAdapterItem.getValue();
menuItemBase.setHidden(!menuItemBase.isHidden());
if (menuItemBase.isHidden()) {
hiddenMenuItems.add(menuItemBase.getId());
} else {
hiddenMenuItems.remove(menuItemBase.getId());
}
wasReset = false;
isChanged = true;
rearrangeAdapter.updateItems(getAdapterItems());
}
}
@Override
public void onItemMoved(String id, int position) {
menuItemsOrder.put(id, position);
wasReset = false;
isChanged = true;
}
};
rearrangeAdapter.setListener(listener);
recyclerView.setAdapter(rearrangeAdapter);
View cancelButton = root.findViewById(R.id.dismiss_button);
UiUtilities.setupDialogButton(nightMode, cancelButton, UiUtilities.DialogButtonType.SECONDARY, R.string.shared_string_cancel);
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentActivity fragmentActivity = getActivity();
if (fragmentActivity != null) {
fragmentActivity.onBackPressed();
}
}
});
root.findViewById(R.id.buttons_divider).setVisibility(View.VISIBLE);
View applyButton = root.findViewById(R.id.right_bottom_button);
UiUtilities.setupDialogButton(nightMode, applyButton, UiUtilities.DialogButtonType.PRIMARY, R.string.shared_string_apply);
applyButton.setVisibility(View.VISIBLE);
applyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<ContextMenuItem> defItems = contextMenuAdapter.getDefaultItems();
List<String> ids = new ArrayList<>();
if (!menuItemsOrder.isEmpty()) {
sortByCustomOrder(defItems, menuItemsOrder);
for (ContextMenuItem item : defItems) {
ids.add(item.getId());
}
}
FragmentManager fm = getFragmentManager();
OsmandSettings.ContextMenuItemsSettings prefToSave = new OsmandSettings.ContextMenuItemsSettings(hiddenMenuItems, ids);
if (fm != null) {
ChangeGeneralProfilesPrefBottomSheet.showInstance(fm,
getSettingForScreen(app, screenType).getId(),
prefToSave,
getTargetFragment(),
false,
appMode,
new ChangeGeneralProfilesPrefBottomSheet.OnChangeSettingListener() {
@Override
public void onApplied() {
dismissFragment();
}
@Override
public void onDiscard() {
}
});
}
}
});
if (Build.VERSION.SDK_INT >= 21) {
AndroidUtils.addStatusBarPadding21v(app, root);
}
return root;
}
private List<RearrangeMenuAdapterItem> getAdapterItems() {
List<RearrangeMenuAdapterItem> items = new ArrayList<>();
items.add(new RearrangeMenuAdapterItem(DESCRIPTION, screenType));
List<RearrangeMenuAdapterItem> visible = getItemsForRearrangeAdapter(hiddenMenuItems, wasReset ? null : menuItemsOrder, false);
List<RearrangeMenuAdapterItem> hiddenItems = getItemsForRearrangeAdapter(hiddenMenuItems, wasReset ? null : menuItemsOrder, true);
if (screenType == ScreenType.CONTEXT_MENU_ACTIONS) {
for (int i = 0; i < visible.size(); i++) {
ContextMenuItem value = (ContextMenuItem) visible.get(i).getValue();
if (value.getId() != null && value.getId().equals(MAP_CONTEXT_MENU_MORE_ID)) {
int buttonMoreIndex = MAIN_BUTTONS_QUANTITY - 1;
if (i > buttonMoreIndex) {
RearrangeMenuAdapterItem third = visible.get(buttonMoreIndex);
visible.set(buttonMoreIndex, visible.get(i));
menuItemsOrder.put(((ContextMenuItem) third.getValue()).getId(), i);
menuItemsOrder.put(((ContextMenuItem) visible.get(i).getValue()).getId(), buttonMoreIndex);
}
}
}
List<RearrangeMenuAdapterItem> main = new ArrayList<>();
int actionsIndex = Math.min(MAIN_BUTTONS_QUANTITY, visible.size());
for (int i = 0; i < actionsIndex; i++) {
main.add(visible.get(i));
}
items.add(new RearrangeMenuAdapterItem(HEADER, new RearrangeMenuItemsAdapter.HeaderItem(R.string.main_actions, R.string.main_actions_descr)));
items.addAll(main);
items.add(new RearrangeMenuAdapterItem(HEADER, new RearrangeMenuItemsAdapter.HeaderItem(R.string.additional_actions, R.string.additional_actions_descr)));
List<RearrangeMenuAdapterItem> additional = new ArrayList<>();
for (int i = MAIN_BUTTONS_QUANTITY; i < visible.size(); i++) {
additional.add(visible.get(i));
}
items.addAll(additional);
} else {
items.addAll(visible);
}
if (!hiddenItems.isEmpty()) {
items.add(new RearrangeMenuAdapterItem(HEADER, new RearrangeMenuItemsAdapter.HeaderItem(R.string.shared_string_hidden, R.string.hidden_items_descr)));
items.addAll(hiddenItems);
}
items.add(new RearrangeMenuAdapterItem(DIVIDER, 1));
items.add(new RearrangeMenuAdapterItem(BUTTON, new RearrangeMenuItemsAdapter.ButtonItem(
R.string.reset_to_default,
R.drawable.ic_action_reset_to_default_dark,
new View.OnClickListener() {
@Override
public void onClick(View view) {
hiddenMenuItems.clear();
menuItemsOrder.clear();
wasReset = true;
isChanged = true;
getSettingForScreen(app, screenType).resetModeToDefault(appMode);
instantiateContextMenuAdapter();
rearrangeAdapter.updateItems(getAdapterItems());
}
})));
items.add(new RearrangeMenuAdapterItem(BUTTON, new RearrangeMenuItemsAdapter.ButtonItem(
R.string.copy_from_other_profile,
R.drawable.ic_action_copy,
new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentManager fm = getFragmentManager();
if (fm != null) {
SelectCopyAppModeBottomSheet.showInstance(
fm,
ConfigureMenuItemsFragment.this,
false,
appMode
);
}
}
})));
return items;
}
public void exitFragment() {
if (isChanged) {
showExitDialog();
} else {
dismissFragment();
}
}
public void showExitDialog() {
Context themedContext = UiUtilities.getThemedContext(getActivity(), nightMode);
AlertDialog.Builder dismissDialog = new AlertDialog.Builder(themedContext);
dismissDialog.setTitle(getString(R.string.shared_string_dismiss));
dismissDialog.setMessage(getString(R.string.exit_without_saving));
dismissDialog.setNegativeButton(R.string.shared_string_cancel, null);
dismissDialog.setPositiveButton(R.string.shared_string_exit, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismissFragment();
}
});
dismissDialog.show();
}
private void dismissFragment() {
FragmentManager fm = getFragmentManager();
if (fm != null && !fm.isStateSaved()) {
getFragmentManager().popBackStack(CONFIGURE_MENU_ITEMS_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
private void setScreenType(@NonNull ScreenType screenType) {
this.screenType = screenType;
}
@Override
public void copyAppModePrefs(ApplicationMode appMode) {
if (appMode != null) {
List<OsmandSettings.OsmandPreference> prefs = new ArrayList<>();
prefs.add(getSettingForScreen(app, screenType));
app.getSettings().copyProfilePreferences(appMode, this.appMode, prefs);
dismissFragment();
}
}
public static OsmandSettings.ContextMenuItemsPreference getSettingForScreen(OsmandApplication app, ScreenType screenType) throws IllegalArgumentException {
switch (screenType) {
case DRAWER:
return app.getSettings().DRAWER_ITEMS;
case CONFIGURE_MAP:
return app.getSettings().CONFIGURE_MAP_ITEMS;
case CONTEXT_MENU_ACTIONS:
return app.getSettings().CONTEXT_MENU_ACTIONS_ITEMS;
default:
throw new IllegalArgumentException("Unsupported screen type");
}
}
private void initDefaultOrders(@NonNull List<ContextMenuItem> items) {
for (int i = 0; i < items.size(); i++) {
items.get(i).setOrder(i);
}
}
public List<RearrangeMenuAdapterItem> getItemsForRearrangeAdapter(@Nullable List<String> hiddenItemsIds, @Nullable HashMap<String, Integer> itemsOrderIds, boolean hidden) {
List<ContextMenuItem> defItems = contextMenuAdapter.getDefaultItems();
if (itemsOrderIds == null || itemsOrderIds.isEmpty()) {
initDefaultOrders(defItems);
} else {
sortByCustomOrder(defItems, itemsOrderIds);
}
List<RearrangeMenuAdapterItem> visibleItems = new ArrayList<>();
List<RearrangeMenuAdapterItem> hiddenItems = new ArrayList<>();
for (ContextMenuItem item : defItems) {
String id = item.getId();
if (hiddenItemsIds != null && hiddenItemsIds.contains(id)) {
item.setHidden(true);
hiddenItems.add(new RearrangeMenuAdapterItem(MENU_ITEM, item));
} else {
item.setHidden(false);
visibleItems.add(new RearrangeMenuAdapterItem(MENU_ITEM, item));
}
}
return hidden ? hiddenItems : visibleItems;
}
private void sortByCustomOrder(List<ContextMenuItem> defItems, HashMap<String, Integer> itemsOrderIds) {
for (ContextMenuItem item : defItems) {
Integer order = itemsOrderIds.get(item.getId());
if (order != null) {
item.setOrder(order);
}
}
Collections.sort(defItems, new Comparator<ContextMenuItem>() {
@Override
public int compare(ContextMenuItem item1, ContextMenuItem item2) {
int order1 = item1.getOrder();
int order2 = item2.getOrder();
return (order1 < order2) ? -1 : ((order1 == order2) ? 0 : 1);
}
});
}
}

View file

@ -0,0 +1,326 @@
package net.osmand.plus.settings;
import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.AndroidUtils;
import net.osmand.PlatformUtil;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.MapActivityActions;
import net.osmand.plus.activities.PluginsActivity;
import net.osmand.plus.base.BaseOsmAndFragment;
import net.osmand.plus.dialogs.ConfigureMapMenu;
import net.osmand.plus.helpers.FontCache;
import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.widgets.style.CustomTypefaceSpan;
import org.apache.commons.logging.Log;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ConfigureMenuRootFragment extends BaseOsmAndFragment {
public static final String TAG = ConfigureMenuRootFragment.class.getName();
private static final String APP_MODE_KEY = "app_mode_key";
private static final Log LOG = PlatformUtil.getLog(TAG);
private OsmandApplication app;
private LayoutInflater mInflater;
private boolean nightMode;
private ApplicationMode appMode;
public static boolean showInstance(@NonNull FragmentManager fragmentManager,
Fragment target,
@NonNull ApplicationMode appMode) {
try {
ConfigureMenuRootFragment fragment = new ConfigureMenuRootFragment();
fragment.setAppMode(appMode);
fragment.setTargetFragment(target, 0);
fragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, fragment, TAG)
.addToBackStack(null)
.commitAllowingStateLoss();
return true;
} catch (RuntimeException e) {
return false;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
appMode = ApplicationMode.valueOfStringKey(savedInstanceState.getString(APP_MODE_KEY), null);
}
app = requireMyApplication();
nightMode = !app.getSettings().isLightContent();
mInflater = UiUtilities.getInflater(app, nightMode);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View root = mInflater.inflate(R.layout.fragment_ui_customization, container, false);
Toolbar toolbar = root.findViewById(R.id.toolbar);
TextView toolbarTitle = root.findViewById(R.id.toolbar_title);
TextView toolbarSubTitle = root.findViewById(R.id.toolbar_subtitle);
ImageButton toolbarButton = root.findViewById(R.id.close_button);
RecyclerView recyclerView = root.findViewById(R.id.list);
toolbar.setBackgroundColor(nightMode
? getResources().getColor(R.color.list_background_color_dark)
: getResources().getColor(R.color.list_background_color_light));
toolbarTitle.setTextColor(nightMode
? getResources().getColor(R.color.text_color_primary_dark)
: getResources().getColor(R.color.list_background_color_dark));
toolbarSubTitle.setTextColor(getResources().getColor(R.color.text_color_secondary_light));
toolbarButton.setImageDrawable(getPaintedContentIcon(R.drawable.ic_arrow_back, getResources().getColor(R.color.text_color_secondary_light)));
toolbarButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentManager fm = getFragmentManager();
if (fm != null) {
fm.popBackStack();
}
}
});
toolbarTitle.setText(R.string.ui_customization);
toolbarSubTitle.setText(appMode.toHumanString());
toolbarSubTitle.setVisibility(View.VISIBLE);
List<Object> items = new ArrayList<>();
String plugins = getString(R.string.prefs_plugins);
String description = String.format(getString(R.string.ui_customization_description), plugins);
items.add(description);
items.addAll(Arrays.asList(ScreenType.values()));
CustomizationItemsAdapter adapter = new CustomizationItemsAdapter(items, new OnCustomizationItemClickListener() {
@Override
public void onItemClick(ScreenType type) {
FragmentManager fm = getFragmentManager();
if (fm != null) {
ConfigureMenuItemsFragment.showInstance(fm, appMode, type);
}
}
});
recyclerView.setLayoutManager(new LinearLayoutManager(app));
recyclerView.setAdapter(adapter);
if (Build.VERSION.SDK_INT >= 21) {
AndroidUtils.addStatusBarPadding21v(app, root);
}
return root;
}
@Override
public int getStatusBarColorId() {
View view = getView();
if (view != null && Build.VERSION.SDK_INT >= 23 && !nightMode) {
view.setSystemUiVisibility(view.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
return nightMode ? R.color.activity_background_dark : R.color.activity_background_light;
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(APP_MODE_KEY, getAppMode().getStringKey());
}
public void setAppMode(ApplicationMode appMode) {
this.appMode = appMode;
}
public ApplicationMode getAppMode() {
return appMode != null ? appMode : app.getSettings().getApplicationMode();
}
private class CustomizationItemsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int DESCRIPTION_TYPE = 0;
private static final int ITEM_TYPE = 1;
private List<Object> items;
private OnCustomizationItemClickListener listener;
CustomizationItemsAdapter(List<Object> items, OnCustomizationItemClickListener listener) {
this.items = items;
this.listener = listener;
}
@Override
public int getItemViewType(int position) {
if (items.get(position) instanceof String) {
return DESCRIPTION_TYPE;
} else {
return ITEM_TYPE;
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == DESCRIPTION_TYPE) {
View view = mInflater.inflate(R.layout.list_item_description_with_image, parent, false);
return new DescriptionHolder(view);
} else {
View view = mInflater.inflate(R.layout.list_item_ui_customization, parent, false);
return new ItemHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
final Object currentItem = items.get(position);
if (holder instanceof DescriptionHolder) {
DescriptionHolder descriptionHolder = (DescriptionHolder) holder;
String plugins = getString(R.string.prefs_plugins);
setupClickableText(
descriptionHolder.description, (String) currentItem, plugins, new Intent(app, PluginsActivity.class));
descriptionHolder.image.setVisibility(View.GONE);
} else {
final ScreenType item = (ScreenType) currentItem;
ItemHolder itemHolder = (ItemHolder) holder;
itemHolder.icon.setImageResource(item.iconRes);
itemHolder.title.setText(item.titleRes);
itemHolder.subTitle.setText(getSubTitleText(item));
itemHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClick(item);
}
});
}
}
@Override
public int getItemCount() {
return items.size();
}
private void setupClickableText(TextView textView, String text, String clickableText, final Intent intent) {
SpannableString spannableString = new SpannableString(text);
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View view) {
startActivity(intent);
}
};
try {
int startIndex = text.indexOf(clickableText);
spannableString.setSpan(new CustomTypefaceSpan(FontCache.getRobotoMedium(app)), startIndex, startIndex + clickableText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(clickableSpan, startIndex, startIndex + clickableText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setHighlightColor(nightMode
? getResources().getColor(R.color.active_color_primary_dark)
: getResources().getColor(R.color.active_color_primary_light));
} catch (RuntimeException e) {
LOG.error("Error trying to find index of " + clickableText + " " + e);
}
}
private String getSubTitleText(ScreenType type) {
ContextMenuAdapter contextMenuAdapter = null;
Activity activity = getActivity();
if (activity instanceof MapActivity) {
switch (type) {
case DRAWER:
MapActivityActions mapActivityActions = new MapActivityActions((MapActivity) activity);
contextMenuAdapter = mapActivityActions.createMainOptionsMenu();
break;
case CONFIGURE_MAP:
ConfigureMapMenu configureMapMenu = new ConfigureMapMenu();
contextMenuAdapter = configureMapMenu.createListAdapter((MapActivity) activity);
break;
case CONTEXT_MENU_ACTIONS:
MapContextMenu menu = ((MapActivity) activity).getContextMenu();
contextMenuAdapter = menu.getActionsContextMenuAdapter(true);
break;
}
int hiddenCount = ConfigureMenuItemsFragment.getSettingForScreen(app, type).getModeValue(appMode).getHiddenIds().size();
int allCount = contextMenuAdapter.getDefaultItems().size();
String amount = getString(R.string.n_items_of_z, String.valueOf(allCount - hiddenCount), String.valueOf(allCount));
return getString(R.string.ltr_or_rtl_combine_via_colon, getString(R.string.shared_string_items), amount);
}
return "";
}
class DescriptionHolder extends RecyclerView.ViewHolder {
ImageView image;
TextView description;
DescriptionHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image);
description = itemView.findViewById(R.id.description);
}
}
class ItemHolder extends RecyclerView.ViewHolder {
ImageView icon;
TextView title;
TextView subTitle;
ItemHolder(@NonNull View itemView) {
super(itemView);
icon = itemView.findViewById(R.id.icon);
title = itemView.findViewById(R.id.title);
subTitle = itemView.findViewById(R.id.sub_title);
}
}
}
public enum ScreenType {
DRAWER(R.string.shared_string_drawer, R.drawable.ic_action_drawer, R.drawable.img_settings_customize_drawer_day, R.drawable.img_settings_customize_drawer_night),
CONFIGURE_MAP(R.string.configure_map, R.drawable.ic_action_layers, R.drawable.img_settings_customize_configure_map_day, R.drawable.img_settings_customize_configure_map_night),
CONTEXT_MENU_ACTIONS(R.string.context_menu_actions, R.drawable.ic_action_context_menu, R.drawable.img_settings_customize_context_menu_day, R.drawable.img_settings_customize_context_menu_night);
@StringRes
public int titleRes;
@DrawableRes
public int iconRes;
@DrawableRes
public int imageDayRes;
@DrawableRes
public int imageNightRes;
ScreenType(int titleRes, int iconRes, int imageDayRes, int imageNightRes) {
this.titleRes = titleRes;
this.iconRes = iconRes;
this.imageDayRes = imageDayRes;
this.imageNightRes = imageNightRes;
}
}
interface OnCustomizationItemClickListener {
void onItemClick(ScreenType type);
}
}

View file

@ -71,6 +71,7 @@ public class ConfigureProfileFragment extends BaseSettingsFragment implements Co
private static final String EXPORT_PROFILE = "export_profile";
private static final String DELETE_PROFILE = "delete_profile";
private static final String PROFILE_APPEARANCE = "profile_appearance";
private static final String UI_CUSTOMIZATION = "ui_customization";
@ColorRes
protected int getBackgroundColorRes() {
@ -273,6 +274,7 @@ public class ConfigureProfileFragment extends BaseSettingsFragment implements Co
setupConfigureMapPref();
setupConfigureScreenPref();
setupProfileAppearancePref();
setupUiCustomizationPref();
PreferenceCategory pluginSettings = (PreferenceCategory) findPreference(PLUGIN_SETTINGS);
setupOsmandPluginsPref(pluginSettings);
@ -382,6 +384,17 @@ public class ConfigureProfileFragment extends BaseSettingsFragment implements Co
}
}
private void setupUiCustomizationPref() {
Context ctx = getContext();
if (ctx == null) {
return;
}
Preference uiCustomization = findPreference(UI_CUSTOMIZATION);
if (uiCustomization != null) {
uiCustomization.setIcon(getContentIcon(R.drawable.ic_action_ui_customization));
}
}
@Override
public boolean onPreferenceClick(Preference preference) {
String prefId = preference.getKey();
@ -426,6 +439,14 @@ public class ConfigureProfileFragment extends BaseSettingsFragment implements Co
}
} else if (DELETE_PROFILE.equals(prefId)) {
onDeleteProfileClick();
} else if (UI_CUSTOMIZATION.equals(prefId)) {
FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager != null) {
ConfigureMenuRootFragment.showInstance(
fragmentManager,
this,
getSelectedAppMode());
}
}
return super.onPreferenceClick(preference);
}

View file

@ -268,6 +268,9 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
super.onScrollStateChanged(recyclerView, newState);
if (newState != RecyclerView.SCROLL_STATE_IDLE) {
hideKeyboard();
if (profileName != null) {
profileName.clearFocus();
}
}
}
});
@ -359,13 +362,21 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
}
}
});
profileName.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){
profileName.setSelection(profileName.getText().length());
AndroidUtils.showSoftKeyboard(profileName);
}
}
});
if (getSelectedAppMode().equals(ApplicationMode.DEFAULT) && !isNewProfile) {
profileName.setFocusableInTouchMode(false);
profileName.setFocusable(false);
} else {
profileName.requestFocus();
}
profileNameOtfb = (OsmandTextFieldBoxes) holder.findViewById(R.id.profile_name_otfb);
updateProfileNameAppearance();
} else if (MASTER_PROFILE.equals(preference.getKey())) {
baseProfileName = (EditText) holder.findViewById(R.id.master_profile_et);
baseProfileName.setFocusable(false);

View file

@ -0,0 +1,451 @@
package net.osmand.plus.settings;
import android.annotation.SuppressLint;
import android.graphics.drawable.Drawable;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
import androidx.core.view.MotionEventCompat;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.AndroidUtils;
import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.helpers.FontCache;
import net.osmand.plus.views.controls.ReorderItemTouchHelperCallback;
import net.osmand.plus.settings.ConfigureMenuRootFragment.ScreenType;
import java.util.Collections;
import java.util.List;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_BUILDS_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_DIVIDER_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_MORE_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_RENDERING_CATEGORY_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.RENDERING_ITEMS_ID_SCHEME;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.SHOW_CATEGORY_ID;
import static net.osmand.aidlapi.OsmAndCustomizationConstants.SHOW_ITEMS_ID_SCHEME;
import static net.osmand.plus.settings.ConfigureMenuItemsFragment.MAIN_BUTTONS_QUANTITY;
public class RearrangeMenuItemsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
implements ReorderItemTouchHelperCallback.OnItemMoveCallback {
private OsmandApplication app;
private UiUtilities uiUtilities;
private boolean nightMode;
private List<RearrangeMenuAdapterItem> items;
private MenuItemsAdapterListener listener;
private int activeColorRes;
private int textColorRes;
public RearrangeMenuItemsAdapter(OsmandApplication app,
List<RearrangeMenuAdapterItem> items) {
this.app = app;
this.items = items;
uiUtilities = app.getUIUtilities();
nightMode = !app.getSettings().isLightContent();
activeColorRes = nightMode
? R.color.active_color_primary_dark
: R.color.active_color_primary_light;
textColorRes = nightMode
? R.color.text_color_primary_dark
: R.color.text_color_primary_light;
}
@Override
public int getItemViewType(int position) {
RearrangeMenuAdapterItem item = items.get(position);
return item.type.ordinal();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = UiUtilities.getInflater(app, nightMode);
AdapterItemType type = AdapterItemType.values()[viewType];
View view;
switch (type) {
case DESCRIPTION:
view = inflater.inflate(R.layout.list_item_description_with_image, parent, false);
return new DescriptionHolder(view);
case MENU_ITEM:
view = inflater.inflate(R.layout.profile_edit_list_item, parent, false);
return new ItemHolder(view);
case DIVIDER:
view = inflater.inflate(R.layout.divider, parent, false);
return new DividerHolder(view);
case HEADER:
view = inflater.inflate(R.layout.list_item_move_header, parent, false);
return new HeaderHolder(view);
case BUTTON:
view = inflater.inflate(R.layout.preference_button, parent, false);
return new ButtonHolder(view);
default:
throw new IllegalArgumentException("Unsupported view type");
}
}
@SuppressLint("ClickableViewAccessibility")
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {
RearrangeMenuAdapterItem item = items.get(position);
if (holder instanceof DescriptionHolder) {
DescriptionHolder h = (DescriptionHolder) holder;
ScreenType screenType = (ScreenType) item.value;
int paddingStart = (int) app.getResources().getDimension(R.dimen.toolbar_height);
int paddingTop = (int) app.getResources().getDimension(R.dimen.content_padding);
h.description.setText(String.format(app.getString(R.string.reorder_or_hide_from), app.getString(screenType.titleRes)));
h.image.setImageResource(nightMode ? screenType.imageNightRes : screenType.imageDayRes);
if (screenType == ScreenType.CONTEXT_MENU_ACTIONS) {
h.deviceImage.setImageResource(nightMode
? R.drawable.img_settings_device_bottom_dark
: R.drawable.img_settings_device_bottom_light);
h.imageContainer.setPadding(paddingStart, 0, paddingStart, paddingTop);
} else {
h.deviceImage.setImageResource(nightMode
? R.drawable.img_settings_device_top_dark
: R.drawable.img_settings_device_top_light);
h.imageContainer.setPadding(paddingStart, paddingTop, paddingStart, 0);
}
} else if (holder instanceof ItemHolder) {
final ItemHolder h = (ItemHolder) holder;
ContextMenuItem menuItem = (ContextMenuItem) item.value;
String id = menuItem.getId();
if (DRAWER_DIVIDER_ID.equals(menuItem.getId())) {
h.title.setText(R.string.shared_string_divider);
h.title.setTypeface(FontCache.getFont(app, app.getString(R.string.font_roboto_medium)));
h.title.setTextColor(app.getResources().getColor(activeColorRes));
h.title.setTextSize(TypedValue.COMPLEX_UNIT_PX, app.getResources().getDimension(R.dimen.default_list_text_size));
h.description.setText(R.string.divider_descr);
h.icon.setVisibility(View.GONE);
h.actionIcon.setVisibility(View.GONE);
h.moveIcon.setVisibility(View.VISIBLE);
h.divider.setVisibility(View.VISIBLE);
} else if (SHOW_CATEGORY_ID.equals(id)
|| MAP_RENDERING_CATEGORY_ID.equals(id)) {
h.title.setText(menuItem.getTitle());
h.title.setTypeface(FontCache.getFont(app, app.getString(R.string.font_roboto_medium)));
h.title.setTextSize(TypedValue.COMPLEX_UNIT_PX, app.getResources().getDimension(R.dimen.default_list_text_size));
h.description.setText(R.string.move_inside_category);
h.icon.setVisibility(View.GONE);
h.actionIcon.setVisibility(View.GONE);
h.moveIcon.setVisibility(View.GONE);
h.divider.setVisibility(View.VISIBLE);
h.movable = false;
} else {
if (menuItem.getIcon() != -1) {
h.icon.setImageDrawable(uiUtilities.getIcon(menuItem.getIcon(), nightMode));
h.icon.setVisibility(View.VISIBLE);
h.actionIcon.setVisibility(View.VISIBLE);
}
h.title.setTypeface(FontCache.getFont(app, app.getString(R.string.font_roboto_regular)));
h.title.setText(menuItem.getTitle());
h.title.setTextColor(app.getResources().getColor(textColorRes));
h.description.setText(getDescription(menuItem.getId()));
h.divider.setVisibility(View.GONE);
h.moveIcon.setVisibility(View.VISIBLE);
}
h.actionIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int pos = holder.getAdapterPosition();
if (listener != null && pos != RecyclerView.NO_POSITION) {
listener.onButtonClicked(pos);
}
}
});
h.moveIcon.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
listener.onDragStarted(holder);
}
return false;
}
});
if (!menuItem.isHidden()
&& !id.equals(SHOW_CATEGORY_ID)
&& !id.equals(MAP_RENDERING_CATEGORY_ID)) {
h.moveIcon.setVisibility(View.VISIBLE);
h.moveIcon.setImageDrawable(uiUtilities.getIcon(R.drawable.ic_action_item_move, nightMode));
h.actionIcon.setImageDrawable(uiUtilities.getIcon(R.drawable.ic_action_remove, R.color.color_osm_edit_delete));
} else {
h.moveIcon.setVisibility(View.GONE);
h.actionIcon.setImageDrawable(uiUtilities.getIcon(R.drawable.ic_action_undo, R.color.color_osm_edit_create));
}
if (id.equals(MAP_CONTEXT_MENU_MORE_ID)) {
h.moveIcon.setImageDrawable(uiUtilities.getIcon(R.drawable.ic_action_item_move, nightMode));
h.actionIcon.setImageDrawable(uiUtilities.getIcon(R.drawable.ic_action_remove, nightMode));
h.actionIcon.setOnClickListener(null);
}
} else if (holder instanceof HeaderHolder) {
HeaderHolder h = (HeaderHolder) holder;
HeaderItem header = (HeaderItem) item.value;
h.title.setTypeface(FontCache.getFont(app, app.getString(R.string.font_roboto_medium)));
h.title.setTextSize(TypedValue.COMPLEX_UNIT_PX, app.getResources().getDimension(R.dimen.default_list_text_size));
h.title.setText(header.titleRes);
h.description.setText(header.descrRes);
h.moveIcon.setVisibility(View.GONE);
} else if (holder instanceof ButtonHolder) {
ButtonHolder h = (ButtonHolder) holder;
ButtonItem button = (ButtonItem) item.value;
h.title.setText(app.getString(button.titleRes));
h.icon.setImageDrawable(uiUtilities.getIcon(button.iconRes, activeColorRes));
h.button.setOnClickListener(button.listener);
Drawable drawable = UiUtilities.getColoredSelectableDrawable(app, ContextCompat.getColor(app, activeColorRes), 0.3f);
AndroidUtils.setBackground(h.itemView, drawable);
}
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public boolean onItemMove(int from, int to) {
Object itemFrom = items.get(from).value;
Object itemTo = items.get(to).value;
if (itemFrom instanceof ContextMenuItem
&& itemTo instanceof ContextMenuItem) {
ContextMenuItem menuItemFrom = (ContextMenuItem) itemFrom;
ContextMenuItem menuItemTo = (ContextMenuItem) itemTo;
int orderFrom = menuItemFrom.getOrder();
int orderTo = menuItemTo.getOrder();
if (menuItemFrom.getId().startsWith(SHOW_ITEMS_ID_SCHEME) && menuItemTo.getId().startsWith(RENDERING_ITEMS_ID_SCHEME)
|| menuItemFrom.getId().startsWith(RENDERING_ITEMS_ID_SCHEME) && menuItemTo.getId().startsWith(SHOW_ITEMS_ID_SCHEME)
|| menuItemTo.isHidden()) {
return false;
}
int buttonMoreIndex = MAIN_BUTTONS_QUANTITY + 1;
if (menuItemFrom.getId().equals(MAP_CONTEXT_MENU_MORE_ID)) {
if (to > buttonMoreIndex) {
return false;
}
} else if (menuItemTo.getId().equals(MAP_CONTEXT_MENU_MORE_ID)) {
if (from > buttonMoreIndex) {
return false;
}
}
menuItemFrom.setOrder(orderTo);
menuItemTo.setOrder(orderFrom);
listener.onItemMoved(menuItemFrom.getId(), orderTo);
listener.onItemMoved(menuItemTo.getId(), orderFrom);
Collections.swap(items, from, to);
notifyItemMoved(from, to);
return true;
}
return false;
}
@Override
public void onItemDismiss(RecyclerView.ViewHolder holder) {
listener.onDragOrSwipeEnded(holder);
}
private static class DescriptionHolder extends RecyclerView.ViewHolder
implements ReorderItemTouchHelperCallback.UnmovableItem {
private ImageView image;
private ImageView deviceImage;
private TextView description;
private FrameLayout imageContainer;
DescriptionHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image);
deviceImage = itemView.findViewById(R.id.device_image);
description = itemView.findViewById(R.id.description);
imageContainer = itemView.findViewById(R.id.image_container);
}
@Override
public boolean isMovingDisabled() {
return true;
}
}
private static class ItemHolder extends RecyclerView.ViewHolder
implements ReorderItemTouchHelperCallback.UnmovableItem {
private TextView title;
private TextView description;
private ImageView icon;
private ImageView actionIcon;
private ImageView moveIcon;
private View divider;
private boolean movable = true;
ItemHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
description = itemView.findViewById(R.id.description);
actionIcon = itemView.findViewById(R.id.action_icon);
icon = itemView.findViewById(R.id.icon);
moveIcon = itemView.findViewById(R.id.move_icon);
divider = itemView.findViewById(R.id.divider);
}
@Override
public boolean isMovingDisabled() {
return !movable;
}
}
private static class DividerHolder extends RecyclerView.ViewHolder
implements ReorderItemTouchHelperCallback.UnmovableItem {
View divider;
DividerHolder(View itemView) {
super(itemView);
divider = itemView.findViewById(R.id.divider);
}
@Override
public boolean isMovingDisabled() {
return true;
}
}
private static class HeaderHolder extends RecyclerView.ViewHolder
implements ReorderItemTouchHelperCallback.UnmovableItem {
private ImageView moveIcon;
private TextView title;
private TextView description;
HeaderHolder(@NonNull View itemView) {
super(itemView);
moveIcon = itemView.findViewById(R.id.move_icon);
title = itemView.findViewById(R.id.title);
description = itemView.findViewById(R.id.summary);
}
@Override
public boolean isMovingDisabled() {
return true;
}
}
private static class ButtonHolder extends RecyclerView.ViewHolder
implements ReorderItemTouchHelperCallback.UnmovableItem {
private View button;
private ImageView icon;
private TextView title;
ButtonHolder(@NonNull View itemView) {
super(itemView);
button = itemView;
icon = itemView.findViewById(android.R.id.icon);
title = itemView.findViewById(android.R.id.title);
}
@Override
public boolean isMovingDisabled() {
return true;
}
}
public static class RearrangeMenuAdapterItem {
private AdapterItemType type;
private Object value;
public RearrangeMenuAdapterItem(AdapterItemType type, Object value) {
this.type = type;
this.value = value;
}
public AdapterItemType getType() {
return type;
}
public Object getValue() {
return value;
}
}
public static class ButtonItem {
@StringRes
private int titleRes;
@DrawableRes
private int iconRes;
private View.OnClickListener listener;
public ButtonItem(int titleRes, int iconRes, View.OnClickListener listener) {
this.titleRes = titleRes;
this.iconRes = iconRes;
this.listener = listener;
}
}
public static class HeaderItem {
@StringRes
private int titleRes;
@StringRes
private int descrRes;
public HeaderItem(int titleRes, int descrRes) {
this.titleRes = titleRes;
this.descrRes = descrRes;
}
}
public enum AdapterItemType {
DESCRIPTION,
MENU_ITEM,
DIVIDER,
HEADER,
BUTTON
}
public interface MenuItemsAdapterListener {
void onDragStarted(RecyclerView.ViewHolder holder);
void onDragOrSwipeEnded(RecyclerView.ViewHolder holder);
void onButtonClicked(int view);
void onItemMoved(String id, int position);
}
public void setListener(MenuItemsAdapterListener listener) {
this.listener = listener;
}
public RearrangeMenuAdapterItem getItem(int position) {
return items.get(position);
}
public void updateItems(List<RearrangeMenuAdapterItem> items) {
this.items = items;
notifyDataSetChanged();
}
private int getDescription(String id) {
if (id.equals(DRAWER_BUILDS_ID)) {
return R.string.developer_plugin;
} else {
return R.string.app_name_osmand;
}
}
}

View file

@ -21,6 +21,9 @@ import net.osmand.plus.settings.BaseSettingsFragment;
import org.apache.commons.logging.Log;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class ChangeGeneralProfilesPrefBottomSheet extends BasePreferenceBottomSheet {
@ -30,8 +33,16 @@ public class ChangeGeneralProfilesPrefBottomSheet extends BasePreferenceBottomSh
private static final String NEW_VALUE_KEY = "new_value_key";
@Nullable
private Serializable newValue;
@Nullable
private OnChangeSettingListener listener;
public void setListener(@Nullable OnChangeSettingListener listener) {
this.listener = listener;
}
@Override
public void createMenuItems(Bundle savedInstanceState) {
final OsmandApplication app = getMyApplication();
@ -55,7 +66,11 @@ public class ChangeGeneralProfilesPrefBottomSheet extends BasePreferenceBottomSh
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
app.getSettings().setPreferenceForAllModes(prefId, newValue);
updateTargetSettings(false, true);
if (listener != null) {
listener.onApplied();
}
dismiss();
}
})
@ -71,7 +86,11 @@ public class ChangeGeneralProfilesPrefBottomSheet extends BasePreferenceBottomSh
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
app.getSettings().setPreference(prefId, newValue, getAppMode());
updateTargetSettings(false, false);
if (listener != null) {
listener.onApplied();
}
dismiss();
}
})
@ -86,6 +105,9 @@ public class ChangeGeneralProfilesPrefBottomSheet extends BasePreferenceBottomSh
@Override
public void onClick(View v) {
updateTargetSettings(true, false);
if (listener != null) {
listener.onDiscard();
}
dismiss();
}
})
@ -127,8 +149,32 @@ public class ChangeGeneralProfilesPrefBottomSheet extends BasePreferenceBottomSh
}
}
public static void showInstance(@NonNull FragmentManager fm, String prefId, Serializable newValue, Fragment target,
boolean usedOnMap, @Nullable ApplicationMode appMode) {
public static void showInstance(@NonNull FragmentManager fm,
@Nullable String prefId,
@Nullable Serializable newValue,
Fragment target,
boolean usedOnMap,
@Nullable ApplicationMode appMode) {
showFragmentInstance(fm, prefId, newValue, target, usedOnMap, appMode, null);
}
public static void showInstance(@NonNull FragmentManager fm,
@Nullable String prefId,
@Nullable Serializable newValue,
Fragment target,
boolean usedOnMap,
@Nullable ApplicationMode appMode,
@Nullable OnChangeSettingListener listener) {
showFragmentInstance(fm, prefId, newValue, target, usedOnMap, appMode, listener);
}
private static void showFragmentInstance(@NonNull FragmentManager fm,
@Nullable String prefId,
@Nullable Serializable newValue,
Fragment target,
boolean usedOnMap,
@Nullable ApplicationMode appMode,
@Nullable OnChangeSettingListener listener) {
try {
if (fm.findFragmentByTag(ChangeGeneralProfilesPrefBottomSheet.TAG) == null) {
Bundle args = new Bundle();
@ -140,10 +186,17 @@ public class ChangeGeneralProfilesPrefBottomSheet extends BasePreferenceBottomSh
fragment.setUsedOnMap(usedOnMap);
fragment.setAppMode(appMode);
fragment.setTargetFragment(target, 0);
fragment.setListener(listener);
fragment.show(fm, ChangeGeneralProfilesPrefBottomSheet.TAG);
}
} catch (RuntimeException e) {
LOG.error("showInstance", e);
}
}
public interface OnChangeSettingListener {
void onApplied();
void onDiscard();
}
}

View file

@ -38,7 +38,7 @@ public class ContourLinesMenu {
OsmandPlugin.enablePlugin(mapActivity, mapActivity.getMyApplication(), plugin, true);
}
boolean nightMode = isNightMode(mapActivity.getMyApplication());
ContextMenuAdapter adapter = new ContextMenuAdapter();
ContextMenuAdapter adapter = new ContextMenuAdapter(mapActivity.getMyApplication());
adapter.setDefaultLayoutId(R.layout.list_item_icon_and_menu);
adapter.setProfileDependent(true);
adapter.setNightMode(nightMode);

View file

@ -404,7 +404,7 @@ public class TerrainFragment extends BaseOsmAndFragment implements View.OnClickL
}
private void updateDownloadSection() {
final ContextMenuAdapter adapter = new ContextMenuAdapter();
final ContextMenuAdapter adapter = new ContextMenuAdapter(app);
adapter.setDefaultLayoutId(R.layout.list_item_icon_and_menu);
adapter.setProfileDependent(true);
adapter.setNightMode(nightMode);

View file

@ -798,7 +798,7 @@ public class MapWidgetRegistry {
}
public ContextMenuAdapter getViewConfigureMenuAdapter(final MapActivity map) {
final ContextMenuAdapter cm = new ContextMenuAdapter();
final ContextMenuAdapter cm = new ContextMenuAdapter(app);
boolean nightMode = app.getDaynightHelper().isNightModeForMapControls();
cm.setProfileDependent(true);
cm.setNightMode(nightMode);

View file

@ -56,7 +56,7 @@ public class WikipediaPoiMenu {
final int languageActionStringId = R.string.shared_string_language;
final int spaceHeight = app.getResources().getDimensionPixelSize(R.dimen.bottom_sheet_big_item_height);
final boolean enabled = app.getPoiFilters().isShowingAnyPoi(PoiTemplateList.WIKI);
ContextMenuAdapter adapter = new ContextMenuAdapter();
ContextMenuAdapter adapter = new ContextMenuAdapter(app);
adapter.setDefaultLayoutId(R.layout.dash_item_with_description_72dp);
adapter.setProfileDependent(true);
adapter.setNightMode(nightMode);