Merge remote-tracking branch 'origin/master' into trip_recording_process

# Conflicts:
#	OsmAnd/res/values/strings.xml
#	OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java
This commit is contained in:
Skalii 2021-02-10 15:40:50 +02:00
commit 7f395a612a
93 changed files with 1457 additions and 680 deletions

View file

@ -25,6 +25,24 @@ public class ALocation extends AidlParams {
private ALocation() {
}
public ALocation(double latitude, double longitude, long time, boolean hasAltitude, double altitude,
boolean hasSpeed, float speed, boolean hasBearing, float bearing,
boolean hasAccuracy, float accuracy, boolean hasVerticalAccuracy, float verticalAccuracy) {
this.latitude = latitude;
this.longitude = longitude;
this.time = time;
this.hasAltitude = hasAltitude;
this.altitude = altitude;
this.hasSpeed = hasSpeed;
this.speed = speed;
this.hasBearing = hasBearing;
this.bearing = bearing;
this.hasAccuracy = hasAccuracy;
this.accuracy = accuracy;
this.hasVerticalAccuracy = hasVerticalAccuracy;
this.verticalAccuracy = verticalAccuracy;
}
public ALocation(Parcel in) {
readFromParcel(in);
}

View file

@ -1255,6 +1255,10 @@ public class GPXUtilities {
return g;
}
public boolean containsRoutePoint(WptPt point) {
return getRoutePoints().contains(point);
}
public List<WptPt> getRoutePoints() {
List<WptPt> points = new ArrayList<>();
for (int i = 0; i < routes.size(); i++) {

View file

@ -1,17 +1,32 @@
package net.osmand.osm;
public enum RouteActivityType {
WATER("Water", "yellow"), WINTER("Winter", "yellow"), SNOWMOBILE("Snowmobile", "yellow"), RIDING("Riding", "yellow"), RACING("Racing", "yellow"),
MOUNTAINBIKE("Mountainbike", "blue"), CYCLING("Cycling", "blue"),
HIKING("Hiking", "orange"), RUNNING("Running", "orange"), WALKING("Walking", "orange"),
OFFROAD("Off-road", "yellow"),
MOTORBIKE("Motorbike", "green"), CAR("Car", "green");
// less specific bottom order
import java.util.ArrayList;
import java.util.List;
public class RouteActivityType {
private static final List<RouteActivityType> values = new ArrayList<>();
public static final String DEFAULT_ICON = "special_marker";
public static final String DEFAULT_COLOR = "orange";
public static final RouteActivityType WATER = createType("water", "yellow").icon("special_kayak").reg();
public static final RouteActivityType WINTER = createType("winter", "yellow").icon("special_skiing").reg();
public static final RouteActivityType SNOWMOBILE = createType("snowmobile", "yellow").icon("special_snowmobile").reg();
public static final RouteActivityType RIDING = createType("riding", "yellow").icon("special_horse").reg();
public static final RouteActivityType RACING = createType("racing", "yellow").icon("raceway").reg();
public static final RouteActivityType MOUNTAINBIKE = createType("mountainbike", "blue").icon("sport_cycling").reg();
public static final RouteActivityType CYCLING = createType("cycling", "blue").icon("special_bicycle").reg();
public static final RouteActivityType HIKING = createType("hiking", "orange").icon("special_trekking").reg();
public static final RouteActivityType RUNNING = createType("running", "orange").icon("running").reg();
public static final RouteActivityType WALKING = createType("walking", "orange").icon("special_walking").reg();
public static final RouteActivityType OFFROAD = createType("offroad", "yellow").icon("special_offroad").reg();
public static final RouteActivityType MOTORBIKE = createType("motorbike", "green").icon("special_motorcycle").reg();
public static final RouteActivityType CAR = createType("car", "green").icon("shop_car").reg();
// less specific bottom order
String name;
String color;
String icon;
private RouteActivityType(String nm, String clr) {
RouteActivityType(String nm, String clr) {
this.name = nm;
this.color = clr;
}
@ -24,12 +39,31 @@ public enum RouteActivityType {
return color;
}
public String getIcon() {
return icon;
}
public static RouteActivityType getOrCreateTypeFromName(String name) {
for (RouteActivityType rat : values) {
if (rat.name.equalsIgnoreCase(name)) {
return rat;
}
}
return createType(name.toLowerCase(), DEFAULT_COLOR).icon(DEFAULT_ICON).reg();
}
private static RouteActivityTypeBuilder createType(String name, String color) {
RouteActivityTypeBuilder builder = new RouteActivityTypeBuilder();
builder.routeActivityType = new RouteActivityType(name, color);
return builder;
}
public static RouteActivityType getTypeFromTags(String[] tags) {
RouteActivityType activityType = null;
for (String tg : tags) {
RouteActivityType rat = RouteActivityType.convertFromOsmGPXTag(tg);
if (rat != null) {
if (activityType == null || activityType.ordinal() > rat.ordinal()) {
if (activityType == null || values.indexOf(activityType) > values.indexOf(rat)) {
activityType = rat;
}
}
@ -215,4 +249,18 @@ public enum RouteActivityType {
return null;
}
public static class RouteActivityTypeBuilder {
private RouteActivityType routeActivityType;
public RouteActivityTypeBuilder icon(String icon) {
routeActivityType.icon = icon;
return this;
}
private RouteActivityType reg() {
values.add(routeActivityType);
return routeActivityType;
}
}
}

View file

@ -202,8 +202,6 @@ public class EntityParser {
return amenitiesList;
}
private static boolean checkAmenitiesToAdd(Amenity a, List<Amenity> amenitiesList){
// check amenity for duplication
for(Amenity b : amenitiesList){

View file

@ -36,7 +36,7 @@
<string name="shared_string_close">Κλείσιμο</string>
<string name="shared_string_off">Ανενεργό</string>
<string name="shared_string_install">Εγκατάσταση</string>
<string name="shared_string_share">Διαμοιρασμός</string>
<string name="shared_string_share">Κοινοποίηση</string>
<string name="shared_string_back">Προηγούμενο</string>
<string name="shared_string_continue">Συνέχεια</string>
<string name="shared_string_cancel">Ακύρωση</string>

2
OsmAnd/.gitignore vendored
View file

@ -39,8 +39,6 @@ mx_*
valgrind/
bin/
dist/
res/values/no_translate.xml
res/values/skip_translate.xml
assets/specialphrases/*
assets/voice/*
assets/fonts/*

View file

@ -4,7 +4,7 @@
<application
android:icon="@mipmap/icon_free"
android:label="@string/app_name_free"
android:label="@string/app_name"
tools:replace="android:icon, android:label">
<meta-data

View file

@ -4,7 +4,7 @@
<application
android:icon="@mipmap/icon_free"
android:label="@string/app_name_free"
android:label="OsmAnd — Offline Maps &amp; GPS Navigation"
tools:replace="android:icon, android:label">
<meta-data

View file

@ -40,9 +40,6 @@
<uses-feature android:name="android.hardware.bluetooth" android:required="false" />
<uses-feature android:name="com.sec.feature.spen_usp" android:required="false"/>
<uses-sdk android:targetSdkVersion="26"
tools:overrideLibrary="com.getkeepsafe.taptargetview, studio.carbonylgroup.textfieldboxes, android.support.customtabs"/>
<supports-screens android:resizeable="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true"
android:xlargeScreens="true" android:anyDensity="true" />

View file

@ -5,9 +5,6 @@
<application
android:icon="@mipmap/icon_nightly"
tools:replace="android:icon">
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="fb792288460976727"/>
<activity
android:name="net.osmand.plus.activities.MapActivity"
android:theme="@style/FirstSplashScreenNightlyFree"

View file

@ -106,15 +106,6 @@ android {
}
}
task updateNoTranslate(type: Copy) {
from('.') {
include 'no_translate.xml'
filter {
line -> replaceNoTranslate(line);
}
}
into 'res/values/'
}
task validateTranslate {
println "Validating translations"
@ -147,10 +138,6 @@ task collectVoiceAssets(type: Sync) {
include "**/*.js"
}
task cleanNoTranslate(type: Delete) {
delete('res/values/no_translate.xml')
}
task collectFonts(type: Copy) {
from "../../resources/fonts"
from "../../resources/rendering_styles/fonts"
@ -262,7 +249,6 @@ task collectExternalResources {
copyMapShaderIcons,
copyMapPOIIcons,
copyLargePOIIcons,
updateNoTranslate,
validateTranslate,
copyWidgetIcons,
copyWidgetIconsHdpi,

View file

@ -24,14 +24,11 @@ android {
// Build that doesn't include 3D OpenGL
legacy {
dimension "coreversion"
resValue "string", "app_edition", ""
}
}
}
def replaceNoTranslate(line) {
return line;
}
afterEvaluate {
android.libraryVariants.all { variant ->
variant.javaCompiler.dependsOn(collectExternalResources, buildOsmAndCore, cleanupDuplicatesInCore)

View file

@ -36,9 +36,9 @@ android {
defaultConfig {
minSdkVersion System.getenv("MIN_SDK_VERSION") ? System.getenv("MIN_SDK_VERSION").toInteger() : 15
versionCode 390
versionCode 400
versionCode System.getenv("APK_NUMBER_VERSION") ? System.getenv("APK_NUMBER_VERSION").toInteger() : versionCode
versionName "3.9.0"
versionName "4.0.0"
versionName System.getenv("APK_VERSION")? System.getenv("APK_VERSION").toString(): versionName
versionName System.getenv("APK_VERSION_SUFFIX")? versionName + System.getenv("APK_VERSION_SUFFIX").toString(): versionName
}
@ -105,31 +105,45 @@ android {
nightlyFree {
dimension "version"
applicationId "net.osmand.dev"
resValue "string", "app_name", "OsmAnd Nightly"
resValue "string", "app_edition", System.getenv("APP_EDITION") ? System.getenv("APP_EDITION") : ""
// resConfig "en"
}
androidFull {
dimension "version"
applicationId "net.osmand.plus"
resValue "string", "app_name", "OsmAnd~"
resValue "string", "app_edition", System.getenv("APP_EDITION") ? System.getenv("APP_EDITION") : ""
}
gplayFree {
dimension "version"
applicationId "net.osmand"
resValue "string", "app_name", "OsmAnd"
resValue "string", "app_edition", System.getenv("APP_EDITION") ? System.getenv("APP_EDITION") : ""
}
gplayFull {
dimension "version"
applicationId "net.osmand.plus"
resValue "string", "app_name", "OsmAnd+"
resValue "string", "app_edition", System.getenv("APP_EDITION") ? System.getenv("APP_EDITION") : ""
}
amazonFree {
dimension "version"
applicationId "net.osmand"
resValue "string", "app_name", "OsmAnd"
resValue "string", "app_edition", ""
}
amazonFull {
dimension "version"
applicationId "net.osmand.plus"
resValue "string", "app_name", "OsmAnd+"
resValue "string", "app_edition", ""
}
huawei {
dimension "version"
applicationId "net.osmand.huawei"
resValue "string", "app_name", "OsmAnd"
resValue "string", "app_edition", ""
}
// Build that includes 3D OpenGL release
@ -153,19 +167,6 @@ android {
}
def replaceNoTranslate(line) {
if (line.contains("\"app_name\"") && System.getenv("TARGET_APP_NAME")) {
return line.replaceAll(">[^<]*<", ">" + System.getenv("TARGET_APP_NAME") + "<")
}
if (line.contains("\"app_name_free\"") && System.getenv("TARGET_APP_NAME")) {
return line.replaceAll(">[^<]*<", ">" + System.getenv("TARGET_APP_NAME") + "<")
}
if (line.contains("\"app_edition\"") && System.getenv("APP_EDITION")) {
return line.replaceAll(">[^<]*<", ">" + System.getenv("APP_EDITION") + "<")
}
return line;
}
afterEvaluate {
android.applicationVariants.all { variant ->
variant.javaCompiler.dependsOn(collectExternalResources, buildOsmAndCore, cleanupDuplicatesInCore)

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/wikivoyage_card_bg_dark" android:state_selected="false" />
<item android:drawable="@drawable/navigation_item_active_bg_dark" android:state_selected="true" />
</selector>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/wikivoyage_card_bg_light" android:state_selected="false" />
<item android:drawable="@drawable/navigation_item_active_bg_light" android:state_selected="true" />
</selector>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/active_color_primary_dark" />
</shape>
</item>
<item android:top="2dp">
<shape android:shape="rectangle">
<solid android:color="@color/wikivoyage_card_bg_dark" />
</shape>
</item>
</layer-list>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/active_color_primary_light" />
</shape>
</item>
<item android:top="2dp">
<shape android:shape="rectangle">
<solid android:color="@color/wikivoyage_card_bg_light" />
</shape>
</item>
</layer-list>

View file

@ -6,6 +6,22 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:ellipsize="end"
android:letterSpacing="@dimen/description_letter_spacing"
android:maxLines="2"
android:minHeight="@dimen/default_desc_line_height"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
osmand:lineHeight="@dimen/default_desc_line_height"
osmand:typeface="@string/font_roboto_regular"
tools:text="Amsterdam is the Netherlands' capital and financial, cultural and creative centre with more" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_overview"
android:layout_width="match_parent"

View file

@ -37,6 +37,7 @@
android:layout_marginRight="@dimen/dialog_content_margin"
android:layout_marginEnd="@dimen/dialog_content_margin"
android:clickable="false"
android:scrollbars="none"
android:focusableInTouchMode="false" />
<androidx.appcompat.widget.AppCompatImageView

View file

@ -125,6 +125,49 @@
</LinearLayout>
<LinearLayout
android:id="@+id/back_button_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/content_padding_half"
android:layout_marginTop="@dimen/content_padding_half"
android:layout_marginRight="@dimen/content_padding_half"
android:background="?attr/flow_toolbar_bg"
android:visibility="gone"
tools:visibility="visible">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="@dimen/setting_list_item_small_height"
android:orientation="horizontal"
android:paddingStart="@dimen/content_padding_half"
android:paddingLeft="@dimen/content_padding_half"
android:paddingEnd="@dimen/content_padding_small"
android:paddingRight="@dimen/content_padding_small">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/back_button_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/content_padding_half"
android:layout_marginRight="@dimen/content_padding_half"
android:tint="?attr/active_color_basic"
osmand:srcCompat="@drawable/ic_arrow_back" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/back_button_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="?attr/active_color_basic"
osmand:typeface="@string/font_roboto_medium"
tools:text="@string/shared_string_tracks" />
</LinearLayout>
</LinearLayout>
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/context_menu_toolbar_container"
android:layout_width="match_parent"
@ -206,7 +249,7 @@
android:layout_height="@dimen/context_menu_action_buttons_height"
android:layout_gravity="bottom"
android:background="?attr/wikivoyage_card_bg_color"
osmand:itemBackground="?attr/wikivoyage_card_bg_color"
osmand:itemBackground="?attr/bottom_navigation_item_background"
osmand:itemIconTint="@color/bottom_navigation_color_selector_light"
osmand:itemTextColor="@color/bottom_navigation_color_selector_light"
osmand:labelVisibilityMode="labeled"

View file

@ -139,31 +139,83 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="@dimen/content_padding_half"
android:paddingBottom="@dimen/content_padding_small">
<LinearLayout
android:id="@+id/user_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/btn_border_bg"
android:layout_marginLeft="@dimen/content_padding_half"
android:layout_marginStart="@dimen/content_padding_half">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/user_icon"
android:layout_width="@dimen/poi_icon_size"
android:layout_height="@dimen/poi_icon_size"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/content_padding_small_half"
android:layout_marginStart="@dimen/content_padding_small_half"
android:contentDescription="@string/shared_string_icon"
tools:src="@drawable/ic_action_user_account_16" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/user_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/btn_border_bg_light"
android:gravity="center_vertical"
android:ellipsize="end"
android:maxLines="1"
android:paddingTop="@dimen/subHeaderPadding"
android:paddingBottom="@dimen/subHeaderPadding"
android:paddingLeft="@dimen/bottom_sheet_content_padding_small"
android:paddingRight="@dimen/bottom_sheet_content_padding_small"
android:paddingLeft="@dimen/content_padding_small_half"
android:paddingRight="@dimen/content_padding_small_half"
android:textAppearance="@style/TextAppearance.ContextMenuSubtitle"
android:textColor="?attr/active_color_basic"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium"
android:drawablePadding="@dimen/content_padding_small_half"
android:drawableStart="@drawable/ic_action_user_account_16"
android:drawableLeft="@drawable/ic_action_user_account_16"
tools:drawableTint="?attr/wikivoyage_active_color"
tools:text="Lorem Ipsum" />
tools:text="@string/mapillary_menu_title_username" />
</LinearLayout>
<LinearLayout
android:id="@+id/activity_type_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/btn_border_bg"
android:visibility="gone"
android:layout_marginLeft="@dimen/content_padding_half"
android:layout_marginStart="@dimen/content_padding_half">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/activity_type_icon"
android:layout_width="@dimen/poi_icon_size"
android:layout_height="@dimen/poi_icon_size"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/content_padding_small_half"
android:layout_marginStart="@dimen/content_padding_small_half"
android:contentDescription="@string/shared_string_icon"
tools:src="@drawable/ic_action_bicycle_dark" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/activity_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:ellipsize="end"
android:maxLines="1"
android:paddingTop="@dimen/subHeaderPadding"
android:paddingBottom="@dimen/subHeaderPadding"
android:paddingLeft="@dimen/content_padding_small_half"
android:paddingRight="@dimen/content_padding_small_half"
android:textAppearance="@style/TextAppearance.ContextMenuSubtitle"
android:textColor="?attr/active_color_basic"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:drawableTint="?attr/wikivoyage_active_color"
tools:text="@string/shared_string_profiles" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
@ -172,7 +224,6 @@
<View
android:layout_width="match_parent"
android:visibility="invisible"
android:layout_height="1dp"
android:background="?attr/wikivoyage_card_divider_color" />

View file

@ -103,6 +103,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="2"
android:scrollbars="none"
android:textColor="@color/wikivoyage_secondary_text"
android:textSize="@dimen/default_sub_text_size"
osmand:typeface="@string/font_roboto_regular"

View file

@ -359,7 +359,7 @@
<string name="osmand_short_description_80_chars">برنامج عرض الخرائط العالمية والملاحة باستخدام خرائط الشوارع المفتوحة OSM أثناء الاتصال بالإنترنت أو من دونه</string>
<string name="osmand_plus_play_title_30_chars">أوسماند+ للخرائط و الملاحة</string>
<string name="osmand_plus_short_description_80_chars">برنامج عرض الخرائط العالمية والملاحة باستخدام خرائط الشوارع المفتوحة OSM أثناء الاتصال بالإنترنت أو من دونه</string>
<string name="filterpoi_activity">أنشئ مُرشِّح نقاط مهمة</string>
<string name="filterpoi_activity">إنشاء فلتر نقاط الاهتمام</string>
<string name="recalculate_route_to_your_location">نمط المواصلات:</string>
<string name="select_navigation_mode">وسائل النقل:</string>
<string name="day_night_info_description">الشروق: %1$s
@ -1830,7 +1830,7 @@
<string name="osm_edit_commented_note">ملاحظة OSM معلق عليها</string>
<string name="rendering_attr_pisteGrooming_name">مسار زلق</string>
<string name="world_ski_missing">لإظهار خرائط التزلج، يجب تحميل خريطة خاصة محلية.</string>
<string name="rendering_attr_publicTransportMode_name">حافلة، ترامواي وغيرها</string>
<string name="rendering_attr_publicTransportMode_name">حافلة، عربة وغيرها</string>
<string name="osm_edit_created_note">إنشاء ملاحظة OSM</string>
<string name="osn_add_dialog_error">حدث استثناء: لم يتم إنشاء الملاحظة.</string>
<string name="osn_close_dialog_error">حدث استثناء: لم يتم غلق الملاحظة.</string>
@ -1962,8 +1962,7 @@
\nليست هناك حاجة لتحميل خريطة خاصة،الرؤية يتم إنشاؤها من خلال خرائطنا المحلية.
\n
\nهذه الرؤية يمكن التراجع عنها إما عن طريق تعطيلها هنا، أو تغيير \'نمط الخريطة\' في \'ضبط الخريطة\' حسب الرغبة.</string>
<string name="create_poi_link_to_osm_doc">
<u>Online OSM</u> تصنيف الخريطة مع الصور.</string>
<string name="create_poi_link_to_osm_doc"><u>Online OSM</u> تصنيف الخريطة مع الصور.</string>
<string name="background_service_wait_int_descr">تعيين الحد الأقصى لوقت الانتظار لكل إصلاح موقع في الخلفية.</string>
<string name="background_service_wait_int">الانتظار الأقصى للإصلاح</string>
<string name="voice_data_not_supported">إصدار غير معتمد من البيانات الصوتية</string>
@ -2072,7 +2071,7 @@
<string name="rendering_value_fine_name">اللون والسمك</string>
<string name="route_roundabout_short">خذ المخرج %1$d ثم واصل</string>
<string name="search_map_hint">المدينة أو المنطقة</string>
<string name="wiki_around">مقالات ويكيبيديا قريبة</string>
<string name="wiki_around">مقالات ويكيبيديا القريبة</string>
<string name="routing_attr_allow_motorway_name">استخدام الطرق السريعة</string>
<string name="routing_attr_allow_motorway_description">السماح للطرق السريعة.</string>
<string name="lang_sr_latn">الصربية (اللاتينية)</string>
@ -2230,7 +2229,8 @@
\n • الشرق الأوسط : **
\n • إفريقيا: **
\n • أنتاركتيكا: *
\n معظم البلدان في جميع أنحاء العالم متاحة للتنزيل ! من أفغانستان إلى زيمبابوي، من أستراليا إلى الولايات المتحدة الأمريكية. الأرجنتين، البرازيل، كندا، فرنسا، ألمانيا، المكسيك، المملكة المتحدة، إسبانيا
\n معظم البلدان في جميع أنحاء العالم متاحة للتنزيل
\n من أفغانستان إلى زيمبابوي، من أستراليا إلى الولايات المتحدة الأمريكية. الأرجنتين، البرازيل، كندا، فرنسا، ألمانيا، المكسيك، المملكة المتحدة، أسبانيا , …
\n</string>
<string name="restart_search">إعادة البحث</string>
<string name="osmand_extended_description_part7">المساهمة في OSM
@ -2377,7 +2377,8 @@
\n • موجه مسار اختياري، عرض اسم الشارع، والوقت المقدر للوصول
\n • يدعم نقاط وسيطة خلال مسارك
\n • إعادة تلقائية للتوجيه كلما انحرفت عن الطريق
\n• البحث عن الأماكن حسب العنوان، النوع (مثل: مطعم، فندق، محطة وقود، متحف)،أو حسب الإحداثيات الجغرافية</string>
\n • البحث عن الأماكن حسب العنوان، النوع (مثل: مطعم، فندق، محطة وقود، متحف)،أو حسب الإحداثيات الجغرافية
\n</string>
<string name="osmand_plus_extended_description_part3">عرض الخريطة
\n• عرض موقعك والتوجيه
\n• محاذاة اختيارية للصورة وفق البوصلة أو توجيه الحركة
@ -2418,7 +2419,8 @@
<string name="quick_action_duplicates">اسم الاختصار السريع المحدد قيد الاستخدام، لقد تم تغييره إلى %1$s لتجنب التكرار.</string>
<string name="quick_action_page_list_descr">الضغط على زر الإجراء سيطبق أحد الأنماط من القائمة أدناه.</string>
<string name="route_points_category_name">تنقلاتك على هذا الطريق</string>
<string name="navigate_point_olc_info_area">OLC الصالحة بالكامل\nتمثل المنطقة: %1$s x %2$s</string>
<string name="navigate_point_olc_info_area">الصالحة بالكامل OLC
\nيمثل المنطقة: %1$s x %2$s</string>
<string name="wrong_user_name">اسم المستخدم خاطئ</string>
<string name="shared_string_to">إلى</string>
<string name="mapillary_menu_date_from">مِن</string>
@ -2616,7 +2618,7 @@
<string name="south_abbreviation">ج</string>
<string name="north_abbreviation">ش</string>
<string name="optional_point_name">اسم النقطة</string>
<string name="transport_nearby_routes_within">الطرق القريبة التي في الداخل</string>
<string name="transport_nearby_routes_within">الطرق الداخلية المجاورة</string>
<string name="enter_the_file_name">أدخل اسم الملف.</string>
<string name="map_import_error">خطأ أثناء استرجاع الخريطة</string>
<string name="map_imported_successfully">تمت عملية استيراد الخريطة</string>
@ -3335,7 +3337,7 @@
<string name="routing_attr_allow_expert_name">السماح بطرق المتخصصين</string>
<string name="routing_attr_allow_expert_description">طرق صعبة للغاية ، مع عقبات خطيرة والمناطق المحيطة بها.</string>
<string name="routing_attr_allow_skating_only_name">السماح بالتزلج على الطرق فقط</string>
<string name="routing_attr_allow_skating_only_description">الطريق مصممة خصيصا بحرية أو التزلج على الجليد.</string>
<string name="routing_attr_allow_skating_only_description">طرق مصممة للأسلوب الحر أو التزلج فقط بدون المسارات الكلاسيكية.</string>
<string name="routing_attr_allow_classic_only_name">السماح للطرق الكلاسيكية فقط</string>
<string name="routing_attr_allow_classic_only_description">تم إعداد الطرق للأسلوب الكلاسيكي فقط دون مسارات التزلج. يشمل ذلك الطرق التي يتم إعدادها بواسطة عربة ثلجية أصغر مع زحلقة مرنة ومسارات مصنوعة يدوياً بواسطة المتزلجين.</string>
<string name="routing_attr_difficulty_preference_name">الصعوبة المفضلة</string>
@ -3841,7 +3843,7 @@
<string name="pass_whole_track_descr">نقطة المسار للتنقل</string>
<string name="start_of_the_track">بداية المسار</string>
<string name="nearest_point">أقرب نقطة</string>
<string name="attach_to_the_roads">إرفاق الطرق</string>
<string name="attach_to_the_roads">إرفاق بالطرق</string>
<string name="delete_address">حذف عنوان</string>
<string name="add_address">إضافة عنوان</string>
<string name="access_hint_enter_address">أدخل العنوان</string>
@ -3864,7 +3866,7 @@
<string name="open_saved_track">فتح المسار المحفوظ</string>
<string name="shared_string_is_saved">محفوظ</string>
<string name="simplified_track">مسار مبسط</string>
<string name="simplified_track_description">سيتم حفظ خط التوجيه فقط، وسيتم حذف نقاط الطريق.</string>
<string name="simplified_track_description">سيتم حفظ خط الطريق فقط، وسيتم حذف نقاط المسار.</string>
<string name="shared_string_file_name">اسم الملف</string>
<string name="one_point_error">الرجاء إضافة نقطتين على الأقل.</string>
<string name="shared_string_redo">إعادة</string>
@ -4074,4 +4076,26 @@
<string name="uploading_count">رفع %1$d من %2$d</string>
<string name="uploaded_count">تم رفع %1$d من %2$d</string>
<string name="toast_select_edits_for_upload">تحديد التعديلات للتحميل</string>
<string name="hillshade_slope_contour_lines">التضاريس / الانحدار / الخطوط المحيطية</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews هو مشروع يحركه المجتمع حول الأماكن العامة مثل المطاعم والفنادق والمتاحف ونقاط الطريق. يقوم بجمع جميع المعلومات العامة المتعلقة بهم مثل الصور والتعليقات والروابط إلى ارتباط الأنظمة الأخرى OpenStreetMap و Wikipedia.
\n
\nجميع بيانات OpenPlaceReview مفتوحة ومتاحة للجميع: http://openplacereviews.org/data.
\n
\nيمكنك قراءة المزيد على: http://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">استخدام test.openplacereviews.org</string>
<string name="login_open_place_reviews">الدخول إلى OpenPlaceReviews</string>
<string name="activity_type_water_name">ماء</string>
<string name="activity_type_winter_name">شتاء</string>
<string name="activity_type_snowmobile_name">الثلج</string>
<string name="activity_type_riding_name">ركوب</string>
<string name="activity_type_racing_name">سباق</string>
<string name="activity_type_mountainbike_name">دراجة جبلية</string>
<string name="activity_type_cycling_name">دراجة</string>
<string name="activity_type_hiking_name">مشي</string>
<string name="activity_type_running_name">الجري</string>
<string name="activity_type_walking_name">مشي</string>
<string name="activity_type_offroad_name">الطرق الوعرة</string>
<string name="activity_type_motorbike_name">دراجة نارية</string>
<string name="activity_type_car_name">سيارة</string>
</resources>

View file

@ -3601,7 +3601,7 @@
<string name="poi_vehicle_military">Přístup vozidel: vojenské</string>
<string name="poi_vehicle_delivery">Přístup vozidel: zásobování</string>
<string name="poi_vehicle_forestry">Přístup vozidel: lesnictví</string>
<string name="poi_motorcar_yes">Přístup aut:</string>
<string name="poi_motorcar_yes">Přístup aut: ano</string>
<string name="poi_motorcar_private">Přístup aut: soukromý</string>
<string name="poi_motorcar_no">Přístup aut: ne</string>
<string name="poi_motorcar_destination">Přístup aut: cíl</string>
@ -3835,4 +3835,50 @@
<string name="poi_diplomatic_services_non_immigrant_visas_filter">Neimigrační víza</string>
<string name="poi_consulate_filter">Konzulát</string>
<string name="poi_embassy_filter">Ambasáda</string>
<string name="poi_mobile_money_agent">Mobilní směnárna</string>
<string name="poi_diplomatic_liaison">Prostředník</string>
<string name="poi_liaison_filter">Prostředník</string>
<string name="poi_wildlife_crossing_bat_tunnel">Netopýří tunel</string>
<string name="poi_wildlife_crossing_bat_bridge">Netopýří most</string>
<string name="poi_wildlife_crossing">Ekodukt</string>
<string name="poi_swimming_area">Plovárna</string>
<string name="poi_lavoir">Veřejná prádelna</string>
<string name="poi_waste_transfer_station">Překladiště odpadů</string>
<string name="poi_weightbridge">Mostní váha</string>
<string name="poi_ranger_station">Stanice rangera</string>
<string name="poi_water_source_lake">Jezero</string>
<string name="poi_water_source_river">Řeka</string>
<string name="poi_water_source_well">Studna</string>
<string name="poi_water_source_powered_pump">Poháněné čerpadlo</string>
<string name="poi_water_source_water_tank">Vodní nádrž</string>
<string name="poi_water_source_tap">Kohoutek</string>
<string name="poi_water_source_water_works">Zásobování vodou</string>
<string name="poi_water_source_tube_well">Trubková studna</string>
<string name="poi_vaccination_covid19">Očkování: COVID19</string>
<string name="poi_health_specialty_vaccination_yes">Očkování</string>
<string name="poi_lifeguard_base">Záchranářská základna</string>
<string name="poi_siren">Siréna</string>
<string name="poi_nurse">Zdravotní sestra</string>
<string name="poi_diplomatic_services_citizen_services_no">Ne</string>
<string name="poi_diplomatic_services_citizen_services_yes">Ano</string>
<string name="poi_diplomatic_services_immigrant_visas_no">Ne</string>
<string name="poi_diplomatic_services_immigrant_visas_yes">Ano</string>
<string name="poi_diplomatic_services_non_immigrant_visas_no">Ne</string>
<string name="poi_diplomatic_services_non_immigrant_visas_yes">Ano</string>
<string name="poi_liaison_subnational">Podnárodní</string>
<string name="poi_liaison_representative_office">Reprezentační kancelář</string>
<string name="poi_liaison_liaison_office">Kancelář</string>
<string name="poi_consulate_honorary_consul">Honorární konzul</string>
<string name="poi_consulate_consulate_general">Generální konzulát</string>
<string name="poi_consulate_consular_office">Kancelář konzula</string>
<string name="poi_consulate_consular_agency">Konzulární zastupitelstvo</string>
<string name="poi_consulate_yes">Vedená konzulem</string>
<string name="poi_embassy_residence">Rezidence</string>
<string name="poi_embassy_nunciature">Nunciatura</string>
<string name="poi_embassy_mission">Mise</string>
<string name="poi_embassy_interests_section">Zájmová sekce</string>
<string name="poi_embassy_high_commission">Vysoký komisař</string>
<string name="poi_embassy_delegation">Delegace</string>
<string name="poi_embassy_branch_embassy">Pobočka</string>
<string name="poi_embassy_yes">Vedená velvyslancem</string>
</resources>

View file

@ -3425,7 +3425,7 @@
<string name="gpx_direction_arrows">Směrové šipky</string>
<string name="plan_route_last_edited">Naposledy upraveno</string>
<string name="plan_route_import_track">Importovat trasu</string>
<string name="plan_route_open_existing_track">Otevřít existující trasu</string>
<string name="plan_route_open_existing_track">Otevřít existující stopu</string>
<string name="plan_route_create_new_route">Vytvořit novou trasu</string>
<string name="plan_route_select_track_file_for_open">Vyberte stopu k otevření.</string>
<string name="shared_string_done">Hotovo</string>
@ -3442,10 +3442,10 @@
<string name="quick_action_add_gpx">Přidat mezicíl</string>
<string name="map_widget_monitoring">Záznam trasy</string>
<string name="marker_save_as_track">Uložit jako soubor trasy</string>
<string name="follow_track">Sledovat trasu</string>
<string name="follow_track">Sledovat stopu</string>
<string name="follow_track_descr">Zvolte soubor trasy, kterou chcete sledovat</string>
<string name="import_track_descr">Zvolte soubor stopy, kterou chcete sledovat, nebo jej importujte ze svého zařízení.</string>
<string name="select_another_track">Zvolit jinou trasu</string>
<string name="select_another_track">Zvolit jinou stopu</string>
<string name="navigate_to_track_descr">Navigovat z mé polohy k trase</string>
<string name="pass_whole_track_descr">Bod trasy pro navigování</string>
<string name="start_of_the_track">Začátek trasy</string>
@ -3490,7 +3490,7 @@
<string name="save_track_to_gpx_globally">Ukládat trasu do GPX souboru</string>
<string name="shared_string_gpx_route">Trasa ze stopy</string>
<string name="empty_state_my_tracks">Přidat soubory stop</string>
<string name="simplified_track">Zjednodušená trasa</string>
<string name="simplified_track">Zjednodušená stopa</string>
<string name="simplified_track_description">Uloží se pouze linie trasy, mezicíle budou odstraněny.</string>
<string name="shared_string_file_name">Název souboru</string>
<string name="number_of_gpx_files_selected_pattern">%s vybraných souborů stop</string>
@ -3505,7 +3505,7 @@
<string name="only_selected_segment_recalc">Pouze vybraný úsek bude přepočítán pomocí vybraného profilu.</string>
<string name="all_next_segments_will_be_recalc">Všechny následující úseky budou přepočítány pomocí vybraného profilu.</string>
<string name="all_previous_segments_will_be_recalc">Všechny předcházející úseky budou přepočítány pomocí vybraného profilu.</string>
<string name="open_saved_track">Otevřít uloženou trasu</string>
<string name="open_saved_track">Otevřít uloženou stopu</string>
<string name="shared_string_is_saved">je uloženo</string>
<string name="one_point_error">Přidejte prosím alespoň dva body.</string>
<string name="shared_string_redo">Znovu</string>
@ -3967,7 +3967,7 @@
<string name="select_folder">Zvolte složku</string>
<string name="select_folder_descr">Zvolte složku nebo vytvořte novou</string>
<string name="shared_string_empty">Prázdné</string>
<string name="analyze_by_intervals">Analyzovat podle intervalů (rozdělit interval)</string>
<string name="analyze_by_intervals">Analyzovat rozdělené intervaly</string>
<string name="upload_to_openstreetmap">Nahrát do OpenStreetMap</string>
<string name="edit_track">Editovat stopu</string>
<string name="rename_track">Přejmenovat stopu</string>
@ -4011,4 +4011,13 @@
<string name="uploading_count">Nahrávám %1$d z %2$d</string>
<string name="uploaded_count">Nahráno %1$d z %2$d</string>
<string name="toast_select_edits_for_upload">Vyberte úpravy pro nahrání</string>
<string name="hillshade_slope_contour_lines">Stínované svahy / Sklon svahů / Vrstevnice</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews je komunitní projekt o veřejných místech, jako jsou restaurace, hotely, muzea a další. Shromažďuje o nich veškeré veřejné informace, např. fotografie, hodnocení, odkazy do dalších systémů jako OpenStreetMap či Wikipedie.
\n
\nVšechna data OpenPlaceReviews jsou otevřená a přístupná každému: http://openplacereviews.org/data.
\n
\nPřečtěte si více na http://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Použít test.openplacereviews.org</string>
<string name="login_open_place_reviews">Přihlásit se do OpenPlaceReviews</string>
</resources>

View file

@ -3694,7 +3694,7 @@
<string name="quick_action_showhide_mapillary_title">Mapillary ein-/ausblenden</string>
<string name="quick_action_mapillary_hide">Mapillary ausblenden</string>
<string name="quick_action_mapillary_show">Mapillary anzeigen</string>
<string name="quick_action_showhide_mapillary_descr">Eine Umschaltfläche zum ein- oder ausblenden der Mapillary-Layer auf der Karte.</string>
<string name="quick_action_showhide_mapillary_descr">Eine Umschaltfläche zum Ein- oder Ausblenden des Mapillary-Layers auf der Karte.</string>
<string name="uninstall_speed_cameras">Blitzer deinstallieren</string>
<string name="shared_string_legal">Rechtliches</string>
<string name="speed_camera_pois">Blitzer-POIs</string>
@ -4013,4 +4013,13 @@
<string name="uploading_count">Lade %1$d von %2$d hoch</string>
<string name="uploaded_count">%1$d von %2$d hochgeladen</string>
<string name="toast_select_edits_for_upload">Bearbeitungen zum Hochladen auswählen</string>
<string name="hillshade_slope_contour_lines">Relief / Hangneigung / Höhenlinien</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews ist ein von der Gemeinschaft betriebenes Projekt über öffentliche Orte wie Restaurants, Hotels, Museen, Wegpunkte. Es sammelt alle öffentlichen Informationen über sie wie Fotos, Bewertungen, Links zu anderen Systemen, Link OpenStreetMap, Wikipedia.
\n
\nAlle OpenPlaceReview-Daten sind offen und für jedermann zugänglich: http://openplacereviews.org/data.
\n
\nMehr Informationen finden Sie unter: http://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">test.openplacereviews.org verwenden</string>
<string name="login_open_place_reviews">Anmelden bei OpenPlaceReviews</string>
</resources>

View file

@ -1212,7 +1212,7 @@
<string name="poi_description">Περιγραφή</string>
<string name="poi_phone">Τηλέφωνο</string>
<string name="poi_website">Ιστότοπος</string>
<string name="poi_email">Ηλ. διεύθυνση</string>
<string name="poi_email">Ηλεκτρονικό ταχυδρομείο</string>
<string name="poi_fax">Τηλεομοιότυπο (φαξ)</string>
<string name="facebook">Facebook</string>
<string name="twitter">Twitter</string>

View file

@ -778,7 +778,7 @@
<string name="context_menu_item_update_map">Ενημέρωση χάρτη</string>
<string name="context_menu_item_create_poi">Δημιουργία ΣΕ</string>
<string name="shared_string_yes">Ναι</string>
<string name="shared_string_cancel">Ακύρωση</string>
<string name="shared_string_cancel">Άκυρο</string>
<string name="shared_string_apply">Εφαρμογή</string>
<string name="shared_string_no">Όχι</string>
<string name="add_favorite_dialog_top_text">Εισαγωγή ονόματος αγαπημένου</string>
@ -813,7 +813,7 @@
<string name="edit_filter_delete_dialog_title">Διαγραφή αυτού του φίλτρου;</string>
<string name="edit_filter_delete_message">Το φίλτρο \'%1$s\' διαγράφηκε</string>
<string name="edit_filter_create_message">Το φίλτρο \'%1$s\' δημιουργήθηκε</string>
<string name="email">ηλ. διεύθυνση</string>
<string name="email">ηλεκτρονικό ταχυδρομείο</string>
<string name="intermediate_point_too_far">Ο ενδιάμεσος προορισμός %1$s είναι πολύ μακριά από τον πλησιέστερο δρόμο.</string>
<string name="arrived_at_intermediate_point">Φτάσατε στον ενδιάμεσο προορισμό σας</string>
<string name="context_menu_item_intermediate_point">Προσθήκη ως ενδιάμεσου προορισμού</string>
@ -1175,7 +1175,7 @@
<string name="keep_informing_never">Μόνο χειροκίνητα (πατήστε το βέλος)</string>
<string name="keep_informing">Επανάληψη οδηγιών πλοήγησης</string>
<string name="import_file_favourites">Αποθήκευση δεδομένων ως αρχείο GPX ή εισαγωγή σημείων διαδρομής στα \'Αγαπημένα\';</string>
<string name="shared_string_share">Διαμοιρασμός</string>
<string name="shared_string_share">Κοινοποίηση</string>
<string name="navigation_intent_invalid">Μη έγκυρη μορφή: %s</string>
<string name="stop_navigation_service">Διακοπή</string>
<string name="sleep_mode_stop_dialog">Διακοπή λειτουργίας παρασκηνίου του GPS;</string>
@ -1270,7 +1270,7 @@
<string name="dash_download_new_one">Λήψη Νέου Χάρτη</string>
<string name="map_locale">Γλώσσα χάρτη</string>
<string name="rendering_attr_roadStyle_name">Μορφή δρόμου</string>
<string name="rendering_value_default_name">Προκαθορισμένο</string>
<string name="rendering_value_default_name">Προεπιλογή</string>
<string name="rendering_value_orange_name">Πορτοκαλί</string>
<string name="traffic_warning_railways">Διασταύρωση σιδηροτροχιάς</string>
<string name="show_railway_warnings">Διασταυρώσεις σιδηροτροχιάς</string>
@ -1467,7 +1467,7 @@
<string name="track_segments">Τμήματα διαδρομής</string>
<string name="track_points">Σημεία της διαδρομής</string>
<string name="location_on_map">Τοποθεσία:\n Γ. Πλ %1$s\n Γ. Μηκ %2$s</string>
<string name="rendering_value__name">Προκαθορισμένο</string>
<string name="rendering_value__name">Προεπιλογή</string>
<string name="print_route">Εκτύπωση διαδρομής</string>
<string name="osmand_parking_overdue">εκπρόθεσμο</string>
<string name="simulate_your_location">Προσομοίωση της θέση σας</string>
@ -3013,7 +3013,7 @@
<string name="rendering_attr_showLez_description">Εμφάνιση στον χάρτη ζωνών για χαμηλή εκπομπή καυσαερίων. Δεν επηρεάζει τη δρομολόγηση.</string>
<string name="rendering_attr_showLez_name">Εμφάνιση ζωνών χαμηλής εκπομπής καυσαερίων</string>
<string name="temporary_conditional_routing">Λάβετε υπόψη τους προσωρινούς περιορισμούς</string>
<string name="shared_string_default">Προεπιλεγμένο</string>
<string name="shared_string_default">Προεπιλογή</string>
<string name="app_mode_pickup_truck">Ημιφορτηγό</string>
<string name="day">Ημέρα</string>
<string name="days_2_4">Ημέρες</string>
@ -3385,7 +3385,7 @@
<string name="monitoring_min_accuracy_descr_recommendation">Σύσταση: Είναι δύσκολο να προβλεφθεί τι θα εγγραφεί και τι όχι, ίσως είναι καλύτερο να απενεργοποιήσετε αυτό το φίλτρο.</string>
<string name="monitoring_min_accuracy_descr_remark">Παρατήρηση: Εάν το GPS είχε απενεργοποιηθεί αμέσως πριν μια εγγραφή, το πρώτο μετρούμενο σημείο μπορεί να έχει μειωμένη ακρίβεια, έτσι μπορεί να θέλουμε να περιμένουμε λιγάκι πριν την καταγραφή σημείου (ή να εγγράψουμε τα καλύτερα 3 διαδοχικά σημεία, κλπ.), αλλά αυτό δεν έχει ακόμα υλοποιηθεί.</string>
<string name="monitoring_min_distance_descr">Αυτό το φίλτρο αποφεύγει διπλά σημεία να εγγραφούν όταν έχει συμβεί πολύ λίγη ενεργή κίνηση, καθιστώντας καλύτερη τη χωροταξική εμφάνιση των ιχνών που δεν επεξεργάζονται αργότερα.</string>
<string name="button_rate">Τιμή</string>
<string name="button_rate">Βαθμολόγηση</string>
<string name="monitoring_min_distance_descr_side_effect">Παράπλευρα αποτελέσματα: Περίοδοι σε ακινησία δεν καταγράφονται καθόλου ή μόνο με ένα σημείο καθεμιά. Μικρές (πραγματικός κόσμος) κινήσεις (π.χ. πλάγιες, για να σημειώσουν έξοδο στο ταξίδι σας) μπορεί να φιλτραριστούν. Το αρχείο σας περιέχει λιγότερες πληροφορίες για μετεπεξεργασία και έχει χειρότερα στατιστικά φιλτράροντας προφανώς περιττά σημεία κατά τον χρόνο εγγραφής, ενώ δυνητικά διατηρεί παράσιτα που προκαλούνται από κακή λήψη ή επιπτώσεις κυκλωμάτων GPS.</string>
<string name="monitoring_min_distance_descr_recommendation">Σύσταση: Ρύθμιση 5 μέτρων μπορεί να λειτουργήσει καλά για σας, εάν δεν χρειάζεστε να πιάσετε λεπτομέρειες πιο ακριβείς από αυτό και δεν θέλετε να πάρετε δεδομένα σε ακινησία.</string>
<string name="live_monitoring_time_buffer">Ενδιάμεσος χρόνος</string>

View file

@ -3881,4 +3881,14 @@
<string name="poi_wildlife_crossing_bat_bridge">Ponto por vespertoj</string>
<string name="poi_wildlife_crossing">Trairejo por sovaĝaj bestoj</string>
<string name="poi_swimming_area">Naĝejo natura</string>
<string name="poi_piste_status_closed">Stato de skivojo: fermita</string>
<string name="poi_piste_status_open">Stato de skivojo: malfermita</string>
<string name="poi_patrolled_no">Kontrolata: ne</string>
<string name="poi_patrolled_yes">Kontrolata: jes</string>
<string name="poi_gladed_yes">Senarbigita: jes</string>
<string name="poi_piste_name">Nomo de skivojo</string>
<string name="poi_piste_ski_jump">Skisaltejo</string>
<string name="poi_mobile_library">Movebla biblioteko (haltloko)</string>
<string name="poi_summit_register_no">Pinttaglibro: ne</string>
<string name="poi_summit_register_yes">Pinttaglibro: jes</string>
</resources>

View file

@ -654,7 +654,7 @@
<string name="select_index_file_to_download">Trovis nenion. Se vi ne povas trovi vian regionon, vi povas fari ĝin mem (rigardu https://osmand.net).</string>
<string name="none_selected_gpx">Unue elektu GPXdosieron per frapetadi.</string>
<string name="local_index_select_gpx_file">Elektu kurson</string>
<string name="gpx_split_interval">Intertempo de divido</string>
<string name="gpx_split_interval">Fragmento</string>
<string name="sort_by_distance">Ordigi laŭ distanco</string>
<string name="sort_by_name">Ordigi laŭ nomo</string>
<string name="plugin_touringview_name">Turisma map-vido</string>
@ -2405,7 +2405,7 @@
<string name="mapillary_action_descr">Kontribui viajn strat-nivelajn vidaĵojn pri tiu ĉi loko al Mapillary.</string>
<string name="plugin_mapillary_descr">Strat-nivelaj fotoj por ĉiuj. Esplori lokojn, kunlabori kaj foti la mondon.</string>
<string name="online_photos">Enretaj fotoj</string>
<string name="no_photos_descr">Neniuj fotoj tie ĉi.</string>
<string name="no_photos_descr">Neniu foto tie ĉi.</string>
<string name="shared_string_install">Instali</string>
<string name="improve_coverage_mapillary">Pliigi fotan atingon de Mapillary</string>
<string name="improve_coverage_install_mapillary_desc">Instalu la aplikaĵon Mapillary por aldoni fotojn al tiu ĉi loko sur la mapo.</string>
@ -3967,7 +3967,7 @@
<string name="select_folder">Elekti dosierujon</string>
<string name="select_folder_descr">Elekti dosierujon aŭ krei novan</string>
<string name="shared_string_empty">Malplena</string>
<string name="analyze_by_intervals">Analizi laŭ intertempoj (dividoj)</string>
<string name="analyze_by_intervals">Analizi laŭ fragmentoj</string>
<string name="upload_to_openstreetmap">Alŝuti al OpenStreetMap</string>
<string name="edit_track">Redakti spuron</string>
<string name="rename_track">Renomi spuron</string>
@ -4011,4 +4011,26 @@
<string name="uploading_count">Sendado de %1$d el %2$d</string>
<string name="uploaded_count">Sendis %1$d el %2$d</string>
<string name="toast_select_edits_for_upload">Elektu redaktojn por sendi</string>
<string name="hillshade_slope_contour_lines">Nivelombrumo / dekliveco / nivelkurboj</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews estas komunuma projekto pri publikaj lokoj, kiel restoracioj, hoteloj, muzeoj, rekoniloj, ktp. Ĝi kolektas diversajn publikajn informojn pri tiuj punktoj: fotojn, opiniojn, ligilojn al OpenStreetMap kaj Vikipedio.
\n
\nĈiuj OpenPlaceReviewdatumoj estas malfermaj kaj disponeblaj por ĉiu: http://openplacereviews.org/data
\n
\nPliaj informoj ĉe http://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Uzi test.openplacereviews.org</string>
<string name="login_open_place_reviews">Ensaluti al OpenPlaceReviews</string>
<string name="activity_type_water_name">Akvo</string>
<string name="activity_type_winter_name">Vintro</string>
<string name="activity_type_snowmobile_name">Motorsledo</string>
<string name="activity_type_riding_name">Rajdado</string>
<string name="activity_type_racing_name">Kurkonkurso</string>
<string name="activity_type_mountainbike_name">Montbiciklo</string>
<string name="activity_type_cycling_name">Biciklado</string>
<string name="activity_type_hiking_name">Marŝado</string>
<string name="activity_type_running_name">Kurado</string>
<string name="activity_type_walking_name">Piedirado</string>
<string name="activity_type_offroad_name">Ekstervoje</string>
<string name="activity_type_motorbike_name">Motorciklo</string>
<string name="activity_type_car_name">Aŭto</string>
</resources>

View file

@ -2723,7 +2723,7 @@
<string name="poi_aquaculture_mussels">Acuicultura: mejillones</string>
<string name="poi_min_age">Edad mínima</string>
<string name="poi_organic_yes"></string>
<string name="poi_organic_no">No</string>
<string name="poi_organic_no">Productos orgánicos: no</string>
<string name="poi_organic_only">Únicamente</string>
<string name="poi_traffic_mirror">Espejo de tráfico</string>
<string name="poi_diplomatic_consulate">Consulado</string>

View file

@ -1222,8 +1222,7 @@
<string name="osmand_net_previously_installed">Todos los datos sin conexión en la versión vieja de OsmAnd son compatibles con la nueva versión, pero los puntos de Favoritos deben exportarse desde la versión vieja y luego, importarse en la nueva.</string>
<string name="build_installed">Compilación {0} instalada ({1}).</string>
<string name="downloading_build">Descargando compilación…</string>
<string name="install_selected_build">¿Instalar OsmAnd?
\nVersión: {0}
<string name="install_selected_build">¿Instalar OsmAnd {0}\?
\nFecha: {1}
\nTamaño: {2} MB</string>
<string name="loading_builds_failed">Error al recuperar la lista de compilaciones de OsmAnd</string>
@ -2063,7 +2062,7 @@
<string name="shared_string_notifications">Notificaciones</string>
<string name="gpx_no_tracks_title">Sin archivos de trazas aún</string>
<string name="gpx_no_tracks_title_folder">También puedes añadir archivos de trazas a la carpeta</string>
<string name="gpx_add_track">Añadir GPX</string>
<string name="gpx_add_track">Añadir más…</string>
<string name="shared_string_appearance">Aspecto</string>
<string name="rendering_value_fine_name">Muy fino</string>
<string name="route_calculation">Cálculo de la ruta</string>
@ -3732,8 +3731,8 @@
<string name="add_hidden_group_info">El punto añadido no será visible en el mapa, ya que el grupo elegido está oculto, se puede encontrar en «%s».</string>
<string name="track_show_start_finish_icons">Mostrar los iconos de inicio y fin</string>
<string name="select_track_width">Elegir la anchura</string>
<string name="gpx_split_interval_descr">Marca el intervalo en el que se mostrarán las marcas con distancia o tiempo en la traza.</string>
<string name="gpx_split_interval_none_descr">Marca la opción de división deseada: por tiempo o por distancia.</string>
<string name="gpx_split_interval_descr">Elige el intervalo de la traza en el que se mostrarán las marcas con la distancia o el tiempo.</string>
<string name="gpx_split_interval_none_descr">Elige la opción de división deseada: por tiempo o por distancia.</string>
<string name="shared_string_custom">Personalizado</string>
<string name="gpx_direction_arrows">Flechas de dirección</string>
<string name="track_coloring_solid">Sólido</string>
@ -3970,7 +3969,7 @@
<string name="select_folder">Elegir carpeta</string>
<string name="select_folder_descr">Elegir carpeta o añadir una nueva</string>
<string name="shared_string_empty">Vacío</string>
<string name="analyze_by_intervals">Analizar por intervalos (intervalo de división)</string>
<string name="analyze_by_intervals">Analizar intervalos divididos</string>
<string name="upload_to_openstreetmap">Subir a OpenStreetMap</string>
<string name="edit_track">Editar traza</string>
<string name="rename_track">Renombrar traza</string>
@ -4014,4 +4013,13 @@
<string name="uploading_count">Subiendo %1$d de %2$d</string>
<string name="uploaded_count">Se subieron %1$d de %2$d</string>
<string name="toast_select_edits_for_upload">Marcar ediciones a subir</string>
<string name="hillshade_slope_contour_lines">Sombreado / Pendiente / Curvas de nivel</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews es un proyecto impulsado por la comunidad sobre lugares públicos como restaurantes, hoteles, museos, puntos de referencia. Recoge toda la información pública sobre ellos como fotos, reseñas, enlaces a otros servicios como OpenStreetMap y Wikipedia.
\n
\nTodos los datos de OpenPlaceReviews son abiertos y están disponibles para todos: http://openplacereviews.org/data.
\n
\nPuedes leer más en: https://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Usar test.openplacereviews.org</string>
<string name="login_open_place_reviews">Acceder a OpenPlaceReviews</string>
</resources>

View file

@ -2382,7 +2382,7 @@
<string name="store_tracks_in_monthly_directories">Enregistrer les traces dans des dossiers mensuels</string>
<string name="store_tracks_in_monthly_directories_descrp">Enregistrer les traces dans des sous-dossiers organisés par mois (par exemple 2018-01).</string>
<string name="of">%1$d de %2$d</string>
<string name="moving_time">Durée de déplacement</string>
<string name="moving_time">Durée de mouvement</string>
<string name="min_max">Min / Max</string>
<string name="rendering_value_translucent_pink_name">Rose translucide</string>
<string name="quick_action_resume_pause_navigation">Suspendre / Reprendre la Navigation</string>
@ -3981,7 +3981,7 @@
<string name="message_name_is_already_exists">Ce nom existe déjà</string>
<string name="routing_engine_vehicle_type_hgv">Poids lourd</string>
<string name="announcement_time_passing">Durée</string>
<string name="analyze_by_intervals">Analyser par intervalles (fractionner)</string>
<string name="analyze_by_intervals">Analyser par intervalles de fractionnement</string>
<string name="announcement_time_intervals">Intervalles de temps et de distance</string>
<string name="announcement_time_descr">Le délai d\'annonce des alertes vocales dépend du type d\'annonce, de la vitesse actuelle et du type de navigation.</string>
<string name="announcement_time_title">Délai de l\'annonce</string>
@ -4001,4 +4001,17 @@
<string name="uploaded_count">%1$d sur %2$d envoyé</string>
<string name="upload_photo">Envoi en cours</string>
<string name="upload_photo_completed">Envoi terminé</string>
<string name="hillshade_slope_contour_lines">Ombrage du relief / Pente / Courbes de niveaux</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Utilisez test.openplacereviews.org</string>
<string name="login_open_place_reviews">Se connecter à OpenPlaceReviews</string>
<string name="activity_type_water_name">Eau</string>
<string name="activity_type_winter_name">Hiver</string>
<string name="activity_type_snowmobile_name">Motoneige</string>
<string name="activity_type_cycling_name">Vélo</string>
<string name="activity_type_mountainbike_name">VTT</string>
<string name="activity_type_hiking_name">Randonnée</string>
<string name="activity_type_running_name">Course à pied</string>
<string name="activity_type_walking_name">Marche</string>
<string name="activity_type_car_name">Voiture</string>
</resources>

View file

@ -3998,4 +3998,35 @@ Lon %2$s</string>
<string name="routing_engine_vehicle_type_mtb">Bicicleta de montaña</string>
<string name="message_server_error">Erro do servidor: %1$s</string>
<string name="message_name_is_already_exists">O nome xa existe</string>
<string name="analyze_by_intervals">Analizar intres divididos</string>
<string name="upload_to_openstreetmap">Subir ao OpenStreetMap</string>
<string name="edit_track">Editar pista</string>
<string name="rename_track">Renomear pista</string>
<string name="change_folder">Mudar cartafol</string>
<string name="shared_string_sec">seg</string>
<string name="announcement_time_passing">Pasando</string>
<string name="announcement_time_approach">Aproximación</string>
<string name="announcement_time_prepare_long">Longa preparación</string>
<string name="announcement_time_prepare">Preparar</string>
<string name="announcement_time_off_route">Fóra da ruta</string>
<string name="delete_online_routing_engine">Eliminar este motor de navegación en liña\?</string>
<string name="context_menu_read_full">Ler completo</string>
<string name="context_menu_edit_descr">Editar descrición</string>
<string name="delete_waypoints">Eliminar puntos de referencia</string>
<string name="copy_to_map_markers">Copiar ás marcaxes do mapa</string>
<string name="copy_to_map_favorites">Copiar aos favoritos</string>
<string name="upload_photo">Subindo</string>
<string name="upload_photo_completed">Subida completa</string>
<string name="uploading_count">Subindo %1$d de %2$d</string>
<string name="uploaded_count">Subíronse %1$d de %2$d</string>
<string name="toast_select_edits_for_upload">Seleccionar edicións para subir</string>
<string name="hillshade_slope_contour_lines">Sombras do relevo / Pendentes / Curvas de nivel</string>
<string name="open_place_reviews_plugin_description">O OpenPlaceReviews é un proxecto impulsado pola comunidade sobre lugares públicos como restaurantes, hoteis, museos, puntos de referencia. Recolle toda a información pública sobre eles como imaxes, recesións, ligazóns a outros servizos como OpenStreetMap e Wikipedia.
\n
\nTodos os datos do OpenPlaceReviews son abertos e están dispoñíbeis para todos: http://openplacereviews.org/data.
\n
\nPodes ler máis en: https://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Empregar test.openplacereviews.org</string>
<string name="login_open_place_reviews">Iniciar sesión ao OpenPlaceReviews</string>
</resources>

View file

@ -54,7 +54,7 @@
<string name="poi_service_tyres">Autógumi-szerelő</string>
<string name="poi_car_wash">Autómosó</string>
<string name="poi_fuel">Benzinkút;Töltőállomás;Gázolajtöltő-állomás</string>
<string name="poi_electricity_combined_charging">Elektromos töltőállomás</string>
<string name="poi_electricity_combined_charging">Elektromos töltőállomás;Elektromos autó töltése;Villanyautó töltése;Elektromos töltőpont</string>
<string name="poi_compressed_air">Sűrített levegő</string>
<string name="poi_parking">Parkoló</string>
<string name="poi_motorcycle_parking">Motorkerékpár-parkoló</string>
@ -3879,4 +3879,14 @@
<string name="poi_wildlife_crossing_bat_tunnel">Denevéralagút</string>
<string name="poi_wildlife_crossing_bat_bridge">Denevérhíd</string>
<string name="poi_wildlife_crossing">Vadátjáró</string>
<string name="poi_summit_register_no">Csúcsnapló nincs</string>
<string name="poi_summit_register_yes">Csúcsnapló van</string>
<string name="poi_patrolled_no">Hegyi mentő nincs</string>
<string name="poi_patrolled_yes">Hegyi mentő van</string>
<string name="poi_gladed_yes">Erdei pálya</string>
<string name="poi_mobile_library">Mozgó könyvtár tartózkodási helye</string>
<string name="poi_piste_status_closed">Pálya állapota: zárva</string>
<string name="poi_piste_status_open">Pálya állapota: nyitva</string>
<string name="poi_piste_name">Pálya neve</string>
<string name="poi_piste_ski_jump">Síugrósánc</string>
</resources>

View file

@ -3881,4 +3881,14 @@
<string name="poi_wildlife_crossing_bat_bridge">Brú fyrir leðurblökur</string>
<string name="poi_wildlife_crossing">Þverun villtra dýra</string>
<string name="poi_swimming_area">Sundsvæði</string>
<string name="poi_mobile_library">Stæði fyrir bókabíl</string>
<string name="poi_summit_register_no">Skráning á tind: nei</string>
<string name="poi_summit_register_yes">Skráning á tind: já</string>
<string name="poi_piste_status_closed">Staða brautar: lokuð</string>
<string name="poi_piste_status_open">Staða brautar: opin</string>
<string name="poi_patrolled_no">Eftirlit: nei</string>
<string name="poi_patrolled_yes">Eftirlit: já</string>
<string name="poi_gladed_yes">Skafið: já</string>
<string name="poi_piste_name">Heiti brautar</string>
<string name="poi_piste_ski_jump">Skíðastökk</string>
</resources>

View file

@ -3972,7 +3972,7 @@
<string name="select_folder">Veldu möppu</string>
<string name="select_folder_descr">Veldu möppu eða bættu við nýrri</string>
<string name="shared_string_empty">Tómt</string>
<string name="analyze_by_intervals">Greina eftir millibilum (uppskipting millibila)</string>
<string name="analyze_by_intervals">Greina eftir uppskiptingu millibila</string>
<string name="upload_to_openstreetmap">Senda inn í OpenStreetMap</string>
<string name="edit_track">Breyta ferli</string>
<string name="rename_track">Endurnefna feril</string>
@ -4005,4 +4005,32 @@
<string name="routing_engine_vehicle_type_mtb">Fjallahjól</string>
<string name="message_server_error">Villa í netþjóni: %1$s</string>
<string name="message_name_is_already_exists">Nafnið er þegar til staðar</string>
<string name="delete_online_routing_engine">Eyða þessari leiðagerð á netinu\?</string>
<string name="context_menu_read_full">Lesa óstytt</string>
<string name="context_menu_edit_descr">Breyta lýsingu</string>
<string name="delete_waypoints">Eyða ferilpunktum</string>
<string name="copy_to_map_markers">Afrita í kortamerki</string>
<string name="copy_to_map_favorites">Afrita í eftirlæti</string>
<string name="upload_photo">Sendi inn</string>
<string name="upload_photo_completed">Innsendingu er lokið</string>
<string name="uploading_count">Sendi inn %1$d af %2$d</string>
<string name="uploaded_count">Sent inn %1$d af %2$d</string>
<string name="toast_select_edits_for_upload">Veldu breytingar til að senda inn</string>
<string name="hillshade_slope_contour_lines">Hæðaskygging / Halli / Hæðarlínur</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Nota test.openplacereviews.org</string>
<string name="login_open_place_reviews">Skrá inn á OpenPlaceReviews</string>
<string name="activity_type_water_name">Vatn</string>
<string name="activity_type_winter_name">Vetur</string>
<string name="activity_type_snowmobile_name">Vélsleðar</string>
<string name="activity_type_riding_name">Útreiðar</string>
<string name="activity_type_racing_name">Kappakstur</string>
<string name="activity_type_mountainbike_name">Fjallahjól</string>
<string name="activity_type_cycling_name">Hjólreiðar</string>
<string name="activity_type_hiking_name">Gönguferðir</string>
<string name="activity_type_running_name">Hlaup</string>
<string name="activity_type_walking_name">Gangandi</string>
<string name="activity_type_offroad_name">Utanvegaakstur</string>
<string name="activity_type_motorbike_name">Vélhjól</string>
<string name="activity_type_car_name">Akandi</string>
</resources>

View file

@ -3925,4 +3925,37 @@
\n"</string>
<string name="plan_route_join_segments">Unisci segmenti</string>
<string name="plan_route_split_before">Spezza</string>
<string name="announcement_time_arrive">Arrivo a destinazione</string>
<string name="shared_string_turn">Svolta</string>
<string name="start_recording">Avvia registrazione</string>
<string name="show_track_on_map">Mostra il percorso sulla mappa</string>
<string name="routing_engine_vehicle_type_wheelchair">Sedia a rotelle</string>
<string name="routing_engine_vehicle_type_hiking">Escursionismo</string>
<string name="routing_engine_vehicle_type_walking">A piedi</string>
<string name="routing_engine_vehicle_type_hgv">Mezzi pesanti</string>
<string name="routing_engine_vehicle_type_truck">Camion</string>
<string name="routing_engine_vehicle_type_scooter">Scooter</string>
<string name="routing_engine_vehicle_type_racingbike">Bici da corsa</string>
<string name="routing_engine_vehicle_type_mtb">MTB</string>
<string name="message_server_error">Errore del server: %1$s</string>
<string name="message_name_is_already_exists">Il nome esiste già</string>
<string name="delete_online_routing_engine">Eliminare questo motore di routing online\?</string>
<string name="context_menu_edit_descr">Modifica descrizione</string>
<string name="delete_waypoints">Elimina i waypoint</string>
<string name="copy_to_map_markers">Aggiungi ai marcatori</string>
<string name="copy_to_map_favorites">Copia nei preferiti</string>
<string name="upload_photo">Caricamento</string>
<string name="upload_photo_completed">Caricamento completato</string>
<string name="uploading_count">Carico %1$d di %2$d</string>
<string name="uploaded_count">Caricati %1$d di %2$d</string>
<string name="toast_select_edits_for_upload">Seleziona le modifiche per il caricamento</string>
<string name="hillshade_slope_contour_lines">Hillshade / Pendenza / Linee di contorno</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews è un progetto community-driven su luoghi pubblici come ristoranti, hotel, musei, waypoint. Raccoglie tutte le informazioni pubbliche su di essi come foto, recensioni, link ad altri sistemi che collegano OpenStreetMap, Wikipedia.
\n
\nTutti i dati di OpenPlaceReview sono aperti e disponibili a tutti: http://openplacereviews.org/data.
\n
\nPer maggiori informazioni: http://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Usa test.openplacereviews.org</string>
<string name="login_open_place_reviews">Accedi a OpenPlaceReviews</string>
</resources>

View file

@ -3970,7 +3970,7 @@
<string name="select_folder">בחירת תקינה</string>
<string name="select_folder_descr">נא לבחור תיקייה או להוסיף אחת חדשה</string>
<string name="shared_string_empty">ריק</string>
<string name="analyze_by_intervals">ניתוח לפי מרווחים (פיצול מרווחים)</string>
<string name="analyze_by_intervals">ניתוח מרווחי פיצול</string>
<string name="upload_to_openstreetmap">העלאה ל־OpenStreetMap</string>
<string name="edit_track">עריכת מסלול</string>
<string name="rename_track">שינוי שם מסלול</string>
@ -4013,4 +4013,14 @@
<string name="uploading_count">נשלחות %1$d מתוך %2$d</string>
<string name="uploaded_count">נשלחו %1$d מתוך %2$d</string>
<string name="toast_select_edits_for_upload">נא לבחור עריכות לשליחה</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">להשתמש ב־test.openplacereviews.org</string>
<string name="login_open_place_reviews">כניסה ל־OpenPlaceReviews</string>
<string name="announcement_time_descr">זמן ההכרזה של ההנחיות הקוליות השונות תלוי בסוג ההכרזה, במהירות הניווט הנוכחית ובמהירות הניווט כבררת מחדל.</string>
<string name="hillshade_slope_contour_lines">הצללה / מדרון / קווי מתאר</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews הוא מיזם בהובלת הקהילה בנוגע למקומות ציבוריים כגון מסעדות, מלונות, מוזיאונים ונקודות דרך. הוא אוסף מידע ציבורי עליהם כגון תמונות, סקירות, קישורים למערכות אחרות שמקושרות ל־OpenStreetMap, ויקיפדיה.
\n
\nכל הנתונים של OpenPlaceReview הם פתוחים וזמינים לציבור הרחב: http://openplacereviews.org/data.
\n
\nניתן לקרוא עוד באתר: http://openplacereviews.org</string>
</resources>

View file

@ -3881,4 +3881,14 @@
<string name="poi_wildlife_crossing_bat_tunnel">Túnel para morcego</string>
<string name="poi_wildlife_crossing_bat_bridge">Ponte para morcego</string>
<string name="poi_wildlife_crossing">Travessia de vida selvagem</string>
<string name="poi_mobile_library">Posição de parada da biblioteca móvel</string>
<string name="poi_summit_register_no">Registro de conferência: não</string>
<string name="poi_summit_register_yes">Registro de conferência: sim</string>
<string name="poi_piste_status_closed">Status da pista: fechada</string>
<string name="poi_piste_status_open">Status da pista: aberta</string>
<string name="poi_patrolled_no">Patrulhado: não</string>
<string name="poi_patrolled_yes">Patrulhado: sim</string>
<string name="poi_gladed_yes">Satisfeito: sim</string>
<string name="poi_piste_name">Nome da pista</string>
<string name="poi_piste_ski_jump">Salto de esqui</string>
</resources>

View file

@ -3782,7 +3782,7 @@
<string name="plan_route_change_route_type_before">Alterar o tipo de rota antes</string>
<string name="plan_route_change_route_type_after">Alterar o tipo de rota após</string>
<string name="simplified_track">Trilha simplificada</string>
<string name="simplified_track_description">Apenas a linha da rota será salva, os waypoints serão excluídos.</string>
<string name="simplified_track_description">Apenas a linha da rota será salva, os pontos de passagem serão excluídos.</string>
<string name="shared_string_file_name">Nome do arquivo</string>
<string name="number_of_gpx_files_selected_pattern">%s arquivos de trilha selecionados</string>
<string name="disable_recording_once_app_killed_descrp">O registro de trilhas fará uma pausa quando o aplicativo for encerrado (por meio de aplicativos recentes). (A indicação de segundo plano do OsmAnd desaparece da barra de notificação do Android.)</string>
@ -3962,7 +3962,7 @@
<string name="select_folder">Selecione a pasta</string>
<string name="select_folder_descr">Selecione a pasta ou adicione uma nova</string>
<string name="shared_string_empty">Vazio</string>
<string name="analyze_by_intervals">Analisar por intervalos (intervalo de divisão)</string>
<string name="analyze_by_intervals">Analisar intervalos de divisão</string>
<string name="upload_to_openstreetmap">Carregar para OpenStreetMap</string>
<string name="edit_track">Editar trilha</string>
<string name="rename_track">Renomear trilha</string>
@ -4006,4 +4006,5 @@
<string name="uploading_count">Carregando %1$d de %2$d</string>
<string name="uploaded_count">Carregado %1$d de %2$d</string>
<string name="toast_select_edits_for_upload">Selecione as edições para carregamento</string>
<string name="hillshade_slope_contour_lines">Sombras de relevo / Encostas / Curvas de nível</string>
</resources>

View file

@ -3878,4 +3878,5 @@
<string name="poi_waste_transfer_station">Станция перекачки отходов</string>
<string name="poi_ranger_station">Станция рейнджеров</string>
<string name="poi_swimming_area">Место для купания</string>
<string name="poi_wildlife_crossing">Экодук</string>
</resources>

View file

@ -3992,4 +3992,13 @@
<string name="uploading_count">Отправка %1$d из %2$d</string>
<string name="uploaded_count">Отправлено %1$d из %2$d</string>
<string name="toast_select_edits_for_upload">Выберите правки для отправки</string>
<string name="hillshade_slope_contour_lines">Рельеф / Уклон/ Контурные линии</string>
<string name="shared_string_vehicle">Транспортное средство</string>
<string name="routing_engine_vehicle_type_bike">Велосипед</string>
<string name="routing_engine_vehicle_type_cycling_electric">Электрический велосипед</string>
<string name="routing_engine_vehicle_type_cycling_mountain">Горный велосипед</string>
<string name="routing_engine_vehicle_type_cycling_road">Шоссейный велосипед</string>
<string name="routing_engine_vehicle_type_cycling_regular">Обычный велосипед</string>
<string name="routing_engine_vehicle_type_racingbike">Гоночный велосипед</string>
<string name="routing_engine_vehicle_type_mtb">Горный велосипед</string>
</resources>

View file

@ -2415,7 +2415,7 @@
<string name="distance_moving">Vzdialenosť opravená</string>
<string name="shared_string_permissions">Povolenia</string>
<string name="import_gpx_failed_descr">Nepodarilo sa naimportovať súbor. Prosím zabezpečte, že OsmAnd má oprávnenie čítať súbor.</string>
<string name="map_widget_ruler_control">Polomerové pravítko</string>
<string name="map_widget_ruler_control">Kruhové pravítko</string>
<string name="shared_string_reset">Resetovať</string>
<string name="shared_string_reload">Znovu načítať</string>
<string name="mapillary_menu_descr_tile_cache">Znovu načítať dlaždice pre získanie aktuálnych dát.</string>
@ -3580,7 +3580,7 @@
<string name="tracker_item">Stopovanie OsmAnd</string>
<string name="mapillary_item">OsmAnd + Mapillary</string>
<string name="quick_action_item">Rýchla akcia</string>
<string name="radius_ruler_item">Polomerové pravítko</string>
<string name="radius_ruler_item">Kruhové pravítko</string>
<string name="measure_distance_item">Merať vzdialenosť</string>
<string name="travel_item">Cestovanie (Wikivoyage a Wikipédia)</string>
<string name="map_markers_item">Mapové značky</string>
@ -3962,7 +3962,7 @@
<string name="select_folder">Zvoľte priečinok</string>
<string name="select_folder_descr">Zvoľte priečinok alebo pridajte nový</string>
<string name="shared_string_empty">Prázdne</string>
<string name="analyze_by_intervals">Analyzovať podľa intervalov (rozdeliť interval)</string>
<string name="analyze_by_intervals">Analyzovať rozdelené intervaly</string>
<string name="upload_to_openstreetmap">Nahrať do OpenStreetMap</string>
<string name="edit_track">Upraviť stopu</string>
<string name="rename_track">Premenovať stopu</string>
@ -4006,4 +4006,5 @@
<string name="uploading_count">Odosiela sa %1$d z %2$d</string>
<string name="uploaded_count">Odoslané %1$d z %2$d</string>
<string name="toast_select_edits_for_upload">Zvoľte úpravy na odoslanie</string>
<string name="hillshade_slope_contour_lines">Tieňované svahy / Sklony svahov / Vrstevnice</string>
</resources>

View file

@ -502,7 +502,7 @@
<string name="poi_climbing">Tırmanma</string>
<string name="poi_cricket">Kriket</string>
<string name="poi_croquet">Kroket</string>
<string name="poi_cycling">Bisiklete binme</string>
<string name="poi_cycling">Bisiklet sürme</string>
<string name="poi_diving">Dalış</string>
<string name="poi_scuba_diving">Tüplü dalış</string>
<string name="poi_dog_racing">Köpek yarışı</string>

View file

@ -2227,7 +2227,7 @@
<string name="marker_save_as_track_descr">İşaretleyicilerinizi şu GPX dosyasına aktarın:</string>
<string name="show_arrows_on_the_map">Haritada yön gösterici okları göster</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd seçilmiş profil için rotalı noktalara bağlanacak.</string>
<string name="none_point_error">Lütfen en az bir nokta ekleyiniz.</string>
<string name="none_point_error">Lütfen en az bir nokta ekleyin.</string>
<string name="measurement_tool_action_bar">Haritayı görüntüle ve nokta ekle</string>
<string name="store_tracks_in_monthly_directories">Kaydedilmiş izlenen yolları aylık klasörlerde depola</string>
<string name="mapillary_menu_filter_description">Resimleri göndericiye, tarihe ya da türüne göre filtreleyin. Sadece yakın mesafe yakınlaştırmasında etkin.</string>
@ -3738,7 +3738,7 @@
<string name="track_coloring_solid">Koyu</string>
<string name="plan_route_last_edited">Son düzenleme</string>
<string name="plan_route_import_track">Yolu içe aktar</string>
<string name="plan_route_open_existing_track">Mevcut yolu aç</string>
<string name="plan_route_open_existing_track">Var olan yolu aç</string>
<string name="plan_route_create_new_route">Yeni güzergah oluştur</string>
<string name="plan_route_select_track_file_for_open">Açmak için bir yol dosyası seçin.</string>
<string name="shared_string_done">Bitti</string>
@ -3968,7 +3968,7 @@
<string name="select_folder">Klasör seç</string>
<string name="select_folder_descr">Klasör seçin veya yeni bir tane ekleyin</string>
<string name="shared_string_empty">Boş</string>
<string name="analyze_by_intervals">Aralıklara göre analiz et (bölme aralığı)</string>
<string name="analyze_by_intervals">Bölünmüş aralıkları analiz et</string>
<string name="upload_to_openstreetmap">OpenStreetMap\'e yükle</string>
<string name="edit_track">Yolu düzenle</string>
<string name="rename_track">Yolu yeniden adlandır</string>
@ -4012,4 +4012,26 @@
<string name="uploading_count">%1$d / %2$d karşıya yükleniyor</string>
<string name="uploaded_count">%1$d / %2$d karşıya yüklendi</string>
<string name="toast_select_edits_for_upload">Karşıya yüklenecek düzenlemeleri seçin</string>
<string name="hillshade_slope_contour_lines">tepe gölgesi / yamaç / eş yükselti eğrileri</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews, restoranlar, oteller, müzeler, ara noktalar gibi halka açık yerler hakkında topluluk tarafından yürütülen bir projedir. Fotoğraflar, yorumlar, OpenStreetMap, Wikipedia gibi diğer sistemlere bağlantılar gibi onlar hakkındaki tüm halka açık bilgileri toplar.
\n
\nTüm OpenPlaceReview verileri açık ve herkes tarafından kullanılabilir: http://openplacereviews.org/data
\n
\nDaha fazlasını şu adresten okuyabilirsiniz: http://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">test.openplacereviews.org adresini kullan</string>
<string name="login_open_place_reviews">OpenPlaceReviews\'te oturum aç</string>
<string name="activity_type_water_name">Su</string>
<string name="activity_type_winter_name">Kış</string>
<string name="activity_type_snowmobile_name">Kar arabası</string>
<string name="activity_type_riding_name">Binme</string>
<string name="activity_type_racing_name">Yarış</string>
<string name="activity_type_mountainbike_name">Dağ bisikleti</string>
<string name="activity_type_cycling_name">Bisiklet sürme</string>
<string name="activity_type_hiking_name">Yürüyüş</string>
<string name="activity_type_running_name">Koşma</string>
<string name="activity_type_walking_name">Yürüme</string>
<string name="activity_type_offroad_name">Arazi</string>
<string name="activity_type_motorbike_name">Motosiklet</string>
<string name="activity_type_car_name">Araba</string>
</resources>

View file

@ -3881,4 +3881,10 @@
<string name="poi_wildlife_crossing_bat_tunnel">Тунель кажанів</string>
<string name="poi_wildlife_crossing_bat_bridge">Міст кажанів</string>
<string name="poi_wildlife_crossing">Переправа диких тварин</string>
<string name="poi_piste_status_closed">Стан траси: зачинена</string>
<string name="poi_piste_status_open">Стан траси: відчинена</string>
<string name="poi_patrolled_no">Патрулюється: ні</string>
<string name="poi_patrolled_yes">Патрулюється: так</string>
<string name="poi_piste_name">Назва траси</string>
<string name="poi_piste_ski_jump">рибки на лижах</string>
</resources>

View file

@ -2971,7 +2971,7 @@
<string name="app_mode_skiing">Лижі</string>
<string name="base_profile_descr_ski">Лижі</string>
<string name="show_compass_ruler">Показати компас-лінійку</string>
<string name="hide_compass_ruler">Приховати компас-лінійку</string>
<string name="hide_compass_ruler">Сховати компас-лінійку</string>
<string name="select_icon_profile_dialog_title">Оберіть значок</string>
<string name="settings_routing_mode_string">Режим: %s</string>
<string name="settings_derived_routing_mode_string">Користувацький режим, похідний від: %s</string>
@ -2988,7 +2988,7 @@
<string name="profile_alert_need_save_title">Зберегти зміни</string>
<string name="profile_alert_need_save_msg">Спочатку збережіть зміни в профілі</string>
<string name="profile_alert_delete_title">Видалити профіль</string>
<string name="profile_alert_delete_msg">Ви дійсно хочете видалити профіль %s\?</string>
<string name="profile_alert_delete_msg">Ви дійсно хочете видалити профіль «%s»</string>
<string name="select_base_profile_dialog_title">Виберіть профіль для початку</string>
<string name="process_downloading_service">Служба завантаження OsmAnd</string>
<string name="shared_string_color_magenta">Пурпуровий</string>
@ -3302,7 +3302,7 @@
<string name="added_profiles_descr">Профілі, додані втулком</string>
<string name="shared_string_turn_off">Вимкнути</string>
<string name="new_plugin_added">Нова втулка додана</string>
<string name="join_segments">Приєднати частки</string>
<string name="join_segments">Об’єднати сегменти</string>
<string name="add_new_profile_q">Додати новий профіль \'%1$s\'\?</string>
<string name="save_heading">Зберегти заголовок</string>
<string name="save_heading_descr">Зберегти заголовок для кожної точки треку під час запису.</string>
@ -3736,7 +3736,7 @@
<string name="track_coloring_solid">Суцільний</string>
<string name="plan_route_last_edited">В останнє змінено</string>
<string name="plan_route_import_track">Імпортувати трек</string>
<string name="plan_route_open_existing_track">Переглянути наявний трек</string>
<string name="plan_route_open_existing_track">Відкрити наявний трек</string>
<string name="plan_route_create_new_route">Створити новий маршрут</string>
<string name="plan_route_select_track_file_for_open">Виберіть який файл з треком відкрити.</string>
<string name="shared_string_done">Готово</string>
@ -3966,7 +3966,7 @@
<string name="select_folder">Вибрати теку</string>
<string name="select_folder_descr">Виберіть теку або додайте нову</string>
<string name="shared_string_empty">Порожньо</string>
<string name="analyze_by_intervals">Аналіз за інтервалами (розділений інтервал)</string>
<string name="analyze_by_intervals">Аналізувати розділені інтервали</string>
<string name="upload_to_openstreetmap">Відвантажити на OpenStreetMap</string>
<string name="edit_track">Редагувати трек</string>
<string name="rename_track">Перейменувати трек</string>
@ -4010,4 +4010,5 @@
<string name="uploading_count">Вивантаження %1$d з %2$d</string>
<string name="uploaded_count">Вивантажено %1$d з %2$d</string>
<string name="toast_select_edits_for_upload">Виберіть зміни для вивантаження</string>
<string name="hillshade_slope_contour_lines">Рельєф місцевості / Схили / Горизонталі</string>
</resources>

View file

@ -35,7 +35,7 @@
<string name="avoid_motorway">避開高速路</string>
<string name="auto_zoom_map">自动缩放地图</string>
<string name="recalculate_route_to_your_location">運輸方式:</string>
<string name="select_navigation_mode">選擇傳輸模式</string>
<string name="select_navigation_mode">运输模式:</string>
<string name="map_widget_renderer">地图风格</string>
<string name="map_widget_fluorescent">熒光路線</string>
<string name="map_widget_show_ruler">統治者</string>
@ -430,9 +430,9 @@
<string name="local_indexes_cat_srtm">等高线数据</string>
<string name="av_def_action_video">录制视频</string>
<string name="av_def_action_audio">录制音频</string>
<string name="av_widget_action_descr">选择缺省窗体动作。</string>
<string name="av_widget_action_descr">默认小部件操作:</string>
<string name="av_widget_action">缺省窗体动作</string>
<string name="av_video_format_descr">选择视频输出格式。</string>
<string name="av_video_format_descr">视频输出格式:</string>
<string name="av_video_format">视频输出格式</string>
<string name="av_use_external_recorder_descr">使用系统程序录制视频。</string>
<string name="av_use_external_camera_descr">使用系统程序拍照</string>
@ -481,7 +481,7 @@
<string name="map_widget_mini_route">路线小地图</string>
<string name="bg_service_interval">设置唤醒间隔:</string>
<string name="continue_follow_previous_route_auto">上次导航未完成。是否继续?(%1$s 秒)</string>
<string name="select_animate_speedup">选择模拟导航速度</string>
<string name="select_animate_speedup">路线模拟速度:</string>
<string name="global_app_allocated_memory_descr">已分配内存 %1$s MB (Android 限制 %2$s MBDalvik %3$s MB)。</string>
<string name="shared_location">分享位置</string>
<string name="osmand_parking_lim_text">有时间限制</string>
@ -555,7 +555,7 @@
<string name="animate_route">开始模拟导航</string>
<string name="file_can_not_be_renamed">文件无法重命名。</string>
<string name="file_with_name_already_exists">同名文件已存在。</string>
<string name="poi_query_by_name_matches_categories">找到多个满足查询的POI类别</string>
<string name="poi_query_by_name_matches_categories">找到了几个相关的 POI 类别。</string>
<string name="data_to_search_poi_not_available">用于搜索POI的本地数据不存在。</string>
<string name="poi_filter_by_name">按名称搜索</string>
<string name="old_poi_file_should_be_deleted">兴趣点数据文件 \'%1$s\' 是多余的,可以删除。</string>
@ -2020,7 +2020,7 @@
<string name="first_time_msg">感谢您使用 OsmAnd。对于此应用程序的许多功能您需要一些地区的离线数据您可以透过\'设置\' -&gt; \'管理地图文件\'来下载。之后您可浏览地图、位置的地址、查看兴趣点以及寻找大众运输工具。</string>
<string name="basemap_was_selected_to_download">底图为某些特别的应用功能必需使用的,并且缺省为下载。</string>
<string name="prefs_plugins_descr">启动插件的高级设置和更多的附加功能。</string>
<string name="play_commands_of_currently_selected_voice">用所选择的语音播放指令</string>
<string name="play_commands_of_currently_selected_voice">通过播放通知选择语音和测试:</string>
<string name="back_to_location">回到目前位置</string>
<string name="direction_style_sidewise">横向8 个扇区)</string>
<string name="direction_style_clockwise">顺时针12 个扇区)</string>
@ -2663,7 +2663,7 @@
<string name="shared_string_travel_book">旅游书</string>
<string name="download_images">下载图片</string>
<string name="rendering_value_black_name">黑色</string>
<string name="rendering_attr_surface_wood_name"></string>
<string name="rendering_attr_surface_wood_name"></string>
<string name="app_mode_subway">地铁</string>
<string name="app_mode_horse">骑马</string>
<string name="shared_string_color_magenta">品红色</string>
@ -2674,7 +2674,7 @@
<string name="points_of_interests">兴趣点POI</string>
<string name="shared_string_capacity">容量</string>
<string name="rendering_attr_surface_metal_name">金属</string>
<string name="rendering_attr_highway_class_path_name">路径</string>
<string name="rendering_attr_highway_class_path_name">走道</string>
<string name="app_mode_helicopter">直升机</string>
<string name="app_mode_skiing">滑雪</string>
<string name="base_profile_descr_ski">滑雪</string>
@ -2839,7 +2839,7 @@
<string name="show_closed_notes">显示关闭的注记</string>
<string name="osm_edit_closed_note">关闭的OSM注记</string>
<string name="add_online_source">添加在线资源</string>
<string name="rendering_attr_highway_class_bridleway_name"/>
<string name="rendering_attr_highway_class_bridleway_name">驮道</string>
<string name="rendering_attr_surface_gravel_name">砾石</string>
<string name="rendering_attr_surface_sett_name">比利时石砌路</string>
<string name="routing_attr_allow_expert_name">允许专家路线</string>
@ -3068,7 +3068,7 @@
<string name="expire_time">到期时间</string>
<string name="tiles_storage_descr">选择如何储存下载的数据。</string>
<string name="export_import_quick_actions_with_profiles_promo">你可以在应用配置中导入导出快捷操作。</string>
<string name="delete_all_actions_message_q">你确定要删除d快捷操作吗?</string>
<string name="delete_all_actions_message_q">你确定要不可撤销地删除 %d 快捷操作吗?</string>
<string name="speed_cameras_legal_descr">在某些国家或地区,使用测速摄像头提示应用是非法的。
\n
\n你需要根据你所在的国家的法律作出选择。
@ -3124,4 +3124,79 @@
<string name="context_menu_item_add_waypoint">添加轨迹航点</string>
<string name="save_track_to_gpx_globally">将轨迹记录到GPX文件</string>
<string name="disable_recording_once_app_killed_descrp">当应用程序被杀死时跟踪日志将被暂停通过最近的应用程序OsmAnd背景指示会从Android通知栏中消失</string>
<string name="add_online_routing_engine">添加在线路线引擎</string>
<string name="edit_online_routing_engine">编辑在线路线引擎</string>
<string name="shared_string_subtype">子类型</string>
<string name="shared_string_vehicle">车辆</string>
<string name="shared_string_api_key">API 密钥</string>
<string name="shared_string_server_url">服务器 URL</string>
<string name="shared_string_enter_param">输入参数</string>
<string name="keep_it_empty_if_not">否则请保持空白</string>
<string name="test_route_calculation">测试路线计算</string>
<string name="routing_engine_vehicle_type_driving">驾驶</string>
<string name="routing_engine_vehicle_type_car">汽车</string>
<string name="copy_address">复制地址</string>
<string name="online_routing_engine">在线路线引擎</string>
<string name="online_routing_engines">在线路线引擎</string>
<string name="shared_string_folders">文件夹</string>
<string name="select_folder">选择文件夹</string>
<string name="select_folder_descr">选择文件夹或添加新文件夹</string>
<string name="upload_to_openstreetmap">上传到 OpenStreetMap</string>
<string name="edit_track">编辑轨迹</string>
<string name="rename_track">重命名轨迹</string>
<string name="change_folder">更改文件夹</string>
<string name="shared_string_sec"></string>
<string name="announcement_time_passing">通过</string>
<string name="announcement_time_prepare_long">长时间准备</string>
<string name="announcement_time_prepare">准备</string>
<string name="announcement_time_off_route">偏离路线</string>
<string name="announcement_time_arrive">到达目的地</string>
<string name="shared_string_turn">转弯</string>
<string name="announcement_time_intervals">时间和距离间隔</string>
<string name="announcement_time_descr">不同语音提示的公告时间取决于提示类型、当前导航速度和默认导航速度。</string>
<string name="announcement_time_title">公告时间</string>
<string name="start_recording">开始录制</string>
<string name="show_track_on_map">在地图上显示轨迹</string>
<string name="routing_engine_vehicle_type_wheelchair">轮椅</string>
<string name="routing_engine_vehicle_type_hiking">徒步</string>
<string name="routing_engine_vehicle_type_walking">步行</string>
<string name="routing_engine_vehicle_type_cycling_electric">电动自行车</string>
<string name="routing_engine_vehicle_type_cycling_mountain">山地自行车</string>
<string name="routing_engine_vehicle_type_cycling_road">公路自行车</string>
<string name="routing_engine_vehicle_type_hgv">重型货车</string>
<string name="routing_engine_vehicle_type_small_truck">小型卡车</string>
<string name="routing_engine_vehicle_type_truck">卡车</string>
<string name="routing_engine_vehicle_type_scooter">踏板车</string>
<string name="routing_engine_vehicle_type_racingbike">竞速自行车</string>
<string name="routing_engine_vehicle_type_mtb">山地车</string>
<string name="message_server_error">服务器错误:%1$s</string>
<string name="delete_online_routing_engine">删除这个在线路线引擎?</string>
<string name="message_name_is_already_exists">名字已经存在</string>
<string name="context_menu_read_full">阅读全文</string>
<string name="context_menu_edit_descr">编辑描述</string>
<string name="delete_waypoints">删除航点</string>
<string name="copy_to_map_markers">复制到地图标记</string>
<string name="copy_to_map_favorites">复制到收藏</string>
<string name="upload_photo">上传中</string>
<string name="upload_photo_completed">上传完成</string>
<string name="uploading_count">正在上传 %1$d共 %2$d</string>
<string name="toast_select_edits_for_upload">选择要上传的编辑</string>
<string name="uploaded_count">已上传 %1$d共 %2$d</string>
<string name="hillshade_slope_contour_lines">山体阴影/斜坡/等高线</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews 是一个社区驱动的项目,关于公共场所,如餐馆,酒店,博物馆,航点。它收集了所有关于它们的公共信息,如照片、评论、链接到其他系统的 OpenStreetMap、维基百科。
\n
\n所有 OpenPlaceReview 的数据都是开放的所有人都可以使用http://openplacereviews.org/data。
\n
\n你可以在以下网站阅读更多信息http://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">使用 test.openplacereviews.org</string>
<string name="login_open_place_reviews">登录 OpenPlaceReviews</string>
<string name="activity_type_winter_name">冬季</string>
<string name="activity_type_snowmobile_name">雪地摩托</string>
<string name="activity_type_riding_name">骑行</string>
<string name="activity_type_cycling_name">骑车</string>
<string name="activity_type_hiking_name">健行</string>
<string name="activity_type_running_name">跑步</string>
<string name="activity_type_walking_name">步行</string>
<string name="activity_type_motorbike_name">摩托车</string>
</resources>

View file

@ -3881,4 +3881,14 @@
<string name="poi_wildlife_crossing_bat_tunnel">蝙蝠隧道</string>
<string name="poi_wildlife_crossing_bat_bridge">蝙蝠橋</string>
<string name="poi_wildlife_crossing">野生動物穿越</string>
<string name="poi_mobile_library">行動圖書館停放位置</string>
<string name="poi_summit_register_no">峰頂紀錄:否</string>
<string name="poi_summit_register_yes">峰頂紀錄:是</string>
<string name="poi_piste_status_closed">滑雪道狀態:關閉</string>
<string name="poi_piste_status_open">滑雪道狀態:開放</string>
<string name="poi_patrolled_no">巡邏:否</string>
<string name="poi_patrolled_yes">巡邏:是</string>
<string name="poi_gladed_yes">林間空地:是</string>
<string name="poi_piste_name">滑雪道名稱</string>
<string name="poi_piste_ski_jump">跳台滑雪</string>
</resources>

View file

@ -3960,7 +3960,7 @@
<string name="select_folder">選取資料夾</string>
<string name="select_folder_descr">選取資料夾或新增</string>
<string name="shared_string_empty"></string>
<string name="analyze_by_intervals">按時間間隔分析分割時間間隔</string>
<string name="analyze_by_intervals">分析分割間隔</string>
<string name="upload_to_openstreetmap">上傳到 OpenStreetMap</string>
<string name="edit_track">編輯軌跡</string>
<string name="rename_track">重新命名軌跡</string>
@ -4004,4 +4004,5 @@
<string name="uploading_count">正在上傳 %1$d共 %2$d</string>
<string name="uploaded_count">已上傳 %1$d共 %2$d</string>
<string name="toast_select_edits_for_upload">選取要上傳的檔案</string>
<string name="hillshade_slope_contour_lines">地形陰影/斜坡/等高線</string>
</resources>

View file

@ -142,6 +142,7 @@
<attr name="text_input_background" format="reference"/>
<attr name="image_help_announcement_time" format="reference"/>
<attr name="switch_button_active" format="reference" />
<attr name="bottom_navigation_item_background" format="reference" />
</declare-styleable>
<declare-styleable name="PagerSlidingTabStrip">

View file

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources>
<string name="app_name">OsmAnd~</string>
<string name="app_name_free">OsmAnd Nightly</string>
<!-- Part of build.gradle -->
<!-- <string name="app_name">OsmAnd~</string> -->
<!-- <string name="app_edition"></string> -->
<!-- string name="app_version_suffix"></string -->
<!-- Not translatable -->
@ -9,11 +10,7 @@
<string name="srtm_plugin_price">€2,99</string>
<string name="sea_depth_maps_price">€1,39</string>
<string name="osm_live">OsmAnd Live</string>
<string name="ga_api_key">UA-28342846-2</string>
<string name="ga_dispatchPeriod">10</string>
<string name="ga_debug">true</string>
<string name="openstreetmap_copyright"><a href="https://www.openstreetmap.org/copyright">&#169; OpenStreetMap</a></string>
<string name="app_edition"></string>
<string name="support_email">support@osmand.net</string>
<string name="preferred_locale_no_translate">Display language</string>
<string name="system_locale_no_translate">Device language</string>

View file

@ -17,6 +17,19 @@
<string name="track_recording_title">Track recording stopped</string>
<string name="track_recording_save_and_stop">Save and stop recording</string>
<string name="track_recording_stop_without_saving">Stop without saving</string>
<string name="activity_type_car_name">Car</string>
<string name="activity_type_motorbike_name">Motorbike</string>
<string name="activity_type_offroad_name">Off-road</string>
<string name="activity_type_walking_name">Walking</string>
<string name="activity_type_running_name">Running</string>
<string name="activity_type_hiking_name">Hiking</string>
<string name="activity_type_cycling_name">Cycling</string>
<string name="activity_type_mountainbike_name">Mountainbike</string>
<string name="activity_type_racing_name">Racing</string>
<string name="activity_type_riding_name">Riding</string>
<string name="activity_type_snowmobile_name">Snowmobile</string>
<string name="activity_type_winter_name">Winter</string>
<string name="activity_type_water_name">Water</string>
<string name="login_open_place_reviews">Login to OpenPlaceReviews</string>
<string name="opr_use_dev_url">Use test.openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>

View file

@ -249,6 +249,7 @@
<item name="text_input_background">@color/text_input_background_light</item>
<item name="image_help_announcement_time">@drawable/img_help_announcement_time_day</item>
<item name="switch_button_active">@color/switch_button_active_light</item>
<item name="bottom_navigation_item_background">@drawable/bottom_navigation_item_bg_light</item>
</style>
<style name="ToolbarStyle" parent="@style/Widget.AppCompat.Toolbar">
@ -547,6 +548,7 @@
<item name="text_input_background">@color/text_input_background_dark</item>
<item name="image_help_announcement_time">@drawable/img_help_announcement_time_night</item>
<item name="switch_button_active">@color/switch_button_active_dark</item>
<item name="bottom_navigation_item_background">@drawable/bottom_navigation_item_bg_dark</item>
</style>
<style name="FreeVersionBanner" parent="OsmandDarkTheme">

View file

@ -951,6 +951,12 @@ public class AndroidUtils {
return value != null ? value : propertyValue;
}
public static String getActivityTypeStringPropertyName(Context ctx, String propertyName, String defValue) {
String value = getStringByProperty(ctx, "activity_type_" + propertyName + "_name");
return value != null ? value : defValue;
}
private static String getStringByProperty(@NonNull Context ctx, @NonNull String property) {
try {
Field field = R.string.class.getField(property);

View file

@ -209,9 +209,10 @@ public class GpxSelectionHelper {
}
public SelectedGpxFile getSelectedGPXFile(WptPt point) {
for (SelectedGpxFile g : selectedGPXFiles) {
if (g.getGpxFile().containsPoint(point)) {
return g;
for (SelectedGpxFile selectedGpxFile : selectedGPXFiles) {
GPXFile gpxFile = selectedGpxFile.getGpxFile();
if (gpxFile.containsPoint(point) || gpxFile.containsRoutePoint(point)) {
return selectedGpxFile;
}
}
return null;

View file

@ -136,10 +136,10 @@ import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.datastorage.DataStorageFragment;
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
import net.osmand.plus.settings.fragments.ConfigureProfileFragment;
import net.osmand.plus.settings.datastorage.DataStorageFragment;
import net.osmand.plus.track.TrackAppearanceFragment;
import net.osmand.plus.track.TrackMenuFragment;
import net.osmand.plus.views.AddGpxPointBottomSheetHelper.NewGpxPoint;
@ -1664,6 +1664,12 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
getMapView().refreshMap();
}
public void refreshMapComplete() {
getMyApplication().getResourceManager().getRenderer().clearCache();
updateMapSettings();
getMapView().refreshMap(true);
}
public View getLayout() {
return getWindow().getDecorView().findViewById(android.R.id.content);
}

View file

@ -1,6 +1,7 @@
package net.osmand.plus.base;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorListenerAdapter;
import android.annotation.TargetApi;
import android.app.Activity;
@ -884,10 +885,28 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment
updateMainViewLayout(posY);
}
if (animated) {
mainView.animate().y(posY)
.setDuration(ANIMATION_DURATION)
.setInterpolator(new DecelerateInterpolator())
.setListener(new AnimatorListenerAdapter() {
animateMainView(posY, needCloseMenu, previousMenuState, newMenuState);
} else {
if (needCloseMenu && isHideable()) {
dismiss();
} else {
mainView.setY(posY);
updateMainViewLayout(posY);
if (previousMenuState != 0 && newMenuState != 0 && previousMenuState != newMenuState) {
doAfterMenuStateChange(previousMenuState, newMenuState);
}
}
}
ContextMenuFragmentListener listener = this.listener;
if (listener != null) {
listener.onContextMenuYPosChanged(this, posY, needMapAdjust, true);
}
}
return posY;
}
protected void animateMainView(final int posY, final boolean needCloseMenu, final int previousMenuState, final int newMenuState) {
animateView(mainView, posY, new AnimatorListenerAdapter() {
boolean canceled = false;
@ -909,30 +928,14 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment
}
}
}
}).start();
} else {
if (needCloseMenu && isHideable()) {
dismiss();
} else {
mainView.setY(posY);
updateMainViewLayout(posY);
if (previousMenuState != 0 && newMenuState != 0 && previousMenuState != newMenuState) {
doAfterMenuStateChange(previousMenuState, newMenuState);
}
}
}
ContextMenuFragmentListener listener = this.listener;
if (listener != null) {
listener.onContextMenuYPosChanged(this, posY, needMapAdjust, true);
}
}
return posY;
});
}
public void animateView(@NonNull View view, int y) {
public void animateView(@NonNull View view, int y, @Nullable AnimatorListener listener) {
view.animate().y(y)
.setDuration(ANIMATION_DURATION)
.setInterpolator(new DecelerateInterpolator())
.setListener(listener)
.start();
}

View file

@ -133,7 +133,7 @@ public abstract class ContextMenuScrollFragment extends ContextMenuFragment impl
if (mapControlsView != null) {
int zoomY = y - getMapControlsHeight();
if (animated) {
fragment.animateView(mapControlsView, zoomY);
fragment.animateView(mapControlsView, zoomY, null);
} else {
mapControlsView.setY(zoomY);
}

View file

@ -96,6 +96,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class DashboardOnMap implements ObservableScrollViewCallbacks, IRouteInformationListener {
private static final org.apache.commons.logging.Log LOG =
PlatformUtil.getLog(DashboardOnMap.class);
@ -777,7 +778,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, IRouteInfo
plugin.registerLayers(mapActivity);
}
}
SRTMPlugin.refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
} else if (visibleType == DashboardType.WIKIPEDIA) {
refreshContent(true);
}

View file

@ -261,11 +261,6 @@ public class ConfigureMapMenu {
app.getAidlApi().registerLayerContextMenu(adapter, activity);
}
public static void refreshMapComplete(final MapActivity activity) {
activity.getMyApplication().getResourceManager().getRenderer().clearCache();
activity.updateMapSettings();
activity.getMapView().refreshMap(true);
}
private void createRenderingAttributeItems(List<RenderingRuleProperty> customRules,
final ContextMenuAdapter adapter, final MapActivity activity,
@ -347,7 +342,7 @@ public class ConfigureMapMenu {
public void onClick(View v) {
int which = (int) v.getTag();
view.getSettings().DAYNIGHT_MODE.set(DayNightMode.values()[which]);
refreshMapComplete(activity);
activity.refreshMapComplete();
activity.getDashboard().refreshContent(true);
// adapter.getItem(pos).setDescription(s, getDayNightDescr(activity));
// ad.notifyDataSetInvalidated();
@ -466,7 +461,7 @@ public class ConfigureMapMenu {
public void onClick(View v) {
int which = (int) v.getTag();
view.getSettings().TEXT_SCALE.set(txtValues[which]);
refreshMapComplete(activity);
activity.refreshMapComplete();
adapter.getItem(pos).setDescription(getScale(activity));
ad.notifyDataSetInvalidated();
}
@ -568,7 +563,7 @@ public class ConfigureMapMenu {
int index = dlg.getListView().getCheckedItemPosition();
view.getSettings().MAP_PREFERRED_LOCALE.set(
txtIds[index]);
refreshMapComplete(activity);
activity.refreshMapComplete();
String localeDescr = txtIds[index];
localeDescr = localeDescr == null || localeDescr.isEmpty() ? activity
.getString(R.string.local_map_names) : localeDescr;
@ -712,7 +707,7 @@ public class ConfigureMapMenu {
}
adapter.getItem(pos).setColorRes(ContextMenuItem.INVALID_ID);
a.notifyDataSetInvalidated();
refreshMapComplete(activity);
activity.refreshMapComplete();
activity.getMapLayers().updateLayers(activity.getMapView());
} else {
if (UI_CATEGORY_DETAILS.equals(category)) {
@ -883,7 +878,7 @@ public class ConfigureMapMenu {
adapter.getItem(pos).setColorRes(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
}
a.notifyDataSetInvalidated();
refreshMapComplete(activity);
activity.refreshMapComplete();
activity.getMapLayers().updateLayers(activity.getMapView());
}
});
@ -1041,7 +1036,7 @@ public class ConfigureMapMenu {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int pos, boolean isChecked, int[] viewCoordinates) {
pref.set(!pref.get());
refreshMapComplete(activity);
activity.refreshMapComplete();
return false;
}
})
@ -1096,7 +1091,7 @@ public class ConfigureMapMenu {
} else {
pref.set(p.getPossibleValues()[which - 1]);
}
refreshMapComplete(activity);
activity.refreshMapComplete();
String description = AndroidUtils.getRenderingStringPropertyValue(activity, pref.get());
adapter.getItem(pos).setDescription(description);
}

View file

@ -228,9 +228,9 @@ public class DetailsBottomSheet extends BasePreferenceBottomSheet {
}
Activity activity = getActivity();
if (activity instanceof MapActivity) {
MapActivity a = (MapActivity) activity;
ConfigureMapMenu.refreshMapComplete(a);
a.getMapLayers().updateLayers(a.getMapView());
MapActivity mapActivity = (MapActivity) activity;
mapActivity.refreshMapComplete();
mapActivity.getMapLayers().updateLayers(mapActivity.getMapView());
}
super.onDismiss(dialog);
}

View file

@ -20,6 +20,7 @@ import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin;
import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin.OnMapSelectedCallback;
import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin.RasterMapType;
public class RasterMapMenu {
private static final String TAG = "RasterMapMenu";
public static ContextMenuAdapter createListAdapter(final MapActivity mapActivity,
@ -105,12 +106,12 @@ public class RasterMapMenu {
@Override
public void run() {
plugin.toggleUnderlayState(mapActivity, type, onMapSelectedCallback);
refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
}
});
} else if (itemId == R.string.show_polygons) {
hidePolygonsPref.set(!isChecked);
refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
} else if (itemId == R.string.show_transparency_seekbar) {
if (isChecked) {
settings.LAYER_TRANSPARENCY_SEEKBAR_MODE.set(currentMapTypeSeekbarMode);
@ -180,10 +181,4 @@ public class RasterMapMenu {
LayerTransparencySeekbarMode seekbarMode = app.getSettings().LAYER_TRANSPARENCY_SEEKBAR_MODE.get();
return seekbarMode == LayerTransparencySeekbarMode.UNDEFINED || seekbarMode == currentMapTypeSeekbarMode;
}
public static void refreshMapComplete(final MapActivity activity) {
activity.getMyApplication().getResourceManager().getRenderer().clearCache();
activity.updateMapSettings();
activity.getMapView().refreshMap(true);
}
}

View file

@ -140,7 +140,7 @@ public class SelectMapStyleBottomSheetDialogFragment extends MenuBottomSheetDial
OsmandMapTileView view = mapActivity.getMapView();
view.getSettings().RENDERER.set(selectedStyle);
app.getRendererRegistry().setCurrentSelectedRender(loaded);
ConfigureMapMenu.refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
mapActivity.getDashboard().refreshContent(true);
} else {
Toast.makeText(mapActivity, R.string.renderer_load_exception, Toast.LENGTH_SHORT).show();

View file

@ -593,7 +593,7 @@ public class GpxUiHelper {
}
}
if (activity instanceof MapActivity) {
ConfigureMapMenu.refreshMapComplete((MapActivity) activity);
((MapActivity) activity).refreshMapComplete();
}
}
GPXFile currentGPX = null;

View file

@ -42,6 +42,7 @@ import java.util.regex.Pattern;
import static net.osmand.plus.activities.TrackActivity.CURRENT_RECORDING;
import static net.osmand.plus.activities.TrackActivity.TRACK_FILE_NAME;
import static net.osmand.plus.osmedit.oauth.OsmOAuthHelper.OsmAuthorizationListener;
import static net.osmand.plus.track.TrackMenuFragment.RETURN_SCREEN_NAME;
public class IntentHelper {
@ -256,8 +257,9 @@ public class IntentHelper {
}
if (intent.hasExtra(TrackMenuFragment.OPEN_TRACK_MENU)) {
String path = intent.getStringExtra(TRACK_FILE_NAME);
String name = intent.getStringExtra(RETURN_SCREEN_NAME);
boolean currentRecording = intent.getBooleanExtra(CURRENT_RECORDING, false);
TrackMenuFragment.showInstance(mapActivity, path, currentRecording, null);
TrackMenuFragment.showInstance(mapActivity, path, currentRecording, null, name);
mapActivity.setIntent(null);
}
}

View file

@ -47,7 +47,7 @@ public class SelectedGpxMenuController extends MenuController {
LatLon latLon = new LatLon(wptPt.lat, wptPt.lon);
SelectedGpxFile selectedGpxFile = selectedGpxPoint.getSelectedGpxFile();
String path = selectedGpxFile.getGpxFile().path;
TrackMenuFragment.showInstance(mapActivity, path, selectedGpxFile.isShowCurrentTrack(), latLon);
TrackMenuFragment.showInstance(mapActivity, path, selectedGpxFile.isShowCurrentTrack(), latLon, null);
}
};
leftTitleButtonController.caption = mapActivity.getString(R.string.shared_string_open_track);

View file

@ -50,7 +50,7 @@ public class WptPtMenuController extends MenuController {
SelectedGpxFile selectedGpxFile = selectionHelper.getSelectedGPXFile(wpt);
if (selectedGpxFile != null) {
String path = selectedGpxFile.getGpxFile().path;
TrackMenuFragment.showInstance(mapActivity, path, selectedGpxFile.isShowCurrentTrack(), new LatLon(wpt.lon, wpt.lat));
TrackMenuFragment.showInstance(mapActivity, path, selectedGpxFile.isShowCurrentTrack(), new LatLon(wpt.lon, wpt.lat), null);
}
}
}

View file

@ -36,6 +36,7 @@ import net.osmand.data.LatLon;
import net.osmand.data.QuadRect;
import net.osmand.data.RotatedTileBox;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
@ -66,6 +67,8 @@ public class TrackDetailsMenu {
@Nullable
private GpxDisplayItem gpxItem;
@Nullable
private SelectedGpxFile selectedGpxFile;
@Nullable
private TrackDetailsBarController toolbarController;
@Nullable
private TrkSegment segment;
@ -101,6 +104,15 @@ public class TrackDetailsMenu {
this.gpxItem = gpxItem;
}
@Nullable
public SelectedGpxFile getSelectedGpxFile() {
return selectedGpxFile;
}
public void setSelectedGpxFile(@NonNull SelectedGpxFile selectedGpxFile) {
this.selectedGpxFile = selectedGpxFile;
}
public boolean isVisible() {
return visible;
}
@ -707,18 +719,19 @@ public class TrackDetailsMenu {
if (gpxItem.chartTypes != null && gpxItem.chartTypes.length > 0) {
for (int i = 0; i < gpxItem.chartTypes.length; i++) {
OrderedLineDataSet dataSet = null;
boolean withoutGaps = selectedGpxFile != null && (!selectedGpxFile.isJoinSegments() && gpxItem.isGeneralTrack());
switch (gpxItem.chartTypes[i]) {
case ALTITUDE:
dataSet = GpxUiHelper.createGPXElevationDataSet(app, chart, analysis,
gpxItem.chartAxisType, false, true, false);
gpxItem.chartAxisType, false, true, withoutGaps);
break;
case SPEED:
dataSet = GpxUiHelper.createGPXSpeedDataSet(app, chart, analysis,
gpxItem.chartAxisType, gpxItem.chartTypes.length > 1, true, false);
gpxItem.chartAxisType, gpxItem.chartTypes.length > 1, true, withoutGaps);
break;
case SLOPE:
dataSet = GpxUiHelper.createGPXSlopeDataSet(app, chart, analysis,
gpxItem.chartAxisType, null, gpxItem.chartTypes.length > 1, true, false);
gpxItem.chartAxisType, null, gpxItem.chartTypes.length > 1, true, withoutGaps);
break;
}
if (dataSet != null) {

View file

@ -344,7 +344,7 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
public void onClick(View v) {
FragmentActivity activity = getActivity();
if (activity != null) {
openTrack(activity, null, storeState());
openTrack(activity, null, storeState(), getString(R.string.shared_string_tracks));
}
}
});
@ -1597,7 +1597,7 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment implement
GpxInfo item = allGpxAdapter.getChild(groupPosition, childPosition);
if (!selectionMode) {
openTrack(getActivity(), item.file, storeState());
openTrack(getActivity(), item.file, storeState(), getString(R.string.shared_string_tracks));
} else {
if (!selectedItems.contains(item)) {
selectedItems.add(item);

View file

@ -15,7 +15,6 @@ import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dialogs.ConfigureMapMenu;
import net.osmand.plus.openseamapsplugin.NauticalMapsPlugin;
import net.osmand.plus.quickaction.QuickAction;
import net.osmand.plus.quickaction.QuickActionType;
@ -92,7 +91,7 @@ public class MapStyleAction extends SwitchableAction<String> {
view.getSettings().RENDERER.set(params);
app.getRendererRegistry().setCurrentSelectedRender(loaded);
ConfigureMapMenu.refreshMapComplete(activity);
activity.refreshMapComplete();
Toast.makeText(activity, activity.getString(R.string.quick_action_map_style_switch,
getTranslatedItemName(activity, params)), Toast.LENGTH_SHORT).show();

View file

@ -15,20 +15,20 @@ import com.google.gson.reflect.TypeToken;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.quickaction.QuickAction;
import net.osmand.plus.quickaction.QuickActionType;
import net.osmand.plus.quickaction.SwitchableAction;
import net.osmand.plus.settings.backend.OsmandSettings;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class MapUnderlayAction extends SwitchableAction<Pair<String, String>> {
private final static String KEY_UNDERLAYS = "underlays";
@ -141,14 +141,9 @@ public class MapUnderlayAction extends SwitchableAction<Pair<String, String>> {
settings.MAP_UNDERLAY.set(null);
activity.getMapLayers().getMapControlsLayer().hideTransparencyBar();
settings.MAP_UNDERLAY_PREVIOUS.set(null);
}
final CommonPreference<Boolean> hidePolygonsPref =
activity.getMyApplication().getSettings().getCustomRenderBooleanProperty("noPolygons");
hidePolygonsPref.set(hasUnderlay);
plugin.updateMapLayers(activity.getMapView(), settings.MAP_UNDERLAY, activity.getMapLayers());
activity.refreshMapComplete();
Toast.makeText(activity, activity.getString(R.string.quick_action_map_underlay_switch,
getTranslatedItemName(activity, params)), Toast.LENGTH_SHORT).show();
}

View file

@ -29,17 +29,16 @@ import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.DialogListItemAdapter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.activities.DownloadTilesDialog;
import net.osmand.plus.mapsource.EditMapSourceDialogFragment;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.MapActivityLayers;
import net.osmand.plus.dashboard.DashboardOnMap.DashboardType;
import net.osmand.plus.dialogs.RasterMapMenu;
import net.osmand.plus.mapsource.EditMapSourceDialogFragment;
import net.osmand.plus.quickaction.QuickActionType;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.views.MapTileLayer;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.util.Algorithms;
@ -66,6 +65,7 @@ public class OsmandRasterMapsPlugin extends OsmandPlugin {
private MapTileLayer overlayLayer;
private MapTileLayer underlayLayer;
private StateChangedListener<String> underlayListener;
private StateChangedListener<Integer> overlayLayerListener;
public OsmandRasterMapsPlugin(OsmandApplication app) {
@ -103,6 +103,19 @@ public class OsmandRasterMapsPlugin extends OsmandPlugin {
return "feature_articles/online-maps-plugin.html";
}
@Override
public boolean init(@NonNull final OsmandApplication app, Activity activity) {
final CommonPreference<Boolean> hidePolygonsPref = settings.getCustomRenderBooleanProperty("noPolygons");
underlayListener = new StateChangedListener<String>() {
@Override
public void stateChanged(String change) {
hidePolygonsPref.set(settings.MAP_UNDERLAY.get() != null);
}
};
settings.MAP_UNDERLAY.addListener(underlayListener);
return true;
}
@Override
public void registerLayers(MapActivity activity) {
createLayers();
@ -339,7 +352,7 @@ public class OsmandRasterMapsPlugin extends OsmandPlugin {
adapter.notifyDataSetChanged();
RasterMapMenu.refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
}
}
}

View file

@ -1,26 +1,11 @@
package net.osmand.plus.render;
import gnu.trove.iterator.TIntObjectIterator;
import gnu.trove.list.TLongList;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.list.array.TLongArrayList;
import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.set.TLongSet;
import gnu.trove.set.hash.TLongHashSet;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.TreeSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;
import net.osmand.IProgress;
import net.osmand.NativeLibrary.NativeSearchResult;
@ -39,14 +24,14 @@ import net.osmand.data.QuadPointDouble;
import net.osmand.data.QuadRect;
import net.osmand.data.RotatedTileBox;
import net.osmand.map.MapTileDownloader;
import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.R;
import net.osmand.plus.development.OsmandDevelopmentPlugin;
import net.osmand.plus.render.OsmandRenderer.RenderingContext;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.views.OsmandMapLayer.DrawSettings;
import net.osmand.render.RenderingRuleProperty;
import net.osmand.render.RenderingRuleSearchRequest;
@ -55,16 +40,31 @@ import net.osmand.render.RenderingRulesStorage;
import net.osmand.util.Algorithms;
import net.osmand.util.MapAlgorithms;
import net.osmand.util.MapUtils;
import net.osmand.util.TransliterationHelper;
import org.apache.commons.logging.Log;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import gnu.trove.iterator.TIntObjectIterator;
import gnu.trove.list.TLongList;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.list.array.TLongArrayList;
import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.set.TLongSet;
import gnu.trove.set.hash.TLongHashSet;
public class MapRenderRepositories {
// It is needed to not draw object twice if user have map index that intersects by boundaries
@ -753,11 +753,6 @@ public class MapRenderRepositories {
now = System.currentTimeMillis();
Bitmap bmp;
boolean transparent = false;
RenderingRuleProperty rr = storage.PROPS.get("noPolygons");
if (rr != null) {
transparent = renderingReq.getIntPropertyValue(rr) > 0;
}
// 1. generate image step by step
Bitmap reuse = prevBmp;

View file

@ -767,7 +767,7 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe
int pagesY = y - getPagesViewHeight() + fragment.getShadowHeight() +
(Build.VERSION.SDK_INT >= 21 ? AndroidUtils.getStatusBarHeight(pagesView.getContext()) : 0);
if (animated) {
fragment.animateView(pagesView, pagesY);
fragment.animateView(pagesView, pagesY, null);
} else {
pagesView.setY(pagesY);
}
@ -780,7 +780,7 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe
int zoomY = y - getZoomButtonsHeight() +
(Build.VERSION.SDK_INT >= 21 ? AndroidUtils.getStatusBarHeight(zoomButtonsView.getContext()) : 0);
if (animated) {
fragment.animateView(zoomButtonsView, zoomY);
fragment.animateView(zoomButtonsView, zoomY, null);
} else {
zoomButtonsView.setY(zoomY);
}

View file

@ -52,8 +52,7 @@ public class ContourLinesAction extends QuickAction {
if (selected && !plugin.isActive() && !plugin.needsInstallation()) {
OsmandPlugin.enablePlugin(activity, app, plugin, true);
}
SRTMPlugin.refreshMapComplete(activity);
activity.refreshMapComplete();
}
}
});

View file

@ -109,7 +109,7 @@ public class ContourLinesMenu {
@Override
public void run() {
mapActivity.getDashboard().refreshContent(true);
SRTMPlugin.refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
}
});
}
@ -123,7 +123,7 @@ public class ContourLinesMenu {
item.setDescription(plugin.getPrefDescription(app, contourLinesProp, pref));
adapter.notifyDataSetChanged();
}
SRTMPlugin.refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
}
});
} else if (itemId == colorSchemeStringId) {
@ -135,7 +135,7 @@ public class ContourLinesMenu {
item.setDescription(plugin.getPrefDescription(app, colorSchemeProp, colorPref));
adapter.notifyDataSetChanged();
}
SRTMPlugin.refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
}
});
} else if (itemId == R.string.srtm_plugin_name) {
@ -150,7 +150,7 @@ public class ContourLinesMenu {
item.setDescription(plugin.getPrefDescription(app, contourWidthProp, widthPref));
adapter.notifyDataSetChanged();
}
SRTMPlugin.refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
}
});
} else if (contourDensityProp != null && itemId == contourDensityName.hashCode()) {
@ -162,7 +162,7 @@ public class ContourLinesMenu {
item.setDescription(plugin.getPrefDescription(app, contourDensityProp, densityPref));
adapter.notifyDataSetChanged();
}
SRTMPlugin.refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
}
});
}

View file

@ -307,9 +307,8 @@ public class SRTMPlugin extends OsmandPlugin {
item.setSelected(selected);
adapter.notifyDataSetChanged();
}
refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
}
}
});
} else if (itemId == R.string.shared_string_terrain) {
@ -328,7 +327,7 @@ public class SRTMPlugin extends OsmandPlugin {
adapter.notifyDataSetChanged();
}
updateLayers(mapView, mapActivity);
refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
}
});
}
@ -486,7 +485,7 @@ public class SRTMPlugin extends OsmandPlugin {
} else {
pref.set(possibleValues[which - 1]);
}
refreshMapComplete(activity);
activity.refreshMapComplete();
}
}
);
@ -507,12 +506,6 @@ public class SRTMPlugin extends OsmandPlugin {
public void disable(OsmandApplication app) {
}
public static void refreshMapComplete(final MapActivity activity) {
activity.getMyApplication().getResourceManager().getRenderer().clearCache();
activity.updateMapSettings();
activity.getMapView().refreshMap(true);
}
private static boolean isNightMode(Activity activity, OsmandApplication app) {
if (activity == null || app == null) {
return false;

View file

@ -40,7 +40,7 @@ public class TerrainAction extends QuickAction {
OsmandPlugin.enablePlugin(activity, activity.getMyApplication(), plugin, true);
}
plugin.updateLayers(activity.getMapView(), activity);
SRTMPlugin.refreshMapComplete(activity);
activity.refreshMapComplete();
}
});
}

View file

@ -4,6 +4,9 @@ import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageView;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;
@ -16,13 +19,10 @@ import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.routepreparationmenu.cards.BaseCard;
import net.osmand.plus.widgets.TextViewEx;
import net.osmand.plus.wikipedia.WikiArticleHelper;
import net.osmand.util.Algorithms;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageView;
import static net.osmand.plus.myplaces.TrackActivityFragmentAdapter.getMetadataImageLink;
import static net.osmand.plus.wikipedia.WikiArticleHelper.getFirstParagraph;
public class DescriptionCard extends BaseCard {
@ -98,16 +98,6 @@ public class DescriptionCard extends BaseCard {
});
}
private String getFirstParagraph(String descriptionHtml) {
if (descriptionHtml != null) {
String firstParagraph = WikiArticleHelper.getPartialContent(descriptionHtml);
if (!Algorithms.isEmpty(firstParagraph)) {
return firstParagraph;
}
}
return descriptionHtml;
}
private void setupImage(final String imageUrl) {
if (imageUrl == null) {
return;

View file

@ -1,33 +1,30 @@
package net.osmand.plus.track;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.helpers.GpxUiHelper;
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
import net.osmand.plus.myplaces.SegmentActionsListener;
import net.osmand.plus.widgets.TextViewEx;
@ -36,72 +33,84 @@ import net.osmand.util.Algorithms;
import java.util.ArrayList;
import java.util.List;
import android.os.Handler;
public class GpxBlockStatisticsBuilder {
private final OsmandApplication app;
private RecyclerView blocksView;
private final SelectedGpxFile selectedGpxFile;
private final TrackDisplayHelper displayHelper;
private final GpxDisplayItemType[] filterTypes = {GpxDisplayItemType.TRACK_SEGMENT};
private BlockStatisticsAdapter bsAdapter;
private BlockStatisticsAdapter adapter;
private final List<StatBlock> items = new ArrayList<>();
private final Handler handler = new Handler();
private Runnable updatingStats;
private Runnable updatingItems;
private boolean updateRunning = false;
public GpxBlockStatisticsBuilder(OsmandApplication app, SelectedGpxFile selectedGpxFile, TrackDisplayHelper displayHelper) {
public GpxBlockStatisticsBuilder(OsmandApplication app, SelectedGpxFile selectedGpxFile) {
this.app = app;
this.selectedGpxFile = selectedGpxFile;
this.displayHelper = displayHelper;
}
public void setBlocksView(RecyclerView blocksView) {
this.blocksView = blocksView;
}
private GPXTrackAnalysis getAnalysis() {
return selectedGpxFile.getTrackAnalysis(app);
private GpxDisplayItem getDisplayItem(GPXFile gpxFile) {
return GpxUiHelper.makeGpxDisplayItem(app, gpxFile);
}
public void initStatBlocks(@Nullable SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) {
private GPXFile getGPXFile() {
return selectedGpxFile.getGpxFile();
}
public void initStatBlocks(SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) {
initItems();
if (Algorithms.isEmpty(items)) {
AndroidUiHelper.updateVisibility(blocksView, false);
} else {
bsAdapter = new BlockStatisticsAdapter(actionsListener, activeColor, nightMode);
bsAdapter.setItems(items);
boolean isNotEmpty = !Algorithms.isEmpty(items);
AndroidUiHelper.updateVisibility(blocksView, isNotEmpty);
if (isNotEmpty) {
adapter = new BlockStatisticsAdapter(getDisplayItem(getGPXFile()), actionsListener, activeColor, nightMode);
adapter.setItems(items);
blocksView.setLayoutManager(new LinearLayoutManager(app, LinearLayoutManager.HORIZONTAL, false));
blocksView.setAdapter(bsAdapter);
blocksView.setAdapter(adapter);
}
}
public void stopUpdatingStatBlocks() {
handler.removeCallbacks(updatingStats);
handler.removeCallbacks(updatingItems);
updateRunning = false;
}
public void runUpdatingStatBlocks() {
updatingStats = new Runnable() {
updatingItems = new Runnable() {
@Override
public void run() {
if (bsAdapter != null) {
if (adapter != null) {
initItems();
bsAdapter.setItems(items);
adapter.setItems(items);
AndroidUiHelper.updateVisibility(blocksView, !Algorithms.isEmpty(items));
}
int interval = app.getSettings().SAVE_GLOBAL_TRACK_INTERVAL.get();
handler.postDelayed(this, Math.max(1000, interval));
}
};
handler.post(updatingStats);
updateRunning = handler.post(updatingItems);
}
public void initItems() {
GPXTrackAnalysis analysis = getAnalysis();
float totalDistance = analysis.totalDistance;
float timeSpan = analysis.timeSpan;
GPXFile gpxFile = getGPXFile();
GpxDisplayItem gpxDisplayItem = null;
GPXTrackAnalysis analysis = null;
boolean withoutGaps = true;
if (gpxFile.tracks.size() > 0) {
gpxDisplayItem = getDisplayItem(gpxFile);
}
if (gpxDisplayItem != null) {
analysis = gpxDisplayItem.analysis;
withoutGaps = !selectedGpxFile.isJoinSegments() && gpxDisplayItem.isGeneralTrack();
}
if (analysis != null) {
float totalDistance = withoutGaps ? analysis.totalDistanceWithoutGaps : analysis.totalDistance;
float timeSpan = withoutGaps ? analysis.timeSpanWithoutGaps : analysis.timeSpan;
String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app);
String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app);
String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app);
@ -122,6 +131,7 @@ public class GpxBlockStatisticsBuilder {
Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()),
R.drawable.ic_action_time_span_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME);
}
}
public void prepareData(GPXTrackAnalysis analysis, String title, String value,
@DrawableRes int imageResId, @ColorRes int imageColorId,
@ -155,17 +165,6 @@ public class GpxBlockStatisticsBuilder {
}
}
private void setImageDrawable(ImageView iv, @DrawableRes Integer resId, @ColorRes int color) {
Drawable icon = resId != null ? app.getUIUtilities().getIcon(resId, color)
: UiUtilities.tintDrawable(iv.getDrawable(), getResolvedColor(color));
iv.setImageDrawable(icon);
}
@ColorInt
protected int getResolvedColor(@ColorRes int colorId) {
return ContextCompat.getColor(app, colorId);
}
public class StatBlock {
private final String title;
private final String value;
@ -191,18 +190,21 @@ public class GpxBlockStatisticsBuilder {
ITEM_DISTANCE,
ITEM_ALTITUDE,
ITEM_SPEED,
ITEM_TIME
ITEM_TIME;
}
private class BlockStatisticsAdapter extends RecyclerView.Adapter<BlockStatisticsViewHolder> {
private final List<StatBlock> items = new ArrayList<>();
private final GpxDisplayItem displayItem;
private final SegmentActionsListener actionsListener;
@ColorInt
private final int activeColor;
private final List<StatBlock> statBlocks = new ArrayList<>();
private final boolean nightMode;
private final SegmentActionsListener actionsListener;
public BlockStatisticsAdapter(@Nullable SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) {
public BlockStatisticsAdapter(GpxDisplayItem displayItem, SegmentActionsListener actionsListener,
@ColorInt int activeColor, boolean nightMode) {
this.displayItem = displayItem;
this.actionsListener = actionsListener;
this.activeColor = activeColor;
this.nightMode = nightMode;
@ -210,7 +212,7 @@ public class GpxBlockStatisticsBuilder {
@Override
public int getItemCount() {
return statBlocks.size();
return items.size();
}
@NonNull
@ -222,34 +224,22 @@ public class GpxBlockStatisticsBuilder {
}
@Override
public void onBindViewHolder(final BlockStatisticsViewHolder holder, int position) {
final StatBlock item = statBlocks.get(position);
public void onBindViewHolder(BlockStatisticsViewHolder holder, int position) {
final StatBlock item = items.get(position);
holder.valueText.setText(item.value);
holder.titleText.setText(item.title);
if (handler.hasCallbacks(updatingStats)) {
if (updateRunning) {
holder.titleText.setWidth(app.getResources().getDimensionPixelSize(R.dimen.map_route_buttons_width));
}
holder.valueText.setTextColor(activeColor);
holder.titleText.setTextColor(app.getResources().getColor(R.color.text_color_secondary_light));
if (actionsListener != null && displayHelper != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<GpxDisplayGroup> groups = displayHelper.getDisplayGroups(filterTypes);
GpxDisplayGroup group = null;
for (GpxDisplayGroup g : groups) {
if (g.isGeneralTrack()) {
group = g;
}
}
if (group == null && !groups.isEmpty()) {
group = groups.get(0);
}
if (group != null) {
GpxDisplayItem displayItem = group.getModifiableList().get(0);
if (displayItem != null && displayItem.analysis != null) {
GPXTrackAnalysis analysis = displayItem != null ? displayItem.analysis : null;
if (analysis != null) {
ArrayList<GPXDataSetType> list = new ArrayList<>();
if (displayItem.analysis.hasElevationData || displayItem.analysis.isSpeedSpecified() || displayItem.analysis.hasSpeedData) {
if (analysis.hasElevationData || analysis.isSpeedSpecified() || analysis.hasSpeedData) {
if (item.firstType != null) {
list.add(item.firstType);
}
@ -262,17 +252,16 @@ public class GpxBlockStatisticsBuilder {
actionsListener.openAnalyzeOnMap(displayItem);
}
}
}
});
}
setImageDrawable(holder.imageView, item.imageResId, item.imageColorId);
Drawable icon = app.getUIUtilities().getIcon(item.imageResId, item.imageColorId);
holder.imageView.setImageDrawable(icon);
AndroidUtils.setBackgroundColor(app, holder.divider, nightMode, R.color.divider_color_light, R.color.divider_color_dark);
AndroidUiHelper.updateVisibility(holder.divider, position != statBlocks.size() - 1);
AndroidUiHelper.updateVisibility(holder.divider, position != items.size() - 1);
}
public void setItems(List<StatBlock> statBlocks) {
this.statBlocks.clear();
this.statBlocks.addAll(statBlocks);
public void setItems(List<StatBlock> items) {
this.items.clear();
this.items.addAll(items);
notifyDataSetChanged();
}
}
@ -293,4 +282,3 @@ public class GpxBlockStatisticsBuilder {
}
}
}
//

View file

@ -16,6 +16,14 @@ import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;
@ -32,14 +40,6 @@ import net.osmand.plus.widgets.WebViewEx;
import net.osmand.plus.wikivoyage.WikivoyageUtils;
import net.osmand.util.Algorithms;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
public class GpxReadDescriptionDialogFragment extends BaseOsmAndDialogFragment {
public static final String TAG = GpxReadDescriptionDialogFragment.class.getSimpleName();
@ -242,7 +242,7 @@ public class GpxReadDescriptionDialogFragment extends BaseOsmAndDialogFragment {
return "<body style=\"color:white;\">\n" + content + "</body>\n";
}
public static void showInstance(@NonNull FragmentActivity activity, @NonNull String title, @NonNull String imageUrl, @NonNull String description) {
public static void showInstance(@NonNull FragmentActivity activity, @NonNull String title, @Nullable String imageUrl, @NonNull String description) {
FragmentManager fragmentManager = activity.getSupportFragmentManager();
if (!fragmentManager.isStateSaved()) {
Bundle args = new Bundle();

View file

@ -4,7 +4,9 @@ import android.annotation.SuppressLint;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
@ -13,18 +15,23 @@ import androidx.appcompat.widget.AppCompatImageView;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.Metadata;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.myplaces.SegmentActionsListener;
import net.osmand.plus.routepreparationmenu.cards.BaseCard;
import net.osmand.util.Algorithms;
import static net.osmand.plus.myplaces.TrackActivityFragmentAdapter.getMetadataImageLink;
import static net.osmand.plus.myplaces.TrackActivityFragmentAdapter.isGpxFileSelected;
import static net.osmand.plus.track.OptionsCard.APPEARANCE_BUTTON_INDEX;
import static net.osmand.plus.track.OptionsCard.DIRECTIONS_BUTTON_INDEX;
import static net.osmand.plus.track.OptionsCard.EDIT_BUTTON_INDEX;
import static net.osmand.plus.track.OptionsCard.SHOW_ON_MAP_BUTTON_INDEX;
import static net.osmand.plus.wikipedia.WikiArticleHelper.getFirstParagraph;
public class OverviewCard extends BaseCard {
@ -36,12 +43,11 @@ public class OverviewCard extends BaseCard {
private final SelectedGpxFile selectedGpxFile;
private final GpxBlockStatisticsBuilder blockStatisticsBuilder;
public OverviewCard(@NonNull MapActivity mapActivity, @NonNull TrackDisplayHelper displayHelper,
@NonNull SegmentActionsListener actionsListener, SelectedGpxFile selectedGpxFile) {
public OverviewCard(@NonNull MapActivity mapActivity, @NonNull SegmentActionsListener actionsListener, SelectedGpxFile selectedGpxFile) {
super(mapActivity);
this.actionsListener = actionsListener;
this.selectedGpxFile = selectedGpxFile;
blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile, displayHelper);
blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile);
}
@Override
@ -63,6 +69,7 @@ public class OverviewCard extends BaseCard {
RecyclerView blocksView = view.findViewById(R.id.recycler_overview);
blockStatisticsBuilder.setBlocksView(blocksView);
setupDescription();
initShowButton(iconColorDef, iconColorPres);
initAppearanceButton(iconColorDef, iconColorPres);
if (fileAvailable) {
@ -125,6 +132,31 @@ public class OverviewCard extends BaseCard {
iv.setImageDrawable(icon);
}
private void setupDescription() {
GPXFile gpxFile = getGPXFile();
if (gpxFile.metadata == null) {
gpxFile.metadata = new Metadata();
}
TextView description = view.findViewById(R.id.description);
final String descriptionHtml = gpxFile.metadata.getDescription();
if (Algorithms.isBlank(descriptionHtml)) {
AndroidUiHelper.updateVisibility(description, false);
} else {
description.setText(getFirstParagraph(descriptionHtml));
description.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
GPXFile gpxFile = getGPXFile();
String title = gpxFile.metadata.getArticleTitle();
String imageUrl = getMetadataImageLink(gpxFile.metadata);
GpxReadDescriptionDialogFragment.showInstance(mapActivity, title, imageUrl, descriptionHtml);
}
});
AndroidUiHelper.updateVisibility(description, true);
}
}
private void setOnTouchItem(View item, final ImageView image, final ImageView filled, @DrawableRes final Integer resId, @ColorRes final int colorDef, @ColorRes final int colorPres) {
item.setOnTouchListener(new View.OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")

View file

@ -110,12 +110,14 @@ import static net.osmand.plus.track.OptionsCard.SHOW_ON_MAP_BUTTON_INDEX;
import static net.osmand.plus.track.OptionsCard.UPLOAD_OSM_BUTTON_INDEX;
import static net.osmand.plus.track.TrackPointsCard.ADD_WAYPOINT_INDEX;
import static net.osmand.plus.track.TrackPointsCard.DELETE_WAYPOINTS_INDEX;
import static net.osmand.plus.track.TrackPointsCard.OPEN_WAYPOINT_INDEX;
public class TrackMenuFragment extends ContextMenuScrollFragment implements CardListener,
SegmentActionsListener, RenameCallback, OnTrackFileMoveListener, OnPointsDeleteListener,
OsmAndLocationListener, OsmAndCompassListener {
public static final String OPEN_TRACK_MENU = "open_track_menu";
public static final String RETURN_SCREEN_NAME = "return_screen_name";
public static final String TAG = TrackMenuFragment.class.getName();
private static final Log log = PlatformUtil.getLog(TrackMenuFragment.class);
@ -137,12 +139,14 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
private View searchContainer;
private ImageView searchButton;
private EditText searchEditText;
private View backButtonContainer;
private TextView toolbarTextView;
private ViewGroup headerContainer;
private View routeMenuTopShadowAll;
private BottomNavigationView bottomNav;
private String gpxTitle;
private String returnScreenName;
private TrackChartPoints trackChartPoints;
private Float heading;
@ -152,6 +156,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
private LatLon latLon;
private int menuTitleHeight;
private int menuHeaderHeight;
private int toolbarHeightPx;
private boolean mapPositionAdjusted;
@ -264,6 +269,10 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
this.latLon = latLon;
}
public void setReturnScreenName(String returnScreenName) {
this.returnScreenName = returnScreenName;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
@ -277,6 +286,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
toolbarTextView = view.findViewById(R.id.toolbar_title);
searchButton = view.findViewById(R.id.search_button);
searchContainer = view.findViewById(R.id.search_container);
backButtonContainer = view.findViewById(R.id.back_button_container);
if (isPortrait()) {
AndroidUiHelper.updateVisibility(getTopShadow(), true);
@ -292,8 +302,12 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
updateHeader();
setupButtons(view);
updateCardsLayout();
if (menuType == TrackMenuType.OVERVIEW && isPortrait()) {
calculateLayoutAndShowHeader();
} else {
calculateLayoutAndUpdateMenuState();
}
}
return view;
}
@ -312,7 +326,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
}
headerContainer.addView(overviewCard.getView());
} else {
overviewCard = new OverviewCard(getMapActivity(), displayHelper, this, selectedGpxFile);
overviewCard = new OverviewCard(getMapActivity(), this, selectedGpxFile);
overviewCard.setListener(this);
headerContainer.addView(overviewCard.build(getMapActivity()));
}
@ -391,6 +405,20 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
}
}
});
backButtonContainer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
mapActivity.launchPrevActivityIntent();
}
dismiss();
}
});
TextView backButtonText = backButtonContainer.findViewById(R.id.back_button_text);
backButtonText.setText(returnScreenName);
ImageView backButtonIcon = backButtonContainer.findViewById(R.id.back_button_icon);
backButtonIcon.setImageResource(AndroidUtils.getNavigationIconResId(backButtonIcon.getContext()));
}
private void setupCards() {
@ -462,8 +490,8 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
@Override
protected void calculateLayout(View view, boolean initLayout) {
menuTitleHeight = routeMenuTopShadowAll.getHeight()
+ bottomNav.getHeight();
menuHeaderHeight = headerContainer.getHeight();
menuTitleHeight = routeMenuTopShadowAll.getHeight() + bottomNav.getHeight();
super.calculateLayout(view, initLayout);
}
@ -493,6 +521,8 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
boolean changed = currentMenuState != previousMenuState;
if (changed) {
updateControlsVisibility(true);
boolean backButtonVisible = !Algorithms.isEmpty(returnScreenName) && currentMenuState == MenuState.HALF_SCREEN;
AndroidUiHelper.updateVisibility(backButtonContainer, backButtonVisible);
}
if (currentMenuState != MenuState.FULL_SCREEN && (changed || !mapPositionAdjusted)) {
adjustMapPosition(getMenuStatePosY(currentMenuState));
@ -794,6 +824,8 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
} else {
pointsCard.setSelectionMode(true);
}
} else if (buttonIndex == OPEN_WAYPOINT_INDEX) {
dismiss();
}
}
}
@ -828,8 +860,10 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
@Override
protected void onHeaderClick() {
if (getCurrentMenuState() == MenuState.HEADER_ONLY) {
updateMenuState();
}
}
private void adjustMapPosition(int y) {
MapActivity mapActivity = getMapActivity();
@ -887,6 +921,20 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
});
}
private void calculateLayoutAndShowHeader() {
runLayoutListener(new Runnable() {
@Override
public void run() {
int posY = getViewHeight() - menuHeaderHeight - menuTitleHeight - getShadowHeight();
if (posY < getViewY()) {
updateMainViewLayout(posY);
}
animateMainView(posY, false, getCurrentMenuState(), getCurrentMenuState());
updateMapControlsPos(TrackMenuFragment.this, posY, true);
}
});
}
private void updateMenuState() {
if (menuType == TrackMenuType.OPTIONS) {
openMenuFullScreen();
@ -965,6 +1013,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
public void openAnalyzeOnMap(GpxDisplayItem gpxItem) {
TrackDetailsMenu trackDetailsMenu = getMapActivity().getTrackDetailsMenu();
trackDetailsMenu.setGpxItem(gpxItem);
trackDetailsMenu.setSelectedGpxFile(selectedGpxFile);
trackDetailsMenu.show();
hide();
}
@ -1096,21 +1145,26 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
}
public static void openTrack(@NonNull Context context, @Nullable File file, Bundle prevIntentParams) {
openTrack(context, file, prevIntentParams, null);
}
public static void openTrack(@NonNull Context context, @Nullable File file, @Nullable Bundle prevIntentParams, @Nullable String returnScreenName) {
boolean currentRecording = file == null;
String path = file != null ? file.getAbsolutePath() : null;
if (context instanceof MapActivity) {
TrackMenuFragment.showInstance((MapActivity) context, path, currentRecording, null);
TrackMenuFragment.showInstance((MapActivity) context, path, currentRecording, null, null);
} else {
Bundle bundle = new Bundle();
bundle.putString(TRACK_FILE_NAME, path);
bundle.putBoolean(OPEN_TRACK_MENU, true);
bundle.putBoolean(CURRENT_RECORDING, currentRecording);
bundle.putString(RETURN_SCREEN_NAME, returnScreenName);
MapActivity.launchMapActivityMoveToTop(context, prevIntentParams, null, bundle);
}
}
public static void showInstance(@NonNull final MapActivity mapActivity, @Nullable String path,
boolean showCurrentTrack, @Nullable final LatLon latLon) {
public static void showInstance(@NonNull MapActivity mapActivity, @Nullable String path,
boolean showCurrentTrack, @Nullable final LatLon latLon, @Nullable final String returnScreenName) {
OsmandApplication app = mapActivity.getMyApplication();
SelectedGpxFile selectedGpxFile;
if (showCurrentTrack) {
@ -1119,7 +1173,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
selectedGpxFile = app.getSelectedGpxHelper().getSelectedFileByPath(path);
}
if (selectedGpxFile != null) {
showInstance(mapActivity, selectedGpxFile, latLon);
showInstance(mapActivity, selectedGpxFile, latLon, returnScreenName);
} else if (!Algorithms.isEmpty(path)) {
String title = app.getString(R.string.loading_smth, "");
final ProgressDialog progress = ProgressDialog.show(mapActivity, title, app.getString(R.string.loading_data));
@ -1133,7 +1187,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
OsmandApplication app = mapActivity.getMyApplication();
SelectedGpxFile selectedGpxFile = app.getSelectedGpxHelper().selectGpxFile(result, true, false);
if (selectedGpxFile != null) {
showInstance(mapActivity, selectedGpxFile, latLon);
showInstance(mapActivity, selectedGpxFile, latLon, returnScreenName);
}
}
if (progress != null && AndroidUtils.isActivityNotDestroyed(mapActivity)) {
@ -1146,7 +1200,8 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
}
}
public static boolean showInstance(@NonNull MapActivity mapActivity, @NonNull SelectedGpxFile selectedGpxFile, @Nullable LatLon latLon) {
public static boolean showInstance(@NonNull MapActivity mapActivity, @NonNull SelectedGpxFile selectedGpxFile,
@Nullable LatLon latLon, @Nullable String returnScreenName) {
try {
Bundle args = new Bundle();
args.putInt(ContextMenuFragment.MENU_STATE_KEY, MenuState.HEADER_ONLY);
@ -1155,6 +1210,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
fragment.setArguments(args);
fragment.setRetainInstance(true);
fragment.setSelectedGpxFile(selectedGpxFile);
fragment.setReturnScreenName(returnScreenName);
if (latLon != null) {
fragment.setLatLon(latLon);

View file

@ -26,6 +26,8 @@ import net.osmand.AndroidUtils;
import net.osmand.Collator;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.OsmAndCollator;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
@ -57,6 +59,7 @@ public class TrackPointsCard extends BaseCard implements OnChildClickListener, O
public static final int ADD_WAYPOINT_INDEX = 0;
public static final int DELETE_WAYPOINTS_INDEX = 1;
public static final int OPEN_WAYPOINT_INDEX = 2;
private final TrackDisplayHelper displayHelper;
private final GpxDisplayItemType[] filterTypes = new GpxDisplayItemType[] {GpxDisplayItemType.TRACK_POINTS, GpxDisplayItemType.TRACK_ROUTE_POINTS};
@ -173,6 +176,17 @@ public class TrackPointsCard extends BaseCard implements OnChildClickListener, O
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
GpxDisplayItem item = adapter.getChild(groupPosition, childPosition);
if (item != null && item.locationStart != null) {
CardListener cardListener = getListener();
if (cardListener != null) {
cardListener.onCardButtonPressed(this, OPEN_WAYPOINT_INDEX);
}
LatLon location = new LatLon(item.locationStart.lat, item.locationStart.lon);
PointDescription description = new PointDescription(PointDescription.POINT_TYPE_WPT, item.name);
mapActivity.getContextMenu().show(location, description, item.locationStart);
}
return true;
}

View file

@ -219,9 +219,8 @@ public class TransportLinesMenu {
return transportPrefs;
}
private static void refreshMap(MapActivity mapActivity) {
ConfigureMapMenu.refreshMapComplete(mapActivity);
mapActivity.refreshMapComplete();
mapActivity.getMapLayers().updateLayers(mapActivity.getMapView());
}

View file

@ -333,6 +333,17 @@ public class WikiArticleHelper {
return res.toString();
}
@Nullable
public static String getFirstParagraph(String descriptionHtml) {
if (descriptionHtml != null) {
String firstParagraph = WikiArticleHelper.getPartialContent(descriptionHtml);
if (!Algorithms.isEmpty(firstParagraph)) {
return firstParagraph;
}
}
return descriptionHtml;
}
public static String buildTravelUrl(String url, String lang) {
String title = url.replace(" ", "_");
try {

View file

@ -160,7 +160,7 @@ public class WikivoyageArticleDialogFragment extends WikiArticleBaseDialogFragme
}
TravelHelper travelHelper = getMyApplication().getTravelHelper();
File file = travelHelper.createGpxFile(article);
openTrack(activity, new File(file.getAbsolutePath()), null);
openTrack(activity, new File(file.getAbsolutePath()), null, getString(R.string.icon_group_travel));
}
});
trackButton.setVisibility(View.GONE);

View file

@ -6,8 +6,10 @@ public class TravelGpx extends TravelArticle {
public static final String DIFF_ELE_UP = "diff_ele_up";
public static final String DIFF_ELE_DOWN = "diff_ele_down";
public static final String USER = "user";
public static final String ACTIVITY_TYPE = "route_activity_type";
public String user;
public String activityType;
public float totalDistance = 0;
public double diffElevationUp = 0;
public double diffElevationDown = 0;

View file

@ -58,6 +58,7 @@ import static net.osmand.plus.helpers.GpxUiHelper.getGpxTitle;
import static net.osmand.plus.wikivoyage.data.TravelGpx.DIFF_ELE_DOWN;
import static net.osmand.plus.wikivoyage.data.TravelGpx.DIFF_ELE_UP;
import static net.osmand.plus.wikivoyage.data.TravelGpx.DISTANCE;
import static net.osmand.plus.wikivoyage.data.TravelGpx.ACTIVITY_TYPE;
import static net.osmand.plus.wikivoyage.data.TravelGpx.USER;
import static net.osmand.util.Algorithms.capitalizeFirstLetter;
@ -203,6 +204,7 @@ public class TravelObfHelper implements TravelHelper {
LOG.debug(e.getMessage(), e);
}
res.user = Algorithms.emptyIfNull(amenity.getTagContent(USER));
res.activityType = Algorithms.emptyIfNull(amenity.getTagContent(ACTIVITY_TYPE));
articles.put("en", res);
return articles;
}

View file

@ -20,6 +20,7 @@ import com.squareup.picasso.RequestCreator;
import net.osmand.AndroidUtils;
import net.osmand.PicassoUtils;
import net.osmand.osm.RouteActivityType;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
@ -31,11 +32,14 @@ import net.osmand.plus.wikivoyage.WikivoyageUtils;
import net.osmand.plus.wikivoyage.data.TravelArticle;
import net.osmand.plus.wikivoyage.data.TravelGpx;
import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper;
import net.osmand.plus.wikivoyage.explore.travelcards.TravelGpxCard;
import net.osmand.util.Algorithms;
import java.util.ArrayList;
import java.util.List;
import static net.osmand.plus.wikivoyage.explore.travelcards.TravelGpxCard.*;
import static net.osmand.util.Algorithms.capitalizeFirstLetterAndLowercase;
public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int HEADER_TYPE = 0;
@ -81,7 +85,7 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.Vi
case ARTICLE_TYPE:
return new ItemVH(inflate(parent, R.layout.wikivoyage_article_card));
case GPX_TYPE:
return new TravelGpxCard.TravelGpxVH(inflate(parent, R.layout.wikivoyage_travel_gpx_card));
return new TravelGpxVH(inflate(parent, R.layout.wikivoyage_travel_gpx_card));
default:
throw new RuntimeException("Unsupported view type: " + viewType);
}
@ -132,14 +136,20 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.Vi
holder.rightButton.setCompoundDrawablesWithIntrinsicBounds(null, null, deleteIcon, null);
holder.divider.setVisibility(lastItem ? View.GONE : View.VISIBLE);
holder.shadow.setVisibility(lastItem ? View.VISIBLE : View.GONE);
} else if (viewHolder instanceof TravelGpxCard.TravelGpxVH) {
} else if (viewHolder instanceof TravelGpxVH) {
final TravelGpx article = (TravelGpx) getItem(position);
final TravelGpxCard.TravelGpxVH holder = (TravelGpxCard.TravelGpxVH) viewHolder;
final TravelGpxVH holder = (TravelGpxVH) viewHolder;
holder.title.setText(article.getTitle());
Drawable icon = getActiveIcon(R.drawable.ic_action_user_account_16);
holder.user.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
holder.user.setText(WikiArticleHelper.getPartialContent(article.user));
AndroidUtils.setBackground(app, holder.user, nightMode, R.drawable.btn_border_bg_light, R.drawable.btn_border_bg_dark);
holder.userIcon.setImageDrawable(getActiveIcon(R.drawable.ic_action_user_account_16));
holder.user.setText(article.user);
String activityTypeKey = article.activityType;
if (!Algorithms.isEmpty(activityTypeKey)) {
RouteActivityType activityType = RouteActivityType.getOrCreateTypeFromName(activityTypeKey);
int activityTypeIcon = getActivityTypeIcon(activityType);
holder.activityTypeIcon.setImageDrawable(getActiveIcon(activityTypeIcon));
holder.activityType.setText(getActivityTypeTitle(activityType));
holder.activityTypeLabel.setVisibility(View.VISIBLE);
}
holder.distance.setText(OsmAndFormatter.getFormattedDistance(article.totalDistance, app));
holder.diffElevationUp.setText(OsmAndFormatter.getFormattedAlt(article.diffElevationUp, app));
holder.diffElevationDown.setText(OsmAndFormatter.getFormattedAlt(article.diffElevationDown, app));
@ -159,7 +169,18 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.Vi
}
}
private void updateSaveButton(final TravelGpxCard.TravelGpxVH holder, final TravelGpx article) {
@DrawableRes
private int getActivityTypeIcon(RouteActivityType activityType) {
int iconId = app.getResources().getIdentifier("mx_" + activityType.getIcon(), "drawable", app.getPackageName());
return iconId != 0 ? iconId : R.drawable.mx_special_marker;
}
private String getActivityTypeTitle(RouteActivityType activityType) {
return AndroidUtils.getActivityTypeStringPropertyName(app, activityType.getName(),
capitalizeFirstLetterAndLowercase(activityType.getName()));
}
private void updateSaveButton(final TravelGpxVH holder, final TravelGpx article) {
if (article != null) {
final TravelLocalDataHelper helper = app.getTravelHelper().getBookmarksHelper();
final boolean saved = helper.isArticleSaved(article);

View file

@ -2,22 +2,28 @@ package net.osmand.plus.wikivoyage.explore.travelcards;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.AndroidUtils;
import net.osmand.osm.RouteActivityType;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.track.TrackMenuFragment;
import net.osmand.plus.wikivoyage.data.TravelGpx;
import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper;
import net.osmand.util.Algorithms;
import java.io.File;
import static net.osmand.util.Algorithms.capitalizeFirstLetterAndLowercase;
public class TravelGpxCard extends BaseTravelCard {
public static final int TYPE = 3;
@ -40,10 +46,16 @@ public class TravelGpxCard extends BaseTravelCard {
if (viewHolder instanceof TravelGpxVH) {
final TravelGpxVH holder = (TravelGpxVH) viewHolder;
holder.title.setText(article.getTitle());
Drawable icon = getActiveIcon(R.drawable.ic_action_user_account_16);
holder.user.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
holder.userIcon.setImageDrawable(getActiveIcon(R.drawable.ic_action_user_account_16));
holder.user.setText(article.user);
AndroidUtils.setBackground(app, holder.user, nightMode, R.drawable.btn_border_bg_light, R.drawable.btn_border_bg_dark);
String activityTypeKey = article.activityType;
if (!Algorithms.isEmpty(activityTypeKey)) {
RouteActivityType activityType = RouteActivityType.getOrCreateTypeFromName(activityTypeKey);
int activityTypeIcon = getActivityTypeIcon(activityType);
holder.activityTypeIcon.setImageDrawable(getActiveIcon(activityTypeIcon));
holder.activityType.setText(getActivityTypeTitle(activityType));
holder.activityTypeLabel.setVisibility(View.VISIBLE);
}
holder.distance.setText(OsmAndFormatter.getFormattedDistance(article.totalDistance, app));
holder.diffElevationUp.setText(OsmAndFormatter.getFormattedAlt(article.diffElevationUp, app));
holder.diffElevationDown.setText(OsmAndFormatter.getFormattedAlt(article.diffElevationDown, app));
@ -66,6 +78,17 @@ public class TravelGpxCard extends BaseTravelCard {
}
}
@DrawableRes
private int getActivityTypeIcon(RouteActivityType activityType) {
int iconId = app.getResources().getIdentifier("mx_" + activityType.getIcon(), "drawable", app.getPackageName());
return iconId != 0 ? iconId : R.drawable.mx_special_marker;
}
private String getActivityTypeTitle(RouteActivityType activityType) {
return AndroidUtils.getActivityTypeStringPropertyName(app, activityType.getName(),
capitalizeFirstLetterAndLowercase(activityType.getName()));
}
private void updateSaveButton(final TravelGpxVH holder) {
if (article != null) {
final TravelLocalDataHelper helper = app.getTravelHelper().getBookmarksHelper();
@ -92,6 +115,10 @@ public class TravelGpxCard extends BaseTravelCard {
public final TextView title;
public final TextView user;
public final ImageView userIcon;
public final TextView activityType;
public final ImageView activityTypeIcon;
public final View activityTypeLabel;
public final TextView distance;
public final TextView diffElevationUp;
public final TextView diffElevationDown;
@ -104,6 +131,10 @@ public class TravelGpxCard extends BaseTravelCard {
super(itemView);
title = itemView.findViewById(R.id.title);
user = itemView.findViewById(R.id.user_name);
userIcon = itemView.findViewById(R.id.user_icon);
activityType = itemView.findViewById(R.id.activity_type);
activityTypeIcon = itemView.findViewById(R.id.activity_type_icon);
activityTypeLabel = itemView.findViewById(R.id.activity_type_label);
distance = itemView.findViewById(R.id.distance);
diffElevationUp = itemView.findViewById(R.id.diff_ele_up);
diffElevationDown = itemView.findViewById(R.id.diff_ele_down);