diff --git a/OsmAnd-api/src/net/osmand/aidlapi/IOsmAndAidlInterface.aidl b/OsmAnd-api/src/net/osmand/aidlapi/IOsmAndAidlInterface.aidl
index 72a3035b60..e25e4338de 100644
--- a/OsmAnd-api/src/net/osmand/aidlapi/IOsmAndAidlInterface.aidl
+++ b/OsmAnd-api/src/net/osmand/aidlapi/IOsmAndAidlInterface.aidl
@@ -873,4 +873,14 @@ interface IOsmAndAidlInterface {
boolean setMapMargins(in MapMarginsParams params);
boolean exportProfile(in ExportProfileParams params);
+
+ /**
+ * Is any fragment open.
+ */
+ boolean isFragmentOpen();
+
+ /**
+ * Is contect menu open.
+ */
+ boolean isMenuOpen();
}
\ No newline at end of file
diff --git a/OsmAnd-api/src/net/osmand/aidlapi/customization/MapMarginsParams.java b/OsmAnd-api/src/net/osmand/aidlapi/customization/MapMarginsParams.java
index 8b810a81b4..11ec2ce17f 100644
--- a/OsmAnd-api/src/net/osmand/aidlapi/customization/MapMarginsParams.java
+++ b/OsmAnd-api/src/net/osmand/aidlapi/customization/MapMarginsParams.java
@@ -3,18 +3,31 @@ package net.osmand.aidlapi.customization;
import android.os.Bundle;
import android.os.Parcel;
+import androidx.annotation.Nullable;
+
import net.osmand.aidlapi.AidlParams;
+import java.util.ArrayList;
+import java.util.List;
+
public class MapMarginsParams extends AidlParams {
- private String appModeKey;
+ public static final String LEFT_MARGIN_KEY = "leftMargin";
+ public static final String TOP_MARGIN_KEY = "topMargin";
+ public static final String RIGHT_MARGIN_KEY = "rightMargin";
+ public static final String BOTTOM_MARGIN_KEY = "bottomMargin";
+ public static final String APP_MODES_KEYS_KEY = "appModesKeys";
+ private ArrayList appModesKeys = new ArrayList<>();
private int leftMargin;
private int topMargin;
private int rightMargin;
private int bottomMargin;
- public MapMarginsParams(String appModeKey, int leftMargin, int topMargin, int rightMargin, int bottomMargin) {
- this.appModeKey = appModeKey;
+ public MapMarginsParams(int leftMargin, int topMargin, int rightMargin, int bottomMargin,
+ @Nullable List appModesKeys) {
+ if (appModesKeys != null) {
+ this.appModesKeys.addAll(appModesKeys);
+ }
this.leftMargin = leftMargin;
this.topMargin = topMargin;
this.rightMargin = rightMargin;
@@ -37,8 +50,8 @@ public class MapMarginsParams extends AidlParams {
}
};
- public String getAppModeKey() {
- return appModeKey;
+ public List getAppModesKeys() {
+ return appModesKeys;
}
public int getLeftMargin() {
@@ -59,19 +72,19 @@ public class MapMarginsParams extends AidlParams {
@Override
public void writeToBundle(Bundle bundle) {
- bundle.putString("appModeKey", appModeKey);
- bundle.putInt("leftMargin", leftMargin);
- bundle.putInt("topMargin", topMargin);
- bundle.putInt("rightMargin", rightMargin);
- bundle.putInt("bottomMargin", bottomMargin);
+ bundle.putInt(LEFT_MARGIN_KEY, leftMargin);
+ bundle.putInt(TOP_MARGIN_KEY, topMargin);
+ bundle.putInt(RIGHT_MARGIN_KEY, rightMargin);
+ bundle.putInt(BOTTOM_MARGIN_KEY, bottomMargin);
+ bundle.putStringArrayList(APP_MODES_KEYS_KEY, appModesKeys);
}
@Override
protected void readFromBundle(Bundle bundle) {
- appModeKey = bundle.getString("appModeKey");
- leftMargin = bundle.getInt("leftMargin");
- topMargin = bundle.getInt("topMargin");
- rightMargin = bundle.getInt("rightMargin");
- bottomMargin = bundle.getInt("bottomMargin");
+ leftMargin = bundle.getInt(LEFT_MARGIN_KEY);
+ topMargin = bundle.getInt(TOP_MARGIN_KEY);
+ rightMargin = bundle.getInt(RIGHT_MARGIN_KEY);
+ bottomMargin = bundle.getInt(BOTTOM_MARGIN_KEY);
+ appModesKeys = bundle.getStringArrayList(APP_MODES_KEYS_KEY);
}
}
\ No newline at end of file
diff --git a/OsmAnd-java/src/main/java/net/osmand/IProgress.java b/OsmAnd-java/src/main/java/net/osmand/IProgress.java
index 762dab727b..407cd735f3 100644
--- a/OsmAnd-java/src/main/java/net/osmand/IProgress.java
+++ b/OsmAnd-java/src/main/java/net/osmand/IProgress.java
@@ -45,7 +45,7 @@ public interface IProgress {
public boolean isInterrupted() {return false;}
@Override
- public boolean isIndeterminate() {return false;}
+ public boolean isIndeterminate() {return true;}
@Override
public void finishTask() {}
diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/MapPoiTypes.java b/OsmAnd-java/src/main/java/net/osmand/osm/MapPoiTypes.java
index f535af8610..e273fa4e7f 100644
--- a/OsmAnd-java/src/main/java/net/osmand/osm/MapPoiTypes.java
+++ b/OsmAnd-java/src/main/java/net/osmand/osm/MapPoiTypes.java
@@ -823,7 +823,7 @@ public class MapPoiTypes {
}
String name = keyName;
name = name.replace('_', ' ');
- return Algorithms.capitalizeFirstLetterAndLowercase(name);
+ return Algorithms.capitalizeFirstLetter(name);
}
public boolean isRegisteredType(PoiCategory t) {
diff --git a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRule.java b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRule.java
index e597386d47..0ae4314dd9 100644
--- a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRule.java
+++ b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRule.java
@@ -41,7 +41,7 @@ public class RenderingRule {
public void init(Map attributes) {
ArrayList props = new ArrayList(attributes.size());
intProperties = new int[attributes.size()];
- floatProperties = null;
+ floatProperties = new float[attributes.size()];
attributesRef = null;
int i = 0;
Iterator> it = attributes.entrySet().iterator();
@@ -58,14 +58,13 @@ public class RenderingRule {
attributesRef[i] = storage.getRenderingAttributeRule(vl.substring(1));
} else if (property.isString()) {
intProperties[i] = storage.getDictionaryValue(vl);
- } else if (property.isFloat()) {
- if (floatProperties == null) {
- // lazy creates
- floatProperties = new float[attributes.size()];
- }
- floatProperties[i] = property.parseFloatValue(vl);
- intProperties[i] = property.parseIntValue(vl);
} else {
+ float floatVal = property.parseFloatValue(vl);
+// if (floatProperties == null && floatVal != 0) {
+// // lazy creates
+// floatProperties = new float[attributes.size()];
+ floatProperties[i] = floatVal;
+// }
intProperties[i] = property.parseIntValue(vl);
}
i++;
@@ -95,7 +94,7 @@ public class RenderingRule {
public float getFloatPropertyValue(String property) {
int i = getPropertyIndex(property);
- if(i >= 0 && floatProperties != null){
+ if (i >= 0) {
return floatProperties[i];
}
return 0;
diff --git a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleProperty.java b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleProperty.java
index 228430b01f..322a734980 100644
--- a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleProperty.java
+++ b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleProperty.java
@@ -155,12 +155,7 @@ public class RenderingRuleProperty {
try {
int colon = value.indexOf(':');
if(colon != -1) {
- int c = 0;
- if(colon > 0) {
- c += (int) Float.parseFloat(value.substring(0, colon));
- }
- c += (int) Float.parseFloat(value.substring(colon + 1));
- return c;
+ return (int) Float.parseFloat(value.substring(colon + 1));
}
return (int) Float.parseFloat(value);
} catch (NumberFormatException e) {
@@ -190,30 +185,35 @@ public class RenderingRuleProperty {
} catch (NumberFormatException e) {
log.error("Rendering parse " + value + " in " + attrName);
}
- return -1;
+ return 0;
} else {
return -1;
}
}
- public float parseFloatValue(String value){
- if(type == FLOAT_TYPE){
- try {
+ public float parseFloatValue(String value) {
+ try {
+ if (type == FLOAT_TYPE) {
int colon = value.indexOf(':');
- if(colon != -1) {
- if(colon > 0) {
+ if (colon != -1) {
+ if (colon > 0) {
return Float.parseFloat(value.substring(0, colon));
- }
+ }
return 0;
}
return Float.parseFloat(value);
- } catch (NumberFormatException e) {
- log.error("Rendering parse " + value + " in " + attrName);
+
+ } else if (type == INT_TYPE) {
+ int colon = value.indexOf(':');
+ if (colon != -1 && colon > 0) {
+ return Float.parseFloat(value.substring(0, colon));
+ }
+ return 0;
}
- return -1;
- } else {
- return -1;
+ } catch (NumberFormatException e) {
+ log.error("Rendering parse " + value + " in " + attrName);
}
+ return 0;
}
diff --git a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleStorageProperties.java b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleStorageProperties.java
index 7a43f1f624..3eafb803dd 100644
--- a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleStorageProperties.java
+++ b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleStorageProperties.java
@@ -244,8 +244,6 @@ public class RenderingRuleStorageProperties {
R_TEXT_HALO_COLOR = registerRuleInternal(RenderingRuleProperty.createOutputColorProperty(TEXT_HALO_COLOR));
R_TEXT_SIZE = registerRuleInternal(RenderingRuleProperty.createOutputFloatProperty(TEXT_SIZE));
R_TEXT_ORDER = registerRuleInternal(RenderingRuleProperty.createOutputIntProperty(TEXT_ORDER));
- R_ICON_ORDER = registerRuleInternal(RenderingRuleProperty.createOutputIntProperty(ICON_ORDER));
- R_ICON_VISIBLE_SIZE = registerRuleInternal(RenderingRuleProperty.createOutputFloatProperty(ICON_VISIBLE_SIZE));
R_TEXT_MIN_DISTANCE = registerRuleInternal(RenderingRuleProperty.createOutputFloatProperty(TEXT_MIN_DISTANCE));
R_TEXT_SHIELD = registerRuleInternal(RenderingRuleProperty.createOutputStringProperty(TEXT_SHIELD));
@@ -265,7 +263,9 @@ public class RenderingRuleStorageProperties {
R_ICON_3 = registerRuleInternal(RenderingRuleProperty.createOutputStringProperty("icon_3"));
R_ICON_4 = registerRuleInternal(RenderingRuleProperty.createOutputStringProperty("icon_4"));
R_ICON_5 = registerRuleInternal(RenderingRuleProperty.createOutputStringProperty("icon_5"));
+ R_ICON_ORDER = registerRuleInternal(RenderingRuleProperty.createOutputIntProperty(ICON_ORDER));
R_SHIELD = registerRuleInternal(RenderingRuleProperty.createOutputStringProperty(SHIELD));
+ R_ICON_VISIBLE_SIZE = registerRuleInternal(RenderingRuleProperty.createOutputFloatProperty(ICON_VISIBLE_SIZE));
// polygon/way
R_COLOR = registerRuleInternal(RenderingRuleProperty.createOutputColorProperty(COLOR));
diff --git a/OsmAnd-telegram/res/values-be/strings.xml b/OsmAnd-telegram/res/values-be/strings.xml
index e1c5661a33..18e71dcd2e 100644
--- a/OsmAnd-telegram/res/values-be/strings.xml
+++ b/OsmAnd-telegram/res/values-be/strings.xml
@@ -267,4 +267,8 @@
Апошні адказ: %1$s таму%1$s тамуERR
+ Даслаць справаздачу
+ Экспартаваць
+ Буфер logcat
+ Праверце і падзяліцеся падрабязнымі журналамі праграмы
\ No newline at end of file
diff --git a/OsmAnd-telegram/res/values-da/strings.xml b/OsmAnd-telegram/res/values-da/strings.xml
index a6e077e7f8..caefa87b94 100644
--- a/OsmAnd-telegram/res/values-da/strings.xml
+++ b/OsmAnd-telegram/res/values-da/strings.xml
@@ -269,4 +269,8 @@
Sidste svar: %1$s siden%1$s sidenERR
+ Eksporter
+ Logcat-buffer
+ Kontroller og del detaljerede logfiler for programmet
+ Send rapport
\ No newline at end of file
diff --git a/OsmAnd-telegram/res/values-tr/strings.xml b/OsmAnd-telegram/res/values-tr/strings.xml
index 87ba56717d..2ff160a4a4 100644
--- a/OsmAnd-telegram/res/values-tr/strings.xml
+++ b/OsmAnd-telegram/res/values-tr/strings.xml
@@ -233,7 +233,7 @@
OsmAnd Tracker, ekran kapalıyken arka planda çalışır.Konumu paylaşKonum paylaşılıyor
- OsmAnd Tracker servisi
+ OsmAnd Tracker hizmetiOsmAnd logosuÖnce OsmAnd\'ın ücretsiz veya ücretli sürümünü yüklemeniz gerekmektedirOsmAnd\'ı yükle
diff --git a/OsmAnd/AndroidManifest.xml b/OsmAnd/AndroidManifest.xml
index 4e5395a04a..f108fc7dd5 100644
--- a/OsmAnd/AndroidManifest.xml
+++ b/OsmAnd/AndroidManifest.xml
@@ -53,7 +53,8 @@
android:icon="@mipmap/icon" android:label="@string/app_name"
android:name="net.osmand.plus.OsmandApplication" android:configChanges="locale"
android:theme="@style/OsmandDarkTheme" android:restoreAnyVersion="true" android:largeHeap="true"
- android:supportsRtl="true" android:usesCleartextTraffic="true">
+ android:supportsRtl="true" android:usesCleartextTraffic="true"
+ android:hasFragileUserData="true" android:requestLegacyExternalStorage="true">
@@ -246,6 +247,7 @@
+
@@ -261,6 +263,7 @@
+
@@ -465,6 +468,13 @@
+
+
+
+
+
+
+
@@ -477,28 +487,11 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/OsmAnd/build.gradle b/OsmAnd/build.gradle
index ee9d4dd684..3638a103ca 100644
--- a/OsmAnd/build.gradle
+++ b/OsmAnd/build.gradle
@@ -53,7 +53,7 @@ android {
defaultConfig {
minSdkVersion System.getenv("MIN_SDK_VERSION") ? System.getenv("MIN_SDK_VERSION").toInteger() : 15
- targetSdkVersion 28
+ targetSdkVersion 29
versionCode 390
versionCode System.getenv("APK_NUMBER_VERSION") ? System.getenv("APK_NUMBER_VERSION").toInteger() : versionCode
multiDexEnabled true
@@ -331,6 +331,9 @@ task collectHelpContentsAssets(type: Copy) {
from("../../help/website/feature_articles") {
include "*.html"
}
+ from("../../help/website/blog_articles") {
+ include "osmand-3-8-released.html"
+ }
into "assets/feature_articles"
}
diff --git a/OsmAnd/res/layout/fragment_measurement_tool.xml b/OsmAnd/res/layout/fragment_measurement_tool.xml
index d4b7f7ea57..2fe4dc1416 100644
--- a/OsmAnd/res/layout/fragment_measurement_tool.xml
+++ b/OsmAnd/res/layout/fragment_measurement_tool.xml
@@ -130,33 +130,25 @@
tools:text="@string/add_point_after"/>
-
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:visibility="gone" >
-
+
-
+ android:layout_height="@dimen/content_padding_small" />
-
-
-
-
+ android:layout_height="wrap_content" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/fragment_measurement_tool_points_list.xml b/OsmAnd/res/layout/fragment_measurement_tool_points_list.xml
new file mode 100644
index 0000000000..a0684707ea
--- /dev/null
+++ b/OsmAnd/res/layout/fragment_measurement_tool_points_list.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/plugin.xml b/OsmAnd/res/layout/plugin.xml
index b0436d95e5..056fc218f0 100644
--- a/OsmAnd/res/layout/plugin.xml
+++ b/OsmAnd/res/layout/plugin.xml
@@ -1,186 +1,204 @@
-
+
-
+
-
+
+
+
+
+
+
+ android:layout_height="wrap_content"
+ android:orientation="vertical" >
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_marginStart="@dimen/content_padding"
+ android:layout_marginLeft="@dimen/content_padding"
+ android:layout_marginTop="@dimen/content_padding"
+ android:layout_marginEnd="@dimen/content_padding"
+ android:layout_marginRight="@dimen/content_padding"
+ android:text="@string/shared_string_description"
+ android:textColor="?android:textColorSecondary"
+ android:textSize="@dimen/default_desc_text_size"
+ osmand:textAllCapsCompat="true"
+ osmand:typeface="@string/font_roboto_medium" />
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/plugins.xml b/OsmAnd/res/layout/plugins.xml
index 095bfee61c..66d220fce8 100644
--- a/OsmAnd/res/layout/plugins.xml
+++ b/OsmAnd/res/layout/plugins.xml
@@ -1,14 +1,24 @@
-
+
+
+
+
+
+
-
+ android:dividerHeight="1dp"
+ android:drawSelectorOnTop="true" />
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/plugins_list_item.xml b/OsmAnd/res/layout/plugins_list_item.xml
index c616b0014f..4e8f369e0c 100644
--- a/OsmAnd/res/layout/plugins_list_item.xml
+++ b/OsmAnd/res/layout/plugins_list_item.xml
@@ -52,6 +52,7 @@
android:ellipsize="end"
android:lines="2"
android:maxLines="2"
+ android:scrollbars="none"
android:text="@string/lorem_ipsum"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
diff --git a/OsmAnd/res/layout/poi_tag_list_item.xml b/OsmAnd/res/layout/poi_tag_list_item.xml
index c057b3f0f1..e8a9c8dbb5 100644
--- a/OsmAnd/res/layout/poi_tag_list_item.xml
+++ b/OsmAnd/res/layout/poi_tag_list_item.xml
@@ -17,13 +17,12 @@
android:layout_marginEnd="@dimen/content_padding">
@@ -34,12 +33,11 @@
android:layout_weight="1">
diff --git a/OsmAnd/res/layout/profile_preference_toolbar.xml b/OsmAnd/res/layout/profile_preference_toolbar.xml
index b76eb61696..6776a7a70c 100644
--- a/OsmAnd/res/layout/profile_preference_toolbar.xml
+++ b/OsmAnd/res/layout/profile_preference_toolbar.xml
@@ -64,6 +64,13 @@
tools:text="Some description" />
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml
index c695a1c813..b60654e873 100644
--- a/OsmAnd/res/values-ar/strings.xml
+++ b/OsmAnd/res/values-ar/strings.xml
@@ -3901,4 +3901,23 @@
\nيمكنك إدارة وإلغاء الاشتراكات الخاصة بك عن طريق الانتقال إلى إعدادات AppGallery.تجنب الممراتتجنب الممرات
+ ما الجديد
+ تطوير
+ بيانات أوسماند لايف
+ بيانات أوسماند لايف
+ التوجيه المركب
+ التوجيه على مرحلتين لملاحة السيارة.
+ تطوير النقل العام المحلي
+ قم بالتبديل إلى Java (الآمن) حساب توجيه النقل العام
+ قم بإجراء تسجيل دخول إلى OAuth لاستخدام ميزات osmedit
+ تسجيل الدخول عبر OAuth
+ مسح رمز OpenStreetMap OAuth
+ تسجيل الخروج بنجاح
+ تم استيراد الملف بالفعل في أوسماند
+ استخدام خوارزمية توجيه من مرحلتين A*
+ %1$s البيانات المتوفرة فقط على الطرق ، تحتاج إلى حساب طريق باستخدام \"الطريق بين النقاط\" للحصول عليها.
+ في انتظار إعادة حساب الطريق
+\nسيتوفر الرسم البياني بعد إعادة الحساب.
+ للقيادة على الجليد مع طرق ومسارات مخصصة.
+ رسم بياني
\ No newline at end of file
diff --git a/OsmAnd/res/values-be/phrases.xml b/OsmAnd/res/values-be/phrases.xml
index f96eaef3ab..253f7eb98d 100644
--- a/OsmAnd/res/values-be/phrases.xml
+++ b/OsmAnd/res/values-be/phrases.xml
@@ -3844,4 +3844,5 @@
Маленькія электрапрыборыВулейКрама арэхаў
+
\ No newline at end of file
diff --git a/OsmAnd/res/values-be/strings.xml b/OsmAnd/res/values-be/strings.xml
index 6839ec5d24..3d0aa6103d 100644
--- a/OsmAnd/res/values-be/strings.xml
+++ b/OsmAnd/res/values-be/strings.xml
@@ -1576,7 +1576,7 @@
Абмежаванне па вышыніПазначыць вышыню транспартнага сродку для разліку маршруту.Разумны пераразлік маршруту
- Пераразлічваць толькі пачатак маршруту для доўгіх паездак.
+ Пераразлічваць толькі пачатак маршруту. Падыходзіць для доўгіх паездак.ВыйсціВыключанаАфарбоўка па пешаходнаму сімвалу OSMC
@@ -3957,4 +3957,27 @@
Апошняя зменаНазва: Я — АНазва: А — Я
+ Што новага
+ Дзякуй за набыццё ўбудовы «Контурныя лініі»
+ Плата за падпіску спаганяецца за абраны перыяд. Скасаваць яе на AppGallery можна у любы момант.
+ Пры пацвярджэнні пакупкі аплата будзе спаганяцца з рахунка, звязанага з вашым акаўнтам AppGallery.
+\n
+\nПадпіска аўтаматычна працягваецца, калі вы не скасуеце яе да даты працягу. З вашага рахунка будзе адзін раз спаганяцца аплата за перыяд працягу (месяц/тры месяцы/год).
+\n
+\nВы можаце кіраваць падпіскамі і скасоўваць іх у наладах AppGallery.
+ Пазбягаць пешаходныя дарожкі
+ Пазбягаць пешаходныя дарожкі
+ Распрацоўка
+ Дзвюхфазная аўтанавігацыя.
+ Натыўны грамадскі транспарт (у распрацоўцы)
+ Увайсці праз OAuth
+ Выкарыстоўваць 2-фазны алгарытм маршрутызацыі A *
+ Перайсці на разлік маршруту грамадскага транспарту на Java (бяспечны)
+ Файл ужо імпартаваны ў OsmAnd
+ Значкі старту і фінішу
+ Увайдзіце праз OAuth, каб выкарыстоўваць функцыі osmedit
+ Ачысціць токен OpenStreetMap OAuth
+ Выхад выкананы
+ Даныя OsmAnd Live
+ Даныя OsmAnd Live
\ No newline at end of file
diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml
index fbf1ccc31f..dec24d8f5d 100644
--- a/OsmAnd/res/values-de/strings.xml
+++ b/OsmAnd/res/values-de/strings.xml
@@ -3925,4 +3925,8 @@
Zwei-Phasen-Routenberechnung für die Autonavigation.Native ÖPNV EntwicklungWechseln zu Java (sicher) Berechnung des ÖPNV-Routings
+ Abmeldung erfolgreich
+ Datei wurde bereits in OsmAnd importiert
+ Anmelden über OAuth
+ OpenStreetMap OAuth-Token löschen
\ No newline at end of file
diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml
index 8dc446b363..df01830535 100644
--- a/OsmAnd/res/values-eo/phrases.xml
+++ b/OsmAnd/res/values-eo/phrases.xml
@@ -3837,4 +3837,5 @@
prokrastoTabulo de forveturojPlenigi per trinkebla akvo
+ tergaso likva (LNG)
\ No newline at end of file
diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml
index 50bc2c4390..ece67180a8 100644
--- a/OsmAnd/res/values-eo/strings.xml
+++ b/OsmAnd/res/values-eo/strings.xml
@@ -73,7 +73,7 @@
VolapukoOsmAnd Mapoj kaj NavigadoInversa ordigo
- Anstataŭigi komencpunkton per finpunkto
+ Anstataŭigi komencpunkton per celoEmblemoj de interesejojElemento forigitaelementoj forigitaj
@@ -742,7 +742,7 @@
Vidiga kolorotagojKonekti
- Prikalkuli kurson inter punktojn
+ Kalkuli kurson inter punktojĈiam montri centrigitan pozicionLokoadresoj tutmondaj
@@ -1853,7 +1853,7 @@
Erara formo: %sVi devas esti konektita al la interreto por instali tiun ĉi kromprogramon.Inteligenta rekalkulado de kurso
- Por longaj vojaĝoj, rekalkuli nur komencan parton de kurso.
+ Rekalkuli nur komencan parton de kurso. Uzebla por longaj kursoj.Taksi tiun ĉi aplikaĵonVia opinio estas grava por ni.Bonvolu taksi OsmAnd ĉe Google Play
@@ -1890,7 +1890,7 @@
Ĉiuj nekonservitaj ŝanĝoj estos forigitaj. Ĉu pluigi?ankoraŭ %1$s elŝutojVojoj
- Elŝutado - %1$s dosiero
+ Elŝutado – %1$d dosieroMontri reklamaĵon de senpaga versioMontri reklamaĵon de senpaga versio, eĉ se vi havas pagan version.Bonvolu aktivigi la kromprogramon “mara map-vido”
@@ -2832,13 +2832,13 @@
Ĉiu-3-monateĈiujare%1$s / monato
- %1$,2f %2$s / monato
+ %1$.2f %2$s / monatoŜparu %1$sNuna kotizoReaboni ĉiumonateReaboni ĉiukvaronjareReaboni ĉiujare
- %1$,2f %2$s
+ %1$.2f %2$sIntertempo de pagoj:Donacoj helpos fondi kartografion de OSM.De OsmAnd
@@ -3357,7 +3357,7 @@
Eraro dum enporti %1$s: %2$s%1$s enportita.Blanka
- Anstataŭigi %1$s per %2$s
+ Anstataŭigi: %1$s ⇄ %2$sKomencpunktoAnstataŭigi komencpunkton per celoSimuli vian pozicion uzante registritan GPX‑kurson.
@@ -3651,7 +3651,7 @@
%1$s / %2$sLa pago estos prenita el via konto Google Play post konfirmi aĉeton.
\n
-\n La abono aŭtomate renoviĝos escepte se ĝi estos nuligita antaŭ la dato de renoviĝo. La pago estos prenita por la renoviĝa periodo (monato/tri monatoj/jaro) nur je la data de renoviĝo.
+\n La abono aŭtomate renoviĝos escepte se ĝi estos nuligita antaŭ la dato de renoviĝo. La pago estos prenita por la renoviĝa periodo (monato/tri monatoj/jaro) nur je la dato de renoviĝo.
\n
\n Vi povas administri kaj rezigni viajn abonojn per agordoj de Google Play.Miksi specojn de interesejoj el diversaj kategorioj. Frapetu ŝaltilon por elekti la tutan kategorion, frapetu ĉe maldekstre por elekti detala(j)n objekto(j)n el la kategorio.
@@ -3894,7 +3894,7 @@
Simpligita spuroNur la linio de kurso estos konservita, la navigadpunktoj estos forigitaj.Dosiernomo
- %d dosieroj de spuroj elektitaj
+ %s dosieroj de spuroj elektitajPaŭzigos registri spuron je halto de la aplikaĵo (per la menuo de lastaj aplikaĵoj). (Fona emblemo de OsmAnd malaperos de la androida sciiga zono.)Paŭzigi registri spuronDaŭrigi registri spuron
@@ -3903,4 +3903,33 @@
Antaŭa segmentoĈiuj antaŭaj segmentojNur la elektita segmento estos rekalkulita uzante la elektitan profilon.
+ Kio estas nova
+ La pago estos prenita el via konto AppGallery post konfirmi aĉeton.
+\n
+\n La abono aŭtomate renoviĝos escepte se ĝi estos nuligita antaŭ la dato de renoviĝo. La pago estos prenita por la renoviĝa periodo (monato/tri monatoj/jaro) nur je la dato de renoviĝo.
+\n
+\n Vi povas administri kaj rezigni viajn abonojn per la agordoj de AppGallery.
+ Emblemoj komenco/fino
+ Dankon al vi por aĉeti la kromprogramon “nivelkurboj”
+ Abonpago prenita por la elektita periodo. VI ĉiam povas rezigni abonon ĉe AppGallery.
+ Eviti irejojn
+ Sen trotuaroj
+ Programado
+ Datumoj OsmAnd Live
+ Datumoj OsmAnd Live
+ Komplika kurs-difinado
+ Du-faza difinado de kurso por aŭtomobila navigo.
+ Indiĝena metodo de publik-transporta navigo
+ Aktivigi (sekuran) metodon por kalkuli kursojn de publika transporto uzante programlingvon Java
+ Ensaluti uzante OAuth por redakti la mapon OSM
+ Ensaluti per OAuth
+ Forigi ĵetonon OpenStreetMap OAuth
+ Sukcese elsalutinta
+ Por veturi per motorsledo sur dediĉitaj vojoj.
+ Dosiero jam estas enportita al OsmAnd
+ Uzi 2-fazan A* algoritmon de navigo
+ Diagramo
+ Datumoj de %1$s estas disponeblaj nur por vojoj, vi devas kalkuli la kurson uzante “kalkuli kurson inter punktoj” por akiri ĝin.
+ Atendado ĝis la kurso estos rekalkulita.
+\nDiagramo estos videbla post rekalkulado.
\ No newline at end of file
diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml
index 88c35ef6f9..4a15cc5cdd 100644
--- a/OsmAnd/res/values-es-rAR/phrases.xml
+++ b/OsmAnd/res/values-es-rAR/phrases.xml
@@ -3568,8 +3568,8 @@
RadioterapiaAdvertencia de peligroCategoría de dificultad
- н/к (sin categoría)
- н/к* (sin categoría, posible peligro)
+ s/c (sin categoría)
+ s/c* (sin categoría, posible peligro)1A1A*1B
diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml
index 5e5fae0268..b68eaba5e1 100644
--- a/OsmAnd/res/values-es-rAR/strings.xml
+++ b/OsmAnd/res/values-es-rAR/strings.xml
@@ -3929,4 +3929,11 @@
Ingresar a través de OAuthVaciar llave OAuth de OpenStreetMapSesión finalizada
+ Para caminos y senderos exclusivos de motos de nieve.
+ El archivo ya fue importado en OsmAnd
+ Usar el algoritmo de enrutamiento A* de 2 fases
+ Gráfico
+ %1$s datos disponibles sólo en los caminos, necesitas calcular una ruta usando «Ruta entre puntos» para obtenerla.
+ Espera el recálculo de la ruta.
+\nEl gráfico estará disponible después del recálculo.
\ No newline at end of file
diff --git a/OsmAnd/res/values-et/phrases.xml b/OsmAnd/res/values-et/phrases.xml
index 4cb42eee67..daafc22ac5 100644
--- a/OsmAnd/res/values-et/phrases.xml
+++ b/OsmAnd/res/values-et/phrases.xml
@@ -3559,20 +3559,20 @@
$0.5 mündidLaadimisjaamOht
- н/к
- н/к*
- 1А
- 1А*
- 1Б
- 1Б*
- 2А
- 2А*
- 2Б
- 2Б*
- 3А
- 3А*
- 3Б
- 3Б*
+ k/p
+ k/p*
+ 1A
+ 1A*
+ 1B
+ 1B*
+ 2A
+ 2A*
+ 2B
+ 2B*
+ 3A
+ 3A*
+ 3B
+ 3B*Gaasi põletamine;HõõglampKustutatud objektKiiritusravi
diff --git a/OsmAnd/res/values-et/strings.xml b/OsmAnd/res/values-et/strings.xml
index c580533de8..8ccdb58038 100644
--- a/OsmAnd/res/values-et/strings.xml
+++ b/OsmAnd/res/values-et/strings.xml
@@ -3593,7 +3593,7 @@
Kuna mõnedel marsruutidel võidakse kohaldada sõidukite kõrguspiiranguid, siis palun märkige oma sõiduki kõrgus.Kuna mõnedel marsruutidel võidakse kohaldada piiranguid pikkade sõidukite suhtes, siis palun märkige oma sõiduki pikkus.Kuna mõnedel marsruutidel võidakse kohaldada sõidukite kaalupiiranguid, siis palun märkige oma sõiduki kaal.
- OsmAnd GPX faili vorming pole korrektne. Täpsemaks uurimiseks palun suhtle meie tugimeeskonnaga.
+ OsmAnd GPX-andmestiku vorming on vigane. Täpsemaks uurimiseks palun võta ühendust meie kasutajatoega.Sorteeri kategooria järgiJätkaImporditavas profiilis leidub täiendavaid andmeid. Vajutades „Impordi“ imporditakse vaid profiili andmed, täiendavate andmete jaoks pead märkima vastava valiku.
@@ -3775,4 +3775,11 @@
Arveldame tellimuse eest valitud ajavahemiku alusel. Seda saad sa vabalt valitud ajal tühistada AppGallery\'s.Keeruka teekonna koostamineVäljalogimine õnnestus
+ Arendus
+ Kustuta OpenStreetMap\'i OAuth\'i pääsuluba
+ Logi sisse OAuth abil
+ Kui sa soovid kasutada kaardi muutmise võimalusi, siis palun logi sisse OAuth abil
+ Meie uudised
+ Kasuta kahefaasilist A-klassi teekonna koostamise algoritmi
+ See fail on juba OsmAnd\'i imporditud
\ No newline at end of file
diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml
index 7df4716103..04e329659a 100644
--- a/OsmAnd/res/values-fr/strings.xml
+++ b/OsmAnd/res/values-fr/strings.xml
@@ -3900,4 +3900,16 @@
Connectez-vous avec OAuthSupprimer le jeton OAuth d\'OpenStreetMapDéconnexion réussie
+ Le fichier est déjà importé dans OsmAnd
+ Utiliser un algorithme de routage A* à 2 phases
+ Le paiement sera débité de votre compte AppGallery dès confirmation de l\'achat.
+\n
+\nA moins qu\'il ne soit annulé avant sa date de renouvellement, l\'abonnement sera automatiquement débité à chaque échéance (mensuelle / trimestrielle / annuelle).
+\n
+\nVous pouvez gérer et annuler vos abonnements dans vos paramètres AppGallery.
+ Seulement %1$s données disponibles sur les routes. Vous devez calculer l\'itinéraire via \"Itinéraire entre 2 points\".
+ Recalcul de l\'itinéraire en cours.
+\nLe graphique sera disponible à l\'issue du calcul.
+ Pour la conduite en motoneige avec des routes et des pistes dédiées.
+ Graphique
\ No newline at end of file
diff --git a/OsmAnd/res/values-gl/phrases.xml b/OsmAnd/res/values-gl/phrases.xml
index a840ae5d86..b974255f35 100644
--- a/OsmAnd/res/values-gl/phrases.xml
+++ b/OsmAnd/res/values-gl/phrases.xml
@@ -65,7 +65,7 @@
Lomba pequena de velocidadeRodasInspección técnica de vehículos
- Lavadura de automóbiles
+ Lavado de automóbilesGasolineira;Estación de combustíbel;Estación de servizoAr comprimidoAparcadoiro
diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml
index 8e7a90f00a..0a65bf9b5a 100644
--- a/OsmAnd/res/values-gl/strings.xml
+++ b/OsmAnd/res/values-gl/strings.xml
@@ -3675,7 +3675,7 @@ Lon %2$s%1$s / %2$s"O pagamento será cobrado na túa conta da Google Play na confirmación da compra.
\n
-\n A subscrición é renovada de xeito automático, a menos que sexa desbotada antes da data de renovación. A túa conta será cobrada polo período de renovación (més/trimestre/ano) soamente na data de renovación.
+\n A subscrición é renovada de xeito automático, a menos que sexa desbotada antes da data de renovación. A túa conta será cobrada polo período de renovación (mes/trimestre/ano) soamente na data de renovación.
\n
\n Podes xestionar e desbotar as túas subscricións entrando nos axustes da Google Play."Procurar tipos de PDI
@@ -3945,4 +3945,9 @@ Lon %2$sEnrutamento de dúas fases para a navegación de automóbilDesenvolvemento do transporte público nativoActivar cálculo de enrutamento de transporte público do Java (seguro)
+ Novidades
+ Inicia sesión co OAuth para empregar as funcións de edición do OSM
+ Entrar polo OAuth
+ Limpar token do OpenStreetMap OAuth
+ Sesión rematada
\ No newline at end of file
diff --git a/OsmAnd/res/values-hu/phrases.xml b/OsmAnd/res/values-hu/phrases.xml
index 0234cd76a2..eb5f1ef453 100644
--- a/OsmAnd/res/values-hu/phrases.xml
+++ b/OsmAnd/res/values-hu/phrases.xml
@@ -3553,20 +3553,20 @@
SugárkezelésVeszélyNehézségi fok (az Orosz Túrasportszövetség skáláján)
- н/к
- н/к*
- 1А
- 1А*
- 1Б
- 1Б*
- 2А
- 2А*
- 2Б
- 2Б*
- 3А
- 3А*
- 3Б
- 3Б*
+ N/A
+ N/A*
+ 1A
+ 1A*
+ 1B
+ 1B*
+ 2A
+ 2A*
+ 2B
+ 2B*
+ 3A
+ 3A*
+ 3B
+ 3B*GázfáklyaTörölt objektumSugárkezelés
diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml
index be5f333f2a..ac040cd72f 100644
--- a/OsmAnd/res/values-hu/strings.xml
+++ b/OsmAnd/res/values-hu/strings.xml
@@ -3739,11 +3739,11 @@
Kiegészítő adatok átvételeAz importált profil kiegészítő adatokat is tartalmaz. Koppintson az \"Importál\" gombra kizálólag a profiladatok importálásához vagy válassza a kiegészítő adatokat.Összes adat importálva innen: %1$s, az alábbi gombokkal megnyithatja az alkalmazás megfelelő részét az adatok kezeléséhez.
- A fizetés a Google Play fiókhoz lesz felszámítva a vásárlás megerősítésekor.
+ A fizetést a vásárlás visszaigazolásakor a Google Play számlájára terheljük.
\n
-\nAz előfizetés automatikusan megújul, kivéve ha a meghosszabbítás napja előtt lemondásra kerül. A fókjához az új időszak (hónap/három hónap/év) díja kizárólag a meghosszabítás napján lesz felszámolva.
+\nAz előfizetés automatikusan megújul, kivéve, ha azt a megújítási dátum előtt lemondja. A megújítási időszakra (hónap / 3 hónap / év) vonatkozóan a számláját csak a megújítás napján terheljük meg.
\n
-\nAz előfizetéseit a Google Play beállításainál tudja kezelni és lemondani.
+\nAz előfizetéseket a Google Play beállításai között kezelheti és törölheti.Törli az útvonal soron következő célpontját. Amennyiben ez a végző célpont, a navigáció megáll.Tudjon meg többet az érdekes pontokról a Wikipédiából. Ez az Ön offline zsebútikönyve – egyszerűen kapcsolja be a Wikipédia-bővítményt, és élvezze az Ön körüli objektumokról szóló cikkeket.Salakmotor
@@ -3918,4 +3918,6 @@
Bejelentkezés OAuth segítségévelOpenStreetMap OAuth token törléseSikeresen kijelentkezett
+ Kétszakaszos A* útvonaltervezési algoritmus használata
+ A fájl már importálva van az OsmAndba
\ No newline at end of file
diff --git a/OsmAnd/res/values-is/phrases.xml b/OsmAnd/res/values-is/phrases.xml
index 2c6a85bdb4..07ff354d7e 100644
--- a/OsmAnd/res/values-is/phrases.xml
+++ b/OsmAnd/res/values-is/phrases.xml
@@ -3827,4 +3827,7 @@
LyftaSmærri raftækiÁfylling drykkjarvatns
+ LNG
+ Brottfaratafla: nei
+ Brottfaratafla
\ No newline at end of file
diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml
index d2404aaba2..c5ce396f03 100644
--- a/OsmAnd/res/values-is/strings.xml
+++ b/OsmAnd/res/values-is/strings.xml
@@ -530,7 +530,7 @@
Víðværar stillingarAlmenntBakgrunnshamur
- Eyða \'%s\'?
+ Eyða %1$s\?ÚthverfiByggðakjarniÞorp
@@ -709,8 +709,8 @@
Leyfa hraðbrautir.Wikipedia-greinar í nágrenninuÚtreikningur leiðar
- Þú ert ekki með neina GPX-ferla ennþá
- Þú getur líka bætt GPX-skrám í möppuna
+ Þú ert ekki ennþá með neina ferla
+ Þú getur líka bætt ferilskrám í möppunaVirkja hraðskráningu ferðarFerðSkráð
@@ -723,7 +723,7 @@
Engin internettengingNauðsynleg til að sækja kort.Leita að stað…
- Gagnageymsla OsmAnd (fyrir kort, GPX-ferla, o.s.frv.): %1$s.
+ Gagnageymsla OsmAnd (fyrir kort, ferilskrár, o.s.frv.): %1$s.Gefa heimildEkki sýna nýjar útgáfurKomast í gang
@@ -1718,7 +1718,7 @@
Stærð leturs fyrir nöfn á kortinu:Aflúsunarupplýsingar myndgerðarBirta afköst myndgerðar.
- Snúa við stefnu GPX
+ Snúa við stefnu ferilsFrálag raddleiðsagnarHljóð í margmiðlun/tónlistNota rastakort fyrir allt undir þessu aðdráttarstigi.
@@ -1746,7 +1746,7 @@
Stigvaxandi leit byggingarUpplýsingum um hnút var ekki hlaðið innSnjöll endurreiknun leiðar
- Einungis endurreikna upphafshluta leiðar fyrir langar ferðir.
+ Endurreiknar aðeins upphafshluta leiðar. Má nota fyrir langar ferðir.Kortið sem eingöngu er með vegum er ekki nauðsynlegt, þar sem þú ert þegar með staðlaða (fulla útgáfu) kortsins. Sækja það samt?Birta dýptarlínur og punkta.Dýptarlínur sjávar
@@ -2116,7 +2116,7 @@
Gat ekki flutt skrána inn. Vinsamlegast athugið hvort OsmAnd hafi réttindi til að lesa skrána þar sem hún er.Opna MapillaryMapillary græja
- Götumyndir
+ Mapillary götumyndirMapillary-myndMælistika út frá miðju hringsHeimildir
@@ -2904,10 +2904,10 @@
Gerðir vegaFara útaf viðFara um borð við stöðvunina
- Birta/Fela GPX-ferla
- Hnappur til að birta eða fela valda GPX-ferla á kortinu.
- Fela GPX-ferla
- Birta GPX-ferla
+ Birta/Fela ferla
+ Hnappur til að birta eða fela valda ferla á kortinu.
+ Fela ferla
+ Birta ferla• Nýr skjár fyrir \'Leiðir\': Birtir leiðarhnappa fyrir \'Heim\' og \'Vinna\', flýtileið á fyrri leið, listi yfir virka GPX-ferla og merki, leitarferill
\n
\n • Viðbótarupplýsingar undir \'Nánar um leið\': gerð vegar, yfirborð, bratti, áferð
@@ -3766,7 +3766,7 @@
Víxlhnappur til að birta eða fela Mapillary-lagið á kortinu.Stefna%1$s eytt
- Endurræsing er nauðsynleg til að geta fjarlægt alveg gögn um hraðamyndavélar.
+ Endurræstu forritið til að fjarlægja öll gögn um hraðamyndavélar.Fjarlægja og endurræsaFjarlægjaAðvaranir vegna hraðamyndavéla eru bannaðar með lögum í sumum löndum.
@@ -3777,19 +3777,19 @@
\n
\nVeldu %2$s: öllum gögnum sem tengjast hraðamyndavélum; t.d. aðvaranir, tilkynningar, staðsetningar o.fl. verður eytt þar til OsmAnd er sett inn aftur frá grunni.Veldu ferilskrá þar sem nýjum bút verður bætt inn.
- Veldu hvernig eigi að tengja punkta; með beinni línu eða reikna leið milli þeirra með þessu sniði.
+ Veldu hvernig eigi að tengja punkta; með beinni línu eða reikna leið milli þeirra eins og tiltekið er hér að neðan.Allur ferillinn verður endurreiknaður með völdu sniði.Lokaður OSM-minnispunkturAllur ferillinn
- Sýna tákn fyrir upphaf/enda
+ Sýna tákn fyrir upphaf og endaÞetta tæki er ekki með hraðamyndavélar.Gókart
- Þú verður að skilgreina virka daga til að halda áfram
+ Skilgreindu virka daga til að halda áframEyða næsta markpunktiLeiðsagnarsniðHjólastóll áframNáðu í upplýsingar um merka staði frá Wikipedia. Þetta er þá orðið að vasaleiðsögn án nettengingar - bara virkjaðu Wikipedia-viðbótina og njóttu þess að geta lesið um hlutina í kringum þig.
- Virkja þetta til að hægt sé að stýra aðdráttarstigi korts með hljóðstyrkshnöppum.
+ Stýrðu aðdráttarstigi korts með hljóðstyrkshnöppum tækisins.Tilgreindu lengd farartækis sem leyfð er á leiðum.Ef stefna er öfugAðeins næsti bútur verður endurreiknaður með völdu sniði.
@@ -3840,7 +3840,7 @@
\nVeldu bilið þar sem merki með tíma eða vegalengd á ferlinum verða birt.Tengja við vegina
- Ertu viss um að þú viljir loka leiðaskipulagningu án þess að vista\? Þú munt tapa öllum breytingum.
+ Ertu viss um að þú viljir loka leiðaskipulagningu án þess að vista\?Vista sem ferilskráÞolvik vegalengdarSkrifa feril í GPX-skrá
@@ -3856,11 +3856,9 @@
Upphaf ferilsFerlarSettu inn heimilisfang
- Veldu ferilskrá til að fylgja eða flyttu inn úr tæki.
+ Veldu ferilskrá til að fylgja eða flyttu hana inn úr tækinu þínu.Bæta í ferilskrá
- Til að nota þennan valkost þarf OsmAnd að festa ferilinn þinn við vegi á kortinu.
-\n
-\nÍ næsta skrefi þarftu að velja leiðsagnarsnið svo hægt sé að finna hvaða vegir séu leyfilegir og hvaða þolvik vegalengdar eigi að miða við til að nálga ferilinn þinn við fyrirliggjandi vegi.
+ Í næsta skrefi þarftu að velja leiðsagnarsnið svo hægt sé að finna hvaða vegir séu leyfilegir og hvaða þolvik vegalengdar eigi að miða við til að nálga ferilinn þinn við fyrirliggjandi vegi.Bæta við ferilskrámLínuskautarBæta við heimilisfangi
@@ -3868,7 +3866,7 @@
Skráning ferðarNæsti punkturFerlar
- GPX
+ RECKlippa á undanBæta við leiðarpunkti í ferilSkipta um gerð leiðar eftir
@@ -3879,4 +3877,41 @@
Skrá leið í ferilVelja annan ferilSkrifa feril sjálfkrafa í GPX-skrá á meðan leiðsögn stendur
+ Nýjungar
+ Einfaldaður ferill
+ Aðeins leiðarlínan verður vistuð, ferilpunktunum verður eytt.
+ Skráarheiti
+ Sjálfgefið í kerfinu
+ Allir bútar í kjölfarið
+ Fyrri bútur
+ Allir fyrri bútar
+ Aðeins valinn bútur verður endurreiknaður með völdu sniði.
+ Allir bútar sem á eftir fylgja verða endurreiknaðir með völdu sniði.
+ Allir fyrri bútar verða endurreiknaðir með völdu sniði.
+ Opna vistaðan feril
+ er vistað
+ Bættu við a.m.k. tveimur punktum.
+ Endurtaka
+ Síðast breytt
+ Nafn: Ö – A
+ Nafn: A – Ö
+ Tákn við upphaf/enda
+ Forðast gangstéttir
+ Forðast gangstéttir
+ Þróun
+ OsmAnd Live gögn
+ OsmAnd Live gögn
+ Flókin leiðagerð
+ Tveggja-þátta leiðagerð fyrir bílaleiðsögn.
+ Innbyggð þróun almenningssamgangna
+ Skipta yfir í Java (öruggt) útreikning fyrir almenningssamgöngur
+ Framkvæma OAuth-innskráningu til að nota osmedit-eiginleika
+ Skrá inn í gegnum OAuth
+ Hreinsa OAuth-teikn OpenStreetMap
+ Útskráning tókst
+ %s GPX-skrár valdar
+ Mun setja GPX-skráningu í bið þegar forritið er drepið (slökkt á því í gegnum skjáinn fyrir nýleg forrit - bakgrunnsvísir OsmAnd hverfur þar með úr tilkynningastiku Android-kerfisins.)
+ Veldu millibil skráninga í almenna leiðarskráningu (virkjað með viðmótshlutanum fyrir GPX-skráningu á kortinu).
+ Setja skráningu í bið
+ Halda áfram með skráningu
\ No newline at end of file
diff --git a/OsmAnd/res/values-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml
index 756dfe73dd..efe9cb3b27 100644
--- a/OsmAnd/res/values-iw/strings.xml
+++ b/OsmAnd/res/values-iw/strings.xml
@@ -3931,4 +3931,11 @@
להיכנס דרך OAuthלמחוק את אסימון ה־OAuth של OpenStreetMapהיציאה הצליחה
+ הקובץ כבר ייובא אל OsmAnd
+ להשתמש באלגוריתם חישוב מסלול דו־שלבי A*
+ לנהיגה ברכבי שלג עם דרכים ומסלולים יעודיים.
+ הנתונים של %1$s זמינים בדרכים בלבד, עליך לחשב מסלול באמצעות „מסלול בין נקודות” כדי לקבל אותם.
+ תרשים
+ נא להמתין לחישוב המסלול מחדש.
+\nהתרשים יהיה זמין לאחר החישוב מחדש.
\ No newline at end of file
diff --git a/OsmAnd/res/values-ja/phrases.xml b/OsmAnd/res/values-ja/phrases.xml
index 66c5cc2a31..865fa35edc 100644
--- a/OsmAnd/res/values-ja/phrases.xml
+++ b/OsmAnd/res/values-ja/phrases.xml
@@ -50,8 +50,8 @@
インターネット有りレジャークラブ
- 食堂
- 軽食
+ 飲食店
+ カフェ・レストランサービス工芸金融機関
@@ -568,9 +568,9 @@
公園レクリエーション広場共有地
- 喫茶店・カフェ
+ カフェビアガーデン
- レストラン・食堂
+ レストランファーストフードバー・立ち呑み屋フードコート
@@ -1012,7 +1012,7 @@
正面玄関入り口出口
- 高速道路の横断歩道
+ 横断歩道営業時間収集時間詳細
@@ -3834,4 +3834,5 @@
行政区ギブボックス(提供品置場)簡易給水栓
+ 液化天然ガス
\ No newline at end of file
diff --git a/OsmAnd/res/values-ja/strings.xml b/OsmAnd/res/values-ja/strings.xml
index 35f9146fc7..86695fc95d 100644
--- a/OsmAnd/res/values-ja/strings.xml
+++ b/OsmAnd/res/values-ja/strings.xml
@@ -927,10 +927,10 @@ POIの更新は利用できませんこのOsmAnd 無料版はダウンロード数が%1$s個に制限されており、オフラインでのWikipedia記事利用もサポートしていません。無料版POIの説明文を表示
- 北米
+ 北アメリカアメリカ合衆国
- 中米
- 南米
+ 中央アメリカ
+ 南アメリカヨーロッパヨーロッパ - フランスヨーロッパ - ドイツ
@@ -1553,7 +1553,7 @@ POIの更新は利用できません
高さ制限ルート上で通行可能な車両の高さを指定します。スマートなルート再計算
- 経路が長い場合、最初の部分のみ再計算します。
+ ルートの最初の部分のみを再計算します。旅程(設定ルート)がとても長い場合に効果的です。明色暗色ピエモンテ語
@@ -1936,7 +1936,7 @@ POIの更新は利用できません
バス鉄道現在の経路
- バッテリーレベル
+ バッテリー残量マーカーの位置を変更マップ画面のドラッグでマーカー位置を調整できます
@@ -3307,7 +3307,7 @@ POIの更新は利用できません
アプリ全体に反映されますOsmAnd設定他のプロファイルからコピー
- 画面表示機能
+ 画面の復帰設定ナビゲーション中のマップ表示ナビゲーション中のマップ表示その他
@@ -3705,7 +3705,7 @@ POIの更新は利用できません
グジャラート語チュヴァシ語OsmAnd GPXの形式が正しくありません。サポートチームに連絡しての調査をおすすめします。
- 画面のタイムアウト
+ 画面の消灯設定画面復帰オプションを選択します(端末設定でロックされる場合は、OsmAndがバックグラウンド動作でないことを確認してください):端末側の画面オフ(省電力)設定に従って画面を消灯します。端末側の画面オフ設定を使用
@@ -3760,7 +3760,7 @@ POIの更新は利用できません
車両の重量を入力してください。一部のルートにおいては、大型車両では通行できない場合があります。車の長さを入力してください。一部のルートにおいては、長い車両では通行できない場合があります。常に
- 画面制御
+ 画面の制御現在無効。 \'画面を表示する時間\'の下にある\'画面を常に表示\'への設定が必要です。画面オフを維持疑似メルカトル図法
@@ -3801,7 +3801,7 @@ POIの更新は利用できません
アンインストール一部の国では、スピードカメラの事前警告は法律で禁止されています。\"%1$s\"がオンの場合、設定された動作時間はそちらに依存します。
- デフォルトの画面タイムアウト時間
+ 端末設定の画面スリープ時間に従うトーンメートル追加マップの詳細を表示または非表示にします
@@ -3900,4 +3900,18 @@ POIの更新は利用できません
最終更新日名称: 降順(Z-A)名称: 昇順(A-Z)
+ Java(セーフモード)での公共交通機関ルーティング計算に切り替えます
+ OsmEdit機能を利用するには、OAuthでのログインが必要です。
+ OAuthでログイン
+ OpenStreetMapOAuthトークンを消去する
+ ログアウトしました
+ 歩道を使わないようにします
+ 歩道を避ける
+ 開発
+ OsmAnd Liveデータ
+ OsmAnd Liveデータ
+ 複雑なルート計算
+ カーナビゲーション向けの2段階ルート計算です。
+ 2段階 A*ルーティングアルゴリズムを使用
+ ファイルはすでにOsmAndにインポートされています
\ No newline at end of file
diff --git a/OsmAnd/res/values-nb/strings.xml b/OsmAnd/res/values-nb/strings.xml
index 97364e7f2d..85bfc9b423 100644
--- a/OsmAnd/res/values-nb/strings.xml
+++ b/OsmAnd/res/values-nb/strings.xml
@@ -3866,4 +3866,6 @@
Logg inn via OAuthHva er nyttUtlogget
+ Bruk 2-stegs A*-rutingsalgoritme
+ Filen er allerede importert i OsmAnd
\ No newline at end of file
diff --git a/OsmAnd/res/values-pt-rBR/phrases.xml b/OsmAnd/res/values-pt-rBR/phrases.xml
index 07c80c478d..bcb7d4a63f 100644
--- a/OsmAnd/res/values-pt-rBR/phrases.xml
+++ b/OsmAnd/res/values-pt-rBR/phrases.xml
@@ -3561,14 +3561,14 @@
RadioterapiaPerigoCategoria de dificuldade
- н/к
- н/к*
- 1А
- 1А*
+ n/c
+ n/c*
+ 1A
+ 1A*1B1B*2А
- 2А*
+ 2A*2B2B*3А
diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml
index 8f1641cca9..1ea7427da0 100644
--- a/OsmAnd/res/values-pt-rBR/strings.xml
+++ b/OsmAnd/res/values-pt-rBR/strings.xml
@@ -2821,7 +2821,7 @@
Renova anualmenteRenova trimestralmentePor OsmAnd
- %1$,2f %2$s
+ %1$.2f %2$sPeríodo de pagamento:As doações ajudam a financiar a cartografia no OSM.• Navegação: Corrige barra de progresso, inversão rápida de início e fim de rota
@@ -3921,4 +3921,11 @@
Entrar via OAuthLimpar token do OpenStreetMap OAuthSaída bem sucedida
+ O arquivo já foi importado para OsmAnd
+ Use o algoritmo de roteamento 2-phase A *
+ Para dirigir em motos de neve com estradas e trilhas exclusivas.
+ Gráfico
+ Dados de %1$s disponíveis apenas nas estradas, você precisa calcular uma rota usando “Rota entre pontos” para obtê-la.
+ Aguarde o recálculo da rota.
+\nO gráfico estará disponível após o recálculo.
\ No newline at end of file
diff --git a/OsmAnd/res/values-pt/phrases.xml b/OsmAnd/res/values-pt/phrases.xml
index fc6f81cb62..05bf64827a 100644
--- a/OsmAnd/res/values-pt/phrases.xml
+++ b/OsmAnd/res/values-pt/phrases.xml
@@ -3548,18 +3548,18 @@
BondeBalsaFonte de energia: biomassa
- н/к
- н/к*
- 1А
- 1А*
+ n/c
+ n/c*
+ 1A
+ 1A*1B1B*
- 2А
- 2А*
+ 2A
+ 2A*2B2B*
- 3А
- 3А*
+ 3A
+ 3A*3B3B*Explosão de gás;Queimador de gás
diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml
index 12f7810ed8..8179f41893 100644
--- a/OsmAnd/res/values-pt/strings.xml
+++ b/OsmAnd/res/values-pt/strings.xml
@@ -3928,4 +3928,11 @@
Fazer login via OAuthLimpar token do OpenStreetMap OAuthLogout bem sucedido
+ O ficheiro já é importado em OsmAnd
+ Usar algoritmo de roteamento de 2 fases A*
+ Para a condução de motos de neve com estradas e pistas dedicadas.
+ Gráfico
+ %1$s dados disponíveis apenas nas estradas, precisa calcular uma rota a usar \"Rota entre pontos\" para obtê-la.
+ Espere pelo recalculo da rota.
+\nO gráfico estará disponível após o recalculo.
\ No newline at end of file
diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml
index d87b1f7c05..7b0db11a82 100644
--- a/OsmAnd/res/values-ru/phrases.xml
+++ b/OsmAnd/res/values-ru/phrases.xml
@@ -1737,7 +1737,7 @@
Тип приюта: для кошекТип приюта: для собак и кошекТип приюта: для лошадей
- Исторический самолёт
+ Историческое воздушное судноМёдС лифтомБез лифта
diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml
index d2c1dfd578..1e5b9b274d 100644
--- a/OsmAnd/res/values-ru/strings.xml
+++ b/OsmAnd/res/values-ru/strings.xml
@@ -1336,7 +1336,7 @@
Данные о тайлах: %1$sОбзорная карта мираВремя действия (в минутах)
- Самолёт
+ Воздушное судноЛодкаПеший туризмМотоцикл
@@ -2269,7 +2269,7 @@
Удалить действиеВы уверены, что хотите удалить действие «%s»\?Показать избранные
- Скрыть сохранённые
+ Скрыть избранныеПоказать/скрыть POIПоказать %1$sСкрыть %1$s
@@ -3242,8 +3242,8 @@
Буфер LogcatНастройки плагиновЯзык и вывод
- Переместить файлы данных OsmAnd в новое место назначения\?
-\n%1$s > %2$s
+ Переместить файлы данных OsmAnd в новое место назначения\?
+\n%1$s → %2$sПо умолчанию%1$s • %2$s%1$s ГБ свободно (из %2$s ГБ)
@@ -3349,7 +3349,7 @@
Выберите цветВы не можете удалить стандартные профили OsmAnd, но вы можете отключить их на предыдущем экране или переместить вниз.Редактировать профили
- Режим навигации определяет правила расчета маршрутов.
+ Режим навигации определяет правила расчёта маршрутов.Внешний вид профиляЗначок, цвет и имяРедактировать список профилей
@@ -3580,7 +3580,7 @@
Примечание: проверка скорости > 0: большинство модулей GPS сообщают значение скорости только в том случае, если алгоритм определяет, что вы движетесь, и ничего, если вы не перемещаетесь. Следовательно, использование параметра > 0 в этом фильтре в некотором смысле приводит к обнаружению факта перемещения модуля GPS. Но даже если мы не производим данную фильтрацию во время записи, то всё равно эта функция используется при анализе GPX для определения скорректированного расстояния, то есть значение, отображаемое в этом поле, является расстоянием, записанным во время движения.Разделение записиУкажите веб-адрес со следующими параметрами: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}.
- "Будут записываться только точки, отвечающие по показателю минимальной точности (в метрах или футах — зависит от настроек системы). Точность — это близость измерений к истинному положению, и она не связана напрямую с точностью, которая представляет собой разброс повторных измерений."
+ Будут записываться только точки, отвечающие по показателю минимальной точности (в метрах или футах — зависит от настроек системы). Точность — это близость измерений к истинному положению, и она не связана напрямую с точностью, которая представляет собой разброс повторных измерений.Рекомендация: попробуйте сначала воспользоваться детектором движения через фильтр минимального смещения (B), что может дать лучшие результаты и вы потеряете меньше данных. Если треки остаются шумными на низких скоростях, попробуйте использовать ненулевые значения. Обратите внимание, что некоторые измерения могут вообще не указывать значения скорости (некоторые сетевые методы), и в этом случае ничего не будет записываться.Для визуализации крутизны рельефа используются цвета.Подробнее об уклонах можно прочитать в %1$s.
@@ -3882,7 +3882,7 @@
Остановка записи GPX при принудительном закрытии (через последние приложения). (Из панели уведомлений Android исчезнет значок фонового режима.)сохраненДобавьте хотя бы две точки.
- ПОВТОРИТЬ
+ Повторить• Обновлённая функция планирования маршрута позволяет применять к сегментам разные режимы навигации и настраивать привязку к дорогам
\n
\n • Новые настройки вида треков: выбор цвета и толщины линии, указатели направления, метки начала и конца маршрута
@@ -3906,9 +3906,9 @@
Избегать пешеходных дорожекИзбегать пешеходных дорожекПодписка взимается за выбранный период. Отмените её в AppGallery в любое время.
- Оплата будет снята с вашей учетной записи AppGallery при подтверждении покупки.
+ Оплата будет снята с вашей учётной записи AppGallery при подтверждении покупки.
\n
-\nПодписка продлевается автоматически, если она не будет отменена до даты продления. С вашего счета будет взиматься плата за период продления (месяц/три месяца/год) только в дату продления.
+\nПодписка продлевается автоматически, если она не будет отменена до даты продления. С вашего счёта будет взиматься плата за период продления (месяц/три месяца/год) только в дату продления.
\n
\nВы можете управлять своими подписками и отменять их, перейдя в настройки AppGallery.Данные OsmAnd Live
@@ -3920,4 +3920,8 @@
Войти через OAuthОчистить токен OAuth OpenStreetMapВыход выполнен
-
\ No newline at end of file
+ График
+ Файл уже импортирован
+ Дождитесь пересчёта маршрута.
+\nГрафик будет доступен после пересчёта.
+
diff --git a/OsmAnd/res/values-sc/phrases.xml b/OsmAnd/res/values-sc/phrases.xml
index 62f4c1ece8..e0a15ffcdb 100644
--- a/OsmAnd/res/values-sc/phrases.xml
+++ b/OsmAnd/res/values-sc/phrases.xml
@@ -3557,20 +3557,20 @@
RadioterapiaPerìguluCategoria de dificultade
- н/к
- н/к*
- 1А
- 1А*
- 1Б
- 1Б*
- 2А
- 2А*
- 2Б
- 2Б*
- 3А
- 3А*
- 3Б
- 3Б*
+ n/c
+ n/c*
+ 1A
+ 1A*
+ 1B
+ 1B*
+ 2A
+ 2A*
+ 2B
+ 2B*
+ 3A
+ 3A*
+ 3B
+ 3B*Frama de gas;Tortza de brusiaduraOgetu iscantzelladuRadioterapia
diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml
index ac6f4f667a..4a3d545b47 100644
--- a/OsmAnd/res/values-sc/strings.xml
+++ b/OsmAnd/res/values-sc/strings.xml
@@ -89,7 +89,7 @@
Preferèntzias de càrculu de s’àndalaImposta sa lestresa de sa boghe de sintetizatzione vocale (TTS).Lestresa de sa boghe
- Càrculu lestru de s’àndala fallidu (%s), rinviu a su càlculu lentu.
+ Càrculu lestru de s’àndala fallidu (%s), rinviu a su càrculu lentu.Istuda su carculu de s’àndala in duas fases pro s’impreu in màchina.Istuta su carculu cumplessu de s’àndalaPidagnu
@@ -1540,7 +1540,7 @@
Dislinda s’artària de su veìculu permìtida pro sos caminos.Non faghet rugrare sas fronteras intre sos istadosRecàrculu intelligente de s’àndala
- Pro biàgios longos, torra a carculare petzi su cantu initziale de s’àndala.
+ Torra a carculare petzi su cantu initziale de s’àndala. Podet èssere impreadu pro biàgios longos.DisabilitaduEssiColoratzione a segunda de sa casta (afiliatzione) de àndala
@@ -3824,8 +3824,8 @@
Subraiscrie sa rastaSarva comente una rasta noaFùrria s\'àndala
- Sa rasta intrea at a èssere torrada a calculare impreende su profilu ischertadu.
- Petzi su segmentu imbeniente at a èssere torradu a calculare impreende su profilu ischertadu.
+ Sa rasta intrea at a èssere torrada a carculare impreende su profilu ischertadu.
+ Petzi su segmentu imbeniente at a èssere torradu a carculare impreende su profilu ischertadu.Ischerta comente connètere sos puntos: cun una lìnia reta o calculende un\'àndala intre issos comente dislindadu inoghe in suta.Rasta intreaSegmentu imbeniente
@@ -3913,4 +3913,22 @@
\nPodes amministrare e annullare sos abbonamentos tuos intrende in sas impostatziones de AppGallery tuas.Èvita sos martzapiedisÈvita sos martzapiedis
+ Ite b\'at de nou
+ Isvilupu
+ Datos de OsmAnd Live
+ Datos de OsmAnd Live
+ Càrculu de s\'àndala a duas fases pro sa navigatzione in màchina.
+ Isvilupu de sos trasportos pùblicos nativos
+ Cola a su càrculu de s\'àndala de sos trasportos pùblicos Java (seguru)
+ Intra cun OAuth pro impreare sas funtzionalidades osmedit
+ Intra impreende OAuth
+ Iscantzella su getone OAuth de OpenStreetMap
+ Essida fata chene problemas
+ Su documentu est giai importadu in OsmAnd
+ Imprea un\'algoritmu de càrculu de s\'àndala A* a duas fases
+ Pro sa ghia de motoislitas cun caminos e rastas dedicados.
+ Datos %1$s a disponimentu in sos caminos ebbia. Depes carculare un\'àndala impreende \"Àndala intre puntos\" pro los otènnere.
+ Gràficu
+ Iseta su càrculu nou de s\'àndala.
+\nSu gràficu at a èssere a disponimentu a pustis de su càrculu.
\ No newline at end of file
diff --git a/OsmAnd/res/values-sk/phrases.xml b/OsmAnd/res/values-sk/phrases.xml
index db5f8d31a6..7dc2cc7a4c 100644
--- a/OsmAnd/res/values-sk/phrases.xml
+++ b/OsmAnd/res/values-sk/phrases.xml
@@ -3653,4 +3653,15 @@
NieÁnoKancelária taxislužby
+ Postbank
+ DecoTurf
+ Podológia
+ Zdravotná špecializácia: pôrodníctvo (cisársky rez): nie
+ Zdravotná špecializácia: sociálna pediatria: nie
+ Sociálna pediatria
+ Zdravotná špecializácia: pôrodníctvo (prenatálne): nie
+ Pôrodníctvo (prenatálne)
+ Zdravotná špecializácia: pôrodníctvo (postnatálne): nie
+ Rašelinisko
+ Slatina
\ No newline at end of file
diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml
index dc0af642be..6575698d3a 100644
--- a/OsmAnd/res/values-sk/strings.xml
+++ b/OsmAnd/res/values-sk/strings.xml
@@ -3919,11 +3919,18 @@
Údaje OsmAnd LiveKomplexný výpočet trasyDvojfázový výpočet trasy pre navigáciu auta.
- Natívny vývoj hromadnej dopravy
+ Natívna hromadná doprava (vo vývoji)Prepnúť na výpočet trasy hromadnej dopravy v Jave (bezpečné)Čo je novéVykonať prihlásenie cez OAuth pre použitie funkcií upravovania OSMPrihlásiť pomocou OAuthVymazať token OpenStreetMap OAuthOdhlásenie úspešné
+ Pre jazdu na snežnom vozidle po na to určených cestách.
+ Súbor je už importovaný v OsmAnd
+ Použiť dvojfázový algoritmus A* na výpočet trasy
+ Graf
+ Údaje %1$s sú dostupné len na cestách, pre ich získanie musíte vypočítať trasu pomocou “Trasa medzi bodmi”.
+ Počkajte na prepočet trasy.
+\nGraf bude dostupný po prepočte.
\ No newline at end of file
diff --git a/OsmAnd/res/values-tr/phrases.xml b/OsmAnd/res/values-tr/phrases.xml
index 16005d8a23..a4b87bee1b 100644
--- a/OsmAnd/res/values-tr/phrases.xml
+++ b/OsmAnd/res/values-tr/phrases.xml
@@ -269,7 +269,7 @@
Otoyol kavşağıBirleşimDinlenme alanı
- Su kaynağı
+ Su kuyusuYangın musluğuSu işleriTersane
@@ -366,7 +366,7 @@
DepolamaÇöp bertarafÇöp tenekesi
- Sanayi Bölgesi
+ Sanayi bölgesiTaş ocağıÜzüm bağıMeyve bahçesi
@@ -841,7 +841,7 @@
DüdenŞelaleIrmak
- Akış
+ DereNehrin akıntılı yeriDeğerli taşPelerin
@@ -1068,7 +1068,7 @@
Paket servisiKokteyllerMikro bira imalathanesi
- Servis
+ HizmetKabul edilen atıkŞömineMevsimlik
@@ -1184,7 +1184,7 @@
Tırmanma kayalığıEvetTarihi tank
- Kar aracı erişimi
+ Kar arabası erişimiOtobüs erişimiKaravan erişimiMotokaravan erişimi
@@ -1344,7 +1344,7 @@
Ziraat malzemeleriDöşeme malzemeleriNüfus
- Yeraltı
+ Yer altıÇok katlıStandlarDuvar döngüleri
@@ -2801,18 +2801,18 @@
Danışma (uyuşturucu): evetDanışma (bağımlılık): evetDanışma (bağımlılık): evet
- Sağlık çalışanının işi: psikolog
+ Sağlık çalışanının rolü: psikologİlk yardım çantasıDuvar
- Yeraltı
+ Yer altıSağlık merkezi türü: sahra hastanesiSağlık merkezi türü: laboratuvarSağlık hizmeti: aşılama: hayırSağlık hizmeti: aşılama: evetSağlık hizmeti: danışma: hayırSağlık hizmeti: danışma: evet
- Sağlık hizmeti: hasta bakıcılık: hayır
- Sağlık hizmeti: hasta bakıcılık: evet
+ Sağlık hizmeti: hemşirelik: hayır
+ Sağlık hizmeti: hemşirelik: evetGeleneksel TibetGeleneksel MoğolGeleneksel Çin
@@ -2915,4 +2915,219 @@
ŞarküteriTurtaÇay dükkanı
+ Sağlık çalışanının rolü: büyücü
+ Sağlık çalışanının rolü: teknisyen
+ Sağlık çalışanının rolü: doktor asistanı
+ Sağlık çalışanının rolü: terapist
+ Sağlık çalışanının rolü: podolog
+ Sağlık çalışanının rolü: doktor
+ Sağlık çalışanının rolü: sağlık görevlisi
+ Sağlık çalışanının rolü: hemşire
+ Sağlık çalışanının rolü: ebe
+ Sağlık çalışanının rolü: şifacı
+ Sağlık çalışanının rolü: asistan
+ Emme noktası
+ Sağlık tesisi türü: destek grubu evi
+ Sağlık tesisi türü: huzurevi
+ Sağlık merkezi türü: bölüm
+ Sağlık hizmeti: test: hayır
+ Sağlık hizmeti: test: evet
+ Sağlık hizmeti: destek: hayır
+ Sağlık hizmeti: destek: evet
+ Sağlık hizmeti: önleme: hayır
+ Sağlık hizmeti: önleme: evet
+ Sağlık hizmeti: çocuk bakımı: hayır
+ Sağlık hizmeti: çocuk bakımı: evet
+ Sağlık hizmeti: muayene: hayır
+ Sağlık hizmeti: muayene: evet
+ Sağlık merkezi türü: ilk yardım
+ Sağlık merkezi türü: dispanser
+ Sağlık merkezi türü: terapi
+ Sağlık merkezi türü: danışma merkezi
+ Tıbbi ofis
+ Sert serbest uçuş: hayır
+ Sert
+ Yelken kanatla uçuş: hayır
+ Yelken kanatla uçuş
+ Yamaç paraşütü: hayır
+ Yamaç paraşütü
+ Resmi: hayır
+ Resmi: evet
+ Eğitim alanı
+ Çekme alanı
+ Zirve iniş alanı
+ İniş alanı
+ Kalkış alanı
+ Düğme ile etkinleştirilir: hayır
+ Düğme ile etkinleştirilir: evet
+ Serbest uçuş (spor)
+ Patlama: aygıt
+ Patlama: savaş başlığı
+ Patlama: krater çapı
+ Patlama salvosu: bir salvo testinin ikinci veya daha sonraki patlaması
+ Patlama salvosu: bir salvo testinin ilk patlaması
+ Vücut dalgası büyüklüğü
+ Patlama merkezinin yüksekliği
+ Patlama boyu
+ Patlama deliği
+ Patlama gücü
+ Patlama amacı: sanayi uygulaması, toprak kaydırma
+ Patlama amacı: sanayi uygulaması
+ Patlama amacı: sanayi uygulaması, petrol uyarımı
+ Patlama amacı: sanayi uygulaması, sismik sondaj
+ Patlama amacı: sanayi uygulaması, kazı çalışması
+ Patlama amacı: temel bilim
+ Patlama amacı: barışçıl uygulamalar için araştırma
+ Patlama amacı: güvenlik deneyi
+ Patlama amacı: silah etkileri
+ Patlama amacı: nükleer silahlarla ilgili
+ Patlama serisi
+ Kod adı (ingilizce)
+ Patlama türü: su altı
+ Patlama türü: uzay (80 km\'nin üzerindeki yükseklik)
+ Patlama türü: atmosferik, roket veya füze
+ Patlama türü: krater patlaması (sığ yüzey altı)
+ Patlama türü: atmosferik, su yüzeyi, mavna
+ Patlama türü: atmosferik, yüzey
+ Patlama türü: atmosferik, balon
+ Patlama türü: atmosferik, yüzey, kule
+ Patlama türü: atmosferik, havadan atma
+ Patlama türü: atmosferik
+ Patlama türü: yeraltı, kuyu
+ Patlama: alan
+ Koruma türü
+ Bandy
+ Sokak dolabı
+ Ateş çukuru
+ Ana
+ Musluk tarzı: wsh
+ Yer altı
+ Sokak
+ Park yeri
+ Şerit
+ Çimen
+ Kaldırım
+ Musluk akış kapasitesi
+ Musluk sayısı
+ Musluk basıncı
+ Musluk çapı
+ Ebe ofisi
+ Hemşirelik hizmeti
+ Psikolog ofisi
+ Şifacı ofisi
+ Podolog ofisi
+ Terapist ofisi
+ Doktor ofisi
+ Yatarak tedavi hizmetleri: yalnızca
+ Yatarak tedavi hizmetleri: hayır
+ Yatarak tedavi hizmetleri: evet
+ Danışma (şiddet): hayır
+ Danışma (şiddet): evet
+ Danışma (kurban): hayır
+ Danışma (kurban): evet
+ Danışma (cinsel istismar): hayır
+ Danışma (cinsel istismar): evet
+ Danışma (cinsellik): hayır
+ Danışma (cinsellik): evet
+ Danışma (rehabilitasyon): hayır
+ Danışma (rehabilitasyon): evet
+ Danışma (beslenme): hayır
+ Danışma (beslenme): evet
+ Danışma (evlilik): hayır
+ Danışma (evlilik): evet
+ Danışma (göçmen): hayır
+ Danışma (göçmen): evet
+ Danışma (eğitim): hayır
+ Danışma (eğitim): evet
+ Danışma (kriz): hayır
+ Danışma (kriz): evet
+ Danışma (çift): hayır
+ Danışma (çift): evet
+ Danışma (çocuk rehberliği): hayır
+ Danışma (çocuk rehberliği): evet
+ Danışma (doğum öncesi): evet
+ Danışma (doğum öncesi): hayır
+ Uzay üssü
+ Doğaya salma: hayır
+ Doğaya salma: evet
+ Sahiplenme: hayır
+ Sahiplenme: evet
+ Sahibi
+ Çocuk kampı
+ Fotoğraf stüdyosu
+ Beslenme takviyeleri
+ Hayvan besleme yeri
+ Destek: kule
+ Destek: çatı
+ Destek: askıda
+ Destek: tavan
+ Destek: reklam panosu
+ Destek: zemin
+ Destek: kaide
+ Destek: ağaç
+ Destek: duvar
+ Destek: direk
+ Tarih ekranı: hayır
+ Tarih ekranı
+ Pompa istasyonu
+ Çıkış: biyogaz
+ Biyogazın çıkış gücü
+ Çıkış: vakum
+ Çıkış: basınçlı hava
+ Basınçlı havanın çıkış gücü
+ Çıkış: soğuk su
+ Çıkış: sıcak hava
+ Çıkış: buhar
+ Çıkış: sıcak su
+ Sıcak suyun çıkış gücü
+ Çıkış (elektrik): hayır
+ Çıkış: elektrik
+ Çıkış gücü
+ Gerilim
+ Sera bahçeciliği
+ Yer çekimi
+ Meteorolojik
+ Kamu kullanımı için ölçekler
+ Konuk yönergeleri: hayır
+ Konuk yönergeleri: evet
+ Uçuşa yasak zaman (serbest uçuş)
+ Serbest uçuş alanı yönlendirmesi: KB
+ Serbest uçuş alanı yönlendirmesi: B
+ Serbest uçuş alanı yönlendirmesi: GB
+ Serbest uçuş alanı yönlendirmesi: G
+ Serbest uçuş alanı yönlendirmesi: GD
+ Serbest uçuş alanı yönlendirmesi: D
+ Serbest uçuş alanı yönlendirmesi: KD
+ Serbest uçuş alanı yönlendirmesi: K
+ Birden çok aile
+ Aile
+ Topluluk
+ Şişelenmiş su
+ Su deposu
+ Su tankeri
+ Sondaj
+ Pompa
+ Akan su
+ Boru hattı
+ Su kuyusu
+ Su arıtma tabletleri
+ Ters osmoz
+ Klor
+ Görünürlük: alan
+ Tartan
+ Sosyal hizmetler
+ Sosyal güvenlik
+ Elektronik tamir: alet
+ Güneş saati
+ Dijital ekran
+ Analog ekran
+ Ekran: hayır
+ Ekran: evet
+ Evet
+ Su deposu
+ Dere
+ Kuru varil
+ Sütun
+ Gölet
+ Gölet
\ No newline at end of file
diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml
index 38dec6907b..54debf38a3 100644
--- a/OsmAnd/res/values-tr/strings.xml
+++ b/OsmAnd/res/values-tr/strings.xml
@@ -8,7 +8,7 @@
Konum günlüğü hizmetlerini kullanmak için \"Yolculuk kaydı\" eklentisini etkinleştirin (GPX günlüğü, çevrim içi izleme)Uzak hedefler için tahmini rotayı hesaplaLütfen GPS\'yi ayarlardan açık konuma getirin
- Log servisi
+ Günlük kayıt hizmetleriRota yokVarış Noktasını kaldırVarış noktası %1$s
@@ -78,7 +78,7 @@
Uygulamayı güvenli modda çalıştırın (yerel kod yerine daha yavaş Android kullanarak).Güvenli kipUygulama güvenli modda çalışıyor (\'Ayarlar\'dan kapatın).
- OsmAnd arka plan hizmeti hala çalışıyor. Onu da durdur\?
+ OsmAnd arka plan hizmeti hala çalışıyor. O da durdurulsun mu\?Ses/Video verisiNavigasyonu durdurmak istediğinizden emin misiniz\?Hedefi (ve ara hedefleri) temizlemek istediğinizden emin misiniz\?
@@ -633,7 +633,7 @@
Yerel sürüm%1$d/%2$d öge devre dışı bırakıldı.%1$d/%2$d öge silindi.
- %1$d/%2$d öge aktifleştirildi.
+ %1$d/%2$d öge etkinleştirildi.Harita dosyalarını yönetin.AktifleştirPasifleştir
@@ -641,7 +641,7 @@
Adres VerisiToplu taşıma verileriHarita Verisi
- Pasifleştir
+ Devre dışıSesli uyarılar (TTS)Sesli uyarılar (kaydedilmiş)POI Verisi
@@ -837,7 +837,7 @@
Konum sağlayıcıEkran kapalıyken konumunuzu izler.Arka planda Osmand başlat
- Arka plan navigasyon hizmeti açık olması bir konum sağlayıcı gerektirir.
+ Arka plan navigasyon hizmeti, bir konum sağlayıcının açık olmasını gerektirir.Süzgeci gizleSüzgeci gösterSüzgeç
@@ -881,7 +881,7 @@
Çevrim içi arama: Ev numarası, sokak, şehirÇevrim dışı aramaToplam uzaklık %1$s, seyahat süresi %2$d s %3$d dak.
- Çevrim içi veya çevrim dışı navigasyon servisi.
+ Çevrim içi veya çevrim dışı navigasyon hizmeti.Bellek kartındaki depolama klasörüne erişilemiyor!{0} - {1} indir ?{0} için çevrim dışı veri zaten var ({1}). ({2}) güncellensin mi\?
@@ -1065,7 +1065,7 @@
Tekrar deneyinEski uyumsuz Wikipedia verileriniz var. Arşivle\?Ekstra Wikipedia verilerini indir (%1$s MB)\?
- Konum servisi kapalı. Aç\?
+ Konum hizmeti kapalı. Açılsın mı\?Ayrıntıları gösterDevre dışıEv kapı numaraları
@@ -1457,18 +1457,18 @@
OSM notları (çevrim içi)Haritayı hareket ettirmek için bir izleme topu aygıtı kullanın.İzleme topu kullan
- Arka plan servisi tarafından kullanılan uyanma aralığı:
- Arka plan servisi tarafından kullanılan konum yöntemi:
- Baş
+ Arka plan hizmeti tarafından kullanılan uyanma aralığı:
+ Arka plan hizmeti tarafından kullanılan konum yöntemi:
+ Düz gidinEkran yönlendirmeHiçbir adres belirlenmediSesli uyarılarDurakta ulaşım aracı araHarita yönlendirme\'\'{0}\'\' indeks sürümü desteklenmemektedir
- OsmAnd çevrim dışı navigasyon deneysel bir özelliktir ve yaklaşık 20 km\'den daha uzun mesafelerde çalışmaz.
-\n
-\nNavigasyon geçici olarak çevrim içi CloudMade servisine geçti.
+ OsmAnd çevrim dışı navigasyon deneysel bir özelliktir ve yaklaşık 20 km\'den daha uzun mesafelerde çalışmaz.
+\n
+\nNavigasyon geçici olarak çevrim içi CloudMade hizmetine geçti.OsmAnd Yükle - {1} {2} üzerinden {0} MB \?Yakınlaştırma {0} indirmek {1} fayans ({2} MB)Önceden yükleme için en fazla yakınlaştırma
@@ -1595,7 +1595,7 @@
BaskçaBelarusçaBoşnakça
- Noktalar arasındaki rotayı hesaplamak
+ Noktalar arasındaki güzergahı hesaplaKonumu sürekli ortada tutSesÇeşitli
@@ -1791,7 +1791,7 @@
Svahili diliİbraniceİleri
- GPX kaydı açıksa, izleme verilerini belirtilen bir web servisine gönder.
+ GPX kaydı açıksa, izleme verilerini belirtilen bir web hizmetine gönder.Online izleme (GPX gerekli)Online izleme başlatOnline izleme durdurun
@@ -2094,7 +2094,7 @@
SilindiDeğiştirildiEklendi
- İşaretleyici %s aktifleştirildi.
+ %s işaretleyicisi etkinleştirildi.İçerik menüsünü açmadan, harita üzerinde bir belirtecin üzerine bas ve aktif belirteçlerin üzerine sürükle.\'Tek basış\' aktifNot alın!
@@ -2282,7 +2282,7 @@
Geçilmiş-olanı gösterGeçilmiş-olanı gizleHaritada harita işaretleyicilerine olan uzaklık ve yönün nasıl belirtileceğini seçin:
- Harita oryantasyon eşiği
+ Harita yönlendirme eşiğiHarita yönünün \'Hareket yönü\'nden \'Pusula yönü\'ne geçiş hızını aşağıdan seçin.Rota noktaları olarak kaydetÖncesinde nokta ekle
@@ -2362,7 +2362,7 @@
GezinİçeriklerSonuç
- Seyehat
+ Seyahat rehberleriToplamTüm başlangıç noktalarını temizleGrup silindi
@@ -3578,7 +3578,7 @@
Haritadaki Wikipedia makalelerinin dillerini seçin. Makaleyi okurken kullanılabilir herhangi bir dile geçiş yapın.Bazı Wikipedia makaleleri sizin dilinizde mevcut olmayabilir.Kantonca
- Güney Min
+ Güney MinceYorubacaVaraycaÖzbekçe
@@ -3591,7 +3591,7 @@
NepalceNapoliceBirmanca
- Minangkabau dili
+ MinangkabaucaMalgaşçaKırgızcaKazakça
@@ -3881,4 +3881,11 @@
OAuth ile oturum açOpenStreetMap OAuth belirtecini temizleOturum kapatma başarılı
+ Dosya zaten OsmAnd\'da içe aktarıldı
+ 2 aşamalı A* yönlendirme algoritması kullan
+ Ayrılmış yollar ve parkurlarla kar arabası sürüşü için.
+ Grafik
+ %1$s verileri yalnızca yollarda kullanılabilir, elde etmek için “Noktalar arasındaki güzergah” kullanarak bir rota hesaplamanız gerekir.
+ Güzergahın yeniden hesaplanmasını bekleyin.
+\nGrafik yeniden hesaplandıktan sonra kullanılabilir olacak.
\ No newline at end of file
diff --git a/OsmAnd/res/values-tzm/strings.xml b/OsmAnd/res/values-tzm/strings.xml
new file mode 100644
index 0000000000..a6b3daec93
--- /dev/null
+++ b/OsmAnd/res/values-tzm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml
index 8ba9a9906f..f93a7c0156 100644
--- a/OsmAnd/res/values-uk/strings.xml
+++ b/OsmAnd/res/values-uk/strings.xml
@@ -1147,7 +1147,7 @@
%1$s
\nТрек %2$sЗ’єднатись
- Розрахувати маршрут між точками
+ Обчислити маршрут між точкамиВідображати позицію завжди в центріГолосРізне
@@ -2293,17 +2293,17 @@
OsmAnd (OSM Automated Navigation Directions) — застосунок для мап і навігації з доступом до безкоштовних глобальних високоякісних даних OpenStreetMap (OSM).
\n
\nНасолоджуйтесь голосовою та візуальною навігацією, переглядом цікавих точок (англ. POI), створенням та керуванням GPX-треками, використовуючи відображення горизонталей та даних про висоту (за допомогою зовнішнього втулка), вибором між режимами автомобіліста, велосипедиста й пішохода, редагуванням OSM та ще багато чим іншим.
- GPS навігація
-\n • Вибір між автономним режимом (без зборів за роумінг за кордоном) або через Інтернет (швидше)
-\n • Покрокові голосові підказки доставить Вас до місця призначення (записані чи синтезовані голоси)
-\n • Повторна маршрутизація кожен раз після відхилення від маршруту
-\n • Смуги руху, назви вулиць і приблизний час прибуття допоможуть Вам на шляху
-\n • Для того, щоб зробити Вашу подорож безпечнішою, режим дня/ночі автоматично перемикається
-\n • Відображення обмежень швидкості та попередження про її перевищення
-\n • Мапа масштабується відповідно до Вашої швидкості
-\n • Шукати місця за адресою, типом (наприклад, паркування, ресторан, готель, заправна станція, музей) чи географічними координатами
-\n • Підтримка проміжних точок на Вашому маршруті
-\n • Запис свого власного GPX-треку чи вивантаження готового і слідування за ним
+ GPS навігація
+\n • Вибір між автономним режимом (без зборів за роумінг за кордоном) або через Інтернет (швидше)
+\n • Покрокові голосові підказки доставить Вас до місця призначення (записані чи синтезовані голоси)
+\n • Повторна маршрутизація кожен раз після відхилення від маршруту
+\n • Смуги руху, назви вулиць і приблизний час прибуття допоможуть Вам на шляху
+\n • Для того, щоб зробити Вашу подорож безпечнішою, режим дня/ночі автоматично перемикається
+\n • Показ обмежень швидкості та попередження про її перевищення
+\n • Мапа масштабується відповідно до Вашої швидкості
+\n • Шукати місця за адресою, типом (наприклад, паркування, ресторан, готель, заправна станція, музей) чи географічними координатами
+\n • Підтримка проміжних точок на Вашому маршруті
+\n • Запис свого власного GPX-треку чи вивантаження готового і слідування за ним
\nМапа
\n• Відображає POI (цікаві точки) навколо вас
@@ -3922,4 +3922,11 @@
Уникати пішохідних шляхівУникати пішохідних шляхівРозробка
+ Файл уже імпортовано до OsmAnd
+ Використання 2-фазного A* алгоритму маршрутизації
+ Для їзди на снігоходах із відведеними дорогами та трасами.
+ Графік
+ %1$s дані доступні лише для доріг, вам потрібно обчислити маршрут за допомогою «Маршрут між точками», щоб отримати його.
+ Дочекайтеся переобчислення маршруту.
+\nГрафік буде доступний після переобчислення.
\ No newline at end of file
diff --git a/OsmAnd/res/values-zh-rTW/phrases.xml b/OsmAnd/res/values-zh-rTW/phrases.xml
index e36aa4414d..add05fe4a7 100644
--- a/OsmAnd/res/values-zh-rTW/phrases.xml
+++ b/OsmAnd/res/values-zh-rTW/phrases.xml
@@ -3561,20 +3561,20 @@
危險難度分類放射治療
- н/к
- н/к*
- 1А
- 1А*
- 1Б
- 1Б*
- 2А
- 2А*
- 2Б
- 2Б*
- 3А
- 3А*
- 3Б
- 3Б*
+ n/c
+ n/c*
+ 1A
+ 1A*
+ 1B
+ 1B*
+ 2A
+ 2A*
+ 2B
+ 2B*
+ 3A
+ 3A*
+ 3B
+ 3B*燃燒塔已刪除的物件攀岩
diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml
index a5eb5c24fb..d84b6fcd82 100644
--- a/OsmAnd/res/values-zh-rTW/strings.xml
+++ b/OsmAnd/res/values-zh-rTW/strings.xml
@@ -3921,4 +3921,11 @@
透過 OAuth 登入清除 OpenStreetMap OAuth 權杖成功登出
+ 適用於有專用道路與軌道的雪地摩托車駕駛。
+ 檔案已在 OsmAnd 匯入
+ 使用 2 相的 A* 路線演算法
+ 圖表
+ %1$s 資料僅供道路使用,您需要使用「兩點間的路線」來計算路線。
+ 等待路線重新計算。
+\n重新計算後即可使用圖表。
\ No newline at end of file
diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml
index b58d25a781..04b193b923 100644
--- a/OsmAnd/res/values/phrases.xml
+++ b/OsmAnd/res/values/phrases.xml
@@ -3935,20 +3935,20 @@
TramFerry
- н/к
- н/к*
- 1А
- 1А*
- 1Б
- 1Б*
- 2А
- 2А*
- 2Б
- 2Б*
- 3А
- 3А*
- 3Б
- 3Б*
+ n/c
+ n/c*
+ 1A
+ 1A*
+ 1B
+ 1B*
+ 2A
+ 2A*
+ 2B
+ 2B*
+ 3A
+ 3A*
+ 3B
+ 3B*Gas flare;Flare stackDeleted object
@@ -4206,7 +4206,7 @@
YesNo
- Signal to find the pole
+ Internet access: customersOnly when walking is allowedContrastedPrimitive
@@ -4259,5 +4259,10 @@
LNG
+ GPX point
+
+ Rooftop
+ Sheds
+ Layby
diff --git a/OsmAnd/res/values/sizes.xml b/OsmAnd/res/values/sizes.xml
index f4eb13a389..69f711b6fb 100644
--- a/OsmAnd/res/values/sizes.xml
+++ b/OsmAnd/res/values/sizes.xml
@@ -324,6 +324,7 @@
8dp18dp71dp
+ 120dp40dp48dp18dp
diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index e2e3d0a5ea..3132eb5971 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -13,6 +13,10 @@
-->
Gap%1$s — %2$s
+ Wait for the route recalculation.\nGraph will be available after recalculation.
+ %1$s data available only on the roads, you need to calculate a route using “Route between points” to get it.
+ Graph
+ Use 2-phase A* routing algorithmFile is already imported in OsmAndLogout successfulClear OpenStreetMap OAuth token
@@ -22,7 +26,6 @@
Native Public Transport developmentRecalculates only the initial part of the route. Can be used for long trips.Two-phase routing for car navigation.
- Complex routingOsmAnd Live dataOsmAnd Live dataDevelopment
@@ -1018,6 +1021,7 @@
BookmarkHide full descriptionShow full description
+ For snowmobile driving with dedicated roads and tracks.For off-road driving based on \'Topo\' style and for use with green satellite images as an underlay. Reduced main road thickness, increased thickness of tracks, paths, bicycle and other routes.For nautical navigation. Features buoys, lighthouses, riverways, sea lanes and marks, harbors, seamark services, and depth contours.For skiing. Features pistes, ski-lifts, cross country tracks, etc. Dims secondary map objects.
diff --git a/OsmAnd/src/net/osmand/access/AccessibilityPlugin.java b/OsmAnd/src/net/osmand/access/AccessibilityPlugin.java
index b9ea4a62cf..eb806a5a33 100644
--- a/OsmAnd/src/net/osmand/access/AccessibilityPlugin.java
+++ b/OsmAnd/src/net/osmand/access/AccessibilityPlugin.java
@@ -8,9 +8,9 @@ import androidx.annotation.NonNull;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
-import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
-import net.osmand.plus.settings.fragments.BaseSettingsFragment;
+import net.osmand.plus.settings.backend.OsmandSettings;
+import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
import java.io.IOException;
import java.util.HashMap;
@@ -66,13 +66,8 @@ public class AccessibilityPlugin extends OsmandPlugin {
}
@Override
- public Class extends Activity> getSettingsActivity() {
- return SettingsAccessibilityActivity.class;
- }
-
- @Override
- public Class extends BaseSettingsFragment> getSettingsFragment() {
- return AccessibilitySettingsFragment.class;
+ public SettingsScreenType getSettingsScreenType() {
+ return SettingsScreenType.ACCESSIBILITY_SETTINGS;
}
@Override
diff --git a/OsmAnd/src/net/osmand/access/AccessibilitySettingsFragment.java b/OsmAnd/src/net/osmand/access/AccessibilitySettingsFragment.java
index 781a10bf41..609c43fcff 100644
--- a/OsmAnd/src/net/osmand/access/AccessibilitySettingsFragment.java
+++ b/OsmAnd/src/net/osmand/access/AccessibilitySettingsFragment.java
@@ -4,6 +4,8 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
+import android.view.LayoutInflater;
+import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
import android.widget.ImageView;
@@ -13,21 +15,24 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.PreferenceViewHolder;
-import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.access.AccessibilityMode;
import net.osmand.plus.access.RelativeDirectionStyle;
+import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
import net.osmand.plus.profiles.SelectCopyAppModeBottomSheet;
import net.osmand.plus.profiles.SelectCopyAppModeBottomSheet.CopyAppModePrefsListener;
-import net.osmand.plus.settings.fragments.BaseSettingsFragment;
-import net.osmand.plus.settings.fragments.OnPreferenceChanged;
+import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.bottomsheets.ResetProfilePrefsBottomSheet;
import net.osmand.plus.settings.bottomsheets.ResetProfilePrefsBottomSheet.ResetAppModePrefsListener;
+import net.osmand.plus.settings.fragments.BaseSettingsFragment;
+import net.osmand.plus.settings.fragments.OnPreferenceChanged;
import net.osmand.plus.settings.preferences.ListPreferenceEx;
import net.osmand.plus.settings.preferences.SwitchPreferenceEx;
+import static net.osmand.plus.activities.PluginInfoFragment.PLUGIN_INFO;
+
public class AccessibilitySettingsFragment extends BaseSettingsFragment implements OnPreferenceChanged, CopyAppModePrefsListener, ResetAppModePrefsListener {
private static final String ACCESSIBILITY_OPTIONS = "accessibility_options";
@@ -36,6 +41,8 @@ public class AccessibilitySettingsFragment extends BaseSettingsFragment implemen
private AccessibilityStateChangeListener accessibilityListener;
+ boolean showSwitchProfile = false;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -47,6 +54,28 @@ public class AccessibilitySettingsFragment extends BaseSettingsFragment implemen
}
}
};
+
+ Bundle args = getArguments();
+ if (args != null) {
+ showSwitchProfile = args.getBoolean(PLUGIN_INFO, false);
+ }
+ }
+
+ @Override
+ protected void createToolbar(LayoutInflater inflater, View view) {
+ super.createToolbar(inflater, view);
+
+ View switchProfile = view.findViewById(R.id.profile_button);
+ if (switchProfile != null) {
+ AndroidUiHelper.updateVisibility(switchProfile, showSwitchProfile);
+ }
+ }
+
+ @Override
+ public Bundle buildArguments() {
+ Bundle args = super.buildArguments();
+ args.putBoolean(PLUGIN_INFO, showSwitchProfile);
+ return args;
}
@Override
diff --git a/OsmAnd/src/net/osmand/access/SettingsAccessibilityActivity.java b/OsmAnd/src/net/osmand/access/SettingsAccessibilityActivity.java
deleted file mode 100644
index 719ed05863..0000000000
--- a/OsmAnd/src/net/osmand/access/SettingsAccessibilityActivity.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package net.osmand.access;
-
-
-import android.os.Bundle;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.PreferenceCategory;
-import android.preference.PreferenceGroup;
-import android.preference.PreferenceScreen;
-
-import net.osmand.plus.OsmandApplication;
-import net.osmand.plus.R;
-import net.osmand.plus.access.AccessibilityMode;
-import net.osmand.plus.access.RelativeDirectionStyle;
-import net.osmand.plus.activities.SettingsBaseActivity;
-
-public class SettingsAccessibilityActivity extends SettingsBaseActivity {
-
- private ListPreference accessibilityModePreference;
- private ListPreference directionStylePreference;
- private ListPreference autoannouncePeriodPreference;
-
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- ((OsmandApplication) getApplication()).applyTheme(this);
- super.onCreate(savedInstanceState);
- getToolbar().setTitle(R.string.shared_string_accessibility);
- PreferenceScreen grp = getPreferenceScreen();
-
- String[] entries = new String[AccessibilityMode.values().length];
- for (int i = 0; i < entries.length; i++) {
- entries[i] = AccessibilityMode.values()[i].toHumanString(getMyApplication());
- }
- accessibilityModePreference = createListPreference(settings.ACCESSIBILITY_MODE, entries, AccessibilityMode.values(),
- R.string.accessibility_mode, R.string.accessibility_mode_descr);
- accessibilityModePreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
- private final OnPreferenceChangeListener committer = accessibilityModePreference.getOnPreferenceChangeListener();
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- if (committer != null)
- committer.onPreferenceChange(preference, newValue);
- updateAllSettings();
- return true;
- }
- });
- addSpeechRateSetting(grp);
-
- grp.addPreference(accessibilityModePreference);
- PreferenceCategory cat = new PreferenceCategory(this);
- cat.setKey("accessibility_options");
- cat.setTitle(R.string.accessibility_options);
- cat.setEnabled(getMyApplication().accessibilityEnabled());
- grp.addPreference(cat);
-
- entries = new String[RelativeDirectionStyle.values().length];
- for (int i = 0; i < entries.length; i++) {
- entries[i] = RelativeDirectionStyle.values()[i].toHumanString(getMyApplication());
- }
- directionStylePreference = createListPreference(settings.DIRECTION_STYLE, entries, RelativeDirectionStyle.values(),
- R.string.settings_direction_style, R.string.settings_direction_style_descr);
- directionStylePreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
- private final OnPreferenceChangeListener committer = directionStylePreference.getOnPreferenceChangeListener();
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- if (committer != null)
- committer.onPreferenceChange(preference, newValue);
- updateAllSettings();
- return true;
- }
- });
- cat.addPreference(directionStylePreference);
-
- cat.addPreference(createCheckBoxPreference(settings.ACCESSIBILITY_SMART_AUTOANNOUNCE, R.string.access_smart_autoannounce,
- R.string.access_smart_autoannounce_descr));
-
- final int[] seconds = new int[] {5, 10, 15, 20, 30, 45, 60, 90};
- final int[] minutes = new int[] {2, 3, 5};
- autoannouncePeriodPreference = createTimeListPreference(settings.ACCESSIBILITY_AUTOANNOUNCE_PERIOD, seconds, minutes, 1000,
- R.string.access_autoannounce_period, R.string.access_autoannounce_period_descr);
- autoannouncePeriodPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
- private final OnPreferenceChangeListener committer = autoannouncePeriodPreference.getOnPreferenceChangeListener();
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- if (committer != null)
- committer.onPreferenceChange(preference, newValue);
- updateAllSettings();
- return true;
- }
- });
- cat.addPreference(autoannouncePeriodPreference);
- cat.addPreference(createCheckBoxPreference(settings.DIRECTION_AUDIO_FEEDBACK, R.string.access_direction_audio_feedback,
- R.string.access_direction_audio_feedback_descr));
- cat.addPreference(createCheckBoxPreference(settings.DIRECTION_HAPTIC_FEEDBACK, R.string.access_direction_haptic_feedback,
- R.string.access_direction_haptic_feedback_descr));
-
- }
-
-
- protected void addSpeechRateSetting(PreferenceGroup grp) {
- Float[] sprValues = new Float[] {0.5f, 0.75f, 1f, 1.25f, 1.5f, 2f} ;
- String[] sprNames = new String[sprValues.length];
- for(int i = 0; i < sprNames.length; i++) {
- sprNames[i] = (int)(sprValues[i] * 100) + " %";
- }
- grp.addPreference(createListPreference(settings.SPEECH_RATE, sprNames, sprValues, R.string.speech_rate, R.string.speech_rate_descr));
- }
-
-
-
- public void updateAllSettings() {
- super.updateAllSettings();
- PreferenceCategory accessibilityOptions = ((PreferenceCategory)(getPreferenceScreen().findPreference("accessibility_options")));
- if (accessibilityOptions != null)
- accessibilityOptions.setEnabled(getMyApplication().accessibilityEnabled());
- if(accessibilityModePreference != null) {
- accessibilityModePreference.setSummary(getString(R.string.accessibility_mode_descr) + " [" + settings.ACCESSIBILITY_MODE.get().toHumanString(getMyApplication()) + "]");
- }
- if(directionStylePreference != null) {
- directionStylePreference.setSummary(getString(R.string.settings_direction_style_descr) + " [" + settings.DIRECTION_STYLE.get().toHumanString(getMyApplication()) + "]");
- }
- if(autoannouncePeriodPreference != null) {
- autoannouncePeriodPreference.setSummary(getString(R.string.access_autoannounce_period_descr) + " [" + autoannouncePeriodPreference.getEntry() + "]");
- }
- }
-
-}
diff --git a/OsmAnd/src/net/osmand/aidl/ConnectedApp.java b/OsmAnd/src/net/osmand/aidl/ConnectedApp.java
index be25ab931d..bbfa4f89b8 100644
--- a/OsmAnd/src/net/osmand/aidl/ConnectedApp.java
+++ b/OsmAnd/src/net/osmand/aidl/ConnectedApp.java
@@ -11,9 +11,6 @@ import android.widget.CompoundButton;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-
import net.osmand.AndroidUtils;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuItem;
@@ -21,15 +18,12 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
-import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.layers.AidlMapLayer;
import net.osmand.plus.views.layers.MapInfoLayer;
import net.osmand.plus.views.mapwidgets.widgets.TextInfoWidget;
import net.osmand.util.Algorithms;
-import java.lang.reflect.Type;
-import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -39,7 +33,6 @@ public class ConnectedApp implements Comparable {
public static final String AIDL_LAYERS_PREFIX = "aidl_layers_";
public static final String AIDL_WIDGETS_PREFIX = "aidl_widgets_";
- public static final String AIDL_MARGINS_PREFIX = "aidl_margins_";
static final String AIDL_OBJECT_ID = "aidl_object_id";
static final String AIDL_PACKAGE_NAME = "aidl_package_name";
@@ -62,7 +55,6 @@ public class ConnectedApp implements Comparable {
private Map mapLayers = new ConcurrentHashMap<>();
private CommonPreference layersPref;
- private CommonPreference marginsPref;
private String pack;
private String name;
@@ -76,7 +68,6 @@ public class ConnectedApp implements Comparable {
this.pack = pack;
this.enabled = enabled;
layersPref = app.getSettings().registerBooleanPreference(AIDL_LAYERS_PREFIX + pack, true).cache();
- marginsPref = app.getSettings().registerStringPreference(AIDL_MARGINS_PREFIX + pack, null).cache();
}
public boolean isEnabled() {
@@ -134,45 +125,6 @@ public class ConnectedApp implements Comparable {
}
}
- void updateMapMargins(@NonNull MapActivity mapActivity) {
- String marginsJson = marginsPref.get();
- if (marginsJson != null) {
- Type type = new TypeToken>() {
- }.getType();
- Map margins = new Gson().fromJson(marginsJson, type);
- if (margins != null) {
- Integer leftMargin = margins.get("left");
- Integer topMargin = margins.get("top");
- Integer rightMargin = margins.get("right");
- Integer bottomMargin = margins.get("bottom");
-
- int left = leftMargin != null ? leftMargin : 0;
- int top = topMargin != null ? topMargin : 0;
- int right = rightMargin != null ? rightMargin : 0;
- int bottom = bottomMargin != null ? bottomMargin : 0;
-
- mapActivity.setMargins(left, top, right, bottom);
- return;
- }
- }
- mapActivity.setMargins(0, 0, 0, 0);
- }
-
- public void setMargins(@NonNull MapActivity mapActivity, String appModeKey, int leftMargin, int topMargin, int rightMargin, int bottomMargin) {
- ApplicationMode mode = ApplicationMode.valueOfStringKey(appModeKey, null);
- if (mode != null) {
- Map margins = new HashMap<>();
- margins.put("left", leftMargin);
- margins.put("top", topMargin);
- margins.put("right", rightMargin);
- margins.put("bottom", bottomMargin);
-
- String marginsJson = new Gson().toJson(margins);
- marginsPref.setModeValue(mode, marginsJson);
- updateMapMargins(mapActivity);
- }
- }
-
void registerLayerContextMenu(final ContextMenuAdapter menuAdapter, final MapActivity mapActivity) {
ContextMenuAdapter.ItemClickListener listener = new ContextMenuAdapter.OnRowItemClick() {
diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java
index 6329d5db2e..21ed74a437 100644
--- a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java
+++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java
@@ -81,8 +81,10 @@ import net.osmand.plus.routing.VoiceRouter;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmAndAppCustomization;
import net.osmand.plus.settings.backend.OsmandSettings;
-import net.osmand.plus.settings.backend.SettingsHelper;
+import net.osmand.plus.settings.backend.backup.ProfileSettingsItem;
+import net.osmand.plus.settings.backend.backup.SettingsHelper;
import net.osmand.plus.settings.backend.ExportSettingsType;
+import net.osmand.plus.settings.backend.backup.SettingsItem;
import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.layers.AidlMapLayer;
@@ -138,7 +140,7 @@ import static net.osmand.plus.helpers.ExternalApiHelper.PARAM_NT_DIRECTION_NAME;
import static net.osmand.plus.helpers.ExternalApiHelper.PARAM_NT_DIRECTION_TURN;
import static net.osmand.plus.helpers.ExternalApiHelper.PARAM_NT_DISTANCE;
import static net.osmand.plus.helpers.ExternalApiHelper.PARAM_NT_IMMINENT;
-import static net.osmand.plus.settings.backend.SettingsHelper.REPLACE_KEY;
+import static net.osmand.plus.settings.backend.backup.SettingsHelper.REPLACE_KEY;
public class OsmandAidlApi {
@@ -200,13 +202,6 @@ public class OsmandAidlApi {
private static final String AIDL_QUICK_ACTION_NUMBER = "aidl_quick_action_number";
private static final String AIDL_LOCK_STATE = "lock_state";
- private static final String AIDL_SET_MAP_MARGINS = "set_map_margins";
- private static final String AIDL_APP_MODE = "app_mode";
- private static final String AIDL_LEFT_MARGIN = "left_margin";
- private static final String AIDL_TOP_MARGIN = "top_margin";
- private static final String AIDL_RIGHT_MARGIN = "right_margin";
- private static final String AIDL_BOTTOM_MARGIN = "bottom_margin";
-
private static final ApplicationMode DEFAULT_PROFILE = ApplicationMode.CAR;
private static final ApplicationMode[] VALID_PROFILES = new ApplicationMode[]{
@@ -257,7 +252,6 @@ public class OsmandAidlApi {
registerHideSqliteDbFileReceiver(mapActivity);
registerExecuteQuickActionReceiver(mapActivity);
registerLockStateReceiver(mapActivity);
- registerMapMarginsReceiver(mapActivity);
initOsmandTelegram();
app.getAppCustomization().addListener(mapActivity);
this.mapActivity = mapActivity;
@@ -379,28 +373,10 @@ public class OsmandAidlApi {
registerReceiver(addMapWidgetReceiver, mapActivity, AIDL_ADD_MAP_WIDGET);
}
- private void registerMapMarginsReceiver(MapActivity mapActivity) {
- final WeakReference mapActivityRef = new WeakReference<>(mapActivity);
- BroadcastReceiver addMapWidgetReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- MapActivity mapActivity = mapActivityRef.get();
- String appModeKey = intent.getStringExtra(AIDL_APP_MODE);
- String packName = intent.getStringExtra(AIDL_PACKAGE_NAME);
- if (mapActivity != null && appModeKey != null && packName != null) {
- ConnectedApp connectedApp = connectedApps.get(packName);
- if (connectedApp != null) {
- int leftMargin = intent.getIntExtra(AIDL_LEFT_MARGIN, 0);
- int topMargin = intent.getIntExtra(AIDL_TOP_MARGIN, 0);
- int bottomMargin = intent.getIntExtra(AIDL_RIGHT_MARGIN, 0);
- int rightMargin = intent.getIntExtra(AIDL_BOTTOM_MARGIN, 0);
-
- connectedApp.setMargins(mapActivity, appModeKey, leftMargin, topMargin, rightMargin, bottomMargin);
- }
- }
- }
- };
- registerReceiver(addMapWidgetReceiver, mapActivity, AIDL_SET_MAP_MARGINS);
+ boolean setMapMargins(int left, int top, int right, int bottom, @Nullable List appModeKeys) {
+ app.getAppCustomization().setMapMargins(left, top, right, bottom, appModeKeys);
+ app.getAppCustomization().updateMapMargins(mapActivity);
+ return true;
}
private void registerAddContextMenuButtonsReceiver(MapActivity mapActivity) {
@@ -919,12 +895,6 @@ public class OsmandAidlApi {
}
}
- public void updateMapMargins(@NonNull MapActivity mapActivity) {
- for (ConnectedApp connectedApp : connectedApps.values()) {
- connectedApp.updateMapMargins(mapActivity);
- }
- }
-
private void refreshMap() {
Intent intent = new Intent();
intent.setAction(AIDL_REFRESH_MAP);
@@ -2330,19 +2300,6 @@ public class OsmandAidlApi {
return true;
}
- public boolean setMapMargins(String packName, String appModeKey, int leftMargin, int topMargin, int bottomMargin, int rightMargin) {
- Intent intent = new Intent();
- intent.setAction(AIDL_SET_MAP_MARGINS);
- intent.putExtra(AIDL_PACKAGE_NAME, packName);
- intent.putExtra(AIDL_APP_MODE, appModeKey);
- intent.putExtra(AIDL_LEFT_MARGIN, leftMargin);
- intent.putExtra(AIDL_TOP_MARGIN, topMargin);
- intent.putExtra(AIDL_RIGHT_MARGIN, bottomMargin);
- intent.putExtra(AIDL_BOTTOM_MARGIN, rightMargin);
- app.sendBroadcast(intent);
- return true;
- }
-
public boolean exportProfile(String appModeKey, List settingsTypesKeys) {
ApplicationMode appMode = ApplicationMode.valueOfStringKey(appModeKey, null);
if (app != null && appMode != null) {
@@ -2350,8 +2307,8 @@ public class OsmandAidlApi {
for (String key : settingsTypesKeys) {
settingsTypes.add(ExportSettingsType.valueOf(key));
}
- List settingsItems = new ArrayList<>();
- settingsItems.add(new SettingsHelper.ProfileSettingsItem(app, appMode));
+ List settingsItems = new ArrayList<>();
+ settingsItems.add(new ProfileSettingsItem(app, appMode));
File exportDir = app.getSettings().getExternalStorageDirectory();
String fileName = appMode.toHumanString();
SettingsHelper settingsHelper = app.getSettingsHelper();
@@ -2362,6 +2319,14 @@ public class OsmandAidlApi {
return false;
}
+ public boolean isFragmentOpen() {
+ return mapActivity.isFragmentVisible();
+ }
+
+ public boolean isMenuOpen() {
+ return mapActivity.getContextMenu().isVisible();
+ }
+
private static class FileCopyInfo {
long startTime;
long lastAccessTime;
diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlServiceV2.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlServiceV2.java
index 7c69be1e94..78e7875d24 100644
--- a/OsmAnd/src/net/osmand/aidl/OsmandAidlServiceV2.java
+++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlServiceV2.java
@@ -1327,9 +1327,30 @@ public class OsmandAidlServiceV2 extends Service implements AidlCallbackListener
public boolean setMapMargins(MapMarginsParams params) {
try {
OsmandAidlApi api = getApi("setMapMargins");
- String packName = getCallingAppPackName();
- return api != null && api.setMapMargins(packName, params.getAppModeKey(), params.getLeftMargin(),
- params.getTopMargin(), params.getBottomMargin(), params.getRightMargin());
+ return api != null && api.setMapMargins(params.getLeftMargin(), params.getTopMargin(),
+ params.getBottomMargin(), params.getRightMargin(), params.getAppModesKeys());
+ } catch (Exception e) {
+ handleException(e);
+ return false;
+ }
+ }
+
+ @Override
+ public boolean isFragmentOpen() {
+ try {
+ OsmandAidlApi api = getApi("isFragmentOpen");
+ return api != null && api.isFragmentOpen();
+ } catch (Exception e) {
+ handleException(e);
+ return false;
+ }
+ }
+
+ @Override
+ public boolean isMenuOpen() {
+ try {
+ OsmandAidlApi api = getApi("isMenuOpen");
+ return api != null && api.isMenuOpen();
} catch (Exception e) {
handleException(e);
return false;
diff --git a/OsmAnd/src/net/osmand/plus/AppInitializer.java b/OsmAnd/src/net/osmand/plus/AppInitializer.java
index 78364460a7..58690a9a3b 100644
--- a/OsmAnd/src/net/osmand/plus/AppInitializer.java
+++ b/OsmAnd/src/net/osmand/plus/AppInitializer.java
@@ -55,7 +55,7 @@ import net.osmand.plus.routing.TransportRoutingHelper;
import net.osmand.plus.search.QuickSearchHelper;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
-import net.osmand.plus.settings.backend.SettingsHelper;
+import net.osmand.plus.settings.backend.backup.SettingsHelper;
import net.osmand.plus.views.corenative.NativeCoreContext;
import net.osmand.plus.voice.CommandPlayer;
import net.osmand.plus.voice.CommandPlayerException;
diff --git a/OsmAnd/src/net/osmand/plus/CustomOsmandPlugin.java b/OsmAnd/src/net/osmand/plus/CustomOsmandPlugin.java
index e0cb743a64..9127fa0aef 100644
--- a/OsmAnd/src/net/osmand/plus/CustomOsmandPlugin.java
+++ b/OsmAnd/src/net/osmand/plus/CustomOsmandPlugin.java
@@ -18,15 +18,15 @@ import net.osmand.data.LatLon;
import net.osmand.map.ITileSource;
import net.osmand.map.WorldRegion;
import net.osmand.plus.settings.backend.ApplicationMode;
-import net.osmand.plus.settings.backend.SettingsHelper;
-import net.osmand.plus.settings.backend.SettingsHelper.AvoidRoadsSettingsItem;
-import net.osmand.plus.settings.backend.SettingsHelper.MapSourcesSettingsItem;
-import net.osmand.plus.settings.backend.SettingsHelper.PluginSettingsItem;
-import net.osmand.plus.settings.backend.SettingsHelper.PoiUiFiltersSettingsItem;
-import net.osmand.plus.settings.backend.SettingsHelper.ProfileSettingsItem;
-import net.osmand.plus.settings.backend.SettingsHelper.QuickActionsSettingsItem;
-import net.osmand.plus.settings.backend.SettingsHelper.SettingsCollectListener;
-import net.osmand.plus.settings.backend.SettingsHelper.SettingsItem;
+import net.osmand.plus.settings.backend.backup.SettingsHelper;
+import net.osmand.plus.settings.backend.backup.AvoidRoadsSettingsItem;
+import net.osmand.plus.settings.backend.backup.MapSourcesSettingsItem;
+import net.osmand.plus.settings.backend.backup.PluginSettingsItem;
+import net.osmand.plus.settings.backend.backup.PoiUiFiltersSettingsItem;
+import net.osmand.plus.settings.backend.backup.ProfileSettingsItem;
+import net.osmand.plus.settings.backend.backup.QuickActionsSettingsItem;
+import net.osmand.plus.settings.backend.backup.SettingsHelper.SettingsCollectListener;
+import net.osmand.plus.settings.backend.backup.SettingsItem;
import net.osmand.plus.download.DownloadActivityType;
import net.osmand.plus.download.DownloadIndexesThread;
import net.osmand.plus.download.DownloadResources;
diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java
index 1a48650a4d..b57d94dc3a 100644
--- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java
+++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java
@@ -75,7 +75,7 @@ import net.osmand.plus.search.QuickSearchHelper;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmAndAppCustomization;
import net.osmand.plus.settings.backend.OsmandSettings;
-import net.osmand.plus.settings.backend.SettingsHelper;
+import net.osmand.plus.settings.backend.backup.SettingsHelper;
import net.osmand.plus.voice.CommandPlayer;
import net.osmand.plus.wikivoyage.data.TravelDbHelper;
import net.osmand.router.GeneralRouter;
diff --git a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java
index 4e9ca3d420..6d353713a0 100644
--- a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java
+++ b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java
@@ -46,10 +46,9 @@ import net.osmand.plus.quickaction.QuickActionType;
import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin;
import net.osmand.plus.search.QuickSearchDialogFragment;
import net.osmand.plus.settings.backend.ApplicationMode;
-import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
-import net.osmand.plus.settings.fragments.BaseSettingsFragment;
+import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
import net.osmand.plus.skimapsplugin.SkiMapsPlugin;
import net.osmand.plus.srtmplugin.SRTMPlugin;
import net.osmand.plus.views.OsmandMapTileView;
@@ -112,11 +111,7 @@ public abstract class OsmandPlugin {
return app.getUIUtilities().getIcon(getLogoResourceId());
}
- public Class extends Activity> getSettingsActivity() {
- return null;
- }
-
- public Class extends BaseSettingsFragment> getSettingsFragment() {
+ public SettingsScreenType getSettingsScreenType() {
return null;
}
@@ -499,6 +494,9 @@ public abstract class OsmandPlugin {
public void mapActivityResume(MapActivity activity) {
}
+ public void mapActivityResumeOnTop(MapActivity activity) {
+ }
+
public void mapActivityPause(MapActivity activity) {
}
@@ -752,6 +750,12 @@ public abstract class OsmandPlugin {
}
}
+ public static void onMapActivityResumeOnTop(MapActivity activity) {
+ for (OsmandPlugin plugin : getEnabledPlugins()) {
+ plugin.mapActivityResumeOnTop(activity);
+ }
+ }
+
public static void onMapActivityPause(MapActivity activity) {
for (OsmandPlugin plugin : getEnabledPlugins()) {
plugin.mapActivityPause(activity);
diff --git a/OsmAnd/src/net/osmand/plus/activities/HelpActivity.java b/OsmAnd/src/net/osmand/plus/activities/HelpActivity.java
index 2d4a0c96c5..b7b3044f97 100644
--- a/OsmAnd/src/net/osmand/plus/activities/HelpActivity.java
+++ b/OsmAnd/src/net/osmand/plus/activities/HelpActivity.java
@@ -173,7 +173,7 @@ public class HelpActivity extends OsmandActionBarActivity implements AdapterView
contextMenuAdapter.addItem(createItem(R.string.versions_item, NULL_ID,
"feature_articles/changes.html"));
contextMenuAdapter.addItem(createItem(R.string.what_is_new, NULL_ID,
- "feature_articles/blog.html"));
+ "feature_articles/osmand-3-8-released.html"));
String releasedate = "";
if (!this.getString(R.string.app_edition).equals("")) {
diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
index 122eb9ad7e..8cb6e832c5 100644
--- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
+++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
@@ -74,9 +74,6 @@ import net.osmand.plus.OsmAndConstants;
import net.osmand.plus.OsmAndLocationSimulation;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
-import net.osmand.plus.helpers.DayNightHelper;
-import net.osmand.plus.settings.backend.CommonPreference;
-import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.TargetPointsHelper;
import net.osmand.plus.TargetPointsHelper.TargetPoint;
@@ -87,6 +84,7 @@ import net.osmand.plus.base.ContextMenuFragment;
import net.osmand.plus.base.FailSafeFuntions;
import net.osmand.plus.base.MapViewTrackingUtilities;
import net.osmand.plus.chooseplan.OsmLiveCancelledDialog;
+import net.osmand.plus.dashboard.DashBaseFragment;
import net.osmand.plus.dashboard.DashboardOnMap;
import net.osmand.plus.dialogs.CrashBottomSheetDialogFragment;
import net.osmand.plus.dialogs.ImportGpxBottomSheetDialogFragment;
@@ -100,13 +98,14 @@ import net.osmand.plus.download.ui.DataStoragePlaceDialogFragment;
import net.osmand.plus.firstusage.FirstUsageWelcomeFragment;
import net.osmand.plus.firstusage.FirstUsageWizardFragment;
import net.osmand.plus.helpers.AndroidUiHelper;
+import net.osmand.plus.helpers.DayNightHelper;
import net.osmand.plus.helpers.DiscountHelper;
-import net.osmand.plus.importfiles.ImportHelper;
import net.osmand.plus.helpers.IntentHelper;
import net.osmand.plus.helpers.LockHelper;
import net.osmand.plus.helpers.LockHelper.LockUIAdapter;
import net.osmand.plus.helpers.ScrollHelper;
import net.osmand.plus.helpers.ScrollHelper.OnScrollEventListener;
+import net.osmand.plus.importfiles.ImportHelper;
import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment;
import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.mapcontextmenu.MenuController;
@@ -119,6 +118,7 @@ import net.osmand.plus.measurementtool.GpxData;
import net.osmand.plus.measurementtool.MeasurementEditingContext;
import net.osmand.plus.measurementtool.MeasurementToolFragment;
import net.osmand.plus.measurementtool.SnapTrackWarningFragment;
+import net.osmand.plus.osmedit.OsmEditingFragment;
import net.osmand.plus.render.RendererRegistry;
import net.osmand.plus.resources.ResourceManager;
import net.osmand.plus.routepreparationmenu.ChooseRouteFragment;
@@ -132,7 +132,9 @@ import net.osmand.plus.search.QuickSearchDialogFragment;
import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchTab;
import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType;
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.fragments.BaseSettingsFragment;
import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
import net.osmand.plus.settings.fragments.ConfigureProfileFragment;
@@ -885,6 +887,13 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
settings.USE_SYSTEM_SCREEN_TIMEOUT.addListener(useSystemScreenTimeoutListener);
}
+ @Override
+ public void onTopResumedActivityChanged(boolean isTopResumedActivity) {
+ if (isTopResumedActivity) {
+ OsmandPlugin.onMapActivityResumeOnTop(this);
+ }
+ }
+
public void applyScreenOrientation() {
if (settings.MAP_SCREEN_ORIENTATION.get() != getRequestedOrientation()) {
setRequestedOrientation(settings.MAP_SCREEN_ORIENTATION.get());
@@ -1029,15 +1038,23 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
}
public boolean isMapVisible() {
- for (Fragment fragment : getSupportFragmentManager().getFragments()) {
- if (fragment.isVisible()) {
- return false;
- }
+ if (isFragmentVisible()) {
+ return false;
}
return AndroidUtils.isActivityNotDestroyed(this) && settings.MAP_ACTIVITY_ENABLED.get()
&& !dashboardOnMap.isVisible();
}
+ public boolean isFragmentVisible() {
+ for (Fragment fragment : getSupportFragmentManager().getFragments()) {
+ if (!(fragment instanceof DashBaseFragment) && fragment.isVisible()
+ || dashboardOnMap.isVisible()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private void restartApp() {
AlertDialog.Builder bld = new AlertDialog.Builder(this);
bld.setMessage(R.string.storage_permission_restart_is_required);
@@ -1421,7 +1438,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
});
getMapView().refreshMap(true);
applyScreenOrientation();
- app.getAidlApi().updateMapMargins(this);
+ app.getAppCustomization().updateMapMargins(this);
}
public void updateNavigationBarColor() {
@@ -2200,6 +2217,10 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
return getFragment(GpxApproximationFragment.TAG);
}
+ public OsmEditingFragment getOsmEditingFragment() {
+ return getFragment(SettingsScreenType.OPEN_STREET_MAP_EDITING.fragmentName);
+ }
+
public SnapTrackWarningFragment getSnapTrackWarningBottomSheet() {
return getFragment(SnapTrackWarningFragment.TAG);
}
diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java
index d9137ee2d6..294b382ca4 100644
--- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java
+++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java
@@ -974,10 +974,7 @@ public class MapActivityActions implements DialogProvider {
@Override
public boolean onContextMenuClick(ArrayAdapter adapter, int itemId, int pos, boolean isChecked, int[] viewCoordinates) {
app.logEvent("drawer_plugins_open");
- Intent newIntent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization()
- .getPluginsActivity());
- newIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
- mapActivity.startActivity(newIntent);
+ PluginsFragment.showInstance(mapActivity.getSupportFragmentManager());
return true;
}
}).createItem());
diff --git a/OsmAnd/src/net/osmand/plus/activities/PluginActivity.java b/OsmAnd/src/net/osmand/plus/activities/PluginActivity.java
deleted file mode 100644
index e367f3cd8e..0000000000
--- a/OsmAnd/src/net/osmand/plus/activities/PluginActivity.java
+++ /dev/null
@@ -1,241 +0,0 @@
-package net.osmand.plus.activities;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.text.method.LinkMovementMethod;
-import android.util.Log;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.Button;
-import android.widget.CompoundButton;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.appcompat.content.res.AppCompatResources;
-import androidx.core.content.ContextCompat;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
-
-import net.osmand.AndroidUtils;
-import net.osmand.plus.OsmandApplication;
-import net.osmand.plus.OsmandPlugin;
-import net.osmand.plus.R;
-import net.osmand.plus.chooseplan.ChoosePlanDialogFragment;
-import net.osmand.plus.dialogs.PluginInstalledBottomSheetDialog;
-import net.osmand.plus.download.DownloadIndexesThread;
-import net.osmand.plus.srtmplugin.SRTMPlugin;
-
-public class PluginActivity extends OsmandActionBarActivity implements DownloadIndexesThread.DownloadEvents, PluginInstalledBottomSheetDialog.PluginStateListener {
- private static final String TAG = "PluginActivity";
- public static final String EXTRA_PLUGIN_ID = "plugin_id";
-
- private OsmandPlugin plugin;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- ((OsmandApplication) getApplication()).applyTheme(this);
- super.onCreate(savedInstanceState);
-
- Intent intent = getIntent();
- if (intent == null || !intent.hasExtra(EXTRA_PLUGIN_ID)) {
- Log.e(TAG, "Required extra '" + EXTRA_PLUGIN_ID + "' is missing");
- finish();
- return;
- }
- String pluginId = intent.getStringExtra(EXTRA_PLUGIN_ID);
- if (pluginId == null) {
- Log.e(TAG, "Extra '" + EXTRA_PLUGIN_ID + "' is null");
- finish();
- return;
- }
- for (OsmandPlugin plugin : OsmandPlugin.getAvailablePlugins()) {
- if (!plugin.getId().equals(pluginId))
- continue;
-
- this.plugin = plugin;
- break;
- }
- if (plugin == null) {
- Log.e(TAG, "Plugin '" + EXTRA_PLUGIN_ID + "' not found");
- finish();
- return;
- }
-
- setContentView(R.layout.plugin);
- //noinspection ConstantConditions
- getSupportActionBar().setTitle(plugin.getName());
- Drawable pluginImage = plugin.getAssetResourceImage();
- if (pluginImage != null) {
- ImageView img = (ImageView) findViewById(R.id.plugin_image);
- img.setImageDrawable(pluginImage);
- } else {
- findViewById(R.id.plugin_image_placeholder).setVisibility(View.VISIBLE);
- }
-
- TextView descriptionView = (TextView) findViewById(R.id.plugin_description);
- descriptionView.setText(plugin.getDescription());
-
- boolean light = getMyApplication().getSettings().isLightContent();
- int linkTextColor = ContextCompat.getColor(this,
- light ? R.color.ctx_menu_bottom_view_url_color_light : R.color.ctx_menu_bottom_view_url_color_dark);
-
- descriptionView.setLinkTextColor(linkTextColor);
- descriptionView.setMovementMethod(LinkMovementMethod.getInstance());
- AndroidUtils.removeLinkUnderline(descriptionView);
-
- Button settingsButton = (Button) findViewById(R.id.plugin_settings);
- settingsButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- startActivity(new Intent(PluginActivity.this, plugin.getSettingsActivity()));
- }
- });
-
- CompoundButton enableDisableButton = (CompoundButton)findViewById(
- R.id.plugin_enable_disable);
- enableDisableButton.setOnCheckedChangeListener(
- new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- if (plugin.isActive() == isChecked) {
- return;
- }
-
- boolean ok = OsmandPlugin.enablePlugin(PluginActivity.this, (OsmandApplication)getApplication(),
- plugin, isChecked);
- if (!ok) {
- return;
- }
- updateState();
- }
- });
- Button getButton = (Button)findViewById(R.id.plugin_get);
- getButton.setText(plugin.isPaid() ? R.string.get_plugin : R.string.shared_string_install);
- getButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- try {
- if (plugin instanceof SRTMPlugin) {
- FragmentManager fragmentManager = getSupportFragmentManager();
- if (fragmentManager != null) {
- ChoosePlanDialogFragment.showHillshadeSrtmPluginInstance(fragmentManager);
- }
- } else {
- startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(plugin.getInstallURL())));
- }
- } catch (Exception e) {
- //ignored
- }
- }
- });
-
- updateState();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- OsmandApplication app = getMyApplication();
- OsmandPlugin.checkInstalledMarketPlugins(app, this);
- app.getDownloadThread().setUiActivity(this);
- updateState();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- getMyApplication().getDownloadThread().resetUiActivity(this);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- int itemId = item.getItemId();
- switch (itemId) {
- case android.R.id.home:
- finish();
- return true;
-
- }
- return false;
- }
-
- @SuppressLint("NewApi")
- private void updateState() {
- CompoundButton enableDisableButton = (CompoundButton)findViewById(
- R.id.plugin_enable_disable);
- Button getButton = (Button)findViewById(R.id.plugin_get);
- Button settingsButton = (Button)findViewById(R.id.plugin_settings);
- settingsButton.setCompoundDrawablesWithIntrinsicBounds(
- getMyApplication().getUIUtilities().getThemedIcon(R.drawable.ic_action_settings),
- null, null, null);
- View installHeader = findViewById(R.id.plugin_install_header);
-
- if (plugin.needsInstallation()) {
- getButton.setVisibility(View.VISIBLE);
- enableDisableButton.setVisibility(View.GONE);
- settingsButton.setVisibility(View.GONE);
- installHeader.setVisibility(View.VISIBLE);
- View worldGlobeIcon = installHeader.findViewById(R.id.ic_world_globe);
- Drawable worldGlobeDrawable = getMyApplication().getUIUtilities().getThemedIcon(
- R.drawable.ic_world_globe_dark);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
- worldGlobeIcon.setBackground(worldGlobeDrawable);
- } else {
- //noinspection deprecation
- worldGlobeIcon.setBackgroundDrawable(worldGlobeDrawable);
- }
- } else {
- getButton.setVisibility(View.GONE);
- enableDisableButton.setVisibility(View.VISIBLE);
- enableDisableButton.setChecked(plugin.isActive());
-
- final Class extends Activity> settingsActivity = plugin.getSettingsActivity();
- if (settingsActivity == null || !plugin.isActive()) {
- settingsButton.setVisibility(View.GONE);
- } else {
- settingsButton.setVisibility(View.VISIBLE);
- }
-
- installHeader.setVisibility(View.GONE);
- }
- }
-
- // DownloadEvents
- @Override
- public void newDownloadIndexes() {
- for (Fragment fragment : getSupportFragmentManager().getFragments()) {
- if (fragment instanceof DownloadIndexesThread.DownloadEvents && fragment.isAdded()) {
- ((DownloadIndexesThread.DownloadEvents) fragment).newDownloadIndexes();
- }
- }
- }
-
- @Override
- public void downloadInProgress() {
- for (Fragment fragment : getSupportFragmentManager().getFragments()) {
- if (fragment instanceof DownloadIndexesThread.DownloadEvents && fragment.isAdded()) {
- ((DownloadIndexesThread.DownloadEvents) fragment).downloadInProgress();
- }
- }
- }
-
- @Override
- public void downloadHasFinished() {
- for (Fragment fragment : getSupportFragmentManager().getFragments()) {
- if (fragment instanceof DownloadIndexesThread.DownloadEvents && fragment.isAdded()) {
- ((DownloadIndexesThread.DownloadEvents) fragment).downloadHasFinished();
- }
- }
- }
-
- @Override
- public void onPluginStateChanged(OsmandPlugin plugin) {
- updateState();
- }
-}
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/activities/PluginInfoFragment.java b/OsmAnd/src/net/osmand/plus/activities/PluginInfoFragment.java
new file mode 100644
index 0000000000..7deb85768c
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/activities/PluginInfoFragment.java
@@ -0,0 +1,258 @@
+package net.osmand.plus.activities;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.text.method.LinkMovementMethod;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CompoundButton;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.activity.OnBackPressedCallback;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+
+import net.osmand.AndroidUtils;
+import net.osmand.PlatformUtil;
+import net.osmand.plus.OsmandApplication;
+import net.osmand.plus.OsmandPlugin;
+import net.osmand.plus.R;
+import net.osmand.plus.UiUtilities;
+import net.osmand.plus.base.BaseOsmAndFragment;
+import net.osmand.plus.chooseplan.ChoosePlanDialogFragment;
+import net.osmand.plus.dialogs.PluginInstalledBottomSheetDialog.PluginStateListener;
+import net.osmand.plus.settings.fragments.BaseSettingsFragment;
+import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
+import net.osmand.plus.srtmplugin.SRTMPlugin;
+
+import org.apache.commons.logging.Log;
+
+public class PluginInfoFragment extends BaseOsmAndFragment implements PluginStateListener {
+
+ private static final Log log = PlatformUtil.getLog(PluginInfoFragment.class);
+
+ private static final String TAG = PluginInfoFragment.class.getName();
+
+ public static final String EXTRA_PLUGIN_ID = "plugin_id";
+ public static final String PLUGIN_INFO = "plugin_info";
+
+ private OsmandPlugin plugin;
+ private OsmandApplication app;
+
+ private View mainView;
+ private boolean nightMode;
+
+ @Override
+ public int getStatusBarColorId() {
+ return nightMode ? R.color.status_bar_color_dark : R.color.status_bar_color_light;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ FragmentActivity activity = requireMyActivity();
+ activity.getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+ public void handleOnBackPressed() {
+ dismiss();
+ }
+ });
+ }
+
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ app = requireMyApplication();
+
+ Bundle args = getArguments();
+ if (args == null || !args.containsKey(EXTRA_PLUGIN_ID)) {
+ log.error("Required extra '" + EXTRA_PLUGIN_ID + "' is missing");
+ return null;
+ }
+ String pluginId = args.getString(EXTRA_PLUGIN_ID);
+ if (pluginId == null) {
+ log.error("Extra '" + EXTRA_PLUGIN_ID + "' is null");
+ return null;
+ }
+ plugin = OsmandPlugin.getPlugin(pluginId);
+ if (plugin == null) {
+ log.error("Plugin '" + EXTRA_PLUGIN_ID + "' not found");
+ return null;
+ }
+
+ Context context = requireContext();
+ nightMode = !app.getSettings().isLightContent();
+ LayoutInflater themedInflater = UiUtilities.getInflater(context, nightMode);
+ mainView = themedInflater.inflate(R.layout.plugin, container, false);
+ AndroidUtils.addStatusBarPadding21v(context, mainView);
+
+ TextView toolbarTitle = mainView.findViewById(R.id.toolbar_title);
+ toolbarTitle.setText(plugin.getName());
+
+ ImageView closeButton = mainView.findViewById(R.id.close_button);
+ closeButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Activity activity = getMyActivity();
+ if (activity != null) {
+ activity.onBackPressed();
+ }
+ }
+ });
+ UiUtilities.rotateImageByLayoutDirection(closeButton, AndroidUtils.getLayoutDirection(app));
+
+ Drawable pluginImage = plugin.getAssetResourceImage();
+ if (pluginImage != null) {
+ ImageView img = mainView.findViewById(R.id.plugin_image);
+ img.setImageDrawable(pluginImage);
+ } else {
+ mainView.findViewById(R.id.plugin_image_placeholder).setVisibility(View.VISIBLE);
+ }
+
+ TextView descriptionView = mainView.findViewById(R.id.plugin_description);
+ descriptionView.setText(plugin.getDescription());
+
+ int linkTextColorId = nightMode ? R.color.ctx_menu_bottom_view_url_color_dark : R.color.ctx_menu_bottom_view_url_color_light;
+ int linkTextColor = ContextCompat.getColor(context, linkTextColorId);
+
+ descriptionView.setLinkTextColor(linkTextColor);
+ descriptionView.setMovementMethod(LinkMovementMethod.getInstance());
+ AndroidUtils.removeLinkUnderline(descriptionView);
+
+ Button settingsButton = mainView.findViewById(R.id.plugin_settings);
+ settingsButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ FragmentActivity activity = getActivity();
+ if (activity != null) {
+ SettingsScreenType settingsScreenType = plugin.getSettingsScreenType();
+ if (settingsScreenType != null) {
+ Bundle args = new Bundle();
+ args.putBoolean(PLUGIN_INFO, true);
+ BaseSettingsFragment.showInstance(activity, settingsScreenType, null, args);
+ }
+ }
+ }
+ });
+
+ CompoundButton enableDisableButton = mainView.findViewById(R.id.plugin_enable_disable);
+ enableDisableButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (plugin.isActive() == isChecked) {
+ return;
+ }
+
+ boolean ok = OsmandPlugin.enablePlugin(getActivity(), app, plugin, isChecked);
+ if (!ok) {
+ return;
+ }
+ updateState();
+ }
+ });
+ Button getButton = mainView.findViewById(R.id.plugin_get);
+ getButton.setText(plugin.isPaid() ? R.string.get_plugin : R.string.shared_string_install);
+ getButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ if (plugin instanceof SRTMPlugin) {
+ FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
+ if (fragmentManager != null) {
+ ChoosePlanDialogFragment.showHillshadeSrtmPluginInstance(fragmentManager);
+ }
+ } else {
+ startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(plugin.getInstallURL())));
+ }
+ } catch (Exception e) {
+ //ignored
+ }
+ }
+ });
+
+ updateState();
+ return mainView;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ OsmandPlugin.checkInstalledMarketPlugins(app, getActivity());
+ updateState();
+ }
+
+ private void updateState() {
+ CompoundButton enableDisableButton = mainView.findViewById(R.id.plugin_enable_disable);
+ Button getButton = mainView.findViewById(R.id.plugin_get);
+ Button settingsButton = mainView.findViewById(R.id.plugin_settings);
+ settingsButton.setCompoundDrawablesWithIntrinsicBounds(app.getUIUtilities().getThemedIcon(R.drawable.ic_action_settings), null, null, null);
+ View installHeader = mainView.findViewById(R.id.plugin_install_header);
+
+ if (plugin.needsInstallation()) {
+ getButton.setVisibility(View.VISIBLE);
+ enableDisableButton.setVisibility(View.GONE);
+ settingsButton.setVisibility(View.GONE);
+ installHeader.setVisibility(View.VISIBLE);
+ View worldGlobeIcon = installHeader.findViewById(R.id.ic_world_globe);
+ Drawable worldGlobeDrawable = app.getUIUtilities().getThemedIcon(R.drawable.ic_world_globe_dark);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ worldGlobeIcon.setBackground(worldGlobeDrawable);
+ } else {
+ worldGlobeIcon.setBackgroundDrawable(worldGlobeDrawable);
+ }
+ } else {
+ getButton.setVisibility(View.GONE);
+ enableDisableButton.setVisibility(View.VISIBLE);
+ enableDisableButton.setChecked(plugin.isActive());
+
+ if (plugin.getSettingsScreenType() == null || !plugin.isActive()) {
+ settingsButton.setVisibility(View.GONE);
+ } else {
+ settingsButton.setVisibility(View.VISIBLE);
+ }
+ installHeader.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onPluginStateChanged(OsmandPlugin plugin) {
+ updateState();
+ }
+
+ public void dismiss() {
+ FragmentActivity activity = getActivity();
+ if (activity != null) {
+ try {
+ activity.getSupportFragmentManager().popBackStack(TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE);
+ } catch (Exception e) {
+ log.error(e);
+ }
+ }
+ }
+
+ public static boolean showInstance(FragmentManager fragmentManager, OsmandPlugin plugin) {
+ try {
+ Bundle args = new Bundle();
+ args.putString(EXTRA_PLUGIN_ID, plugin.getId());
+
+ PluginInfoFragment fragment = new PluginInfoFragment();
+ fragment.setArguments(args);
+ fragmentManager.beginTransaction()
+ .add(R.id.fragmentContainer, fragment, TAG)
+ .addToBackStack(TAG)
+ .commitAllowingStateLoss();
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/activities/PluginsActivity.java b/OsmAnd/src/net/osmand/plus/activities/PluginsActivity.java
deleted file mode 100644
index a0e731c7bc..0000000000
--- a/OsmAnd/src/net/osmand/plus/activities/PluginsActivity.java
+++ /dev/null
@@ -1,296 +0,0 @@
-package net.osmand.plus.activities;
-
-import android.app.Activity;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.res.TypedArray;
-import android.os.Bundle;
-import android.text.method.LinkMovementMethod;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.app.AlertDialog;
-import androidx.appcompat.widget.PopupMenu;
-import androidx.core.content.ContextCompat;
-import androidx.fragment.app.Fragment;
-
-import net.osmand.AndroidUtils;
-import net.osmand.aidl.ConnectedApp;
-import net.osmand.plus.CustomOsmandPlugin;
-import net.osmand.plus.OsmandApplication;
-import net.osmand.plus.OsmandPlugin;
-import net.osmand.plus.R;
-import net.osmand.plus.UiUtilities;
-import net.osmand.plus.dialogs.PluginInstalledBottomSheetDialog;
-import net.osmand.plus.download.DownloadIndexesThread;
-
-import java.util.ArrayList;
-
-public class PluginsActivity extends OsmandListActivity implements DownloadIndexesThread.DownloadEvents, PluginInstalledBottomSheetDialog.PluginStateListener {
-
- public static final int ACTIVE_PLUGINS_LIST_MODIFIED = 1;
-
- private boolean listModified = false;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- getMyApplication().applyTheme(this);
- super.onCreate(savedInstanceState);
- setContentView(R.layout.plugins);
- getSupportActionBar().setTitle(R.string.plugins_screen);
- setListAdapter(new PluginsListAdapter());
- }
-
- @Override
- public PluginsListAdapter getListAdapter() {
- return (PluginsListAdapter) super.getListAdapter();
- }
-
- @Override
- public void onItemClick(AdapterView> parent, View view, int position, long id) {
- Object tag = view.getTag();
- if (tag instanceof OsmandPlugin) {
- Intent intent = new Intent(this, PluginActivity.class);
- intent.putExtra(PluginActivity.EXTRA_PLUGIN_ID, ((OsmandPlugin) tag).getId());
- startActivity(intent);
- } else if (tag instanceof ConnectedApp) {
- switchEnabled((ConnectedApp) tag);
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- OsmandApplication app = getMyApplication();
- OsmandPlugin.checkInstalledMarketPlugins(app, this);
- app.getDownloadThread().setUiActivity(this);
- getListAdapter().notifyDataSetChanged();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- getMyApplication().getDownloadThread().resetUiActivity(this);
- }
-
- private void enableDisablePlugin(OsmandPlugin plugin, boolean enable) {
- OsmandApplication app = getMyApplication();
- if (OsmandPlugin.enablePlugin(this, app, plugin, enable)) {
- if (!listModified) {
- setResult(ACTIVE_PLUGINS_LIST_MODIFIED);
- listModified = true;
- }
- getListAdapter().notifyDataSetChanged();
- }
- }
-
- private void switchEnabled(@NonNull ConnectedApp app) {
- getMyApplication().getAidlApi().switchEnabled(app);
- getListAdapter().notifyDataSetChanged();
- }
-
- // DownloadEvents
- @Override
- public void newDownloadIndexes() {
- for (Fragment fragment : getSupportFragmentManager().getFragments()) {
- if (fragment instanceof DownloadIndexesThread.DownloadEvents && fragment.isAdded()) {
- ((DownloadIndexesThread.DownloadEvents) fragment).newDownloadIndexes();
- }
- }
- }
-
- @Override
- public void downloadInProgress() {
- for (Fragment fragment : getSupportFragmentManager().getFragments()) {
- if (fragment instanceof DownloadIndexesThread.DownloadEvents && fragment.isAdded()) {
- ((DownloadIndexesThread.DownloadEvents) fragment).downloadInProgress();
- }
- }
- }
-
- @Override
- public void downloadHasFinished() {
- for (Fragment fragment : getSupportFragmentManager().getFragments()) {
- if (fragment instanceof DownloadIndexesThread.DownloadEvents && fragment.isAdded()) {
- ((DownloadIndexesThread.DownloadEvents) fragment).downloadHasFinished();
- }
- }
- }
-
- @Override
- public void onPluginStateChanged(OsmandPlugin plugin) {
- getListAdapter().notifyDataSetChanged();
- }
-
- protected class PluginsListAdapter extends ArrayAdapter