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-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 siden
ERR
+ 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 hizmeti
OsmAnd logosu
Önce OsmAnd\'ın ücretsiz veya ücretli sürümünü yüklemeniz gerekmektedir
OsmAnd\'ı yükle
diff --git a/OsmAnd/AndroidManifest.xml b/OsmAnd/AndroidManifest.xml
index d762e0a261..f108fc7dd5 100644
--- a/OsmAnd/AndroidManifest.xml
+++ b/OsmAnd/AndroidManifest.xml
@@ -247,6 +247,7 @@
+
@@ -262,6 +263,7 @@
+
@@ -466,6 +468,13 @@
+
+
+
+
+
+
+
@@ -478,28 +487,11 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 32c555c423..b60654e873 100644
--- a/OsmAnd/res/values-ar/strings.xml
+++ b/OsmAnd/res/values-ar/strings.xml
@@ -3915,4 +3915,9 @@
تسجيل الخروج بنجاح
تم استيراد الملف بالفعل في أوسماند
استخدام خوارزمية توجيه من مرحلتين A*
+ %1$s البيانات المتوفرة فقط على الطرق ، تحتاج إلى حساب طريق باستخدام \"الطريق بين النقاط\" للحصول عليها.
+ في انتظار إعادة حساب الطريق
+\nسيتوفر الرسم البياني بعد إعادة الحساب.
+ للقيادة على الجليد مع طرق ومسارات مخصصة.
+ رسم بياني
\ 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 Entwicklung
Wechseln 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/strings.xml b/OsmAnd/res/values-eo/strings.xml
index 727be72322..ece67180a8 100644
--- a/OsmAnd/res/values-eo/strings.xml
+++ b/OsmAnd/res/values-eo/strings.xml
@@ -73,7 +73,7 @@
Volapuko
OsmAnd Mapoj kaj Navigado
Inversa ordigo
- Anstataŭigi komencpunkton per finpunkto
+ Anstataŭigi komencpunkton per celo
Emblemoj de interesejoj
Elemento forigita
elementoj forigitaj
@@ -742,7 +742,7 @@
Vidiga koloro
tagoj
Konekti
- Prikalkuli kurson inter punktojn
+ Kalkuli kurson inter punktoj
Ĉiam montri centrigitan pozicion
Loko
adresoj tutmondaj
@@ -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$s
Komencpunkto
Anstataŭigi komencpunkton per celo
Simuli vian pozicion uzante registritan GPX‑kurson.
@@ -3925,4 +3925,11 @@
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 @@
Radioterapia
Advertencia de peligro
Categoría de dificultad
- н/к (sin categoría)
- н/к* (sin categoría, posible peligro)
+ s/c (sin categoría)
+ s/c* (sin categoría, posible peligro)
1A
1A*
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 OAuth
Vaciar llave OAuth de OpenStreetMap
Sesió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-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml
index 3b52399258..04e329659a 100644
--- a/OsmAnd/res/values-fr/strings.xml
+++ b/OsmAnd/res/values-fr/strings.xml
@@ -3902,4 +3902,14 @@
Dé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-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml
index 2c210a5c47..efe9cb3b27 100644
--- a/OsmAnd/res/values-iw/strings.xml
+++ b/OsmAnd/res/values-iw/strings.xml
@@ -3933,4 +3933,9 @@
היציאה הצליחה
הקובץ כבר ייובא אל 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 c55ee475f1..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の説明文を表示
- 北米
+ 北アメリカ
アメリカ合衆国
- 中米
- 南米
+ 中央アメリカ
+ 南アメリカ
ヨーロッパ
ヨーロッパ - フランス
ヨーロッパ - ドイツ
@@ -1936,7 +1936,7 @@ POIの更新は利用できません
バス
鉄道
現在の経路
- バッテリーレベル
+ バッテリー残量
マーカーの位置を変更
マップ画面のドラッグでマーカー位置を調整できます
diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml
index 5b99d1ed99..1ea7427da0 100644
--- a/OsmAnd/res/values-pt-rBR/strings.xml
+++ b/OsmAnd/res/values-pt-rBR/strings.xml
@@ -3923,4 +3923,9 @@
Saí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/strings.xml b/OsmAnd/res/values-pt/strings.xml
index c3292ad2e7..8179f41893 100644
--- a/OsmAnd/res/values-pt/strings.xml
+++ b/OsmAnd/res/values-pt/strings.xml
@@ -3930,4 +3930,9 @@
Logout 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 4cbbedc326..1e5b9b274d 100644
--- a/OsmAnd/res/values-ru/strings.xml
+++ b/OsmAnd/res/values-ru/strings.xml
@@ -1336,7 +1336,7 @@
Данные о тайлах: %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, но вы можете отключить их на предыдущем экране или переместить вниз.
Редактировать профили
- Режим навигации определяет правила расчета маршрутов.
+ Режим навигации определяет правила расчёта маршрутов.
Внешний вид профиля
Значок, цвет и имя
Редактировать список профилей
@@ -3922,4 +3922,6 @@
Выход выполнен
График
Файл уже импортирован
+ Дождитесь пересчёта маршрута.
+\nГрафик будет доступен после пересчёта.
diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml
index 3e7f0b8fb7..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’àndala
Imposta 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’àndala
Pidagnu
@@ -1540,7 +1540,7 @@
Dislinda s’artària de su veìculu permìtida pro sos caminos.
Non faghet rugrare sas fronteras intre sos istados
Recà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.
Disabilitadu
Essi
Coloratzione a segunda de sa casta (afiliatzione) de àndala
@@ -3824,8 +3824,8 @@
Subraiscrie sa rasta
Sarva comente una rasta noa
Fù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 intrea
Segmentu imbeniente
@@ -3926,4 +3926,9 @@
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/strings.xml b/OsmAnd/res/values-sk/strings.xml
index 971edf9dda..6575698d3a 100644
--- a/OsmAnd/res/values-sk/strings.xml
+++ b/OsmAnd/res/values-sk/strings.xml
@@ -3926,4 +3926,11 @@
Prihlásiť pomocou OAuth
Vymazať token OpenStreetMap OAuth
Odhlá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 0353ad6b71..a4b87bee1b 100644
--- a/OsmAnd/res/values-tr/phrases.xml
+++ b/OsmAnd/res/values-tr/phrases.xml
@@ -269,7 +269,7 @@
Otoyol kavşağı
Birleşim
Dinlenme alanı
- Su kaynağı
+ Su kuyusu
Yangın musluğu
Su işleri
Tersane
@@ -841,7 +841,7 @@
Düden
Şelale
Irmak
- Akış
+ Dere
Nehrin akıntılı yeri
Değerli taş
Pelerin
@@ -1068,7 +1068,7 @@
Paket servisi
Kokteyller
Mikro bira imalathanesi
- Servis
+ Hizmet
Kabul edilen atık
Şömine
Mevsimlik
@@ -1184,7 +1184,7 @@
Tırmanma kayalığı
Evet
Tarihi tank
- Kar aracı erişimi
+ Kar arabası erişimi
Otobüs erişimi
Karavan erişimi
Motokaravan erişimi
@@ -3047,4 +3047,87 @@
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 d0aa6a6e35..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ı hesapla
Lütfen GPS\'yi ayarlardan açık konuma getirin
- Log servisi
+ Günlük kayıt hizmetleri
Rota yok
Varış Noktasını kaldır
Varış noktası %1$s
@@ -78,7 +78,7 @@
Uygulamayı güvenli modda çalıştırın (yerel kod yerine daha yavaş Android kullanarak).
Güvenli kip
Uygulama 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 verisi
Navigasyonu durdurmak istediğinizden emin misiniz\?
Hedefi (ve ara hedefleri) temizlemek istediğinizden emin misiniz\?
@@ -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 gizle
Süzgeci göster
Süzgeç
@@ -881,7 +881,7 @@
Çevrim içi arama: Ev numarası, sokak, şehir
Çevrim dışı arama
Toplam 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 deneyin
Eski 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öster
Devre dışı
Ev kapı numaraları
@@ -1457,8 +1457,8 @@
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:
+ Arka plan hizmeti tarafından kullanılan uyanma aralığı:
+ Arka plan hizmeti tarafından kullanılan konum yöntemi:
Düz gidin
Ekran yönlendirme
Hiçbir adres belirlenmedi
@@ -1466,9 +1466,9 @@
Durakta ulaşım aracı ara
Harita 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ça
Belarusça
Boşnakça
- Noktalar arasındaki rotayı hesaplamak
+ Noktalar arasındaki güzergahı hesapla
Konumu sürekli ortada tut
Ses
Ç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şlat
Online izleme durdurun
@@ -2282,7 +2282,7 @@
Geçilmiş-olanı göster
Geçilmiş-olanı gizle
Haritada 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ği
Harita 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
İçerikler
Sonuç
- Seyehat
+ Seyahat rehberleri
Toplam
Tüm başlangıç noktalarını temizle
Grup silindi
@@ -3883,4 +3883,9 @@
Oturum 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-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml
index 5a20046ed1..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 (цікаві точки) навколо вас
@@ -3924,4 +3924,9 @@
Розробка
Файл уже імпортовано до 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 87c5c7b4d6..04b193b923 100644
--- a/OsmAnd/res/values/phrases.xml
+++ b/OsmAnd/res/values/phrases.xml
@@ -4206,7 +4206,7 @@
Yes
No
- Signal to find the pole
+ Internet access: customers
Only when walking is allowed
Contrasted
Primitive
@@ -4259,5 +4259,10 @@
LNG
+ GPX point
+
+ Rooftop
+ Sheds
+ Layby
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/plus/OsmandPlugin.java b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java
index e86b64df43..6d353713a0 100644
--- a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java
+++ b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java
@@ -48,7 +48,7 @@ import net.osmand.plus.search.QuickSearchDialogFragment;
import net.osmand.plus.settings.backend.ApplicationMode;
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;
@@ -111,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;
}
diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
index 53d3fcf473..8cb6e832c5 100644
--- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
+++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
@@ -118,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;
@@ -2216,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