diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java index eb93e95699..2e6db09022 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java @@ -49,14 +49,16 @@ public class RouteCalculationProgress { pr = Math.min(p * p / (all * all), 1); } float progress = INITIAL_PROGRESS; - if (totalIterations > 1) { + if (totalIterations <= 1) { + progress = INITIAL_PROGRESS + pr * (1 - INITIAL_PROGRESS); + } else if (totalIterations <= 2) { if (iteration < 1) { progress = pr * FIRST_ITERATION + INITIAL_PROGRESS; } else { progress = (INITIAL_PROGRESS + FIRST_ITERATION) + pr * (1 - FIRST_ITERATION - INITIAL_PROGRESS); } } else { - progress = INITIAL_PROGRESS + pr * (1 - INITIAL_PROGRESS); + progress = (float) ((iteration + Math.min(pr, 0.7)) / totalIterations); } return Math.min(progress * 100f, 99); } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java index f284a205aa..5aefb2ac44 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java @@ -64,8 +64,6 @@ public class RoutePlannerFrontEnd { public int routeGapDistance; public int routeDistanceUnmatched; - public boolean calculationCancelled; - private boolean calculationDone; public GpxRouteApproximation(RoutingContext ctx) { this.ctx = ctx; @@ -82,10 +80,6 @@ public class RoutePlannerFrontEnd { routeCalculations, routeDistCalculations, routePointsSearched, routeDistance, routeDistanceUnmatched); } - public boolean isCalculationDone() { - return calculationDone; - } - public double distFromLastPoint(LatLon startPoint) { if (result.size() > 0) { return MapUtils.getDistance(getLastPoint(), startPoint); @@ -239,18 +233,22 @@ public class RoutePlannerFrontEnd { public GpxRouteApproximation searchGpxRoute(GpxRouteApproximation gctx, List gpxPoints, ResultMatcher resultMatcher) throws IOException, InterruptedException { long timeToCalculate = System.nanoTime(); gctx.ctx.keepNativeRoutingContext = true; + if (gctx.ctx.calculationProgress == null) { + gctx.ctx.calculationProgress = new RouteCalculationProgress(); + } GpxPoint start = null; GpxPoint prev = null; if (gpxPoints.size() > 0) { gctx.ctx.calculationProgress.totalIterations = (int) (gpxPoints.get(gpxPoints.size() - 1).cumDist / gctx.MAXIMUM_STEP_APPROXIMATION + 1); start = gpxPoints.get(0); } - while (start != null && !gctx.calculationCancelled) { + while (start != null && !gctx.ctx.calculationProgress.isCancelled) { double routeDist = gctx.MAXIMUM_STEP_APPROXIMATION; GpxPoint next = findNextGpxPointWithin(gctx, gpxPoints, start, routeDist); boolean routeFound = false; - gctx.ctx.calculationProgress.nextIteration(); if (next != null && initRoutingPoint(start, gctx, gctx.MINIMUM_POINT_APPROXIMATION)) { + gctx.ctx.calculationProgress.totalEstimatedDistance = 0; + gctx.ctx.calculationProgress.iteration = (int) (next.cumDist / gctx.MAXIMUM_STEP_APPROXIMATION); while (routeDist >= gctx.MINIMUM_STEP_APPROXIMATION && !routeFound) { routeFound = initRoutingPoint(next, gctx, gctx.MINIMUM_POINT_APPROXIMATION); if (routeFound) { @@ -299,20 +297,19 @@ public class RoutePlannerFrontEnd { } start = next; } - if(gctx.ctx.calculationProgress != null) { - gctx.ctx.calculationProgress.timeToCalculate = System.nanoTime() - timeToCalculate; + if (gctx.ctx.calculationProgress != null) { + gctx.ctx.calculationProgress.timeToCalculate = System.nanoTime() - timeToCalculate; } gctx.ctx.deleteNativeRoutingContext(); BinaryRoutePlanner.printDebugMemoryInformation(gctx.ctx); calculateGpxRoute(gctx, gpxPoints); - if (!gctx.result.isEmpty() && !gctx.calculationCancelled) { + if (!gctx.result.isEmpty() && !gctx.ctx.calculationProgress.isCancelled) { new RouteResultPreparation().printResults(gctx.ctx, gpxPoints.get(0).loc, gpxPoints.get(gpxPoints.size() - 1).loc, gctx.result); System.out.println(gctx); } if (resultMatcher != null) { - resultMatcher.publish(gctx.calculationCancelled ? null : gctx); + resultMatcher.publish(gctx.ctx.calculationProgress.isCancelled ? null : gctx); } - gctx.calculationDone = true; return gctx; } @@ -365,7 +362,7 @@ public class RoutePlannerFrontEnd { reg.initRouteEncodingRule(0, "highway", RouteResultPreparation.UNMATCHED_HIGHWAY_TYPE); List lastStraightLine = null; GpxPoint straightPointStart = null; - for (int i = 0; i < gpxPoints.size() && !gctx.calculationCancelled; ) { + for (int i = 0; i < gpxPoints.size() && !gctx.ctx.calculationProgress.isCancelled; ) { GpxPoint pnt = gpxPoints.get(i); if (pnt.routeToTarget != null && !pnt.routeToTarget.isEmpty()) { LatLon startPoint = pnt.routeToTarget.get(0).getStartPoint(); @@ -459,7 +456,7 @@ public class RoutePlannerFrontEnd { private void cleanupResultAndAddTurns(GpxRouteApproximation gctx) { // cleanup double joints int LOOK_AHEAD = 4; - for(int i = 0; i < gctx.result.size() && !gctx.calculationCancelled; i++) { + for(int i = 0; i < gctx.result.size() && !gctx.ctx.calculationProgress.isCancelled; i++) { RouteSegmentResult s = gctx.result.get(i); for(int j = i + 2; j <= i + LOOK_AHEAD && j < gctx.result.size(); j++) { RouteSegmentResult e = gctx.result.get(j); @@ -476,7 +473,7 @@ public class RoutePlannerFrontEnd { r.setTurnType(null); r.setDescription(""); } - if (!gctx.calculationCancelled) { + if (!gctx.ctx.calculationProgress.isCancelled) { preparation.prepareTurnResults(gctx.ctx, gctx.result); } } diff --git a/OsmAnd-telegram/res/values-pt/strings.xml b/OsmAnd-telegram/res/values-pt/strings.xml index 8b114893d7..6076bfee91 100644 --- a/OsmAnd-telegram/res/values-pt/strings.xml +++ b/OsmAnd-telegram/res/values-pt/strings.xml @@ -163,7 +163,7 @@ Por favor, instale o Telegram e configure uma conta. Então pode usar esta app. Todos - Desativado + Desligado Precisa de uma conta e número de telefone registados no Telegram Não tenho uma conta do Telegram Digite o número de telefone @@ -204,7 +204,7 @@ A app não tem permissão para acessar os dados de localização. Por favor, ligue \"Localização\" nas configurações do sistema Selecione um dos provedores de localização para compartilhar sua localização. - Modo em segundo plano + Modo de fundo OsmAnd Tracker é executado em segundo plano com o ecrã desligado. Distância Compartilhar localização @@ -230,15 +230,15 @@ m/s km/h mph - Quilômetros por hora + Quilómetros por hora Milhas por hora Metros por segundo - Minutos por quilômetro + Minutos por quilómetro Minutos por milha Milhas náuticas por hora (nó) Milhas/pés Milhas/jardas - Quilômetros/metros + Quilómetros/metros Milhas náuticas Milhas/metros h @@ -252,7 +252,7 @@ Selecione o fuso horário a mostrar nas suas mensagens de localização. Fuso horário Unidades e formatos - Alterar unidade de distância. + Alterar a unidade de medida de distância. Unidades de comprimento Definir unidade de velocidade. Unidade de velocidade diff --git a/OsmAnd/res/drawable/bottom_sheet_buttons_bg_dark.xml b/OsmAnd/res/drawable/bottom_sheet_buttons_bg_dark.xml new file mode 100644 index 0000000000..1322edb6cb --- /dev/null +++ b/OsmAnd/res/drawable/bottom_sheet_buttons_bg_dark.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/bottom_sheet_buttons_bg_light.xml b/OsmAnd/res/drawable/bottom_sheet_buttons_bg_light.xml new file mode 100644 index 0000000000..cfc0b32c50 --- /dev/null +++ b/OsmAnd/res/drawable/bottom_sheet_buttons_bg_light.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_behaviour_base.xml b/OsmAnd/res/layout/bottom_sheet_behaviour_base.xml new file mode 100644 index 0000000000..1f54a2b8d1 --- /dev/null +++ b/OsmAnd/res/layout/bottom_sheet_behaviour_base.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_plan_route_select_file.xml b/OsmAnd/res/layout/bottom_sheet_plan_route_select_file.xml index da5f1dff61..362dacf2c6 100644 --- a/OsmAnd/res/layout/bottom_sheet_plan_route_select_file.xml +++ b/OsmAnd/res/layout/bottom_sheet_plan_route_select_file.xml @@ -1,66 +1,59 @@ - - + + + + + android:clipToPadding="false" + android:orientation="horizontal" + android:paddingStart="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingEnd="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + tools:itemCount="3" + tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/point_editor_icon_category_item" + tools:orientation="horizontal" /> - + - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_plan_route_start.xml b/OsmAnd/res/layout/bottom_sheet_plan_route_start.xml index a4aa9f312e..d43c589a9d 100644 --- a/OsmAnd/res/layout/bottom_sheet_plan_route_start.xml +++ b/OsmAnd/res/layout/bottom_sheet_plan_route_start.xml @@ -1,47 +1,40 @@ - + android:orientation="horizontal" + android:paddingStart="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingTop="@dimen/bottom_sheet_title_padding_top" + android:paddingEnd="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingBottom="@dimen/bottom_sheet_title_padding_bottom"> - - - - - - - + android:letterSpacing="@dimen/description_letter_spacing" + android:text="@string/plan_route_last_edited" + android:textColor="?attr/active_color_basic" + android:textSize="@dimen/default_desc_text_size" + osmand:typeface="@string/font_roboto_medium" /> - \ No newline at end of file + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/fragment_measurement_tool.xml b/OsmAnd/res/layout/fragment_measurement_tool.xml index 425717f98a..fe1ba9b1d7 100644 --- a/OsmAnd/res/layout/fragment_measurement_tool.xml +++ b/OsmAnd/res/layout/fragment_measurement_tool.xml @@ -180,7 +180,10 @@ android:ellipsize="end" android:gravity="center_vertical" android:maxLines="1" - android:padding="@dimen/measurement_tool_text_button_padding_small" + android:paddingStart="@dimen/measurement_tool_text_button_padding_small" + android:paddingLeft="@dimen/measurement_tool_text_button_padding_small" + android:paddingEnd="@dimen/measurement_tool_text_button_padding_small" + android:paddingRight="@dimen/measurement_tool_text_button_padding_small" android:text="@string/shared_string_options" android:textColor="?attr/color_dialog_buttons" osmand:typeface="@string/font_roboto_medium"/> diff --git a/OsmAnd/res/layout/fragment_route_between_points_bottom_sheet_dialog.xml b/OsmAnd/res/layout/fragment_route_between_points_bottom_sheet_dialog.xml index 99b4cf41ff..49a09730d6 100644 --- a/OsmAnd/res/layout/fragment_route_between_points_bottom_sheet_dialog.xml +++ b/OsmAnd/res/layout/fragment_route_between_points_bottom_sheet_dialog.xml @@ -1,36 +1,32 @@ - + android:layout_height="wrap_content" + android:background="?attr/bg_color" + android:orientation="vertical"> + android:orientation="vertical" + android:paddingBottom="@dimen/bottom_sheet_content_padding_small"> - - - + android:gravity="center_vertical" + android:paddingStart="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingTop="@dimen/measurement_tool_menu_title_padding_top" + android:paddingEnd="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingBottom="@dimen/measurement_tool_menu_title_padding_bottom" + android:text="@string/route_between_points" + android:textAppearance="@style/TextAppearance.ListItemTitle" + osmand:typeface="@string/font_roboto_medium" /> - + - - - \ No newline at end of file + \ No newline at end of file diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 2e0f9a51b6..44e3867f3c 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -3810,15 +3810,15 @@ تم الكتابة فوق المسار ملف تعريف التنقل - حدد ملف المسار الذي سيتم إضافة مقطع جديد إليه. + حدد ملف المسار الذي سيتم إضافة مقطع جديد إليه. حفظ كمسار جديد عكس الطريق - سيتم إعادة حساب المقطع التالي فقط باستخدام ملف التعريف المحدد. - سيتم إعادة حساب المقطع التالي فقط باستخدام ملف التعريف المحدد. - حدد كيفية توصيل النقاط، بخط مستقيم، أو حساب مسار بينها مع ملف التعريف المحدد. + سيتم إعادة حساب المقطع التالي فقط باستخدام ملف التعريف المحدد. + سيتم إعادة حساب المقطع التالي فقط باستخدام ملف التعريف المحدد. + حدد كيفية توصيل النقاط، بخط مستقيم، أو حساب مسار بينها مع ملف التعريف المحدد. مسار كامل المقطع التالي - لاستخدام هذا الخيارتحتاج إلى محاذاة المسار الخاص بك إلى خريطة الطرق. + لاستخدام هذا الخيارتحتاج إلى محاذاة المسار الخاص بك إلى خريطة الطرق. \n \nفي الخطوة التالية ، ستحتاج إلى تحديد ملف تعريف الملاحة لاكتشاف الطرق المسموح بها وبداية المسافة لتقريب تتبعك بالطرق. بداية المسافة diff --git a/OsmAnd/res/values-b+kab/strings.xml b/OsmAnd/res/values-b+kab/strings.xml index 9023496916..43d88c80b1 100644 --- a/OsmAnd/res/values-b+kab/strings.xml +++ b/OsmAnd/res/values-b+kab/strings.xml @@ -1337,6 +1337,6 @@ Abrid yettin Aḥric i d-itteddun Amaɣnu n tunigin - Fren afaylu n uḍfar iɣer ara yernu uḥric amaynut. + Fren afaylu n uḍfar iɣer ara yernu uḥric amaynut. Tebɣiḍ s tidet ad tmedleḍ abrid n uɣawas war asekles\? Ad tesruḥeḍ akk ibeddilen. \ No newline at end of file diff --git a/OsmAnd/res/values-be/phrases.xml b/OsmAnd/res/values-be/phrases.xml index a7ed6bc224..3227d98308 100644 --- a/OsmAnd/res/values-be/phrases.xml +++ b/OsmAnd/res/values-be/phrases.xml @@ -3835,4 +3835,10 @@ Цэнтр дайвінгу Паляўнічая база Папаўненне пітной вады + Так + Расклад адпраўленняў: не + Расклад адпраўленняў + Расклад + Рэальны час + Затрымка \ No newline at end of file diff --git a/OsmAnd/res/values-be/strings.xml b/OsmAnd/res/values-be/strings.xml index 3727aa2c06..36cf216c5c 100644 --- a/OsmAnd/res/values-be/strings.xml +++ b/OsmAnd/res/values-be/strings.xml @@ -3697,17 +3697,17 @@ Перазапісаць след Захаваць як новы след Зваротны маршрут - Увесь след будзе пералічаны з выкарыстаннем абранага профілю. - Толькі наступны сегмент будзе пералічаны паводле абранага профілю. - Абярыце спосаб злучэння пунктаў. Варыянты: прамая лінія; разлік маршруту паводле абранага профілю. + Увесь след будзе пералічаны з выкарыстаннем абранага профілю. + Толькі наступны сегмент будзе пералічаны паводле абранага профілю. + Абярыце спосаб злучэння пунктаў. Варыянты: прамая лінія; разлік маршруту паводле абранага профілю. Увесь след Наступны сегмент - Для выкарыстання гэтага параметру OsmAnd пракладзе ваш след па дарогах. + Для выкарыстання гэтага параметру OsmAnd пракладзе ваш след па дарогах. \n \n Пасля вам патрэбна абраць профіль навігацыі для вызначэння маршруту з улікам параметраў і абмежаванняў гэтага профілю. Максімальная дыстанцыя Профіль навігацыі - Абраць файл следу, да якога будзе дададзены новы сегмент. + Абраць файл следу, да якога будзе дададзены новы сегмент. Выявы на ўзроўні вуліц Сапраўды закрыць план маршруту без захавання\? Усе змены страцяцца. У выпадку адваротнага кірунку diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index 895b086078..b6944c01bf 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -3713,17 +3713,17 @@ Abasta l\'àrea: %1$s x %2$s Afegir a una ruta Mostrar icones d\'inici final Triar amplària - Trieu un arxiu de ruta al qual s\'afegirà un nou segment. - Per usar aquesta opció OsmAnd ha d\'ajustar la seua ruta a les vies del mapa. + Trieu un arxiu de ruta al qual s\'afegirà un nou segment. + Per usar aquesta opció OsmAnd ha d\'ajustar la seua ruta a les vies del mapa. \n \nEn el pas següent cal que elegiu el perfil de navegació per detectar vies permeses i el llindar de distància per aproximar la ruta a les vies. - Trieu com connectar els punts, amb una línia recta, o calcular la ruta entre ells d\'acord amb el perfil seleccionat. + Trieu com connectar els punts, amb una línia recta, o calcular la ruta entre ells d\'acord amb el perfil seleccionat. Trieu l\'interval a què les marques de distància o temps sobre la ruta es mostraran. Personalitzat Desar com a una ruta nova Ruta inversa - La ruta sencera serà recalculada fent ús del perfil seleccionat. - Només el següent segment serà recalculat fent ús del perfil seleccionat. + La ruta sencera serà recalculada fent ús del perfil seleccionat. + Només el següent segment serà recalculat fent ús del perfil seleccionat. Ruta sencera Següent segment Llindar de distància diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index 54fad8d47e..058b72d771 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -3731,8 +3731,8 @@ Overskriv spor Gem som nyt spor Omvendt rute - Hele sporet genberegnes ved hjælp af den valgte profil. - Kun det næste segment genberegnes ved hjælp af den valgte profil. + Hele sporet genberegnes ved hjælp af den valgte profil. + Kun det næste segment genberegnes ved hjælp af den valgte profil. Hele sporet Næste segment Tærskelafstand diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index 92384a6b2a..53f9e13926 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -3817,7 +3817,7 @@ Wasserstand: über dem mittleren Wasserstand Wasserstand: unter dem mittleren Wasserstand Hindernis - Trinkwassernachfüllung: ja + ja Trinkwassernachfüllung: nein Trinkwasser-Nachfüllnetz Internetzugangsgebühr für Kunden @@ -3827,7 +3827,7 @@ Rohr Druck Pumpenzustand: fehlender Arm - Ja + ja ja kein Vibrieren Pfeil @@ -3836,4 +3836,12 @@ Stadtteil Bezirk Aufzug + Fahrplan + Echtzeit + Verspätung + ja + Anzeige der Abreisezeiten: nein + Abbiegepfeil: nein + Anzeige der Abreisezeiten + Nachfüllen von Trinkwasser \ No newline at end of file diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 296430c488..16672becc8 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -2015,7 +2015,7 @@ Erforderlich, um Karten herunterzuladen. Standort wird gesucht … Freier Speicherplatz - OsmAnd speichert Daten (Karten, GPX-Dateien usw.) in \'%1$s\'. + OsmAnd speichert Daten (Karten, Track-Dateien usw.) in \'%1$s\'. Berechtigung erteilen Standortbestimmung zulassen Erhalten Sie Wegbeschreibungen und entdecken Sie neue Orte ohne Internetverbindung @@ -2072,8 +2072,8 @@ Benachrichtigungen Aussehen Routenberechnung - Sie haben noch keine GPX-Dateien - GPX-Dateien können dem Ordner hinzugefügt werden + Sie haben noch keine Track-Dateien + Track-Dateien können dem Ordner hinzugefügt werden Weitere hinzufügen … POI hochladen Nehmen Sie die %1$d Ausfahrt @@ -2901,10 +2901,10 @@ Von %1$s Schritt für Schritt Straßentypen - GPX-Tracks ein-/ausblenden - Eine Schaltfläche zum Ein- oder Ausblenden ausgewählter GPX-Tracks auf der Karte. - GPX-Tracks ausblenden - GPX-Tracks einblenden + Tracks ein-/ausblenden + Eine Schaltfläche zum Ein- oder Ausblenden ausgewählter Tracks auf der Karte. + Tracks ausblenden + Tracks einblenden Aussteigen bei Zusteigen an Haltestelle Aktivierung von OsmAnd Live für Änderungen bei öffentlichen Verkehrsmitteln. @@ -3829,13 +3829,13 @@ Schwellenwert-Distanz Als neuen Track speichern Route umkehren - Der gesamte Track wird mit dem ausgewählten Profil neu berechnet. - Nur das nächste Segment wird mit dem ausgewählten Profil neu berechnet. - Wählen Sie, wie Punkte mit einer geraden Linie verbunden werden sollen, oder berechnen Sie eine Route zwischen ihnen mit dem ausgewählten Profil. + Der gesamte Track wird mit dem ausgewählten Profil neu berechnet. + Nur das nächste Segment wird mit dem ausgewählten Profil neu berechnet. + Wählen Sie, wie Punkte mit einer geraden Linie verbunden werden sollen, oder berechnen Sie eine Route zwischen ihnen mit dem ausgewählten Profil. Ganzer Track Nächstes Segment Navigationsprofil - Wählen Sie eine Trackdatei, für die ein neues Segment hinzugefügt werden soll. + Wählen Sie eine Trackdatei, für die ein neues Segment hinzugefügt werden soll. Track auswählen, der verfolgt werden soll Adresse löschen Adresse hinzufügen @@ -3876,7 +3876,7 @@ Track Datei zum Folgen auswählen, oder importieren. Die GPX-Aufzeichnung wird angehalten, wenn OsmAnd beendet wird (über „zuletzt verwendete Apps“). (Die Hintergrunddienst-Anzeige verschwindet aus der Android-Benachrichtigungsleiste.) Aufzeichnungsintervall für die generelle Track-Aufzeichnung festlegen (via Schaltfläche \'GPX\' auf dem Kartenbildschirm). - Um diese Option nutzen zu können, muss OsmAnd den Track auf die Straßen der Karte einrasten. + Um diese Option nutzen zu können, muss OsmAnd den Track auf die Straßen der Karte einrasten. \n \n Wählen Sie im nächsten Schritt ein Navigationsprofil um festzulegen, welche Straßentypen verwendet werden sollen, und wählen Sie einen Wert für die maximal zulässige Entfernung zwischen Track und Straße. Track-Wegpunkt hinzufügen @@ -3891,4 +3891,5 @@ Anderen Track wählen Track-Punkt, zu dem navigiert werden soll Nächstgelegener Punkt + Wiederholen \ No newline at end of file diff --git a/OsmAnd/res/values-el/strings.xml b/OsmAnd/res/values-el/strings.xml index d97fabeee7..9ef59f2e76 100644 --- a/OsmAnd/res/values-el/strings.xml +++ b/OsmAnd/res/values-el/strings.xml @@ -3708,17 +3708,17 @@ Σημειώστε τις επιλογές αφύπνισης της οθόνης (εξασφαλίστε ότι το OsmAnd είναι στο προσκήνιο όταν η συσκευή κλειδώνεται): Αποθήκευση ως νέου ίχνους Αντιστροφή διαδρομής - Ολόκληρο το ίχνος θα επανυπολογιστεί χρησιμοποιώντας την επιλεγμένη κατατομή (προφίλ). - Μόνο το επόμενο τμήμα θα επανυπολογιστεί χρησιμοποιώντας την επιλεγμένη κατατομή (προφίλ). - Επιλέξτε πώς να συνδέσετε τα σημεία, με ευθεία γραμμή, ή να υπολογίσετε μια διαδρομή μεταξύ τους με την επιλεγμένη κατατομή (προφίλ). - Για να χρησιμοποιήσετε αυτήν την επιλογή το OsmAnd χρειάζεται να προσκολλήσει το ίχνος σας στους δρόμους του χάρτη. + Ολόκληρο το ίχνος θα επανυπολογιστεί χρησιμοποιώντας την επιλεγμένη κατατομή (προφίλ). + Μόνο το επόμενο τμήμα θα επανυπολογιστεί χρησιμοποιώντας την επιλεγμένη κατατομή (προφίλ). + Επιλέξτε πώς να συνδέσετε τα σημεία, με ευθεία γραμμή, ή να υπολογίσετε μια διαδρομή μεταξύ τους με την επιλεγμένη κατατομή (προφίλ). + Για να χρησιμοποιήσετε αυτήν την επιλογή το OsmAnd χρειάζεται να προσκολλήσει το ίχνος σας στους δρόμους του χάρτη. \n \nΣτο επόμενο βήμα θα χρειαστείτε να επιλέξετε κατατομή (προφίλ) πλοήγησης για να εντοπίσετε τους επιτρεπόμενους δρόμους και την απόσταση κατωφλίου για να προσεγγίσετε το ίχνος σας με τους δρόμους. Ολόκληρο το ίχνος Επόμενο τμήμα Απόσταση κατωφλίου Κατατομή (προφίλ) πλοήγησης - Επιλέξτε ένα αρχείο ίχνους στο οποίο θα προστεθεί νέο τμήμα. + Επιλέξτε ένα αρχείο ίχνους στο οποίο θα προστεθεί νέο τμήμα. Τατζίκικα Μερικά άρθρα της Wikipedia μπορεί να μην είναι διαθέσιμα στη γλώσσα σας. Καντονέζικα diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index e5480958a6..304dea0021 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -3821,17 +3821,17 @@ Superskribi kurson Konservi kiel novan spuron Inversigi kurson - Tuta kurso estos rekalkulita uzante la elektitan profilon. - Nur sekva segmento estos rekalkulita uzante la elektitan profilon. - Elektu kiel konekti punktojn: ĉu per rekta linio, ĉu kalkuli kurson inter ilin uzante la elektitan profilon. + Tuta kurso estos rekalkulita uzante la elektitan profilon. + Nur sekva segmento estos rekalkulita uzante la elektitan profilon. + Elektu kiel konekti punktojn: ĉu per rekta linio, ĉu kalkuli kurson inter ilin uzante la elektitan profilon. Tuta kurso Sekva segmento - Por uzi tiun ĉi agordon, OsmAnd postulas ĝustigi vian kurson al vojoj sur la mapo. + Por uzi tiun ĉi agordon, OsmAnd postulas ĝustigi vian kurson al vojoj sur la mapo. \n \n Sekve vi devos elekti profilon de navigo (por trovi permesatajn vojojn) kaj sojlan distancon (por alproksimigi vian kurson al vojoj). Sojla distanco Profilo de navigo - Elektu dosieron de spuro al kiu nova segmento estos aldonita. + Elektu dosieron de spuro al kiu nova segmento estos aldonita. Strat-nivela fotaro Ĉu vi certe volas fermi planadon de kurso sen konservi\? Ĉiuj viaj ŝanĝoj perdiĝos. Kiam en inversa direkto diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml index a90d059b97..5c24c258fb 100644 --- a/OsmAnd/res/values-es-rAR/phrases.xml +++ b/OsmAnd/res/values-es-rAR/phrases.xml @@ -3822,7 +3822,7 @@ Nivel del agua: por encima del nivel medio del agua Nivel del agua: por debajo del nivel medio del agua Obstrucción - Recarga de agua potable: sí + Recarga de agua potable: no Red de recarga de agua potable Succión @@ -3841,4 +3841,11 @@ Municipio Flecha: no Ascensor + A horario + En tiempo real + Con retraso + + Tablero de partidas: no + Tablero de partidas + Recarga de agua potable \ 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 53987c3a28..0b581eab94 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -3826,17 +3826,17 @@ Sobrescribir traza Guardar como nueva traza Ruta inversa - Recalcular sólo el siguiente segmento usando el perfil elegido. - Recalcular toda la traza usando el perfil elegido. - Marca cómo conectar los puntos, con una línea recta o calcular una ruta entre ellos con el perfil elegido. + Recalcular sólo el siguiente segmento usando el perfil elegido. + Recalcular toda la traza usando el perfil elegido. + Marca cómo conectar los puntos, con una línea recta o calcular una ruta entre ellos con el perfil elegido. Traza completa Siguiente segmento - Para utilizar esta opción, OsmAnd debe ajustar su traza a los caminos del mapa. + Para utilizar esta opción, OsmAnd debe ajustar su traza a los caminos del mapa. \n \n En el siguiente paso se debe elegir el perfil de navegación para detectar los caminos permitidos y el umbral de distancia para aproximar la traza a los caminos. Distancia de umbral Perfil de navegación - Elige un archivo de traza al que se añadirá un nuevo segmento. + Elige un archivo de traza al que se añadirá un nuevo segmento. Imágenes a nivel de calle ¿Cerrar el plan de ruta sin guardar\? Se perderán todos los cambios. En caso de dirección inversa diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml index 608cb6e866..29da2f288d 100644 --- a/OsmAnd/res/values-es-rUS/strings.xml +++ b/OsmAnd/res/values-es-rUS/strings.xml @@ -3834,13 +3834,13 @@ Grabar la traza automáticamente al navegar Intervalo de registro para la grabación general de trazas (activar mediante el widget de grabación de viaje sobre el mapa). Guardar como nueva traza - Recalcular toda la traza usando el perfil elegido. - Para utilizar esta opción, OsmAnd debe ajustar su traza a los caminos del mapa. + Recalcular toda la traza usando el perfil elegido. + Para utilizar esta opción, OsmAnd debe ajustar su traza a los caminos del mapa. \n \n En el siguiente paso se debe elegir el perfil de navegación para detectar los caminos permitidos y el umbral de distancia para aproximar la traza a los caminos. - Recalcular sólo el siguiente segmento usando el perfil elegido. - Marca cómo conectar los puntos, con una línea recta o calcular una ruta entre ellos con el perfil elegido. - Elige un archivo de traza al que se añadirá un nuevo segmento. + Recalcular sólo el siguiente segmento usando el perfil elegido. + Marca cómo conectar los puntos, con una línea recta o calcular una ruta entre ellos con el perfil elegido. + Elige un archivo de traza al que se añadirá un nuevo segmento. Ruta inversa Añadir punto de referencia de la traza Segmento anterior diff --git a/OsmAnd/res/values-et/phrases.xml b/OsmAnd/res/values-et/phrases.xml index 629a0b4e08..9edfecd079 100644 --- a/OsmAnd/res/values-et/phrases.xml +++ b/OsmAnd/res/values-et/phrases.xml @@ -3792,7 +3792,7 @@ SMS Joogivee täitmise võrgustik Joogivee täitmine: ei - Joogivee täitmine: jah + Jah Takistus Veetase: alla keskmise veetaseme Veetase: üle keskmise veetaseme @@ -3816,4 +3816,11 @@ Surve Nool: ei Lift + Sõiduplaan + Reaalajas + Viivitus + Jah + Väljuvate reiside tabloo: ei + Väljuvate reiside tabloo + Joogivee täitmine \ No newline at end of file diff --git a/OsmAnd/res/values-et/strings.xml b/OsmAnd/res/values-et/strings.xml index d3a43c153e..d058f6ca17 100644 --- a/OsmAnd/res/values-et/strings.xml +++ b/OsmAnd/res/values-et/strings.xml @@ -3644,7 +3644,7 @@ Terve rada Järgmine segment Navigeerimisprofiil - Vali rajafail, millele lisame uue segmendi. + Vali rajafail, millele lisame uue segmendi. Tänavataseme vaated Kas sa oled kindel et soovid sulgeda teekonna planeerija ilma seda salvestamata\? Kõik muudatused lähevad kaotsi. Vastupidise suuna korral @@ -3662,7 +3662,7 @@ „Lähtesta vaikeseadeteks“ taastab paigaldusjärgse vaikimisi sortimisjärjekorra. Lisaprogramm arendajale Toiming %1$s ei ole toetatud - Terve rada arvutatakse valitud profiili abil uuesti. + Terve rada arvutatakse valitud profiili abil uuesti. Salvesta uue rajana Kirjuta rada üle Veebipõhine OSM kaartide klassifikatsioon piltidega. diff --git a/OsmAnd/res/values-eu/strings.xml b/OsmAnd/res/values-eu/strings.xml index bd2cfbcd31..abd30d80ff 100644 --- a/OsmAnd/res/values-eu/strings.xml +++ b/OsmAnd/res/values-eu/strings.xml @@ -3781,7 +3781,7 @@ Area honi dagokio: %1$s x %2$s Norabideko geziak Sortu ibilbide berria Distantzia margena - Aukera hau erabiltzeko OsmAnd-ek zure arrastoak mapako errepideetara atxiki behar ditu. + Aukera hau erabiltzeko OsmAnd-ek zure arrastoak mapako errepideetara atxiki behar ditu. \n \nHurrengo urratsean, nabigazio profila hautatu beharko duzu baimendutako errepideak eta zure arrastoa errepideetara hurbiltzeko distantzia tartea atzemateko. Editatutako azkena @@ -3791,12 +3791,12 @@ Area honi dagokio: %1$s x %2$s Gainidatzi arrastoa Gorde arrasto berri gisa Alderantzizko ibilbidea - Arrasto osoa birkalkulatuko da hautatutako profilaren bidez. - Bakarrik hurrengo segmentua birkalkulatuko da hautatutako profilaren bidez. - Hautatu nola konektatu puntuak, lerro zuzen batez, edo kalkulatu horien arteko ibilbidea hautatutako profilarekin. + Arrasto osoa birkalkulatuko da hautatutako profilaren bidez. + Bakarrik hurrengo segmentua birkalkulatuko da hautatutako profilaren bidez. + Hautatu nola konektatu puntuak, lerro zuzen batez, edo kalkulatu horien arteko ibilbidea hautatutako profilarekin. Arrasto osoa Hurrengo segmentua Nabigazio profila - Hautatu zein arrasto fitxategiari gehituko zaion segmentu berria. + Hautatu zein arrasto fitxategiari gehituko zaion segmentu berria. Ezarri behar dituzu lanegunak jarraitzeko \ No newline at end of file diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 726ae2b57e..401ab1f460 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -3801,13 +3801,13 @@ Sélectionnez un fichier de trace à ouvrir. Terminé Remplacer la trace - Sélectionnez comment relier les points : par une ligne droite ou en calculant un itinéraire avec le profil sélectionné. - Toute la trace sera recalculée en utilisant le profil sélectionné. - Seul le prochain segment sera recalculé en utilisant le profil sélectionné. - Pour utiliser cette option, OsmAnd doit aligner votre trace sur les routes de la carte. + Sélectionnez comment relier les points : par une ligne droite ou en calculant un itinéraire avec le profil sélectionné. + Toute la trace sera recalculée en utilisant le profil sélectionné. + Seul le prochain segment sera recalculé en utilisant le profil sélectionné. + Pour utiliser cette option, OsmAnd doit aligner votre trace sur les routes de la carte. \n \n À l\'étape suivante, vous devrez sélectionner le profil de navigation pour détecter les routes autorisées et le seuil de distance pour rapprocher votre trace des routes. - Sélectionnez un fichier de trace auquel ajouter un nouveau segment. + Sélectionnez un fichier de trace auquel ajouter un nouveau segment. Enregistrer comme nouvelle trace Inverser l\'itinéraire Trace entière diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml index 25eab931cf..0be4073d8b 100644 --- a/OsmAnd/res/values-hu/strings.xml +++ b/OsmAnd/res/values-hu/strings.xml @@ -3834,7 +3834,7 @@ Egyszerűsített nyomvonal Kész elmentve - Jelölje ki, hogyan legyenek összekötve a pontok: egyenes vonallal vagy a kiválasztott profilnak megfelelően kiszámított útvonallal. + Jelölje ki, hogyan legyenek összekötve a pontok: egyenes vonallal vagy a kiválasztott profilnak megfelelően kiszámított útvonallal. Teljes nyomvonal Megjegyzés: Ha a GPS közvetlenül a felvétel előtt ki volt kapcsolva, akkor rosszabb lehet az első mért pont pontossága. A kódban ezért szeretnénk majd talán várni egy-két másodpercet egy pont rögzítése előtt (vagy a 3 egymást követő pont közül a legjobbat rögzíteni vagy valami hasonló), de ezt még nem programoztuk le. Cím törlése @@ -3847,8 +3847,8 @@ Meglévő nyomvonal megnyitása Tömör Adja meg a címet - Csak a következő szakasz lesz újraszámítva a kiválasztott profilnak megfelelően. - Ennek a beállításnak a használatához az OsmAndnak hozzá kell tördelnie a nyomvonalát a térképen található utakhoz. + Csak a következő szakasz lesz újraszámítva a kiválasztott profilnak megfelelően. + Ennek a beállításnak a használatához az OsmAndnak hozzá kell tördelnie a nyomvonalát a térképen található utakhoz. \n \n A következő lépésben ki kell választania a navigációs profilt az engedélyezett utak és a küszöbtávolság észleléséhez, hogy a nyomvonalát közelíteni lehessen az utakhoz. Egyedi @@ -3867,7 +3867,7 @@ Minden korábbi szakasz Válassza ki a megnyitni kívánt nyomvonalfájlt. Útvonaltípus módosítása ez előtt: - A teljes útvonal újra lesz számítva a kiválasztott profilnak megfelelően. + A teljes útvonal újra lesz számítva a kiválasztott profilnak megfelelően. Mentés új nyomvonalként Útvonal megfordítása Cím hozzáadása @@ -3877,7 +3877,7 @@ 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. 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. + Jelölje ki azt a nyomvonalfájlt, amelyhez az új szakasz hozzáadódjék. Nyomvonalak Mégis \ No newline at end of file diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml index 97a4c5bcf6..d2404aaba2 100644 --- a/OsmAnd/res/values-is/strings.xml +++ b/OsmAnd/res/values-is/strings.xml @@ -3776,9 +3776,9 @@ \nVeldu %1$s og þú munt fá aðvaranir og ábendingar um hraðamyndavélar. \n \nVeldu %2$s: öllum gögnum sem tengjast hraðamyndavélum; t.d. aðvaranir, tilkynningar, staðsetningar o.fl. verður eytt þar til OsmAnd er sett inn aftur frá grunni. - Veldu ferilskrá þar sem nýjum bút verður bætt inn. - Veldu hvernig eigi að tengja punkta; með beinni línu eða reikna leið milli þeirra með þessu sniði. - Allur ferillinn verður endurreiknaður með völdu sniði. + Veldu ferilskrá þar sem nýjum bút verður bætt inn. + Veldu hvernig eigi að tengja punkta; með beinni línu eða reikna leið milli þeirra með þessu sniði. + Allur ferillinn verður endurreiknaður með völdu sniði. Lokaður OSM-minnispunktur Allur ferillinn Sýna tákn fyrir upphaf/enda @@ -3792,7 +3792,7 @@ Virkja þetta til að hægt sé að stýra aðdráttarstigi korts með hljóðstyrkshnöppum. Tilgreindu lengd farartækis sem leyfð er á leiðum. Ef stefna er öfug - Aðeins næsti bútur verður endurreiknaður með völdu sniði. + Aðeins næsti bútur verður endurreiknaður með völdu sniði. Enduro-mótorhjól Leið milli punkta Næsti bútur @@ -3858,7 +3858,7 @@ Settu inn heimilisfang Veldu ferilskrá til að fylgja eða flyttu inn úr tæki. Bæta í ferilskrá - Til að nota þennan valkost þarf OsmAnd að festa ferilinn þinn við vegi á kortinu. + Til að nota þennan valkost þarf OsmAnd að festa ferilinn þinn við vegi á kortinu. \n \nÍ næsta skrefi þarftu að velja leiðsagnarsnið svo hægt sé að finna hvaða vegir séu leyfilegir og hvaða þolvik vegalengdar eigi að miða við til að nálga ferilinn þinn við fyrirliggjandi vegi. Bæta við ferilskrám diff --git a/OsmAnd/res/values-it/strings.xml b/OsmAnd/res/values-it/strings.xml index 764e5959fe..6b8fad2f81 100644 --- a/OsmAnd/res/values-it/strings.xml +++ b/OsmAnd/res/values-it/strings.xml @@ -3823,19 +3823,19 @@ Scegli il file di una traccia da aprire. Fatto Profilo di navigazione - Per utilizzare questa opzione OsmAnd ha bisogno di bloccare la traccia alle strade della mappa. + Per utilizzare questa opzione OsmAnd ha bisogno di bloccare la traccia alle strade della mappa. \n \n Nel prossimo passaggio avrai bisogno di selezionare il profilo di navigazione per determinare le strade permesse e la soglia della distanza per approssimare la strada alle strade. - Scegli come collegare i punti, con una linea retta, o calcolando un percorso che li colleghi utilizzando il profilo scelto. + Scegli come collegare i punti, con una linea retta, o calcolando un percorso che li colleghi utilizzando il profilo scelto. Sovrascrivi traccia Salva come nuova Traccia Inverti il percorso - Solo il nuovo segmento sarà ricalcolato utilizzando il profilo scelto. - Tutta la traccia sarà ricalcolata utilizzando il profilo scelto. + Solo il nuovo segmento sarà ricalcolato utilizzando il profilo scelto. + Tutta la traccia sarà ricalcolata utilizzando il profilo scelto. Tutta la traccia Nuovo segmento Soglia distanza - Seleziona un file traccia a cui verrà aggiunto un nuovo segmento. + Seleziona un file traccia a cui verrà aggiunto un nuovo segmento. Immagini stradali Sei sicuro di voler chiudere la Pianificazione del percorso senza salvare\? Perderai tutti i cambiamenti. In caso di direzione inversa diff --git a/OsmAnd/res/values-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml index e418440ed8..ce6cf4cb93 100644 --- a/OsmAnd/res/values-iw/strings.xml +++ b/OsmAnd/res/values-iw/strings.xml @@ -3834,11 +3834,11 @@ המקטע הבא סף מרחק פרופיל ניווט - נא לבחור קובץ מסלול שבו יתווסף המקטע החדש. - כל המסלול יחושב מחדש באמצעות הפרופיל הנבחר. - רק המקטע הבא יחושב מחודש באמצעות הפרופיל הנבחר. - נא לבחור כיצד לחבר נקודות, בקו ישר, או לחבר מסלול ביניהן עם הפרופיל הנבחר. - כדי להשתמש באפשרות זו על OsmAnd להצמיד את המסלול שלך לדרכים שעל המפה. + נא לבחור קובץ מסלול שבו יתווסף המקטע החדש. + כל המסלול יחושב מחדש באמצעות הפרופיל הנבחר. + רק המקטע הבא יחושב מחודש באמצעות הפרופיל הנבחר. + נא לבחור כיצד לחבר נקודות, בקו ישר, או לחבר מסלול ביניהן עם הפרופיל הנבחר. + כדי להשתמש באפשרות זו על OsmAnd להצמיד את המסלול שלך לדרכים שעל המפה. \n \n בשלב הבא יהיה עליך לבחור בפרופיל ניווט כדי לזהות את הדרכים המורשות ואת סף המרחק כדי להעריך את המסלול שלך ביחס לדרכים. תמונות ברמת רחוב diff --git a/OsmAnd/res/values-ja/strings.xml b/OsmAnd/res/values-ja/strings.xml index 3f0cdf866d..b3d6ea7d20 100644 --- a/OsmAnd/res/values-ja/strings.xml +++ b/OsmAnd/res/values-ja/strings.xml @@ -3733,17 +3733,17 @@ POIの更新は利用できません 経路を上書き 新しい経路として保存 ルート反転 - 選択したプロファイルを使用して、次のセグメントのみ再計算します。 - 選択したプロファイルを使用して、経路全体が再計算されます。 - 直線で地点間をつなげる方法をとるか、選択したプロファイルで地点間のルートを計算します。 + 選択したプロファイルを使用して、次のセグメントのみ再計算します。 + 選択したプロファイルを使用して、経路全体が再計算されます。 + 直線で地点間をつなげる方法をとるか、選択したプロファイルで地点間のルートを計算します。 全経路 次のセグメント - このオプションを使用するには、OsmAndで経路をマップ上の道路にスナップする必要があります。 + このオプションを使用するには、OsmAndで経路をマップ上の道路にスナップする必要があります。 \n \n次にナビゲーションプロファイルを選択して、利用予定の道路(一般道、高速道路)と、道路を追跡するおおよその距離を検出する必要があります。 限界距離 ナビゲーションプロファイル - 新しいセグメントを追加するための経路ファイルを選択します。 + 新しいセグメントを追加するための経路ファイルを選択します。 ストリート画像 保存せずにルート計画を終了した場合すべての変更が失われます。よろしいですか? エンデューロバイク diff --git a/OsmAnd/res/values-nb/strings.xml b/OsmAnd/res/values-nb/strings.xml index aa1ff19745..f3c79269cd 100644 --- a/OsmAnd/res/values-nb/strings.xml +++ b/OsmAnd/res/values-nb/strings.xml @@ -3705,18 +3705,19 @@ Velg en sporfil for åpning. Snu rute Overskriv spor - Hele sporet vil bli omregnet ved bruk av valgt profil. - Velg hvordan punkter skal knyttes sammen, i rett linje, eller utregnet rute mellom dem med valgt profil. - Kun neste segment vil bli omregnet ved bruk av valgt profil. + Hele sporet vil bli omregnet ved bruk av valgt profil. + Velg hvordan punkter skal knyttes sammen, i rett linje, eller utregnet rute mellom dem med valgt profil. + Kun neste segment vil bli omregnet ved bruk av valgt profil. Hele sporet Neste segment - For å bruke dette valget må OsmAnd rute sporet ditt til kartveiene. + For å bruke dette valget må OsmAnd rute sporet ditt til kartveiene. \n \n På neste steg vil du måtte velge navigasjonsprofil for oppdagelse av tillatte veier, og terskeldistanse for å anslå sporet ditt til veier. - Velg en sporfil å legge til det nye segmentet i. + Velg en sporfil å legge til det nye segmentet i. Lagre som nytt spor Opprett ny rute Ferdig Terskeldistanse Navigeringsprofil + Lukket OSM-notat \ No newline at end of file diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index 7ec21316d4..5250a19bc4 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -3833,11 +3833,11 @@ Nowy segment Odległość graniczna Profil nawigacji - Wybierz plik śladu do którego zostanie dodany nowy segment. - Cała trasa zostanie ponownie wyznaczona przy użyciu wybranego profilu. - Tylko następny segment zostanie ponownie obliczony przy użyciu wybranego profilu. - Wybierz sposób łączenia punktów linią prostą lub obliczania trasy między nimi z wybranym profilem. - Aby skorzystać z tej opcji, OsmAnd musi przyciągnąć ślad do dróg mapy. + Wybierz plik śladu do którego zostanie dodany nowy segment. + Cała trasa zostanie ponownie wyznaczona przy użyciu wybranego profilu. + Tylko następny segment zostanie ponownie obliczony przy użyciu wybranego profilu. + Wybierz sposób łączenia punktów linią prostą lub obliczania trasy między nimi z wybranym profilem. + Aby skorzystać z tej opcji, OsmAnd musi przyciągnąć ślad do dróg mapy. \n \nW następnym kroku należy wybrać profil nawigacji w celu wykrycia dozwolonych dróg i odległości progowej w celu przybliżenia śledzenia drogi. Zdjęcia z poziomu ulicy diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index 5e320024f5..9c22577d6c 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -3817,17 +3817,17 @@ Substituir trilha Salvar como nova trilha Rota reversa - A trilha inteira será recalculada usando o perfil selecionado. - Apenas o próximo segmento será recalculado usando o perfil selecionado. - Selecione como conectar pontos, com uma linha reta, ou calcular uma rota entre eles com o perfil selecionado. + A trilha inteira será recalculada usando o perfil selecionado. + Apenas o próximo segmento será recalculado usando o perfil selecionado. + Selecione como conectar pontos, com uma linha reta, ou calcular uma rota entre eles com o perfil selecionado. Trilha inteira Próximo segmento - Para usar esta opção, OsmAnd precisa ajustar sua trilha para as estradas do mapa. + Para usar esta opção, OsmAnd precisa ajustar sua trilha para as estradas do mapa. \n \n Na próxima etapa, você precisará selecionar o perfil de navegação para detectar as estradas permitidas e a distância limite para aproximar o rastreamento das estradas. Distância limite Perfil de navegação - Selecione um arquivo de trilha para o qual um novo segmento será adicionado. + Selecione um arquivo de trilha para o qual um novo segmento será adicionado. Imagens de rua Tem certeza de que deseja fechar plano de rota sem salvar\? Você perderá todas as alterações. Em caso de direção reversa diff --git a/OsmAnd/res/values-pt/phrases.xml b/OsmAnd/res/values-pt/phrases.xml index 84ebceecad..646845caf2 100644 --- a/OsmAnd/res/values-pt/phrases.xml +++ b/OsmAnd/res/values-pt/phrases.xml @@ -3771,7 +3771,7 @@ Quantidade de erupções Rede de reabastecimento de água potável Reabastecimento de água potável: não - Reabastecimento de água potável: sim + Sim Obstrução Nível da água: abaixo do nível médio da água Nível da água: acima do nível médio da água @@ -3819,4 +3819,11 @@ Give-box Seta: não Elevador + Calendário + Tempo real + Atraso + Sim + Quadro de partidas: não + Quadro de partidas + Reabastecimento de água potável \ No newline at end of file diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml index bba5a6aa8b..3e6ec03ab5 100644 --- a/OsmAnd/res/values-pt/strings.xml +++ b/OsmAnd/res/values-pt/strings.xml @@ -650,7 +650,7 @@ Linguagem Próximo Anterior - Alterar unidade de medida de distância. + Alterar a unidade de medida de distância. Unidades de comprimento Milhas/pés Milhas/jardas @@ -1908,7 +1908,7 @@ Widget Mapillary Permite contribuir rapidamente para Mapillary. Fotos on-line ao nível da rua para todos. Descubra locais, colabore, capture o mundo. - Imagens de nível de rua + Mapillary Fotos ao nível da rua para todos. Descubra locais, colabore, capture o mundo. O seu destino está localizado numa área de acesso privado. Permitir uso de estradas privadas para esta viagem\? Reiniciar pesquisa @@ -2042,8 +2042,8 @@ Use a saída %1$d e continue Enviar Pontos de Interesse (POI) Cálculo da rota - Ainda não tem nenhum percurso - Também pode adicionar ficheiros GPX ao diretório + Ainda não tem nenhuns ficheiros de trilhos + Também pode adicionar ficheiros ao diretório Adicionar mais… Aparência Ativar gravação rápida @@ -2100,7 +2100,7 @@ Necessário para descarregar mapas. À procura de localização… Espaço livre - Armazenamento de dados de OsmAnd (para mapas, ficheiros GPX, etc.): %1$s. + Armazenamento de dados de OsmAnd (para mapas, ficheiros de trilhos, etc.): %1$s. Conceder permissão Permitir acesso à localização Encontrar a minha posição @@ -2961,9 +2961,9 @@ Trocar Mostrar mais Trilhos mostrados - Mostrar/ocultar trajetos GPX - Um botão para mostrar ou ocultar trajetos GPX selecionados no mapa. - Ocultar trajetos GPX + Mostrar/ocultar trilhos + Um botão para mostrar ou ocultar trilhos selecionados no mapa. + Ocultar trilhos Sem elétricos Evita elétricos Sem autocarros @@ -2989,7 +2989,7 @@ Paralelos Seixos Caminho para cavaleiros - Mostrar trajetos GPX + Mostrar trilhos Por favor defina primeiro o destino Rota anterior Adicionar casa @@ -3239,7 +3239,7 @@ Alertas mostrados no canto inferior esquerdo durante a navegação. Mudar de perfil Idioma e saída - Redefinir para o padrão + Redefinir para a predefinição Criar, importar, editar perfis Gerir perfis de app… Afeta toda a app @@ -3827,20 +3827,20 @@ Sobrescrever trilho Gravar como novo trilho Rota inversa - O trilho inteiro será recalculado a usar o perfil selecionado. - Somente o próximo segmento será recalculado a usar o perfil selecionado. - Selecione como ligar pontos, com uma linha reta ou calcule uma rota entre eles com o perfil selecionado. + O trilho inteiro será recalculado a usar o perfil selecionado. + Somente o próximo segmento será recalculado a usar o perfil selecionado. + Selecione como ligar pontos, com uma linha reta ou calcule uma rota entre eles com o perfil selecionado. Trilho inteiro Próximo segmento - Para usar esta opção o OsmAnd precisa de encaixar o seu trilho nas estradas do mapa. + Para usar esta opção o OsmAnd precisa de encaixar o seu trilho nas estradas do mapa. \n \n No passo seguinte, terá de selecionar o perfil de navegação para detetar estradas permitidas e a distância limiar para se aproximar do seu trilho com as estradas. Distância limiar Perfil de navegação - Selecione um ficheiro de faixa para o qual um novo segmento será adicionado. + Selecione um ficheiro de faixa para o qual um novo segmento será adicionado. Seguir a trilha Escolha o ficheiro de trilha a seguir - Escolha o ficheiro de trilha a seguir ou importe-o do aparelho. + Escolha o ficheiro de trilho a seguir ou importe um. Selecionar outra trilha Navegue de minha localização até a trilha Ponto da trilha para navegar @@ -3870,7 +3870,7 @@ Trilhas Adicionar ponto de passagem de trilha Gravação de viagem - GPX + REC Especifique o intervalo de registo para a gravação geral da faixa (ativado através do widget de gravação Trip no mapa). Pausar a gravação da viagem Retomar a gravação da viagem @@ -3885,4 +3885,9 @@ está gravado Adicione pelo menos dois pontos. Refazer + Trilho simplificado + Apenas a linha da rota será gravada, os pontos de passagem serão apagados. + Nome do ficheiro + %s ficheiros de faixa selecionados + Vai pausar o registo de faixas quando a aplicação for morta (através de aplicações recentes). (indicação de fundo de OsmAnd desaparece da barra de notificação do Android.) \ No newline at end of file diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml index ffdab949ff..8ae4605c7c 100644 --- a/OsmAnd/res/values-ru/phrases.xml +++ b/OsmAnd/res/values-ru/phrases.xml @@ -3826,4 +3826,7 @@ Расписание отправлений: нет Расписание отправлений Заправка питьевой воды + Реальное время + Задержка + Расписание \ No newline at end of file diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index 1058b2e316..82814f988c 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -35,7 +35,7 @@ Файл GPX с координатами и данными выбранных заметок. Файл GPX с координатами и данными всех заметок. Место - Ваш пункт назначения находится на частной территории. Разрешить использование частных дорог для этой поездки\? + Пункт назначения находится на частной территории. Разрешить использование частных дорог на этом маршруте\? Искать снова Увеличить радиус поиска Ничего не найдено @@ -57,8 +57,8 @@ Включить анимацию прокрутки карты с моим положением во время навигации. Масштаб: %1$s Имя группы - Изменить цвет - Изменить имя + Выбрать цвет + Задать имя Для больших расстояний: добавьте промежуточные пункты, если маршрут не построен в течение 10 минут. Разрешить частный доступ Разрешить доступ на частную территорию. @@ -99,12 +99,12 @@ Кнопка переключения автомасштабирования на основе скорости. Включение автомасштаба Выключение автомасштаба - Установить пункт назначения + Добавить точку маршрута Заменить пункт назначения Добавить первую промежуточную точку Кнопка для установки центра экрана пунктом назначения маршрута, любой ранее выбранный пункт назначения станет последним промежуточным пунктом. Кнопка для установки центра экрана пунктом отправления. Затем будет предложено установить пункт назначения или запустить расчёт маршрута. - Кнопка для установки центра экрана пунктом назначения, заменив ранее выбранный пункт назначения (если такой был задан). + Кнопка для установки центра экрана пунктом назначения с заменой предыдущего (если был задан). Кнопка для установки центра экрана первой промежуточной точкой маршрута. Нет покрытия Нет подложки @@ -139,15 +139,15 @@ Средняя высота Время Длина маршрута - Стиль вождения + Стиль езды Выберите пересечённость местности Использовать данные о высотах Фактор рельефа местности (по данным SRTM, ASTER и EU-DEM). - Название быстрого действия было изменено на %1$s, чтобы избежать дублирования. + Действие переименовано в %1$s, чтобы избежать дублирования. Обнаружен дубликат имени - Переключатель, чтобы показать или скрыть избранные точки на карте. + Переключатель, чтобы показать или скрыть сохранённые точки на карте. Переключатель, чтобы показать или скрыть POI на карте. - Показать/скрыть избранные + Показать/скрыть Мои места Добавить категорию Действия Если оставить это поле пустым, то оно будет автоматически заполнено адресом или названием места. @@ -233,7 +233,7 @@ Сохранить фильтр Удалить фильтр Новый фильтр - Изменить положение маркера + Изменить позицию Текущий путь Навигация OsmAnd Live Уровень заряда батареи @@ -261,7 +261,7 @@ Выберите качество видео. Подтвердить Поиск адреса - Пожалуйста, укажите корректный тип POI или оставьте его пустым. + Укажите правильный тип POI или пропустите его. Формат аудио Выберите формат аудио. Битрейт аудио @@ -390,7 +390,7 @@ Видимость Теги Описание - Пожалуйста, укажите имя и пароль пользователя OSM для отправки файлов GPX. + Укажите ваши имя пользователя OSM и пароль для отправки файлов GPX. Поддержка Поддержать разработку новых функций Показывать масштаб @@ -434,7 +434,7 @@ Голосовые подсказки (TTS, предпочтительно) Википедия (локально) Пользовательские - Файл, содержащий ранее экспортированные избранные, уже существует. Заменить его? + Файл экспорта сохранённых точек уже существует. Заменить его\? Настройки профиля Профиль по умолчанию Вид карты и настройки навигации сохраняются для каждого отдельного профиля. Установите ваш профиль по умолчанию. @@ -446,7 +446,7 @@ Прозрачная тема Нативная библиотека не поддерживается на этом устройстве. Инициализация нативной библиотеки… - Центрировать карту автоматически + Автовозврат к позиции на карте Выберите время, через которое карта вернётся к текущей позиции. Автовозврат карты только при следовании по маршруту Возвращать карту в текущее положение только при следовании по маршруту. @@ -457,12 +457,12 @@ Данные POI «%1$s» устарели и могут быть удалены. Файл с обновляемыми POI не найден и не может быть создан. Обновить до OsmAnd+ - На сервере данных были найдены файлы, не совместимые с данной версией программы. Для их использования, пожалуйста, обновите приложение. + На сервере данных были найдены файлы, не совместимые с данной версией программы. Чтобы их использовать, обновите приложение. Nominatim (Интернет) Определение положения… Моё местоположение (найдено) Адрес… - Избранные… + Сохранённые… Неопределённо Текущий центр карты Начало: @@ -475,15 +475,15 @@ Отправить в OSM Детализированная карта Показывать детали (дороги и др.), начиная с мелких масштабов. - Избранные точки удалены. + Сохранённые места удалены. Вы уверены, что хотите удалить %1$d избранных и %2$d избранных групп\? Дом Друзья Места Другое Не нужно - Отсутствует базовая карта, покрывающая весь мир на мелком масштабе. Пожалуйста загрузите World_basemap_x.obf для полноценный работы приложения. - На устройстве отсутствуют локальные данные. Пожалуйста, загрузите их для того, чтобы использовать приложение без интернета. + Отсутствует базовая карта для обзора мира на мелком масштабе. Загрузите World_basemap_x.obf + На устройстве отсутствуют локальные данные. Загрузите их, чтобы использовать приложение без интернета. " \n \nУдерживайте для вызова настроек" @@ -565,7 +565,7 @@ Отправить местоположение Поделиться местоположением Путевая точка GPX «{0}» добавлена - Добавить путевую точку к записанному треку GPX + Добавить точку в записанный трек Административное Препятствие Образование @@ -610,7 +610,7 @@ \nНавигация временно переключена на онлайн-сервис CloudMade. Невозможно найти указанную папку. Папка хранилища данных - У вас имеется предыдущая версия OsmAnd. Все локальные данные поддерживаются новой версией. Однако избранные точки нужно выгрузить из предыдущей версии приложения и загрузить в новую. + У вас установлена предыдущая версия OsmAnd. Все локальные данные поддерживаются новой версией. Однако сохранённые точки нужно вручную экспортировать из старой версии и импортировать в новую. Сборка {0} успешно установлена ({1}). Загружается сборка… Установить OsmAnd — {0} из {1} {2} МБ\? @@ -675,9 +675,9 @@ Выравнивание карты: Ориентация карты Детали маршрута - Избранные точки успешно импортированы - Файл GPX, содержащий избранные точки, не был найден в {0} - Избранные точки сохранены в {0} + Сохранённые успешно импортированы + GPX-файл с сохранёнными точками отсутствует в {0} + Точки сохранены в {0} Нет избранных точек для сохранения Не удалось загрузить GPX. Отправить отчёт @@ -796,12 +796,12 @@ Загружается список доступных регионов… Не удалось получить список регионов с https://osmand.net. Отредактирована избранная точка - Избранные точки отсутствуют + Нет сохранённых точек Заменить Только показать Запуск сопровождения Вид транспорта: - Сначала выберите пункт назначения + Сначала задайте пункт назначения Маршрут Приложение «Статус GPS» не найдено. Искать в магазине приложений\? Рабочие часы @@ -905,13 +905,13 @@ Да Отмена Нет - Введите имя избранной точки - Избранная - Точка «{0}» была успешно добавлена к избранным. - Редактировать точку - Удалить точку - Удалить точку «%s» из избранных\? - Точка {0} была успешно удалена из избранных. + Название точки + Сохранённая + Точка «{0}» сохранена. + Редактировать место + Удалить из моих + Удалить точку «%s» из сохранённых\? + Точка {0} удалена. Комментарий добавлен Не удалось добавить комментарий. Комментарий @@ -1051,7 +1051,7 @@ Запись места и времени парковки вашего авто. \nИ место, и время отображаются на панели управления или как виджет на карте. Можно добавить напоминание в календаре Android. Место парковки - Пометить место парковки + Отметить парковку Удалить метку места парковки Точка отправления слишком далеко от ближайшей дороги. Общие места @@ -1181,9 +1181,9 @@ Добавить последним промежуточным пунктом Добавить первым промежуточным пунктом Заменить пункт назначения - Пункт назначения уже установлен: + Пункт назначения уже задан: Пункт %1$s - Пункты назначения + Точки маршрута Промежуточный пункт %1$s Удалить пункт Службы мониторинга @@ -1210,7 +1210,7 @@ \nГлобальные данные (между 70° на севере и 70° на юге) основываются на измерениях SRTM (Shuttle Radar Topography Mission) и ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), инструментом визуализации Terra, флагманского спутника Земли системы наблюдения NASA. ASTER является результатом совместных усилий NASA, министерства экономики Японии, торговли и промышленности (METI), космических систем Японии (J-spacesystems). Фото %1$s %2$s Аудио/видеоданные - Вы уверены, что хотите остановить навигацию? + Остановить навигацию\? Вы уверены, что хотите удалить пункт назначения (и промежуточные пункты)? Точный маршрут (альфа) Пожертвуйте, чтобы увидеть новые функции реализованными в приложении. @@ -1261,13 +1261,13 @@ Сортировать от двери до двери Доступно %1$d файлов для скачивания осталось %1$d файлов - Пожалуйста, подождите, пока завершится текущая операция + Подождите, пока завершится текущая операция Открыть существующий файл GPX Начать новый подтрек Имя файла GPX Файл GPX сохранён в {0} Инструмент расчёта дистанции и планирования - Промежуточные пункты выстроены в оптимальный маршрут от текущего местоположения до пункта назначения. + Оптимальный порядок точек по пути к месту назначения. Не удалось выполнить резервное копирование изменений OSM. Резервное копирование как правка OSM высота @@ -1281,7 +1281,7 @@ Контурные линии Загрузка… Создание маршрутов по нажатию на карте, а также использование или изменение существующих файлов GPX, планирование поездки и измерение расстояния между точками. Результаты могут быть сохранены в виде файла GPX, который впоследствии может быть использован для навигации. - Установить как пункт назначения + Сделать пунктом назначения Сначала установите город или улицу Пункт назначения %1$s Тип фокусировки камеры @@ -1308,7 +1308,7 @@ Названия улиц (TTS) Объявлять… Настройки озвучивания названий улиц, предупреждений о дорожном движении (принудительные остановки, искусственные неровности), камер контроля скорости и ограничений скорости. - Пожалуйста, укажите в настройках пароль и имя пользователя OSM + Укажите в настройках пароль и имя пользователя OSM Карта: Пароль OSM (необязательно) Выберите регион вождения: США, Европа, Великобритания, Азия и другие. @@ -1341,14 +1341,14 @@ Пеший туризм Мотоцикл Вы уверены, что желаете удалить %1$d изменений OSM\? - Пожалуйста, сначала рассчитайте маршрут + Сначала постройте маршрут Симуляция использования рассчитанного маршрута Симуляция использования трека GPX Без автомасштаба Ближний план Средний план Дальний план - Избегать автомагистрали + Избегать автомагистралей Без автомагистралей Предпочитать автомагистрали Предпочитать автомагистрали @@ -1357,7 +1357,7 @@ Без грунтовых дорог Избегать грунтовых дорог Без паромов - Избегать паромные переправы + Исключить паромные переправы Максимальная масса Укажите допустимый предел массы автомобиля для учёта при построении маршрута. Отображение карты @@ -1383,7 +1383,7 @@ Быстрое построение маршрута не удалось (%s), отмените для возврата к медленному построению. Масштаб Выберите GPX… - Установить пункт назначения + Задать пункт назначения Предпочтения маршрута Информация про маршрут Добавить следующим пунктом назначения @@ -1455,12 +1455,12 @@ Повторять навигационные инструкции Объявление прибытия Как скоро следует сообщать о прибытии? - Избранные точки, опубликованные через OsmAnd + Места, отправленные в OsmAnd Рассчитать маршрут между точками Мировые пункты обмена bitcoin дней Соединение - Сохранить данные как файл GPX или импортировать путевые точки в избранные\? + Сохранить данные в файл GPX или импортировать путевые точки в Мои места\? Розовый Коричневый Пустой файл GPX @@ -1483,7 +1483,7 @@ Интервал разбиения Старт навигации автоматически Сохранить как группу избранных - Установить пункты назначения + Задать точки маршрута Метки точек " \n @@ -1556,8 +1556,8 @@ Скачать недостающие карты %1$s (%2$d МБ)\? Путевые точки Дорожные предупреждения - Избранные поблизости - POI поблизости + Мои места рядом + Ближайшие POI Туры Все Расстояние @@ -1579,7 +1579,7 @@ Платный проезд Знак остановки Снизьте скорость - Скоростной радар + Камера скорости Дорожные предупреждения Выберите допустимое значение превышения скорости выше которого вы получите голосовое предупреждение. Допустимое превышение скорости @@ -1594,7 +1594,7 @@ Анонимному пользователю недоступно:\n- создание групп;\n- синхронизация групп и устройств с сервером;\n- управление группами и устройствами в личном кабинете. Вы вошли как %1$s Маршруты - Подробности + Детали Транспорт Другие атрибуты карты Настройки карты @@ -1701,7 +1701,7 @@ Переименовать Удалить Удалить все - Добавить + Сохранить Применить Старт Стоп @@ -1719,10 +1719,10 @@ Выход Показать Показать все - Показать на карте + Показывать на карте Карта - Избранные - Избранные + Сохранено + Сохранённые Добавить к избранным Аудио Видео @@ -1739,9 +1739,9 @@ Отменить выбор всех Поделиться Мои места - Избранные + Точки Треки - Текущий пишущийся трек + Текущий трек Поделиться заметкой Дата выпуска Настройки навигации @@ -1781,12 +1781,12 @@ \nВ случае активации этого вида, стиль карты меняется на «Зимний/лыжный», показывая все детали пейзажа так, как они выглядят зимой. Такой (зимний) вид может быть отменён либо путём деактивации здесь, либо если вы поменяете «Стиль карты» в меню «Настройки карты» на желаемый вид. Текущий маршрут Скачать карты - Для правильного отображения дорожных знаков и правил, пожалуйста, выберите свой регион вождения: + Для правильного отображения дорожных знаков и правил выберите свой регион вождения: Добро пожаловать Отметить для удаления OsmAnd обеспечивает глобальный локальный просмотр карт и локальную навигацию. OSM изменения добавлены в локальную базу данных - Во многих странах (Германия, Франция, Италия и другие) использование предупреждения о камерах контроля скорости не допускается законом. OsmAnd не несёт никакой ответственности, если вы нарушите закон. Пожалуйста, нажмите «Да» только если вы имеете право использовать эту функцию. + Во многих странах (Германия, Франция, Италия и другие) использование предупреждений о камерах контроля скорости незаконно. OsmAnd не несёт никакой ответственности, если вы нарушите закон. Нажимайте «Да» только если вы имеете право использовать эту функцию. Информация A-GPS Данные A-GPS загружены: %1$s Сообщение @@ -1815,11 +1815,11 @@ Переместить файлы данных Osmand в новое место назначения\? Напечатайте для поиска Номера домов - Избегать пересечение национальных границ + Избегать перехода границы Максимальная высота Укажите высоту транспортного средства для учёта при построении маршрута. - Умный перерасчёт маршрута - Перерасчёт только начальной части маршрута для длительных поездок. + Умный пересчёт маршрута + Для больших маршрутов пересчитывать только начало. Удалить правки OSM Выключено Раскраска по сетевой принадлежности @@ -1889,8 +1889,8 @@ Для применения изменения требуется перезапуск. Нравится ли вам приложение? Оценить приложение - Пожалуйста, дайте оценку OsmAnd на Google Play - Пожалуйста, дайте нам знать о любых предложениях. + Пожалуйста, оцените OsmAnd в Google Play + Отправляйте нам любые предложения. Цвет трека GPX Толщина трека GPX Нет доступных обновлений @@ -1922,10 +1922,10 @@ Добавить часы работы Тип POI Количество строк на странице %1$s - Пожалуйста, укажите тип POI. + Укажите тип POI. Жирный контур Рабочие дни - Избранные + Сохранённые Успешно сохранён в: %1$s POI будут удалены после того как вы отправите ваши изменения удалить @@ -1936,7 +1936,7 @@ Все несохранённые изменения будут потеряны. Продолжить\? Моделировать ваше местоположение, используя рассчитанный маршрут или записанный трек GPX. Остановить моделирование своего местоположения. - Добавить новую + Создать новую Выберите категорию Выберите единицы измерения скорости. Единицы измерения скорости @@ -1958,11 +1958,11 @@ Опасность Регионы Карты мира - Добавить в избранные + Сохранить в Мои места Региональные карты - Пожалуйста, используйте название категории, которое ещё не существует. + Задайте название, которое ещё не используется. Название категории - Добавить новую категорию + Добавить категорию Слой рельефа местности выключен Контурные линии выключены Дороги @@ -1988,7 +1988,7 @@ Карта загружена QR-код Показать карту - Мировая обзорная карта (охватывающая весь мир при низком уровне масштабирования) отсутствует или устарела. Пожалуйста, загрузите её для глобального обзора. + Базовая карта мира (покрывающая весь мир с низким уровнем масштабирования) отсутствует или устарела. Загрузите её для глобального обзора. Карта %1$s готова к использованию. Имитировать первый запуск Устанавливает признак первого запуска приложения, не изменяет других настроек. @@ -2029,7 +2029,7 @@ Удалить путевую точку GPX\? Редактировать путевую точку GPX Без лестниц - Избегать лестницы и ступеньки + Избегать ступеней и лестниц Без пересечений границ Обновлять Загружать только по Wi-Fi @@ -2050,7 +2050,7 @@ Еженедельно Месяц и страна: Открыть повторно - Выберите дороги, которых следует избегать при навигации. + Укажите дороги, которых следует избегать при навигации. Отменить все Тип Правки OSM отправлены через OsmAnd @@ -2080,11 +2080,11 @@ Не показывать моё имя в отчётах Стоимость в месяц Ежемесячный платёж - Пожалуйста, введите действительный адрес электронной почты + Введите действительный адрес электронной почты Спасибо за поддержку OsmAnd! \nЧтобы активировать все новые возможности вам нужно перезапустить приложение. Параметры подписки - Пожалуйста, сначала приобретите подписку на OsmAnd Live + Сначала приобретите подписку на OsmAnd Live Эта подписка позволяет получать ежечасное обновление для всех карт мира. \nЧасть доходов переводится сообществу OSM и выплачивается за каждый вклад в OSM. \nЕсли вы любите OsmAnd и OSM и хотите поддержать их, данная подписка — отличный способ сделать это. @@ -2112,7 +2112,7 @@ Автообновления Выберите или скачайте голосовые оповещения для вашего языка. Полный отчёт - Пересчитать маршрут + Пересчёт маршрута Имя пользователя и пароль OSM Количество получателей Активные @@ -2134,18 +2134,18 @@ Переместить ↑ Переместить ↓ Завершить навигацию - Избегать дорог + Исключить из маршрута Публичное имя Поддерживаемый регион Пожалуйста, введите публичное имя Предлагается выбрать, прежде всего, управление приложением через гибкую панель управления или статическое меню. Ваш выбор всегда может быть изменён в настройках панели управления. Просмотр - Пожалуйста, добавьте маркеры на карте + Добавьте маркеры на карте Путевых точек не найдено Добавить маркеры для всех точек? Добавить к маркерам Активирует функцию маркеров карты. - Переключено на внутреннее хранилище, так как выбранная папка хранения данных защищена от записи. Пожалуйста, выберите папку, доступную для записи. + Переключено на внутреннюю память, поскольку выбранная папка хранения данных защищена от записи. Выберите папку, доступную для записи. Общее хранилище Сортировать Перейти вверх @@ -2205,9 +2205,9 @@ Не показывать новые версии Обновить все карты сейчас? Очистить всю плитку - Топливно-эффективный способ + Снижать расход топлива Использование топливо-сберегающего пути (обычно короче). - Вы уверены, что хотите заменить избранные %1$s\? + Вы уверены, что хотите заменить %1$s\? Изменить Начать от @@ -2249,7 +2249,7 @@ Некорректный OLC \n Короткий OLC -\nПожалуйста, введите полный код +\nВведите полный код Корректный полный OLC \nОписывает область: %1$s x %2$s Начать новый сегмент после 6 минутного перерыва, новый трек после 2 часового перерыва, или новый файл после длительного перерыва (если изменилась дата). @@ -2261,15 +2261,15 @@ Добавить POI Изменить стиль карты Стиль карты изменён на «%s». - Добавить место парковки + Сохранить парковку Добавить действие Редактировать действие - Добавить в избранные + Сохранить место Добавить действие Удалить действие Вы уверены, что хотите удалить действие «%s»\? - Показать избранные - Скрыть избранные + Показать сохранённые + Скрыть сохранённые Показать/скрыть POI Показать %1$s Скрыть %1$s @@ -2297,10 +2297,10 @@ Mapillary Уличные фотографии для всех. Открывайте для себя места, сотрудничайте, снимайте мир. Название содержит слишком много заглавных букв. Вы хотите продолжить? - Переключатель, чтобы приостановить или возобновить навигацию. + Кнопка приостановки и возобновления навигации. Показывать диалог завершения навигации Запуск/остановка навигации - Переключатель, чтобы начать или остановить навигацию. + Кнопка запуска и остановки навигации. Сохранять записанные треки в папках помесячно Сохранять записанные треки в подпапках с записью месяца (например, 2018-01). Кеш тайлов @@ -2327,7 +2327,7 @@ От Перезагрузить Фильтровать фотографии по отправителю, дате или типу. Фильтры применяются только для больших масштабов. - Не удалось импортировать файл. Пожалуйста, убедитесь что OsmAnd имеет разрешение на его чтение. + Не удалось импортировать файл. Убедитесь, что OsmAnd имеет разрешение на его чтение. Откорректированное расстояние Установите Mapillary, чтобы добавить фотографии этого места. Высота маршрута @@ -2335,7 +2335,7 @@ Показать на карте после сохранения Просмотрите карту и добавьте точки Измерить расстояние - Необходимо добавить хотя бы одну точку. + Добавьте хотя бы одну точку. Фотография Mapillary Улучшить фотопокрытие через Mapillary Скрыть, начиная с уровня масштабирования @@ -2385,7 +2385,7 @@ Маркеры Изменить заметку Изменить заметку OSM - Добавить копию пункта отправления в качестве пункта назначения. + Добавить пункт отправления в качестве пункта назначения. Сделать маршрут круговым Использовать местоположение Добавлено @@ -2470,23 +2470,23 @@ Полноэкранный режим Отметить пройденным Файл %1$s не содержит путевых точек, импортировать его как трек? - Выберите трек, чтобы добавить свои путевые точки к маркерам. + Выберите трек, чтобы добавить в маркеры его точки. Трек путевых точек Направо Налево Показать цифровую панель Нажатие на карте переключает кнопки управления и виджеты. - могут быть импортированы как избранные точки или как файл GPX. + возможет импорт в сохранённые точки или как файл GPX. Больше Импортировать как файл GPX - Импортировать как избранные + Импортировать в Мои места Импорт файла Неправильный ввод Просмотр Путевые точки добавлены в маркеры карты Маршрут рассчитан Путешествие - Добавить ваше местоположение как точку отправления при планировании маршрута. + Добавьте свою позицию в качестве точки отправления, чтобы построить идеальный маршрут. Показать пройденные Скрыть пройденные Удалить из «Маркеров карты» @@ -2583,7 +2583,7 @@ Сохранить точку маршрута Путевая точка 1 Точка маршрута 1 - Добавить избранные + Добавить сохранённые Избранное можно импортировать или создать, отмечая точки на карте. Импортировать файл GPX Переместить точку @@ -2670,7 +2670,7 @@ Текущий Добавляет промежуточную остановку Добавляет первую остановку - Перемещает пункт назначения и создаёт промежуточную остановку + Перемещает пункт назначения и создаёт промежуточную точку Показать закрытые заметки Показать/скрыть заметки OSM на карте. GPX — подходит для экспорта в JOSM и другие OSM редакторы. @@ -2884,7 +2884,7 @@ Гуарани Вы используете {0} карту, которая поставляется OsmAnd. Хотите запустить полную версию Osmand\? Запустить OsmAnd\? - Установить пункт назначения + Добавить точку маршрута Добавить промежуточный пункт Установить отправную точку Путь @@ -2915,7 +2915,7 @@ Работа Ровность Предыдущий маршрут - Пожалуйста, сначала установите пункт назначения + Сначала задайте пункт назначения Поменять Показать больше Отображаемые треки @@ -2998,28 +2998,28 @@ Государственная дорога Пешком Сократите длину тега «%s» до менее чем 255 символов. - Выберите виды общественного транспорта, которые следует избегать при навигации: - Избегать виды транспорта… + Выберите виды транспорта, которых следует избегать при навигации: + Исключить виды транспорта… Длина значения «%s» Режим %s Без булыжников или брусчатки - Избегать булыжники и брусчатку + Избегать мощёных улиц и брусчатки Миллирадианы Угловые единицы Изменить, в чём измеряется азимут. Градусы Без трамваев - Избегать трамваи + Исключить трамваи Без автобусов - Избегать автобусы и троллейбусы + Исключить автобусы и троллейбусы Без маршрутных такси - Избегать маршрутные такси + Исключить маршрутные такси Без поездов - Избегать поезда + Исключить поезда Без метро - Избегать метро и лёгкий железнодорожный транспорт + Исключить метро и рельсовый транспорт Без паромов - Избегать паромы + Исключить паромы • Отображение времени между пересадками в общественном транспорте \n \n• Исправлен пользовательский интерфейс для \"Детали маршрута\" @@ -3043,7 +3043,7 @@ %1$d файлов (%2$s) присутствуют в предыдущем местоположении «%3$s». Переместить карты Не перемещать - Маршрут пешком составляет около %1$s, и может быть быстрее общественного транспорта + Маршрут пешком составляет около %1$s и может быть быстрее общественного транспорта Политика конфиденциальности Помогите нам сделать OsmAnd лучше Разрешите OsmAnd собирать и обрабатывать анонимные данные об использовании приложения. Мы не собираем и не храним данные о вашем местоположении или о любых местах, которые вы просматриваете на карте. @@ -3072,7 +3072,7 @@ Тип: %s Базовый профиль Выберите тип навигации - Пожалуйста, выберите тип навигации для нового приложения + Выберите тип навигации для нового профиля Введите имя профиля Сначала необходимо указать имя профиля. Уже есть профиль с таким именем @@ -3112,7 +3112,7 @@ Лыжные туры Сани Склоны для катания на санях. - Более сложные маршруты с крутыми участками. Возможны препятствия, которых следует избегать. + Более сложные маршруты с крутыми участками дороги. В целом, препятствия, которых следует избегать. Сложные маршруты, с опасными препятствиями и крутыми участками. Предпочитаемая сложность Служба скачивания OsmAnd @@ -3162,7 +3162,7 @@ Выбор настроек навигации для профиля Выбор верхней границы изменений Использовать бесконтактный датчик (сенсорный выключатель) - Пожалуйста, включите хотя бы один профиль приложения, чтобы использовать эту настройку. + Включите хотя бы один профиль, чтобы использовать эту настройку. %s сохранено Навигация OsmAnd Пользовательский профиль навигации @@ -3254,7 +3254,7 @@ Переместить в новое место назначения Внутреннее хранилище, скрытое от пользователя и других приложений. Изменение папки хранилища - Избегать определённых маршрутов и типов дорог + Исключить определённые маршруты и типы дорог Использовано %1$s ТБ Использовано %1$s ГБ Использовано %1$s МБ @@ -3405,14 +3405,14 @@ Все настройки профиля будут сброшены в значения по умолчанию после установки. Сбросить все настройки профиля\? %1$s: %2$s - Нет правил маршрутизации в «%1$s». Пожалуйста, выберите другой файл. + Нет правил маршрутизации в «%1$s». Выберите другой файл. Для использования этой функции требуется разрешение. Это низкоскоростной фильтр отсечки, чтобы не записывать точки ниже определённой скорости. Это может сделать записанные треки более гладкими при просмотре на карте. Упорядочить категории Изменяйте порядок сортировки списка, скрывайте категории. Вы можете импортировать или экспортировать все изменения с профилями. - Вы можете добавить новую пользовательскую категорию, выбрав одну или несколько категорий. + Вы можете создать свою категорию, выбрав одну или несколько категорий из списка. Сброс к настройкам по умолчанию приведёт к возврату порядка сортировки по умолчанию. - Добавить пользовательскую категорию + Создать свою категорию Показывать только ночью Все настройки плагина восстановлены до состояния по умолчанию. Все настройки профиля восстановлены до состояния по умолчанию. @@ -3454,9 +3454,9 @@ Укажите имя профиля Открыть настройки Плагин отключён - Этот плагин представляет собой отдельное приложение, вам нужно будет удалить его отдельно, если вы больше не планируете его использовать. + Плагин является отдельным приложением, удалите его отдельно, если больше не собираетесь использовать. \n -\nПлагин останется на устройстве после удаления OsmAnd. +\nПосле удаления OsmAnd плагин останется на устройстве. Меню %1$s — %2$s — %3$s Маршрутизация @@ -3464,8 +3464,8 @@ Импортируемый профиль содержит дополнительные данные. Нажмите «Импорт», чтобы импортировать только данные профиля, или выберите дополнительные данные. Вы можете выбрать дополнительные данные для экспорта вместе с профилем. Приложение по умолчанию (%s) - Отключить перерасчёт - Минимальное расстояние для перерасчёта маршрута + Не перестраивать + Минимальное отклонение для перестроения маршрута Маршрут будет пересчитан, если расстояние до него больше заданного параметра Пользовательский профиль Угол: %s° @@ -3501,7 +3501,7 @@ Ваши заметки OSM находятся в %1$s. Видеозаметки Фотозаметки - Перерасчёт маршрута + Пересчёт маршрута Имя пользователя и пароль Эти настройки применяются ко всем профилям. Редактирование OSM @@ -3537,7 +3537,7 @@ Побочный эффект: в записи трека будут отсутствовать все участки, где критерий минимальной скорости не был соблюдён (например, когда вы толкаете велосипед вверх по крутому склону). Также не будет информации о периодах покоя, например, во время отдыха. Это влияет на любой анализ или последующую обработку, например, при попытке определить общую продолжительность поездки, время в движении или среднюю скорость. Побочный эффект: в результате фильтрации по точности, точки могут быть полностью пропущены, например, под мостами, под деревьями, между высокими зданиями или при определённых погодных условиях. Примечание: при включении GPS непосредственно перед записью точность определения первой точки может быть снижена, поэтому мы рассматриваем добавление секундной задержки перед записью точки (либо записи лучшей из трёх последовательных точек и т. д.), но пока это не реализовано. - Этот фильтр позволяет избежать записи повторяющихся точек, между которыми могло произойти очень малое фактическое перемещение, и создаёт более приятный визуальный вид треков без последующей обработки. + Фильтр предотвращает запись точек при отсутствии фактического перемещения и улучшает вид треков без обработки. Побочные эффекты: периоды в состоянии покоя не записываются вообще или только по одной точке каждый. Небольшие (в реальности) перемещения (например, в сторону, указывающие возможное изменение направления движения) могут быть отфильтрованы. Файл содержит меньше информации для последующей обработки и имеет худшую статистику, отфильтровывая явно избыточные точки во время записи, при этом потенциально сохраняя артефакты, вызванные плохим приёмом или эффектами модуля GPS. Рекомендация: настройка 5 метров может должна вас устроить, если нет необходимости учитывать более короткие перемещения, и вы точное не хотите записывать данные в состоянии покоя. Указанные %1$s уже существуют в OsmAnd. @@ -3598,9 +3598,9 @@ Язык Все языки Для просмотра POI Википедии на карте необходимы дополнительные карты. - Настройка количества элементов в разделах «Панель», «Настройка карты» и контекстном меню. -\n -\nМожно отключить неиспользуемые плагины, чтобы скрыть их элементы управления. %1$s. + Настройка элементов в разделах «Панель», «Настройка карты» и контекстном меню. +\n +\nОтключите неиспользуемые плагины, чтобы скрыть их элементы управления. %1$s. Элементы панели, контекстное меню Боковое меню Элементы ниже разделённые делителем. @@ -3691,10 +3691,10 @@ Скрыть общественный транспорт Показать общественный транспорт Показать/скрыть общественный транспорт - Добавить/редактировать избранные + Добавить/изменить место Создать/изменить POI Возврат к редактированию - Место стоянки + Парковки Переключатель, чтобы показать или скрыть общественный транспорт на карте. Восстановить исходный порядок Нажатие кнопки «Действия» переключает между выбранными профилями. @@ -3790,9 +3790,9 @@ Масштабирование кнопками громкости Укажите длину автомобиля, для длинных транспортных средств могут применяться ограничения на маршруте. Удалить следующий пункт - Пожалуйста, укажите название точки - Текущий пункт назначения на маршруте будет удалён. Если это пункт назначения, навигация остановится. - Информация о достопримечательностях из Википедии. Это ваш карманный автономный гид — просто включите плагин Википедии и наслаждайтесь статьями об объектах вокруг вас. + Задайте название точки + Следующая точка маршрута будет удалена. Если это конечный пункт, навигация завершится. + Информация о достопримечательностях из Википедии. Ваш карманный офлайн-гид — просто включите плагин и читайте об объектах вокруг вас. Скачать карты Википедии Эндуро мотоцикл Мотороллер @@ -3819,21 +3819,21 @@ Выберите файл трека для открытия. Готово Перезаписать трек - Выбрать трек, к которому будет добавлен новый сегмент. + Выбрать трек, к которому будет добавлен новый сегмент. Профиль Предельная дистанция Сохранить как новый трек Обратный маршрут - Весь трек будет перестроен с использованием выбранного профиля. - Только следующий сегмент будет перестроен с использованием выбранного профиля. + Весь трек будет перестроен с использованием выбранного профиля. + Только следующий сегмент будет перестроен с использованием выбранного профиля. Следующий сегмент Весь трек - Для использования данной возможности OsmAnd проложит ваш трек по дорогам. + Для использования данной возможности OsmAnd необходимо привязать ваш трек по дорогам. \n -\nДалее вам следует выбрать профиль для построения маршрута с учётом ограничений этого профиля. - Выберите способ соединения точек: прямой линией или прокладкой маршрута с выбранным профилем. - В случае обратного направления - Закрыть план маршрута без сохранения\? Все изменения будут потеряны. +\nНа следующем шаге необходимо выбрать профиль навигации для определения разрешенных дорог и пороговое расстояние, чтобы приблизительно привязать маршрут к дорогам. + Выберите способ соединения точек: прямой линией или прокладкой маршрута с выбранным профилем. + При обратном направлении + Закрыть план маршрута\? Все изменения будут утеряны. Изображения на уровне улиц Сохранить как новый файл трека Добавить в файл трека @@ -3846,14 +3846,14 @@ Добавить файлы треков Импортируйте или запишите файлы треков Добавить путевую точку - Добавить путевую точку + Добавить к маршруту Запись поездки Сохранить как файл трека Следовать по маршруту Выберите файл маршрута для следования Выберите или импортируйте файл маршрута. Выбрать другой трек - Перейдите от моего местоположения к треку + Ведение от моей позиции к треку Точка трека для навигации Начало трека Ближайшая точка @@ -3873,7 +3873,7 @@ Укажите интервал общей записи трека (включается через виджет «Запись GPX» на карте). Остановить запись Возобновить запись поездки - По умолчанию системы + По выбору системы Все последующие сегменты Предыдущий сегмент Все предыдущие сегменты @@ -3882,7 +3882,22 @@ Все предыдущие сегменты будут пересчитаны с использованием выбранного профиля. Открыть сохранённый трек Остановка записи GPX при принудительном закрытии (через последние приложения). (Из панели уведомлений Android исчезнет значок фонового режима.) - сохраняется - Добавьте как минимум два пункта. + сохранен + Добавьте как минимум две точки. ПОВТОРИТЬ + • Обновленный режим планирования маршрута позволяет использовать разные типы навигации для каждого сегмента и прикрепляет любой трек к дорогам +\n +\n • Новые параметры внешнего вида для треков: выберите цвет, толщину, включите стрелки направления и отметки начала/окончания +\n +\n • Улучшена видимость велосипедных узлов +\n +\n • Контекстное меню для треков с основной информацией +\n +\n • Улучшенные алгоритмы поиска +\n +\n • Улучшены параметры следования по треку в навигации +\n +\n • Исправлены проблемы с импортом/экспортом настроек профиля +\n +\n \ No newline at end of file diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml index e6308e5cb2..facff58683 100644 --- a/OsmAnd/res/values-sc/strings.xml +++ b/OsmAnd/res/values-sc/strings.xml @@ -3824,17 +3824,17 @@ 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. - Ischerta comente connètere sos puntos: cun una lìnia reta o calculende un\'àndala intre issos cun su profilu ischertadu. + 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. + Ischerta comente connètere sos puntos: cun una lìnia reta o calculende un\'àndala intre issos cun su profilu ischertadu. Rasta intrea Segmentu imbeniente - Pro impreare custa optzione OsmAnd tenet bisòngiu de alliniare sa rasta tua a sos caminos de sa mapa. + Pro impreare custa optzione OsmAnd tenet bisòngiu de alliniare sa rasta tua a sos caminos de sa mapa. \n \n In su passu chi benit as a dèpere ischertare su profilu de navigatzione pro rilevare sos caminos permìtidos e su lìmite de distàntzia pro aprossimare sa rasta tua cun sos caminos. Lìmite de distàntzia Profilu de navigatzione - Ischerta unu documentu de rasta in ue annànghere su segmentu nou. + Ischerta unu documentu de rasta in ue annànghere su segmentu nou. Fotografias a livellu de sas carreras Ses seguru de chèrrere serrare sa pianificatzione de s\'àndala chene sarvare\? As a pèrdere totu sas modìficas. In casu de diretzione furriada diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml index 883aec744d..cc7c2f013a 100644 --- a/OsmAnd/res/values-sk/strings.xml +++ b/OsmAnd/res/values-sk/strings.xml @@ -3822,17 +3822,17 @@ Prepísať stopu Uložiť ako novú stopu Otočiť trasu - Celá stopa bude prepočítaná pomocou zvoleného profilu. - Len nasledujúci úsek bude prepočítaný pomocou zvoleného profilu. - Zvoľte ako spojiť body, priamou čiarou alebo vypočítať trasu medzi nimi pomocou zvoleného profilu. + Celá stopa bude prepočítaná pomocou zvoleného profilu. + Len nasledujúci úsek bude prepočítaný pomocou zvoleného profilu. + Zvoľte ako spojiť body, priamou čiarou alebo vypočítať trasu medzi nimi pomocou zvoleného profilu. Celá stopa Ďalší úsek - Pre použitie tejto možnosti musí OsmAnd prichytiť vašu stopu na cesty v mape. + Pre použitie tejto možnosti musí OsmAnd prichytiť vašu stopu na cesty v mape. \n \n V ďalšom kroku budete musieť zvoliť navigačný profil pre detekciu povolených ciest a hraničnú vzdialenosť pre aproximovanie vašej stopy cestami. Hraničná vzdialenosť Navigačný profil - Zvoľte súbor stopy, pre ktorú bude pridaný nový úsek. + Zvoľte súbor stopy, pre ktorú bude pridaný nový úsek. Snímky z úrovne ulice Naozaj chcete zatvoriť plánovanie trasy bez uloženia\? Všetky zmeny sa stratia. V prípade opačného smeru diff --git a/OsmAnd/res/values-sr/strings.xml b/OsmAnd/res/values-sr/strings.xml index 98d62e33e4..fb598f330b 100644 --- a/OsmAnd/res/values-sr/strings.xml +++ b/OsmAnd/res/values-sr/strings.xml @@ -3819,17 +3819,17 @@ Замени стазу Сачувај као нову стазу Обрнута рута - Читава стаза ће се прерачунати користећи одабрани профил. - Само ће се следећи сегмент прерачунати користећи одабрани профил. - Изаберите како повезати тачке, са правом линијом, или израчунајте руту између њих са одабраним профилом. + Читава стаза ће се прерачунати користећи одабрани профил. + Само ће се следећи сегмент прерачунати користећи одабрани профил. + Изаберите како повезати тачке, са правом линијом, или израчунајте руту између њих са одабраним профилом. Цела стаза Следећи сегмент - Да бисте користили ову опцију, ОсмАнд мора да прилагоди вашу стазу путевима на мапи. + Да бисте користили ову опцију, ОсмАнд мора да прилагоди вашу стазу путевима на мапи. \n \n На следећем кораку мора ћете одабрати навигацијски профил како бисте открили дозвољене путеве и праг удаљености и тиме приближили вашу стазу путевима. Праг удаљености Навигацијски профил - Изаберите датотеку записа којој ће се додати нови сегмент. + Изаберите датотеку записа којој ће се додати нови сегмент. Слике на нивоу улице Јесте ли сигурни да желите затворити План руте без чувања\? Изгуби ћете све промене. У случају обрнутог правца diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index b5c6b9300e..58e5c1f7cc 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -3778,19 +3778,19 @@ Açmak için bir yol dosyası seçin. Bitti Yolun üzerine yaz - Bu seçeneği kullanmak için OsmAnd\'ın izlediğiniz yolu harita yollarına eşleştirmesi gereklidir. + Bu seçeneği kullanmak için OsmAnd\'ın izlediğiniz yolu harita yollarına eşleştirmesi gereklidir. \n \n Sonraki adımda, izin verilen yolları tespit etmek için navigasyon profilini ve izlediğiniz yolu yaklaşık olarak belirlemek için eşik mesafesini seçmeniz gerekecektir. Yeni bir Yol olarak kaydet Ters güzergah - Tüm yol, seçilen profil kullanılarak yeniden hesaplanacaktır. - Sadece sonraki bölüm, seçilen profil kullanılarak yeniden hesaplanacaktır. - Düz bir çizgi ile noktaları nasıl birleştireceğinizi veya seçili profille aralarında nasıl güzergah hesaplayacağınızı seçin. + Tüm yol, seçilen profil kullanılarak yeniden hesaplanacaktır. + Sadece sonraki bölüm, seçilen profil kullanılarak yeniden hesaplanacaktır. + Düz bir çizgi ile noktaları nasıl birleştireceğinizi veya seçili profille aralarında nasıl güzergah hesaplayacağınızı seçin. Tüm yol Sonraki bölüm Eşik mesafesi Navigasyon profili - Kendisine yeni bir bölümün ekleneceği bir yol dosyası seçin. + Kendisine yeni bir bölümün ekleneceği bir yol dosyası seçin. Sokak seviyesi görüntüleri Kaydetmeden güzergah planlamayı kapatmak istediğinize emin misiniz\? Tüm değişiklikleri kaybedeceksiniz. Ters yön durumunda diff --git a/OsmAnd/res/values-uk/phrases.xml b/OsmAnd/res/values-uk/phrases.xml index 22b9d46dbc..0ceed5636b 100644 --- a/OsmAnd/res/values-uk/phrases.xml +++ b/OsmAnd/res/values-uk/phrases.xml @@ -3803,7 +3803,7 @@ Рівень води: вище середнього Рівень води: нижче середнього Завада - Поповнення питної води: так + Так Поповнення питної води: ні Мережа поповнення питної води Під тиском @@ -3822,4 +3822,11 @@ Подарункова коробка Ліфт Стрілка: ні + Розклад + Реальний час + Затримка + Так + Дошка відправлень: немає + Дошка відправлень + Поповнення питної води \ No newline at end of file diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index 7a2df33e4d..891dfd9680 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -3818,7 +3818,7 @@ Оберіть файл з треком для перегляду. Готово Перезаписати трек - Для користування цією функцією, OsmAnd необхідно прив\'язати цей трек до мапи доріг. + Для користування цією функцією, OsmAnd необхідно прив\'язати цей трек до мапи доріг. \n \nДалі вам потрібно вибрати профіль навігації для виявлення дозволених доріг та обмеження відстані наближення вашого треку до доріг. Зворотний маршрут @@ -3826,11 +3826,11 @@ Наступний сегмент Обмеження відстані Профіль навігації - Виберіть файл треку, до якого буде додано новий сегмент. + Виберіть файл треку, до якого буде додано новий сегмент. Зберегти як новий трек - Весь трек буде перераховано за допомогою вибраного профілю. - Лише наступний сегмент буде перераховано за допомогою обраного профілю. - Виберіть спосіб з\'єднання точок: прямою лінією чи розраховувати маршрут між ними за допомогою вибраного профілю. + Весь трек буде перераховано за допомогою вибраного профілю. + Лише наступний сегмент буде перераховано за допомогою обраного профілю. + Виберіть спосіб з\'єднання точок: прямою лінією чи розраховувати маршрут між ними за допомогою вибраного профілю. Зображення вулиць Ви дійсно бажаєте закрити планування маршруту без збереження\? Внесені зміни буде втрачено. Для зворотного напрямку diff --git a/OsmAnd/res/values-zh-rCN/strings.xml b/OsmAnd/res/values-zh-rCN/strings.xml index 962d8cc4fe..6de13e20e3 100644 --- a/OsmAnd/res/values-zh-rCN/strings.xml +++ b/OsmAnd/res/values-zh-rCN/strings.xml @@ -3121,7 +3121,7 @@ 添加的点在地图上不可见,因为选定的组是隐藏的,您可以在\"%s\"中找到它。 选择显示轨迹上带有距离或时间标记的间隔。 选择所需的拆分选项:“按时间”或“按距离”。 - 新的配置文件将在下一段路线计算时生效。 + 新的配置文件将在下一段路线计算时生效。 整个轨迹 最后更改 导入轨迹 @@ -3133,15 +3133,15 @@ 保存为新的轨迹 你确定在不保存的情况下退出计划路线吗?所有的更改均会丢失。 反转路线 - 全部路线会以选择的配置文件进行重新计算。 - 选择以直线或以选择的导航文件来计算路线的方式去连接导航点。 + 全部路线会以选择的配置文件进行重新计算。 + 选择以直线或以选择的导航文件来计算路线的方式去连接导航点。 下一段 - 要使用这个选项,OsmAnd 会跟踪你在地图道路上的轨迹。 + 要使用这个选项,OsmAnd 会跟踪你在地图道路上的轨迹。 \n \n在进行下一步时,你需要选择导航文件来检测与你的起始点相近的道路。 起始距离 导航文件 - 选择一个要添加新片段的跟踪文件。 + 选择一个要添加新片段的跟踪文件。 街道等级图像 防止相反的方向 删除地址 diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index bbc2ef6d57..f5ab8c7db4 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -3819,17 +3819,17 @@ 覆寫軌跡 儲存為新軌跡 反向路線 - 整個軌跡都會使用選定的設定檔重新計算。 - 僅下一個片段會使用選定的設定檔重新計算。 - 選取如何連接點,用直線或以選定的設定檔計算其間的路徑。 + 整個軌跡都會使用選定的設定檔重新計算。 + 僅下一個片段會使用選定的設定檔重新計算。 + 選取如何連接點,用直線或以選定的設定檔計算其間的路徑。 整個軌道 下一段 - 要使用此選項,OsmAnd 必須將您的軌跡捕捉到地圖道路上。 + 要使用此選項,OsmAnd 必須將您的軌跡捕捉到地圖道路上。 \n \n在下一步,您只需要選取設定檔以偵測允許的道路與距離門檻以追蹤道路。 門檻距離 導航設定檔 - 選取要加入新片段的軌道檔案。 + 選取要加入新片段的軌道檔案。 街道級照片 您確定要不儲存就關閉計劃錄線嗎?您將會失去所有變更。 反向時 diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml index 1858dec24a..fe274284d9 100644 --- a/OsmAnd/res/values/phrases.xml +++ b/OsmAnd/res/values/phrases.xml @@ -498,6 +498,7 @@ Magazines Paper packaging Small appliances + Small electrical appliances Wood Books Shoes diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index ae510a0ab3..a3a8913a16 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,15 @@ Thx - Hardy --> + + • Updated "Plan Route" mode allows using different navigation types for each segment and attaches any track to the roads\n\n + • New "Appearance" options for tracks: select color, thickness turn on the direction arrows and start/finish marks\n\n + • Improved bicycle nodes visibility\n\n + • Context menu for tracks with basic info\n\n + • Improved "Search" algorithms\n\n + • Improved "Follow track" options in Navigation\n\n + • Fixed issues with import/export of profile settings\n\n + Redo Please add at least two points. is saved @@ -63,15 +72,15 @@ In case of reverse direction Are you sure you want to close Plan route without saving? You will lose all changes. Street-level imagery - Select a track file for which a new segment will be added. + Select a track file for which a new segment will be added. Navigation profile Threshold distance - To use this option OsmAnd need to snap your track to the map roads. \n\n On the next step you will need to select navigation profile to detect allowed roads and threshold distance to approximate you track with roads. + To use this option OsmAnd need to snap your track to the map roads. \n\n On the next step you will need to select navigation profile to detect allowed roads and threshold distance to approximate you track with roads. Next segment Whole track - Select how to connect points, with a straight line, or calculate a route between them with selected profile. - Only next segment will be recalculated using selected profile. - Whole track will be recalculated using selected profile. + Select how to connect points, with a straight line, or calculate a route between them with selected profile. + Only next segment will be recalculated using selected profile. + Whole track will be recalculated using selected profile. Reverse route Save as new Track Overwrite track diff --git a/OsmAnd/src/net/osmand/plus/AppInitializer.java b/OsmAnd/src/net/osmand/plus/AppInitializer.java index 7bccdd599f..2837bff6f8 100644 --- a/OsmAnd/src/net/osmand/plus/AppInitializer.java +++ b/OsmAnd/src/net/osmand/plus/AppInitializer.java @@ -103,7 +103,7 @@ public class AppInitializer implements IProgress { private static final String VECTOR_INDEXES_CHECK = "VECTOR_INDEXES_CHECK"; //$NON-NLS-1$ private static final String EXCEPTION_FILE_SIZE = "EXCEPTION_FS"; //$NON-NLS-1$ - public static final String LATEST_CHANGES_URL = "https://osmand.net/blog/osmand-3-7-released"; + public static final String LATEST_CHANGES_URL = "https://osmand.net/blog/osmand-3-8-released"; // public static final String LATEST_CHANGES_URL = null; // not enough to read public static final int APP_EXIT_CODE = 4; public static final String APP_EXIT_KEY = "APP_EXIT_KEY"; diff --git a/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java b/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java index 8281a127e4..7217e8af5f 100644 --- a/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java +++ b/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java @@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; +import net.osmand.CallbackWithObject; import net.osmand.GPXUtilities; import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.GPXTrackAnalysis; @@ -19,6 +20,7 @@ import net.osmand.GPXUtilities.WptPt; import net.osmand.IProgress; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; +import net.osmand.StateChangedListener; import net.osmand.data.LatLon; import net.osmand.plus.GPXDatabase.GpxDataItem; import net.osmand.plus.MapMarkersHelper.MapMarkersGroup; @@ -26,6 +28,7 @@ import net.osmand.plus.activities.SavingTrackHelper; import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType; import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType; +import net.osmand.plus.routing.RouteProvider; import net.osmand.plus.settings.backend.OsmandSettings.MetricsConstants; import net.osmand.plus.track.GpxSplitType; import net.osmand.plus.track.GradientScaleType; @@ -40,6 +43,7 @@ import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -48,6 +52,8 @@ import java.util.Set; public class GpxSelectionHelper { + private final static Log LOG = PlatformUtil.getLog(GpxSelectionHelper.class); + public static final String CURRENT_TRACK = "currentTrack"; private static final String FILE = "file"; private static final String BACKUP = "backup"; @@ -61,15 +67,18 @@ public class GpxSelectionHelper { private OsmandApplication app; @NonNull - private List selectedGPXFiles = new java.util.ArrayList<>(); - private Map selectedGpxFilesBackUp = new java.util.HashMap<>(); + private List selectedGPXFiles = new ArrayList<>(); + private Map selectedGpxFilesBackUp = new HashMap<>(); private SavingTrackHelper savingTrackHelper; - private final static Log LOG = PlatformUtil.getLog(GpxSelectionHelper.class); private SelectGpxTask selectGpxTask; + private SelectedGpxFile trackToFollow; + private StateChangedListener followTrackListener; + private boolean shouldHideTrackToFollow; - public GpxSelectionHelper(OsmandApplication osmandApplication, SavingTrackHelper trackHelper) { - this.app = osmandApplication; + public GpxSelectionHelper(OsmandApplication app, SavingTrackHelper trackHelper) { + this.app = app; savingTrackHelper = trackHelper; + app.getSettings().FOLLOW_THE_GPX_ROUTE.addListener(getFollowTrackListener()); } public void clearAllGpxFilesToShow(boolean backupSelection) { @@ -86,10 +95,18 @@ public class GpxSelectionHelper { public void restoreSelectedGpxFiles() { for (Entry gpxEntry : selectedGpxFilesBackUp.entrySet()) { if (!Algorithms.isEmpty(gpxEntry.getKey().path)) { - final File file = new File(gpxEntry.getKey().path); + File file = new File(gpxEntry.getKey().path); if (file.exists() && !file.isDirectory()) { if (file.lastModified() > gpxEntry.getValue()) { - new GpxFileLoaderTask(file, app).execute(); + new GpxFileLoaderTask(file, new CallbackWithObject() { + @Override + public boolean processResult(GPXFile result) { + if (result != null) { + selectGpxFile(result, true, false); + } + return true; + } + }).execute(); } else { selectGpxFile(gpxEntry.getKey(), true, false); } @@ -99,14 +116,52 @@ public class GpxSelectionHelper { } } + public boolean shouldHideTrackToFollow() { + return shouldHideTrackToFollow; + } + + private StateChangedListener getFollowTrackListener() { + if (followTrackListener == null) { + followTrackListener = new StateChangedListener() { + @Override + public void stateChanged(String gpxRoutePath) { + if (trackToFollow != null) { + if (shouldHideTrackToFollow) { + selectGpxFile(trackToFollow.getGpxFile(), false, false); + shouldHideTrackToFollow = false; + } + trackToFollow = null; + } + if (!Algorithms.isEmpty(gpxRoutePath)) { + trackToFollow = getSelectedFileByPath(gpxRoutePath); + if (trackToFollow == null) { + shouldHideTrackToFollow = true; + File file = new File(gpxRoutePath); + if (file.exists() && !file.isDirectory()) { + new GpxFileLoaderTask(file, new CallbackWithObject() { + @Override + public boolean processResult(GPXFile result) { + trackToFollow = selectGpxFile(result, true, false); + return true; + } + }).execute(); + } + } + } + } + }; + } + return followTrackListener; + } + private static class GpxFileLoaderTask extends AsyncTask { - File fileToLoad; - GpxSelectionHelper helper; + private File fileToLoad; + private CallbackWithObject callback; - GpxFileLoaderTask(File fileToLoad, OsmandApplication app) { + GpxFileLoaderTask(File fileToLoad, CallbackWithObject callback) { this.fileToLoad = fileToLoad; - this.helper = app.getSelectedGpxHelper(); + this.callback = callback; } @Override @@ -116,8 +171,8 @@ public class GpxSelectionHelper { @Override protected void onPostExecute(GPXFile gpxFile) { - if (gpxFile != null) { - helper.selectGpxFile(gpxFile, true, false); + if (callback != null) { + callback.processResult(gpxFile); } } } @@ -875,7 +930,13 @@ public class GpxSelectionHelper { this.displayGroups = displayGroups; } - + public boolean isFollowTrack(OsmandApplication app) { + RouteProvider.GPXRouteParamsBuilder routeParams = app.getRoutingHelper().getCurrentGPXRoute(); + if (routeParams != null) { + return gpxFile.path.equals(routeParams.getFile().path); + } + return false; + } } public enum GpxDisplayItemType { diff --git a/OsmAnd/src/net/osmand/plus/base/BottomSheetBehaviourDialogFragment.java b/OsmAnd/src/net/osmand/plus/base/BottomSheetBehaviourDialogFragment.java new file mode 100644 index 0000000000..332fb5be0e --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/base/BottomSheetBehaviourDialogFragment.java @@ -0,0 +1,282 @@ +package net.osmand.plus.base; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.LinearLayout; + +import androidx.annotation.ColorInt; +import androidx.annotation.ColorRes; +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; + +import com.google.android.material.bottomsheet.BottomSheetBehavior; + +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.UiUtilities.DialogButtonType; +import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; +import net.osmand.plus.helpers.AndroidUiHelper; + +import java.util.ArrayList; +import java.util.List; + +public abstract class BottomSheetBehaviourDialogFragment extends BottomSheetDialogFragment { + + private static final String USED_ON_MAP_KEY = "used_on_map"; + private static final int DEFAULT_VALUE = -1; + + protected List items = new ArrayList<>(); + + protected boolean usedOnMap = true; + protected boolean nightMode; + protected boolean portrait; + + protected View dismissButton; + protected View rightButton; + + private LinearLayout itemsContainer; + + public void setUsedOnMap(boolean usedOnMap) { + this.usedOnMap = usedOnMap; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (savedInstanceState != null) { + usedOnMap = savedInstanceState.getBoolean(USED_ON_MAP_KEY); + } + nightMode = isNightMode(requiredMyApplication()); + portrait = AndroidUiHelper.isOrientationPortrait(requireActivity()); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { + LayoutInflater themedInflater = UiUtilities.getInflater(requireContext(), nightMode); + View mainView = themedInflater.inflate(R.layout.bottom_sheet_behaviour_base, parent, false); + itemsContainer = (LinearLayout) mainView.findViewById(R.id.items_container); + + View scrollView = mainView.findViewById(R.id.bottom_sheet_scroll_view); + final BottomSheetBehavior behavior = BottomSheetBehavior.from(scrollView); + behavior.setPeekHeight(getPeekHeight()); + + LinearLayout buttonsContainer = (LinearLayout) mainView.findViewById(R.id.buttons_container); + buttonsContainer.setBackgroundResource(getButtonsContainerBg()); + + if (!portrait) { + Dialog dialog = getDialog(); + if (dialog != null) { + dialog.setOnShowListener(new DialogInterface.OnShowListener() { + @Override + public void onShow(DialogInterface dialog) { + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + } + }); + } + } + + createMenuItems(savedInstanceState); + inflateMenuItems(); + + dismissButton = mainView.findViewById(R.id.dismiss_button); + UiUtilities.setupDialogButton(nightMode, dismissButton, getDismissButtonType(), getDismissButtonTextId()); + dismissButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onDismissButtonClickAction(); + dismiss(); + } + }); + if (hideButtonsContainer()) { + mainView.findViewById(R.id.buttons_container).setVisibility(View.GONE); + } else { + int rightBottomButtonTextId = getRightBottomButtonTextId(); + if (rightBottomButtonTextId != DEFAULT_VALUE) { + mainView.findViewById(R.id.buttons_divider).setVisibility(View.VISIBLE); + rightButton = mainView.findViewById(R.id.right_bottom_button); + UiUtilities.setupDialogButton(nightMode, rightButton, getRightBottomButtonType(), rightBottomButtonTextId); + rightButton.setVisibility(View.VISIBLE); + rightButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onRightBottomButtonClick(); + } + }); + } + } + updateBackground(); + updateBottomButtons(); + return mainView; + } + + @Override + public void onStart() { + super.onStart(); + FragmentActivity activity = requireActivity(); + if (!AndroidUiHelper.isOrientationPortrait(activity)) { + Dialog dialog = getDialog(); + Window window = dialog != null ? dialog.getWindow() : null; + if (window != null) { + WindowManager.LayoutParams params = window.getAttributes(); + params.width = activity.getResources().getDimensionPixelSize(R.dimen.landscape_bottom_sheet_dialog_fragment_width); + window.setAttributes(params); + } + } + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(USED_ON_MAP_KEY, usedOnMap); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + items.clear(); + if (itemsContainer != null) { + itemsContainer.removeAllViews(); + } + } + + public abstract void createMenuItems(Bundle savedInstanceState); + + protected void inflateMenuItems() { + Activity activity = requireActivity(); + for (BaseBottomSheetItem item : items) { + item.inflate(activity, itemsContainer, nightMode); + } + } + + @Override + protected Drawable getContentIcon(@DrawableRes int id) { + return getIcon(id, nightMode ? R.color.icon_color_default_dark : R.color.icon_color_default_light); + } + + protected Drawable getActiveIcon(@DrawableRes int id) { + return getIcon(id, getActiveColorId()); + } + + @ColorRes + protected int getActiveColorId() { + return nightMode ? R.color.osmand_orange : R.color.color_myloc_distance; + } + + @ColorInt + protected int getResolvedColor(@ColorRes int colorId) { + Context ctx = getContext(); + return ctx != null ? ContextCompat.getColor(ctx, colorId) : 0; + } + + private void updateBackground() { + if (portrait) { + itemsContainer.setBackgroundResource(getPortraitBgResId()); + } else { + itemsContainer.setBackgroundResource(getLandscapeTopsidesBgResId()); + } + } + + protected int getPeekHeight() { + return DEFAULT_VALUE; + } + + protected boolean hideButtonsContainer() { + return false; + } + + @StringRes + protected int getDismissButtonTextId() { + return R.string.shared_string_cancel; + } + + protected DialogButtonType getDismissButtonType() { + return DialogButtonType.SECONDARY; + } + + protected void onDismissButtonClickAction() { + + } + + @StringRes + protected int getRightBottomButtonTextId() { + return DEFAULT_VALUE; + } + + protected DialogButtonType getRightBottomButtonType() { + return DialogButtonType.PRIMARY; + } + + protected void onRightBottomButtonClick() { + + } + + protected boolean isDismissButtonEnabled() { + return true; + } + + protected boolean isRightBottomButtonEnabled() { + return true; + } + + protected void updateBottomButtons() { + if (dismissButton != null) { + boolean enabled = isDismissButtonEnabled(); + dismissButton.setEnabled(enabled); + dismissButton.findViewById(R.id.button_text).setEnabled(enabled); + } + if (rightButton != null) { + boolean enabled = isRightBottomButtonEnabled(); + rightButton.setEnabled(enabled); + rightButton.findViewById(R.id.button_text).setEnabled(enabled); + } + } + + @ColorRes + protected int getBgColorId() { + return nightMode ? R.color.list_background_color_dark : R.color.list_background_color_light; + } + + @DrawableRes + protected int getPortraitBgResId() { + return nightMode ? R.drawable.bg_bottom_menu_dark : R.drawable.bg_bottom_menu_light; + } + + @DrawableRes + protected int getLandscapeTopsidesBgResId() { + return nightMode ? R.drawable.bg_bottom_sheet_topsides_landscape_dark : R.drawable.bg_bottom_sheet_topsides_landscape_light; + } + + @DrawableRes + protected int getLandscapeSidesBgResId() { + return nightMode ? R.drawable.bg_bottom_sheet_sides_landscape_dark : R.drawable.bg_bottom_sheet_sides_landscape_light; + } + + private int getButtonsContainerBg() { + if (portrait) { + return getBgColorId(); + } + return nightMode ? R.drawable.bottom_sheet_buttons_bg_dark : R.drawable.bottom_sheet_buttons_bg_light; + } + + protected boolean isNightMode(@NonNull OsmandApplication app) { + if (usedOnMap) { + return app.getDaynightHelper().isNightModeForMapControls(); + } + return !app.getSettings().isLightContent(); + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java index 57928eac50..5cb595f0ff 100644 --- a/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java @@ -612,6 +612,10 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment { } } + protected boolean isHideable() { + return true; + } + private void processScreenHeight(ViewParent parent) { View container = (View) parent; MapActivity mapActivity = getMapActivity(); @@ -783,7 +787,7 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment { private int getPosY(final int currentY, boolean needCloseMenu, int previousState) { - if (needCloseMenu) { + if (needCloseMenu && isHideable()) { return screenHeight; } MapActivity mapActivity = getMapActivity(); @@ -858,7 +862,7 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment { @Override public void onAnimationEnd(Animator animation) { if (!canceled) { - if (needCloseMenu) { + if (needCloseMenu && isHideable()) { dismiss(); } else { updateMainViewLayout(posY); @@ -870,7 +874,7 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment { } }).start(); } else { - if (needCloseMenu) { + if (needCloseMenu && isHideable()) { dismiss(); } else { mainView.setY(posY); diff --git a/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java b/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java index d47eb92724..d898505b76 100644 --- a/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java +++ b/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java @@ -14,13 +14,13 @@ import net.osmand.GPXUtilities.GPXFile; import net.osmand.PlatformUtil; import net.osmand.data.LatLon; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.TargetPointsHelper; import net.osmand.plus.TargetPointsHelper.TargetPoint; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; import net.osmand.plus.routing.RoutingHelper; +import net.osmand.plus.settings.backend.OsmandSettings; import org.apache.commons.logging.Log; @@ -161,9 +161,8 @@ public class FailSafeFuntions { OsmandApplication app = ma.getMyApplication(); ma.getMapViewTrackingUtilities().backToLocationImpl(); RoutingHelper routingHelper = app.getRoutingHelper(); - if(gpxRoute == null) { - app.getSettings().FOLLOW_THE_GPX_ROUTE.set(null); - } + app.getSettings().FOLLOW_THE_GPX_ROUTE.set(gpxRoute != null ? gpxRoute.getFile().path : null); + routingHelper.setGpxParams(gpxRoute); if (app.getTargetPointsHelper().getPointToStart() == null) { app.getTargetPointsHelper().setStartPoint(null, false, null); diff --git a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/BottomSheetItemWithDescription.java b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/BottomSheetItemWithDescription.java index b138bee19f..afb6319e41 100644 --- a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/BottomSheetItemWithDescription.java +++ b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/BottomSheetItemWithDescription.java @@ -53,6 +53,7 @@ public class BottomSheetItemWithDescription extends SimpleBottomSheetItem { public void setDescription(CharSequence description) { this.description = description; descriptionTv.setText(description); + changeDescriptionVisibility(); } public void setDescriptionMaxLines(int maxLines) { @@ -76,11 +77,7 @@ public class BottomSheetItemWithDescription extends SimpleBottomSheetItem { super.inflate(context, container, nightMode); descriptionTv = view.findViewById(R.id.description); if (descriptionTv != null) { - if (Algorithms.isEmpty(description)) { - descriptionTv.setVisibility(View.GONE); - } else { - descriptionTv.setVisibility(View.VISIBLE); - } + changeDescriptionVisibility(); descriptionTv.setText(description); if (descriptionColorId != INVALID_ID) { descriptionTv.setTextColor(ContextCompat.getColor(context, descriptionColorId)); @@ -94,6 +91,14 @@ public class BottomSheetItemWithDescription extends SimpleBottomSheetItem { } } + private void changeDescriptionVisibility() { + if (Algorithms.isEmpty(description)) { + descriptionTv.setVisibility(View.GONE); + } else { + descriptionTv.setVisibility(View.VISIBLE); + } + } + public static class Builder extends SimpleBottomSheetItem.Builder { protected CharSequence description; diff --git a/OsmAnd/src/net/osmand/plus/dialogs/WhatsNewDialogFragment.java b/OsmAnd/src/net/osmand/plus/dialogs/WhatsNewDialogFragment.java index 791f131de1..523fdb6416 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/WhatsNewDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/WhatsNewDialogFragment.java @@ -30,7 +30,7 @@ public class WhatsNewDialogFragment extends DialogFragment { final OsmandApplication osmandApplication = (OsmandApplication) getActivity().getApplication(); final String appVersion = Version.getAppVersion(osmandApplication); builder.setTitle(getString(R.string.whats_new) + " " + appVersion) - .setMessage(getString(R.string.release_3_7)) + .setMessage(getString(R.string.release_3_8)) .setNegativeButton(R.string.shared_string_close, null); if (AppInitializer.LATEST_CHANGES_URL != null) { builder.setPositiveButton(R.string.read_more, new DialogInterface.OnClickListener() { diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/GpxApproximationFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/GpxApproximationFragment.java index 4698b00d86..68029eb36a 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/GpxApproximationFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/GpxApproximationFragment.java @@ -56,6 +56,8 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment private View cancelButton; private View applyButton; + private SliderCard sliderCard; + @Override public int getMainLayoutId() { return R.layout.fragment_gpx_approximation_bottom_sheet_dialog; @@ -87,7 +89,7 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment @Override public int getSupportedMenuStatesPortrait() { - return MenuState.HALF_SCREEN | MenuState.FULL_SCREEN; + return MenuState.HEADER_ONLY | MenuState.HALF_SCREEN | MenuState.FULL_SCREEN; } @Override @@ -174,11 +176,17 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment @Override protected void calculateLayout(View view, boolean initLayout) { + int sliderHeight = sliderCard != null ? sliderCard.getViewHeight() : 0; menuTitleHeight = view.findViewById(R.id.control_buttons).getHeight() - - view.findViewById(R.id.buttons_shadow).getHeight(); + - view.findViewById(R.id.buttons_shadow).getHeight() + sliderHeight; super.calculateLayout(view, initLayout); } + @Override + protected boolean isHideable() { + return false; + } + @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); @@ -263,7 +271,7 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment cardsContainer.removeAllViews(); if (getTopView() != null) { - SliderCard sliderCard = new SliderCard(mapActivity, distanceThreshold); + sliderCard = new SliderCard(mapActivity, distanceThreshold); sliderCard.setListener(this); getTopView().addView(sliderCard.build(mapActivity)); } diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java index 88ec9f7975..e365348586 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java @@ -43,7 +43,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import static net.osmand.plus.measurementtool.MeasurementEditingContext.CalculationMode.WHOLE_TRACK; -import static net.osmand.plus.measurementtool.command.MeasurementModeCommand.MeasurementCommandType.*; +import static net.osmand.plus.measurementtool.command.MeasurementModeCommand.MeasurementCommandType.APPROXIMATE_POINTS; public class MeasurementEditingContext { @@ -249,8 +249,10 @@ public class MeasurementEditingContext { Pair pair = new Pair<>(points.get(i), points.get(i + 1)); RoadSegmentData data = this.roadSegmentData.get(pair); if (data == null) { - distance += MapUtils.getDistance(pair.first.getLatitude(), pair.first.getLongitude(), - pair.second.getLatitude(), pair.second.getLongitude()); + if (appMode != MeasurementEditingContext.DEFAULT_APP_MODE || !pair.first.lastPoint || !pair.second.firstPoint) { + distance += MapUtils.getDistance(pair.first.getLatitude(), pair.first.getLongitude(), + pair.second.getLatitude(), pair.second.getLongitude()); + } } else { distance += data.getDistance(); } diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java index 9788db1f35..8007470ba6 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java @@ -4,20 +4,16 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; -import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ProgressBar; @@ -27,8 +23,6 @@ import android.widget.Toast; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.SwitchCompat; import androidx.core.content.ContextCompat; import androidx.core.widget.TextViewCompat; import androidx.fragment.app.Fragment; @@ -40,13 +34,11 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.snackbar.Snackbar; import net.osmand.AndroidUtils; -import net.osmand.FileUtils; import net.osmand.GPXUtilities; import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.Track; import net.osmand.GPXUtilities.TrkSegment; import net.osmand.GPXUtilities.WptPt; -import net.osmand.IndexConstants; import net.osmand.LocationsHolder; import net.osmand.data.LatLon; import net.osmand.data.QuadRect; @@ -100,6 +92,7 @@ import java.util.List; import java.util.Locale; import static net.osmand.IndexConstants.GPX_FILE_EXT; +import static net.osmand.IndexConstants.GPX_INDEX_DIR; import static net.osmand.plus.measurementtool.MeasurementEditingContext.CalculationMode; import static net.osmand.plus.measurementtool.MeasurementEditingContext.SnapToRoadProgressListener; import static net.osmand.plus.measurementtool.SaveAsNewTrackBottomSheetDialogFragment.SaveAsNewTrackFragmentListener; @@ -157,7 +150,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route LINE } - private enum SaveAction { + private enum FinalSaveAction { SHOW_SNACK_BAR_AND_CLOSE, SHOW_TOAST, SHOW_IS_SAVED_FRAGMENT @@ -431,7 +424,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route toolBarController.setOnSaveViewClickListener(new OnClickListener() { @Override public void onClick(View v) { - saveChanges(SaveAction.SHOW_SNACK_BAR_AND_CLOSE); + saveChanges(FinalSaveAction.SHOW_SNACK_BAR_AND_CLOSE, false); } }); updateToolbar(); @@ -629,17 +622,19 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route } } - public void saveChanges(SaveAction saveAction) { + public void saveChanges(FinalSaveAction finalSaveAction, boolean showDialog) { MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { if (editingCtx.getPointsCount() > 0) { GpxData gpxData = editingCtx.getGpxData(); - if (editingCtx.isNewData()) { - saveAsGpx(SaveType.ROUTE_POINT, saveAction); - } else if (isInEditMode() && gpxData.getActionType() == ActionType.EDIT_SEGMENT) { - openSaveAsNewTrackMenu(mapActivity); + if (editingCtx.isNewData() || (isInEditMode() && gpxData.getActionType() == ActionType.EDIT_SEGMENT)) { + if (showDialog) { + openSaveAsNewTrackMenu(mapActivity); + } else { + saveNewGpx(null, getSuggestedFileName(), true, false, finalSaveAction); + } } else { - addToGpx(mapActivity, saveAction); + addToGpx(mapActivity, finalSaveAction); } } else { Toast.makeText(mapActivity, getString(R.string.none_point_error), Toast.LENGTH_SHORT).show(); @@ -754,7 +749,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route @Override public void saveChangesOnClick() { - saveChanges(SaveAction.SHOW_TOAST); + saveChanges(FinalSaveAction.SHOW_TOAST, true); } @Override @@ -1003,8 +998,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route if (selectedGpxFile != null) { gpxFile = selectedGpxFile.getGpxFile(); } else { - gpxFile = GPXUtilities.loadGPXFile(new File( - getMyApplication().getAppPath(IndexConstants.GPX_INDEX_DIR), gpxFileName)); + gpxFile = GPXUtilities.loadGPXFile(new File(app.getAppPath(GPX_INDEX_DIR), gpxFileName)); } } @@ -1027,7 +1021,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route .getSelectedFileByPath(gpxFile.path); boolean showOnMap = selectedGpxFile != null; saveExistingGpx(gpxFile, showOnMap, ActionType.ADD_SEGMENT, - editingCtx.hasRoute() ? SaveType.ROUTE_POINT : SaveType.LINE, SaveAction.SHOW_TOAST); + editingCtx.hasRoute() ? SaveType.ROUTE_POINT : SaveType.LINE, FinalSaveAction.SHOW_TOAST); } } @@ -1065,15 +1059,20 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route @Override public void onSaveAsNewTrack(String folderName, String fileName, boolean showOnMap, boolean simplifiedTrack) { + saveNewGpx(folderName, fileName, showOnMap, simplifiedTrack, FinalSaveAction.SHOW_IS_SAVED_FRAGMENT); + } + + private void saveNewGpx(String folderName, String fileName, boolean showOnMap, boolean simplifiedTrack, + FinalSaveAction finalSaveAction) { OsmandApplication app = getMyApplication(); if (app != null) { - File dir = getMyApplication().getAppPath(IndexConstants.GPX_INDEX_DIR); + File dir = getMyApplication().getAppPath(GPX_INDEX_DIR); if (folderName != null) { dir = new File(dir, folderName); } - fileName = fileName + GPX_FILE_EXT; + fileName += GPX_FILE_EXT; SaveType saveType = simplifiedTrack ? SaveType.LINE : SaveType.ROUTE_POINT; - saveNewGpx(dir, fileName, showOnMap, saveType, SaveAction.SHOW_IS_SAVED_FRAGMENT); + saveNewGpx(dir, fileName, showOnMap, saveType, finalSaveAction); } } @@ -1150,10 +1149,14 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route final ApplicationMode appMode = editingCtx.getAppMode(); if (mapActivity != null) { Drawable icon; - if (appMode == MeasurementEditingContext.DEFAULT_APP_MODE) { - icon = getActiveIcon(R.drawable.ic_action_split_interval); + if (editingCtx.isTrackSnappedToRoad() || editingCtx.isNewData()) { + if (appMode == MeasurementEditingContext.DEFAULT_APP_MODE) { + icon = getActiveIcon(R.drawable.ic_action_split_interval); + } else { + icon = getIcon(appMode.getIconRes(), appMode.getIconColorInfo().getColor(nightMode)); + } } else { - icon = getIcon(appMode.getIconRes(), appMode.getIconColorInfo().getColor(nightMode)); + icon = getContentIcon(R.drawable.ic_action_help); } ImageButton snapToRoadBtn = (ImageButton) mapActivity.findViewById(R.id.snap_to_road_image_button); snapToRoadBtn.setImageDrawable(icon); @@ -1201,7 +1204,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route if (mapActivity != null) { if (editingCtx.getPointsCount() > 0) { SaveAsNewTrackBottomSheetDialogFragment.showInstance(mapActivity.getSupportFragmentManager(), - this, getSuggestedFileName()); + this, "", getSuggestedFileName(), true, true); } else { Toast.makeText(mapActivity, getString(R.string.none_point_error), Toast.LENGTH_SHORT).show(); } @@ -1468,7 +1471,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route } } - private void addToGpx(MapActivity mapActivity, SaveAction saveAction) { + private void addToGpx(MapActivity mapActivity, FinalSaveAction finalSaveAction) { GpxData gpxData = editingCtx.getGpxData(); GPXFile gpx = gpxData != null ? gpxData.getGpxFile() : null; if (gpx != null) { @@ -1476,84 +1479,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route mapActivity.getMyApplication().getSelectedGpxHelper().getSelectedFileByPath(gpx.path); boolean showOnMap = selectedGpxFile != null; saveExistingGpx(gpx, showOnMap, gpxData.getActionType(), - editingCtx.hasRoute() ? SaveType.ROUTE_POINT : SaveType.LINE, saveAction); - } - } - - private void saveAsGpx(final SaveType saveType, final SaveAction saveAction) { - MapActivity mapActivity = getMapActivity(); - if (mapActivity != null) { - final File dir = mapActivity.getMyApplication().getAppPath(IndexConstants.GPX_INDEX_DIR); - final View view = UiUtilities.getInflater(mapActivity, nightMode).inflate(R.layout.save_gpx_dialog, null); - final EditText nameEt = (EditText) view.findViewById(R.id.gpx_name_et); - final TextView warningTextView = (TextView) view.findViewById(R.id.file_exists_text_view); - final View buttonView = view.findViewById(R.id.button_view); - final SwitchCompat showOnMapToggle = (SwitchCompat) view.findViewById(R.id.toggle_show_on_map); - UiUtilities.setupCompoundButton(showOnMapToggle, nightMode, UiUtilities.CompoundButtonType.GLOBAL); - buttonView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - showOnMapToggle.setChecked(!showOnMapToggle.isChecked()); - } - }); - showOnMapToggle.setChecked(true); - - String displayedName = getSuggestedFileName(); - nameEt.setText(displayedName); - nameEt.setSelection(displayedName.length()); - final boolean[] textChanged = new boolean[1]; - - AlertDialog.Builder builder = new AlertDialog.Builder(UiUtilities.getThemedContext(mapActivity, nightMode)) - .setTitle(R.string.enter_gpx_name) - .setView(view) - .setPositiveButton(R.string.shared_string_save, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - final String name = nameEt.getText().toString(); - String fileName = name + GPX_FILE_EXT; - if (textChanged[0]) { - File fout = new File(dir, fileName); - int ind = 1; - while (fout.exists()) { - fileName = name + "_" + (++ind) + GPX_FILE_EXT; - fout = new File(dir, fileName); - } - } - saveNewGpx(dir, fileName, showOnMapToggle.isChecked(), saveType, saveAction); - } - }) - .setNegativeButton(R.string.shared_string_cancel, null); - final AlertDialog dialog = builder.create(); - dialog.show(); - - nameEt.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { - - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { - - } - - @Override - public void afterTextChanged(Editable editable) { - if (new File(dir, editable.toString() + GPX_FILE_EXT).exists()) { - warningTextView.setVisibility(View.VISIBLE); - warningTextView.setText(R.string.file_with_name_already_exists); - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true); - } else if (editable.toString().trim().isEmpty()) { - warningTextView.setVisibility(View.VISIBLE); - warningTextView.setText(R.string.enter_the_file_name); - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); - } else { - warningTextView.setVisibility(View.INVISIBLE); - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true); - } - textChanged[0] = true; - } - }); + editingCtx.hasRoute() ? SaveType.ROUTE_POINT : SaveType.LINE, finalSaveAction); } } @@ -1565,7 +1491,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route displayedName = suggestedName; OsmandApplication app = getMyApplication(); if (app != null) { - File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR); + File dir = app.getAppPath(GPX_INDEX_DIR); File fout = new File(dir, suggestedName + GPX_FILE_EXT); int ind = 0; while (fout.exists()) { @@ -1579,13 +1505,13 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route return displayedName; } - private void saveNewGpx(File dir, String fileName, boolean showOnMap, SaveType saveType, SaveAction saveAction) { - saveGpx(dir, fileName, showOnMap, null, null, saveType, saveAction); + private void saveNewGpx(File dir, String fileName, boolean showOnMap, SaveType saveType, FinalSaveAction finalSaveAction) { + saveGpx(dir, fileName, showOnMap, null, null, saveType, finalSaveAction); } private void saveExistingGpx(GPXFile gpx, boolean showOnMap, ActionType actionType, SaveType saveType, - SaveAction saveAction) { - saveGpx(null, null, showOnMap, gpx, actionType, saveType, saveAction); + FinalSaveAction finalSaveAction) { + saveGpx(null, null, showOnMap, gpx, actionType, saveType, finalSaveAction); } @SuppressLint("StaticFieldLeak") @@ -1595,7 +1521,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route final GPXFile gpxFile, final ActionType actionType, final SaveType saveType, - final SaveAction saveAction) { + final FinalSaveAction finalSaveAction) { new AsyncTask() { @@ -1766,25 +1692,13 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route if (isInEditMode()) { dismiss(mapActivity); } else { - switch (saveAction) { + switch (finalSaveAction) { case SHOW_SNACK_BAR_AND_CLOSE: final WeakReference mapActivityRef = new WeakReference<>(mapActivity); snackbar = Snackbar.make(mapActivity.getLayout(), MessageFormat.format(getString(R.string.gpx_saved_sucessfully), toSave.getName()), Snackbar.LENGTH_LONG) - .setAction(R.string.shared_string_rename, new OnClickListener() { - @Override - public void onClick(View view) { - MapActivity mapActivity = mapActivityRef.get(); - if (AndroidUtils.isActivityNotDestroyed(mapActivity)) { - FileUtils.renameFile(mapActivity, toSave, new FileUtils.RenameCallback() { - @Override - public void renamedTo(File file) { - } - }); - } - } - }); + .setAction(R.string.shared_string_rename, getRenameListener(mapActivityRef)); snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_action) .setAllCaps(false); UiUtilities.setupSnackbar(snackbar, nightMode); @@ -1808,6 +1722,22 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route Toast.makeText(mapActivity, warning.getMessage(), Toast.LENGTH_LONG).show(); } } + + private OnClickListener getRenameListener(final WeakReference mapActivityRef) { + return new OnClickListener() { + @Override + public void onClick(View view) { + MapActivity mapActivity = mapActivityRef.get(); + String parentFolder = toSave.getParentFile().getName(); + if (GPX_INDEX_DIR.equals(parentFolder + File.separator)) { + parentFolder = null; + } + SaveAsNewTrackBottomSheetDialogFragment.showInstance( + mapActivity.getSupportFragmentManager(), null, parentFolder, + AndroidUtils.trimExtension(toSave.getName()), false, showOnMap); + } + }; + } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -2068,8 +1998,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route layoutParams.leftMargin = ctx.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_large); layoutParams.rightMargin = ctx.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_large); int paddingH = ctx.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_large); - int paddingV = ctx.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_small); - done.setPadding(paddingH, paddingV, paddingH, paddingV); + done.setPadding(paddingH, done.getPaddingTop(), paddingH, done.getPaddingBottom()); AndroidUtils.setBackground(ctx, done, nightMode, R.drawable.purchase_dialog_outline_btn_bg_light, R.drawable.purchase_dialog_outline_btn_bg_dark); } diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/RouteBetweenPointsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/RouteBetweenPointsBottomSheetDialogFragment.java index f57cbd4e04..77f3909e62 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/RouteBetweenPointsBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/RouteBetweenPointsBottomSheetDialogFragment.java @@ -13,11 +13,12 @@ import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; +import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; -import net.osmand.plus.base.MenuBottomSheetDialogFragment; +import net.osmand.plus.base.BottomSheetBehaviourDialogFragment; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.settings.backend.ApplicationMode; @@ -29,8 +30,9 @@ import java.util.List; import static net.osmand.plus.UiUtilities.CustomRadioButtonType.LEFT; import static net.osmand.plus.UiUtilities.CustomRadioButtonType.RIGHT; import static net.osmand.plus.measurementtool.MeasurementEditingContext.DEFAULT_APP_MODE; +import static net.osmand.plus.measurementtool.SelectFileBottomSheet.BOTTOM_SHEET_HEIGHT_DP; -public class RouteBetweenPointsBottomSheetDialogFragment extends MenuBottomSheetDialogFragment { +public class RouteBetweenPointsBottomSheetDialogFragment extends BottomSheetBehaviourDialogFragment { private static final Log LOG = PlatformUtil.getLog(RouteBetweenPointsBottomSheetDialogFragment.class); public static final String TAG = RouteBetweenPointsBottomSheetDialogFragment.class.getSimpleName(); @@ -93,9 +95,9 @@ public class RouteBetweenPointsBottomSheetDialogFragment extends MenuBottomSheet case WHOLE_ROUTE_CALCULATION: switch (dialogMode) { case SINGLE: - return getString(R.string.rourte_between_points_next_segment_button_desc); + return getString(R.string.route_between_points_next_segment_button_desc); case ALL: - return getString(R.string.rourte_between_points_whole_track_button_desc); + return getString(R.string.route_between_points_whole_track_button_desc); } break; case NEXT_ROUTE_CALCULATION: @@ -225,6 +227,11 @@ public class RouteBetweenPointsBottomSheetDialogFragment extends MenuBottomSheet items.add(new BaseBottomSheetItem.Builder().setCustomView(mainView).create()); } + @Override + protected int getPeekHeight() { + return AndroidUtils.dpToPx(getContext(), BOTTOM_SHEET_HEIGHT_DP); + } + @Override protected int getDismissButtonTextId() { return R.string.shared_string_close; diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java index d786417301..0355bba809 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java @@ -2,11 +2,13 @@ package net.osmand.plus.measurementtool; import android.content.res.ColorStateList; import android.graphics.Color; +import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.View; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -19,6 +21,8 @@ import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputLayout; import net.osmand.AndroidUtils; +import net.osmand.GPXUtilities; +import net.osmand.IndexConstants; import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; @@ -33,6 +37,8 @@ import net.osmand.plus.measurementtool.adapter.FolderListAdapter; import org.apache.commons.logging.Log; +import java.io.File; + public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDialogFragment { public static final String TAG = SaveAsNewTrackBottomSheetDialogFragment.class.getSimpleName(); @@ -41,12 +47,18 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial public static final String SIMPLIFIED_TRACK_KEY = "simplified_track_key"; public static final String FOLDER_NAME_KEY = "folder_name_key"; public static final String FILE_NAME_KEY = "file_name_key"; + public static final String SOURCE_FILE_NAME_KEY = "source_file_name_key"; + public static final String SOURCE_FOLDER_NAME_KEY = "source_folder_name_key"; + public static final String SHOW_SIMPLIFIED_BUTTON_KEY = "show_simplified_button_key"; private boolean showOnMap; private boolean simplifiedTrack; private String fileName; + private String sourceFileName; + private String sourceFolderName; private String folderName; private boolean rightButtonEnabled = true; + private boolean showSimplifiedButton = true; @Override public void createMenuItems(Bundle savedInstanceState) { @@ -59,9 +71,12 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial simplifiedTrack = savedInstanceState.getBoolean(SIMPLIFIED_TRACK_KEY); folderName = savedInstanceState.getString(FOLDER_NAME_KEY); fileName = savedInstanceState.getString(FILE_NAME_KEY); + sourceFileName = savedInstanceState.getString(SOURCE_FILE_NAME_KEY); + sourceFolderName = savedInstanceState.getString(SOURCE_FOLDER_NAME_KEY); + showSimplifiedButton = savedInstanceState.getBoolean(SHOW_SIMPLIFIED_BUTTON_KEY); } - items.add(new TitleItem(getString(R.string.shared_string_save_as_gpx))); + items.add(new TitleItem(getString(R.string.save_as_new_track))); View editNameView = View.inflate(UiUtilities.getThemedContext(app, nightMode), R.layout.track_name_edit_text, null); @@ -113,46 +128,38 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial items.add(new DividerSpaceItem(app, app.getResources().getDimensionPixelSize(R.dimen.dialog_content_margin))); } + int activeColorRes = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light; - int backgroundColor = AndroidUtils.getColorFromAttr(UiUtilities.getThemedContext(app, nightMode), - R.attr.activity_background_color); - GradientDrawable background = (GradientDrawable) AppCompatResources.getDrawable(app, - R.drawable.bg_select_group_button_outline); - if (background != null) { - background = (GradientDrawable) background.mutate(); - background.setStroke(0, Color.TRANSPARENT); - background.setColor(backgroundColor); - } - final BottomSheetItemWithCompoundButton[] simplifiedTrackItem = new BottomSheetItemWithCompoundButton[1]; - simplifiedTrackItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() - .setChecked(simplifiedTrack) - .setCompoundButtonColorId(activeColorRes) - .setDescription(getString(R.string.simplified_track_description)) - .setBackground(background) - .setTitle(getString(R.string.simplified_track)) - .setLayoutId(R.layout.bottom_sheet_item_with_switch_and_descr) - .setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - simplifiedTrack = !simplifiedTrack; - simplifiedTrackItem[0].setChecked(simplifiedTrack); - } - }) - .create(); - items.add(simplifiedTrackItem[0]); - items.add(new DividerSpaceItem(app, app.getResources().getDimensionPixelSize(R.dimen.content_padding))); + if (showSimplifiedButton) { + final BottomSheetItemWithCompoundButton[] simplifiedTrackItem = new BottomSheetItemWithCompoundButton[1]; + simplifiedTrackItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() + .setChecked(simplifiedTrack) + .setCompoundButtonColorId(activeColorRes) + .setDescription(getSimplifiedTrackDescription()) + .setBackground(getBackground(simplifiedTrack)) + .setTitle(getString(R.string.simplified_track)) + .setLayoutId(R.layout.bottom_sheet_item_with_switch_and_descr) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + simplifiedTrack = !simplifiedTrack; + simplifiedTrackItem[0].setChecked(simplifiedTrack); + AndroidUtils.setBackground(simplifiedTrackItem[0].getView(), getBackground(simplifiedTrack)); + simplifiedTrackItem[0].setDescription(getSimplifiedTrackDescription()); + } + }) + .create(); + items.add(simplifiedTrackItem[0]); - background = (GradientDrawable) AppCompatResources.getDrawable(app, R.drawable.bg_select_group_button_outline); - if (background != null) { - background = (GradientDrawable) background.mutate(); - background.setStroke(app.getResources().getDimensionPixelSize(R.dimen.map_button_stroke), backgroundColor); + items.add(new DividerSpaceItem(app, app.getResources().getDimensionPixelSize(R.dimen.content_padding))); } + final BottomSheetItemWithCompoundButton[] showOnMapItem = new BottomSheetItemWithCompoundButton[1]; showOnMapItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() .setCompoundButtonColorId(activeColorRes) .setChecked(showOnMap) - .setBackground(background) + .setBackground(getBackground(showOnMap)) .setTitle(getString(R.string.shared_string_show_on_map)) .setLayoutId(R.layout.bottom_sheet_item_with_switch_and_descr) .setOnClickListener(new View.OnClickListener() { @@ -160,6 +167,7 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial public void onClick(View v) { showOnMap = !showOnMap; showOnMapItem[0].setChecked(showOnMap); + AndroidUtils.setBackground(showOnMapItem[0].getView(), getBackground(showOnMap)); } }) .create(); @@ -168,6 +176,31 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial items.add(new DividerSpaceItem(app, contentPaddingSmall)); } + private String getSimplifiedTrackDescription() { + return simplifiedTrack ? getString(R.string.simplified_track_description) : ""; + } + + private Drawable getBackground(boolean checked) { + OsmandApplication app = getMyApplication(); + if (app != null) { + GradientDrawable background = (GradientDrawable) AppCompatResources.getDrawable(app, + R.drawable.bg_select_group_button_outline); + if (background != null) { + int backgroundColor = AndroidUtils.getColorFromAttr(UiUtilities.getThemedContext(app, nightMode), + R.attr.activity_background_color); + background = (GradientDrawable) background.mutate(); + if (checked) { + background.setStroke(0, Color.TRANSPARENT); + background.setColor(backgroundColor); + } else { + background.setStroke(app.getResources().getDimensionPixelSize(R.dimen.map_button_stroke), backgroundColor); + } + } + return background; + } + return null; + } + private FolderListAdapter.FolderListAdapterListener createFolderSelectListener() { return new FolderListAdapter.FolderListAdapterListener() { @Override @@ -183,15 +216,23 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial outState.putBoolean(SIMPLIFIED_TRACK_KEY, simplifiedTrack); outState.putString(FOLDER_NAME_KEY, folderName); outState.putString(FILE_NAME_KEY, fileName); + outState.putString(SOURCE_FILE_NAME_KEY, sourceFileName); + outState.putString(SOURCE_FOLDER_NAME_KEY, sourceFolderName); + outState.putBoolean(SHOW_SIMPLIFIED_BUTTON_KEY, showSimplifiedButton); super.onSaveInstanceState(outState); } - public static void showInstance(@NonNull FragmentManager fm, @Nullable Fragment targetFragment, String fileName) { + public static void showInstance(@NonNull FragmentManager fm, @Nullable Fragment targetFragment, String folderName, + String fileName, boolean showSimplifiedButton, boolean showOnMap) { try { if (!fm.isStateSaved()) { SaveAsNewTrackBottomSheetDialogFragment fragment = new SaveAsNewTrackBottomSheetDialogFragment(); fragment.setTargetFragment(targetFragment, 0); fragment.fileName = fileName; + fragment.sourceFileName = fileName; + fragment.sourceFolderName = folderName; + fragment.showSimplifiedButton = showSimplifiedButton; + fragment.showOnMap = showOnMap; fragment.show(fm, TAG); } } catch (RuntimeException e) { @@ -210,10 +251,45 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial if (targetFragment instanceof SaveAsNewTrackFragmentListener) { ((SaveAsNewTrackFragmentListener) targetFragment).onSaveAsNewTrack(folderName, fileName, showOnMap, simplifiedTrack); + } else { + renameFile(); } dismiss(); } + private void renameFile() { + OsmandApplication app = getMyApplication(); + if (app != null) { + File dir = getMyApplication().getAppPath(IndexConstants.GPX_INDEX_DIR); + File source = dir; + if (sourceFolderName != null) { + source = new File(dir, sourceFolderName); + } + source = new File(source, sourceFileName + IndexConstants.GPX_FILE_EXT); + File dest = dir; + if (folderName != null) { + dest = new File(dir, folderName); + } + dest = new File(dest, fileName + IndexConstants.GPX_FILE_EXT); + if (!source.equals(dest)) { + if (dest.exists()) { + Toast.makeText(app, R.string.file_with_name_already_exists, Toast.LENGTH_LONG).show(); + } else { + if (source.renameTo(dest)) { + app.getGpxDbHelper().rename(source, dest); + } else { + Toast.makeText(app, R.string.file_can_not_be_moved, Toast.LENGTH_LONG).show(); + } + } + } + GPXUtilities.GPXFile gpxFile = GPXUtilities.loadGPXFile(dest); + if (gpxFile.error != null) { + return; + } + app.getSelectedGpxHelper().selectGpxFile(gpxFile, showOnMap, false); + } + } + @Override protected boolean isRightBottomButtonEnabled() { return rightButtonEnabled; diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/SelectFileBottomSheet.java b/OsmAnd/src/net/osmand/plus/measurementtool/SelectFileBottomSheet.java index d9619de9d1..c82bc1e9d5 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/SelectFileBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/SelectFileBottomSheet.java @@ -15,7 +15,7 @@ import net.osmand.AndroidUtils; import net.osmand.IndexConstants; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.base.MenuBottomSheetDialogFragment; +import net.osmand.plus.base.BottomSheetBehaviourDialogFragment; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.helpers.GpxTrackAdapter; import net.osmand.plus.helpers.GpxTrackAdapter.OnItemClickListener; @@ -32,11 +32,11 @@ import java.util.Map; import static net.osmand.plus.helpers.GpxUiHelper.getSortedGPXFilesInfo; import static net.osmand.util.Algorithms.collectDirs; -public class SelectFileBottomSheet extends MenuBottomSheetDialogFragment { +public class SelectFileBottomSheet extends BottomSheetBehaviourDialogFragment { enum Mode { OPEN_TRACK(R.string.plan_route_open_existing_track, R.string.plan_route_select_track_file_for_open), - ADD_TO_TRACK(R.string.add_to_a_track, R.string.rourte_between_points_add_track_desc); + ADD_TO_TRACK(R.string.add_to_a_track, R.string.route_between_points_add_track_desc); int title; int description; @@ -120,12 +120,13 @@ public class SelectFileBottomSheet extends MenuBottomSheetDialogFragment { adapter.setAdapterListener(new OnItemClickListener() { @Override public void onItemClick(int position) { - if (position != RecyclerView.NO_POSITION && position < allGpxList.size()) { + List gpxList = adapter.getGpxInfoList(); + if (position != RecyclerView.NO_POSITION && position < gpxList.size()) { String fileName; if (isShowCurrentGpx() && position == 0) { fileName = null; } else { - fileName = allGpxList.get(position).getFileName(); + fileName = gpxList.get(position).getFileName(); } if (listener != null) { listener.selectFileOnCLick(fileName); @@ -173,8 +174,8 @@ public class SelectFileBottomSheet extends MenuBottomSheetDialogFragment { } @Override - protected int getCustomHeight() { - return AndroidUtils.dpToPx(mainView.getContext(), BOTTOM_SHEET_HEIGHT_DP); + protected int getPeekHeight() { + return AndroidUtils.dpToPx(getContext(), BOTTOM_SHEET_HEIGHT_DP); } public static void showInstance(FragmentManager fragmentManager, SelectFileListener listener, Mode mode) { diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/StartPlanRouteBottomSheet.java b/OsmAnd/src/net/osmand/plus/measurementtool/StartPlanRouteBottomSheet.java index de235b0dc5..aedb65ee72 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/StartPlanRouteBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/StartPlanRouteBottomSheet.java @@ -19,7 +19,7 @@ import net.osmand.IndexConstants; import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.base.MenuBottomSheetDialogFragment; +import net.osmand.plus.base.BottomSheetBehaviourDialogFragment; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerItem; @@ -38,7 +38,7 @@ import java.util.List; import static net.osmand.plus.helpers.GpxUiHelper.getSortedGPXFilesInfo; -public class StartPlanRouteBottomSheet extends MenuBottomSheetDialogFragment { +public class StartPlanRouteBottomSheet extends BottomSheetBehaviourDialogFragment { public static final String TAG = StartPlanRouteBottomSheet.class.getSimpleName(); private static final Log LOG = PlatformUtil.getLog(StartPlanRouteBottomSheet.class); @@ -136,8 +136,8 @@ public class StartPlanRouteBottomSheet extends MenuBottomSheetDialogFragment { } @Override - protected int getCustomHeight() { - return AndroidUtils.dpToPx(mainView.getContext(), BOTTOM_SHEET_HEIGHT_DP); + protected int getPeekHeight() { + return AndroidUtils.dpToPx(getContext(), BOTTOM_SHEET_HEIGHT_DP); } private void onItemClick(int position, List gpxInfoList) { diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java index 54747b068e..12346bcf12 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java @@ -27,7 +27,9 @@ import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.TrkSegment; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; +import net.osmand.ValueHolder; import net.osmand.data.QuadRect; +import net.osmand.data.RotatedTileBox; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; @@ -55,6 +57,7 @@ import net.osmand.plus.routepreparationmenu.cards.ReverseTrackCard; import net.osmand.plus.routepreparationmenu.cards.SelectTrackCard; import net.osmand.plus.routepreparationmenu.cards.TrackEditCard; import net.osmand.plus.routepreparationmenu.cards.TracksToFollowCard; +import net.osmand.plus.routing.IRouteInformationListener; import net.osmand.plus.routing.RouteProvider; import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; import net.osmand.plus.routing.RoutingHelper; @@ -66,7 +69,7 @@ import java.io.File; import java.util.List; -public class FollowTrackFragment extends ContextMenuScrollFragment implements CardListener { +public class FollowTrackFragment extends ContextMenuScrollFragment implements CardListener, IRouteInformationListener { public static final String TAG = FollowTrackFragment.class.getName(); @@ -264,12 +267,14 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca @Override public void onResume() { super.onResume(); + app.getRoutingHelper().addListener(this); MapRouteInfoMenu.followTrackVisible = true; } @Override public void onPause() { super.onPause(); + app.getRoutingHelper().removeListener(this); MapRouteInfoMenu.followTrackVisible = false; } @@ -293,10 +298,56 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca updateStatusBarColor(); } + @Override + protected int applyPosY(int currentY, boolean needCloseMenu, boolean needMapAdjust, int previousMenuState, int newMenuState, int dZoom, boolean animated) { + int y = super.applyPosY(currentY, needCloseMenu, needMapAdjust, previousMenuState, newMenuState, dZoom, animated); + if (needMapAdjust) { + adjustMapPosition(y); + } + return y; + } + + private void adjustMapPosition(int y) { + MapActivity mapActivity = getMapActivity(); + if (mapActivity == null) { + return; + } + + RoutingHelper rh = app.getRoutingHelper(); + if (rh.isRoutePlanningMode() && mapActivity.getMapView() != null) { + QuadRect rect = mapActivity.getMapRouteInfoMenu().getRouteRect(mapActivity); + + if (gpxFile != null) { + QuadRect gpxRect = gpxFile.getRect(); + + rect.left = Math.min(rect.left, gpxRect.left); + rect.right = Math.max(rect.right, gpxRect.right); + rect.top = Math.max(rect.top, gpxRect.top); + rect.bottom = Math.min(rect.bottom, gpxRect.bottom); + } + + RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy(); + int tileBoxWidthPx = 0; + int tileBoxHeightPx = 0; + + if (!isPortrait()) { + tileBoxWidthPx = tb.getPixWidth() - getWidth(); + } else { + int fHeight = getViewHeight() - y - AndroidUtils.getStatusBarHeight(app); + tileBoxHeightPx = tb.getPixHeight() - fHeight; + } + if (rect.left != 0 && rect.right != 0) { + mapActivity.getMapView().fitRectToMap(rect.left, rect.right, rect.top, rect.bottom, + tileBoxWidthPx, tileBoxHeightPx, 0); + } + } + } + @Override public void onDestroyView() { super.onDestroyView(); exitTrackAppearanceMode(); + onDismiss(); } @Override @@ -554,4 +605,36 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca log.error(e); } } + + private void onDismiss() { + try { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + if (!mapActivity.isChangingConfigurations()) { + mapActivity.getMapRouteInfoMenu().cancelSelectionFromTracks(); + } + mapActivity.getMapLayers().getMapControlsLayer().showRouteInfoControlDialog(); + } + } catch (Exception e) { + log.error(e); + } + } + + @Override + public void newRouteIsCalculated(boolean newRoute, ValueHolder showToast) { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null && newRoute && app.getRoutingHelper().isRoutePlanningMode()) { + adjustMapPosition(getHeight()); + } + } + + @Override + public void routeWasCancelled() { + + } + + @Override + public void routeWasFinished() { + + } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java index e6ad1b1728..876804b945 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java @@ -43,6 +43,7 @@ import net.osmand.ValueHolder; import net.osmand.data.FavouritePoint; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; +import net.osmand.data.QuadRect; import net.osmand.data.RotatedTileBox; import net.osmand.plus.FavouritesDbHelper; import net.osmand.plus.FavouritesDbHelper.FavoritesListener; @@ -95,6 +96,7 @@ import net.osmand.plus.routepreparationmenu.cards.PublicTransportNotFoundWarning import net.osmand.plus.routepreparationmenu.cards.SimpleRouteCard; import net.osmand.plus.routepreparationmenu.cards.TracksCard; import net.osmand.plus.routing.IRouteInformationListener; +import net.osmand.plus.routing.RouteCalculationResult; import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.TransportRoutingHelper; @@ -147,6 +149,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener private PointType selectFromMapPointType; private int selectFromMapMenuState = MenuState.HEADER_ONLY; private boolean selectFromMapWaypoints; + private boolean selectFromTracks; private boolean showMenu = false; private int showMenuState = DEFAULT_MENU_STATE; @@ -1563,8 +1566,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener if (mapActivity != null) { GPXRouteParamsBuilder routeParams = mapActivity.getRoutingHelper().getCurrentGPXRoute(); if (routeParams != null) { - FollowTrackFragment trackOptionsFragment = new FollowTrackFragment(); - FollowTrackFragment.showInstance(mapActivity, trackOptionsFragment); + selectTrack(); } } } @@ -1577,6 +1579,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener FrameLayout viaButton = mainView.findViewById(R.id.via_button); AndroidUiHelper.updateVisibility(viaButton, routeParams == null || isFinishPointFromTrack()); + viaButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -1949,6 +1952,19 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener } } + public void selectTrack() { + selectFromTracks = true; + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + FollowTrackFragment trackOptionsFragment = new FollowTrackFragment(); + FollowTrackFragment.showInstance(mapActivity, trackOptionsFragment); + } + } + + public void cancelSelectionFromTracks() { + selectFromTracks = false; + } + public void setupFields(PointType pointType) { View mainView = getMainView(); if (mainView != null) { @@ -2248,7 +2264,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener if (switched) { mapActivity.getMapLayers().getMapControlsLayer().switchToRouteFollowingLayout(); } - if (mapActivity.getPointToNavigate() == null && !selectFromMapTouch) { + if (mapActivity.getPointToNavigate() == null && !selectFromMapTouch && !selectFromTracks) { mapActivity.getMapActions().stopNavigationWithoutConfirm(); } mapActivity.updateStatusBarColor(); @@ -2363,6 +2379,32 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener updateMenu(); } + @NonNull + public QuadRect getRouteRect(@NonNull MapActivity mapActivity) { + OsmandApplication app = mapActivity.getMyApplication(); + RoutingHelper routingHelper = app.getRoutingHelper(); + MapRouteInfoMenu menu = mapActivity.getMapRouteInfoMenu(); + + QuadRect rect = new QuadRect(0, 0, 0, 0); + if (menu.isTransportRouteCalculated()) { + TransportRoutingHelper transportRoutingHelper = app.getTransportRoutingHelper(); + TransportRouteResult result = transportRoutingHelper.getCurrentRouteResult(); + if (result != null) { + QuadRect transportRouteRect = transportRoutingHelper.getTransportRouteRect(result); + if (transportRouteRect != null) { + rect = transportRouteRect; + } + } + } else if (routingHelper.isRouteCalculated()) { + RouteCalculationResult result = routingHelper.getRoute(); + QuadRect routeRect = routingHelper.getRouteRect(result); + if (routeRect != null) { + rect = routeRect; + } + } + return rect; + } + public enum MapRouteMenuType { ROUTE_INFO, ROUTE_DETAILS diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java index 537901f6f2..bd1d382677 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java @@ -16,23 +16,16 @@ import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import net.osmand.AndroidUtils; -import net.osmand.Location; import net.osmand.data.QuadRect; import net.osmand.data.RotatedTileBox; -import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.TargetPointsHelper.TargetPoint; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.base.ContextMenuFragment; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.routing.RoutingHelper; -import net.osmand.plus.routing.TransportRoutingHelper; +import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.widgets.TextViewExProgress; -import net.osmand.router.TransportRouteResult; -import net.osmand.util.MapUtils; - -import java.util.List; public class MapRouteInfoMenuFragment extends ContextMenuFragment { public static final String TAG = MapRouteInfoMenuFragment.class.getName(); @@ -289,36 +282,7 @@ public class MapRouteInfoMenuFragment extends ContextMenuFragment { RoutingHelper rh = app.getRoutingHelper(); if (rh.isRoutePlanningMode() && mapActivity.getMapView() != null) { - QuadRect r = new QuadRect(0, 0, 0, 0); - if (menu.isTransportRouteCalculated()) { - TransportRoutingHelper transportRoutingHelper = app.getTransportRoutingHelper(); - TransportRouteResult result = transportRoutingHelper.getCurrentRouteResult(); - if (result != null) { - QuadRect transportRouteRect = transportRoutingHelper.getTransportRouteRect(result); - if (transportRouteRect != null) { - r = transportRouteRect; - } - } - } else if (rh.isRouteCalculated()) { - Location lt = rh.getLastProjection(); - if (lt == null) { - lt = app.getTargetPointsHelper().getPointToStartLocation(); - } - if (lt == null) { - lt = app.getLocationProvider().getLastKnownLocation(); - } - if (lt != null) { - MapUtils.insetLatLonRect(r, lt.getLatitude(), lt.getLongitude()); - } - List list = rh.getCurrentCalculatedRoute(); - for (Location l : list) { - MapUtils.insetLatLonRect(r, l.getLatitude(), l.getLongitude()); - } - List targetPoints = app.getTargetPointsHelper().getIntermediatePointsWithTarget(); - for (TargetPoint l : targetPoints) { - MapUtils.insetLatLonRect(r, l.getLatitude(), l.getLongitude()); - } - } + QuadRect r = menu.getRouteRect(mapActivity); RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy(); int tileBoxWidthPx = 0; int tileBoxHeightPx = 0; diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java index c6d3df05ca..0d23e78673 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java @@ -5,7 +5,6 @@ import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; -import android.view.MenuItem; import android.view.View; import android.widget.CompoundButton; import android.widget.ImageView; @@ -13,14 +12,10 @@ import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.ColorRes; -import androidx.appcompat.view.ContextThemeWrapper; -import androidx.appcompat.widget.PopupMenu; import androidx.core.content.ContextCompat; import androidx.fragment.app.FragmentManager; import net.osmand.AndroidUtils; -import net.osmand.CallbackWithObject; -import net.osmand.GPXUtilities; import net.osmand.StateChangedListener; import net.osmand.plus.OsmAndLocationSimulation; import net.osmand.plus.OsmandApplication; @@ -35,7 +30,6 @@ import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerStartItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; -import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.AvoidPTTypesRoutingParameter; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.AvoidRoadsRoutingParameter; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.DividerItem; @@ -367,8 +361,9 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - FollowTrackFragment trackOptionsFragment = new FollowTrackFragment(); - FollowTrackFragment.showInstance(mapActivity, trackOptionsFragment); + MapRouteInfoMenu mapRouteInfoMenu = mapActivity.getMapRouteInfoMenu(); + mapRouteInfoMenu.hide(); + mapRouteInfoMenu.selectTrack(); dismiss(); } }) @@ -500,58 +495,6 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { f.show(fragmentManager, RouteOptionsBottomSheet.TAG); } - protected void openGPXFileSelection() { - GpxUiHelper.selectGPXFile(mapActivity, false, false, new CallbackWithObject() { - - @Override - public boolean processResult(GPXUtilities.GPXFile[] result) { - mapActivity.getMapActions().setGPXRouteParams(result[0]); - app.getTargetPointsHelper().updateRouteAndRefresh(true); - updateParameters(); - routingHelper.recalculateRouteDueToSettingsChange(); - return true; - } - }, nightMode); - } - - private void showOptionsMenu(View view) { - RouteProvider.GPXRouteParamsBuilder rp = mapActivity.getRoutingHelper().getCurrentGPXRoute(); - final PopupMenu optionsMenu = new PopupMenu(new ContextThemeWrapper(view.getContext(), themeRes), view); - MenuItem item = optionsMenu.getMenu().add( - mapActivity.getString(R.string.shared_string_none)); - item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - if (mapActivity.getRoutingHelper().getCurrentGPXRoute() != null) { - mapActivity.getRoutingHelper().setGpxParams(null); - settings.FOLLOW_THE_GPX_ROUTE.set(null); - mapActivity.getRoutingHelper().recalculateRouteDueToSettingsChange(); - } - updateParameters(); - return true; - } - }); - item = optionsMenu.getMenu().add(mapActivity.getString(R.string.select_gpx)); - item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - openGPXFileSelection(); - return true; - } - }); - if (rp != null) { - item = optionsMenu.getMenu().add(new File(rp.getFile().path).getName()); - item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - // nothing to change - return true; - } - }); - } - optionsMenu.show(); - } - public void updateParameters() { Activity activity = getActivity(); View mainView = getView(); diff --git a/OsmAnd/src/net/osmand/plus/routing/GpxApproximator.java b/OsmAnd/src/net/osmand/plus/routing/GpxApproximator.java index a3fb41c2f2..7e6b089620 100644 --- a/OsmAnd/src/net/osmand/plus/routing/GpxApproximator.java +++ b/OsmAnd/src/net/osmand/plus/routing/GpxApproximator.java @@ -140,13 +140,13 @@ public class GpxApproximator { public void cancelApproximation() { if (gctx != null) { - gctx.calculationCancelled = true; + gctx.ctx.calculationProgress.isCancelled = true; } } public void calculateGpxApproximation(@NonNull final ResultMatcher resultMatcher) { if (gctx != null) { - gctx.calculationCancelled = true; + gctx.ctx.calculationProgress.isCancelled = true; } final GpxRouteApproximation gctx = getNewGpxApproximationContext(this.gctx); this.gctx = gctx; @@ -187,10 +187,10 @@ public class GpxApproximator { @Override public void run() { RouteCalculationProgress calculationProgress = gctx.ctx.calculationProgress; - if (gctx.isCalculationDone() && GpxApproximator.this.gctx == gctx) { + if (!gctx.result.isEmpty() && GpxApproximator.this.gctx == gctx) { finishProgress(); } - if (!gctx.isCalculationDone() && calculationProgress != null && !calculationProgress.isCancelled) { + if (gctx.result.isEmpty() && calculationProgress != null && !calculationProgress.isCancelled) { float pr = calculationProgress.getLinearProgress(); approximationProgress.updateProgress((int) pr); if (GpxApproximator.this.gctx != gctx) { diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 57becfe9a6..4fd5b1dd65 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -1,9 +1,10 @@ package net.osmand.plus.routing; -import net.osmand.GPXUtilities; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import net.osmand.GPXUtilities.GPXFile; -import net.osmand.GPXUtilities.WptPt; import net.osmand.Location; import net.osmand.LocationsHolder; import net.osmand.PlatformUtil; @@ -12,14 +13,11 @@ import net.osmand.ValueHolder; import net.osmand.binary.RouteDataObject; import net.osmand.data.LatLon; import net.osmand.data.QuadPoint; -import net.osmand.plus.routing.RouteProvider.RoutingEnvironment; -import net.osmand.plus.settings.backend.ApplicationMode; +import net.osmand.data.QuadRect; import net.osmand.plus.NavigationService; -import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener; import net.osmand.plus.OsmAndFormatter; 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.TargetPointsHelper; import net.osmand.plus.TargetPointsHelper.TargetPoint; @@ -27,9 +25,12 @@ import net.osmand.plus.notifications.OsmandNotification.NotificationType; import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo; import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; import net.osmand.plus.routing.RouteProvider.RouteService; +import net.osmand.plus.routing.RouteProvider.RoutingEnvironment; +import net.osmand.plus.settings.backend.ApplicationMode; +import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener; +import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.router.RouteCalculationProgress; import net.osmand.router.RouteExporter; -import net.osmand.router.RoutePlannerFrontEnd; import net.osmand.router.RoutePlannerFrontEnd.GpxPoint; import net.osmand.router.RoutePlannerFrontEnd.GpxRouteApproximation; import net.osmand.router.RouteSegmentResult; @@ -1041,7 +1042,30 @@ public class RoutingHelper { return route.getRouteDirections(); } + @Nullable + public QuadRect getRouteRect(@NonNull RouteCalculationResult result) { + QuadRect rect = new QuadRect(0, 0, 0, 0); + Location lt = getLastProjection(); + if (lt == null) { + lt = app.getTargetPointsHelper().getPointToStartLocation(); + } + if (lt == null) { + lt = app.getLocationProvider().getLastKnownLocation(); + } + if (lt != null) { + MapUtils.insetLatLonRect(rect, lt.getLatitude(), lt.getLongitude()); + } + List list = result.getImmutableAllLocations(); + for (Location l : list) { + MapUtils.insetLatLonRect(rect, l.getLatitude(), l.getLongitude()); + } + List targetPoints = app.getTargetPointsHelper().getIntermediatePointsWithTarget(); + for (TargetPoint l : targetPoints) { + MapUtils.insetLatLonRect(rect, l.getLatitude(), l.getLongitude()); + } + return rect.left == 0 && rect.right == 0 ? null : rect; + } private class RouteRecalculationThread extends Thread { @@ -1344,6 +1368,7 @@ public class RoutingHelper { // NEVER returns null + @NonNull public RouteCalculationResult getRoute() { return route; } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java index 2f7cf6cb5f..4752e180f7 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java @@ -43,11 +43,13 @@ import net.osmand.plus.MapMarkersHelper.MapMarkersGroup; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; +import net.osmand.plus.activities.MapActivity; import net.osmand.plus.base.PointImageDrawable; import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.SelectedGpxPoint; import net.osmand.plus.mapcontextmenu.other.TrackChartPoints; import net.osmand.plus.render.OsmandRenderer; import net.osmand.plus.render.OsmandRenderer.RenderingContext; +import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu; import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference; import net.osmand.plus.track.SaveGpxAsyncTask; import net.osmand.plus.track.TrackDrawInfo; @@ -70,6 +72,7 @@ import org.apache.commons.logging.Log; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -234,7 +237,15 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { - List selectedGPXFiles = selectedGpxHelper.getSelectedGPXFiles(); + List selectedGPXFiles = new ArrayList<>(selectedGpxHelper.getSelectedGPXFiles()); + + Iterator iterator = selectedGPXFiles.iterator(); + while (iterator.hasNext()) { + SelectedGpxFile selectedGpxFile = iterator.next(); + if (selectedGpxFile.isFollowTrack(view.getApplication()) && !showTrackToFollow()) { + iterator.remove(); + } + } cache.clear(); if (!selectedGPXFiles.isEmpty()) { drawSelectedFilesSegments(canvas, tileBox, selectedGPXFiles, settings); @@ -710,6 +721,21 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM || gpxFile.path.equals(trackDrawInfo.getFilePath())); } + private boolean showTrackToFollow() { + if (view.getContext() instanceof MapActivity) { + MapActivity mapActivity = (MapActivity) view.getContext(); + OsmandApplication app = mapActivity.getMyApplication(); + MapRouteInfoMenu routeInfoMenu = mapActivity.getMapRouteInfoMenu(); + return !app.getSelectedGpxHelper().shouldHideTrackToFollow() + || routeInfoMenu.isVisible() + || app.getRoutingHelper().isFollowingMode() + || MapRouteInfoMenu.followTrackVisible + || MapRouteInfoMenu.chooseRoutesVisible + || MapRouteInfoMenu.waypointsVisible; + } + return false; + } + private boolean isPointVisited(WptPt o) { boolean visit = false; String visited = o.getExtensionsToRead().get("VISITED_KEY"); diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java index a1e529cd91..7663a4845b 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java @@ -58,7 +58,6 @@ import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin; import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu; import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu.PointType; import net.osmand.plus.routing.RoutingHelper; -import net.osmand.plus.routing.TransportRoutingHelper; import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmAndAppCustomization; @@ -847,7 +846,6 @@ public class MapControlsLayer extends OsmandMapLayer { // default buttons boolean routePlanningMode = false; RoutingHelper rh = mapActivity.getRoutingHelper(); - TransportRoutingHelper trh = mapActivity.getRoutingHelper().getTransportRoutingHelper(); if (rh.isRoutePlanningMode()) { routePlanningMode = true; } else if ((rh.isRouteCalculated() || rh.isRouteBeingCalculated()) && !rh.isFollowingMode()) { @@ -860,37 +858,26 @@ public class MapControlsLayer extends OsmandMapLayer { ((app.accessibilityEnabled() || (System.currentTimeMillis() - touchEvent < TIMEOUT_TO_SHOW_BUTTONS)) && routeFollowingMode); boolean routeDialogOpened = mapRouteInfoMenu.isVisible() || (showRouteCalculationControls && mapRouteInfoMenu.needShowMenu()); updateMyLocationVisibility(backToLocationControl, rh, routeDialogOpened || contextMenuOpened); - boolean showButtons = (showRouteCalculationControls || !routeFollowingMode) + //routePlanningBtn.setIconResId(routeFollowingMode ? R.drawable.ic_action_info_dark : R.drawable.ic_action_gdirections_dark); + + updateRoutePlaningButton(rh, routePlanningMode); + + boolean showBottomMenuButtons = (showRouteCalculationControls || !routeFollowingMode) && !isInMovingMarkerMode() && !isInGpxDetailsMode() && !isInMeasurementToolMode() && !isInPlanRouteMode() && !contextMenuOpened && !isInChoosingRoutesMode() - && !isInWaypointsChoosingMode() && !isInTrackAppearanceMode(); - //routePlanningBtn.setIconResId(routeFollowingMode ? R.drawable.ic_action_info_dark : R.drawable.ic_action_gdirections_dark); - int routePlanningBtnImage = mapRouteInfoMenu.getRoutePlanningBtnImage(); - if (routePlanningBtnImage != 0) { - routePlanningBtn.setIconResId(routePlanningBtnImage); - routePlanningBtn.setIconColorId(R.color.color_myloc_distance); - } else if (rh.isFollowingMode()) { - routePlanningBtn.setIconResId(R.drawable.ic_action_start_navigation); - routePlanningBtn.setIconColorId(R.color.color_myloc_distance); - } else if (routePlanningMode) { - routePlanningBtn.setIconResId(R.drawable.ic_action_gdirections_dark); - routePlanningBtn.setIconColorId(R.color.color_myloc_distance); - } else { - routePlanningBtn.setIconResId(R.drawable.ic_action_gdirections_dark); - routePlanningBtn.resetIconColors(); - } - routePlanningBtn.updateVisibility(showButtons); - menuControl.updateVisibility(showButtons); + && !isInWaypointsChoosingMode() && !isInFollowTrackMode() && !isInTrackAppearanceMode(); + routePlanningBtn.updateVisibility(showBottomMenuButtons); + menuControl.updateVisibility(showBottomMenuButtons); + boolean showZoomButtons = !routeDialogOpened && !contextMenuOpened && !isInTrackAppearanceMode() + && (!isInGpxApproximationMode() || !isPotrait()) + && !isInFollowTrackMode() && (!isInChoosingRoutesMode() || !isInWaypointsChoosingMode() || !portrait); + mapZoomIn.updateVisibility(showZoomButtons); + mapZoomOut.updateVisibility(showZoomButtons); - mapZoomIn.updateVisibility(!routeDialogOpened && !contextMenuOpened && !isInTrackAppearanceMode() - && (!isInChoosingRoutesMode() || !isInWaypointsChoosingMode() || !portrait) - && (!isInGpxApproximationMode() || !isPotrait())); - mapZoomOut.updateVisibility(!routeDialogOpened && !contextMenuOpened && !isInTrackAppearanceMode() - && (!isInChoosingRoutesMode() || !isInWaypointsChoosingMode() || !portrait) - && (!isInGpxApproximationMode() || !isPotrait())); - boolean forceHideCompass = routeDialogOpened || trackDialogOpened - || isInMeasurementToolMode() || isInPlanRouteMode() || contextMenuOpened || isInChoosingRoutesMode() || isInTrackAppearanceMode() || isInWaypointsChoosingMode(); + boolean forceHideCompass = routeDialogOpened || trackDialogOpened || isInMeasurementToolMode() + || isInPlanRouteMode() || contextMenuOpened || isInChoosingRoutesMode() + || isInTrackAppearanceMode() || isInWaypointsChoosingMode() || isInFollowTrackMode(); compassHud.forceHideCompass = forceHideCompass; compassHud.updateVisibility(!forceHideCompass && shouldShowCompass()); @@ -899,10 +886,11 @@ public class MapControlsLayer extends OsmandMapLayer { if (layersHud.setIconResId(appMode.getIconRes())) { layersHud.update(app, isNight); } - layersHud.updateVisibility(!routeDialogOpened && !trackDialogOpened && !isInMeasurementToolMode() && !isInPlanRouteMode() - && !contextMenuOpened && !isInChoosingRoutesMode() && !isInTrackAppearanceMode() && !isInWaypointsChoosingMode()); - quickSearchHud.updateVisibility(!routeDialogOpened && !trackDialogOpened && !isInMeasurementToolMode() && !isInPlanRouteMode() - && !contextMenuOpened && !isInChoosingRoutesMode() && !isInTrackAppearanceMode() && !isInWaypointsChoosingMode()); + boolean showTopButtons = !routeDialogOpened && !trackDialogOpened && !contextMenuOpened + && !isInMeasurementToolMode() && !isInPlanRouteMode() && !isInChoosingRoutesMode() + && !isInTrackAppearanceMode() && !isInWaypointsChoosingMode() && !isInFollowTrackMode(); + layersHud.updateVisibility(showTopButtons); + quickSearchHud.updateVisibility(showTopButtons); if (mapView.isZooming()) { lastZoom = System.currentTimeMillis(); @@ -952,6 +940,23 @@ public class MapControlsLayer extends OsmandMapLayer { } } + private void updateRoutePlaningButton(RoutingHelper routingHelper, boolean routePlanningMode) { + int routePlanningBtnImage = mapRouteInfoMenu.getRoutePlanningBtnImage(); + if (routePlanningBtnImage != 0) { + routePlanningBtn.setIconResId(routePlanningBtnImage); + routePlanningBtn.setIconColorId(R.color.color_myloc_distance); + } else if (routingHelper.isFollowingMode()) { + routePlanningBtn.setIconResId(R.drawable.ic_action_start_navigation); + routePlanningBtn.setIconColorId(R.color.color_myloc_distance); + } else if (routePlanningMode) { + routePlanningBtn.setIconResId(R.drawable.ic_action_gdirections_dark); + routePlanningBtn.setIconColorId(R.color.color_myloc_distance); + } else { + routePlanningBtn.setIconResId(R.drawable.ic_action_gdirections_dark); + routePlanningBtn.resetIconColors(); + } + } + private boolean shouldShowCompass() { float mapRotate = mapActivity.getMapView().getRotate(); return forceShowCompass || mapRotate != 0 @@ -991,7 +996,7 @@ public class MapControlsLayer extends OsmandMapLayer { boolean tracked = mapActivity.getMapViewTrackingUtilities().isMapLinkedToLocation(); boolean visible = !(tracked && rh.isFollowingMode()) && (!isInGpxApproximationMode() || !isPotrait()); backToLocationControl.updateVisibility(visible && !dialogOpened && !isInPlanRouteMode() - && !isInTrackAppearanceMode() && (!isInChoosingRoutesMode() || !isInWaypointsChoosingMode() || !isPotrait())); + && !isInTrackAppearanceMode() && (!isInChoosingRoutesMode() || !isInWaypointsChoosingMode() || !isInFollowTrackMode() || !isPotrait())); } public boolean onSingleTap(PointF point, RotatedTileBox tileBox) { @@ -1311,6 +1316,10 @@ public class MapControlsLayer extends OsmandMapLayer { return MapRouteInfoMenu.waypointsVisible; } + private boolean isInFollowTrackMode() { + return MapRouteInfoMenu.followTrackVisible; + } + public static View.OnLongClickListener getOnClickMagnifierListener(final OsmandMapTileView view) { return new View.OnLongClickListener() { diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapQuickActionLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapQuickActionLayer.java index 722b5133c6..0353776edb 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/MapQuickActionLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/MapQuickActionLayer.java @@ -426,6 +426,7 @@ public class MapQuickActionLayer extends OsmandMapLayer implements QuickActionRe mapRouteInfoMenu.isVisible() || MapRouteInfoMenu.chooseRoutesVisible || MapRouteInfoMenu.waypointsVisible || + MapRouteInfoMenu.followTrackVisible || contextMenu.isVisible() && contextMenuMenuFragment != null && !contextMenuMenuFragment.isRemoving() || contextMenu.isVisible() && contextMenuMenuFragment != null && contextMenuMenuFragment.isAdded() || multiSelectionMenu.isVisible() && multiMenuFragment != null && multiMenuFragment.isAdded() || diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/LanesControl.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/LanesControl.java index 05f7a7586c..45ba996045 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/LanesControl.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/LanesControl.java @@ -18,7 +18,7 @@ import net.osmand.plus.routing.RouteCalculationResult; import net.osmand.plus.routing.RouteDirectionInfo; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.settings.backend.OsmandSettings; -import net.osmand.plus.views.OsmandMapLayer; +import net.osmand.plus.views.OsmandMapLayer.DrawSettings; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.mapwidgets.widgets.TextInfoWidget; import net.osmand.router.RouteResultPreparation; @@ -61,7 +61,7 @@ public class LanesControl { TextInfoWidget.updateTextColor(lanesText, lanesShadowText, textColor, textShadowColor, textBold, shadowRadius); } - public boolean updateInfo(OsmandMapLayer.DrawSettings drawSettings) { + public boolean updateInfo(DrawSettings drawSettings) { boolean visible = false; int locimminent = -1; int[] loclanes = null; @@ -105,7 +105,8 @@ public class LanesControl { } } } - visible = loclanes != null && loclanes.length > 0 && !MapRouteInfoMenu.chooseRoutesVisible && !MapRouteInfoMenu.waypointsVisible; + visible = loclanes != null && loclanes.length > 0 && !MapRouteInfoMenu.chooseRoutesVisible + && !MapRouteInfoMenu.waypointsVisible && !MapRouteInfoMenu.followTrackVisible; if (visible) { if (!Arrays.equals(lanesDrawable.lanes, loclanes) || (locimminent == 0) != lanesDrawable.imminent) { diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java index d01f042bd8..9979b3820b 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java @@ -1232,7 +1232,8 @@ public class MapInfoWidgetsFactory { boolean visible = settings.SHOW_COORDINATES_WIDGET.get() && map.getContextMenu().shouldShowTopControls() && map.getMapRouteInfoMenu().shouldShowTopControls() && !map.isTopToolbarActive() && !map.getMapLayers().getGpxLayer().isInTrackAppearanceMode() - && !MapRouteInfoMenu.chooseRoutesVisible && !MapRouteInfoMenu.waypointsVisible; + && !MapRouteInfoMenu.chooseRoutesVisible && !MapRouteInfoMenu.waypointsVisible + && !MapRouteInfoMenu.followTrackVisible; updateVisibility(visible); if (visible) {