diff --git a/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java b/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java index 3ef6a54652..14d0abab79 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java @@ -41,6 +41,7 @@ public class Amenity extends MapObject { public static final String OSM_DELETE_TAG = "osmand_change"; public static final String IMAGE_TITLE = "image_title"; public static final String IS_PART = "is_part"; + public static final String IS_PARENT_OF = "is_parent_of"; public static final String IS_AGGR_PART = "is_aggr_part"; public static final String CONTENT_JSON = "content_json"; public static final String ROUTE_ID = "route_id"; diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java index 4df69c3adc..44c48f69ec 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java @@ -1189,6 +1189,7 @@ public class RouteResultPreparation { RouteSegmentResult last = rr; RouteSegmentResult firstRoundabout = rr; RouteSegmentResult lastRoundabout = rr; + for (int j = i; j < result.size(); j++) { RouteSegmentResult rnext = result.get(j); last = rnext; @@ -1215,12 +1216,12 @@ public class RouteResultPreparation { TurnType t = TurnType.getExitTurn(exit, 0, leftSide); // usually covers more than expected float turnAngleBasedOnOutRoads = (float) MapUtils.degreesDiff(last.getBearingBegin(), prev.getBearingEnd()); - // usually covers less than expected float turnAngleBasedOnCircle = (float) -MapUtils.degreesDiff(firstRoundabout.getBearingBegin(), lastRoundabout.getBearingEnd() + 180); - if(Math.abs(turnAngleBasedOnOutRoads - turnAngleBasedOnCircle) > 180) { - t.setTurnAngle(turnAngleBasedOnCircle ) ; + if (Math.abs(turnAngleBasedOnOutRoads) > 120) { + // correctly identify if angle is +- 180, so we approach from left or right side + t.setTurnAngle(turnAngleBasedOnCircle) ; } else { - t.setTurnAngle((turnAngleBasedOnCircle + turnAngleBasedOnOutRoads) / 2) ; + t.setTurnAngle(turnAngleBasedOnOutRoads) ; } return t; } diff --git a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java index 37c16393fa..0e542891d8 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java @@ -954,17 +954,15 @@ public class SearchUICore { break; } case COMPARE_AMENITY_TYPE_ADDITIONAL: { - if(o1.object instanceof AbstractPoiType && o2.object instanceof AbstractPoiType ) { - boolean additional1 = ((AbstractPoiType) o1.object).isAdditional(); - boolean additional2 = ((AbstractPoiType) o2.object).isAdditional(); - if (additional1 != additional2) { - // -1 - means 1st is less than 2nd - return additional1 ? 1 : -1; - } + boolean additional1 = o1.object instanceof AbstractPoiType && ((AbstractPoiType) o1.object).isAdditional(); + boolean additional2 = o2.object instanceof AbstractPoiType && ((AbstractPoiType) o2.object).isAdditional(); + if (additional1 != additional2) { + // -1 - means 1st is less than 2nd + return additional1 ? 1 : -1; } break; } - case COMPARE_DISTANCE_TO_PARENT_SEARCH_RESULT: + case COMPARE_DISTANCE_TO_PARENT_SEARCH_RESULT: double ps1 = o1.parentSearchResult == null ? 0 : o1.parentSearchResult.getSearchDistance(c.loc); double ps2 = o2.parentSearchResult == null ? 0 : o2.parentSearchResult.getSearchDistance(c.loc); if (ps1 != ps2) { @@ -1042,12 +1040,17 @@ public class SearchUICore { @Override public int compare(SearchResult o1, SearchResult o2) { - for(ResultCompareStep step : ResultCompareStep.values()) { + List steps = new ArrayList<>(); + for (ResultCompareStep step : ResultCompareStep.values()) { int r = step.compare(o1, o2, this); - if(r != 0) { + steps.add(step); + if (r != 0) { + // debug crashes and identify non-transitive comparision + // LOG.debug(String.format("%d: %s o1='%s' o2='%s'", r, steps, o1, o2)); return r; } } + // LOG.debug(String.format("EQUAL: o1='%s' o2='%s'", o1, o2)); return 0; } diff --git a/OsmAnd/res/layout/bottom_sheet_with_switch_divider_and_additional_button.xml b/OsmAnd/res/layout/bottom_sheet_with_switch_divider_and_additional_button.xml index f0ff17170d..681c03e560 100644 --- a/OsmAnd/res/layout/bottom_sheet_with_switch_divider_and_additional_button.xml +++ b/OsmAnd/res/layout/bottom_sheet_with_switch_divider_and_additional_button.xml @@ -1,12 +1,16 @@ + android:paddingStart="@dimen/content_padding" + android:paddingEnd="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding"> @@ -40,8 +46,8 @@ android:layout_gravity="center_vertical" android:layout_marginStart="@dimen/bottom_sheet_content_margin" android:layout_marginLeft="@dimen/bottom_sheet_content_margin" - android:layout_marginEnd="@dimen/content_padding_half" - android:layout_marginRight="@dimen/content_padding_half" + android:layout_marginEnd="@dimen/bottom_sheet_content_margin" + android:layout_marginRight="@dimen/bottom_sheet_content_margin" tools:checked="true" /> @@ -62,11 +68,11 @@ diff --git a/OsmAnd/res/layout/trip_recording_fragment.xml b/OsmAnd/res/layout/trip_recording_fragment.xml index a460193cd5..8c43e98d5f 100644 --- a/OsmAnd/res/layout/trip_recording_fragment.xml +++ b/OsmAnd/res/layout/trip_recording_fragment.xml @@ -1,89 +1,114 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:osmand="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> - + - + - + - + - + - + + - - + - + - + + + + diff --git a/OsmAnd/res/values-ar/phrases.xml b/OsmAnd/res/values-ar/phrases.xml index 398583adbf..86450cf7d9 100644 --- a/OsmAnd/res/values-ar/phrases.xml +++ b/OsmAnd/res/values-ar/phrases.xml @@ -3669,4 +3669,10 @@ محطة نقل نفايات ميزان المركبات مكتب الحارس + خدمات المواطن + تأشيرات الهجرة + تأشيرات لغير المهاجرين + اتصال + قنصلية + سفارة \ No newline at end of file diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 9bd65acc41..ef68e3055c 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -4035,4 +4035,32 @@ تحرير المسار تسمية المسار تغيير المجلد + ثانية + تمرير + طريقة + تحضير طويل + إعداد + إيقاف المسار + الوصول إلى الوجهة + منعطف + الوقت والمسافة + وقت الإعلان عن مختلف المطالبات الصوتية يعتمد على نوع موجه، وسرعة التنقل الحالية وسرعة التنقل الافتراضية. + وقت الإعلان + بدء التسجيل + عرض المسار على الخريطة + منحدرات + مشي + مشي + ركوب الدراجات الكهربائية + ركوب الدراجات الجبلية + ركوب الدراجات على الطرق + ركوب الدراجات + مركبات الحمولة الثقيلة + شاحنة صغيرة + شاحنة + سكوتر + سباق الدراجات + MTB + خطأ في الخادم: %1$s + الاسم موجود بالفعل \ No newline at end of file diff --git a/OsmAnd/res/values-cs/strings.xml b/OsmAnd/res/values-cs/strings.xml index 6f001d5965..8ad497f92c 100644 --- a/OsmAnd/res/values-cs/strings.xml +++ b/OsmAnd/res/values-cs/strings.xml @@ -3972,4 +3972,32 @@ Editovat stopu Přejmenovat stopu Změnit složku + sek. + Míjení + Přiblížení + Dlouhá příprava + Příprava + Odchýlení od trasy + Dosažení cíle + Odbočit + Intervaly času a vzdálenosti + Čas oznámení různých hlasových pokynů závisí na typu pokynu, aktuální rychlosti navigace a výchozí rychlosti navigace. + Čas oznámení + Spustit záznam + Zobrazit stopu na mapě + Invalidní vozík + Turistika + Chůze + Jízda na elektrokole + Horská cyklistika + Silniční cyklistika + Běžná cyklistika + Nákladní auto + Malé nákladní auto + Kamion + Skútr + Závodní kolo + Horské kolo + Chyba serveru: %1$s + Název již existuje \ No newline at end of file diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 494ad991ff..6d53fd5262 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -3977,4 +3977,25 @@ Track editieren Track umbenennen Ordner ändern + Abbiegung + Zeit- und Distanzintervalle + Der Ansagezeitpunkt der verschiedenen Sprachansagen hängt vom Ansagetyp, der aktuellen Navigationsgeschwindigkeit und der Standard-Navigationsgeschwindigkeit ab. + Ansagezeitpunkt + Aufzeichnung starten + Track auf der Karte anzeigen + Rollstuhl + Wandern + Fußgänger + E-Bike fahren + Straßenradsport + Bergradsport + Normales Radfahren + Lkw + Kleintransporter + Lkw + Motorroller + Rennrad + Mountainbike + Server-Fehler: %1$s + Der Name ist bereits vorhanden \ No newline at end of file diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index db0a01c2ab..ab5f495fee 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -3972,4 +3972,21 @@ Redakti spuron Renomi spuron Ŝanĝi dosierujon + Kamioneto + Kamiono + Skotero + Biciklo vetkura + Montbiciklo + Servila eraro: %1$s + Tiu ĉi nomo jam estas uzata + Ekigi registri + Montri kurson sur mapo + Rulseĝo + Marŝado + Irado + Elektra biciklado + Montara biciklado + Ŝosea biciklado + Kutima biciklado + Peza kamiono \ No newline at end of file diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index 799a1f7e8a..15fb02f566 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -3975,4 +3975,32 @@ Editar traza Renombrar traza Cambiar carpeta + seg + Pasando + Acercarse + Preparación larga + Preparar + Fuera de la ruta + Has llegado al destino + Giro + Intervalos de tiempo y distancia + El tiempo de anuncio de las diferentes indicaciones por voz depende del tipo de mensaje, la velocidad de navegación actual y la velocidad de navegación predefinida. + Tiempo de anuncio + Iniciar grabación + Mostrar traza en el mapa + Silla de ruedas + Senderismo + Peatón + Ciclismo eléctrico + Ciclismo de montaña + Ciclismo de ruta + Ciclismo regular + Vehículos pesados + Camión pequeño + Camión + Motoneta + Bicicleta de carreras + Bicicleta de montaña + Error de servidor: %1$s + El nombre ya existe \ No newline at end of file diff --git a/OsmAnd/res/values-et/phrases.xml b/OsmAnd/res/values-et/phrases.xml index 684815e89c..94a665876a 100644 --- a/OsmAnd/res/values-et/phrases.xml +++ b/OsmAnd/res/values-et/phrases.xml @@ -643,7 +643,7 @@ Jet A-1 kütus Mäekuru Paatide bensiinijaam - Laadimisjaam + Laadimisjaam;Elektriautode laadimisjaam;Elektriauto laadimine;Laadimispunkt;Elektriautode laadimispunkt Parvlaev Üheksa kurikaga keegel Kümne kurikaga keegel @@ -3877,4 +3877,8 @@ Ei Jäätmejaam Avalik pesumaja + Ujumiskoht + Tunnel nahkhiirtele + Sild nahkhiirtele + Metsloomade teeületuskoht \ No newline at end of file diff --git a/OsmAnd/res/values-et/strings.xml b/OsmAnd/res/values-et/strings.xml index 2ccf7cc2fe..5068575a75 100644 --- a/OsmAnd/res/values-et/strings.xml +++ b/OsmAnd/res/values-et/strings.xml @@ -3946,4 +3946,6 @@ Pööra kõik punktid ümber Vali rakenduse käivitamisel kasutatav profiil. Viimati kasutatud + Serveri viga: %1$s + Selline nimi on juba olemas \ No newline at end of file diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index e5f41539c2..e861227156 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -3957,4 +3957,27 @@ Sélectionnez le dossier Sélectionnez un dossier ou créez-en un nouveau Vide + Approche + Préparation + Longue préparation + Arrivé à destination + Tourner + Afficher la trace sur la carte + Trottinette + Camionnette + Envoyer vers OpenStreetMap + Modifier la trace + Renommer la trace + Modifier le dossier + sec + Démarrer l\'enregistrement + Fauteuil roulant + Randonnée + Marche + Camion + Vélo de course + VTT + Erreur serveur : %1$s + Ce nom existe déjà + Poids lourds \ No newline at end of file diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml index 64d40e287c..47f1522f96 100644 --- a/OsmAnd/res/values-hu/strings.xml +++ b/OsmAnd/res/values-hu/strings.xml @@ -266,7 +266,7 @@ Hely pozíció elküldése Hely megosztása \'\'{0}\'\' GPX-útpont hozzáadva - Útpont hozzáadása a rögzített GPX-útvonalhoz + Útpont hozzáadása felvett GPX nyomvonalhoz Közigazgatás Akadály Oktatás @@ -545,7 +545,7 @@ Beállítások Jelenlegi nyomvonal mentése GPX fájlba most. Jelenlegi nyomvonal mentése - A navigáció alatti útvonalrögzítéshez adja meg a naplózási intervallumot + A navigáció alatti nyomvonalfelvételhez adja meg a naplózási intervallumot Naplózási intervallum navigáció közben Navigáció közben a GPX útvonal automatikusan mentésre kerül az OsmAnd „tracks” könyvtárába. Térképcsempe újratöltése @@ -852,7 +852,7 @@ %1$s köztes célpont Kérlek engedélyezd a GPS-t a beállításokban Célpont irányának megjelenítése - A pozíciónaplózási szolgáltatások (GPX naplózás, online útvonalrögzítés) használatához engedélyed az „Útvonalrögzítés” bővítményt + A pozíciónaplózási szolgáltatások (GPX naplózás, online útvonalrögzítés) használatához engedélyed az „Utazás felvétele” bővítményt Esetleg nem optimális útvonal kiszámítása nagyobb távolságokra Útszínséma kiválasztása: Útszín sémája @@ -954,8 +954,8 @@ OsmAnd+ térkép és navigáció Utcanév Házszám - Útvonalrögzítés - Az útvonalaid felvételének beállításai. + Utazás felvétele + Az utazások felvételének beállításai. Az alkalmazás megjelenésének testreszabása. Téma Akadálymentesítési lehetőségek @@ -1296,7 +1296,7 @@ Ez a bővítmény aktiválja a nyomvonalak rögzítésének és mentésének lehetőségét, ha megnyomja a GPX naplózó gombot a térképképernyőn, valamint képes minden navigációs útvonalat automatikusan egy GPX-fájlba naplózni. \n \nA rögzített nyomvonalak megoszthatók az ismerősökkel, vagy használhatók az OSM hozzájárulásoknál. A sportolók a rögzített nyomvonalakat az edzéseik megfigyeléséhez használhatják. Néhány alapvető nyomvonalelemzés közvetlenül az OsmAnd programon belül is végrehajtható, mint például köridők, átlagsebesség stb., és természetesen a nyomvonalak később harmadik féltől származó elemzőeszközökkel is elemezhetők. - Útvonalrögzítés + Utazás felvétele ó Időtartam Távolság @@ -1435,7 +1435,7 @@ Nyomvonal pontok Kijelölve Az átnevezés nem sikerült. - Jelenleg rögzülő nyomvonal + Jelenleg felvett nyomvonal Vissza a térképhez Helyzet:\n Szélesség %1$s\n Hosszúság %2$s Útvonal pontok @@ -1660,11 +1660,11 @@ perc/mérföld perc/km m/s - Útvonalrögzítés + Utazás felvétele Navigáció Háttérben fut Pozíciószimuláció leállítása. - Szimuláció megtervezett útvonallal vagy felvett GPX-szel. + Szimuláció megtervezett útvonallal vagy felvett GPX nyomvonallal. GPX-fájl helyszínekkel. Helyszín Autószállító vonat nélkül @@ -1889,8 +1889,8 @@ elem eltávolítva Típus Kiindulópont - Felvétel vágás - Felvétel automatikus darabolása + Felvétel vágása + Felvétel automatikus elvágása Klipp hossz Tárolási méret Közreműködők száma @@ -1908,8 +1908,8 @@ Érvénytelen karakter a fájlnévben Az alkalmazás már tud írni a külső tárolóra, de ehhez egy kézi újraindítás szükséges. Klipek elvágása, ha a felhasznált hely túllépi a tárolási méretet. - A felvett klipek maximális hossza. - Az összes klip által elfoglalható hely. + A felvett klipek legnagyobb hossza. + Az összes felvett klip által elfoglalható hely. Kérjük, vegyen fel jelölőket a térképen Nem találhatók útpontok Relatív irány @@ -2036,12 +2036,12 @@ A mappához ön is adhat nyomvonalfájlokat Továbbiak hozzáadása… Megjelenés - Gyors rögzítés bekapcsolása - Egy útvonalrögzítés megkezdését lehetővé tevő rendszerértesítés megjelenítése. + Gyors felvétel bekapcsolása + Az utazásfelvétel megkezdését lehetővé tevő rendszerértesítés megjelenítése. Értesítések Szünet Túra - Felvett + Felvéve Felvétel Legkisebb naplózási sebesség Szűrő: Ez alatti sebességnél nem rögzít pontot. @@ -2307,8 +2307,8 @@ Korrigált távolság Engedélyek Nem sikerült a fájl importálása. Győződjék meg arról, hogy az OsmAndnak van engedélye a fájl olvasására. - Rögzített nyomvonalak tárolása havi könyvtárakban - Rögzített nyomvonalak tárolása havi bontású alkönyvtárakban (pl. 2018-01). + Felvett nyomvonalak tárolása havi mappákban + Felvett nyomvonalak tárolása havi bontású almappákban (pl. 2018-01). Visszaállítás Újratöltés Csempék újratöltése naprakész adatok megjelenítéséhez. @@ -2435,7 +2435,7 @@ Hibás formátum Út OSM-objektum létrehozása vagy módosítása - Hozzon létre vagy módosítson OSM POI-kat, nyisson vagy kommenteljen OSM-jegyzeteket, és működjék közre rögzített GPX-nyomvonalakkal. + Hozzon létre vagy módosítson OSM POI-kat, nyisson vagy kommenteljen OSM-jegyzeteket, és működjék közre felvett GPX-nyomvonalakkal. Törölve Szerkesztve Hozzáadva @@ -2720,7 +2720,7 @@ guarani GPS navigáció \n • Válassz az offline (nincs roamingdíj külföldön) vagy online (gyorsabb) mód között -\n • Kanyaronkénti hangutasítások vezetnek végig az úton (rögzített és előállított hangok) +\n • Kanyaronkénti hangutasítások vezetnek végig az úton (felvett és előállított hangok) \n • Az útvonalterv újratervezésre kerül, ha eltérsz attól \n • Sávvezérlés, utcanevek, és becsült érkezési idő segít az úton \n • Az út biztonságosabbá tételéhez a nappali/éjszakai mód automatikusan vált @@ -3105,9 +3105,9 @@ Domborzatárnyékolás megjelenítése/elrejtése Nyomvonal tárolási könyvtára A nyomvonalak a \'rec\' könyvtárban tárolhatók, havi vagy napi bontás szerinti könyvtárakban. - Nyomvonalak rögzítése a \'rec\' könyvtárba - Nyomvonalak rögzítése napi bontású könyvtárakba - Nyomvonalak rögzítése alkönyvtárakba a rögzítés napja szerint (pl. 2018-01-01). + Nyomvonalak felvétele a \'rec\' mappába + Nyomvonalak felvétele napi bontású mappákba + Nyomvonalak rögzítése a rögzítés napja szerinti almappákba (pl. 2018-01-01). Profil exportálása OsmAnd profil: %1$s \'%1$s\' már létezik. Felülírja\? @@ -3211,7 +3211,7 @@ Kezdő Könnyű Kapcsolat - Pozíció szimulálása egy rögzített GPX-nyomvonal felhasználásával. + Pozíció szimulálása egy felvett GPX nyomvonal felhasználásával. Kerékpárút-hálózatok csomópontjainak megjelenítése Törölje ezt: %1$s\? Ponthálózatok @@ -3222,7 +3222,7 @@ Új bővítmény hozzáadva Szegmensek összekapcsolása Irány belefoglalása - Rögzítéskor menti az egyes útpontok irányát is. + Felvételkor az egyes útpontok irányát is menti. Pozíció ikon haladás közben Pozíció ikon álló helyzetben Az Alkalmaz-ra koppintva a törölt profilok végérvényesen elvesznek. @@ -3332,10 +3332,10 @@ Képméret, hang- és videominőség Bejelentkezés, jelszó, offline szerkesztés Ikonalak, -szín és -méret kiválasztása - Lehetővé teszi az útvonal rögzítésével az aktuális pozíció megosztását. + Az utazás felvételével lehetővé teszi az aktuális pozíció megosztását. Online nyomvonalrögzítés Naplózás pontossága - Az összes rögzített nyomvonal megtalálható a %1$s helyen vagy a fájlkezelővel az OsmAnd mappában. + Az összes felvett nyomvonal megtalálható a %1$s helyen vagy a fájlkezelővel az OsmAnd mappában. Az összes OSM-jegyzetét megtalálja a %1$s helyen. Videojegyzetek Fényképes jegyzetek @@ -3376,7 +3376,7 @@ Visszaállítja a profil összes beállítását\? Új profil mentése Profil biztonsági mentése sikertelen. - Biztosan törölni szeretné a rögzített adatokat\? + Biztosan törölni szeretné a felvett adatokat\? Adatok importálása innen: %1$s Importálás A lejtőkről többet olvashat itt: %1$s. @@ -3428,7 +3428,7 @@ Nyolcszög Négyzet Min - Rögzített adatok törlése + Felvett adatok törlése Engedélyezésével domborzatárnyékolás vagy lejtőtérkép jeleníthető meg. Ezekről a térképfajtákról többet olvashat a honlapunkon. Túrasízés Motoros szán @@ -3704,10 +3704,10 @@ \n \n Válassza ki, hogy a nyomvonalon milyen távolság- vagy időintervallumok jelzései jelenjenek meg. - Ez a szűrő kiküszöböli az ismétlődő pontok rögzítését ott, ahol túl kevés tényleges mozgás történhetett, így szebb lesz a később utólag fel nem dolgozott nyomvonalak térbeli megjelenése. + Ez a szűrő kiküszöböli az ismétlődő pontok felvételét ott, ahol túl kevés tényleges mozgás történhetett, így szebb lesz a később utólag fel nem dolgozott nyomvonalak térbeli megjelenése. Felvétel vágása A nyomvonal naplózása szünetelni fog, amikor az alkalmazást (újabb alkalmazásokkal) kilövik. (Ilyenkor az OsmAnd háttérjelzése is eltűnik az Android értesítési sávjáról.) - Javaslat: Először próbálja meg a mozgásérzékelést használni a legkisebb elmozdulást naplózó szűrővel (B). Ez jobb eredményeket hozhat, és kevesebb adatot veszít. Ha a nyomvonalak alacsony sebességnél továbbra is zajosak, próbálkozzon itt nullától eltérő értékekkel. Felhívjuk figyelmét, hogy egyes (hálózatalapú módszereket használó) mérőeszközök egyáltalán nem adnak sebességértéket, így ebben az esetben semmi sem fog rögzülni. + Javaslat: Először próbálja meg a mozgásérzékelést használni a legkisebb elmozdulást naplózó szűrővel (B). Ez jobb eredményeket hozhat, és kevesebb adatot veszít. Ha a nyomvonalak alacsony sebességnél továbbra is zajosak, próbálkozzon itt nullától eltérő értékekkel. Felhívjuk figyelmét, hogy egyes (hálózatalapú módszereket használó) mérőeszközök egyáltalán nem adnak sebességértéket, így ebben az esetben semmi sem lesz felvéve. Utcaszintű képek Csak az út vonala lesz elmentve, az útpontok törlődnek. Kiindulás és érkezés ikonjainak megjelenítése @@ -3718,7 +3718,7 @@ Minden korábbi szakasz újra lesz számítva a kiválasztott profilnak megfelelően. Térkép frissítése Előző szakasz - Ez csak a minimális pontosságúnak megjelölt mért pontokat rögzíti (méterben/lábban, ahogy azt az Android a lapkakészletnek közvetíti). Ez pontosság (accuracy) a mérések valódi helyzethez való közelsége, és nem kapcsolódik közvetlenül az ismételt mérések szórásának pontosságához (precision). + Ez csak a minimális pontosságúnak megjelölt mért pontokat veszi fel (méterben/lábban, ahogy azt az Android a lapkakészletnek közvetíti). Ez pontosság (accuracy) a mérések valódi helyzethez való közelsége, és nem kapcsolódik közvetlenül az ismételt mérések szórásának pontosságához (precision). Nyomvonal követése REC Rendszer alapértelmezett értékei @@ -3728,8 +3728,8 @@ Útpont hozzáadása a nyomvonalhoz Nyomvonal rögzítése GPX-fájlba Nyomvonalak - Nyomvonalfájlok importálása vagy rögzítése - Ez egy alacsonysebesség-leválasztó szűrő, amely egy bizonyos sebesség alatt nem rögzít pontokat. Ezáltal a rögzített nyomvonalak simábbnak néznek ki a térképen. + Nyomvonalfájlok importálása vagy felvétele + Ez egy alacsonysebesség-leválasztó szűrő, amely egy bizonyos sebesség alatt nem vesz fel pontokat. Ezáltal a felvett nyomvonalak simábbnak néznek ki a térképen. Az OsmAnd ellenőrizze %1$s-t, hogy vannak-e másolatok az alkalmazás meglévő elemeivel. \n \nEz eltarthat egy ideig. @@ -3740,7 +3740,7 @@ Mellékhatás: A pontosság szerinti szűrés eredményeként egyes pontok teljesen hiányozhatnak pl. hidak vagy fák alatt, magas épületek között, vagy bizonyos időjárási körülmények között. Küszöbtávolság Nyomvonal kezdete - Nyomvonal automatikus rögzítése navigáció közben + Nyomvonal automatikus felvétele navigáció közben Mellékhatás: A nyomvonalból hiányozni fog minden olyan szakasz, ahol a legkisebb sebesség feltétele nem teljesült (pl. egy meredek dombra tolja fel a kerékpárt). Nem lesz információ az állásokról sem, például a pihenőkről. Ez hatással van minden elemzésre és utófeldolgozásra, például amikor megpróbálja meghatározni az utazás teljes hosszát, a mozgásban töltött időt vagy az átlagsebességét. Adjon hozzá legalább két pontot. Csatolás az utakhoz @@ -3762,8 +3762,8 @@ Útpont hozzáadása a nyomvonalhoz Útvonaltípus módosítása ez után: Útvonal követése - Ajánlás: Nehéz megjósolni, hogy mi fog rögzülni és mi nem, így talán a legjobb ezt a szűrőt kikapcsolni. - Utazás rögzítése + Ajánlás: Nehéz megjósolni, hogy mi lesz a felvételen és mi nem, így talán a legjobb ezt a szűrőt kikapcsolni. + Utazás felvétele Nem sikerült elemezni a következő térképmegjelenítési szándékot: „%s”. Meglévő nyomvonal megnyitása Tömör @@ -3771,14 +3771,14 @@ Csak a következő szakasz lesz újraszámítva a kiválasztott profilnak megfelelően. Ezután a beállítás használatához igazítsa a nyomvonalat a legközelebbi úthoz az egyik navigációs profil segítségével. Egyedi - Utazás rögzítésének szüneteltetése + Utazás felvételének szüneteltetése Mentés új nyomvonalfájlként Utoljára szerkesztve - Adja meg az általános nyomvonalrögzítés naplózási intervallumát (bekapcsolva a térképen található „Utazás rögzítése” widgettel). + Adja meg az általános nyomvonalfelvétel naplózási intervallumát (bekapcsolva a térképen található „Utazás felvétele” widgettel). Válassza ki a kívánt felosztási lehetőséget: idő vagy távolság szerint. - Utazás rögzítésének folytatása + Utazás felvételének folytatása Navigációs profil - Megjegyzés a „sebesség > 0” ellenőrzéséhez: A legtöbb GPS lapkakészlet (chipset) csak akkor mutat sebességértéket, ha az algoritmus megállapítja, hogy mozgásban van. Ha nincs mozgás, akkor nem mutatnak sebességet. Ezért ebben a szűrőben a „> 0” beállítás bizonyos értelemben a GPS lapkakészlet mozgásérzékelését használja. De – még ha a rögzítés ideje alatt itt nem is szűrjük – a GPX elemzése során mégis használjuk ezt a funkciót a korrigált távolság meghatározásához, vagyis az abban a mezőben megjelenített érték a mozgás közben rögzített távolság. + Megjegyzés a „sebesség > 0” ellenőrzéséhez: A legtöbb GPS lapkakészlet (chipset) csak akkor mutat sebességértéket, ha az algoritmus megállapítja, hogy mozgásban van. Ha nincs mozgás, akkor nem mutatnak sebességet. Ezért ebben a szűrőben a „> 0” beállítás bizonyos értelemben a GPS lapkakészlet mozgásérzékelését használja. De – még ha a felvétel ideje alatt itt nem is szűrjük – a GPX elemzése során mégis használjuk ezt a funkciót a korrigált távolság meghatározásához, vagyis az abban a mezőben megjelenített érték a mozgás közben rögzített távolság. Csak a kijelölt szakasz lesz újraszámítva a kiválasztott profilnak megfelelően. Biztosan elveti az összes módosítást a tervezett útvonalon\? Válassza ki a követendő nyomvonalfájlt @@ -3793,7 +3793,7 @@ Legközelebbi pont Nyomvonalfájlok hozzáadása Fordított irány esetén - Mellékhatások: A nyugalmi periódusok egyáltalán nem vagy csak egy ponttal rögzülnek. Kiszűrhetők a kis (valós) mozgások (pl. az út során egy átvezető út jelzése céljából megtett kitérők). A fájl kevesebb információt tartalmaz az utófeldolgozáshoz és rosszabb a statisztikája, mivel a felvételkor kiszűri a nyilvánvalóan felesleges pontokat, miközben megtarthatja a rossz vétel vagy a GPS lapkakészlet által okozott hibás mintázatok. + Mellékhatások: A nyugalmi periódusok egyáltalán nem vagy csak egy ponttal lesznek felvéve. Kiszűrhetők a kis (valós) mozgások (pl. az út során egy átvezető út jelzése céljából megtett kitérők). A fájl kevesebb információt tartalmaz az utófeldolgozáshoz és rosszabb a statisztikája, mivel a felvételkor kiszűri a nyilvánvalóan felesleges pontokat, miközben megtarthatja a rossz vétel vagy a GPS lapkakészlet által okozott hibás mintázatok. Minden későbbi szakasz %s nyomvonalfájl kijelölve Jelölje ki azt a nyomvonalfájlt, amelyhez az új szakasz hozzáadódjék. @@ -3966,4 +3966,29 @@ Nyomvonal szerkesztése Nyomvonal átnevezése Mappa módosítása + Felvétel indítása + mp. + Túlhaladás + Megközelítés + Hosszú felkészülés + Felkészülés + Letérés az útvonalról + Érkezés a célponthoz + Bekanyarodás + Idő- és távolságintervallumok + Hegyi kerékpár + Versenykerékpár + Nyomvonal megjelenítése a térképen + Kerekesszék + Túrázás + Gyaloglás + E-kerékpározás + Hegyi kerékpározás + Verenykerékpározás + Rendes kerékpározás + Tgk. + Nehéz tgk. + Kisteherautó + Szerverhiba: %1$s + Ez a név már létezik \ No newline at end of file diff --git a/OsmAnd/res/values-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml index 7ca3bcdb8d..f4360809bc 100644 --- a/OsmAnd/res/values-iw/strings.xml +++ b/OsmAnd/res/values-iw/strings.xml @@ -3975,4 +3975,15 @@ עריכת מסלול שינוי שם מסלול החלפת תיקייה + זמן ההכרזה + התחלת הקלטה + כסא גלגלים + הליכה + משאית קטנה + משאית + קטנוע + אופנוע מרוצים + אופני הרים + שגיאת שרת: %1$s + השם כבר קיים \ No newline at end of file diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index 840fa52189..4be69e1a63 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -3963,4 +3963,37 @@ Wybierz folder Wybierz folder lub dodaj nowy Opróżnij + Analiza według przedziałów (przedział podziału) + Prześlij do OpenStreetMap + Edytuj trasę + Zmień nazwę trasy + Zmień folder + sek + Omijanie + Podejście + Długie przygotowanie + Przygotuj + Poza trasą + Przyjedź do miejsca docelowego + Zakręt + Odstępy czasowe i odległościowe + Czas ogłaszania różnych komunikatów głosowych zależy od rodzaju komunikatu, aktualnej prędkości nawigacji i domyślnej prędkości nawigacji. + Czas ogłoszenia + Rozpocznij nagrywanie + Pokaż trasę na mapie + Wózek inwalidzki + Wędrówki + Pieszo + Jazda na rowerze elektrycznym + Kolarstwo górskie + Kolarstwo szosowe + Regularna jazda na rowerze + HGV + Mała ciężarówka + Ciężarówka + Skuter + Rower wyścigowy + MTB + Błąd serwera: %1$s + Taka nazwa już istnieje \ No newline at end of file diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index 0b5a8b33f2..27b74056cb 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -3967,4 +3967,32 @@ Editar trilha Renomear trilha Mudar pasta + seg + Passando + Aproximação + Longa preparação + Preparar + Fora da rota + Chegue ao destino + Virar + Intervalos de tempo e distância + O tempo de anúncio de diferentes comandos de voz depende do tipo de prompt, velocidade de navegação atual e velocidade de navegação padrão. + Hora do anúncio + Comece a gravar + Mostrar trilha no mapa + Cadeira de rodas + Caminhada + Caminhando + Ciclismo elétrico + Mountain bike + Ciclismo regular + Ciclismo regular + Veículos de carga pesada + Caminhão pequeno + Caminhão + Lambreta + Bicicleta de corrida + MTB + Erro de servidor: %1$s + O nome já existe \ No newline at end of file diff --git a/OsmAnd/res/values-sk/phrases.xml b/OsmAnd/res/values-sk/phrases.xml index 7848da6dee..bb55a5a250 100644 --- a/OsmAnd/res/values-sk/phrases.xml +++ b/OsmAnd/res/values-sk/phrases.xml @@ -133,7 +133,7 @@ Kontrola vozidla (technická/emisná) Autoumyváreň Benzínová pumpa;Čerpacia stanica - Nabíjacia stanica + Nabíjacia stanica pre vozidlá Servisná rampa na auto Stlačený vzduch Parkovisko diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml index 6d3fbf6d12..e1da748102 100644 --- a/OsmAnd/res/values-sk/strings.xml +++ b/OsmAnd/res/values-sk/strings.xml @@ -3967,4 +3967,32 @@ Upraviť stopu Premenovať stopu Zmeniť priečinok + sek. + Pri bode trasy + Priblíženie sa + Pripraviť sa neskôr + Pripraviť sa + Mimo trasy + Dosiahnutie cieľa + Intervaly času a vzdialenosti + Čas oznamu rôznych hlasových pokynov závisí od typu pokynu, aktuálnej rýchlosti navigácie a predvolenej rýchlosti navigácie. + Čas oznamu + Začať záznam + Zobraziť stopu na mape + Invalidný vozík + Turistika + Chôdza + Elektrické bicyklovanie + Horské bicyklovanie + Cestné bicyklovanie + Bežné bicyklovanie + Nákladné auto + Malé nákladné auto + Kamión + Skúter + Závodný bicykel + Horský bicykel + Chyba servera: %1$s + Názov už existuje + Odbočiť \ No newline at end of file diff --git a/OsmAnd/res/values-tr/phrases.xml b/OsmAnd/res/values-tr/phrases.xml index 558e72a682..2fe8bccf32 100644 --- a/OsmAnd/res/values-tr/phrases.xml +++ b/OsmAnd/res/values-tr/phrases.xml @@ -194,7 +194,7 @@ Gaz istasyonu;Benzin istasyonu;Dolum istasyonu;Petrol istasyonu Dizel GTL dizel - TIR dizel + Ağır yük aracı dizeli Bio dizel LPG 80 Oktan @@ -215,7 +215,7 @@ Biyogaz Sıvı hidrojen Elektrik - Şarj istasyonu + Şarj istasyonu; Elektrikli araç şarj istasyonu; EA şarj istasyonu; Elektrikli şarj noktası; Şarj noktası; Elektronik şarj istasyonu; Elektrikli araç besleme ekipmanı Araç rampa Basınçlı hava Otopark @@ -1187,7 +1187,7 @@ Sürüş paylaşım noktası Park ve sürüş Mofa erişimi - Ağır vasıta erişimi + Ağır yük aracı erişimi Hafif ticari araç erişimi Demirleme yeri Yükleme şamandırası @@ -1436,7 +1436,7 @@ Evet Ses: hayır Sadece yürümeye izin verildiğinde - Ağır vasıta geçiş ücreti + Ağır yük aracı geçiş ücreti Kurtarma istasyonu Çapalar Servis alanı @@ -3133,4 +3133,9 @@ Dolap türü: kablo tv Dolap türü: telefon Dolap türü: elektrik + Ağır yük aracı erişimi: uygun değil + Ağır yük aracı erişimi: önerilmiyor + Ağır yük aracı erişimi: tarım + Ağır yük aracı erişimi: hayır + Ağır yük aracı erişimi: özel \ No newline at end of file diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 344183c102..2785932852 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -3973,4 +3973,32 @@ Yolu düzenle Yolu yeniden adlandır Klasörü değiştir + sn + Geçme + Yaklaşma + Hazırlık + Uzun hazırlık + Güzergah dışı + Hedefe varış + Dönüş + Zaman ve mesafe aralıkları + Farklı sesli komutların duyuru zamanı komut türüne, geçerli navigasyon hızına ve öntanımlı navigasyon hızına bağlıdır. + Duyuru zamanı + Kaydı başlat + Yolu haritada göster + Tekerlekli sandalye + Yürüyüş + Yürüme + Elektrikli bisiklet + Dağ bisikleti + Yol bisikleti + Genel bisiklet + Ağır yük aracı + Dağ bisikleti + Küçük kamyon + Kamyon + Mobilet + Yarış bisikleti + Sunucu hatası: %1$s + Ad zaten var \ No newline at end of file diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index 6910c9a902..03e0e54d9d 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -3111,7 +3111,7 @@ Дім на колесах Показати на мапі зони низьких викидів. Не впливає на маршрутизацію. Показати зони низьких викидів - Враховувати часові обмеження + Враховувати тимчасові обмеження Усталений Маршрут: відстань %1$s, час навігації %2$s \nРозрахунок: %3$.1f с, %4$d доріг, %5$d тайлів) Окситанська @@ -3971,4 +3971,32 @@ Редагувати трек Перейменувати трек Змінити теку + с + Проходження + Наближення + Завчасне приготування + Приготуватися + По за маршрутом + Прибуття до місця призначення + Поворот + Інтервали часу та відстаней + Час оголошення різних голосових підказок залежить від типу запиту, поточної швидкості навігації та типової швидкості переходів. + Час оголошення + Почати запис + Показати трек на мапі + Інвалідний візок + Піша прогулянка + Ходьба + Електричний велосипед + Гірський велосипед + Дорожній велосипед + Звичайний велосипед + Вантажівка + Невелика вантажівка + Вантажівка + Скутер + Гоночний велосипед + Гірський велосипед + Помилка сервера: %1$s + Назва вже існує \ No newline at end of file diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index dbb7f64fa0..b0a914696c 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -3965,4 +3965,32 @@ 編輯軌跡 重新命名軌跡 變更資料夾 + + 通過 + 接近 + 長準備 + 準備 + 偏離路線 + 抵達目的地 + 轉彎 + 時間與距離間隔 + 不同語音提示的公告時間取決於提示類型、目前的導航速度與預設的導航速度。 + 公告時間 + 開始錄製 + 在地圖上顯示軌跡 + 輪椅 + 健行 + 步行 + 電動自行車 + 山地自行車 + 公路自行車 + 一般自行車 + 大貨車 + 小貨車 + 卡車 + 速克達 + 競賽摩托車 + 登山車 + 伺服器錯誤:%1$s + 名稱已存在 \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/activities/OsmandInAppPurchaseActivity.java b/OsmAnd/src/net/osmand/plus/activities/OsmandInAppPurchaseActivity.java index 6cc1b222bb..ee7b882c54 100644 --- a/OsmAnd/src/net/osmand/plus/activities/OsmandInAppPurchaseActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/OsmandInAppPurchaseActivity.java @@ -204,7 +204,7 @@ public class OsmandInAppPurchaseActivity extends AppCompatActivity implements In } onInAppPurchaseItemPurchased(sku); fireInAppPurchaseItemPurchasedOnFragments(fragmentManager, sku, active); - if (purchaseHelper != null && purchaseHelper.getContourLines().getSku().equals(sku)) { + if (purchaseHelper != null && purchaseHelper.getFullVersion().getSku().equals(sku)) { if (!(this instanceof MapActivity)) { finish(); } diff --git a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java index 6547ae01db..256a845dc7 100644 --- a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java @@ -118,7 +118,7 @@ public abstract class ChoosePlanDialogFragment extends BaseOsmAndDialogFragment case SEA_DEPTH_MAPS: return InAppPurchaseHelper.isDepthContoursPurchased(ctx); case CONTOUR_LINES_HILLSHADE_MAPS: - return OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) != null; + return OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) != null || InAppPurchaseHelper.isContourLinesPurchased(ctx); } return false; } diff --git a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanFreeBannerDialogFragment.java b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanFreeBannerDialogFragment.java index bfdeb1b632..aa5a41a1a8 100644 --- a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanFreeBannerDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanFreeBannerDialogFragment.java @@ -30,7 +30,8 @@ public class ChoosePlanFreeBannerDialogFragment extends ChoosePlanDialogFragment private final OsmAndFeature[] planTypeFeatures = { OsmAndFeature.WIKIPEDIA_OFFLINE, - OsmAndFeature.WIKIVOYAGE_OFFLINE, + OsmAndFeature.CONTOUR_LINES_HILLSHADE_MAPS, + OsmAndFeature.SEA_DEPTH_MAPS, OsmAndFeature.UNLIMITED_DOWNLOADS, OsmAndFeature.MONTHLY_MAP_UPDATES, }; diff --git a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanHillshadeSrtmDialogFragment.java b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanHillshadeSrtmDialogFragment.java index d3a48a5a15..b204557717 100644 --- a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanHillshadeSrtmDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanHillshadeSrtmDialogFragment.java @@ -1,16 +1,6 @@ package net.osmand.plus.chooseplan; -import android.app.Activity; -import android.view.View; - -import androidx.annotation.Nullable; - -import net.osmand.plus.R; -import net.osmand.plus.activities.OsmandInAppPurchaseActivity; -import net.osmand.plus.inapp.InAppPurchaseHelper; -import net.osmand.plus.inapp.InAppPurchases.InAppPurchase; - -public class ChoosePlanHillshadeSrtmDialogFragment extends ChoosePlanDialogFragment { +public class ChoosePlanHillshadeSrtmDialogFragment extends ChoosePlanFreeBannerDialogFragment { public static final String TAG = ChoosePlanHillshadeSrtmDialogFragment.class.getSimpleName(); private final OsmAndFeature[] osmLiveFeatures = { @@ -29,6 +19,10 @@ public class ChoosePlanHillshadeSrtmDialogFragment extends ChoosePlanDialogFragm private final OsmAndFeature[] planTypeFeatures = { OsmAndFeature.CONTOUR_LINES_HILLSHADE_MAPS, + OsmAndFeature.SEA_DEPTH_MAPS, + OsmAndFeature.WIKIPEDIA_OFFLINE, + OsmAndFeature.UNLIMITED_DOWNLOADS, + OsmAndFeature.MONTHLY_MAP_UPDATES, }; private final OsmAndFeature[] selectedPlanTypeFeatures = {}; @@ -51,48 +45,4 @@ public class ChoosePlanHillshadeSrtmDialogFragment extends ChoosePlanDialogFragm public OsmAndFeature[] getSelectedPlanTypeFeatures() { return selectedPlanTypeFeatures; } - - @Override - public int getPlanTypeHeaderImageId() { - return R.drawable.img_logo_38dp_contour_lines; - } - - @Override - public String getPlanTypeHeaderTitle() { - return getString(R.string.srtm_plugin_name); - } - - @Override - public String getPlanTypeHeaderDescription() { - return getString(R.string.paid_plugin); - } - - @Override - public String getPlanTypeButtonDescription() { - return getString(R.string.in_app_purchase_desc); - } - - @Override - public void setPlanTypeButtonClickListener(View button) { - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Activity activity = getActivity(); - if (activity != null) { - OsmandInAppPurchaseActivity.purchaseContourLines(activity); - dismiss(); - } - } - }); - } - - @Nullable - @Override - public InAppPurchase getPlanTypePurchase() { - InAppPurchaseHelper purchaseHelper = getOsmandApplication().getInAppPurchaseHelper(); - if (purchaseHelper != null) { - return purchaseHelper.getContourLines(); - } - return null; - } } diff --git a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanSeaDepthMapsDialogFragment.java b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanSeaDepthMapsDialogFragment.java index 211c788c38..8a07c25bef 100644 --- a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanSeaDepthMapsDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanSeaDepthMapsDialogFragment.java @@ -1,21 +1,11 @@ package net.osmand.plus.chooseplan; -import android.app.Activity; -import android.view.View; - -import androidx.annotation.Nullable; - -import net.osmand.plus.R; -import net.osmand.plus.activities.OsmandInAppPurchaseActivity; -import net.osmand.plus.inapp.InAppPurchaseHelper; -import net.osmand.plus.inapp.InAppPurchases.InAppPurchase; - -public class ChoosePlanSeaDepthMapsDialogFragment extends ChoosePlanDialogFragment { +public class ChoosePlanSeaDepthMapsDialogFragment extends ChoosePlanFreeBannerDialogFragment { public static final String TAG = ChoosePlanSeaDepthMapsDialogFragment.class.getSimpleName(); private final OsmAndFeature[] osmLiveFeatures = { - OsmAndFeature.CONTOUR_LINES_HILLSHADE_MAPS, OsmAndFeature.SEA_DEPTH_MAPS, + OsmAndFeature.CONTOUR_LINES_HILLSHADE_MAPS, OsmAndFeature.WIKIPEDIA_OFFLINE, OsmAndFeature.WIKIVOYAGE_OFFLINE, OsmAndFeature.DAILY_MAP_UPDATES, @@ -23,12 +13,16 @@ public class ChoosePlanSeaDepthMapsDialogFragment extends ChoosePlanDialogFragme OsmAndFeature.UNLOCK_ALL_FEATURES, }; private final OsmAndFeature[] selectedOsmLiveFeatures = { - OsmAndFeature.CONTOUR_LINES_HILLSHADE_MAPS, OsmAndFeature.SEA_DEPTH_MAPS, + OsmAndFeature.CONTOUR_LINES_HILLSHADE_MAPS, }; private final OsmAndFeature[] planTypeFeatures = { OsmAndFeature.SEA_DEPTH_MAPS, + OsmAndFeature.CONTOUR_LINES_HILLSHADE_MAPS, + OsmAndFeature.WIKIPEDIA_OFFLINE, + OsmAndFeature.UNLIMITED_DOWNLOADS, + OsmAndFeature.MONTHLY_MAP_UPDATES, }; private final OsmAndFeature[] selectedPlanTypeFeatures = {}; @@ -51,47 +45,4 @@ public class ChoosePlanSeaDepthMapsDialogFragment extends ChoosePlanDialogFragme public OsmAndFeature[] getSelectedPlanTypeFeatures() { return selectedPlanTypeFeatures; } - - @Override - public int getPlanTypeHeaderImageId() { - return R.drawable.img_logo_38dp_sea_depth; - } - - @Override - public String getPlanTypeHeaderTitle() { - return getString(R.string.index_item_depth_contours_osmand_ext); - } - - @Override - public String getPlanTypeHeaderDescription() { - return getString(R.string.in_app_purchase); - } - - @Override - public String getPlanTypeButtonDescription() { - return getString(R.string.in_app_purchase_desc); - } - - @Override - public void setPlanTypeButtonClickListener(View button) { - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Activity activity = getActivity(); - if (activity != null) { - OsmandInAppPurchaseActivity.purchaseDepthContours(activity); - } - } - }); - } - - @Nullable - @Override - public InAppPurchase getPlanTypePurchase() { - InAppPurchaseHelper purchaseHelper = getOsmandApplication().getInAppPurchaseHelper(); - if (purchaseHelper != null) { - return purchaseHelper.getDepthContours(); - } - return null; - } } diff --git a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanWikipediaDialogFragment.java b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanWikipediaDialogFragment.java index 8729bdbbeb..a6b222734e 100644 --- a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanWikipediaDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanWikipediaDialogFragment.java @@ -19,7 +19,6 @@ public class ChoosePlanWikipediaDialogFragment extends ChoosePlanFreeBannerDialo private final OsmAndFeature[] planTypeFeatures = { OsmAndFeature.WIKIPEDIA_OFFLINE, - OsmAndFeature.WIKIVOYAGE_OFFLINE, OsmAndFeature.UNLIMITED_DOWNLOADS, OsmAndFeature.MONTHLY_MAP_UPDATES, }; diff --git a/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java index ca7382dd6e..7a0bcb0e79 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java @@ -251,7 +251,7 @@ public class ConfigureMapMenu { OsmandPlugin.registerLayerContextMenu(activity.getMapView(), adapter, activity); boolean srtmDisabled = OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) == null - && !InAppPurchaseHelper.isSubscribedToLiveUpdates(app); + && !InAppPurchaseHelper.isContourLinesPurchased(app); if (srtmDisabled) { SRTMPlugin srtmPlugin = OsmandPlugin.getPlugin(SRTMPlugin.class); if (srtmPlugin != null) { diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java index 52bb44bf5f..d076f329f0 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java @@ -684,11 +684,12 @@ public class DownloadActivity extends AbstractDownloadActivity implements Downlo } public void initAppStatusVariables() { + OsmandApplication app = getMyApplication(); srtmDisabled = OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) == null - && !InAppPurchaseHelper.isSubscribedToLiveUpdates(getMyApplication()); + && !InAppPurchaseHelper.isContourLinesPurchased(app); nauticalPluginDisabled = OsmandPlugin.getEnabledPlugin(NauticalMapsPlugin.class) == null; - freeVersion = Version.isFreeVersion(getMyApplication()); - OsmandPlugin srtmPlugin = OsmandPlugin.getPlugin(SRTMPlugin.class); + freeVersion = Version.isFreeVersion(app); + SRTMPlugin srtmPlugin = OsmandPlugin.getPlugin(SRTMPlugin.class); srtmNeedsInstallation = srtmPlugin == null || srtmPlugin.needsInstallation(); } diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java index f28310645e..4f820bac2a 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java @@ -352,9 +352,7 @@ public class DownloadResources extends DownloadResourceGroup { continue; } if (ii.getType() == DownloadActivityType.DEPTH_CONTOUR_FILE) { - if (InAppPurchaseHelper.isDepthContoursPurchased(app) - || InAppPurchaseHelper.isSubscribedToLiveUpdates(app) - || nauticalMaps.size() == 0) { + if (InAppPurchaseHelper.isDepthContoursPurchased(app) || nauticalMaps.size() == 0) { nauticalMaps.addItem(ii); } continue; diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java index 9ad1a0f89e..70041a525e 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java @@ -134,8 +134,7 @@ public class ItemViewHolder { srtmDisabled = context.isSrtmDisabled(); nauticalPluginDisabled = context.isNauticalPluginDisabled(); srtmNeedsInstallation = context.isSrtmNeedsInstallation(); - depthContoursPurchased = InAppPurchaseHelper.isDepthContoursPurchased(context.getMyApplication()) - || InAppPurchaseHelper.isSubscribedToLiveUpdates(context.getMyApplication()); + depthContoursPurchased = InAppPurchaseHelper.isDepthContoursPurchased(context.getMyApplication()); } public void bindIndexItem(final IndexItem indexItem) { diff --git a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java index ec13eba2bd..48fd643099 100644 --- a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java +++ b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java @@ -153,11 +153,15 @@ public abstract class InAppPurchaseHelper { } public static boolean isDepthContoursPurchased(@NonNull OsmandApplication ctx) { - return Version.isDeveloperBuild(ctx) || ctx.getSettings().DEPTH_CONTOURS_PURCHASED.get(); + return Version.isDeveloperBuild(ctx) + || Version.isPaidVersion(ctx) + || ctx.getSettings().DEPTH_CONTOURS_PURCHASED.get(); } public static boolean isContourLinesPurchased(@NonNull OsmandApplication ctx) { - return Version.isDeveloperBuild(ctx) || ctx.getSettings().CONTOUR_LINES_PURCHASED.get(); + return Version.isDeveloperBuild(ctx) + || Version.isPaidVersion(ctx) + || ctx.getSettings().CONTOUR_LINES_PURCHASED.get(); } public InAppPurchases getInAppPurchases() { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/MapDataMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/MapDataMenuController.java index ac6b8287b4..22d6d97830 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/MapDataMenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/MapDataMenuController.java @@ -85,7 +85,7 @@ public class MapDataMenuController extends MenuController { } srtmDisabled = OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) == null - && !InAppPurchaseHelper.isSubscribedToLiveUpdates(app); + && !InAppPurchaseHelper.isContourLinesPurchased(app); OsmandPlugin srtmPlugin = OsmandPlugin.getPlugin(SRTMPlugin.class); srtmNeedsInstallation = srtmPlugin == null || srtmPlugin.needsInstallation(); diff --git a/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingBottomSheet.java b/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingBottomSheet.java index f33f7dfa38..54b444ff30 100644 --- a/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingBottomSheet.java @@ -31,7 +31,6 @@ import net.osmand.plus.UiUtilities.DialogButtonType; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.base.MenuBottomSheetDialogFragment; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; -import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.FontCache; import net.osmand.plus.settings.backend.OsmandSettings; @@ -50,8 +49,9 @@ public class TripRecordingBottomSheet extends MenuBottomSheetDialogFragment { private ImageView upDownBtn; private SwitchCompat confirmEveryRun; + private RangeSlider intervalSlider; private TextView intervalValueView; - + private LinearLayout container; private boolean infoExpanded; @Override @@ -66,11 +66,8 @@ public class TripRecordingBottomSheet extends MenuBottomSheetDialogFragment { .setCustomView(itemView) .create()); - int padding = getResources().getDimensionPixelSize(R.dimen.content_padding_small); final int paddingSmall = getResources().getDimensionPixelSize(R.dimen.content_padding_small); - items.add(new DividerSpaceItem(context, padding)); - LinearLayout showTrackOnMapView = itemView.findViewById(R.id.show_track_on_map); TextView showTrackOnMapTitle = showTrackOnMapView.findViewById(R.id.title); showTrackOnMapTitle.setText(R.string.show_track_on_map); @@ -110,8 +107,10 @@ public class TripRecordingBottomSheet extends MenuBottomSheetDialogFragment { intervalValueView = itemView.findViewById(R.id.interval_value); updateIntervalLegend(); - RangeSlider intervalSlider = itemView.findViewById(R.id.interval_slider); + container = itemView.findViewById(R.id.always_ask_and_range_slider_container); + intervalSlider = itemView.findViewById(R.id.interval_slider); intervalSlider.setValueTo(secondsLength + minutesLength - 1); + container.setVisibility(View.GONE); intervalSlider.addOnChangeListener(new RangeSlider.OnChangeListener() { @Override @@ -218,7 +217,7 @@ public class TripRecordingBottomSheet extends MenuBottomSheetDialogFragment { private void toggleInfoView() { infoExpanded = !infoExpanded; - AndroidUiHelper.updateVisibility(confirmEveryRun, infoExpanded); + AndroidUiHelper.updateVisibility(container, infoExpanded); updateUpDownBtn(); } diff --git a/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java b/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java index db1c3c96d6..47b4b037df 100644 --- a/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java +++ b/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java @@ -639,7 +639,7 @@ public class ResourceManager { collectFiles(context.getAppPath(IndexConstants.WIKI_INDEX_DIR), IndexConstants.BINARY_MAP_INDEX_EXT, files); collectFiles(context.getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR), IndexConstants.BINARY_TRAVEL_GUIDE_MAP_INDEX_EXT, files); } - if (OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) != null || InAppPurchaseHelper.isSubscribedToLiveUpdates(context)) { + if (OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) != null || InAppPurchaseHelper.isContourLinesPurchased(context)) { collectFiles(context.getAppPath(IndexConstants.SRTM_INDEX_DIR), IndexConstants.BINARY_MAP_INDEX_EXT, files); } diff --git a/OsmAnd/src/net/osmand/plus/srtmplugin/ContourLinesMenu.java b/OsmAnd/src/net/osmand/plus/srtmplugin/ContourLinesMenu.java index 0f12c0a85d..03c6fde1f2 100644 --- a/OsmAnd/src/net/osmand/plus/srtmplugin/ContourLinesMenu.java +++ b/OsmAnd/src/net/osmand/plus/srtmplugin/ContourLinesMenu.java @@ -52,7 +52,7 @@ public class ContourLinesMenu { final OsmandApplication app = mapActivity.getMyApplication(); final OsmandSettings settings = app.getSettings(); final SRTMPlugin plugin = OsmandPlugin.getPlugin(SRTMPlugin.class); - final boolean srtmEnabled = OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) != null || InAppPurchaseHelper.isSubscribedToLiveUpdates(app); + final boolean srtmEnabled = OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) != null || InAppPurchaseHelper.isContourLinesPurchased(app); final RenderingRuleProperty contourLinesProp = app.getRendererRegistry().getCustomRenderingRuleProperty(CONTOUR_LINES_ATTR); final RenderingRuleProperty colorSchemeProp = app.getRendererRegistry().getCustomRenderingRuleProperty(CONTOUR_LINES_SCHEME_ATTR); diff --git a/OsmAnd/src/net/osmand/plus/srtmplugin/SRTMPlugin.java b/OsmAnd/src/net/osmand/plus/srtmplugin/SRTMPlugin.java index b6f22610e0..dcf9101695 100644 --- a/OsmAnd/src/net/osmand/plus/srtmplugin/SRTMPlugin.java +++ b/OsmAnd/src/net/osmand/plus/srtmplugin/SRTMPlugin.java @@ -14,14 +14,11 @@ import androidx.core.content.ContextCompat; import net.osmand.AndroidUtils; import net.osmand.data.LatLon; -import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuItem; import net.osmand.plus.DialogListItemAdapter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; -import net.osmand.plus.settings.backend.OsmandSettings; -import net.osmand.plus.settings.backend.CommonPreference; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.dashboard.DashboardOnMap; @@ -31,6 +28,9 @@ import net.osmand.plus.download.DownloadResources; import net.osmand.plus.download.IndexItem; import net.osmand.plus.inapp.InAppPurchaseHelper; 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.OsmandSettings; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.render.RenderingRuleProperty; import net.osmand.util.Algorithms; @@ -88,13 +88,13 @@ public class SRTMPlugin extends OsmandPlugin { @Override public boolean needsInstallation() { - return super.needsInstallation() && !InAppPurchaseHelper.isSubscribedToLiveUpdates(app); + return super.needsInstallation() + && !InAppPurchaseHelper.isContourLinesPurchased(app); } @Override protected boolean pluginAvailable(OsmandApplication app) { return super.pluginAvailable(app) - || InAppPurchaseHelper.isSubscribedToLiveUpdates(app) || InAppPurchaseHelper.isContourLinesPurchased(app); } diff --git a/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java b/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java index d3685fc048..02a8e07a2a 100644 --- a/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java +++ b/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java @@ -61,7 +61,7 @@ public class NativeCoreContext { ObfsCollection obfsCollection = new ObfsCollection(); obfsCollection.addDirectory(directory.getAbsolutePath(), false); - if(OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) != null || InAppPurchaseHelper.isSubscribedToLiveUpdates(app)) { + if (OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) != null || InAppPurchaseHelper.isContourLinesPurchased(app)) { obfsCollection.addDirectory(app.getAppPath(IndexConstants.SRTM_INDEX_DIR).getAbsolutePath(), false); } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/article/WikivoyageArticleNavigationFragment.java b/OsmAnd/src/net/osmand/plus/wikivoyage/article/WikivoyageArticleNavigationFragment.java index 960608a784..1018874d26 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/article/WikivoyageArticleNavigationFragment.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/article/WikivoyageArticleNavigationFragment.java @@ -104,7 +104,7 @@ public class WikivoyageArticleNavigationFragment extends MenuBottomSheetDialogFr public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { WikivoyageSearchResult articleItem = listAdapter.getArticleItem(groupPosition, childPosition); - sendResults(articleItem.getArticleId()); + sendResults(articleItem.getArticleTitle()); dismiss(); return true; } @@ -113,10 +113,10 @@ public class WikivoyageArticleNavigationFragment extends MenuBottomSheetDialogFr @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { WikivoyageSearchResult articleItem = (WikivoyageSearchResult) listAdapter.getGroup(groupPosition); - if (Algorithms.isEmpty(articleItem.getArticleRouteId())) { + if (Algorithms.isEmpty(articleItem.getArticleTitle())) { Toast.makeText(getContext(), R.string.wiki_article_not_found, Toast.LENGTH_LONG).show(); } else { - sendResults(articleItem.getArticleId()); + sendResults(articleItem.getArticleTitle()); dismiss(); } return true; @@ -150,14 +150,14 @@ public class WikivoyageArticleNavigationFragment extends MenuBottomSheetDialogFr return nightMode ? R.color.wikivoyage_bottom_bar_bg_dark : R.color.list_background_color_light; } - private void sendResults(TravelArticleIdentifier articleId) { - WikivoyageArticleDialogFragment.showInstance(getMyApplication(), getFragmentManager(), articleId, selectedLang); + private void sendResults(String title) { + WikivoyageArticleDialogFragment.showInstanceByTitle(getMyApplication(), getFragmentManager(), title, selectedLang); } public static boolean showInstance(@NonNull FragmentManager fm, - @Nullable Fragment targetFragment, - @NonNull TravelArticleIdentifier articleId, - @NonNull String selectedLang) { + @Nullable Fragment targetFragment, + @NonNull TravelArticleIdentifier articleId, + @NonNull String selectedLang) { try { Bundle args = new Bundle(); args.putParcelable(ARTICLE_ID_KEY, articleId); @@ -239,7 +239,7 @@ public class WikivoyageArticleNavigationFragment extends MenuBottomSheetDialogFr boolean isLastChild, View convertView, ViewGroup parent) { WikivoyageSearchResult articleItem = getArticleItem(groupPosition, childPosition); String childTitle = articleItem.getArticleTitle(); - boolean selected = articleItem.getArticleId().equals(articleId) || parentsList.contains(childTitle); + boolean selected = childTitle.equals(article.getTitle()) || parentsList.contains(childTitle); if (convertView == null) { convertView = LayoutInflater.from(context) diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelArticle.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelArticle.java index 0989a7c2e1..cf38b7265f 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelArticle.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelArticle.java @@ -31,6 +31,7 @@ public class TravelArticle { String title; String content; String isPartOf; + String isParentOf = ""; double lat = Double.NaN; double lon = Double.NaN; String imageTitle; diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java index 21b9e9dc37..cdc166e231 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java @@ -172,6 +172,7 @@ public class TravelObfHelper implements TravelHelper { res.title = Algorithms.isEmpty(title) ? amenity.getName() : title; res.content = amenity.getDescription(lang); res.isPartOf = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.IS_PART, lang)); + res.isParentOf = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.IS_PARENT_OF, lang)); res.lat = amenity.getLocation().getLatitude(); res.lon = amenity.getLocation().getLongitude(); res.imageTitle = Algorithms.emptyIfNull(amenity.getTagContent(Amenity.IMAGE_TITLE, null)); @@ -401,64 +402,29 @@ public class TravelObfHelper implements TravelHelper { Map> navMap = new HashMap<>(); Set headers = new LinkedHashSet<>(); Map headerObjs = new HashMap<>(); - Map> amenityMap = new HashMap<>(); - for (BinaryMapIndexReader reader : getReaders()) { - try { - SearchRequest req = BinaryMapIndexReader.buildSearchPoiRequest(0, - Integer.MAX_VALUE, 0, Integer.MAX_VALUE, -1, getSearchFilter(false), new ResultMatcher() { - - @Override - public boolean publish(Amenity amenity) { - String isPartOf = amenity.getTagContent(Amenity.IS_PART, lang); - if (Algorithms.stringsEqual(title, isPartOf)) { - return true; - } else if (parts != null && parts.length > 0) { - String title = amenity.getName(lang); - title = Algorithms.isEmpty(title) ? amenity.getName() : title; - for (int i = 0; i < parts.length; i++) { - String part = parts[i]; - if (i == 0 && Algorithms.stringsEqual(part, title) || Algorithms.stringsEqual(part, isPartOf)) { - return true; - } - } - } - return false; - } - - @Override - public boolean isCancelled() { - return false; - } - }); - List amenities = reader.searchPoi(req); - if (!Algorithms.isEmpty(amenities)) { - amenityMap.put(reader.getFile(), amenities); - } - } catch (Exception e) { - LOG.error(e.getMessage(), e); - } - } if (parts != null && parts.length > 0) { headers.addAll(Arrays.asList(parts)); - headers.add(title); } - if (!Algorithms.isEmpty(amenityMap)) { - for (Entry> entry : amenityMap.entrySet()) { - File file = entry.getKey(); - for (Amenity amenity : entry.getValue()) { - Set nameLangs = getLanguages(amenity); - if (nameLangs.contains(lang)) { - TravelArticle a = readArticle(file, amenity, lang, false); - WikivoyageSearchResult rs = new WikivoyageSearchResult(a, new ArrayList<>(nameLangs)); - List l = navMap.get(rs.isPartOf); - if (l == null) { - l = new ArrayList<>(); - navMap.put(rs.isPartOf, l); - } - l.add(rs); - if (headers.contains(a.getTitle())) { - headerObjs.put(a.getTitle(), rs); - } + + for (String header : headers) { + TravelArticle parentArticle = getParentArticleByTitle(header, lang); + if (parentArticle == null) { + continue; + } + navMap.put(header, new ArrayList()); + String[] isParentOf = parentArticle.isParentOf.split(";"); + for (String childTitle : isParentOf) { + if (!childTitle.isEmpty()) { + WikivoyageSearchResult searchResult = new WikivoyageSearchResult("", childTitle, null, + null, Collections.singletonList(lang)); + List resultList = navMap.get(header); + if (resultList == null) { + resultList = new ArrayList<>(); + navMap.put(header, resultList); + } + resultList.add(searchResult); + if (headers.contains(childTitle)) { + headerObjs.put(childTitle, searchResult); } } } @@ -483,6 +449,41 @@ public class TravelObfHelper implements TravelHelper { return res; } + private TravelArticle getParentArticleByTitle(final String title, final String lang) { + TravelArticle article = null; + final List amenities = new ArrayList<>(); + for (BinaryMapIndexReader reader : getReaders()) { + try { + SearchRequest req = BinaryMapIndexReader.buildSearchPoiRequest( + 0, 0, title, 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, getSearchFilter(false), + new ResultMatcher() { + boolean done = false; + + @Override + public boolean publish(Amenity amenity) { + if (Algorithms.stringsEqual(title, Algorithms.emptyIfNull(amenity.getName(lang)))) { + amenities.add(amenity); + done = true; + } + return false; + } + + @Override + public boolean isCancelled() { + return done; + } + }, null); + reader.searchPoiByName(req); + } catch (IOException e) { + LOG.error(e.getMessage()); + } + if (!Algorithms.isEmpty(amenities)) { + article = readArticle(reader.getFile(), amenities.get(0), lang, false); + } + } + return article; + } + @Override public TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @NonNull String lang) { TravelArticle article = getCachedArticle(articleId, lang, true); diff --git a/build.gradle b/build.gradle index 2f7736470a..e59a694b17 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } dependencies { //classpath 'com.android.tools.build:gradle:2.+' - classpath 'com.android.tools.build:gradle:4.1.1' + classpath 'com.android.tools.build:gradle:4.1.2' classpath 'com.google.gms:google-services:3.0.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"