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Б* - - 2А* - - 2Б* - - 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 getSettingsActivity() { - return SettingsAccessibilityActivity.class; - } - - @Override - public Class 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 getSettingsActivity() { - return null; - } - - public Class 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 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 { - PluginsListAdapter() { - super(PluginsActivity.this, R.layout.plugins_list_item, new ArrayList<>()); - addAll(getMyApplication().getAidlApi().getConnectedApps()); - addAll(OsmandPlugin.getVisiblePlugins()); - } - - @NonNull - @Override - public View getView(int position, View convertView, @NonNull ViewGroup parent) { - View view = convertView; - if (view == null) { - view = getLayoutInflater().inflate(R.layout.plugins_list_item, parent, false); - } - - final Object item = getItem(position); - - boolean active = false; - int logoContDescId = R.string.shared_string_disable; - String name = ""; - boolean isLightTheme = getMyApplication().getSettings().isLightContent(); - - ImageButton pluginLogo = (ImageButton) view.findViewById(R.id.plugin_logo); - ImageView pluginOptions = (ImageView) view.findViewById(R.id.plugin_options); - TextView pluginDescription = (TextView) view.findViewById(R.id.plugin_description); - - if (item instanceof ConnectedApp) { - final ConnectedApp app = (ConnectedApp) item; - active = app.isEnabled(); - if (!active) { - logoContDescId = R.string.shared_string_enable; - } - name = app.getName(); - pluginDescription.setText(R.string.third_party_application); - pluginLogo.setImageDrawable(app.getIcon()); - pluginLogo.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - switchEnabled(app); - } - }); - pluginOptions.setVisibility(View.GONE); - pluginOptions.setOnClickListener(null); - view.setTag(app); - } else if (item instanceof OsmandPlugin) { - final OsmandPlugin plugin = (OsmandPlugin) item; - active = plugin.isActive(); - if (!active) { - logoContDescId = plugin.needsInstallation() - ? R.string.access_shared_string_not_installed : R.string.shared_string_enable; - } - name = plugin.getName(); - pluginDescription.setText(plugin.getDescription()); - - boolean light = getMyApplication().getSettings().isLightContent(); - int linkTextColor = ContextCompat.getColor(PluginsActivity.this, - light ? R.color.ctx_menu_bottom_view_url_color_light : R.color.ctx_menu_bottom_view_url_color_dark); - - pluginDescription.setLinkTextColor(linkTextColor); - pluginDescription.setMovementMethod(LinkMovementMethod.getInstance()); - AndroidUtils.removeLinkUnderline(pluginDescription); - - OsmandApplication app = getMyApplication(); - int color = AndroidUtils.getColorFromAttr(PluginsActivity.this, R.attr.list_background_color); - pluginLogo.setImageDrawable(UiUtilities.tintDrawable(plugin.getLogoResource(), color)); - pluginLogo.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (plugin.isActive() || !plugin.needsInstallation()) { - enableDisablePlugin(plugin, !plugin.isActive()); - } - } - }); - pluginOptions.setVisibility(View.VISIBLE); - pluginOptions.setImageDrawable(getMyApplication().getUIUtilities().getThemedIcon(R.drawable.ic_overflow_menu_white)); - pluginOptions.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - showOptionsMenu(v, plugin); - } - }); - view.setTag(plugin); - } - - pluginLogo.setContentDescription(getString(logoContDescId)); - if (active) { - pluginLogo.setBackgroundResource(isLightTheme ? R.drawable.bg_plugin_logo_enabled_light : R.drawable.bg_plugin_logo_enabled_dark); - } else { - TypedArray attributes = getTheme().obtainStyledAttributes(new int[] {R.attr.bg_plugin_logo_disabled}); - pluginLogo.setBackgroundDrawable(attributes.getDrawable(0)); - attributes.recycle(); - } - - TextView pluginName = (TextView) view.findViewById(R.id.plugin_name); - pluginName.setText(name); - pluginName.setContentDescription(name + " " + getString(active - ? R.string.item_checked - : R.string.item_unchecked)); - - return view; - } - } - - private void showOptionsMenu(View v, final OsmandPlugin plugin) { - final Class settingsActivity = plugin.getSettingsActivity(); - - final PopupMenu optionsMenu = new PopupMenu(this, v); - if (plugin.isActive() || !plugin.needsInstallation()) { - MenuItem enableDisableItem = optionsMenu.getMenu().add( - plugin.isActive() ? R.string.shared_string_disable - : R.string.shared_string_enable); - enableDisableItem - .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - enableDisablePlugin(plugin, !plugin.isActive()); - optionsMenu.dismiss(); - return true; - } - }); - } - - if (settingsActivity != null && plugin.isActive()) { - MenuItem settingsItem = optionsMenu.getMenu().add(R.string.shared_string_settings); - settingsItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - startActivity(new Intent(PluginsActivity.this, settingsActivity)); - optionsMenu.dismiss(); - return true; - } - }); - } - - if (plugin instanceof CustomOsmandPlugin) { - MenuItem settingsItem = optionsMenu.getMenu().add(R.string.shared_string_delete); - settingsItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - showDeletePluginDialog((CustomOsmandPlugin) plugin); - optionsMenu.dismiss(); - return true; - } - }); - } - - optionsMenu.show(); - } - - private void showDeletePluginDialog(final CustomOsmandPlugin plugin) { - AlertDialog.Builder builder = new AlertDialog.Builder(PluginsActivity.this); - builder.setTitle(getString(R.string.delete_confirmation_msg, plugin.getName())); - builder.setMessage(R.string.are_you_sure); - builder.setNegativeButton(R.string.shared_string_cancel, null); - builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - OsmandApplication app = getMyApplication(); - OsmandPlugin.removeCustomPlugin(app, plugin); - getListAdapter().remove(plugin); - } - }); - builder.show(); - } -} diff --git a/OsmAnd/src/net/osmand/plus/activities/PluginsFragment.java b/OsmAnd/src/net/osmand/plus/activities/PluginsFragment.java new file mode 100644 index 0000000000..783e7791c5 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/activities/PluginsFragment.java @@ -0,0 +1,338 @@ +package net.osmand.plus.activities; + +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.TypedArray; +import android.os.Bundle; +import android.text.method.LinkMovementMethod; +import android.view.LayoutInflater; +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.ListView; +import android.widget.TextView; + +import androidx.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.PopupMenu; +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.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.base.BaseOsmAndFragment; +import net.osmand.plus.dialogs.PluginInstalledBottomSheetDialog.PluginStateListener; +import net.osmand.plus.settings.fragments.BaseSettingsFragment; +import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType; + +import org.apache.commons.logging.Log; + +import java.util.ArrayList; + +public class PluginsFragment extends BaseOsmAndFragment implements PluginStateListener { + + private static final Log log = PlatformUtil.getLog(PluginsFragment.class); + + public static final String TAG = PluginsFragment.class.getName(); + + public static final String OPEN_PLUGINS = "open_plugins"; + + private OsmandApplication app; + private PluginsListAdapter adapter; + + private LayoutInflater themedInflater; + 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() { + FragmentActivity activity = getActivity(); + if (activity instanceof MapActivity) { + dismissImmediate(); + MapActivity mapActivity = (MapActivity) activity; + mapActivity.launchPrevActivityIntent(); + } + } + }); + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + app = requireMyApplication(); + nightMode = !app.getSettings().isLightContent(); + + themedInflater = UiUtilities.getInflater(getContext(), nightMode); + View view = themedInflater.inflate(R.layout.plugins, container, false); + AndroidUtils.addStatusBarPadding21v(getContext(), view); + + TextView toolbarTitle = view.findViewById(R.id.toolbar_title); + toolbarTitle.setText(R.string.plugins_screen); + + ImageView closeButton = view.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)); + + adapter = new PluginsListAdapter(requireContext()); + + ListView listView = view.findViewById(R.id.plugins_list); + listView.setAdapter(adapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Object tag = view.getTag(); + if (tag instanceof OsmandPlugin) { + FragmentActivity activity = getActivity(); + if (activity != null) { + PluginInfoFragment.showInstance(activity.getSupportFragmentManager(), (OsmandPlugin) tag); + } + } else if (tag instanceof ConnectedApp) { + switchEnabled((ConnectedApp) tag); + } + } + }); + return view; + } + + @Override + public void onResume() { + super.onResume(); + OsmandPlugin.checkInstalledMarketPlugins(app, getActivity()); + adapter.notifyDataSetChanged(); + } + + private void enableDisablePlugin(OsmandPlugin plugin, boolean enable) { + if (OsmandPlugin.enablePlugin(getActivity(), app, plugin, enable)) { + adapter.notifyDataSetChanged(); + } + } + + private void switchEnabled(@NonNull ConnectedApp connectedApp) { + app.getAidlApi().switchEnabled(connectedApp); + adapter.notifyDataSetChanged(); + } + + @Override + public void onPluginStateChanged(OsmandPlugin plugin) { + adapter.notifyDataSetChanged(); + } + + protected class PluginsListAdapter extends ArrayAdapter { + + PluginsListAdapter(Context context) { + super(context, R.layout.plugins_list_item, new ArrayList<>()); + addAll(app.getAidlApi().getConnectedApps()); + addAll(OsmandPlugin.getVisiblePlugins()); + } + + @NonNull + @Override + public View getView(int position, View convertView, @NonNull ViewGroup parent) { + View view = convertView; + if (view == null) { + view = themedInflater.inflate(R.layout.plugins_list_item, parent, false); + } + Context context = view.getContext(); + + boolean active = false; + int logoContDescId = R.string.shared_string_disable; + String name = ""; + + ImageButton pluginLogo = view.findViewById(R.id.plugin_logo); + ImageView pluginOptions = view.findViewById(R.id.plugin_options); + TextView pluginDescription = view.findViewById(R.id.plugin_description); + + Object item = getItem(position); + if (item instanceof ConnectedApp) { + final ConnectedApp app = (ConnectedApp) item; + active = app.isEnabled(); + if (!active) { + logoContDescId = R.string.shared_string_enable; + } + name = app.getName(); + pluginDescription.setText(R.string.third_party_application); + pluginLogo.setImageDrawable(app.getIcon()); + pluginLogo.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + switchEnabled(app); + } + }); + pluginOptions.setVisibility(View.GONE); + pluginOptions.setOnClickListener(null); + view.setTag(app); + } else if (item instanceof OsmandPlugin) { + final OsmandPlugin plugin = (OsmandPlugin) item; + active = plugin.isActive(); + if (!active) { + logoContDescId = plugin.needsInstallation() + ? R.string.access_shared_string_not_installed : R.string.shared_string_enable; + } + name = plugin.getName(); + pluginDescription.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); + + pluginDescription.setLinkTextColor(linkTextColor); + pluginDescription.setMovementMethod(LinkMovementMethod.getInstance()); + AndroidUtils.removeLinkUnderline(pluginDescription); + + int color = AndroidUtils.getColorFromAttr(context, R.attr.list_background_color); + pluginLogo.setImageDrawable(UiUtilities.tintDrawable(plugin.getLogoResource(), color)); + pluginLogo.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (plugin.isActive() || !plugin.needsInstallation()) { + enableDisablePlugin(plugin, !plugin.isActive()); + } + } + }); + pluginOptions.setVisibility(View.VISIBLE); + pluginOptions.setImageDrawable(app.getUIUtilities().getThemedIcon(R.drawable.ic_overflow_menu_white)); + pluginOptions.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showOptionsMenu(v, plugin); + } + }); + view.setTag(plugin); + } + + pluginLogo.setContentDescription(getString(logoContDescId)); + if (active) { + pluginLogo.setBackgroundResource(nightMode ? R.drawable.bg_plugin_logo_enabled_dark : R.drawable.bg_plugin_logo_enabled_light); + } else { + TypedArray attributes = context.getTheme().obtainStyledAttributes(new int[] {R.attr.bg_plugin_logo_disabled}); + pluginLogo.setBackgroundDrawable(attributes.getDrawable(0)); + attributes.recycle(); + } + + TextView pluginName = view.findViewById(R.id.plugin_name); + pluginName.setText(name); + pluginName.setContentDescription(name + " " + getString(active + ? R.string.item_checked + : R.string.item_unchecked)); + + return view; + } + } + + private void showOptionsMenu(View view, final OsmandPlugin plugin) { + final PopupMenu optionsMenu = new PopupMenu(view.getContext(), view); + if (plugin.isActive() || !plugin.needsInstallation()) { + MenuItem enableDisableItem = optionsMenu.getMenu().add( + plugin.isActive() ? R.string.shared_string_disable + : R.string.shared_string_enable); + enableDisableItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + enableDisablePlugin(plugin, !plugin.isActive()); + optionsMenu.dismiss(); + return true; + } + }); + } + + final SettingsScreenType settingsScreenType = plugin.getSettingsScreenType(); + if (settingsScreenType != null && plugin.isActive()) { + MenuItem settingsItem = optionsMenu.getMenu().add(R.string.shared_string_settings); + settingsItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + FragmentActivity activity = getActivity(); + if (activity != null) { + BaseSettingsFragment.showInstance(activity, settingsScreenType); + } + optionsMenu.dismiss(); + return true; + } + }); + } + + if (plugin instanceof CustomOsmandPlugin) { + MenuItem settingsItem = optionsMenu.getMenu().add(R.string.shared_string_delete); + settingsItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + showDeletePluginDialog((CustomOsmandPlugin) plugin); + optionsMenu.dismiss(); + return true; + } + }); + } + + optionsMenu.show(); + } + + private void showDeletePluginDialog(final CustomOsmandPlugin plugin) { + Context context = getContext(); + if (context != null) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(getString(R.string.delete_confirmation_msg, plugin.getName())); + builder.setMessage(R.string.are_you_sure); + builder.setNegativeButton(R.string.shared_string_cancel, null); + builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + OsmandPlugin.removeCustomPlugin(app, plugin); + adapter.remove(plugin); + } + }); + builder.show(); + } + } + + public void dismissImmediate() { + FragmentActivity activity = getActivity(); + if (activity != null) { + try { + activity.getSupportFragmentManager().popBackStackImmediate(TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE); + } catch (Exception e) { + log.error(e); + } + } + } + + public static boolean showInstance(FragmentManager fragmentManager) { + try { + PluginsFragment fragment = new PluginsFragment(); + 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/SettingsActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java index 17559f0e9d..3509f99d65 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsActivity.java @@ -1,11 +1,9 @@ package net.osmand.plus.activities; -import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceCategory; import android.preference.PreferenceScreen; @@ -59,33 +57,24 @@ public class SettingsActivity extends SettingsBaseActivity { } PreferenceCategory plugins = (PreferenceCategory) screen.findPreference("plugin_settings"); for(OsmandPlugin op : OsmandPlugin.getEnabledPlugins()) { - final Class sa = op.getSettingsActivity(); - if(sa != null) { - Preference preference = new Preference(this); - preference.setTitle(op.getName()); - preference.setKey(op.getId()); - preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { - - @Override - public boolean onPreferenceClick(Preference preference) { - startActivity(new Intent(SettingsActivity.this, sa)); - return false; - } - }); - plugins.addPreference(preference); - } +// final Class sa = op.getSettingsActivity(); +// if(sa != null) { +// Preference preference = new Preference(this); +// preference.setTitle(op.getName()); +// preference.setKey(op.getId()); +// preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { +// +// @Override +// public boolean onPreferenceClick(Preference preference) { +// startActivity(new Intent(SettingsActivity.this, sa)); +// return false; +// } +// }); +// plugins.addPreference(preference); +// } } } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if ((requestCode == PLUGINS_SELECTION_REQUEST) && (resultCode == PluginsActivity.ACTIVE_PLUGINS_LIST_MODIFIED)) { - finish(); - startActivity(getIntent()); - } - } - @Override public boolean onPreferenceClick(Preference preference) { if (preference == general) { diff --git a/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java b/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java index f59b5869ea..c28b110c85 100644 --- a/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java +++ b/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java @@ -66,7 +66,7 @@ import net.osmand.plus.quickaction.QuickActionType; 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.views.OsmandMapLayer.DrawSettings; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.layers.MapInfoLayer; @@ -1811,13 +1811,8 @@ public class AudioVideoNotesPlugin extends OsmandPlugin { } @Override - public Class getSettingsActivity() { - return SettingsAudioVideoActivity.class; - } - - @Override - public Class getSettingsFragment() { - return MultimediaNotesFragment.class; + public SettingsScreenType getSettingsScreenType() { + return SettingsScreenType.MULTIMEDIA_NOTES; } @Override diff --git a/OsmAnd/src/net/osmand/plus/audionotes/MultimediaNotesFragment.java b/OsmAnd/src/net/osmand/plus/audionotes/MultimediaNotesFragment.java index 6996f7ee5b..4c1178ef61 100644 --- a/OsmAnd/src/net/osmand/plus/audionotes/MultimediaNotesFragment.java +++ b/OsmAnd/src/net/osmand/plus/audionotes/MultimediaNotesFragment.java @@ -13,6 +13,8 @@ import android.os.Build; import android.os.Bundle; import android.os.StatFs; import android.text.SpannableString; +import android.view.LayoutInflater; +import android.view.View; import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; @@ -22,17 +24,18 @@ import androidx.preference.PreferenceViewHolder; import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; -import net.osmand.plus.settings.backend.ApplicationMode; -import net.osmand.plus.settings.backend.OsmAndAppCustomization; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.FontCache; 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.backend.ApplicationMode; +import net.osmand.plus.settings.backend.OsmAndAppCustomization; 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.preferences.ListPreferenceEx; import net.osmand.plus.settings.preferences.SwitchPreferenceEx; import net.osmand.plus.widgets.style.CustomTypefaceSpan; @@ -43,6 +46,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import static net.osmand.plus.activities.PluginInfoFragment.PLUGIN_INFO; import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AUDIO_BITRATE_DEFAULT; import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AV_CAMERA_FOCUS_AUTO; import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AV_CAMERA_FOCUS_CONTINUOUS; @@ -66,6 +70,35 @@ public class MultimediaNotesFragment extends BaseSettingsFragment implements Cop private static final String RESET_TO_DEFAULT = "reset_to_default"; private static final String OPEN_NOTES = "open_notes"; + boolean showSwitchProfile = false; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + 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 protected void setupPreferences() { AudioVideoNotesPlugin plugin = OsmandPlugin.getPlugin(AudioVideoNotesPlugin.class); diff --git a/OsmAnd/src/net/osmand/plus/audionotes/SettingsAudioVideoActivity.java b/OsmAnd/src/net/osmand/plus/audionotes/SettingsAudioVideoActivity.java deleted file mode 100644 index 815b77108c..0000000000 --- a/OsmAnd/src/net/osmand/plus/audionotes/SettingsAudioVideoActivity.java +++ /dev/null @@ -1,334 +0,0 @@ -package net.osmand.plus.audionotes; - -import android.hardware.Camera; -import android.hardware.Camera.Parameters; -import android.media.CamcorderProfile; -import android.media.MediaRecorder; -import android.os.Build; -import android.os.Bundle; -import android.os.StatFs; -import android.preference.ListPreference; -import android.preference.PreferenceCategory; -import android.preference.PreferenceScreen; - -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.activities.SettingsBaseActivity; - -import org.apache.commons.logging.Log; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AUDIO_BITRATE_DEFAULT; -import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AV_CAMERA_FOCUS_AUTO; -import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AV_CAMERA_FOCUS_CONTINUOUS; -import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AV_CAMERA_FOCUS_EDOF; -import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AV_CAMERA_FOCUS_HIPERFOCAL; -import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AV_CAMERA_FOCUS_INFINITY; -import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AV_CAMERA_FOCUS_MACRO; -import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AV_DEFAULT_ACTION_AUDIO; -import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AV_DEFAULT_ACTION_CHOOSE; -import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AV_DEFAULT_ACTION_TAKEPICTURE; -import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.AV_DEFAULT_ACTION_VIDEO; -import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.cameraPictureSizeDefault; - -// camera picture size: -// support camera focus select: -//// - -public class SettingsAudioVideoActivity extends SettingsBaseActivity { - - private static final Log log = PlatformUtil.getLog(AudioVideoNotesPlugin.class); - - - @Override - public void onCreate(Bundle savedInstanceState) { - ((OsmandApplication) getApplication()).applyTheme(this); - super.onCreate(savedInstanceState); - getToolbar().setTitle(R.string.av_settings); - PreferenceScreen grp = getPreferenceScreen(); - AudioVideoNotesPlugin p = OsmandPlugin.getEnabledPlugin(AudioVideoNotesPlugin.class); - if (p != null) { - String[] entries; - Integer[] intValues; - - entries = new String[]{getString(R.string.av_def_action_choose), getString(R.string.av_def_action_audio), - getString(R.string.av_def_action_video), getString(R.string.av_def_action_picture)}; - intValues = new Integer[]{AV_DEFAULT_ACTION_CHOOSE, AV_DEFAULT_ACTION_AUDIO, AV_DEFAULT_ACTION_VIDEO, - AV_DEFAULT_ACTION_TAKEPICTURE}; - ListPreference defAct = createListPreference(p.AV_DEFAULT_ACTION, entries, intValues, R.string.av_widget_action, - R.string.av_widget_action_descr); - grp.addPreference(defAct); - - PreferenceCategory photo = new PreferenceCategory(this); - photo.setTitle(R.string.shared_string_photo); - grp.addPreference(photo); - - final Camera cam = openCamera(); - if (cam != null) { - // camera type settings - photo.addPreference(createCheckBoxPreference(p.AV_EXTERNAL_PHOTO_CAM, R.string.av_use_external_camera, - R.string.av_use_external_camera_descr)); - - Parameters parameters = cam.getParameters(); - createCameraPictureSizesPref(p, photo, parameters); - createCameraFocusModesPref(p, photo, parameters); - - // play sound on success photo - photo.addPreference(createCheckBoxPreference(p.AV_PHOTO_PLAY_SOUND, R.string.av_photo_play_sound, - R.string.av_photo_play_sound_descr)); - - cam.release(); - } - - // video settings - PreferenceCategory video = new PreferenceCategory(this); - video.setTitle(R.string.shared_string_video); - grp.addPreference(video); - - video.addPreference(createCheckBoxPreference(p.AV_EXTERNAL_RECORDER, R.string.av_use_external_recorder, - R.string.av_use_external_recorder_descr)); - -// entries = new String[] { "3GP", "MP4" }; -// intValues = new Integer[] { VIDEO_OUTPUT_3GP, VIDEO_OUTPUT_MP4 }; -// ListPreference lp = createListPreference(p.AV_VIDEO_FORMAT, entries, intValues, R.string.av_video_format, -// R.string.av_video_format_descr); -// video.addPreference(lp); - - List qNames = new ArrayList<>(); - List qValues = new ArrayList<>(); - if (Build.VERSION.SDK_INT < 11 || CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_LOW)) { - qNames.add(getString(R.string.av_video_quality_low)); - qValues.add(CamcorderProfile.QUALITY_LOW); - } - if (Build.VERSION.SDK_INT >= 11 && CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_480P)) { - qNames.add("720 x 480 (480p)"); - qValues.add(CamcorderProfile.QUALITY_480P); - } - if (Build.VERSION.SDK_INT >= 11 && CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)) { - qNames.add("1280 x 720 (720p)"); - qValues.add(CamcorderProfile.QUALITY_720P); - } - if (Build.VERSION.SDK_INT >= 11 && CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_1080P)) { - qNames.add("1920 x 1080 (1080p)"); - qValues.add(CamcorderProfile.QUALITY_1080P); - } - if (Build.VERSION.SDK_INT >= 21 && CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_2160P)) { - qNames.add("3840x2160 (2160p)"); - qValues.add(CamcorderProfile.QUALITY_2160P); - } - if (Build.VERSION.SDK_INT < 11 || CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH)) { - qNames.add(getString(R.string.av_video_quality_high)); - qValues.add(CamcorderProfile.QUALITY_HIGH); - } - - ListPreference lp = createListPreference(p.AV_VIDEO_QUALITY, - qNames.toArray(new String[qNames.size()]), - qValues.toArray(new Integer[qValues.size()]), - R.string.av_video_quality, - R.string.av_video_quality_descr); - video.addPreference(lp); - - // Recorder Split settings - PreferenceCategory recSplit = new PreferenceCategory(this); - recSplit.setTitle(R.string.rec_split); - grp.addPreference(recSplit); - - recSplit.addPreference(createCheckBoxPreference(p.AV_RECORDER_SPLIT, R.string.rec_split_title, - R.string.rec_split_desc)); - - intValues = new Integer[]{1, 2, 3, 4, 5, 7, 10, 15, 20, 25, 30}; - entries = new String[intValues.length]; - int i = 0; - String minStr = getString(R.string.int_min); - for (int v : intValues) { - entries[i++] = String.valueOf(v) + " " + minStr; - } - lp = createListPreference(p.AV_RS_CLIP_LENGTH, entries, intValues, - R.string.rec_split_clip_length, - R.string.rec_split_clip_length_desc); - recSplit.addPreference(lp); - - File dir = getMyApplication().getAppPath("").getParentFile(); - long size = 0; - if (dir.canRead()) { - StatFs fs = new StatFs(dir.getAbsolutePath()); - size = ((long) fs.getBlockSize() * (long) fs.getBlockCount()) / (1 << 30); - } - if (size > 0) { - int value = 1; - ArrayList gbList = new ArrayList<>(); - while (value < size) { - gbList.add(value); - if (value < 5) { - value++; - } else { - value += 5; - } - } - if (value != size) { - gbList.add((int) size); - } - entries = new String[gbList.size()]; - intValues = new Integer[gbList.size()]; - i = 0; - for (int v : gbList) { - intValues[i] = v; - entries[i] = AndroidUtils.formatSize(this, v * (1l << 30)); - i++; - } - - lp = createListPreference(p.AV_RS_STORAGE_SIZE, entries, intValues, - R.string.rec_split_storage_size, - R.string.rec_split_storage_size_desc); - recSplit.addPreference(lp); - } - - // audio settings - PreferenceCategory audio = new PreferenceCategory(this); - audio.setTitle(R.string.shared_string_audio); - grp.addPreference(audio); - - entries = new String[]{"Default", "AAC"}; - intValues = new Integer[]{MediaRecorder.AudioEncoder.DEFAULT, MediaRecorder.AudioEncoder.AAC}; - lp = createListPreference(p.AV_AUDIO_FORMAT, entries, intValues, - R.string.av_audio_format, - R.string.av_audio_format_descr); - audio.addPreference(lp); - - entries = new String[]{"Default", "16 kbps", "32 kbps", "48 kbps", "64 kbps", "96 kbps", "128 kbps"}; - intValues = new Integer[]{AUDIO_BITRATE_DEFAULT, 16 * 1024, 32 * 1024, 48 * 1024, 64 * 1024, 96 * 1024, 128 * 1024}; - lp = createListPreference(p.AV_AUDIO_BITRATE, entries, intValues, - R.string.av_audio_bitrate, - R.string.av_audio_bitrate_descr); - audio.addPreference(lp); - } - } - - private void createCameraPictureSizesPref(AudioVideoNotesPlugin p, PreferenceCategory photo, Parameters parameters) { - String[] entries; - Integer[] intValues; - // Photo picture size - // get supported sizes - List psps = parameters.getSupportedPictureSizes(); - if (psps == null) { - return; - } - // list of megapixels of each resolution - List mpix = new ArrayList(); - // list of index each resolution in list, returned by getSupportedPictureSizes() - List picSizesValues = new ArrayList(); - // fill lists for sort - for (int index = 0; index < psps.size(); index++) { - mpix.add((psps.get(index)).width * (psps.get(index)).height); - picSizesValues.add(index); - } - // sort list for max resolution in begining of list - for (int i = 0; i < mpix.size(); i++) { - for (int j = 0; j < mpix.size() - i - 1; j++) { - if (mpix.get(j) < mpix.get(j + 1)) { - // change elements - int tmp = mpix.get(j + 1); - mpix.set(j + 1, mpix.get(j)); - mpix.set(j, tmp); - - tmp = picSizesValues.get(j + 1); - picSizesValues.set(j + 1, picSizesValues.get(j)); - picSizesValues.set(j, tmp); - } - } - } - // set default photo size to max resolution (set index of element with max resolution in List, returned by getSupportedPictureSizes() ) - cameraPictureSizeDefault = picSizesValues.get(0); - log.debug("onCreate() set cameraPictureSizeDefault=" + cameraPictureSizeDefault); - - List itemsPicSizes = new ArrayList(); - String prefix; - for (int index = 0; index < psps.size(); index++) { - float px = (float) ((psps.get(picSizesValues.get(index))).width * (psps.get(picSizesValues.get(index))).height); - if (px > 102400) // 100 K - { - px = px / 1048576; - prefix = "Mpx"; - } else { - px = px / 1024; - prefix = "Kpx"; - } - - itemsPicSizes.add((psps.get(picSizesValues.get(index))).width + - "x" + - (psps.get(picSizesValues.get(index))).height + - " ( " + - String.format("%.2f", px) + - " " + - prefix + - " )"); - } - log.debug("onCreate() set default size: width=" + psps.get(cameraPictureSizeDefault).width + " height=" - + psps.get(cameraPictureSizeDefault).height + " index in ps=" + cameraPictureSizeDefault); - - entries = itemsPicSizes.toArray(new String[itemsPicSizes.size()]); - intValues = picSizesValues.toArray(new Integer[picSizesValues.size()]); - if (entries.length > 0) { - ListPreference camSizes = createListPreference(p.AV_CAMERA_PICTURE_SIZE, entries, intValues, R.string.av_camera_pic_size, - R.string.av_camera_pic_size_descr); - photo.addPreference(camSizes); - } - } - - private void createCameraFocusModesPref(AudioVideoNotesPlugin p, PreferenceCategory photo, Parameters parameters) { - String[] entries; - Integer[] intValues; - // focus mode settings - // show in menu only suppoted modes - List sfm = parameters.getSupportedFocusModes(); - if (sfm == null) { - return; - } - List items = new ArrayList(); - List itemsValues = new ArrayList(); - // filtering known types for translate and set index - for (int index = 0; index < sfm.size(); index++) { - if (sfm.get(index).equals("auto")) { - items.add(getString(R.string.av_camera_focus_auto)); - itemsValues.add(AV_CAMERA_FOCUS_AUTO); - } else if (sfm.get(index).equals("fixed")) { - items.add(getString(R.string.av_camera_focus_hiperfocal)); - itemsValues.add(AV_CAMERA_FOCUS_HIPERFOCAL); - } else if (sfm.get(index).equals("edof")) { - items.add(getString(R.string.av_camera_focus_edof)); - itemsValues.add(AV_CAMERA_FOCUS_EDOF); - } else if (sfm.get(index).equals("infinity")) { - items.add(getString(R.string.av_camera_focus_infinity)); - itemsValues.add(AV_CAMERA_FOCUS_INFINITY); - } else if (sfm.get(index).equals("macro")) { - items.add(getString(R.string.av_camera_focus_macro)); - itemsValues.add(AV_CAMERA_FOCUS_MACRO); - } else if (sfm.get(index).equals("continuous-picture")) { - items.add(getString(R.string.av_camera_focus_continuous)); - itemsValues.add(AV_CAMERA_FOCUS_CONTINUOUS); - } - } - entries = items.toArray(new String[items.size()]); - intValues = itemsValues.toArray(new Integer[itemsValues.size()]); - if (entries.length > 0) { - ListPreference camFocus = createListPreference(p.AV_CAMERA_FOCUS_TYPE, entries, intValues, R.string.av_camera_focus, - R.string.av_camera_focus_descr); - photo.addPreference(camFocus); - } - } - - protected Camera openCamera() { - try { - return Camera.open(); - } catch (Exception e) { - log.error("Error open camera", e); - return null; - } - } -} diff --git a/OsmAnd/src/net/osmand/plus/dashboard/DashPluginsFragment.java b/OsmAnd/src/net/osmand/plus/dashboard/DashPluginsFragment.java index 20affaa27a..15d222a980 100644 --- a/OsmAnd/src/net/osmand/plus/dashboard/DashPluginsFragment.java +++ b/OsmAnd/src/net/osmand/plus/dashboard/DashPluginsFragment.java @@ -14,11 +14,12 @@ import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; -import net.osmand.plus.activities.PluginActivity; +import net.osmand.plus.activities.PluginsFragment; import net.osmand.plus.chooseplan.ChoosePlanDialogFragment; import net.osmand.plus.dashboard.tools.DashFragmentData; import net.osmand.plus.development.OsmandDevelopmentPlugin; @@ -68,9 +69,10 @@ public class DashPluginsFragment extends DashBaseFragment { return new View.OnClickListener() { @Override public void onClick(View view) { - Intent intent = new Intent(getActivity(), PluginActivity.class); - intent.putExtra(PluginActivity.EXTRA_PLUGIN_ID, plugin.getId()); - startActivity(intent); + FragmentActivity activity = getActivity(); + if (activity != null) { + PluginsFragment.showInstance(activity.getSupportFragmentManager()); + } closeDashboard(); } }; @@ -84,7 +86,10 @@ public class DashPluginsFragment extends DashBaseFragment { view.findViewById(R.id.show_all).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - startActivity(new Intent(getActivity(), getMyApplication().getAppCustomization().getPluginsActivity())); + FragmentActivity activity = getActivity(); + if (activity != null) { + PluginsFragment.showInstance(activity.getSupportFragmentManager()); + } closeDashboard(); } }); diff --git a/OsmAnd/src/net/osmand/plus/development/OsmandDevelopmentPlugin.java b/OsmAnd/src/net/osmand/plus/development/OsmandDevelopmentPlugin.java index 6786e78d70..d7798a646b 100644 --- a/OsmAnd/src/net/osmand/plus/development/OsmandDevelopmentPlugin.java +++ b/OsmAnd/src/net/osmand/plus/development/OsmandDevelopmentPlugin.java @@ -14,7 +14,7 @@ import net.osmand.plus.Version; import net.osmand.plus.activities.ContributionVersionActivity; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.dashboard.tools.DashFragmentData; -import net.osmand.plus.settings.fragments.BaseSettingsFragment; +import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType; import net.osmand.plus.views.layers.MapInfoLayer; import net.osmand.plus.views.OsmandMapLayer.DrawSettings; import net.osmand.plus.views.OsmandMapTileView; @@ -122,13 +122,8 @@ public class OsmandDevelopmentPlugin extends OsmandPlugin { } @Override - public Class getSettingsActivity() { - return SettingsDevelopmentActivity.class; - } - - @Override - public Class getSettingsFragment() { - return DevelopmentSettingsFragment.class; + public SettingsScreenType getSettingsScreenType() { + return SettingsScreenType.DEVELOPMENT_SETTINGS; } @Override diff --git a/OsmAnd/src/net/osmand/plus/development/SettingsDevelopmentActivity.java b/OsmAnd/src/net/osmand/plus/development/SettingsDevelopmentActivity.java deleted file mode 100644 index c500a28254..0000000000 --- a/OsmAnd/src/net/osmand/plus/development/SettingsDevelopmentActivity.java +++ /dev/null @@ -1,212 +0,0 @@ -package net.osmand.plus.development; - - -import android.annotation.SuppressLint; -import android.content.Intent; -import android.os.Bundle; -import android.os.Debug; -import android.os.Debug.MemoryInfo; -import android.preference.CheckBoxPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; -import android.preference.PreferenceCategory; -import android.preference.PreferenceScreen; - -import net.osmand.plus.OsmAndLocationSimulation; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.R; -import net.osmand.plus.Version; -import net.osmand.plus.activities.SettingsBaseActivity; -import net.osmand.plus.render.NativeOsmandLibrary; -import net.osmand.plus.settings.backend.OsmandSettings; -import net.osmand.util.SunriseSunset; - -import java.text.SimpleDateFormat; - -//import net.osmand.plus.development.OsmandDevelopmentPlugin; - -public class SettingsDevelopmentActivity extends SettingsBaseActivity { - - @SuppressLint("SimpleDateFormat") - @Override - public void onCreate(Bundle savedInstanceState) { - OsmandApplication app = getMyApplication(); - app.applyTheme(this); - super.onCreate(savedInstanceState); - getToolbar().setTitle(R.string.debugging_and_development); - PreferenceScreen category = getPreferenceScreen(); - Preference pref; - - if (Version.isOpenGlAvailable(app)) { - category.addPreference(createCheckBoxPreference(settings.USE_OPENGL_RENDER, - R.string.use_opengl_render, R.string.use_opengl_render_descr)); - } - - if (!Version.isBlackberry(app)) { - CheckBoxPreference nativeCheckbox = createCheckBoxPreference(settings.SAFE_MODE, R.string.safe_mode, R.string.safe_mode_description); - // disable the checkbox if the library cannot be used - if ((NativeOsmandLibrary.isLoaded() && !NativeOsmandLibrary.isSupported()) || settings.NATIVE_RENDERING_FAILED.get()) { - nativeCheckbox.setEnabled(false); - nativeCheckbox.setChecked(true); - } - category.addPreference(nativeCheckbox); - } - - PreferenceCategory navigation = new PreferenceCategory(this); - navigation.setTitle(R.string.routing_settings); - category.addPreference(navigation); - pref = new Preference(this); - final Preference simulate = pref; - final OsmAndLocationSimulation sim = getMyApplication().getLocationProvider().getLocationSimulation(); - final Runnable updateTitle = new Runnable(){ - - @Override - public void run() { - simulate.setSummary(sim.isRouteAnimating() ? - R.string.simulate_your_location_stop_descr : R.string.simulate_your_location_gpx_descr); - } - }; - pref.setTitle(R.string.simulate_your_location); - updateTitle.run(); - pref.setKey("simulate_your_location"); - pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - updateTitle.run(); - sim.startStopRouteAnimation(SettingsDevelopmentActivity.this, true, updateTitle); - return true; - } - }); - navigation.addPreference(pref); - - PreferenceCategory debug = new PreferenceCategory(this); - debug.setTitle(R.string.debugging_and_development); - category.addPreference(debug); - - CheckBoxPreference dbg = createCheckBoxPreference(settings.DEBUG_RENDERING_INFO, - R.string.trace_rendering, R.string.trace_rendering_descr); - debug.addPreference(dbg); - - - final Preference firstRunPreference = new Preference(this); - firstRunPreference.setTitle(R.string.simulate_initial_startup); - firstRunPreference.setSummary(R.string.simulate_initial_startup_descr); - firstRunPreference.setSelectable(true); - firstRunPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - getMyApplication().getAppInitializer().resetFirstTimeRun(); - OsmandSettings settings = getMyApplication().getSettings(); - settings.FIRST_MAP_IS_DOWNLOADED.set(false); - settings.MAPILLARY_FIRST_DIALOG_SHOWN.set(false); - settings.WEBGL_SUPPORTED.set(true); - settings.WIKI_ARTICLE_SHOW_IMAGES_ASKED.set(false); - - getMyApplication().showToastMessage(R.string.shared_string_ok); - return true; - } - }); - debug.addPreference(firstRunPreference); - - debug.addPreference(createCheckBoxPreference(settings.SHOULD_SHOW_FREE_VERSION_BANNER, - R.string.show_free_version_banner, - R.string.show_free_version_banner_description)); - - pref = new Preference(this); - pref.setTitle(R.string.test_voice_prompts); - pref.setSummary(R.string.play_commands_of_currently_selected_voice); - pref.setKey("test_voice_commands"); - pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - startActivity(new Intent(SettingsDevelopmentActivity.this, TestVoiceActivity.class)); - return true; - } - }); - category.addPreference(pref); - - pref = new Preference(this); - pref.setTitle(R.string.logcat_buffer); - pref.setSummary(R.string.logcat_buffer_descr); - pref.setKey("logcat_buffer"); - pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - startActivity(new Intent(SettingsDevelopmentActivity.this, LogcatActivity.class)); - return true; - } - }); - category.addPreference(pref); - - PreferenceCategory info = new PreferenceCategory(this); - info.setTitle(R.string.info_button); - category.addPreference(info); - - pref = new Preference(this); - pref.setTitle(R.string.global_app_allocated_memory); - - long javaAvailMem = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/ (1024*1024l); - long javaTotal = Runtime.getRuntime().totalMemory() / (1024*1024l); - long dalvikSize = android.os.Debug.getNativeHeapAllocatedSize() / (1024*1024l); - pref.setSummary(getString(R.string.global_app_allocated_memory_descr, javaAvailMem, javaTotal, dalvikSize)); - pref.setSelectable(false); - //setEnabled(false) creates bad readability on some devices - //pref.setEnabled(false); - info.addPreference(pref); - -// ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); -// ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); -// activityManager.getMemoryInfo(memoryInfo); -// long totalSize = memoryInfo.availMem / (1024*1024l); - MemoryInfo mem = new Debug.MemoryInfo(); - Debug.getMemoryInfo(mem); - pref = new Preference(this); - pref.setTitle(R.string.native_app_allocated_memory); - pref.setSummary(getString(R.string.native_app_allocated_memory_descr - , mem.nativePrivateDirty / 1024, mem.dalvikPrivateDirty / 1024 , mem.otherPrivateDirty / 1024 - , mem.nativePss / 1024, mem.dalvikPss / 1024 , mem.otherPss / 1024)); - pref.setSelectable(false); - //setEnabled(false) creates bad readability on some devices - //pref.setEnabled(false); - info.addPreference(pref); - - final Preference agpspref = new Preference(this); - agpspref.setTitle(R.string.agps_info); - if (settings.AGPS_DATA_LAST_TIME_DOWNLOADED.get() != 0L) { - SimpleDateFormat prt = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - agpspref.setSummary(getString(R.string.agps_data_last_downloaded, prt.format(settings.AGPS_DATA_LAST_TIME_DOWNLOADED.get()))); - } else { - agpspref.setSummary(getString(R.string.agps_data_last_downloaded, "--")); - } - agpspref.setSelectable(true); - //setEnabled(false) creates bad readability on some devices - //pref.setEnabled(false); - agpspref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - if(getMyApplication().getSettings().isInternetConnectionAvailable(true)) { - getMyApplication().getLocationProvider().redownloadAGPS(); - SimpleDateFormat prt = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - agpspref.setSummary(getString(R.string.agps_data_last_downloaded, prt.format(settings.AGPS_DATA_LAST_TIME_DOWNLOADED.get()))); - } - return true; - } - }); - info.addPreference(agpspref); - - SunriseSunset sunriseSunset = getMyApplication().getDaynightHelper().getSunriseSunset(); - pref = new Preference(this); - pref.setTitle(R.string.day_night_info); - if (sunriseSunset != null && sunriseSunset.getSunrise() != null && sunriseSunset.getSunset() != null) { - SimpleDateFormat prt = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - pref.setSummary(getString(R.string.day_night_info_description, prt.format(sunriseSunset.getSunrise()), - prt.format(sunriseSunset.getSunset()))); - } else { - pref.setSummary(getString(R.string.day_night_info_description, "null", "null")); - } - pref.setSelectable(false); - //setEnabled(false) creates bad readability on some devices - //pref.setEnabled(false); - info.addPreference(pref); - } -} diff --git a/OsmAnd/src/net/osmand/plus/dialogs/MapLayerMenuListener.java b/OsmAnd/src/net/osmand/plus/dialogs/MapLayerMenuListener.java index 9234239040..29a64bcee4 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/MapLayerMenuListener.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/MapLayerMenuListener.java @@ -1,7 +1,6 @@ package net.osmand.plus.dialogs; import android.content.DialogInterface; -import android.content.Intent; import android.view.View; import android.widget.ArrayAdapter; import android.widget.CompoundButton; @@ -20,7 +19,7 @@ import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivityLayers; -import net.osmand.plus.activities.PluginActivity; +import net.osmand.plus.activities.PluginsFragment; import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.poi.PoiFiltersHelper; import net.osmand.plus.poi.PoiUIFilter; @@ -149,9 +148,7 @@ final class MapLayerMenuListener extends OnRowItemClick { settings.SHOW_MAP_MARKERS.set(isChecked); } else if (itemId == R.string.layer_map) { if (OsmandPlugin.getEnabledPlugin(OsmandRasterMapsPlugin.class) == null) { - Intent intent = new Intent(mapActivity, PluginActivity.class); - intent.putExtra(PluginActivity.EXTRA_PLUGIN_ID, OsmandRasterMapsPlugin.ID); - mapActivity.startActivity(intent); + PluginsFragment.showInstance(mapActivity.getSupportFragmentManager()); } else { ContextMenuItem it = adapter.getItem(pos); mapActivity.getMapLayers().selectMapLayer(mapActivity.getMapView(), it, adapter); diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java index ec1c70fd41..e4cdc5ce94 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java @@ -6,6 +6,7 @@ import android.content.Intent; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.AsyncTask; +import android.os.Bundle; import android.util.TypedValue; import android.view.MenuItem; import android.view.View; @@ -25,6 +26,8 @@ import net.osmand.plus.R; import net.osmand.plus.Version; import net.osmand.plus.activities.LocalIndexHelper.LocalIndexType; import net.osmand.plus.activities.LocalIndexInfo; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.activities.PluginsFragment; import net.osmand.plus.chooseplan.ChoosePlanDialogFragment; import net.osmand.plus.download.CityItem; import net.osmand.plus.download.CustomIndexItem; @@ -343,8 +346,7 @@ public class ItemViewHolder { ChoosePlanDialogFragment.showSeaDepthMapsInstance(context.getSupportFragmentManager()); break; case ASK_FOR_SEAMARKS_PLUGIN: - context.startActivity(new Intent(context, context.getMyApplication().getAppCustomization() - .getPluginsActivity())); + showPluginsScreen(); Toast.makeText(context.getApplicationContext(), context.getString(R.string.activate_seamarks_plugin), Toast.LENGTH_SHORT).show(); break; @@ -352,8 +354,7 @@ public class ItemViewHolder { ChoosePlanDialogFragment.showHillshadeSrtmPluginInstance(context.getSupportFragmentManager()); break; case ASK_FOR_SRTM_PLUGIN_ENABLE: - context.startActivity(new Intent(context, context.getMyApplication().getAppCustomization() - .getPluginsActivity())); + showPluginsScreen(); Toast.makeText(context, context.getString(R.string.activate_srtm_plugin), Toast.LENGTH_SHORT).show(); break; @@ -361,6 +362,13 @@ public class ItemViewHolder { break; } } + + private void showPluginsScreen() { + Bundle params = new Bundle(); + params.putBoolean(PluginsFragment.OPEN_PLUGINS, true); + Intent intent = context.getIntent(); + MapActivity.launchMapActivityMoveToTop(context, intent != null ? intent.getExtras() : null, null, params); + } }; } else { final boolean isDownloading = context.getDownloadThread().isDownloading(item); diff --git a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java index 47650dc2ec..dd7e804b4c 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java @@ -13,6 +13,7 @@ import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; +import android.os.Bundle; import android.text.SpannableString; import android.text.style.StyleSpan; import android.view.ContextThemeWrapper; @@ -80,6 +81,7 @@ import net.osmand.plus.OsmAndConstants; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; +import net.osmand.plus.activities.PluginsFragment; import net.osmand.plus.helpers.enums.MetricsConstants; import net.osmand.plus.helpers.enums.SpeedConstants; import net.osmand.plus.settings.backend.CommonPreference; @@ -90,7 +92,6 @@ import net.osmand.plus.Version; import net.osmand.plus.activities.ActivityResultListener; import net.osmand.plus.activities.ActivityResultListener.OnActivityResultListener; import net.osmand.plus.activities.MapActivity; -import net.osmand.plus.activities.PluginActivity; import net.osmand.plus.activities.SettingsActivity; import net.osmand.plus.dialogs.ConfigureMapMenu; import net.osmand.plus.dialogs.GpxAppearanceAdapter; @@ -649,9 +650,9 @@ public class GpxUiHelper { confirm.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - Intent intent = new Intent(activity, PluginActivity.class); - intent.putExtra(PluginActivity.EXTRA_PLUGIN_ID, OsmandMonitoringPlugin.ID); - activity.startActivity(intent); + Bundle params = new Bundle(); + params.putBoolean(PluginsFragment.OPEN_PLUGINS, true); + MapActivity.launchMapActivityMoveToTop(activity, null, null, params); } }); confirm.setNegativeButton(R.string.shared_string_cancel, null); diff --git a/OsmAnd/src/net/osmand/plus/helpers/IntentHelper.java b/OsmAnd/src/net/osmand/plus/helpers/IntentHelper.java index d58271a27c..19748b100c 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/IntentHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/IntentHelper.java @@ -11,16 +11,18 @@ import net.osmand.PlatformUtil; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; import net.osmand.map.TileSourceManager; -import net.osmand.plus.mapsource.EditMapSourceDialogFragment; -import net.osmand.plus.search.QuickSearchDialogFragment; -import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.MapMarkersHelper; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.activities.PluginsFragment; import net.osmand.plus.dashboard.DashboardOnMap.DashboardType; import net.osmand.plus.mapmarkers.MapMarkersDialogFragment; +import net.osmand.plus.mapsource.EditMapSourceDialogFragment; +import net.osmand.plus.osmedit.OsmEditingFragment; +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.fragments.BaseSettingsFragment; import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType; import net.osmand.util.Algorithms; @@ -58,6 +60,9 @@ public class IntentHelper { if (!applied) { applied = parseSendIntent(); } + if (!applied) { + applied = parseOAuthIntent(); + } return applied; } @@ -207,10 +212,22 @@ public class IntentHelper { mapActivity.setIntent(null); } if (intent.hasExtra(BaseSettingsFragment.OPEN_SETTINGS)) { - String settingsType = intent.getStringExtra(BaseSettingsFragment.OPEN_SETTINGS); String appMode = intent.getStringExtra(BaseSettingsFragment.APP_MODE_KEY); - if (BaseSettingsFragment.OPEN_CONFIG_PROFILE.equals(settingsType)) { - BaseSettingsFragment.showInstance(mapActivity, SettingsScreenType.CONFIGURE_PROFILE, ApplicationMode.valueOfStringKey(appMode, null)); + String settingsTypeName = intent.getStringExtra(BaseSettingsFragment.OPEN_SETTINGS); + if (!Algorithms.isEmpty(settingsTypeName)) { + try { + SettingsScreenType screenType = SettingsScreenType.valueOf(settingsTypeName); + BaseSettingsFragment.showInstance(mapActivity, screenType, ApplicationMode.valueOfStringKey(appMode, null)); + } catch (IllegalArgumentException e) { + LOG.error("error", e); + } + } + mapActivity.setIntent(null); + } + if (intent.hasExtra(PluginsFragment.OPEN_PLUGINS)) { + boolean openPlugins = intent.getBooleanExtra(PluginsFragment.OPEN_PLUGINS, false); + if (openPlugins) { + PluginsFragment.showInstance(mapActivity.getSupportFragmentManager()); } mapActivity.setIntent(null); } @@ -271,6 +288,23 @@ public class IntentHelper { return false; } + private boolean parseOAuthIntent() { + Intent intent = mapActivity.getIntent(); + if (intent != null && intent.getData() != null) { + Uri uri = intent.getData(); + if (uri.toString().startsWith("osmand-oauth")) { + OsmEditingFragment fragment = mapActivity.getOsmEditingFragment(); + if (fragment != null) { + String oauthVerifier = uri.getQueryParameter("oauth_verifier"); + fragment.authorize(oauthVerifier); + mapActivity.setIntent(null); + return true; + } + } + } + return false; + } + private boolean handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (!Algorithms.isEmpty(sharedText)) { diff --git a/OsmAnd/src/net/osmand/plus/importfiles/FavoritesImportTask.java b/OsmAnd/src/net/osmand/plus/importfiles/FavoritesImportTask.java index 9047baeb59..beb3534a46 100644 --- a/OsmAnd/src/net/osmand/plus/importfiles/FavoritesImportTask.java +++ b/OsmAnd/src/net/osmand/plus/importfiles/FavoritesImportTask.java @@ -34,6 +34,7 @@ class FavoritesImportTask extends BaseImportAsyncTask { protected GPXFile doInBackground(Void... nothing) { List favourites = asFavourites(app, gpxFile.getPoints(), fileName, forceImportFavourites); FavouritesDbHelper favoritesHelper = app.getFavorites(); + checkDuplicateNames(favourites); for (FavouritePoint favourite : favourites) { favoritesHelper.deleteFavourite(favourite, false); favoritesHelper.addFavourite(favourite, false); @@ -43,6 +44,27 @@ class FavoritesImportTask extends BaseImportAsyncTask { return null; } + public void checkDuplicateNames(List favourites) { + for (FavouritePoint fp : favourites) { + int number = 1; + String index; + String name = fp.getName(); + boolean duplicatesFound = false; + for (FavouritePoint fp2 : favourites) { + if (name.equals(fp2.getName()) && fp.getCategory().equals(fp2.getCategory()) && !fp.equals(fp2)) { + if (!duplicatesFound) { + index = " (" + number + ")"; + fp.setName(name + index); + } + duplicatesFound = true; + number++; + index = " (" + number + ")"; + fp2.setName(fp2.getName() + index); + } + } + } + } + @Override protected void onPostExecute(GPXFile result) { hideProgress(); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/MapDataMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/MapDataMenuController.java index 272975b987..ac6b8287b4 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/MapDataMenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/MapDataMenuController.java @@ -22,6 +22,7 @@ import net.osmand.plus.activities.LocalIndexHelper; import net.osmand.plus.activities.LocalIndexHelper.LocalIndexType; import net.osmand.plus.activities.LocalIndexInfo; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.activities.PluginsFragment; import net.osmand.plus.download.DownloadActivityType; import net.osmand.plus.download.DownloadIndexesThread; import net.osmand.plus.download.DownloadValidationManager; @@ -110,8 +111,7 @@ public class MapDataMenuController extends MenuController { activity.getString(R.string.activate_srtm_plugin), Toast.LENGTH_LONG).show(); } } else { - activity.startActivity(new Intent(activity, activity.getMyApplication().getAppCustomization() - .getPluginsActivity())); + PluginsFragment.showInstance(activity.getSupportFragmentManager()); Toast.makeText(activity, activity.getString(R.string.activate_srtm_plugin), Toast.LENGTH_SHORT).show(); } diff --git a/OsmAnd/src/net/osmand/plus/monitoring/MonitoringSettingsFragment.java b/OsmAnd/src/net/osmand/plus/monitoring/MonitoringSettingsFragment.java index 901348a6d3..ae35fd767c 100644 --- a/OsmAnd/src/net/osmand/plus/monitoring/MonitoringSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/monitoring/MonitoringSettingsFragment.java @@ -6,10 +6,13 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.text.SpannableString; import android.text.SpannableStringBuilder; +import android.view.LayoutInflater; +import android.view.View; import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; +import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmAndAppCustomization; import net.osmand.plus.OsmandPlugin; @@ -32,6 +35,7 @@ import net.osmand.plus.widgets.style.CustomTypefaceSpan; import java.util.HashMap; import java.util.LinkedHashMap; +import static net.osmand.plus.activities.PluginInfoFragment.PLUGIN_INFO; import static net.osmand.plus.settings.backend.OsmandSettings.MONTHLY_DIRECTORY; import static net.osmand.plus.settings.backend.OsmandSettings.REC_DIRECTORY; import static net.osmand.plus.monitoring.OsmandMonitoringPlugin.MINUTES; @@ -46,6 +50,35 @@ public class MonitoringSettingsFragment extends BaseSettingsFragment private static final String OPEN_TRACKS = "open_tracks"; private static final String SAVE_GLOBAL_TRACK_INTERVAL = "save_global_track_interval"; + boolean showSwitchProfile = false; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + 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 protected void setupPreferences() { setupSaveTrackToGpxPref(); diff --git a/OsmAnd/src/net/osmand/plus/monitoring/OsmandMonitoringPlugin.java b/OsmAnd/src/net/osmand/plus/monitoring/OsmandMonitoringPlugin.java index 94987d1c8a..ec255b1bbc 100644 --- a/OsmAnd/src/net/osmand/plus/monitoring/OsmandMonitoringPlugin.java +++ b/OsmAnd/src/net/osmand/plus/monitoring/OsmandMonitoringPlugin.java @@ -42,7 +42,7 @@ import net.osmand.plus.activities.SavingTrackHelper.SaveGpxResult; import net.osmand.plus.dashboard.tools.DashFragmentData; import net.osmand.plus.settings.backend.ApplicationMode; 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.views.OsmandMapLayer.DrawSettings; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.layers.MapInfoLayer; @@ -166,15 +166,9 @@ public class OsmandMonitoringPlugin extends OsmandPlugin { public static final int[] MINUTES = new int[] {2, 3, 5}; public static final int[] MAX_INTERVAL_TO_SEND_MINUTES = new int[] {1, 2, 5, 10, 15, 20, 30, 60, 90, 2 * 60, 3 * 60, 4 * 60, 6 * 60, 12 * 60, 24 * 60}; - @Override - public Class getSettingsActivity() { - return SettingsMonitoringActivity.class; - } - - @Override - public Class getSettingsFragment() { - return MonitoringSettingsFragment.class; + public SettingsScreenType getSettingsScreenType() { + return SettingsScreenType.MONITORING_SETTINGS; } @Override diff --git a/OsmAnd/src/net/osmand/plus/monitoring/SettingsMonitoringActivity.java b/OsmAnd/src/net/osmand/plus/monitoring/SettingsMonitoringActivity.java deleted file mode 100644 index 7ace6377ad..0000000000 --- a/OsmAnd/src/net/osmand/plus/monitoring/SettingsMonitoringActivity.java +++ /dev/null @@ -1,325 +0,0 @@ -package net.osmand.plus.monitoring; - - -import android.content.BroadcastReceiver; -import android.content.DialogInterface; -import android.content.Intent; -import android.graphics.Typeface; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; -import android.preference.PreferenceCategory; -import android.preference.PreferenceScreen; -import android.text.SpannableString; -import android.text.style.StyleSpan; -import android.util.TypedValue; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; - -import net.osmand.plus.OsmAndFormatter; -import net.osmand.plus.OsmAndTaskManager.OsmAndTaskRunnable; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.R; -import net.osmand.plus.UiUtilities; -import net.osmand.plus.activities.SavingTrackHelper; -import net.osmand.plus.activities.SettingsBaseActivity; -import net.osmand.plus.settings.backend.ApplicationMode; -import net.osmand.util.Algorithms; - -import java.util.Map; - -import static net.osmand.plus.settings.backend.OsmandSettings.MONTHLY_DIRECTORY; -import static net.osmand.plus.settings.backend.OsmandSettings.REC_DIRECTORY; - -public class SettingsMonitoringActivity extends SettingsBaseActivity { - - public static final String PROFILE_STRING_KEY = "string_key"; - - private CheckBoxPreference routeServiceEnabled; - private BroadcastReceiver broadcastReceiver; - - public static final int[] BG_SECONDS = new int[]{0, 30, 60, 90}; - public static final int[] BG_MINUTES = new int[]{2, 3, 5, 10, 15, 30, 60, 90}; - private static final int[] SECONDS = OsmandMonitoringPlugin.SECONDS; - private static final int[] MINUTES = OsmandMonitoringPlugin.MINUTES; - private static final int[] MAX_INTERVAL_TO_SEND_MINUTES = OsmandMonitoringPlugin.MAX_INTERVAL_TO_SEND_MINUTES; - - public SettingsMonitoringActivity() { - super(true); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - ((OsmandApplication) getApplication()).applyTheme(this); - requestWindowFeature(Window.FEATURE_PROGRESS); - super.onCreate(savedInstanceState); - setProgressVisibility(false); - getToolbar().setTitle(R.string.monitoring_settings); - PreferenceScreen grp = getPreferenceScreen(); - - createLoggingSection(grp); - createLiveSection(grp); - createNotificationSection(grp); - - Intent intent = getIntent(); - if (intent != null && intent.hasExtra(PROFILE_STRING_KEY)) { - String modeName = intent.getStringExtra(PROFILE_STRING_KEY); - selectedAppMode = ApplicationMode.valueOfStringKey(modeName, ApplicationMode.CAR); - } else { - selectAppModeDialog().show(); - } - } - - - private void createLoggingSection(PreferenceScreen grp) { - PreferenceCategory cat = new PreferenceCategory(this); - cat.setTitle(R.string.save_track_to_gpx_globally); - grp.addPreference(cat); - - Preference globalrecord = new Preference(this); - globalrecord.setTitle(R.string.save_track_to_gpx_globally_headline); - globalrecord.setSummary(R.string.save_track_to_gpx_globally_descr); - globalrecord.setSelectable(false); - //setEnabled(false) creates bad readability on some devices - //globalrecord.setEnabled(false); - cat.addPreference(globalrecord); - - if(settings.SAVE_GLOBAL_TRACK_REMEMBER.get()) { - cat.addPreference(createTimeListPreference(settings.SAVE_GLOBAL_TRACK_INTERVAL, SECONDS, - MINUTES, 1000, settings.SAVE_GLOBAL_TRACK_REMEMBER, R.string.save_global_track_interval, R.string.save_global_track_interval_descr)); - } - - Preference pref = new Preference(this); - pref.setTitle(R.string.save_current_track); - pref.setSummary(getMyApplication().getString(R.string.save_current_track_descr) - + " (" + OsmAndFormatter.getFormattedDistance(getMyApplication().getSavingTrackHelper().getDistance(), getMyApplication()) + ")"); - pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - SavingTrackHelper helper = getMyApplication().getSavingTrackHelper(); - if (helper.hasDataToSave()) { - saveCurrentTracks(helper); - } else { - helper.close(); - } - return true; - } - }); - cat.addPreference(pref); - - cat.addPreference(createCheckBoxPreference(settings.SAVE_TRACK_TO_GPX, R.string.save_track_to_gpx, - R.string.save_track_to_gpx_descrp)); - cat.addPreference(createTimeListPreference(settings.SAVE_TRACK_INTERVAL, SECONDS, - MINUTES, 1000, R.string.save_track_interval, R.string.save_track_interval_descr)); - String[] names; - Float[] floatValues; - floatValues = new Float[] {0.f, 2.0f, 5.0f, 10.0f, 20.0f, 30.0f, 50.0f}; - names = new String[floatValues.length]; - names[0] = getString(R.string.shared_string_not_selected); - for(int i = 1; i < floatValues.length; i++) { - names[i] = floatValues[i].intValue() + " " + getString(R.string.m); - } - cat.addPreference(createListPreference(settings.SAVE_TRACK_MIN_DISTANCE, names, floatValues, - R.string.save_track_min_distance, R.string.save_track_min_distance_descr)); - floatValues = new Float[] {0.f, 1.0f, 2.0f, 5.0f, 10.0f, 15.0f, 20.0f, 50.0f, 100.0f}; - names = new String[floatValues.length]; - names[0] = getString(R.string.shared_string_not_selected); - for(int i = 1; i < floatValues.length; i++) { - names[i] = floatValues[i].intValue() + " " + getString(R.string.m) + " (" + Math.round(floatValues[i]/0.3048f) + " " + getString(R.string.foot) + ")"; - } - cat.addPreference(createListPreference(settings.SAVE_TRACK_PRECISION, names, floatValues, - R.string.save_track_precision, R.string.save_track_precision_descr)); - floatValues = new Float[] {0.f, 0.000001f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f}; - names = new String[floatValues.length]; - names[0] = getString(R.string.shared_string_not_selected); - names[1] = "> 0"; // This option for the GPS chipset motion detection - for(int i = 2; i < floatValues.length; i++) { - names[i] = floatValues[i].intValue() + " " + getString(R.string.km_h); - floatValues[i] = floatValues[i] / 3.6f; - } - cat.addPreference(createListPreference(settings.SAVE_TRACK_MIN_SPEED, names, floatValues, - R.string.save_track_min_speed, R.string.save_track_min_speed_descr)); - cat.addPreference(createCheckBoxPreference(settings.AUTO_SPLIT_RECORDING, R.string.auto_split_recording_title, - R.string.auto_split_recording_descr)); - cat.addPreference(createCheckBoxPreference(settings.DISABLE_RECORDING_ONCE_APP_KILLED, R.string.disable_recording_once_app_killed, - R.string.disable_recording_once_app_killed_descrp)); - cat.addPreference(createCheckBoxPreference(settings.SAVE_HEADING_TO_GPX, R.string.save_heading, - R.string.save_heading_descr)); - - Integer[] intValues = new Integer[]{REC_DIRECTORY, MONTHLY_DIRECTORY}; - names = new String[intValues.length]; - names[0] = getString(R.string.store_tracks_in_rec_directory); - names[1] = getString(R.string.store_tracks_in_monthly_directories); -// names[2] = getString(R.string.store_tracks_in_daily_directories); - cat.addPreference(createListPreference(settings.TRACK_STORAGE_DIRECTORY, names, intValues, - R.string.track_storage_directory, R.string.track_storage_directory_descrp)); - } - - - private void createLiveSection(PreferenceScreen grp) { - PreferenceCategory cat; - cat = new PreferenceCategory(this); - cat.setTitle(R.string.live_monitoring_m); - grp.addPreference(cat); - - EditTextPreference urlPreference = createEditTextPreference(settings.LIVE_MONITORING_URL, R.string.live_monitoring_url, - R.string.live_monitoring_url_descr); - urlPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (Algorithms.isValidMessageFormat((String) newValue)) { - return SettingsMonitoringActivity.super.onPreferenceChange(preference, newValue); - } else { - Toast.makeText(SettingsMonitoringActivity.this, R.string.wrong_format, Toast.LENGTH_SHORT).show(); - return false; - } - } - }); - cat.addPreference(urlPreference); - final CheckBoxPreference liveMonitoring = createCheckBoxPreference(settings.LIVE_MONITORING, R.string.live_monitoring_m, - R.string.live_monitoring_m_descr); - cat.addPreference(liveMonitoring); - cat.addPreference(createTimeListPreference(settings.LIVE_MONITORING_INTERVAL, SECONDS, - MINUTES, 1000, R.string.live_monitoring_interval, R.string.live_monitoring_interval_descr)); - cat.addPreference(createTimeListPreference(settings.LIVE_MONITORING_MAX_INTERVAL_TO_SEND, null, - MAX_INTERVAL_TO_SEND_MINUTES, 1000, R.string.live_monitoring_max_interval_to_send, R.string.live_monitoring_max_interval_to_send_desrc)); - } - - private void createNotificationSection(PreferenceScreen grp) { - PreferenceCategory cat; - cat = new PreferenceCategory(this); - cat.setTitle(R.string.shared_string_notifications); - grp.addPreference(cat); - - final CheckBoxPreference tripRecording = createCheckBoxPreference(settings.SHOW_TRIP_REC_NOTIFICATION, R.string.trip_rec_notification_settings, - R.string.trip_rec_notification_settings_desc); - cat.addPreference(tripRecording); - } - - public void updateAllSettings() { - super.updateAllSettings(); - - if(routeServiceEnabled != null) { - routeServiceEnabled.setChecked(getMyApplication().getNavigationService() != null); - } - } - - private void saveCurrentTracks(final SavingTrackHelper helper) { - setProgressVisibility(true); - getMyApplication().getTaskManager().runInBackground(new OsmAndTaskRunnable() { - - @Override - protected Void doInBackground(Void... params) { - SavingTrackHelper helper = getMyApplication().getSavingTrackHelper(); - helper.saveDataToGpx(getMyApplication().getAppCustomization().getTracksDir()); - helper.close(); - return null; - } - @Override - protected void onPostExecute(Void result) { - setProgressVisibility(false); - } - - }, (Void) null); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - if(broadcastReceiver != null) { - unregisterReceiver(broadcastReceiver); - broadcastReceiver = null; - } - } - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - String prefId = preference.getKey(); - if (preference instanceof ListPreference) { - int ind = ((ListPreference) preference).findIndexOfValue((String) newValue); - CharSequence entry = ((ListPreference) preference).getEntries()[ind]; - Map map = getListPrefValues().get(prefId); - if (map != null) { - newValue = map.get(entry); - } - } - showConfirmDialog(prefId, newValue); - return false; - } - - protected void showConfirmDialog(final String prefId, final Object newValue) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - - String appModeName = selectedAppMode.toHumanString(); - String currentModeText = getString(R.string.apply_to_current_profile, appModeName); - int start = currentModeText.indexOf(appModeName); - - SpannableString[] strings = new SpannableString[2]; - strings[0] = new SpannableString(getString(R.string.apply_to_all_profiles)); - strings[1] = new SpannableString(currentModeText); - strings[1].setSpan(new StyleSpan(Typeface.BOLD), start, start + appModeName.length(), 0); - - final int[] icons = new int[2]; - icons[0] = R.drawable.ic_action_copy; - icons[1] = selectedAppMode.getIconRes(); - - final boolean nightMode = !settings.isLightContent(); - final OsmandApplication app = getMyApplication(); - final LayoutInflater themedInflater = UiUtilities.getInflater(this, nightMode); - - //set up dialog title - View dialogTitle = themedInflater.inflate(R.layout.bottom_sheet_item_simple, null); - dialogTitle.findViewById(R.id.icon).setVisibility(View.GONE); - TextView tvTitle = dialogTitle.findViewById(R.id.title); - tvTitle.setText(R.string.change_default_settings); - int textSize = (int) app.getResources().getDimension(R.dimen.dialog_header_text_size); - tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); - builder.setCustomTitle(dialogTitle); - - final ArrayAdapter singleChoiceAdapter = new ArrayAdapter(this, R.layout.bottom_sheet_item_simple, R.id.title, strings) { - @NonNull - @Override - public View getView(int position, View convertView, @NonNull ViewGroup parent) { - View v = convertView; - if (v == null) { - v = themedInflater.inflate(R.layout.bottom_sheet_item_simple, parent, false); - } - int activeColor = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light; - Drawable icon = app.getUIUtilities().getIcon(icons[position], activeColor); - ((TextView) v.findViewById(R.id.title)).setText(getItem(position)); - ((ImageView) v.findViewById(R.id.icon)).setImageDrawable(icon); - return v; - } - }; - - builder.setAdapter(singleChoiceAdapter, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == 0) { - settings.setPreferenceForAllModes(prefId, newValue); - } else { - settings.setPreference(prefId, newValue); - } - updateAllSettings(); - } - }); - - builder.setNegativeButton(R.string.discard_changes, null); - AlertDialog dialog = builder.create(); - dialog.getListView().setDividerHeight(0); - dialog.show(); - } -} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingFragment.java b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingFragment.java index 4c5ed73b07..daaeb6d034 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingFragment.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingFragment.java @@ -1,5 +1,6 @@ package net.osmand.plus.osmedit; +import android.content.Context; import android.content.Intent; import android.graphics.Typeface; import android.graphics.drawable.Drawable; @@ -7,31 +8,50 @@ import android.os.Bundle; import android.text.SpannableString; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.widget.TextView; import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceViewHolder; -import net.osmand.plus.settings.backend.OsmAndAppCustomization; +import net.osmand.PlatformUtil; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.FontCache; +import net.osmand.plus.osmedit.oauth.OsmOAuthAuthorizationAdapter; +import net.osmand.plus.settings.backend.OsmAndAppCustomization; +import net.osmand.plus.settings.bottomsheets.OsmLoginDataBottomSheet; import net.osmand.plus.settings.fragments.BaseSettingsFragment; import net.osmand.plus.settings.fragments.OnPreferenceChanged; -import net.osmand.plus.settings.bottomsheets.OsmLoginDataBottomSheet; import net.osmand.plus.settings.preferences.SwitchPreferenceEx; import net.osmand.plus.widgets.style.CustomTypefaceSpan; +import org.apache.commons.logging.Log; + import static net.osmand.plus.myplaces.FavoritesActivity.TAB_ID; import static net.osmand.plus.osmedit.OsmEditingPlugin.OSM_EDIT_TAB; public class OsmEditingFragment extends BaseSettingsFragment implements OnPreferenceChanged { + private static final Log log = PlatformUtil.getLog(OsmEditingFragment.class); + private static final String OSM_EDITING_INFO = "osm_editing_info"; private static final String OPEN_OSM_EDITS = "open_osm_edits"; private static final String OSM_LOGIN_DATA = "osm_login_data"; + private static final String OSM_OAUTH_SUCCESS = "osm_oauth_success"; + private static final String OSM_OAUTH_CLEAR = "osm_oauth_clear"; + private static final String OSM_OAUTH_LOGIN = "osm_oauth_login"; + + private OsmOAuthAuthorizationAdapter client; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + client = new OsmOAuthAuthorizationAdapter(app); + } @Override protected void setupPreferences() { @@ -42,6 +62,7 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer setupOfflineEditingPref(); setupOsmEditsDescrPref(); setupOsmEditsPref(); + setupOAuthPrefs(); } @Override @@ -73,7 +94,7 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer Drawable enabled = getActiveIcon(R.drawable.ic_world_globe_dark); Drawable icon = getPersistentPrefIcon(enabled, disabled); - SwitchPreferenceEx offlineEditingPref = (SwitchPreferenceEx) findPreference(settings.OFFLINE_EDITION.getId()); + SwitchPreferenceEx offlineEditingPref = findPreference(settings.OFFLINE_EDITION.getId()); offlineEditingPref.setDescription(getString(R.string.offline_edition_descr)); offlineEditingPref.setIcon(icon); } @@ -101,9 +122,37 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer createProfile.setIcon(getActiveIcon(R.drawable.ic_action_folder)); } + private void setupOAuthPrefs() { + Context ctx = getContext(); + if (ctx != null) { + PreferenceScreen screen = getPreferenceScreen(); + if (client.isValidToken()) { + Preference prefOAuth = new Preference(ctx); + prefOAuth.setTitle(R.string.osm_authorization_success); + prefOAuth.setSummary(R.string.osm_authorization_success); + prefOAuth.setKey(OSM_OAUTH_SUCCESS); + + Preference prefClearToken = new Preference(ctx); + prefClearToken.setTitle(R.string.shared_string_logoff); + prefClearToken.setSummary(R.string.clear_osm_token); + prefClearToken.setKey(OSM_OAUTH_CLEAR); + + screen.addPreference(prefOAuth); + screen.addPreference(prefClearToken); + } else { + Preference prefOAuth = new Preference(ctx); + prefOAuth.setTitle(R.string.perform_oauth_authorization); + prefOAuth.setSummary(R.string.perform_oauth_authorization_description); + prefOAuth.setKey(OSM_OAUTH_LOGIN); + screen.addPreference(prefOAuth); + } + } + } + @Override public boolean onPreferenceClick(Preference preference) { - if (OPEN_OSM_EDITS.equals(preference.getKey())) { + String prefId = preference.getKey(); + if (OPEN_OSM_EDITS.equals(prefId)) { Bundle bundle = new Bundle(); bundle.putInt(TAB_ID, OSM_EDIT_TAB); @@ -113,12 +162,29 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer favorites.putExtra(MapActivity.INTENT_PARAMS, bundle); startActivity(favorites); return true; - } else if (OSM_LOGIN_DATA.equals(preference.getKey())) { + } else if (OSM_LOGIN_DATA.equals(prefId)) { FragmentManager fragmentManager = getFragmentManager(); if (fragmentManager != null) { OsmLoginDataBottomSheet.showInstance(fragmentManager, OSM_LOGIN_DATA, this, false, getSelectedAppMode()); return true; } + } else if (OSM_OAUTH_CLEAR.equals(prefId)) { + settings.USER_ACCESS_TOKEN.set(""); + settings.USER_ACCESS_TOKEN_SECRET.set(""); + + client.resetToken(); + client = new OsmOAuthAuthorizationAdapter(app); + + app.showShortToastMessage(R.string.osm_edit_logout_success); + updateAllSettings(); + return true; + } else if (OSM_OAUTH_LOGIN.equals(prefId)) { + View view = getView(); + if (view != null) { + ViewGroup appBarLayout = view.findViewById(R.id.appbar); + client.startOAuth(appBarLayout); + } + return true; } return super.onPreferenceClick(preference); } @@ -130,4 +196,11 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer nameAndPasswordPref.setSummary(settings.USER_NAME.get()); } } + + public void authorize(String oauthVerifier) { + if (client != null) { + client.authorize(oauthVerifier); + } + updateAllSettings(); + } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingPlugin.java b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingPlugin.java index 5030530f88..ea779a93b1 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingPlugin.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingPlugin.java @@ -13,9 +13,11 @@ import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; + import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; + import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; import net.osmand.data.Amenity; @@ -23,13 +25,11 @@ import net.osmand.data.MapObject; import net.osmand.data.TransportStop; import net.osmand.osm.PoiType; import net.osmand.osm.edit.Entity; -import net.osmand.plus.*; +import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuAdapter.ItemClickListener; import net.osmand.plus.ContextMenuItem; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; -import net.osmand.plus.settings.backend.OsmandPreference; -import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.activities.EnumAdapter; import net.osmand.plus.activities.EnumAdapter.IEnumWithResource; @@ -42,16 +42,21 @@ import net.osmand.plus.myplaces.AvailableGPXFragment.GpxInfo; import net.osmand.plus.myplaces.FavoritesActivity; import net.osmand.plus.osmedit.OsmPoint.Action; import net.osmand.plus.quickaction.QuickActionType; +import net.osmand.plus.settings.backend.OsmandPreference; 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.views.OsmandMapTileView; import net.osmand.util.Algorithms; + import org.apache.commons.logging.Log; import java.util.ArrayList; import java.util.List; -import static net.osmand.aidlapi.OsmAndCustomizationConstants.*; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_CREATE_POI; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_OPEN_OSM_NOTE; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.OSM_EDITS; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.OSM_NOTES; import static net.osmand.plus.ContextMenuAdapter.makeDeleteAction; @@ -193,13 +198,8 @@ public class OsmEditingPlugin extends OsmandPlugin { } @Override - public Class getSettingsActivity() { - return SettingsOsmEditingActivity.class; - } - - @Override - public Class getSettingsFragment() { - return OsmEditingFragment.class; + public SettingsScreenType getSettingsScreenType() { + return SettingsScreenType.OPEN_STREET_MAP_EDITING; } @Override diff --git a/OsmAnd/src/net/osmand/plus/osmedit/SettingsOsmEditingActivity.java b/OsmAnd/src/net/osmand/plus/osmedit/SettingsOsmEditingActivity.java deleted file mode 100644 index 1be623825b..0000000000 --- a/OsmAnd/src/net/osmand/plus/osmedit/SettingsOsmEditingActivity.java +++ /dev/null @@ -1,189 +0,0 @@ -package net.osmand.plus.osmedit; - - -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.StrictMode; -import android.preference.CheckBoxPreference; -import android.preference.DialogPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; -import android.preference.PreferenceScreen; -import android.util.AttributeSet; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; -import android.widget.Toast; -import com.github.scribejava.core.model.OAuthAsyncRequestCallback; -import com.github.scribejava.core.model.Response; -import net.osmand.PlatformUtil; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.OsmandPlugin; -import net.osmand.plus.R; -import net.osmand.plus.activities.SettingsBaseActivity; -import net.osmand.plus.osmedit.oauth.OsmOAuthAuthorizationAdapter; -import net.osmand.plus.settings.backend.OsmAndAppCustomization; -import org.apache.commons.logging.Log; - -import java.io.IOException; - -public class SettingsOsmEditingActivity extends SettingsBaseActivity { - private OsmOAuthAuthorizationAdapter client; - private static final Log log = PlatformUtil.getLog(SettingsOsmEditingActivity.class); - - @Override - public void onCreate(Bundle savedInstanceState) { - StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() - .detectDiskReads() - .detectDiskWrites() - .detectNetwork() - .penaltyLog() - .build()); - - ((OsmandApplication) getApplication()).applyTheme(this); - super.onCreate(savedInstanceState); - - client = new OsmOAuthAuthorizationAdapter(getMyApplication()); - - getToolbar().setTitle(R.string.osm_settings); - @SuppressWarnings("deprecation") - PreferenceScreen grp = getPreferenceScreen(); - - DialogPreference loginDialogPreference = new OsmLoginDataDialogPreference(this, null); - grp.addPreference(loginDialogPreference); - - CheckBoxPreference poiEdit = createCheckBoxPreference(settings.OFFLINE_EDITION, - R.string.offline_edition, R.string.offline_edition_descr); - grp.addPreference(poiEdit); - - final Preference pref = new Preference(this); - pref.setTitle(R.string.local_openstreetmap_settings); - pref.setSummary(R.string.local_openstreetmap_settings_descr); - pref.setKey("local_openstreetmap_points"); - pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - OsmAndAppCustomization appCustomization = getMyApplication().getAppCustomization(); - final Intent favorites = new Intent(SettingsOsmEditingActivity.this, - appCustomization.getFavoritesActivity()); - favorites.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); - getMyApplication().getSettings().FAVORITES_TAB.set(R.string.osm_edits); - startActivity(favorites); - return true; - } - }); - grp.addPreference(pref); - - final Preference prefOAuth = new Preference(this); - if (client.isValidToken()){ - prefOAuth.setTitle(R.string.osm_authorization_success); - prefOAuth.setSummary(R.string.osm_authorization_success); - prefOAuth.setKey("local_openstreetmap_oauth_success"); - final Preference prefClearToken = new Preference(this); - prefClearToken.setTitle(R.string.shared_string_logoff); - prefClearToken.setSummary(R.string.clear_osm_token); - prefClearToken.setKey("local_openstreetmap_oauth_clear"); - prefClearToken.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - settings.USER_ACCESS_TOKEN.set(""); - settings.USER_ACCESS_TOKEN_SECRET.set(""); - client.resetToken(); - Toast.makeText(SettingsOsmEditingActivity.this, R.string.osm_edit_logout_success, Toast.LENGTH_SHORT).show(); - finish(); - startActivity(getIntent()); - return true; - } - }); - grp.addPreference(prefClearToken); - } - else { - prefOAuth.setTitle(R.string.perform_oauth_authorization); - prefOAuth.setSummary(R.string.perform_oauth_authorization_description); - prefOAuth.setKey("local_openstreetmap_oauth_login"); - prefOAuth.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - ViewGroup preferenceView = (ViewGroup)getListView().getChildAt(preference.getOrder()); - client.startOAuth(preferenceView); - return true; - } - }); - } - grp.addPreference(prefOAuth); - } - - public class OsmLoginDataDialogPreference extends DialogPreference { - private TextView userNameEditText; - private TextView passwordEditText; - - public OsmLoginDataDialogPreference(Context context, AttributeSet attrs) { - super(context, attrs); - - setDialogLayoutResource(R.layout.osm_user_login_details); - setPositiveButtonText(android.R.string.ok); - setNegativeButtonText(android.R.string.cancel); - setDialogTitle(R.string.open_street_map_login_and_pass); - - setTitle(R.string.open_street_map_login_and_pass); - setSummary(R.string.open_street_map_login_descr); - - setDialogIcon(null); - } - - @Override - protected void onBindDialogView(View view) { - userNameEditText = (TextView) view.findViewById(R.id.user_name_field); - userNameEditText.setText(settings.USER_NAME.get()); - passwordEditText = (TextView) view.findViewById(R.id.password_field); - passwordEditText.setText(settings.USER_PASSWORD.get()); - super.onBindDialogView(view); - } - - @Override - protected void onDialogClosed(boolean positiveResult) { - if (positiveResult) { - settings.USER_NAME.set(userNameEditText.getText().toString()); - settings.USER_PASSWORD.set(passwordEditText.getText().toString()); - new ValidateOsmLoginDetailsTask(SettingsOsmEditingActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - } - } - - public static class ValidateOsmLoginDetailsTask extends AsyncTask { - private final Context context; - - public ValidateOsmLoginDetailsTask(Context context) { - this.context = context; - } - - @Override - protected OsmBugsUtil.OsmBugResult doInBackground(Void... params) { - OsmEditingPlugin plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class); - assert plugin != null; - OsmBugsRemoteUtil remoteUtil = plugin.getOsmNotesRemoteUtil(); - return remoteUtil.validateLoginDetails(); - } - - @Override - protected void onPostExecute(OsmBugsUtil.OsmBugResult osmBugResult) { - String text = osmBugResult.warning != null ? osmBugResult.warning : context.getString(R.string.osm_authorization_success); - Toast.makeText(context, text, Toast.LENGTH_LONG).show(); - } - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - Uri uri = intent.getData(); - if (uri != null && uri.toString().startsWith("osmand-oauth")) { - String oauthVerifier = uri.getQueryParameter("oauth_verifier"); - client.authorize(oauthVerifier); - finish(); - startActivity(getIntent()); - } - } -} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/osmedit/ValidateOsmLoginDetailsTask.java b/OsmAnd/src/net/osmand/plus/osmedit/ValidateOsmLoginDetailsTask.java new file mode 100644 index 0000000000..722f104c51 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/osmedit/ValidateOsmLoginDetailsTask.java @@ -0,0 +1,34 @@ +package net.osmand.plus.osmedit; + +import android.os.AsyncTask; + +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandPlugin; +import net.osmand.plus.R; +import net.osmand.plus.osmedit.OsmBugsUtil.OsmBugResult; + +public class ValidateOsmLoginDetailsTask extends AsyncTask { + + private OsmandApplication app; + + public ValidateOsmLoginDetailsTask(OsmandApplication app) { + this.app = app; + } + + @Override + protected OsmBugResult doInBackground(Void... params) { + OsmEditingPlugin plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class); + assert plugin != null; + OsmBugsRemoteUtil remoteUtil = plugin.getOsmNotesRemoteUtil(); + return remoteUtil.validateLoginDetails(); + } + + @Override + protected void onPostExecute(OsmBugResult osmBugResult) { + if (osmBugResult.warning != null) { + app.showToastMessage(osmBugResult.warning); + } else { + app.showToastMessage(R.string.osm_authorization_success); + } + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomization.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomization.java index b915823810..7795f943ba 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomization.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomization.java @@ -27,12 +27,11 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; -import net.osmand.plus.activities.PluginsActivity; import net.osmand.plus.activities.SettingsActivity; import net.osmand.plus.activities.TrackActivity; import net.osmand.plus.download.DownloadActivity; -import net.osmand.plus.importfiles.ImportHelper; import net.osmand.plus.helpers.WaypointHelper; +import net.osmand.plus.importfiles.ImportHelper; import net.osmand.plus.myplaces.FavoritesActivity; import net.osmand.plus.routing.RouteCalculationResult; import net.osmand.plus.views.OsmandMapTileView; @@ -195,10 +194,6 @@ public class OsmAndAppCustomization { return DownloadActivity.class; } - public Class getPluginsActivity() { - return PluginsActivity.class; - } - public Class getDownloadActivity() { return DownloadActivity.class; } diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/OsmLoginDataBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/OsmLoginDataBottomSheet.java index 37e993cf43..2b7494f0a4 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/OsmLoginDataBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/OsmLoginDataBottomSheet.java @@ -12,13 +12,13 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; +import net.osmand.plus.osmedit.ValidateOsmLoginDetailsTask; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; -import net.osmand.plus.osmedit.SettingsOsmEditingActivity; import net.osmand.plus.settings.fragments.OnPreferenceChanged; public class OsmLoginDataBottomSheet extends BasePreferenceBottomSheet { @@ -84,7 +84,7 @@ public class OsmLoginDataBottomSheet extends BasePreferenceBottomSheet { app.getSettings().USER_NAME.set(userNameEditText.getText().toString()); app.getSettings().USER_PASSWORD.set(passwordEditText.getText().toString()); - new SettingsOsmEditingActivity.ValidateOsmLoginDetailsTask(app).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new ValidateOsmLoginDetailsTask(app).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); Fragment target = getTargetFragment(); Preference preference = getPreference(); diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/BaseSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/BaseSettingsFragment.java index 86940e7d7a..db12e7d781 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/BaseSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/BaseSettingsFragment.java @@ -53,11 +53,7 @@ import com.google.android.material.snackbar.Snackbar; import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; import net.osmand.access.AccessibilitySettingsFragment; -import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.settings.backend.OsmandPreference; -import net.osmand.plus.settings.backend.OsmandSettings; -import net.osmand.plus.settings.backend.CommonPreference; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.MapActivity; @@ -69,6 +65,10 @@ import net.osmand.plus.monitoring.MonitoringSettingsFragment; import net.osmand.plus.osmedit.OsmEditingFragment; import net.osmand.plus.profiles.SelectAppModesBottomSheetDialogFragment; import net.osmand.plus.profiles.SelectAppModesBottomSheetDialogFragment.AppModeChangedListener; +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.backend.OsmandSettings; import net.osmand.plus.settings.bottomsheets.BooleanPreferenceBottomSheet; import net.osmand.plus.settings.bottomsheets.ChangeGeneralProfilesPrefBottomSheet; import net.osmand.plus.settings.bottomsheets.EditTextPreferenceBottomSheet; @@ -112,7 +112,7 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl public enum SettingsScreenType { - MAIN_SETTINGS(MainSettingsFragment.TAG, false, null, R.xml.settings_main_screen, R.layout.global_preference_toolbar), + MAIN_SETTINGS(MainSettingsFragment.class.getName(), false, null, R.xml.settings_main_screen, R.layout.global_preference_toolbar), GLOBAL_SETTINGS(GlobalSettingsFragment.class.getName(), false, null, R.xml.global_settings, R.layout.global_preference_toolbar), CONFIGURE_PROFILE(ConfigureProfileFragment.class.getName(), true, null, R.xml.configure_profile, R.layout.profile_preference_toolbar_with_switch), PROXY_SETTINGS(ProxySettingsFragment.class.getName(), false, null, R.xml.proxy_preferences, R.layout.global_preferences_toolbar_with_switch), @@ -899,9 +899,13 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl } public static boolean showInstance(FragmentActivity activity, SettingsScreenType screenType, @Nullable ApplicationMode appMode) { + return showInstance(activity, screenType, null, new Bundle()); + } + + public static boolean showInstance(FragmentActivity activity, SettingsScreenType screenType, + @Nullable ApplicationMode appMode, @NonNull Bundle args) { try { Fragment fragment = Fragment.instantiate(activity, screenType.fragmentName); - Bundle args = new Bundle(); if (appMode != null) { args.putString(APP_MODE_KEY, appMode.getStringKey()); } diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/ConfigureMenuRootFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/ConfigureMenuRootFragment.java index 330f1c0a18..beb1711f31 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/ConfigureMenuRootFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/ConfigureMenuRootFragment.java @@ -1,7 +1,6 @@ package net.osmand.plus.settings.fragments; import android.app.Activity; -import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; @@ -22,13 +21,13 @@ import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; -import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuItem; import net.osmand.plus.OsmandApplication; @@ -36,14 +35,14 @@ import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivityActions; -import net.osmand.plus.activities.PluginsActivity; +import net.osmand.plus.activities.PluginsFragment; import net.osmand.plus.base.BaseOsmAndFragment; import net.osmand.plus.dialogs.ConfigureMapMenu; import net.osmand.plus.helpers.FontCache; import net.osmand.plus.mapcontextmenu.MapContextMenu; +import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.widgets.style.CustomTypefaceSpan; - import org.apache.commons.logging.Log; import java.util.ArrayList; @@ -229,8 +228,7 @@ public class ConfigureMenuRootFragment extends BaseOsmAndFragment { if (holder instanceof DescriptionHolder) { DescriptionHolder descriptionHolder = (DescriptionHolder) holder; String plugins = getString(R.string.prefs_plugins); - setupClickableText( - descriptionHolder.description, (String) currentItem, plugins, new Intent(app, PluginsActivity.class)); + setupClickableText(descriptionHolder.description, (String) currentItem, plugins); descriptionHolder.image.setVisibility(View.GONE); } else { final ScreenType item = (ScreenType) currentItem; @@ -253,12 +251,15 @@ public class ConfigureMenuRootFragment extends BaseOsmAndFragment { return items.size(); } - private void setupClickableText(TextView textView, String text, String clickableText, final Intent intent) { + private void setupClickableText(TextView textView, String text, String clickableText) { SpannableString spannableString = new SpannableString(text); ClickableSpan clickableSpan = new ClickableSpan() { @Override public void onClick(@NonNull View view) { - startActivity(intent); + FragmentActivity activity = getActivity(); + if (activity != null) { + PluginsFragment.showInstance(activity.getSupportFragmentManager()); + } } }; try { diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/ConfigureProfileFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/ConfigureProfileFragment.java index cf85188e0c..672229d953 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/ConfigureProfileFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/ConfigureProfileFragment.java @@ -369,7 +369,7 @@ public class ConfigureProfileFragment extends BaseSettingsFragment implements Co } List plugins = OsmandPlugin.getVisiblePlugins(); for (OsmandPlugin plugin : plugins) { - if (plugin instanceof SkiMapsPlugin || plugin instanceof NauticalMapsPlugin || plugin.getSettingsFragment() == null) { + if (plugin instanceof SkiMapsPlugin || plugin instanceof NauticalMapsPlugin || plugin.getSettingsScreenType() == null) { continue; } Preference preference = new Preference(ctx); @@ -379,7 +379,7 @@ public class ConfigureProfileFragment extends BaseSettingsFragment implements Co preference.setSummary(plugin.getPrefsDescription()); preference.setIcon(getContentIcon(plugin.getLogoResourceId())); preference.setLayoutResource(R.layout.preference_with_descr); - preference.setFragment(plugin.getSettingsFragment().getName()); + preference.setFragment(plugin.getSettingsScreenType().fragmentName); preferenceCategory.addPreference(preference); }