diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java index 0a1b87e6e5..fb3432d4aa 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutingConfiguration.java @@ -1,8 +1,6 @@ package net.osmand.router; -import net.osmand.Location; import net.osmand.PlatformUtil; -import net.osmand.binary.RouteDataObject; import net.osmand.router.GeneralRouter.GeneralRouterProfile; import net.osmand.router.GeneralRouter.RouteAttributeContext; import net.osmand.router.GeneralRouter.RouteDataObjectAttribute; @@ -13,9 +11,10 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.InputStream; -import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; import java.util.Stack; public class RoutingConfiguration { @@ -55,7 +54,7 @@ public class RoutingConfiguration { private String defaultRouter = ""; private Map routers = new LinkedHashMap<>(); private Map attributes = new LinkedHashMap<>(); - private HashMap impassableRoadLocations = new HashMap<>(); + private Set impassableRoadLocations = new HashSet<>(); public Builder() { @@ -95,7 +94,7 @@ public class RoutingConfiguration { i.initialDirection = direction; i.recalculateDistance = parseSilentFloat(getAttribute(i.router, "recalculateDistanceHelp"), i.recalculateDistance) ; i.heuristicCoefficient = parseSilentFloat(getAttribute(i.router, "heuristicCoefficient"), i.heuristicCoefficient); - i.router.addImpassableRoads(impassableRoadLocations.keySet()); + i.router.addImpassableRoads(new HashSet<>(impassableRoadLocations)); i.ZOOM_TO_LOAD_TILES = parseSilentInt(getAttribute(i.router, "zoomToLoadTiles"), i.ZOOM_TO_LOAD_TILES); int desirable = parseSilentInt(getAttribute(i.router, "memoryLimitInMB"), 0); if(desirable != 0) { @@ -110,17 +109,13 @@ public class RoutingConfiguration { // i.planRoadDirection = 1; return i; } - - public Map getImpassableRoadLocations() { + + public Set getImpassableRoadLocations() { return impassableRoadLocations; } - public boolean addImpassableRoad(RouteDataObject route, Location location) { - if (!impassableRoadLocations.containsKey(route.id)){ - impassableRoadLocations.put(route.id, location); - return true; - } - return false; + public boolean addImpassableRoad(long routeId) { + return impassableRoadLocations.add(routeId); } public Map getAttributes() { @@ -159,8 +154,8 @@ public class RoutingConfiguration { return routers; } - public void removeImpassableRoad(RouteDataObject obj) { - impassableRoadLocations.remove(obj.id); + public void removeImpassableRoad(long routeId) { + impassableRoadLocations.remove(routeId); } } diff --git a/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java b/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java index b1c4c54566..d4731dcd8d 100644 --- a/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java +++ b/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java @@ -49,6 +49,8 @@ public class MapUtils { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '_', '~' }; + + public static double getDistance(LatLon l, double latitude, double longitude) { return getDistance(l.getLatitude(), l.getLongitude(), latitude, longitude); } @@ -695,39 +697,10 @@ public class MapUtils { return new LatLon(Math.toDegrees(phi2), Math.toDegrees(lambda2)); } - public static double getVectorMagnitude(int startX, int startY, int endX, int endY) { - return Math.sqrt(Math.pow((double) (endX - startX), 2.0) + Math.pow((double) (endY - startY), 2.0)); + public static double getSqrtDistance(int startX, int startY, int endX, int endY) { + return Math.sqrt((endX - startX) * (endX - startX) + (endY - startY) * (endY - startY)); } - //angle of vector - public static double getAngleForRadiusVector(int startX, int startY, int endX, int endY) { - return 2 * Math.atan((endY - startY) / (endX - startX - + Math.sqrt(Math.pow((double) (endX - startX), 2.0) + Math.pow((double) (endY - startY), 2.0)))); - } - - //returns coordinates of point on circle - public static double[] getCoordinatesFromRadiusAndAngle(double centerX, double centerY, double radius, double angle) { - double x = centerX + radius * Math.cos(angle); - double y = centerY + radius * Math.sin(angle); - return new double[]{x,y}; - } - - //returns signed angle between vectors in radians - public static double getAngleBetweenVectors(int vectorAStartX, int vectorAStartY, int vectorAEndX, int vectorAEndY, - int vectorBStartX, int vectorBStartY, int vectorBEndX, int vectorBEndY) { - int[] vectorA = new int[] {getVectorAxisValue(vectorAStartX, vectorAEndX), getVectorAxisValue(vectorAStartY, vectorAEndY)}; - int[] vectorB = new int[] {getVectorAxisValue(vectorBStartX, vectorBEndX), getVectorAxisValue(vectorBStartY, vectorBEndY)}; - return Math.atan2(vectorA[0] * vectorB[1] - vectorA[1] * vectorB [0], vectorA[0] * vectorB[0] + vectorA[1] * vectorB[1]); - } - - //calculates vector value for axis - public static int getVectorAxisValue(int axisStart, int axisEnd) { - if (axisEnd < axisStart) { - return Math.abs(axisEnd) - Math.abs(axisStart); - } else { - return Math.abs(axisStart) - Math.abs(axisEnd); - } - } } diff --git a/OsmAnd/res/drawable/ic_action_recalc_angle.xml b/OsmAnd/res/drawable/ic_action_recalc_angle.xml new file mode 100644 index 0000000000..18e4df905d --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_recalc_angle.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + diff --git a/OsmAnd/res/layout/bottom_sheet_item_in_frame_with_descr_and_icon.xml b/OsmAnd/res/layout/bottom_sheet_item_in_frame_with_descr_and_icon.xml index a4748728f0..6e64f26691 100644 --- a/OsmAnd/res/layout/bottom_sheet_item_in_frame_with_descr_and_icon.xml +++ b/OsmAnd/res/layout/bottom_sheet_item_in_frame_with_descr_and_icon.xml @@ -46,6 +46,7 @@ android:ellipsize="end" android:maxLines="2" android:lineSpacingMultiplier="@dimen/text_button_line_spacing_multiplier" + android:textColor="?android:textColorSecondary" android:textSize="@dimen/default_sub_text_size" tools:text="Some description" /> diff --git a/OsmAnd/res/layout/fragment_data_storage_place_dialog.xml b/OsmAnd/res/layout/fragment_data_storage_place_dialog.xml index d0d9d30d29..c62ee0a14a 100644 --- a/OsmAnd/res/layout/fragment_data_storage_place_dialog.xml +++ b/OsmAnd/res/layout/fragment_data_storage_place_dialog.xml @@ -64,6 +64,7 @@ android:layout_gravity="fill_horizontal" android:layout_marginBottom="24dp" android:layout_marginTop="4dp" + android:textColor="?android:textColorSecondary" android:text="@string/application_dir_description" android:textSize="16sp"/> diff --git a/OsmAnd/res/layout/map_marker_item.xml b/OsmAnd/res/layout/map_marker_item.xml index 0ad46644e0..1bb0b74cb4 100644 --- a/OsmAnd/res/layout/map_marker_item.xml +++ b/OsmAnd/res/layout/map_marker_item.xml @@ -74,7 +74,7 @@ android:layout_marginLeft="6dp" android:drawablePadding="2dp" android:maxLines="1" - android:textColor="@color/text_color_secondary_dark" + android:textColor="?android:textColorSecondary" android:textSize="@dimen/default_sub_text_size"/> diff --git a/OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml b/OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml index 4d1b662dc3..15ac723740 100644 --- a/OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml +++ b/OsmAnd/res/layout/purchase_dialog_card_button_active_ex.xml @@ -46,7 +46,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/osm_live_payment_contribute_descr" - android:textColor="?attr/card_description_text_color" + android:textColor="?attr/dialog_text_description_color" android:textSize="@dimen/default_desc_text_size" android:visibility="gone" osmand:typeface="@string/font_roboto_regular" @@ -56,7 +56,7 @@ android:id="@+id/description" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textColor="?attr/card_description_text_color" + android:textColor="?attr/dialog_text_description_color" android:textSize="@dimen/default_desc_text_size" osmand:typeface="@string/font_roboto_regular" tools:text="Monthly payment" /> diff --git a/OsmAnd/res/layout/purchase_dialog_card_button_ex.xml b/OsmAnd/res/layout/purchase_dialog_card_button_ex.xml index 05465c67db..4af46efd8b 100644 --- a/OsmAnd/res/layout/purchase_dialog_card_button_ex.xml +++ b/OsmAnd/res/layout/purchase_dialog_card_button_ex.xml @@ -38,7 +38,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/osm_live_payment_contribute_descr" - android:textColor="?attr/card_description_text_color" + android:textColor="?attr/dialog_text_description_color" android:textSize="@dimen/default_desc_text_size" android:visibility="gone" osmand:typeface="@string/font_roboto_regular" @@ -48,7 +48,7 @@ android:id="@+id/description" android:layout_width="match_parent" android:layout_height="wrap_content" - android:textColor="?attr/card_description_text_color" + android:textColor="?attr/dialog_text_description_color" android:textSize="@dimen/default_desc_text_size" osmand:typeface="@string/font_roboto_regular" tools:text="$0.62 / month • Save 68%" /> diff --git a/OsmAnd/res/layout/recalculation_angle_dialog.xml b/OsmAnd/res/layout/recalculation_angle_dialog.xml new file mode 100644 index 0000000000..bdea145131 --- /dev/null +++ b/OsmAnd/res/layout/recalculation_angle_dialog.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index a6a7adc819..d1752a60ad 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -3446,4 +3446,8 @@ يحتوي ملف التعريف المستوردة على بيانات إضافية. انقر فوق \"استيراد\" لاستيراد بيانات ملف التعريف فقط أو حدد بيانات إضافية لاستيرادها. عرض إشعارات النظام أثناء التنقل بالتوجيهات . إشعار الملاحة + التطبيق الافتراضي (%s) + تعطيل إعادة الحساب + الحد الأدنى من المسافة لإعادة حساب المسار + سيتم إعادة حساب المسار إذا كانت المسافة إلى المسار أطول من المعلمة المحددة \ No newline at end of file diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index 9102d5ed09..afcde22646 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -3794,4 +3794,5 @@ Bow­ling­cen­ter Pistenreferenznummer Jagdbasis + Tauchzentrum \ No newline at end of file diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index cafb1faf65..694b175b14 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -3547,4 +3547,13 @@ Lon %2$s Geo-Intent \'%s\' konnte nicht analysiert werden. Systembenachrichtigung während der Navigation mit Navigationsanweisungen anzeigen. Navigations-Benachrichtigung + App-Standard (%s) + Neuberechnung deaktivieren + Minimale Entfernung zum Neuberechnen der Route + Die Route wird neu berechnet, wenn der Abstand zur Route länger ist als der angegebene Parameter + Benutzerdefiniertes Profil + Winkel: %s° + Winkel + Zusätzliches gerades Segment zwischen meinem Standort und berechneter Route wird angezeigt, bis die Route neu berechnet wird + Minimaler Winkel zwischen meinem Standort und der Route \ No newline at end of file diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index 338bb33882..b269857563 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -3523,4 +3523,8 @@ Indikas lokon: %1$s x %2$s" Antarkto Montri sisteman sciigon dum navigi montrantan instrukciojn turno-post-turno. Sciigo dum navigado + Implicita valoro (%s) + Malaktivigi rekalkulon + Minimuma distanco por rekalkuli kurson + Kurso estos rekalkulita se la distanco estos pli granda ol tiu ĉi valoro \ No newline at end of file diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml index 2b69d120a1..dcff6f8767 100644 --- a/OsmAnd/res/values-es-rAR/phrases.xml +++ b/OsmAnd/res/values-es-rAR/phrases.xml @@ -3798,4 +3798,5 @@ Galería de bolos;Bolera Número de referencia de la pista Base de caza + Centro de buceo \ 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 5e46790866..c2fe15971d 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -3542,4 +3542,8 @@ Lon %2$s Antártida Muestra la notificación del sistema durante la navegación con instrucciones de navegación. Notificación de navegación + Aplicación predefinida (%s) + Desactivar el recálculo + Distancia mínima para recalcular la ruta + La ruta será recalculada si la distancia a la ruta es mayor que el parámetro especificado \ No newline at end of file diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml index 533b63d18c..bdc36097cc 100644 --- a/OsmAnd/res/values-es-rUS/strings.xml +++ b/OsmAnd/res/values-es-rUS/strings.xml @@ -3542,4 +3542,8 @@ Lon %2$s Antártida Muestra la notificación del sistema durante la navegación con instrucciones de navegación. Notificación de navegación + Aplicación predefinida (%s) + Desactivar el recálculo + Distancia mínima para recalcular la ruta + La ruta será recalculada si la distancia a la ruta es mayor que el parámetro especificado \ No newline at end of file diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml index ae74255508..f4cc95516f 100644 --- a/OsmAnd/res/values-fa/strings.xml +++ b/OsmAnd/res/values-fa/strings.xml @@ -2794,7 +2794,7 @@ اشتراک OsmAnd Live خود را لغو کردید اشتراکتان را تجدید کنید تا از همهٔ قابلیت‌ها بهره‌مند شوید: دانلود همه - بازکردن آنلاین لینک ویکی‌پدیا + ویکی‌پدیا آنلاین پیوند در یک مرورگر باز می‌شود. نمایش توضیح کوتاه نمایش توضیح کامل @@ -3569,4 +3569,13 @@ اعلام هنگام ناوبری راهنمای ناوبری را در اعلان‌ها نمایش می‌دهد. اعلان ناوبری + پیشفرض برنامه + غیرفعال‌سازی محاسبهٔ مجدد + مسافت کمینی برای مسیریابی مجدد + اگر مسافت تا مسیر بیش از پارامتر تعیین‌شده باشد، مسیر دوباره محاسبه می‌شود + پروفایل سفارشی + زاویه: ‎%s° + زاویه + تا مسیریابی مجدد انجام شود میان موقعیت من و مسیر محاسبه‌شده یک پاره‌خط مستقیم اضافه می‌شود + کمترین زاویه میان موقعیت من و مسیر \ No newline at end of file diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 1978685660..a5b9aea3c4 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -3169,7 +3169,7 @@ représentant la zone : %1$s x %2$s Clavier WunderLINQ Parrot - Basez votre profil personnalisé sur l\'un des profils par défaut pour définir les unités de vitesse, de distance ou la visibilité des widgets. Voici les profils par défaut de l\'application ainsi que des exemples de profils personnalisés : + Basez votre profil personnel sur l\'un des profils par défaut pour définir les unités de vitesse, de distance ou la visibilité des widgets. Voici les profils par défaut de l\'application ainsi que des exemples de profils personnalisés : Prendre en compte les limitations temporaires Par défaut Relier les trous @@ -3512,4 +3512,13 @@ représentant la zone : %1$s x %2$s Antarctique Pendant la navigation, afficher une notification système avec les directions. Notification pendant la navigation + Par défaut pour l\'application (%s) + Désactiver le re-calcul + Distance à partir de laquelle recalculer l’itinéraire + L’itinéraire sera recalculé si votre éloignement de l\'itinéraire est supérieur à ce paramètre + Profil personnel + Angle : %s° + Angle + Un segment supplémentaire sera affiché entre ma position et l\'itinéraire initial jusqu\'à ce que l\'itinéraire soit recalculé + Angle minimum entre ma position et mon itinéraire \ No newline at end of file diff --git a/OsmAnd/res/values-he/strings.xml b/OsmAnd/res/values-he/strings.xml index 624c8699c8..e496fee8cd 100644 --- a/OsmAnd/res/values-he/strings.xml +++ b/OsmAnd/res/values-he/strings.xml @@ -3453,4 +3453,13 @@ נא לבחור שם לפרופיל פתיחת ההגדרות התוסף מושבת + מחיקת הנתונים שהוקלטו + העתקת נקודות ציון + תוסף זה הוא יישומון נפרד, יהיה עליך להסיר אותו בנפרד אם אין לך כוונה להשתמש בו עוד. +\n +\nהתוסף יישאר על המכשיר גם לאחר הסרת OsmAnd. + תפריט + השבתת חישוב מחדש + מרחק מזערי לחישוב המסלול מחדש + המסלול יחושב מחדש אם המרחק למסלול הוא ארוך מהמשתנה שצוין \ No newline at end of file diff --git a/OsmAnd/res/values-is/phrases.xml b/OsmAnd/res/values-is/phrases.xml index e14a286225..e18e4587a3 100644 --- a/OsmAnd/res/values-is/phrases.xml +++ b/OsmAnd/res/values-is/phrases.xml @@ -3771,4 +3771,5 @@ Viðmiðunarnúmer leiðar Grunnbúðir veiðimanna Öryggisvöruverslun + Köfunarmiðstöð \ No newline at end of file diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml index c2d6c0805a..fbb65b5c09 100644 --- a/OsmAnd/res/values-is/strings.xml +++ b/OsmAnd/res/values-is/strings.xml @@ -3516,4 +3516,48 @@ Stendur fyrir svæði: %1$s x %2$s Sérsniðinn myndgerðaðrstíll Taka með viðbótargögn Suðurskautslandið + Þetta er sjálfgefið óvirkt, ef OsmAnd keyrir í forgrunni rennur skjárinn ekki út á tíma. +\n +\nEf þetta er virkt mun OsmAnd nota tímamörk kerfisins. + • Notandasnið: núna geturðu breytt röðun, stillt táknmyndir fyrir kort, breytt öllum stillingum grunnsniða og fært þær aftur á upphaflegar stillingar +\n +\n • Bætt við númerum afreina í leiðsögn +\n +\n • Endurhönnun á stillingum viðbótar +\n +\n • Endurhönnun á stillingaskjánum fyrir flýtiaðgengi að öllum sniðum +\n +\n • Bætt við valkosti til að afrita stillingar úr öðrum sniðum +\n +\n • Nú er hægt að breyta röðun eða fela flokka merkisstaða í leit +\n +\n • Rétt hliðjöfnun táknmynda merkisstaða á kortinu +\n +\n • Gögnum fyrir sólarupprás/sólsetur bætt við kortastillingar +\n +\n • Táknmyndum fyrir Heima/Vinna bætt við kortið +\n +\n • Bætt við stuðningi við margar línur á lýsingum stillinga +\n +\n • Bætt við réttum umritunum á kort af Japan +\n +\n • Bætt við korti fyrir Suðurskautslandið +\n +\n + Þessi viðbót er sérstakt forrit, þú þarft að fjarlægja það sérstaklega ef þú ætlar þér ekki að nota það. +\n +\nViðbótin helst áfram uppsett á tækinu þó þú fjarlægir OsmAnd. + Innflutta sniðið inniheldur viðbótargögn. Smelltu á að flytja inn til að sækja aðeins gögn sniðsins eða veldu þau viðbótargögn sem ætti að flytja inn. + Hægt er að velja viðbótargögn til útflutnings með sniðinu. + Birta kerfistilkynningu með leiðbeiningum á meðan leiðsögn stendur. + Tilkynning við leiðsögn + Sjálfgefið fyrir forrit (%s) + Gera endurútreikning óvirkan + Lágmarksvegalengd til að leið sé endurreiknuð + Leiðin verður endurreiknuð ef vegalengd að leiðinni er lengri en uppgefið viðfang + Sérsniðið notandasnið + Horn: %s° + Horn + Aukalegur beinn bútur á milli staðsetningar minnar og reiknaðrar leiðar verður sýndur þar til leiðin hefur verið endurreiknuð + Lágmarkshorn milli staðsetningar og leiðar \ No newline at end of file diff --git a/OsmAnd/res/values-it/phrases.xml b/OsmAnd/res/values-it/phrases.xml index 61b5462356..fed39191fb 100644 --- a/OsmAnd/res/values-it/phrases.xml +++ b/OsmAnd/res/values-it/phrases.xml @@ -2710,4 +2710,8 @@ URL Tipo Stato + Reddit + Rubinetto + Decollo + Atterraggio \ No newline at end of file diff --git a/OsmAnd/res/values-it/strings.xml b/OsmAnd/res/values-it/strings.xml index 389bbe618e..e1bd81d19b 100644 --- a/OsmAnd/res/values-it/strings.xml +++ b/OsmAnd/res/values-it/strings.xml @@ -3522,4 +3522,15 @@ Rappresenta l\'area: %1$s x %2$s \n" Copia le coordinate Ordina per categoria + Dai un nome a questo profilo + Apri le impostazioni + Plugin disabilitato + Questo plugin è stato aggiunto tramite un\' applicazione separata. Se non vuoi più utilizzarlo, rimuovi l\' applicazione separatamente. +\n +\nSe rimuovi OsmAnd, il plugin resterà sul dispositivo. + Menu + %1$s — %2$s — %3$s + Disattiva ricalcolo percorso + Distanza minima per il ricalcolo del percorso + Il percorso viene ricalcolato quando la distanza dal percorso è maggiore di quella specificata \ No newline at end of file diff --git a/OsmAnd/res/values-ja/strings.xml b/OsmAnd/res/values-ja/strings.xml index b6dcbc5547..dd9c0209fb 100644 --- a/OsmAnd/res/values-ja/strings.xml +++ b/OsmAnd/res/values-ja/strings.xml @@ -2569,7 +2569,7 @@ POIの更新は利用できません アクティブマーカーまでの距離を示す情報をどこに表示するか選択してください。 マーカーの方向と距離を示すインジケーターの数を選択してください。 お気に入り地点のカテゴリー - 任意の場所をロングまたはショートタップで指定後、旗のボタンでマーカーを作成します。 + 任意の場所をロングタップなどで指定後、旗のボタンでマーカーをつけられます。 経路データ内の経由地点 通過済みも表示 通過済みは非表示 diff --git a/OsmAnd/res/values-pl/phrases.xml b/OsmAnd/res/values-pl/phrases.xml index 819bce2415..0c73a7392d 100644 --- a/OsmAnd/res/values-pl/phrases.xml +++ b/OsmAnd/res/values-pl/phrases.xml @@ -64,7 +64,7 @@ Instrumenty muzyczne Kiosk gazetowy Optyk - Żywność ekologiczna + Produkty ekologiczne Artykuły wyposażenia zewnętrznego Farby Sklep zoologiczny @@ -3784,4 +3784,10 @@ Duch roweru Wulkan błotny Paintball + Błotny + Sklep BHP + Kręgielnia + Numer referencyjny stoku + Ambona łowiecka + Centrum nurkowania \ No newline at end of file diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index 7e1317eeb4..3b163a15b6 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -375,7 +375,7 @@ Wyszukiwanie offline Wyszukiwanie online Maks. zoom online - Nie przeglądaj kafelków mapy online powyżej tego poziomu przybliżenia. + Nie przeglądaj map online powyżej tego poziomu przybliżenia. Całkowita odległość %1$s, czas podróży %2$d h %3$d min. Usługa nawigacji online lub offline. Usługa nawigacyjna @@ -443,7 +443,7 @@ Automatyczne rejestrowanie śladu podczas nawigacji Uaktualnij mapę Wczytaj ponownie kafelki - Wprowadza dane uwierzytelniające wymagane do wysyłania zmian na openstreetmap.org. + Potrzebny do zgłaszania do openstreetmap.org. Nazwa użytkownika OSM Cel Dodaj do ulubionych @@ -460,7 +460,7 @@ Widok 3D mapy Wyświetl ostatnio wybrane użyteczne miejsca. Wyświetlanie użytecznych miejsc - Proszę wybrać zasób map kafelkowych online lub offline + Wybierz zasób map kafelkowych online lub offline. Zasób mapy kafelkowej Zasób mapy Używanie połączenia internetowego @@ -485,7 +485,7 @@ Pieszo Centralnie Na dole - Proszę wprowadzić szerokość i długość geograficzną w wybranym formacie (D - stopnie, M - minuty, S - sekundy) + Wprowadź szerokość i długość geograficzną w wybranym formacie (D - stopnie, M - minuty, S - sekundy) Szerokość Długość DDD.DDDDD @@ -640,7 +640,7 @@ Usuń edycję Asynchroniczna edycja OSM: Użyteczne miejsca/uwagi OSM zapisane na urządzeniu - Wyświetla i zarządza użytecznymi miejscami i uwagami OSM zapisanymi w bazie danych urządzenia. + Wyświetla i zarządza użytecznymi miejscami i uwagami OSM w bazie danych urządzenia. Określ interwał monitorowania online. Częstość wysyłania danych Określa adres usługi internetowej przy użyciu następujących parametrów: szerokość={0}, długość={1}, znacznik czasu={2}, hdop={3}, wysokość={4}, prędkość={5}, kierunek={6}. @@ -777,26 +777,26 @@ Wyświetlanie ostrzeżeń… Konfiguruje ostrzeżenia ruchu drogowego (ograniczenia prędkości, znaki \"stop\", progi zwalniające, tunele), ostrzeżenia o fotoradarach i informacje o pasach ruchu. Mapy dla całego świata i nawigacja działająca w oparciu o stacjonarne jak i sieciowe mapy OSM - OsmAnd (OSM Automatyczne Nawigowanie Do celu) + OsmAnd (OSM Automatyczne Nawigowanie Do celu) \n -\nOsmAnd jest otwarto-źródłowym programem do nawigacji z dostępem do szerokiej gamy globalnych map OpenStreetMap (OSM). Wszystkie dane map (wektorowe lub kafelkowe) mogą być przechowywane na karcie pamięci telefonu do użytku offline. OsmAnd oferuje również nawigację w trybie offline i online zawierającą zapowiedzi głosowe. +\nOsmAnd jest otwarto-źródłowym programem do nawigacji z dostępem do szerokiej gamy globalnych map (OSM). Wszystkie dane map (wektorowe lub kafelkowe) mogą być przechowywane na karcie pamięci telefonu do użytku offline. OsmAnd oferuje również nawigację w trybie offline i online zawierającą zapowiedzi głosowe. \n -\n Niektóre z podstawowych funkcji: -\n - Funkcjonowanie w trybie offline (przechowuje pobrane mapy wektorowe lub kafelkowe w pamięci urządzenia) -\n - Dostępne kompaktowe mapy w trybie offline dla całego świata -\n - Pobieranie map kraju lub regionu bezpośrednio z aplikacji -\n - Możliwość nakładania kilku warstw map, takich jak GPX lub tras nawigacji, ciekawych miejsc, ulubionych, poziomic, przystanków komunikacji miejskiej, dodatkowych map z konfigurowalną przejrzystością -\n - Wyszukiwanie offline adresów i Użytecznych Miejsc (UM) -\n - Wyznaczanie w trybie offline tras na średnich dystansach -\n - Tryby samochodowy, rowerowy i pieszy z opcjonalnym: -\n - automatycznym przełączaniem widoku dzień/noc -\n - skalowaniem map w zależności od prędkości -\n - obracaniem map według kompasu lub kierunku ruchu -\n - wyświetlaniem wskazywania pasów, ograniczeń prędkości, głosami nagranymi i syntetyzowanymi (TTS) +\n Niektóre z podstawowych funkcji: +\n - Funkcjonowanie w trybie offline (przechowuje pobrane mapy wektorowe lub kafelkowe w pamięci urządzenia) +\n - Dostępne kompaktowe mapy w trybie offline dla całego świata +\n - Pobieranie map kraju lub regionu bezpośrednio z aplikacji +\n - Możliwość nakładania kilku warstw map, takich jak GPX lub tras nawigacji, ciekawych miejsc, ulubionych, poziomic, przystanków komunikacji miejskiej, dodatkowych map z konfigurowalną przejrzystością +\n - Wyszukiwanie offline adresów i Użytecznych Miejsc (UM) +\n - Wyznaczanie w trybie offline tras na średnich dystansach +\n - Tryby samochodowy, rowerowy i pieszy z opcjonalnym: +\n - automatycznym przełączaniem widoku dzień/noc +\n - skalowaniem map w zależności od prędkości +\n - obracaniem map według kompasu lub kierunku ruchu +\n - wyświetlaniem wskazywania pasów, ograniczeń prędkości, głosami nagranymi i syntetyzowanymi (TTS) \n -\n Ograniczenia w tej bezpłatnej wersji OsmAnd: -\n - Limitowana liczba pobrań mapy -\n - Brak dostępu do Użytecznych Miejsc z Wikipedii w trybie offline +\n Ograniczenia w tej bezpłatnej wersji OsmAnd: +\n - Limitowana liczba pobrań mapy +\n - Brak dostępu do Użytecznych Miejsc z Wikipedii w trybie offline \n \nOsmAnd jest aktywnie rozwijany i dalszy rozwój jest uzależniony od wkładu pieniężnego na finansowanie rozwoju i testowania nowych funkcjonalności. Proszę rozważyć zakup OsmAnd+, lub finansowanie konkretnych nowych funkcji lub dokonania ogólnej darowizny na https://osmand.net. OsmAnd to aplikacja open source do nawigacji obsługująca mapy offline i online @@ -835,7 +835,7 @@ Zwiedzanie OsmAnd+ (OSM Automated Navigation Directions) \n -\nOsmAnd+ jest otwarto-źródłowym programem do nawigacji z dostępem do szerokiej gamy globalnych map OpenStreetMap (OSM). Wszystkie dane map (wektorowe lub kafelkowe) mogą być przechowywane na karcie pamięci telefonu do użycia bez połączenia z siecią. OsmAnd umożliwia również wyznaczanie tras oraz nawigowanie zarówno w trybie stacjonarnym jak i sieciowym z komunikatami głosowymi. +\nOsmAnd+ jest otwarto-źródłowym programem do nawigacji z dostępem do szerokiej gamy globalnych map OSM. Wszystkie dane map (wektorowe lub kafelkowe) mogą być przechowywane na karcie pamięci telefonu do użycia bez połączenia z siecią. OsmAnd umożliwia również wyznaczanie tras oraz nawigowanie zarówno w trybie stacjonarnym jak i sieciowym z komunikatami głosowymi. \n \nOsmAnd + to płatna wersja aplikacji, kupując ją wspierasz projekt, finansujesz rozwój nowych funkcji i otrzymujesz najnowsze aktualizacje. \n @@ -925,14 +925,14 @@ Notatki audio/video Wtyczka OsmAnd do rysowania poziomic offline Pomiar odległości - Wtyczka Dropbox umożliwia synchronizację ścieżek i notatek audio/wideo z kontem Dropbox. + Synchronizacja ścieżek i notatek audio/wideo z kontem Dropbox. Wtyczka Dropbox Zmień kolejność Rozważ zakup wtyczki dodającej poziomice, aby wspomóc dalszy rozwój. Wtyczka poziomic Nagraj notatkę audio Nagraj notatkę wideo - Dostarcza warstwy poziomic i cieniowania rzeźby terenu wyświetlanych na standardowych mapach OsmAnd. Funkcja przydatna dla sportowców, turystów i osób zainteresowanych strukturą reliefową krajobrazu. + Dostarcza warstwy poziomic i cieniowania rzeźby terenu wyświetlanych na standardowych mapach OsmAnd. Funkcja przydatna dla sportowców, turystów i osób zainteresowanych strukturą reliefową krajobrazu. \n \nŚwiatowe dane (między 70° szerokości północnej a 70° szerokości południowej) opierają się na pomiarach SRTM (Shuttle Radar Topography Mission) i ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), przyrządu na pokładzie Terra, flagowego satelity Systemu Obserwacji Ziemi NASA. ASTER jest wspólnym przedsięwzięciem NASA, japońskiego Ministerstwa Gospodarki, Handlu i Przemysłu (METI) i Japońskich Systemów Kosmicznych (J-spacesystems). Wyświetlanie @@ -1042,7 +1042,7 @@ Ostrzeżenia o ruchu Hasło OSM (opcjonalne) Zapowiadanie… - Konfiguruje zapowiadanie nazw ulic, ostrzeżeń o ruchu (przymusowe przystanki, progi zwalniające), fotoradarów, ograniczeń prędkości. + Konfiguruje zapowiadanie nazw ulic, ostrzeżeń o ruchu (przymusowe przystanki, progi zwalniające), fotoradarów i ograniczeń prędkości. Nazwy ulic (syntezowane) Japonia Stany Zjednoczone @@ -1317,7 +1317,7 @@ Rejestrowanie śladu GPX Ogólne rejestrowanie pozycji do pliku GPX można włączyć lub wyłączyć za pomocą widgetu rejestrowania GPX na mapie. Częstość rejestrowania - Aktywuje funkcje rejestrowania i zapisywania śladów za pomocą widżetu rejestrowania śladów GPX na mapie lub automatyczne rejestruje przebiegi wszystkich tras do plików GPX. + Aktywuje funkcje rejestrowania i zapisywania śladów za pomocą widżetu rejestrowania śladów GPX na mapie lub automatyczne rejestruje przebiegi wszystkich tras do plików GPX. \n \nZarejestrowane ślady można udostępnić znajomym lub wykorzystać na rzecz rozwoju mapy OpenStreetMap. Sportowcy mogą korzystać ze śladów do monitorowania treningów. W tym celu OsmAnd udostępnia podstawowe informacje takie jak czasy okrążeń, średnia prędkość itp. Ślady mogą być później analizowane w specjalnych narzędziach do analizy przygotowanych przez innych dostawców oprogramowania. Ponawianie pytania @@ -1421,7 +1421,7 @@ Położenie: Szer. %1$s Dł. %2$s - Notatki OSM + Notatki A/V Mapa online Tylko drogi Wolne %1$s @@ -2036,7 +2036,7 @@ Długość %2$s Wyczyść wszystkie kafelki Opłata za subskrypcję na miesiąc. Anuluj ją w Google Play w dowolnym momencie. Darowizna na rzecz społeczności OSM - Część z dotacji jest przekazywana użytkownikom OSM, którzy wprowadzają zmiany na mapie OpenStreetMap. Koszt subskrypcji pozostaje taki sam. + Część z dotacji jest przekazywana darczyńcom OSM. Koszt subskrypcji pozostaje taki sam. Subskrypcje pozwalają na cogodzinne, codzienne i cotygodniowe uaktualnienia i nieograniczone liczbą pobieranie map całego świata. Australia Kabylski @@ -2416,11 +2416,11 @@ Reprezentuje obszar: %1$s x %2$s Wyświetlanie na mapie Zakończyć bez zapisywania? Wyłączenie animacji - Wyłącza animacje w aplikacji. + Wyłącza animacje mapy. Przenieś wszystkie do historii Wskaźnik odległości Kolejność sortowania - Proszę wybrać w jaki sposób wskazywać odległość i kierunek do znaczników mapy na ekranie: + Wybierz w jaki sposób wskazywać odległość i kierunek do znaczników mapy: Próg zmiany orientacji mapy Wybiera prędkość, poniżej której orientacja mapy zmieni się z „względem kierunku ruchu” na „względem kompasu”. Wszystkie znaczniki mapy przeniesiono do historii @@ -2543,7 +2543,7 @@ Reprezentuje obszar: %1$s x %2$s Wyświetl zamknięte uwagi Pokaż/ukryj uwagi OSM na mapie. GPX - odpowiedni do eksportowania danych do JOSM i innych edytorów OSM. - OSC - odpowiedni do eksportowania danych do OpenStreetMap. + OSC - odpowiedni do eksportowania danych do OSM. Plik GPX Plik OSC Wybierz typ pliku @@ -2587,7 +2587,7 @@ Reprezentuje obszar: %1$s x %2$s Najpierw najdalsze Najpierw najbliższe zamknięte - Wybierz rodzaj eksportu: uwagi OSM, POI lub oba. + Eksportuj jako uwagi OSM, POI lub oba. Twórz lub modyfikuj OSM POI, otwórz lub skomentuj notatki OSM, oraz udostępniaj nagrane pliki GPX. Importuj ulubione grupy lub punkty trasy jako znaczniki. Sporty spływowe @@ -2772,7 +2772,7 @@ Reprezentuje obszar: %1$s x %2$s Brak wyników wyszukiwania\? \nPrześlij opinię Zatwierdzanie drogi… - OsmAnd+ (Automatyczna nawigacja OSM) to aplikacja do map i nawigacji z dostępem do darmowych, światowych i wysokiej jakości danych OpenStreetMap (OSM). + OsmAnd+ (Automatyczna nawigacja OSM) to aplikacja do map i nawigacji z dostępem do darmowych, światowych i wysokiej jakości danych OSM. \nCiesz się nawigacją głosową i optyczną, przeglądaniem POI (punktów użyteczności publicznej), tworzeniem ścieżek GPX i zarządzaniem nimi, z wykorzystaniem wizualizacji linii konturu i wysokości, wyboru między trybem jazdy samochodem, jazdy na rowerze, poruszania się pieszo, edycji OSM i wielu innych. \n \nOsmAnd+ to płatna wersja aplikacji. Kupując ją, wspierasz projekt, finansujesz rozwój nowych funkcji i otrzymujesz najnowsze aktualizacje. @@ -2861,7 +2861,7 @@ Reprezentuje obszar: %1$s x %2$s Odnawia się co roku %1$.2f %2$s Termin płatności: - Darowizny pomagają finansować kartografię OpenStreetMap. + Darowizny pomagają finansować kartografię OSM. Obsługiwane przez OsmAnd Subskrypcje Wyświetlaj tylko obrazy 360° @@ -3087,7 +3087,7 @@ Reprezentuje obszar: %1$s x %2$s Samochód, ciężarówka, motocykl Rower górski, motorower, koń Spacer, wędrówka piesza, bieganie - Wszystkie rodzaje transportu publicznego + Rodzaje transportu publicznego Statek, wioślarstwo, żeglarstwo Samolot, szybownictwo Geokodowanie @@ -3288,8 +3288,8 @@ Reprezentuje obszar: %1$s x %2$s Wprowadza ścieżkę do katalogu z danymi OsmAnd Zmienić katalog danych OsmAnd\? Przenieś do nowej lokalizacji - Wewnętrzna pamięć, ukryta przed użytkownikiem i innymi aplikacjami, do której dostęp ma tylko OsmAnd - Wybór katalogu przechowywania danych + Wewnętrzna pamięć dla OsmAnd (ukryta przed użytkownikami i innymi aplikacjami). + Wybór katalogu przechowywania Park terenowy Sanie Sanki @@ -3355,7 +3355,7 @@ Reprezentuje obszar: %1$s x %2$s \n • Inne poprawki błędów \n \n - Można wprowadzić tę zmianę we wszystkich profilach lub tylko w obecnie wybranym. + Można wprowadzić tę zmianę tylko w obecnie wybranym profilu. Preferowanie nieutwardzonych dróg Preferuje drogi nieutwardzone. Zmiany OSM @@ -3367,21 +3367,21 @@ Reprezentuje obszar: %1$s x %2$s Ukryj cieniowanie terenu Przełącz widoczność cieniowania terenu Przełącza wyświetlanie cieniowania terenu na mapie. - Nie można uruchomić mechanizmu zamiany tekstu na mowę + Nie można uruchomić mechanizmu zamiany tekstu na mowę. Wspólne Symuluje położenie używając zarejestrowanego śladu GPX. Eksportuj profil Profil OsmAnd: %1$s - Profil „%1$s” już istnieje. Zastąpić go\? + „%1$s” już istnieje. Zastąpić go\? Nie udało się wyeksportować profilu. Import profilu - Aby zaimportować profil, proszę otworzyć plik na urządzeniu za pomocą OsmAnd. + Dodaj profil otwierając jego plik w OsmAnd. Błąd importowania %1$s: %2$s Zaimportowano %1$s. Biały Zamień %1$s i %2$s Początek trasy - Służy do szacowania czasu przyjazdu dla nieznanego rodzaju dróg i ograniczenia prędkości na wszystkich drogach (może zmienić trasę) + Szacuje czas przyjazdu dla nieznanego rodzaju dróg i ograniczenia prędkości na wszystkich drogach (może zmienić trasę) Odwróć początek i cel Zapisano ślad Nazwa pliku jest pusta @@ -3393,11 +3393,11 @@ Reprezentuje obszar: %1$s x %2$s Sugerowane mapy Te mapy są wymagane do użycia z wtyczką Dodano profile - Wtyczka dodaje nowy profil do programu + Profile dodane przez wtyczkę Wyłącz Dodano nową wtyczkę - Kontroluj wyskakujące okienka, okna dialogowe i powiadomienia, które OsmAnd pokazuje podczas użytkowania. - Dołącz segmenty + Kontroluj wyskakujące okienka, okna dialogowe i powiadomienia. + Połącz segmenty Sieci węzłów Dodać nowy profil \'%1$s\'\? Dołącz kierunek @@ -3406,24 +3406,24 @@ Reprezentuje obszar: %1$s x %2$s %1$s, %2$s Osobiste Pobieranie %s - Dla pustyń i innych słabo zaludnionych obszarów. - Pokaż trasy cyklu sieci węzłów + Dla pustyń i innych słabo zaludnionych obszarów. Bardziej szczegółowa. + Pokaż punkt sieci tras rowerowych Gruby - Wybierz ikonę nawigacji + Ikona położenia podczas ruchu Wybierz ikonę mapy Po dotknięciu Zastosuj usunięte profile zostaną całkowicie utracone. Główny profil Wybierz kolor - Nie możesz usunąć domyślnych profili OsmAnd, ale możesz je wyłączyć na poprzednim ekranie lub przenieść na dół. + Nie można usunąć domyślnych profili OsmAnd, ale można je wyłączyć (na poprzednim ekranie) lub przenieść na dół. Edytuj profile - Typ nawigacji wpływa na zasady obliczania trasy. + \"Typ nawigacji\" określa jak obliczane są trasy. Wygląd profilu - Wybierz ikonę, kolor i nazwę + Ikona, kolor i nazwa Edytuj listę profili - Wybierz profil + Wybrany profil Stuknięcie %1$s spowoduje utratę wszystkich zmian. Wszystkie ustawienia profilu zostaną przywrócone do stanu po instalacji. - Czy zresetować wszystkie ustawienia profilu do wartości domyślnych\? + Zresetować wszystkie ustawienia profilu\? %1$s: %2$s Oceń %1$s %2$s @@ -3517,4 +3517,19 @@ Reprezentuje obszar: %1$s x %2$s Uwzględnij dodatkowe dane Zaimportowany profil zawiera dodatkowe dane. Kliknij przycisk Importuj, aby zaimportować tylko dane profilu lub wybierz dodatkowe dane do zaimportowania. Możesz wybrać dodatkowe dane do wyeksportowania wraz z profilem. + Bezpośrednio do punktu + Pokaż powiadomienia systemowe podczas nawigacji z instrukcjami nawigacji. + Powiadomienie nawigacyjne + Aplikacja domyślna (%s) + Wyłącz ponowne obliczanie + Minimalna odległość do ponownego obliczenia trasy + Trasa zostanie ponownie obliczona, jeśli odległość trasy jest dłuższa niż określony parametr + Twoje nagrane ślady są w %1$s lub w folderze OsmAnd. + Domyślnie wyłączone, jeśli OsmAnd jest włączony na pierwszym planie, ekran nie będzie się wygaszał. +\n +\nJeśli włączone, OsmAnd będzie używał systemowych ustawień wygaszania. + Sortuj wg kategorii + Menu + Wyznaczanie trasy + Antarktyda \ No newline at end of file diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index 8cc94ffa4e..2ecdc59a74 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -3527,4 +3527,10 @@ Pôr do Sol: %2$s O perfil importado contém dados adicionais. Clique em Importar para importar apenas dados do perfil ou selecione dados adicionais a serem importados. Você pode selecionar dados adicionais para exportar junto com o perfil. Antártida + Mostrar notificação do sistema durante a navegação com instruções de navegação. + Notificação de navegação + Aplicativo padrão (%s) + Desativar recálculo + Distância mínima para recalcular a rota + A rota será recalculada se a distância até a rota for maior que o parâmetro especificado \ No newline at end of file diff --git a/OsmAnd/res/values-sc/phrases.xml b/OsmAnd/res/values-sc/phrases.xml index 7cda235800..4e3c1007e0 100644 --- a/OsmAnd/res/values-sc/phrases.xml +++ b/OsmAnd/res/values-sc/phrases.xml @@ -787,7 +787,7 @@ Fràigu de mèdios de trasportu Tzilleri (cafè) Ghennas - Artìculos pro immersiones + Artìculos pro imbèrghidas in s\'abba Cummèrtziu de energia Butega de profumos Ponte de perdas @@ -3789,4 +3789,5 @@ Tzentru pro su bowling Nùmeru de referèntzia de sa pista Base pro sa cassa + Tzentru pro sas imbèrghidas in s\'abba \ No newline at end of file diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml index 13a3acdf95..26a3a09fcb 100644 --- a/OsmAnd/res/values-sc/strings.xml +++ b/OsmAnd/res/values-sc/strings.xml @@ -3540,4 +3540,8 @@ Pro praghere iscrie su còdighe intreu Antàrticu Ammustra notìficas de sistema durante sa navigatzione cun istrutziones de navigatzione. Notìfica de navigatzione + Predefinidu in s\'aplicatzione (%s) + Disabìlita su ri-càlculu de s\'àndala + Distàntzia mìnima pro torrare a calculare s\'àndala + S\'àndala at a bènnere calculada torra si sa distàntzia dae s\'àndala est prus manna de cussa dislindada \ No newline at end of file diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 1dc8be3c72..1ce8224d2d 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -3497,4 +3497,13 @@ Antarktika Navigasyon talimatları ile navigasyon sırasında sistem bildirimini göster. Navigasyon bildirimi + Uygulama Varsayılanı (%s) + Yeniden hesaplamayı devre dışı bırak + Rotayı yeniden hesaplamak için minimum mesafe + Rotaya olan mesafe belirtilen parametreden daha uzunsa rota yeniden hesaplanacak + Özel profil + Açı: %s° + Açı + Konumum ve hesaplanan rota arasındaki ekstra düz segment, rota yeniden hesaplanıncaya kadar görüntülenecek + Konumum ve rota arasındaki minimum açı \ No newline at end of file diff --git a/OsmAnd/res/values-uk/phrases.xml b/OsmAnd/res/values-uk/phrases.xml index 3530a173f9..fefbaa8d09 100644 --- a/OsmAnd/res/values-uk/phrases.xml +++ b/OsmAnd/res/values-uk/phrases.xml @@ -18,18 +18,18 @@ Молочний магазин Торговий автомат Книжковий магазин - Магазин велосипедів - Магазин аніме + Крамниця велосипедів + Крамниця аніме Антикваріат Витвори мистецтва Товари для дітей Сумки, валізи Все для ванної кімнати - Магазин постільної білизни + Крамниця постільної білизни Бутік - Магазин килимових покриттів + Крамниця килимових покриттів Аптека - Магазин одягу + Крамниця одягу Дитячий одяг Взуття Комп’ютерний магазин @@ -46,7 +46,7 @@ Меблі Сад та город Зріджений газ - Магазин + Крамниця Подарунки та сувеніри Вікна, скло Будівельний магазин @@ -109,7 +109,7 @@ Шлагбаум Збирання плати за проїзд Прикордонний контроль - Магазин (невизначеного типу) + Крамниця (невизначеного типу) Аварійні служби Транспортування Споруди @@ -155,18 +155,18 @@ Штучна дорожня нерівність Штучна дорожня нерівність «лежачий поліцейський» Шикана - Магазин шкіри, галантарея + Крамниця шкіри, галантарея Музичний магазин - Магазин для плавання з масками - Магазин автомобільних шин - Магазин годинників - Магазин речей для басейну + Крамниця для плавання з масками + Крамниця автомобільних шин + Крамниця годинників + Крамниця речей для басейну Ігри Іграшкові моделі Нагороди, призи Комп’ютерні ігри Піротехніка - Магазин зброї + Крамниця зброї Штучна дорожня нерівність «берлінська подушка» Шумові полоси Підвищений пішохідний перехід @@ -217,17 +217,17 @@ Залізничний вокзал Залізнична платформа Транспортна будівля - Магазин сирів - Магазин шоколаду - Магазин кави - Магазин пасти + Крамниця сирів + Крамниця шоколаду + Крамниця кави + Крамниця пасти Кондитерський магазин Камери та лінзи - Магазин свічок + Крамниця свічок Модний одяг - Магазин для стрибків з парашутом + Крамниця для стрибків з парашутом Магазин обігрівачів - Магазин садових меблів + Крамниця садових меблів Біогаз Залізнична зупинка Вхід в метро @@ -256,7 +256,7 @@ Енергетичний магазин Паливо 1:50 Двері - Магазин парфумерії + Крамниця парфумерії Маяк Туристичні маршрути Контроль ПДР @@ -518,50 +518,50 @@ Швидке харчування Пекарня Вид палива - Тип авіаційного палива - Тип оплати + Вид авіаційного палива + Вид оплати Паливні картки - Тип доступу в Інтернет + Вид доступу в Інтернет У продажу Велосипедні послуги - Тип одягу - Тип взуття - Тип + Вид одягу + Вид взуття + Вид Розміщення Джерело води - Тип оплати + Вид оплати Звуковий сигнал - Тип + Вид Тактильне покриття Послуги Безконтактна Самообслуговування Автоматизація - Тип + Вид Укриття Станція метро Вантаж, що перевозиться - Тип + Вид Провезення велосипедів Обігрів Насос Призначення - Тип - Тип + Вид + Вид Вид Столиця Продаж ліків за рецептами Спеціалізація - Тип + Вид Число зірок Релігія Релігійне спрямування - Тип + Вид Зміст Додатково Табір скаутів Місце для табору на природі без зручностей - Тип + Вид Складність траси Обслуговування траси Жанр @@ -575,9 +575,9 @@ Коктейлі Власна пивоварня Послуги - Тип + Вид Приймаємі відходи - Тип + Вид Місце для розведення вогню Сезонність Характеристика води @@ -593,8 +593,8 @@ Медична система Виїзд на будинок Страви - Тип оплати (транспорт) - Тип + Вид оплати (транспорт) + Вид Цільова соціальна група Підкачка шин Порохотяг @@ -994,7 +994,7 @@ Річка Струмок, потік Пороги - Окремостоячий камінь + Осібний камінь Мис Пляж Затока, бухта @@ -1534,13 +1534,13 @@ Історичний період: темні століття (Греція) (1100 - 800 до н.е.) Могул Історичний період: Римська Греція (146 р. до н.е. - 330 р. н.е.) - Тип саду: житловий + Вид саду: житловий Історичний період: Римське царство (753 - 509 до н.е.) - Тип саду: громадський + Вид саду: громадський Історичний період: домінантний - Тип саду: приватний + Вид саду: приватний Історичний період: землеробський (період I і II, 1580 р. до н.е. - 133 р. н.е.) - Тип саду: ботанічний + Вид саду: ботанічний Історичний період: міський (період III, 133 - 374 р. н.е.) Історичний період: класичний (період IV, 374 - 900 р. н.е.) Стиль саду: кухня @@ -1556,9 +1556,9 @@ Місткість Історичний камінь Так - Тип: хрест примирення + Вид: хрест примирення Без спеціальних місць для людей з обмеженими можливостями - Тип: герб + Вид: герб Спеціальні місця для людей з обмеженими можливостями Матеріал: деревина Спеціальні місця для жінок @@ -1582,21 +1582,21 @@ Петрогліф Середній час подорожі (в хвилинах) Земляне укріплення - Тип мегаліту: менгір + Вид мегаліту: менгір Скління - Тип мегаліту: дольмен + Вид мегаліту: дольмен Немає скління - Тип мегаліту: нураги + Вид мегаліту: нураги Так - Тип мегаліту: кам\'яне коло - Тип мегаліту: коридорна могила + Вид мегаліту: кам\'яне коло + Вид мегаліту: коридорна могила Без обігріву - Тип зміцнення: городище + Вид зміцнення: городище Дозволено - Тип зміцнення: лімес (укріплений кордон) - Тип зміцнення: шанець + Вид зміцнення: лімес (укріплений кордон) + Вид зміцнення: шанець Провезення велосипедів заборонене - Тип зміцнення: рондела (кільцева канава) + Вид зміцнення: рондела (кільцева канава) Лише влітку Па (укріплене поселення маорі) Лише вхід @@ -1616,28 +1616,28 @@ 1S (покращений туристичний клас) Скульптор 2 (стандартний клас) - Тип будівлі: церква + Вид будівлі: церква 2S (покращений стандартний клас) - Тип будівлі: каплиця + Вид будівлі: каплиця 3 (комфортний клас) - Тип будівлі: мечеть + Вид будівлі: мечеть 3S (покращений комфортний клас) - Тип будівлі: храм + Вид будівлі: храм 4 (перший клас) 4S (покращений перший клас) - Тип будівлі: собор + Вид будівлі: собор Солярій 5 (категорія люкс) - Тип будівлі: монастир + Вид будівлі: монастир Асенізаційна зливна станція 5S (категорія люкс+) - Тип будівлі: базиліка + Вид будівлі: базиліка Західна Кількість номерів - Тип будівлі: синагога + Вид будівлі: синагога Традиційна китайська Любовний готель - Тип будівлі: святиня + Вид будівлі: святиня Аюрведа Монети Хрест @@ -1649,19 +1649,19 @@ Колишній тюремний табір Традиційна тибетська Монети по 50c, 1€ й 2€ - Тип: концентраційний табір + Вид: концентраційний табір Традиційна тамільська Телефонні карти - Тип: для військовополонених + Вид: для військовополонених Традиційна греко-ісламська Телефонні картки не приймаються - Тип: виправно-трудовий + Вид: виправно-трудовий Медичні послуги: догляд: є Кредитні картки - Тип: нацистський + Вид: нацистський Медичні послуги: догляд: немає Кредитні картки не приймаються - Тип: гулаг + Вид: гулаг Медичні послуги: консультація: є Банкноти Температура @@ -1708,29 +1708,29 @@ Творчий простір (хакерспейс) Платіжні картки Ремонт електроніки - Тип медустанови: польовий госпіталь + Вид медустанови: польовий госпіталь Платіжні картки не приймаються - Магазин феєрверків - Тип медустанови: центр психологічного консультування + Крамниця феєрверків + Вид медустанови: центр психологічного консультування Картки Maestro Протяжність - Тип медустанови: медична лабораторія + Вид медустанови: медична лабораторія Картки Maestro не приймаються Сімейна медицина - Тип медустанови: терапія + Вид медустанови: терапія American Express (AMEX) Офтальмологія - Тип медустанови: відділення + Вид медустанови: відділення Гінекологія - Тип медустанови: видача лікарських засобів + Вид медустанови: видача лікарських засобів Картки American Express (AMEX) не приймаються Внутрішні хвороби - Тип медустанови: станція першої допомоги + Вид медустанови: станція першої допомоги Diners Club Ортопедія - Тип медустанови: будинок престарілих (хоспіс) + Вид медустанови: будинок престарілих (хоспіс) Отоларингологія (ЛОР) - Тип медустанови: зустрічі груп підтримки + Вид медустанови: зустрічі груп підтримки Картки Diners Club не приймаються Педіатрія Точка забору води @@ -1868,10 +1868,10 @@ Максимальне число наметів Підземний Quick - Тип укриття: намет + Вид укриття: намет Максимальне число автопричепів Дизайн гідранта: wsh - Тип укриття: занедбане + Вид укриття: занедбане Вхід з собаками дозволений Основний Карти Quick не приймаються @@ -1889,101 +1889,101 @@ Групове проживання Цистерна E‑ZPass - Тип доступу в Інтернет: службовий + Вид доступу в Інтернет: службовий Пандус: немає Використовується: так Немає доступу в Інтернет Пандус для інвалідних візків: так - Тип шафи: електрична + Вид шафи: електрична E-ZPass не приймаються З доступом в Інтернет Пандус для інвалідних візків: немає - Тип шафи: телекомунікації + Вид шафи: телекомунікації Euroshell Максимальна ширина Пандус (подвійний): є - Тип шафи: кабельне ТБ + Вид шафи: кабельне ТБ Код IATA Пандус (подвійний): відсутній - Тип шафи: газ + Вид шафи: газ Паливні картки Euroshell не приймаються Код ICAO Пандус для велосипедів: так - Тип шафи: поштова служба + Вид шафи: поштова служба KITCard Код FAA - Тип шафи: сміття + Вид шафи: сміття Пандус для велосипедів: немає - Тип: скульптура - Тип шафи: управління водними ресурсами + Вид: скульптура + Вид шафи: управління водними ресурсами Пандус для багажу: є KITCard не приймаються - Тип: статуя - Тип шафи: вуличне освітлення + Вид: статуя + Вид шафи: вуличне освітлення Пандус для багажу: відсутній Westfalen - Тип: фреска + Вид: фреска Кількість сходинок Військовий контрольно-пропускний пункт - Тип: архітектура + Вид: архітектура Стан сходинок: хороший Шафки, що замикаються Картки Westfalen не приймаються - Тип: живопис + Вид: живопис Стан сходинок: середній Велопарковка у формі дерева V PAY - Тип: камінь + Вид творіння: камінь Стан сходинок: поганий Відкритий відсік Картки V PAY не приймаються - Тип: бюст + Вид: бюст Піраміда з каменів Глибина Dogecoin - Тип: інсталяція + Вид: інсталяція Дефібрилятор Сіль - Тип: мозаїка + Вид: мозаїка Дефібрилятор: є Сіль: немає Dogecoin не приймаються - Тип: барельєф - Тип: братська могила + Вид: барельєф + Вид: братська могила Лише для інвалідних візків Cibus - Тип: графіті - Тип: курган + Вид: графіті + Вид: курган Відвал породи - Тип: стела - Тип: вирізана в камені + Вид: стела + Вид: вирізана в камені Дитячий літній табір Картки Cibus не приймаються - Тип: водограй - Тип: гіпогей + Вид: водограй + Вид: гіпогей Оздоровчий центр, база відпочинку Грошові перекази Ширина - Тип: усипальниця, гробниця, могильний склеп + Вид: усипальниця, гробниця, могильний склеп Управління переїздом: автоматичне Грошові перекази не приймаються Архітектор - Тип: колумбарій + Вид: колумбарій Управління переїздом: місцеве Картки Cash (Geldkarte) Архітектурний стиль: модернізм - Тип: мавзолей + Вид: мавзолей Управління переїздом: дистанційне Картки Cash (Geldkarte) не приймаються Архітектурний стиль: сталінський неокласицизм - Тип: саркофаг + Вид: саркофаг Бар\'єр на переїзді: немає Proton Архітектурний стиль: еклектика - Тип: крипта + Вид: крипта Бар\'єр на переїзді Архітектурний стиль: нова речовинність - Тип: піраміда + Вид: піраміда Бар\'єр на переїзді: повний Картки Proton не приймаються Архітектурний стиль: сучасний @@ -2097,15 +2097,15 @@ Конструкція моста: арочний Променева діагностика Відображення дати - Тип насоса: верстат-качалка + Вид насоса: верстат-качалка Відображення дати: немає Конструкція моста: ферма Гастроентерологія - Тип насосу: India Mk II або III + Вид насосу: India Mk II або III Опора: стовп Будівництво моста: понтон Стоматологія - Тип насоса: гравітаційний + Вид насоса: гравітаційний Опора: стіна Картки Roadrunner не приймаються Конструкція моста: горбатий @@ -2273,7 +2273,7 @@ Без підкачки шин Призначення: дослідження Заморожений йогурт - Тип + Вид Жетони Презервативи Конструкція мосту: акведук @@ -2294,7 +2294,7 @@ Пачинко Подарункові картки Велосипедні камери - Тип моста: розвідний + Вид моста: розвідний Єврейська Болгарська Туалет: громадський @@ -2371,7 +2371,7 @@ ПРО100 Пакети для екскрементів тварин Заболочений луг - Тип: нафтова промисловість + Вид: нафтова промисловість Спортивна Місце для розведення вогню Консультація сімейна: так @@ -2379,7 +2379,7 @@ Чай з кульками Картки ПРО100 не приймаються Торф\'яне болото - Тип: буровий майданчик + Вид: буровий майданчик Чоловіча Розподільна шафа Консультація сімейна: немає @@ -2444,7 +2444,7 @@ Іспанська В\'єтнамська Для вегетаріанців - Камінь спотикання + Камінь перепони Підкачка шин Так Пилосос @@ -2487,12 +2487,12 @@ Пожежний оператор Філіппінська Історичний кар\'єр - Тип: фабрика + Вид: фабрика Так Посадка Веганська Заповнювачі бетону - Тип: газова промисловість + Вид: газова промисловість Пральна машина: немає Посадка на вершині Пожежний резервуар з водою @@ -2500,70 +2500,70 @@ Веганське харчування не пропонується Безглютенове харчування Сурма - Тип: лісоматеріали + Вид: лісоматеріали Так Буксирування - Тип туалету: змивається водою + Вид туалету: змивається водою Грузинська Лише безглютенова Азбест - Тип: очисний завод + Вид: очисний завод Душ Тренування Вигрібна яма Польська Безглютенова Барит - Тип: склад + Вид: склад Нейропсихіатрія Офіційне місце для вільного польоту Утилізація відходів: хімічна Бразильська Безглютенове харчування не пропонується Базальт - Тип: утилізація машин + Вид: утилізація машин Ендокринологія Офіційне місце: немає Утилізація відходів: контейнер Арабська Кошерне харчування Боксити - Тип: сільськогосподарська промисловість + Вид: сільськогосподарська промисловість Ядерна медицина Парапланеризм Довжина Датська Лише кошерна Берил - Тип: пивоварня + Вид: пивоварня Патологічна анатомія Парапланеризм: немає Вікіпедія Кошерна Кошерне харчування не пропонується Вісмут - Тип: цегельний завод + Вид: цегельний завод Онкологія Дельтапланеризм Різдво Індонезійська Халяль Хроміти, хромова руда - Тип: інтермодальний вантажний термінал + Вид: інтермодальний вантажний термінал Соціальна педіатрія Дельтапланеризм: немає Різдвяна подія Африканська Лише халяль Глина - Тип: пилорама + Вид: пилорама Спеціалізація: соціальна педіатрія: відсутня Дельтаплан з жорстким крилом Різдв\'яна ярмарка Карибська Халяль Вугілля - Тип: очищення води + Вид: очищення води Акушерство (кесарів розтин) Дельтаплан з жорстким крилом: ні Різдвяна піраміда @@ -2578,7 +2578,7 @@ Лише безлактозна Отримання посилок Пальза болото - Тип притулку: для собак + Вид притулку: для собак Жіноча Справедлива торгівля (Fairtrade): є Консультація для іммігрантів: немає @@ -2588,7 +2588,7 @@ Безлактозна Відправлення посилок Бруд - Тип притулку: для кішок + Вид притулку: для кішок Нижня білизна Справедлива торгівля (Fairtrade): немає Консультування (шлюб): так @@ -2598,7 +2598,7 @@ Безлактозні продукти не пропонуються Молоко Пісок - Тип притулку: для собак і кішок + Вид притулку: для собак і кішок Чоловіча Лише товари з маркуванням Справедливої торгівлі (Fairtrade) Консультування (шлюб): немає @@ -2607,8 +2607,8 @@ Ефіопська Пескетаріанська Подовжені монети (сувеніри) - Тип розвідного моста: підіймальний - Тип притулку: для коней + Вид розвідного моста: підіймальний + Вид притулку: для коней Весільні сукні Хокей з м\'ячем Консультація з питань харчування: так @@ -2617,7 +2617,7 @@ Угорська Так Хліб - Тип розвідного моста: поворотний + Вид розвідного моста: поворотний Історичний літак Природоохоронна природна/історична територія Спортивна @@ -2627,17 +2627,17 @@ Лаоська Придбати продукти не покидаючи авто на парковці (drive-in): ні Жувальна гумка - Тип розвідного моста: вертикально-підйомний + Вид розвідного моста: вертикально-підйомний З ліфтом Ортопедична - Тип об\'єкту, що охороняється + Вид об\'єкту, що охороняється Консультація реабілітаційна: так Телескоп Бушеншанк (вишукані австрійські вина) Європейська Так "Паркувальні талони; квитки на громадський транспорт" - Тип розвідного моста: підйомний + Вид розвідного моста: підйомний Без ліфта Історична садиба Об\'єкт охорони: історичний @@ -2647,9 +2647,9 @@ Узбецька Придбати продукти не покидаючи авто у віконці (drive-through): ні Кава - Тип розвідного моста: затоплюваний + Вид розвідного моста: затоплюваний Технічний пам\'ятник - Тип замка: величний + Вид замка: величний Об\'єкт охорони: природа Консультація сексуальна: так Бейгл (єврейський бублик) @@ -2657,9 +2657,9 @@ Радіотелескоп Назва пивоварні Оплата за проїзд - Тип розвідного моста: літаючий паром + Вид розвідного моста: літаючий паром Офіс лісництва - Тип замка: оборонний + Вид замка: оборонний Об\'єкт охорони: середовище проживання Консультація сексуальна: немає Гамма @@ -2667,9 +2667,9 @@ Кубинська Так Квитки - Тип розвідного моста: висувається + Вид розвідного моста: висувний Офіс транспортно-логістичної компанії - Тип замку: фортеця + Вид замку: фортеця Об\'єкт охорони: вода Консультація для жертв сексуального домагання: так Діаметр @@ -2679,7 +2679,7 @@ Продаж води Об\'єкт освітлений: так Офіс парафії - Тип замку: палац + Вид замку: палац Країна, яка спричинила вибух Консультація для жертв сексуального домагання: немає Гравітаційна @@ -2693,7 +2693,7 @@ Корм для тварин Поверхня: без покриття Паливо 91UL - Тип замку: кремль + Вид замку: кремль Назва місця вибуху Консультація для жертв насильства: так Парникове садівництво @@ -2703,8 +2703,8 @@ Плани громадського транспорту Поверхня: з покриттям Паливо 100LL - Тип замку: захисний, величний - Тип вибуху: підземний, шахта + Вид замку: захисний, величний + Вид вибуху: підземний, шахта Консультація для жертв насильства: немає Напруга Макаронні вироби @@ -2713,8 +2713,8 @@ Напої та солодощі Поверхня: асфальт Автогаз - Тип замку: римський форт - Тип вибуху: підземний, тунель + Вид замку: римський форт + Вид вибуху: підземний, тунель Консультація з питань (домашнього) насильства: так Вихідна потужність Соки @@ -2723,8 +2723,8 @@ Ваучери Поверхня: бетон Паливо Jet A-1 - Тип замку: сіро (японський замок) - Тип вибуху: атмосферний + Вид замку: сіро (японський замок) + Вид вибуху: атмосферний Консультація з питань (домашнього) насильства: немає Виробляє електрику Соба (локшина з гречаного борошна) @@ -2734,7 +2734,7 @@ Поверхня: бруківка Паливо AdBlue Тайський - Тип вибуху: атмосферний, скидання з літака + Вид вибуху: атмосферний, скидання з літака Послуги надаються немовлятам: так Вихідна потужність гарячої води Вишукані страви @@ -2744,7 +2744,7 @@ Поверхня: покладений булижник Паливо: дрова Еротичний - Тип вибуху: атмосферний, на поверхні (вежа) + Вид вибуху: атмосферний, на поверхні (вежа) Послуги надаються немовлятам: ні Виробляє гарячу воду Чай @@ -2755,7 +2755,7 @@ Поверхня: тротуарна плитка Паливо: деревне вугілля Китайський - Тип вибуху: атмосферний, на повітряній кулі + Вид вибуху: атмосферний, на повітряній кулі Послуги надаються немовлятам: так Різдвяний магазин Зупи @@ -2765,9 +2765,9 @@ Поверхня: галька Паливо: кам\'яне вугілля Спеціалізація: акушерство (кесарів розтин): відсутнє - Тип вибуху: атмосферний (на поверхні) + Вид вибуху: атмосферний (на поверхні) Послуги надаються немовлятам: ні - Магазин ялинок + Крамниця ялинок Пироги Швейцарська Немає місць на відкритому повітрі @@ -2776,7 +2776,7 @@ Поверхня: метал Вуличний ліхтар Наркологія - Тип вибуху: атмосферний (поверхня води, баржа) + Вид вибуху: атмосферний (поверхня води, баржа) Послуги надаються дітям: так Різдвяна ялинка Сидр @@ -2786,7 +2786,7 @@ Поверхня: дерево Смуга аварійного гальмування Оптометрія - Тип вибуху: підземний + Вид вибуху: підземний Послуги надаються дітям: ні Різдво: початок і закінчення події М\'ясо @@ -2795,7 +2795,7 @@ Мідь Поверхня: гравій Вирощується культура: рис - Тип вибуху: неглибокого закладення + Вид вибуху: неглибокого закладення Послуги надаються дорослим: так Різдво: нотатка Крильця @@ -2805,17 +2805,17 @@ Поверхня: багатошаровий гравій Вирощується культура: трава Клінічна патологія - Тип вибуху: атмосферний (ракета) + Вид вибуху: атмосферний (ракета) Послуги надаються дорослим: ні Різдво: години роботи Вафлі Гральні автомати Місця на відкритому повітрі: в саду Будівельний камінь - Поверхня: утрамбований грунт і каміння + Поверхня: утрамбований ґрунт і каміння Вирощується культура: кукурудза Логопед - Тип вибуху: космічний (висота понад 80км) + Вид вибуху: космічний (висота понад 80км) Послуги надаються жінкам: так Різдво: місце проведення Шоколад @@ -2825,7 +2825,7 @@ Поверхня: пісок Вирощується культура: зернова Мануальна терапія - Тип вибуху: підводний + Вид вибуху: підводний Послуги надаються жінкам: ні Різдво: вебсайт Вино @@ -2842,11 +2842,11 @@ Електронні сигарети Вживані товари Золото - Поверхня: нещільне мощення камінням + Поверхня: нещільна кам\'яна бруківка Вирощується культура: пшениця Подологія Послуги надаються людям похилого віку: немає - Тип: телефонна будка + Вид: телефонна будка Другий сніданок (бранч) Локомотив Немає вживаних товарів @@ -2856,7 +2856,7 @@ Психіатрія для дорослих Кодове ім\'я (англ) Послуги надаються дівчаткам: так - Тип: шафа з книгами + Вид: шафа з книгами Сендвіч в формі підводного човна Харчові добавки Лише вживані товари @@ -2867,7 +2867,7 @@ Акупунктура (голковколювання) Серія Послуги надаються дівчаткам: ні - Тип: дерев\'яна шафа + Вид: дерев\'яна шафа Піта (м\'які коржі) Фотостудія Запчастини @@ -2877,7 +2877,7 @@ Гомеопатія Мета вибуху: випробування ядерної зброї Послуги надаються чоловікам: так - Тип: металева шафа + Вид: металева шафа Фондю (сирне блюдо) Скеля (прямовисна) Дилер @@ -2887,7 +2887,7 @@ Традиційна китайська медицина Мета вибуху: ефект зброї Послуги надаються чоловікам: ні - Тип: шафа для одягу (в будівлі) + Вид: шафа для одягу (в будівлі) Французький багет Місце утримання тварин Свинець @@ -2925,7 +2925,7 @@ Обслуговування в стаціонарі: так Бургер Теріякі (солодке м\'ясо з соєю) - Тип: загін + Вид: загін Ремонт мотоциклів Ртуть Тролейбус @@ -2962,7 +2962,7 @@ Нікель Легкорейковий транспорт Вирощується культура: тютюн - Тип будівлі: піраміда + Вид будівлі: піраміда Мета вибуху: промислове застосування, зрушення земляних пластів Психологічна консультація: немає Донер кебаб (шаурма) @@ -3007,7 +3007,7 @@ Громадська лазня Солеварня Вирощується культура: журавлина - Тип: порт + Вид: порт Мікрохвильова піч: відсутня Орієнтація майданчика для вільного польоту: північ (N) Виїзд на дім: ні @@ -3016,7 +3016,7 @@ Так Продукти харчування Ватти (прибережна мілина) - Тип: депо + Вид: депо Вирощується культура: спаржа Водонагрівач: присутній Орієнтація майданчика для вільного польоту: північний схід (NE) @@ -3035,7 +3035,7 @@ Локшина Вино: продаж (в пляшках) Орієнтація майданчика для вільного польоту: південний-схід (SE) - Тип: на поверхні + Вид: на поверхні Мангрові зарості Водопій Відеоспостереження: всередині @@ -3073,7 +3073,7 @@ Музична школа Школа іноземних мов Рятувальний круг - Тип + Вид Контактний зоопарк Парк дикої природи Сафарі-парк @@ -3084,7 +3084,7 @@ Клітки Спортивна трибуна Послуги - Тип мотоциклів + Вид мотоциклів Продаж Продаж: немає Продаж: є, також б/у @@ -3185,7 +3185,7 @@ Габаритна ширина УКХ-канал Робочий стан - Тип водопостачання + Вид водопостачання Очищення води Доступ до водопостачання Ущелина @@ -3310,10 +3310,10 @@ Оплата за парковку Сила струму Потужність зарядної станції - Тип мапи: топографічна - Тип мапи: мапа вулиць - Тип мапи: схематична - Тип мапи: панорама + Вид мапи: топографічна + Вид мапи: мапа вулиць + Вид мапи: схематична + Вид мапи: панорама Охоплення мапи: місце Охоплення мапи: місто Охоплення мапи: регіон @@ -3335,10 +3335,10 @@ Льодяний: ні Змішаний: так Змішаний: ні - Тип каменю: вапняк - Тип каменю: граніт - Тип каменю: піщаник - Тип каменю: кварцит + Вид каменю: вапняк + Вид каменю: граніт + Вид каменю: піщаник + Вид каменю: кварцит Стиль скелелазіння Роз\'єм Боулдерінг: так @@ -3352,8 +3352,8 @@ Довжина сходження Мінімальна довжина сходження Максимальна довжина сходження - Камінь сходження: гнейс - Камінь сходження: порфір + Скелелазне каміння: гнейс + Кселелазне каміння: порфір Якість сходження: твердо Якість сходження: крихко Фіксовані зачепи: так @@ -3371,25 +3371,25 @@ Маршрути сходження Обхват стовбура Діаметр крони - Тип: сільськогосподарський - Тип: природний - Тип: заростаючий - Тип: пасовище + Вид: сільськогосподарський + Вид: природний + Вид: заростаючий + Вид: пасовище Заморожені продукти Сільськогосподарський магазин - Магазин камінів - "Магазин човнів " - Магазин канабісу + Крамниця груб + "Крамниця човнів " + Крамниця конопель CEE блакитний CEE червоний 16A CEE червоний 32A CEE червоний 64A CEE червоний 125A - Тип 1 - Тип 1 комбінований - Тип 2 - Тип 2 комбінований - Тип 3 + Вид 1 + Вид 1 комбінований + Вид 2 + Вид 2 комбінований + Вид 3 "CHAdeMO " "Стандарт Тесла " Тесла Supercharger @@ -3402,9 +3402,9 @@ "BS 1363 " "AS/NZS 3112 " CHAdeMO, потужність - Тип 2, потужність - Тип 2, комбінований, потужність - Тип 3, потужність + Вид 2, потужність + Вид 2, комбінований, потужність + Вид 3, потужність CEE блакитний, потужність Щуко, потужність Висока @@ -3429,8 +3429,8 @@ Гончарство Назва річкових порогів Автопослуги - Тип льодовика - Тип контрольного пункту + Вид льодовика + Вид контрольного пункту Пункт видачі замовлень Мангал: є Офіс водопостачання @@ -3488,7 +3488,7 @@ Пункт штампування Голкова машина Скеля - Магазин побутової техніки + Крамниця побутової техніки Оголення порід Радіаційна небезпека Ерозійна небезпека @@ -3503,7 +3503,7 @@ Банкомат Ремонт взуття Масове придбання - Тип + Вид Так Виключно Трубопровідна підстанція @@ -3779,4 +3779,5 @@ Осередок бовлінгу Довідковий номер траси Мисливська база + Осередок підводного плавання \ No newline at end of file diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index 632fd625d1..9fb7ed9cb7 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -3532,4 +3532,13 @@ Антарктида Показувати системне сповіщення з навігаційними вказівками під час навігації. Навігаційне сповіщення + Усталений застосунок (%s) + Вимкнути перерахунок + Найменша відстань для перерахунку маршруту + Маршрут буде перераховано, якщо відстань до нього перевищує вказане + Користувацький профіль + Кут: %s° + Кут + Додатковий прямий відрізок між моїм розташуванням та розрахунковим маршрутом відображатиметься, поки маршрут не буде перераховано + Найменший кут між моїм розташуванням та маршрутом \ No newline at end of file diff --git a/OsmAnd/res/values-zh-rTW/phrases.xml b/OsmAnd/res/values-zh-rTW/phrases.xml index e25d6b395d..69fdcb4cff 100644 --- a/OsmAnd/res/values-zh-rTW/phrases.xml +++ b/OsmAnd/res/values-zh-rTW/phrases.xml @@ -3790,4 +3790,5 @@ 保齡球館 滑雪道參考編號 狩獵基地 + 水肺潛水中心 \ No newline at end of file diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 2392376b37..60870e8cda 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -3532,4 +3532,8 @@ 南極洲 使用導航說明時喜訕系統通知。 導航通知 + 應用程式預設值 (%s) + 停用重新計算 + 重新計算路線的最小距離 + 如果到路線的距離大於指定的參數,則路線將會重新計算 \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index f6c1b3e499..c791bbe5ab 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,11 @@ Thx - Hardy --> + Custom profile + Angle: %s° + Angle + Extra straight segment between my location and calculated route will be displayed until the route is recalculated + Minimum angle between my location and route Show system notification while navigation with navigation instructions. Navigation notification App Default (%s) diff --git a/OsmAnd/src/net/osmand/AndroidUtils.java b/OsmAnd/src/net/osmand/AndroidUtils.java index f60e069c4c..3e119e15f0 100644 --- a/OsmAnd/src/net/osmand/AndroidUtils.java +++ b/OsmAnd/src/net/osmand/AndroidUtils.java @@ -28,7 +28,6 @@ import android.support.annotation.AttrRes; import android.support.annotation.ColorInt; import android.support.annotation.ColorRes; import android.support.annotation.NonNull; -import android.support.design.widget.Snackbar; import android.support.v4.content.ContextCompat; import android.support.v4.content.FileProvider; import android.support.v4.text.TextUtilsCompat; @@ -342,18 +341,6 @@ public class AndroidUtils { return res; } - public static void setSnackbarTextColor(Snackbar snackbar, @ColorRes int colorId) { - View view = snackbar.getView(); - TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_action); - tv.setTextColor(ContextCompat.getColor(view.getContext(), colorId)); - } - - public static void setSnackbarTextMaxLines(Snackbar snackbar, int maxLines) { - View view = snackbar.getView(); - TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); - tv.setMaxLines(maxLines); - } - public static void setBackground(Context ctx, View view, boolean night, int lightResId, int darkResId) { Drawable drawable; if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { diff --git a/OsmAnd/src/net/osmand/plus/AppInitializer.java b/OsmAnd/src/net/osmand/plus/AppInitializer.java index db19b1ce9c..03321e9a19 100644 --- a/OsmAnd/src/net/osmand/plus/AppInitializer.java +++ b/OsmAnd/src/net/osmand/plus/AppInitializer.java @@ -631,6 +631,7 @@ public class AppInitializer implements IProgress { if (!customConfigs.isEmpty()) { app.getCustomRoutingConfigs().putAll(customConfigs); } + app.avoidSpecificRoads.initRouteObjects(false); callback.onRoutingFilesLoaded(); } @@ -741,8 +742,7 @@ public class AppInitializer implements IProgress { notifyEvent(InitEvents.RESTORE_BACKUPS); app.mapMarkersHelper.syncAllGroupsAsync(); app.searchUICore.initSearchUICore(); - app.avoidSpecificRoads.initRouteObjects(); - + checkLiveUpdatesAlerts(); } catch (RuntimeException e) { diff --git a/OsmAnd/src/net/osmand/plus/ApplicationMode.java b/OsmAnd/src/net/osmand/plus/ApplicationMode.java index a8dc723ee8..ea73bba0f1 100644 --- a/OsmAnd/src/net/osmand/plus/ApplicationMode.java +++ b/OsmAnd/src/net/osmand/plus/ApplicationMode.java @@ -420,6 +420,14 @@ public class ApplicationMode { app.getSettings().MAX_SPEED.setModeValue(this, defaultSpeed); } + public float getStrAngle() { + return app.getSettings().ROUTE_STRAIGHT_ANGLE.getModeValue(this); + } + + public void setStrAngle(float angle) { + app.getSettings().ROUTE_STRAIGHT_ANGLE.setModeValue(this, angle); + } + public String getUserProfileName() { return app.getSettings().USER_PROFILE_NAME.getModeValue(this); } diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 6a7e45a409..8460556e1d 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -42,6 +42,7 @@ import net.osmand.plus.api.SettingsAPI; import net.osmand.plus.api.SettingsAPI.SettingsEditor; import net.osmand.plus.api.SettingsAPIImpl; import net.osmand.plus.dialogs.RateUsBottomSheetDialogFragment; +import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo; import net.osmand.plus.helpers.SearchHistoryHelper; import net.osmand.plus.mapillary.MapillaryPlugin; import net.osmand.plus.mapmarkers.CoordinateInputFormats.Format; @@ -2627,6 +2628,8 @@ public class OsmandSettings { private static final String IMPASSABLE_ROAD_POINTS = "impassable_road_points"; private static final String IMPASSABLE_ROADS_DESCRIPTIONS = "impassable_roads_descriptions"; + private static final String IMPASSABLE_ROADS_IDS = "impassable_roads_ids"; + private static final String IMPASSABLE_ROADS_APP_MODE_KEYS = "impassable_roads_app_mode_keys"; private ImpassableRoadsStorage mImpassableRoadsStorage = new ImpassableRoadsStorage(); public void backupPointToStart() { @@ -2796,9 +2799,184 @@ public class OsmandSettings { } private class ImpassableRoadsStorage extends MapPointsStorage { + + protected String roadsIdsKey; + protected String appModeKey; + public ImpassableRoadsStorage() { pointsKey = IMPASSABLE_ROAD_POINTS; descriptionsKey = IMPASSABLE_ROADS_DESCRIPTIONS; + roadsIdsKey = IMPASSABLE_ROADS_IDS; + appModeKey = IMPASSABLE_ROADS_APP_MODE_KEYS; + } + + public List getRoadIds(int size) { + List list = new ArrayList<>(); + String roadIds = settingsAPI.getString(globalPreferences, roadsIdsKey, ""); + if (roadIds.trim().length() > 0) { + StringTokenizer tok = new StringTokenizer(roadIds, ","); + while (tok.hasMoreTokens() && list.size() <= size) { + list.add(Long.parseLong(tok.nextToken())); + } + } + while (list.size() < size) { + list.add(0L); + } + return list; + } + + public List getAppModeKeys(int size) { + List list = new ArrayList<>(); + String roadIds = settingsAPI.getString(globalPreferences, appModeKey, ""); + if (roadIds.trim().length() > 0) { + StringTokenizer tok = new StringTokenizer(roadIds, ","); + while (tok.hasMoreTokens() && list.size() <= size) { + list.add(tok.nextToken()); + } + } + while (list.size() < size) { + list.add(""); + } + return list; + } + + public List getImpassableRoadsInfo() { + List points = getPoints(); + List roadIds = getRoadIds(points.size()); + List appModeKeys = getAppModeKeys(points.size()); + List descriptions = getPointDescriptions(points.size()); + + List avoidRoadsInfo = new ArrayList<>(); + + for (int i = 0; i < points.size(); i++) { + LatLon latLon = points.get(i); + PointDescription description = PointDescription.deserializeFromString(descriptions.get(i), null); + + AvoidRoadInfo avoidRoadInfo = new AvoidRoadInfo(); + avoidRoadInfo.id = roadIds.get(i); + avoidRoadInfo.latitude = latLon.getLatitude(); + avoidRoadInfo.longitude = latLon.getLongitude(); + avoidRoadInfo.name = description.getName(); + avoidRoadInfo.appModeKey = appModeKeys.get(i); + avoidRoadsInfo.add(avoidRoadInfo); + } + + return avoidRoadsInfo; + } + + public boolean addImpassableRoadInfo(AvoidRoadInfo avoidRoadInfo) { + List points = getPoints(); + List roadIds = getRoadIds(points.size()); + List appModeKeys = getAppModeKeys(points.size()); + List descriptions = getPointDescriptions(points.size()); + + roadIds.add(0, avoidRoadInfo.id); + points.add(0, new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude)); + appModeKeys.add(0, avoidRoadInfo.appModeKey); + descriptions.add(0, PointDescription.serializeToString(new PointDescription("", avoidRoadInfo.name))); + + return saveAvoidRoadData(points, descriptions, roadIds, appModeKeys); + } + + public boolean updateImpassableRoadInfo(AvoidRoadInfo avoidRoadInfo) { + List points = getPoints(); + + int index = points.indexOf(new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude)); + if (index != -1) { + List roadIds = getRoadIds(points.size()); + List appModeKeys = getAppModeKeys(points.size()); + List descriptions = getPointDescriptions(points.size()); + + roadIds.set(index, avoidRoadInfo.id); + appModeKeys.set(index, avoidRoadInfo.appModeKey); + descriptions.set(index, PointDescription.serializeToString(new PointDescription("", avoidRoadInfo.name))); + return saveAvoidRoadData(points, descriptions, roadIds, appModeKeys); + } + return false; + } + + @Override + public boolean deletePoint(int index) { + List points = getPoints(); + List roadIds = getRoadIds(points.size()); + List appModeKeys = getAppModeKeys(points.size()); + List descriptions = getPointDescriptions(points.size()); + + if (index < points.size()) { + points.remove(index); + roadIds.remove(index); + appModeKeys.remove(index); + descriptions.remove(index); + return saveAvoidRoadData(points, descriptions, roadIds, appModeKeys); + } + return false; + } + + @Override + public boolean deletePoint(LatLon latLon) { + List points = getPoints(); + List roadIds = getRoadIds(points.size()); + List appModeKeys = getAppModeKeys(points.size()); + List descriptions = getPointDescriptions(points.size()); + + int index = points.indexOf(latLon); + if (index != -1) { + points.remove(index); + roadIds.remove(index); + appModeKeys.remove(index); + descriptions.remove(index); + return saveAvoidRoadData(points, descriptions, roadIds, appModeKeys); + } + return false; + } + + @Override + public boolean movePoint(LatLon latLonEx, LatLon latLonNew) { + List points = getPoints(); + List roadIds = getRoadIds(points.size()); + List appModeKeys = getAppModeKeys(points.size()); + List descriptions = getPointDescriptions(points.size()); + + int i = points.indexOf(latLonEx); + if (i != -1) { + points.set(i, latLonNew); + return saveAvoidRoadData(points, descriptions, roadIds, appModeKeys); + } else { + return false; + } + } + + public boolean saveAvoidRoadData(List points, List descriptions, + List roadIds, List appModeKeys) { + return savePoints(points, descriptions) && saveRoadIds(roadIds) && saveAppModeKeys(appModeKeys); + } + + public boolean saveRoadIds(List roadIds) { + StringBuilder stringBuilder = new StringBuilder(); + Iterator iterator = roadIds.iterator(); + while (iterator.hasNext()) { + stringBuilder.append(iterator.next()); + if (iterator.hasNext()) { + stringBuilder.append(","); + } + } + return settingsAPI.edit(globalPreferences) + .putString(roadsIdsKey, stringBuilder.toString()) + .commit(); + } + + public boolean saveAppModeKeys(List appModeKeys) { + StringBuilder stringBuilder = new StringBuilder(); + Iterator iterator = appModeKeys.iterator(); + while (iterator.hasNext()) { + stringBuilder.append(iterator.next()); + if (iterator.hasNext()) { + stringBuilder.append(","); + } + } + return settingsAPI.edit(globalPreferences) + .putString(appModeKey, stringBuilder.toString()) + .commit(); } } @@ -2989,11 +3167,16 @@ public class OsmandSettings { return settingsAPI.edit(globalPreferences).putInt(POINT_NAVIGATE_ROUTE, NAVIGATE).commit(); } - public List getImpassableRoadPoints() { - return mImpassableRoadsStorage.getPoints(); + public List getImpassableRoadPoints() { + return mImpassableRoadsStorage.getImpassableRoadsInfo(); } - public boolean addImpassableRoad(double latitude, double longitude) { - return mImpassableRoadsStorage.insertPoint(latitude, longitude, null, 0); + + public boolean addImpassableRoad(AvoidRoadInfo avoidRoadInfo) { + return mImpassableRoadsStorage.addImpassableRoadInfo(avoidRoadInfo); + } + + public boolean updateImpassableRoadInfo(AvoidRoadInfo avoidRoadInfo) { + return mImpassableRoadsStorage.updateImpassableRoadInfo(avoidRoadInfo); } public boolean removeImpassableRoad(int index) { diff --git a/OsmAnd/src/net/osmand/plus/UiUtilities.java b/OsmAnd/src/net/osmand/plus/UiUtilities.java index 3b4d3f8134..bd8901f1e7 100644 --- a/OsmAnd/src/net/osmand/plus/UiUtilities.java +++ b/OsmAnd/src/net/osmand/plus/UiUtilities.java @@ -15,6 +15,7 @@ import android.support.annotation.ColorInt; import android.support.annotation.ColorRes; import android.support.annotation.DrawableRes; import android.support.annotation.StringRes; +import android.support.design.widget.Snackbar; import android.support.v4.content.ContextCompat; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v4.text.TextUtilsCompat; @@ -344,6 +345,40 @@ public class UiUtilities { return screenOrientation; } + public static void setupSnackbar(Snackbar snackbar, boolean nightMode) { + setupSnackbar(snackbar, nightMode, null, null, null, null); + } + + public static void setupSnackbar(Snackbar snackbar, boolean nightMode, Integer maxLines) { + setupSnackbar(snackbar, nightMode, null, null, null, maxLines); + } + + public static void setupSnackbar(Snackbar snackbar, boolean nightMode, @ColorRes Integer backgroundColor, + @ColorRes Integer messageColor, @ColorRes Integer actionColor, Integer maxLines) { + if (snackbar == null) { + return; + } + View view = snackbar.getView(); + Context ctx = view.getContext(); + TextView tvMessage = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); + TextView tvAction = (TextView) view.findViewById(android.support.design.R.id.snackbar_action); + if (messageColor == null) { + messageColor = nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light; + } + tvMessage.setTextColor(ContextCompat.getColor(ctx, messageColor)); + if (actionColor == null) { + actionColor = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light; + } + tvAction.setTextColor(ContextCompat.getColor(ctx, actionColor)); + if (maxLines != null) { + tvMessage.setMaxLines(maxLines); + } + if (backgroundColor == null) { + backgroundColor = nightMode ? R.color.list_background_color_dark : R.color.list_background_color_light; + } + view.setBackgroundColor(ContextCompat.getColor(ctx, backgroundColor)); + } + public static void setupLayoutDirection(View layout) { Context ctx = layout.getContext(); Locale currentLocale = ctx.getResources().getConfiguration().locale; diff --git a/OsmAnd/src/net/osmand/plus/activities/ContributionVersionActivity.java b/OsmAnd/src/net/osmand/plus/activities/ContributionVersionActivity.java index 6cbdf7641d..7dde1b05c7 100644 --- a/OsmAnd/src/net/osmand/plus/activities/ContributionVersionActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/ContributionVersionActivity.java @@ -264,7 +264,7 @@ public class ContributionVersionActivity extends OsmandListActivity { StringBuilder format = new StringBuilder(); format.append(AndroidUtils.formatDateTime(getMyApplication(), build.date.getTime()))/*.append(" : ").append(build.size).append(" MB")*/; description.setText(format.toString()); - int color = getResources().getColor(R.color.color_unknown); + int color = getResources().getColor(R.color.text_color_secondary_dark); if (currentInstalledDate != null) { if (currentInstalledDate.before(build.date)) { color = getResources().getColor(R.color.color_update); diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index 057f214a87..7338700698 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -426,7 +426,7 @@ public class MapActivityActions implements DialogProvider { mapActivity.getContextMenu().close(); MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), new LatLon(latitude, longitude)); } else if (standardId == R.string.avoid_road) { - getMyApplication().getAvoidSpecificRoads().addImpassableRoad(mapActivity, new LatLon(latitude, longitude), true, false); + getMyApplication().getAvoidSpecificRoads().addImpassableRoad(mapActivity, new LatLon(latitude, longitude), true, false, null); } } }); diff --git a/OsmAnd/src/net/osmand/plus/base/MapViewTrackingUtilities.java b/OsmAnd/src/net/osmand/plus/base/MapViewTrackingUtilities.java index d9985350e9..d02b3ffb74 100644 --- a/OsmAnd/src/net/osmand/plus/base/MapViewTrackingUtilities.java +++ b/OsmAnd/src/net/osmand/plus/base/MapViewTrackingUtilities.java @@ -7,6 +7,7 @@ import android.view.WindowManager; import net.osmand.Location; import net.osmand.StateChangedListener; +import net.osmand.binary.BinaryMapDataObject; import net.osmand.data.LatLon; import net.osmand.data.RotatedTileBox; import net.osmand.map.IMapLocationListener; @@ -30,6 +31,7 @@ import net.osmand.util.MapUtils; import java.io.IOException; import java.text.SimpleDateFormat; +import java.util.Map; public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLocationListener, OsmAndCompassListener, MapMarkerChangedListener { @@ -456,7 +458,10 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc protected WorldRegion doInBackground(LatLon... latLons) { try { if (latLons != null && latLons.length > 0) { - return app.getRegions().getSmallestBinaryMapDataObjectAt(latLons[0]).getKey(); + Map.Entry reg = app.getRegions().getSmallestBinaryMapDataObjectAt(latLons[0]); + if(reg != null) { + return reg.getKey(); + } } } catch (IOException e) { // ignore diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java index 18f06cc21e..98cc159720 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java @@ -118,6 +118,7 @@ public class DownloadIndexesThread { if (app.getDownloadService() != null) { app.getDownloadService().stopService(app); } + app.getAvoidSpecificRoads().initRouteObjects(true); } public void initSettingsFirstMap(WorldRegion reg) { diff --git a/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java index b2a1d87f4c..ea566933f7 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/LocalIndexesFragment.java @@ -541,6 +541,7 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement if (operation == DELETE_OPERATION) { File f = new File(info.getPathToData()); successfull = Algorithms.removeAllFiles(f); + if (InAppPurchaseHelper.isSubscribedToLiveUpdates(getMyApplication())) { String fileNameWithoutExtension = Algorithms.getFileNameWithoutExtension(f); @@ -550,6 +551,14 @@ public class LocalIndexesFragment extends OsmandExpandableListFragment implement } if (successfull) { getMyApplication().getResourceManager().closeFile(info.getFileName()); + File tShm = new File(f.getParentFile(), f.getName() + "-shm"); + File tWal = new File(f.getParentFile(), f.getName() + "-wal"); + if(tShm.exists()) { + Algorithms.removeAllFiles(tShm); + } + if(tWal.exists()) { + Algorithms.removeAllFiles(tWal); + } } } else if (operation == RESTORE_OPERATION) { successfull = move(new File(info.getPathToData()), getFileToRestore(info)); diff --git a/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java index 0d9834a351..7da8f572be 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/SearchDialogFragment.java @@ -31,6 +31,7 @@ import net.osmand.Collator; import net.osmand.CollatorStringMatcher; import net.osmand.OsmAndCollator; import net.osmand.ResultMatcher; +import net.osmand.binary.BinaryMapDataObject; import net.osmand.binary.BinaryMapIndexReader; import net.osmand.binary.BinaryMapIndexReader.SearchRequest; import net.osmand.data.Amenity; @@ -61,6 +62,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; +import java.util.Map; public class SearchDialogFragment extends DialogFragment implements DownloadEvents, OnItemClickListener { @@ -416,7 +418,10 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven Amenity amenity = cityItem.getAmenity(); WorldRegion downloadRegion = null; try { - downloadRegion = osmandRegions.getSmallestBinaryMapDataObjectAt(amenity.getLocation()).getKey(); + Map.Entry res = osmandRegions.getSmallestBinaryMapDataObjectAt(amenity.getLocation()); + if(res != null) { + downloadRegion = res.getKey(); + } } catch (IOException e) { // ignore } diff --git a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java index a815efedb4..d724e0f9ce 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java +++ b/OsmAnd/src/net/osmand/plus/helpers/AvoidSpecificRoads.java @@ -50,32 +50,44 @@ public class AvoidSpecificRoads { private OsmandApplication app; - private Map impassableRoads = new LinkedHashMap<>(); + private Map impassableRoads = new LinkedHashMap<>(); public AvoidSpecificRoads(final OsmandApplication app) { this.app = app; - for (LatLon latLon : app.getSettings().getImpassableRoadPoints()) { - impassableRoads.put(latLon, null); + for (AvoidRoadInfo avoidRoadInfo : app.getSettings().getImpassableRoadPoints()) { + impassableRoads.put(new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude), avoidRoadInfo); } } - public Map getImpassableRoads() { + public Map getImpassableRoads() { return impassableRoads; } - public void initRouteObjects() { - for (LatLon latLon : impassableRoads.keySet()) { - addImpassableRoad(null, latLon, false, true); + public void initRouteObjects(boolean force) { + for (Map.Entry entry : impassableRoads.entrySet()) { + AvoidRoadInfo roadInfo = entry.getValue(); + if (roadInfo.id != 0) { + for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { + if (force) { + builder.removeImpassableRoad(roadInfo.id); + } else { + builder.addImpassableRoad(roadInfo.id); + } + } + } + if (force || roadInfo.id == 0) { + addImpassableRoad(null, entry.getKey(), false, true, roadInfo.appModeKey); + } } } - private ArrayAdapter createAdapter(MapActivity mapActivity, boolean nightMode) { - final ArrayList points = new ArrayList<>(impassableRoads.keySet()); + private ArrayAdapter createAdapter(MapActivity mapActivity, boolean nightMode) { + final ArrayList points = new ArrayList<>(impassableRoads.values()); final LatLon mapLocation = mapActivity.getMapLocation(); final LayoutInflater inflater = UiUtilities.getInflater(mapActivity, nightMode); Context themedContext = UiUtilities.getThemedContext(mapActivity, nightMode); - return new ArrayAdapter(themedContext, R.layout.waypoint_reached, R.id.title, points) { + return new ArrayAdapter(themedContext, R.layout.waypoint_reached, R.id.title, points) { @NonNull @Override public View getView(final int position, View convertView, @NonNull ViewGroup parent) { @@ -83,12 +95,15 @@ public class AvoidSpecificRoads { if (v == null || v.findViewById(R.id.info_close) == null) { v = inflater.inflate(R.layout.waypoint_reached, parent, false); } - final LatLon item = getItem(position); + final AvoidRoadInfo item = getItem(position); v.findViewById(R.id.all_points).setVisibility(View.GONE); ((ImageView) v.findViewById(R.id.waypoint_icon)) .setImageDrawable(getIcon(R.drawable.ic_action_road_works_dark)); - ((TextView) v.findViewById(R.id.waypoint_dist)).setText(getDist(mapLocation, item)); - ((TextView) v.findViewById(R.id.waypoint_text)).setText(getText(item)); + + LatLon latLon = item != null ? new LatLon(item.latitude, item.longitude) : null; + String name = item != null ? item.name : app.getString(R.string.shared_string_road); + ((TextView) v.findViewById(R.id.waypoint_dist)).setText(getDist(mapLocation, latLon)); + ((TextView) v.findViewById(R.id.waypoint_text)).setText(name); ImageButton remove = (ImageButton) v.findViewById(R.id.info_close); remove.setVisibility(View.VISIBLE); remove.setImageDrawable(getIcon(R.drawable.ic_action_remove_dark)); @@ -117,25 +132,15 @@ public class AvoidSpecificRoads { public String getText(@Nullable LatLon point) { if (point != null) { - RouteDataObject obj = impassableRoads.get(point); - if (obj != null) { - String locale = app.getSettings().MAP_PREFERRED_LOCALE.get(); - boolean transliterate = app.getSettings().MAP_TRANSLITERATE_NAMES.get(); - String name = RoutingHelper.formatStreetName( - obj.getName(locale, transliterate), - obj.getRef(locale, transliterate, true), - obj.getDestinationName(locale, transliterate, true), - app.getString(R.string.towards) - ); - if (!TextUtils.isEmpty(name)) { - return name; - } + AvoidRoadInfo obj = impassableRoads.get(point); + if (obj != null && !TextUtils.isEmpty(obj.name)) { + return obj.name; } } return app.getString(R.string.shared_string_road); } - public String getText(@Nullable RouteDataObject obj) { + public String getRoadName(@Nullable RouteDataObject obj) { if (obj != null) { String locale = app.getSettings().MAP_PREFERRED_LOCALE.get(); boolean transliterate = app.getSettings().MAP_TRANSLITERATE_NAMES.get(); @@ -161,15 +166,15 @@ public class AvoidSpecificRoads { public void removeImpassableRoad(LatLon latLon) { app.getSettings().removeImpassableRoad(latLon); - RouteDataObject obj = impassableRoads.remove(latLon); + AvoidRoadInfo obj = impassableRoads.remove(latLon); if (obj != null) { for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { - builder.removeImpassableRoad(obj); + builder.removeImpassableRoad(obj.id); } } } - public void removeImpassableRoad(RouteDataObject obj) { + public void removeImpassableRoad(AvoidRoadInfo obj) { removeImpassableRoad(getLocation(obj)); } @@ -182,13 +187,13 @@ public class AvoidSpecificRoads { if (impassableRoads.isEmpty()) { bld.setMessage(R.string.avoid_roads_msg); } else { - final ArrayAdapter listAdapter = createAdapter(mapActivity, nightMode); + final ArrayAdapter listAdapter = createAdapter(mapActivity, nightMode); bld.setAdapter(listAdapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - LatLon point = listAdapter.getItem(which); + AvoidRoadInfo point = listAdapter.getItem(which); if (point != null) { - showOnMap(mapActivity, point.getLatitude(), point.getLongitude(), getText(point)); + showOnMap(mapActivity, point.latitude, point.longitude, point.name); } dialog.dismiss(); } @@ -210,20 +215,23 @@ public class AvoidSpecificRoads { cm.setSelectOnMap(new CallbackWithObject() { @Override public boolean processResult(LatLon result) { - addImpassableRoad(mapActivity, result, true, false); + addImpassableRoad(mapActivity, result, true, false, null); return true; } }); } public void addImpassableRoad(@Nullable final MapActivity mapActivity, - @NonNull final LatLon loc, - final boolean showDialog, - final boolean skipWritingSettings) { + @NonNull final LatLon loc, + final boolean showDialog, + final boolean skipWritingSettings, + @Nullable final String appModeKey) { final Location ll = new Location(""); ll.setLatitude(loc.getLatitude()); ll.setLongitude(loc.getLongitude()); - ApplicationMode appMode = app.getRoutingHelper().getAppMode(); + + ApplicationMode defaultAppMode = app.getRoutingHelper().getAppMode(); + final ApplicationMode appMode = appModeKey != null ? ApplicationMode.valueOfStringKey(appModeKey, defaultAppMode) : defaultAppMode; List roads = app.getRoutingHelper().getRoute().getOriginalRoute(); if (mapActivity != null && roads != null) { @@ -236,9 +244,12 @@ public class AvoidSpecificRoads { LatLon newLoc = new LatLon(MapUtils.get31LatitudeY((int) point.y), MapUtils.get31LongitudeX((int) point.x)); ll.setLatitude(newLoc.getLatitude()); ll.setLongitude(newLoc.getLongitude()); - addImpassableRoadInternal(roads.get(searchResult.getRoadIndex()).getObject(), ll, showDialog, mapActivity, newLoc); + + RouteDataObject object = roads.get(searchResult.getRoadIndex()).getObject(); + AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(object, newLoc.getLatitude(), newLoc.getLongitude(), appMode.getStringKey()); + addImpassableRoadInternal(avoidRoadInfo, showDialog, mapActivity, newLoc); if (!skipWritingSettings) { - app.getSettings().addImpassableRoad(newLoc.getLatitude(), newLoc.getLongitude()); + app.getSettings().addImpassableRoad(avoidRoadInfo); } return; } @@ -252,7 +263,8 @@ public class AvoidSpecificRoads { Toast.makeText(mapActivity, R.string.error_avoid_specific_road, Toast.LENGTH_LONG).show(); } } else { - addImpassableRoadInternal(object, ll, showDialog, mapActivity, loc); + AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(object, ll.getLatitude(), ll.getLongitude(), appMode.getStringKey()); + addImpassableRoadInternal(avoidRoadInfo, showDialog, mapActivity, loc); } return true; } @@ -264,19 +276,22 @@ public class AvoidSpecificRoads { }); if (!skipWritingSettings) { - app.getSettings().addImpassableRoad(loc.getLatitude(), loc.getLongitude()); + AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(null, loc.getLatitude(), loc.getLongitude(), appMode.getStringKey()); + app.getSettings().addImpassableRoad(avoidRoadInfo); } } public void replaceImpassableRoad(final MapActivity activity, - final RouteDataObject currentObject, + final AvoidRoadInfo currentObject, final LatLon newLoc, final boolean showDialog, final AvoidSpecificRoadsCallback callback) { final Location ll = new Location(""); ll.setLatitude(newLoc.getLatitude()); ll.setLongitude(newLoc.getLongitude()); - ApplicationMode appMode = app.getRoutingHelper().getAppMode(); + + ApplicationMode defaultAppMode = app.getRoutingHelper().getAppMode(); + final ApplicationMode appMode = ApplicationMode.valueOfStringKey(currentObject.appModeKey, defaultAppMode); app.getLocationProvider().getRouteSegment(ll, appMode, false, new ResultMatcher() { @@ -292,12 +307,13 @@ public class AvoidSpecificRoads { app.getSettings().moveImpassableRoad(oldLoc, newLoc); impassableRoads.remove(oldLoc); for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { - builder.removeImpassableRoad(currentObject); + builder.removeImpassableRoad(currentObject.id); } - addImpassableRoadInternal(object, ll, showDialog, activity, newLoc); + AvoidRoadInfo avoidRoadInfo = getAvoidRoadInfoForDataObject(object, newLoc.getLatitude(), newLoc.getLongitude(), appMode.getStringKey()); + addImpassableRoadInternal(avoidRoadInfo, showDialog, activity, newLoc); if (callback != null) { - callback.onAddImpassableRoad(true, object); + callback.onAddImpassableRoad(true, avoidRoadInfo); } } return true; @@ -310,19 +326,19 @@ public class AvoidSpecificRoads { }); } - private void addImpassableRoadInternal(@NonNull RouteDataObject object, - @NonNull Location ll, + private void addImpassableRoadInternal(@NonNull AvoidRoadInfo avoidRoadInfo, boolean showDialog, @Nullable MapActivity activity, @NonNull LatLon loc) { boolean roadAdded = false; for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { - roadAdded |= builder.addImpassableRoad(object, ll); + roadAdded |= builder.addImpassableRoad(avoidRoadInfo.id); } if (roadAdded) { - impassableRoads.put(loc, object); + app.getSettings().updateImpassableRoadInfo(avoidRoadInfo); + impassableRoads.put(loc, avoidRoadInfo); } else { - LatLon location = getLocation(object); + LatLon location = getLocation(avoidRoadInfo); if (location != null) { app.getSettings().removeImpassableRoad(location); } @@ -347,21 +363,40 @@ public class AvoidSpecificRoads { MapActivity.launchMapActivityMoveToTop(ctx); } - public LatLon getLocation(RouteDataObject object) { - Location location = null; + public LatLon getLocation(AvoidRoadInfo avoidRoadInfo) { for (RoutingConfiguration.Builder builder : app.getAllRoutingConfigs()) { - location = builder.getImpassableRoadLocations().get(object.getId()); - if (location != null) { - break; + if (builder.getImpassableRoadLocations().contains(avoidRoadInfo.id)) { + return new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude); } } - return location == null ? null : new LatLon(location.getLatitude(), location.getLongitude()); + return null; } public interface AvoidSpecificRoadsCallback { - void onAddImpassableRoad(boolean success, RouteDataObject newObject); + void onAddImpassableRoad(boolean success, AvoidRoadInfo avoidRoadInfo); boolean isCancelled(); } -} + + private AvoidRoadInfo getAvoidRoadInfoForDataObject(@Nullable RouteDataObject object, double lat, double lon, String appModeKey) { + AvoidRoadInfo avoidRoadInfo = impassableRoads.get(new LatLon(lat, lon)); + if (avoidRoadInfo == null) { + avoidRoadInfo = new AvoidRoadInfo(); + } + avoidRoadInfo.id = object != null ? object.id : 0; + avoidRoadInfo.latitude = lat; + avoidRoadInfo.longitude = lon; + avoidRoadInfo.appModeKey = appModeKey; + avoidRoadInfo.name = getRoadName(object); + return avoidRoadInfo; + } + + public static class AvoidRoadInfo { + public long id; + public double latitude; + public double longitude; + public String name; + public String appModeKey; + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java index 00012480a1..8d25fae1bb 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java @@ -22,7 +22,6 @@ import net.osmand.PlatformUtil; import net.osmand.aidl.AidlMapPointWrapper; import net.osmand.binary.BinaryMapDataObject; import net.osmand.binary.BinaryMapIndexReader.TagValuePair; -import net.osmand.binary.RouteDataObject; import net.osmand.data.Amenity; import net.osmand.data.FavouritePoint; import net.osmand.data.LatLon; @@ -45,6 +44,7 @@ import net.osmand.plus.download.DownloadActivityType; import net.osmand.plus.download.DownloadIndexesThread; import net.osmand.plus.download.DownloadValidationManager; import net.osmand.plus.download.IndexItem; +import net.osmand.plus.helpers.AvoidSpecificRoads; import net.osmand.plus.helpers.SearchHistoryHelper; import net.osmand.plus.mapcontextmenu.MenuBuilder.CollapsableView; import net.osmand.plus.mapcontextmenu.MenuBuilder.CollapseExpandListener; @@ -220,8 +220,8 @@ public abstract class MenuController extends BaseMenuController implements Colla } else if (pointDescription.isMyLocation()) { menuController = new MyLocationMenuController(mapActivity, pointDescription); } - } else if (object instanceof RouteDataObject) { - menuController = new ImpassibleRoadsMenuController(mapActivity, pointDescription, (RouteDataObject) object); + } else if (object instanceof AvoidSpecificRoads.AvoidRoadInfo) { + menuController = new ImpassibleRoadsMenuController(mapActivity, pointDescription, (AvoidSpecificRoads.AvoidRoadInfo) object); } else if (object instanceof RenderedObject) { menuController = new RenderedObjectMenuController(mapActivity, pointDescription, (RenderedObject) object); } else if (object instanceof MapillaryImage) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/ImpassibleRoadsMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/ImpassibleRoadsMenuController.java index 5a48de2998..7c78eeface 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/ImpassibleRoadsMenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/ImpassibleRoadsMenuController.java @@ -4,24 +4,24 @@ import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; -import net.osmand.binary.RouteDataObject; import net.osmand.data.PointDescription; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo; import net.osmand.plus.mapcontextmenu.MenuBuilder; import net.osmand.plus.mapcontextmenu.MenuController; import net.osmand.plus.routing.RoutingHelper; public class ImpassibleRoadsMenuController extends MenuController { - private RouteDataObject route; + private AvoidRoadInfo avoidRoadInfo; public ImpassibleRoadsMenuController(@NonNull MapActivity mapActivity, @NonNull PointDescription pointDescription, - @NonNull RouteDataObject route) { + @NonNull AvoidRoadInfo avoidRoadInfo) { super(new MenuBuilder(mapActivity), pointDescription, mapActivity); - this.route = route; + this.avoidRoadInfo = avoidRoadInfo; final OsmandApplication app = mapActivity.getMyApplication(); leftTitleButtonController = new TitleButtonController() { @Override @@ -29,7 +29,7 @@ public class ImpassibleRoadsMenuController extends MenuController { MapActivity activity = getMapActivity(); if (activity != null) { app.getAvoidSpecificRoads().removeImpassableRoad( - ImpassibleRoadsMenuController.this.route); + ImpassibleRoadsMenuController.this.avoidRoadInfo); RoutingHelper rh = app.getRoutingHelper(); if (rh.isRouteCalculated() || rh.isRouteBeingCalculated()) { rh.recalculateRouteDueToSettingsChange(); @@ -44,12 +44,12 @@ public class ImpassibleRoadsMenuController extends MenuController { @Override protected void setObject(Object object) { - route = (RouteDataObject) object; + avoidRoadInfo = (AvoidRoadInfo) object; } @Override protected Object getObject() { - return route; + return avoidRoadInfo; } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/PointDescriptionMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/PointDescriptionMenuController.java index 1db5444bc4..c810aa2ce8 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/PointDescriptionMenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/PointDescriptionMenuController.java @@ -33,7 +33,7 @@ public class PointDescriptionMenuController extends MenuController { MapActivity activity = getMapActivity(); if (activity != null) { AvoidSpecificRoads roads = activity.getMyApplication().getAvoidSpecificRoads(); - roads.addImpassableRoad(activity, getLatLon(), false, false); + roads.addImpassableRoad(activity, getLatLon(), false, false, null); } } }; diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index acaceda8a7..3ed13c1ffd 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -65,6 +65,7 @@ import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; import net.osmand.plus.Version; import net.osmand.plus.activities.SavingTrackHelper; import net.osmand.plus.activities.TrackActivity; @@ -1092,7 +1093,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm startActivity(intent); } }); - AndroidUtils.setSnackbarTextColor(snackbar, R.color.active_color_primary_dark); + UiUtilities.setupSnackbar(snackbar, !lightTheme); snackbar.show(); } }; @@ -1119,7 +1120,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm adapter.notifyDataSetChanged(); } }); - AndroidUtils.setSnackbarTextColor(snackbar, R.color.active_color_primary_dark); + UiUtilities.setupSnackbar(snackbar, !lightTheme); snackbar.show(); } diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java index ff628d377e..0caa56c355 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java @@ -33,6 +33,7 @@ import net.osmand.plus.MapMarkersHelper.OnGroupSyncedListener; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.TrackActivity; import net.osmand.plus.mapmarkers.CoordinateInputDialogFragment.OnPointsSavedListener; @@ -449,7 +450,7 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm } } }); - AndroidUtils.setSnackbarTextColor(snackbar, R.color.active_color_primary_dark); + UiUtilities.setupSnackbar(snackbar, !lightTheme); snackbar.show(); } } @@ -494,7 +495,7 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm startActivity(intent); } }); - AndroidUtils.setSnackbarTextColor(snackbar, R.color.active_color_primary_dark); + UiUtilities.setupSnackbar(snackbar, !lightTheme); snackbar.show(); } }; diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersGroupsFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersGroupsFragment.java index 1ed6666726..f176c016c2 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersGroupsFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersGroupsFragment.java @@ -207,7 +207,7 @@ public class MapMarkersGroupsFragment extends Fragment implements OsmAndCompassL updateAdapter(); } }); - AndroidUtils.setSnackbarTextColor(snackbar, R.color.active_color_primary_dark); + UiUtilities.setupSnackbar(snackbar, night); snackbar.show(); } } diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java index 260efd704d..5729e38bbf 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java @@ -171,8 +171,7 @@ public class MapMarkersHistoryFragment extends Fragment implements MapMarkersHel } } }); - AndroidUtils.setSnackbarTextColor(snackbar, night ? R.color.active_color_primary_dark : R.color.active_color_primary_light); - snackbar.getView().setBackgroundColor(ContextCompat.getColor(app, night ? R.color.list_background_color_dark : R.color.list_background_color_light)); + UiUtilities.setupSnackbar(snackbar, night); snackbar.show(); } } diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/SelectWptCategoriesBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/SelectWptCategoriesBottomSheetDialogFragment.java index df26ab2561..83f23ac7e9 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/SelectWptCategoriesBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/SelectWptCategoriesBottomSheetDialogFragment.java @@ -48,6 +48,7 @@ public class SelectWptCategoriesBottomSheetDialogFragment extends MenuBottomShee if (gpxFile == null) { return; } + int activeColorResId = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light; isUpdateMode = getArguments().getBoolean(UPDATE_CATEGORIES_KEY); List categories = getArguments().getStringArrayList(ACTIVE_CATEGORIES_KEY); @@ -58,6 +59,7 @@ public class SelectWptCategoriesBottomSheetDialogFragment extends MenuBottomShee final BottomSheetItemWithCompoundButton[] selectAllItem = new BottomSheetItemWithCompoundButton[1]; selectAllItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() .setChecked(!isUpdateMode || categories!=null&&categories.size() == gpxFile.getPointsByCategories().size()) + .setCompoundButtonColorId(activeColorResId) .setDescription(getString(R.string.shared_string_total) + ": " + gpxFile.getPoints().size()) .setIcon(getContentIcon(R.drawable.ic_action_group_select_all)) .setTitle(getString(R.string.shared_string_select_all)) @@ -93,6 +95,7 @@ public class SelectWptCategoriesBottomSheetDialogFragment extends MenuBottomShee } } }) + .setCompoundButtonColorId(activeColorResId) .setDescription(String.valueOf(pointsByCategories.get(category).size())) .setIcon(getContentIcon(R.drawable.ic_action_folder)) .setTitle(category.equals("") ? getString(R.string.shared_string_waypoints) : category) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersActiveAdapter.java b/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersActiveAdapter.java index 37c41b14cd..3d487e3831 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersActiveAdapter.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersActiveAdapter.java @@ -74,6 +74,7 @@ public class MapMarkersActiveAdapter extends RecyclerView.Adapter impassableRoads = new TreeMap<>(); + Map impassableRoads = new HashMap<>(); if (parameter instanceof AvoidRoadsRoutingParameter) { impassableRoads = app.getAvoidSpecificRoads().getImpassableRoads(); } @@ -1232,22 +1232,19 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener return avoidedParameters; } - private void createImpassableRoadsItems(MapActivity mapActivity, Map impassableRoads, final LocalRoutingParameter parameter, final RouteMenuAppModes mode, final LinearLayout item) { - OsmandApplication app = mapActivity.getMyApplication(); - Iterator it = impassableRoads.values().iterator(); + private void createImpassableRoadsItems(MapActivity mapActivity, Map impassableRoads, + final LocalRoutingParameter parameter, final RouteMenuAppModes mode, final LinearLayout item) { + Iterator it = impassableRoads.values().iterator(); while (it.hasNext()) { - final RouteDataObject routeDataObject = it.next(); - final View container = createToolbarSubOptionView(false, app.getAvoidSpecificRoads().getText(routeDataObject), R.drawable.ic_action_remove_dark, !it.hasNext(), new OnClickListener() { + final AvoidRoadInfo avoidRoadInfo = it.next(); + final View container = createToolbarSubOptionView(false, avoidRoadInfo.name, R.drawable.ic_action_remove_dark, !it.hasNext(), new OnClickListener() { @Override public void onClick(View v) { MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { OsmandApplication app = mapActivity.getMyApplication(); - RoutingHelper routingHelper = app.getRoutingHelper(); - if (routeDataObject != null) { - app.getAvoidSpecificRoads().removeImpassableRoad(routeDataObject); - } - routingHelper.recalculateRouteDueToSettingsChange(); + app.getAvoidSpecificRoads().removeImpassableRoad(avoidRoadInfo); + app.getRoutingHelper().recalculateRouteDueToSettingsChange(); if (app.getAvoidSpecificRoads().getImpassableRoads().isEmpty() && getAvoidedParameters(app).isEmpty()) { mode.parameters.remove(parameter); } diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java index b7771fcf14..d31cc6dc2f 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java @@ -430,7 +430,13 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { boolean osmandRouter = applicationMode.getRouteService() == RouteProvider.RouteService.OSMAND; if (!osmandRouter) { - routingParameters = AppModeOptions.OTHER.routingParameters; + if (applicationMode.getRouteService() == RouteProvider.RouteService.STRAIGHT) { + routingParameters = AppModeOptions.STRAIGHT.routingParameters; + } else if (applicationMode.getRouteService() == RouteProvider.RouteService.DIRECT_TO) { + routingParameters = AppModeOptions.DIRECT_TO.routingParameters; + } else { + routingParameters = AppModeOptions.OTHER.routingParameters; + } } else if (applicationMode.isDerivedRoutingFrom(ApplicationMode.CAR)) { routingParameters = AppModeOptions.CAR.routingParameters; } else if (applicationMode.isDerivedRoutingFrom(ApplicationMode.BICYCLE)) { @@ -579,6 +585,22 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { DividerItem.KEY, GpxLocalRoutingParameter.KEY, OtherSettingsRoutingParameter.KEY, + RouteSimulationItem.KEY), + + STRAIGHT(MuteSoundRoutingParameter.KEY, + DividerItem.KEY, + ShowAlongTheRouteItem.KEY, + DividerItem.KEY, + GpxLocalRoutingParameter.KEY, + OtherSettingsRoutingParameter.KEY, + RouteSimulationItem.KEY), + + DIRECT_TO(MuteSoundRoutingParameter.KEY, + DividerItem.KEY, + ShowAlongTheRouteItem.KEY, + DividerItem.KEY, + GpxLocalRoutingParameter.KEY, + OtherSettingsRoutingParameter.KEY, RouteSimulationItem.KEY); diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java index 94a56369d3..7b2569b2ae 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java @@ -1037,10 +1037,7 @@ public class RouteCalculationResult { nextInd++; } } - int dist = getListDistance(currentRoute); - if (fromLoc != null) { - dist += fromLoc.distanceTo(locations.get(currentRoute)); - } + int dist = getDistanceToFinish(fromLoc); if (nextInd < directions.size()) { info.directionInfo = directions.get(nextInd); if (directions.get(nextInd).routePointOffset <= currentRoute @@ -1156,16 +1153,28 @@ public class RouteCalculationResult { } return 0; } + + public int getDistanceFromPoint(int locationIndex) { + if(listDistance != null && locationIndex < listDistance.length) { + return listDistance[locationIndex]; + } + return 0; + } public boolean isPointPassed(int locationIndex) { return locationIndex <= currentRoute; } public int getDistanceToFinish(Location fromLoc) { - if(listDistance != null && currentRoute < listDistance.length){ - int dist = listDistance[currentRoute]; - Location l = locations.get(currentRoute); - if(fromLoc != null){ + Location ap = this.currentStraightAnglePoint; + int rp = currentStraightAngleRoute > currentRoute ? currentStraightAngleRoute : currentRoute; + if(listDistance != null && rp < listDistance.length){ + int dist = listDistance[rp]; + Location l = locations.get(rp); + if(ap != null){ + dist += fromLoc.distanceTo(ap); + dist += ap.distanceTo(l); + } else { dist += fromLoc.distanceTo(l); } return dist; @@ -1174,12 +1183,8 @@ public class RouteCalculationResult { } public int getDistanceToNextIntermediate(Location fromLoc) { + int dist = getDistanceToFinish(fromLoc); if(listDistance != null && currentRoute < listDistance.length){ - int dist = listDistance[currentRoute]; - Location l = locations.get(currentRoute); - if(fromLoc != null){ - dist += fromLoc.distanceTo(l); - } if(nextIntermediate >= intermediatePoints.length ){ return 0; } else { @@ -1245,8 +1250,8 @@ public class RouteCalculationResult { } public void updateNextVisiblePoint(int nextPoint, Location mp) { - currentStraightAngleRoute = nextPoint; currentStraightAnglePoint = mp; + currentStraightAngleRoute = nextPoint; } public static class NextDirectionInfo { diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index 530811c812..fa17d2e473 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -1240,29 +1240,35 @@ public class RouteProvider { } private RouteCalculationResult findStraightRoute(RouteCalculationParams params) { - Location currentLocation = params.currentLocation; LinkedList points = new LinkedList<>(); List segments = new ArrayList<>(); - points.add(params.start); + points.add(new Location("pnt", params.start.getLatitude(), params.start.getLongitude())); if(params.intermediates != null) { for (LatLon l : params.intermediates) { - points.add(new Location("", l.getLatitude(), l.getLongitude())); + points.add(new Location("pnt", l.getLatitude(), l.getLongitude())); } } points.add(new Location("", params.end.getLatitude(), params.end.getLongitude())); - Location lastAdded = points.poll(); - segments.add(lastAdded); + Location lastAdded = null; + float speed = params.mode.getDefaultSpeed(); + List computeDirections = new ArrayList(); while(!points.isEmpty()) { Location pl = points.peek(); - if (lastAdded.distanceTo(pl) < MIN_STRAIGHT_DIST) { + if (lastAdded == null || lastAdded.distanceTo(pl) < MIN_STRAIGHT_DIST) { lastAdded = points.poll(); + if(lastAdded.getProvider().equals("pnt")) { + RouteDirectionInfo previousInfo = new RouteDirectionInfo(speed, TurnType.straight()); + previousInfo.routePointOffset = segments.size(); + previousInfo.setDescriptionRoute(params.ctx.getString(R.string.route_head)); + computeDirections.add(previousInfo); + } segments.add(lastAdded); } else { Location mp = MapUtils.calculateMidPoint(lastAdded, pl); points.add(0, mp); } } - return new RouteCalculationResult(segments, null, params, null, false); + return new RouteCalculationResult(segments, computeDirections, params, null, false); } diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 10ededaa3a..7ff55f74c5 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -430,7 +430,6 @@ public class RoutingHelper { // 0. Route empty or needs to be extended? Then re-calculate route. if(route.isEmpty()) { calculateRoute = true; - //originalRoute = null; } else { // 1. Update current route position status according to latest received location boolean finished = updateCurrentRouteStatus(currentLocation, posTolerance); diff --git a/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java index 646f1288c9..08b5250849 100644 --- a/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/BaseSettingsFragment.java @@ -813,8 +813,7 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl public static String getAppModeDescription(Context ctx, ApplicationMode mode) { String description; if (mode.isCustomProfile()) { - description = String.format(ctx.getString(R.string.profile_type_descr_string), - Algorithms.capitalizeFirstLetterAndLowercase(mode.getParent().toHumanString())); + description = ctx.getString(R.string.profile_type_custom_string); } else { description = ctx.getString(R.string.profile_type_base_string); } diff --git a/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java index 24229c2680..61f2f99de1 100644 --- a/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/ProfileAppearanceFragment.java @@ -156,9 +156,13 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment { protected void createToolbar(LayoutInflater inflater, View view) { super.createToolbar(inflater, view); if (isNewProfile) { + TextView toolbarTitle = (TextView) view.findViewById(R.id.toolbar_title); + if (toolbarTitle != null) { + toolbarTitle.setText(getString(R.string.new_profile)); + } TextView toolbarSubtitle = (TextView) view.findViewById(R.id.toolbar_subtitle); if (toolbarSubtitle != null) { - toolbarSubtitle.setText(getString(R.string.new_profile)); + toolbarSubtitle.setVisibility(View.GONE); } } } @@ -366,8 +370,8 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment { Bundle bundle = new Bundle(); fragment.setUsedOnMap(false); fragment.setAppMode(getSelectedAppMode()); - if (getSelectedAppMode() != null) { - bundle.putString(SELECTED_KEY, getSelectedAppMode().getRoutingProfile()); + if (changedProfile.parent != null) { + bundle.putString(SELECTED_KEY, changedProfile.parent.getStringKey()); } bundle.putString(DIALOG_TYPE, TYPE_BASE_APP_PROFILE); fragment.setArguments(bundle); diff --git a/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java index 99aac76ca8..ee1b308c39 100644 --- a/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java @@ -1,14 +1,23 @@ package net.osmand.plus.settings; +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.support.v4.content.ContextCompat; +import android.support.v7.app.AlertDialog; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.PreferenceViewHolder; +import android.view.LayoutInflater; +import android.view.View; import android.widget.ImageView; +import android.widget.SeekBar; +import android.widget.TextView; +import net.osmand.GPXUtilities; import net.osmand.Location; import net.osmand.StateChangedListener; import net.osmand.plus.ApplicationMode; @@ -17,6 +26,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings.BooleanPreference; import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.SettingsBaseActivity; import net.osmand.plus.activities.SettingsNavigationActivity; import net.osmand.plus.routing.RouteProvider; @@ -83,7 +93,6 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP routeParametersInfo.setTitle(getString(R.string.route_parameters_info, getSelectedAppMode().toHumanString())); setupRoutingPrefs(); - setupTimeConditionalRoutingPref(); } @Override @@ -131,21 +140,19 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP } PreferenceScreen screen = getPreferenceScreen(); + ApplicationMode am = getSelectedAppMode(); + SwitchPreferenceEx fastRoute = createSwitchPreferenceEx(app.getSettings().FAST_ROUTE_MODE.getId(), R.string.fast_route_mode, R.layout.preference_with_descr_dialog_and_switch); fastRoute.setIcon(getRoutingPrefIcon(app.getSettings().FAST_ROUTE_MODE.getId())); fastRoute.setDescription(getString(R.string.fast_route_mode_descr)); fastRoute.setSummaryOn(R.string.shared_string_on); fastRoute.setSummaryOff(R.string.shared_string_off); - - ApplicationMode am = getSelectedAppMode(); float defaultAllowedDeviation = RoutingHelper.getDefaultAllowedDeviation(settings, am, RoutingHelper.getPosTolerance(0)); - if (am.getRouteService() != RouteProvider.RouteService.OSMAND) { - screen.addPreference(fastRoute); - setupSelectRouteRecalcDistance(screen, defaultAllowedDeviation); - } else { - setupSelectRouteRecalcDistance(screen, defaultAllowedDeviation); + setupSelectRouteRecalcDistance(screen, defaultAllowedDeviation); + + if (am.getRouteService() == RouteProvider.RouteService.OSMAND){ GeneralRouter router = app.getRouter(am); clearParameters(); if (router != null) { @@ -231,9 +238,87 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP } } } + setupTimeConditionalRoutingPref(); + } else if (am.getRouteService() == RouteProvider.RouteService.BROUTER) { + screen.addPreference(fastRoute); + setupTimeConditionalRoutingPref(); + } else if (am.getRouteService() == RouteProvider.RouteService.STRAIGHT) { + Preference straightAngle = new Preference(app.getApplicationContext()); + straightAngle.setPersistent(false); + straightAngle.setKey(settings.ROUTE_STRAIGHT_ANGLE.getId()); + straightAngle.setTitle(getString(R.string.recalc_angle_dialog_title)); + straightAngle.setSummary(String.format(getString(R.string.shared_string_angle_param), (int) am.getStrAngle())); + straightAngle.setLayoutResource(R.layout.preference_with_descr); + straightAngle.setIcon(getRoutingPrefIcon("routing_recalc_distance")); //TODO change for appropriate icon when available + getPreferenceScreen().addPreference(straightAngle); } } + @Override + public boolean onPreferenceClick(Preference preference) { + if (preference.getKey().equals(settings.ROUTE_STRAIGHT_ANGLE.getId())) { + showSeekbarSettingsDialog(getActivity(), getSelectedAppMode()); + } + return super.onPreferenceClick(preference); + } + + private void showSeekbarSettingsDialog(Activity activity, final ApplicationMode mode) { + if (activity == null || mode == null) { + return; + } + final OsmandApplication app = (OsmandApplication) activity.getApplication(); + final float[] angleValue = new float[] {mode.getStrAngle()}; + boolean nightMode = !app.getSettings().isLightContentForMode(mode); + Context themedContext = UiUtilities.getThemedContext(activity, nightMode); + AlertDialog.Builder builder = new AlertDialog.Builder(themedContext); + View seekbarView = LayoutInflater.from(themedContext).inflate(R.layout.recalculation_angle_dialog, null, false); + builder.setView(seekbarView); + builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + mode.setStrAngle(angleValue[0]); + updateAllSettings(); + RoutingHelper routingHelper = app.getRoutingHelper(); + if (mode.equals(routingHelper.getAppMode()) && (routingHelper.isRouteCalculated() || routingHelper.isRouteBeingCalculated())) { + routingHelper.recalculateRouteDueToSettingsChange(); + } + } + }); + builder.setNegativeButton(R.string.shared_string_cancel, null); + + int selectedModeColor = ContextCompat.getColor(app, mode.getIconColorInfo().getColor(nightMode)); + setupAngleSlider(angleValue, seekbarView, nightMode, selectedModeColor); + builder.show(); + } + + private static void setupAngleSlider(final float[] angleValue, + View seekbarView, + final boolean nightMode, + final int activeColor) { + + final SeekBar angleBar = seekbarView.findViewById(R.id.angle_seekbar); + final TextView angleTv = seekbarView.findViewById(R.id.angle_text); + + angleTv.setText(String.valueOf(angleValue[0])); + angleBar.setProgress((int) angleValue[0]); + angleBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + int value = progress - (progress % 5); + angleValue[0] = value; + angleTv.setText(String.valueOf(value)); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) {} + + @Override + public void onStopTrackingTouch(SeekBar seekBar) {} + }); + UiUtilities.setupSeekBar(angleBar, activeColor, nightMode); + } + private void setupSelectRouteRecalcDistance(PreferenceScreen screen, float defaultAllowedDeviation) { Float[] entryValues; OsmandSettings settings = app.getSettings(); diff --git a/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java b/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java index b87c36a30e..f9a23bc7d3 100644 --- a/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/DownloadedRegionsLayer.java @@ -251,12 +251,12 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe if (app.getSettings().SHOW_DOWNLOAD_MAP_DIALOG.get() && zoom >= ZOOM_MIN_TO_SHOW_DOWNLOAD_DIALOG && zoom <= ZOOM_MAX_TO_SHOW_DOWNLOAD_DIALOG && currentObjects != null) { - WorldRegion regionData; + Map selectedObjects = new LinkedHashMap<>(); for (int i = 0; i < currentObjects.size(); i++) { final BinaryMapDataObject o = currentObjects.get(i); String fullName = osmandRegions.getFullName(o); - regionData = osmandRegions.getRegionData(fullName); + WorldRegion regionData = osmandRegions.getRegionData(fullName); if (regionData != null && regionData.isRegionMapDownload()) { String regionDownloadName = regionData.getRegionDownloadName(); if (regionDownloadName != null) { @@ -272,8 +272,9 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe IndexItem indexItem = null; String name = null; - regionData = app.getRegions().getSmallestBinaryMapDataObjectAt(selectedObjects).getKey(); - if (regionData != null) { + Map.Entry res = app.getRegions().getSmallestBinaryMapDataObjectAt(selectedObjects); + if (res != null && res.getKey() != null) { + WorldRegion regionData = res.getKey(); DownloadIndexesThread downloadThread = app.getDownloadThread(); List indexItems = downloadThread.getIndexes().getIndexItems(regionData); if (indexItems.size() == 0) { diff --git a/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java b/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java index 7bef99b217..1ab8daa1e6 100644 --- a/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/ImpassableRoadsLayer.java @@ -10,7 +10,6 @@ import android.graphics.PointF; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import net.osmand.binary.RouteDataObject; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; import net.osmand.data.RotatedTileBox; @@ -18,6 +17,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.helpers.AvoidSpecificRoads; +import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo; import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidSpecificRoadsCallback; import net.osmand.plus.views.ContextMenuLayer.ApplyMovedObjectCallback; @@ -55,7 +55,7 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements @Override public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { - if (contextMenuLayer.getMoveableObject() instanceof RouteDataObject) { + if (contextMenuLayer.getMoveableObject() instanceof AvoidRoadInfo) { PointF pf = contextMenuLayer.getMovableCenterPoint(tileBox); drawPoint(canvas, pf.x, pf.y, true); } @@ -64,11 +64,11 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { if (tileBox.getZoom() >= START_ZOOM) { - for (Map.Entry entry : avoidSpecificRoads.getImpassableRoads().entrySet()) { + for (Map.Entry entry : avoidSpecificRoads.getImpassableRoads().entrySet()) { LatLon location = entry.getKey(); - RouteDataObject road = entry.getValue(); - if (road != null && contextMenuLayer.getMoveableObject() instanceof RouteDataObject) { - RouteDataObject object = (RouteDataObject) contextMenuLayer.getMoveableObject(); + AvoidRoadInfo road = entry.getValue(); + if (road != null && contextMenuLayer.getMoveableObject() instanceof AvoidRoadInfo) { + AvoidRoadInfo object = (AvoidRoadInfo) contextMenuLayer.getMoveableObject(); if (object.id == road.id) { continue; } @@ -146,9 +146,9 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements int compare = getRadiusPoi(tileBox); int radius = compare * 3 / 2; - for (Map.Entry entry : avoidSpecificRoads.getImpassableRoads().entrySet()) { + for (Map.Entry entry : avoidSpecificRoads.getImpassableRoads().entrySet()) { LatLon location = entry.getKey(); - RouteDataObject road = entry.getValue(); + AvoidRoadInfo road = entry.getValue(); if (location != null && road != null) { int x = (int) tileBox.getPixXFromLatLon(location.getLatitude(), location.getLongitude()); int y = (int) tileBox.getPixYFromLatLon(location.getLatitude(), location.getLongitude()); @@ -163,36 +163,37 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements @Override public LatLon getObjectLocation(Object o) { - if (o instanceof RouteDataObject) { - return avoidSpecificRoads.getLocation((RouteDataObject) o); + if (o instanceof AvoidRoadInfo) { + AvoidRoadInfo avoidRoadInfo = (AvoidRoadInfo) o; + return new LatLon(avoidRoadInfo.latitude, avoidRoadInfo.longitude); } return null; } @Override public PointDescription getObjectName(Object o) { - if (o instanceof RouteDataObject) { - RouteDataObject route = (RouteDataObject) o; - return new PointDescription(PointDescription.POINT_TYPE_BLOCKED_ROAD, route.getName()); + if (o instanceof AvoidRoadInfo) { + AvoidRoadInfo route = (AvoidRoadInfo) o; + return new PointDescription(PointDescription.POINT_TYPE_BLOCKED_ROAD, route.name); } return null; } @Override public boolean isObjectMovable(Object o) { - return o instanceof RouteDataObject; + return o instanceof AvoidRoadInfo; } @Override public void applyNewObjectPosition(@NonNull Object o, @NonNull LatLon position, @Nullable final ApplyMovedObjectCallback callback) { - if (o instanceof RouteDataObject) { - final RouteDataObject object = (RouteDataObject) o; + if (o instanceof AvoidRoadInfo) { + final AvoidRoadInfo object = (AvoidRoadInfo) o; final OsmandApplication application = activity.getMyApplication(); application.getAvoidSpecificRoads().replaceImpassableRoad(activity, object, position, false, new AvoidSpecificRoadsCallback() { @Override - public void onAddImpassableRoad(boolean success, RouteDataObject newObject) { + public void onAddImpassableRoad(boolean success, AvoidRoadInfo newObject) { if (callback != null) { callback.onApplyMovedObject(success, newObject); } diff --git a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java index 874696db07..3996cbde5c 100644 --- a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java @@ -35,6 +35,7 @@ import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu; import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu.TrackChartPoints; +import net.osmand.plus.profiles.LocationIcon; import net.osmand.plus.render.RenderingIcons; import net.osmand.plus.routing.RouteCalculationResult; import net.osmand.plus.routing.RouteDirectionInfo; @@ -319,7 +320,8 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont private void drawProjectionPoint(Canvas canvas, double[] projectionXY) { if (projectionIcon == null) { - projectionIcon = (LayerDrawable) view.getResources().getDrawable(helper.getSettings().getApplicationMode().getLocationIcon().getIconId()); + helper.getSettings().getApplicationMode().getLocationIcon(); + projectionIcon = (LayerDrawable) view.getResources().getDrawable(LocationIcon.DEFAULT.getIconId()); } int locationX = (int) projectionXY[0]; int locationY = (int) projectionXY[1]; @@ -1146,45 +1148,39 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont } private double[] calculateProjectionOnRoutePoint(List routeNodes, RoutingHelper helper, RotatedTileBox box) { - double[] projectionXY; - boolean visible; - Location previousInRoute = null; - Location nextInRoute = null; - //need to change this code by fixing helper.route.getCurrentRoute() miscalculation - // TODO simplifiy all culation! - if (helper.getRoute().getIntermediatePointsToPass() > 0) { - for (int i = 1; i < routeNodes.size(); i++) { - LatLon routePoint = new LatLon(routeNodes.get(i).getLatitude(), routeNodes.get(i).getLongitude()); - if (routePoint.equals(helper.getIntermediatePoints().get(0))) { - previousInRoute = routeNodes.get(i - 1); - nextInRoute = routeNodes.get(i); - } - } - } else { - previousInRoute = routeNodes.get(routeNodes.size() - 2); - nextInRoute = routeNodes.get(routeNodes.size() - 1); + double[] projectionXY = null; + Location ll = helper.getLastFixedLocation(); + RouteCalculationResult route = helper.getRoute(); + List locs = route.getImmutableAllLocations(); + int cr = route.getCurrentRoute(); + int locIndex = locs.size() - 1; + if(route.getIntermediatePointsToPass() > 0) { + locIndex = route.getIndexOfIntermediate(route.getIntermediatePointsToPass() - 1); } + if(ll != null && cr > 0 && cr < locs.size() && locIndex >= 0 && locIndex < locs.size()) { + Location loc1 = locs.get(cr - 1); + Location loc2 = locs.get(cr); + double distLeft = route.getDistanceFromPoint(cr) - route.getDistanceFromPoint(locIndex); + double baDist = route.getDistanceFromPoint(cr - 1) - route.getDistanceFromPoint(cr); + Location target = locs.get(locIndex); + double dTarget = ll.distanceTo(target); + final int aX = box.getPixXFromLonNoRot(loc1.getLongitude()); + final int aY = box.getPixYFromLatNoRot(loc1.getLatitude()); + final int bX = box.getPixXFromLonNoRot(loc2.getLongitude()); + final int bY = box.getPixYFromLatNoRot(loc2.getLatitude()); + if(baDist != 0) { + double CF = (dTarget - distLeft) / baDist; + double rX = bX - CF * (bX - aX); + double rY = bY - CF * (bY - aY); + projectionXY = new double[] {rX, rY}; + } + } + if(projectionXY != null) { - if (nextInRoute != null && previousInRoute != null) { - - final Location ll = view.getApplication().getLocationProvider().getLastKnownLocation(); - final int aX = box.getPixXFromLonNoRot(ll.getLongitude()); - final int aY = box.getPixYFromLatNoRot(ll.getLatitude()); - final int centerX = box.getPixXFromLonNoRot(nextInRoute.getLongitude()); - final int centerY = box.getPixYFromLatNoRot(nextInRoute.getLatitude()); - final int bX = box.getPixXFromLonNoRot(previousInRoute.getLongitude()); - final int bY = box.getPixYFromLatNoRot(previousInRoute.getLatitude()); - - double radius = MapUtils.getVectorMagnitude(centerX, centerY, aX, aY); - double angle2 = MapUtils.getAngleForRadiusVector(centerX, centerY, bX, bY); - projectionXY = MapUtils.getCoordinatesFromRadiusAndAngle(centerX, centerY, radius, angle2); - double distanceLoc2Proj = MapUtils.getVectorMagnitude(aX, aY, (int)projectionXY[0], (int)projectionXY[1]); - boolean isProjectionOnSegment = MapUtils.getVectorMagnitude(centerX ,centerY, (int) projectionXY[0], (int) projectionXY[1]) - < MapUtils.getVectorMagnitude(centerX, centerY, bX, bY); - visible = box.containsPoint((float)projectionXY[0], (float)projectionXY[1], 20.0f) - && Math.abs(Math.toDegrees(MapUtils.getAngleBetweenVectors(centerX, centerY, aX, aY, centerX, centerY, bX, bY))) < 90 - && distanceLoc2Proj > AndroidUtils.dpToPx(view.getContext(), 52) / 2.0 - && isProjectionOnSegment; + double distanceLoc2Proj = MapUtils.getSqrtDistance((int)projectionXY[0], (int) projectionXY[1], + box.getPixXFromLonNoRot(ll.getLongitude()), box.getPixYFromLatNoRot(ll.getLatitude())); + boolean visible = box.containsPoint((float) projectionXY[0], (float) projectionXY[1], 20.0f) + && distanceLoc2Proj > AndroidUtils.dpToPx(view.getContext(), 52) / 2.0; if (visible) { return projectionXY; } diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java index 610776db99..54be82b4f7 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java @@ -1405,8 +1405,7 @@ public class MapInfoWidgetsFactory { ctx.startActivity(Intent.createChooser(intent, ctx.getString(R.string.send_location))); } }); - AndroidUtils.setSnackbarTextColor(snackbar, R.color.active_color_primary_dark); - AndroidUtils.setSnackbarTextMaxLines(snackbar, 5); + UiUtilities.setupSnackbar(snackbar, nightMode, 5); snackbar.show(); } diff --git a/OsmAnd/src/net/osmand/plus/wikipedia/WikiArticleHelper.java b/OsmAnd/src/net/osmand/plus/wikipedia/WikiArticleHelper.java index ef96f89671..2857330a82 100644 --- a/OsmAnd/src/net/osmand/plus/wikipedia/WikiArticleHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikipedia/WikiArticleHelper.java @@ -11,6 +11,7 @@ import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; import android.text.Html; import android.util.Log; +import android.view.ContextThemeWrapper; import net.osmand.IndexConstants; import net.osmand.ResultMatcher; @@ -86,7 +87,7 @@ public class WikiArticleHelper { activityRef = new WeakReference<>(activity); this.isNightMode = nightMode; this.url = url; - dialog = createProgressDialog(activity); + dialog = createProgressDialog(activity, isNightMode); } @Override @@ -215,9 +216,9 @@ public class WikiArticleHelper { return ""; } - private static ProgressDialog createProgressDialog(@NonNull FragmentActivity activity) { + private static ProgressDialog createProgressDialog(@NonNull FragmentActivity activity, boolean nightMode) { if (activity != null) { - ProgressDialog dialog = new ProgressDialog(activity); + ProgressDialog dialog = new ProgressDialog(new ContextThemeWrapper(activity, nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme)); dialog.setCancelable(false); dialog.setMessage(activity.getString(R.string.wiki_article_search_text)); return dialog; diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/SavedArticlesRvAdapter.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/SavedArticlesRvAdapter.java index a07fe37927..264d9f723c 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/SavedArticlesRvAdapter.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/SavedArticlesRvAdapter.java @@ -204,7 +204,10 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter