diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java index 8431df7244..57b87dcc8c 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapRouteReaderAdapter.java @@ -1,25 +1,9 @@ package net.osmand.binary; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.logging.Log; - import com.google.protobuf.CodedInputStream; import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.WireFormat; -import gnu.trove.iterator.TLongObjectIterator; -import gnu.trove.list.array.TIntArrayList; -import gnu.trove.list.array.TLongArrayList; -import gnu.trove.map.hash.TIntObjectHashMap; -import gnu.trove.map.hash.TLongObjectHashMap; import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapIndexReader.SearchRequest; @@ -34,6 +18,23 @@ import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; import net.osmand.util.OpeningHoursParser; +import org.apache.commons.logging.Log; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import gnu.trove.iterator.TLongObjectIterator; +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.list.array.TLongArrayList; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.map.hash.TLongObjectHashMap; + public class BinaryMapRouteReaderAdapter { protected static final Log LOG = PlatformUtil.getLog(BinaryMapRouteReaderAdapter.class); private static final int SHIFT_COORDINATES = 4; @@ -303,6 +304,7 @@ public class BinaryMapRouteReaderAdapter { public int directionTrafficSignalsBackward = -1; public int trafficSignals = -1; public int stopSign = -1; + public int stopMinor = -1; public int giveWaySign = -1; int nameTypeRule = -1; @@ -363,6 +365,8 @@ public class BinaryMapRouteReaderAdapter { destinationRefTypeRule = id; } else if (tags.equals("highway") && val.equals("traffic_signals")){ trafficSignals = id; + } else if (tags.equals("stop") && val.equals("minor")) { + stopMinor = id; } else if (tags.equals("highway") && val.equals("stop")){ stopSign = id; } else if (tags.equals("highway") && val.equals("give_way")){ diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/RouteDataObject.java b/OsmAnd-java/src/main/java/net/osmand/binary/RouteDataObject.java index f444a56b04..b6dc2f2176 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/RouteDataObject.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/RouteDataObject.java @@ -519,6 +519,24 @@ public class RouteDataObject { } return pointTypes[ind]; } + + public void removePointType(int ind, int type) { + if (pointTypes != null || ind < pointTypes.length) { + int[] typesArr = pointTypes[ind]; + + for (int i = 0; i < typesArr.length; i++) { + if (typesArr[i] == type) { + int[] result = new int[typesArr.length - 1]; + System.arraycopy(typesArr, 0, result, 0, i); + if (typesArr.length != i) { + System.arraycopy(typesArr, i + 1, result, i, typesArr.length - 1 - i); + pointTypes[ind] = result; + break; + } + } + } + } + } public int[] getTypes() { return types; diff --git a/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java b/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java index 882231d8a6..f014a4fc8b 100644 --- a/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java +++ b/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java @@ -436,7 +436,7 @@ public class OsmandRegions { cx /= object.getPointsLength(); cy /= object.getPointsLength(); rd.regionCenter = new LatLon(MapUtils.get31LatitudeY((int) cy), MapUtils.get31LongitudeX((int) cx)); - rd.boundingBox = findBoundingBox(object); + findBoundaries(rd, object); } rd.regionParentFullName = mapIndexFields.get(mapIndexFields.parentFullName, object); @@ -462,13 +462,15 @@ public class OsmandRegions { return rd; } - private QuadRect findBoundingBox(BinaryMapDataObject object) { + private void findBoundaries(WorldRegion rd, BinaryMapDataObject object) { if (object.getPointsLength() == 0) { - return new QuadRect(0, 0, 0, 0); + return; } + List polygon = new ArrayList<>(); double currentX = object.getPoint31XTile(0); double currentY = object.getPoint31YTile(0); + polygon.add(new LatLon(currentX, currentY)); double minX = currentX; double maxX = currentX; double minY = currentY; @@ -488,6 +490,7 @@ public class OsmandRegions { } else if (currentY < minY) { minY = currentY; } + polygon.add(new LatLon(currentX, currentY)); } } @@ -496,7 +499,8 @@ public class OsmandRegions { double revertedMinY = MapUtils.get31LatitudeY((int) maxY); double revertedMaxY = MapUtils.get31LatitudeY((int) minY); - return new QuadRect(minX, revertedMinY, maxX, revertedMaxY); + rd.boundingBox = new QuadRect(minX, revertedMinY, maxX, revertedMaxY); + rd.polygon = polygon; } private String getSearchIndex(BinaryMapDataObject object) { diff --git a/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java b/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java index b6fdb4f7d4..e3b2aa2a69 100644 --- a/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java +++ b/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java @@ -42,6 +42,7 @@ public class WorldRegion implements Serializable { protected boolean regionMapDownload; protected LatLon regionCenter; protected QuadRect boundingBox; + protected List polygon; public static class RegionParams { protected String regionLeftHandDriving; @@ -186,12 +187,23 @@ public class WorldRegion implements Serializable { } public boolean containsRegion(WorldRegion region) { - if (this.boundingBox != null && region.boundingBox != null) { - return this.boundingBox.contains(region.boundingBox); + if (containsBoundingBox(region.boundingBox)) { + // check polygon only if bounding box match + return containsPolygon(region.polygon); } return false; } + private boolean containsBoundingBox(QuadRect rectangle) { + return (boundingBox != null && rectangle != null) && + boundingBox.contains(rectangle); + } + + private boolean containsPolygon(List another) { + return (polygon != null && another != null) && + Algorithms.isFirstPolygonInsideSecond(another, polygon); + } + public boolean isContinent() { if (superregion != null) { String superRegionId = superregion.getRegionId(); diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/edit/OsmMapUtils.java b/OsmAnd-java/src/main/java/net/osmand/osm/edit/OsmMapUtils.java index 5e19d09658..cf86ca88ed 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/edit/OsmMapUtils.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/edit/OsmMapUtils.java @@ -153,35 +153,34 @@ public class OsmMapUtils { } boolean area = w.getFirstNodeId() == w.getLastNodeId(); // double check for area (could be negative all) - if(area) { + if (area) { Node fn = w.getFirstNode(); Node ln = w.getLastNode(); - if(fn != null && fn != null && MapUtils.getDistance(fn.getLatLon(), ln.getLatLon()) < 50) { + if (fn != null && fn != null && MapUtils.getDistance(fn.getLatLon(), ln.getLatLon()) < 50) { area = true; } else { area = false; } } LatLon ll = area ? getComplexPolyCenter(nodes, null) : getWeightCenterForNodes(nodes); - if(ll == null) { + if (ll == null) { return null; } double flat = ll.getLatitude(); double flon = ll.getLongitude(); - if(!area || !MapAlgorithms.containsPoint(nodes, ll.getLatitude(), ll.getLongitude())) { + if (!area || !MapAlgorithms.containsPoint(nodes, ll.getLatitude(), ll.getLongitude())) { double minDistance = Double.MAX_VALUE; for (Node n : nodes) { if (n != null) { double d = MapUtils.getDistance(n.getLatitude(), n.getLongitude(), ll.getLatitude(), ll.getLongitude()); - if(d < minDistance) { + if (d < minDistance) { flat = n.getLatitude(); flon = n.getLongitude(); minDistance = d; } } - } + } } - return new LatLon(flat, flon); } diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java index 26d984b2da..c6a5f1d393 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java @@ -176,11 +176,49 @@ public class RouteResultPreparation { combineWayPointsForAreaRouting(ctx, result); validateAllPointsConnected(result); splitRoadsAndAttachRoadSegments(ctx, result, recalculation); + for (int i = 0; i < result.size(); i++) { + filterMinorStops(result.get(i)); + } calculateTimeSpeed(ctx, result); - prepareTurnResults(ctx, result); return result; } + + public RouteSegmentResult filterMinorStops(RouteSegmentResult seg) { + List stops = null; + boolean plus = seg.getStartPointIndex() < seg.getEndPointIndex(); + int next; + + for (int i = seg.getStartPointIndex(); i != seg.getEndPointIndex(); i = next) { + next = plus ? i + 1 : i - 1; + int[] pointTypes = seg.getObject().getPointTypes(i); + if (pointTypes != null) { + for (int j = 0; j < pointTypes.length; j++) { + if (pointTypes[j] == seg.getObject().region.stopMinor) { + if (stops == null) { + stops = new ArrayList<>(); + } + stops.add(i); + } + } + } + } + + if (stops != null) { + for (int stop : stops) { + List attachedRoutes = seg.getAttachedRoutes(stop); + for (RouteSegmentResult attached : attachedRoutes) { + int attStopPriority = highwaySpeakPriority(attached.getObject().getHighway()); + int segStopPriority = highwaySpeakPriority(seg.getObject().getHighway()); + if (segStopPriority < attStopPriority) { + seg.getObject().removePointType(stop, seg.getObject().region.stopSign); + break; + } + } + } + } + return seg; + } public void prepareTurnResults(RoutingContext ctx, List result) { for (int i = 0; i < result.size(); i ++) { diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/ObjectType.java b/OsmAnd-java/src/main/java/net/osmand/search/core/ObjectType.java index c14d5cff07..df81a9ce18 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/ObjectType.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/ObjectType.java @@ -8,7 +8,7 @@ public enum ObjectType { // LOCATION LOCATION(true), PARTIAL_LOCATION(false), // UI OBJECTS - FAVORITE(true), FAVORITE_GROUP(false), WPT(true), RECENT_OBJ(true), + FAVORITE(true), FAVORITE_GROUP(false), WPT(true), RECENT_OBJ(true), GPX_TRACK(false), // ONLINE SEARCH ONLINE_SEARCH(true), diff --git a/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java b/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java index be59b4bf6f..ab12baf5e1 100644 --- a/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java +++ b/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java @@ -3,6 +3,7 @@ package net.osmand.util; import net.osmand.IProgress; import net.osmand.PlatformUtil; import net.osmand.router.RouteColorize; +import net.osmand.data.LatLon; import org.apache.commons.logging.Log; import org.xmlpull.v1.XmlPullParser; @@ -118,7 +119,7 @@ public class Algorithms { } return def; } - + public static int parseIntSilently(String input, int def) { if (input != null && input.length() > 0) { try { @@ -141,6 +142,35 @@ public class Algorithms { return def; } + public static boolean isFirstPolygonInsideSecond(List firstPolygon, + List secondPolygon) { + for (LatLon point : firstPolygon) { + if (!isPointInsidePolygon(point, secondPolygon)) { + // if at least one point is not inside the boundary, return false + return false; + } + } + return true; + } + + public static boolean isPointInsidePolygon(LatLon point, + List polygon) { + double pointX = point.getLongitude(); + double pointY = point.getLatitude(); + boolean result = false; + for (int i = 0, j = polygon.size() - 1; i < polygon.size(); j = i++) { + double x1 = polygon.get(i).getLongitude(); + double y1 = polygon.get(i).getLatitude(); + double x2 = polygon.get(j).getLongitude(); + double y2 = polygon.get(j).getLatitude(); + if ((y1 > pointY) != (y2 > pointY) + && (pointX < (x2 - x1) * (pointY - y1) / (y2-y1) + x1)) { + result = !result; + } + } + return result; + } + public static String getFileNameWithoutExtension(File f) { return getFileNameWithoutExtension(f.getName()); } @@ -759,6 +789,10 @@ public class Algorithms { return false; } + public static boolean isInt(double d) { + return (d == Math.floor(d)) && !Double.isInfinite(d); + } + public static boolean isInt(String value) { int length = value.length(); for (int i = 0; i < length; i++) { diff --git a/OsmAnd/AndroidManifest.xml b/OsmAnd/AndroidManifest.xml index 01f760954b..a1c3af7e30 100644 --- a/OsmAnd/AndroidManifest.xml +++ b/OsmAnd/AndroidManifest.xml @@ -16,7 +16,6 @@ - diff --git a/OsmAnd/build-common.gradle b/OsmAnd/build-common.gradle index 38dce71283..d0dd3dba86 100644 --- a/OsmAnd/build-common.gradle +++ b/OsmAnd/build-common.gradle @@ -348,7 +348,7 @@ dependencies { implementation 'org.immutables:gson:2.5.0' implementation 'com.vividsolutions:jts-core:1.14.0' implementation 'com.google.openlocationcode:openlocationcode:1.0.4' - implementation 'com.android.billingclient:billing:2.0.3' + implementation 'com.android.billingclient:billing:3.0.2' // turn off for now //implementation 'com.atilika.kuromoji:kuromoji-ipadic:0.9.0' implementation 'com.squareup.picasso:picasso:2.71828' diff --git a/OsmAnd/res/layout/add_new_favorite_category.xml b/OsmAnd/res/layout/add_new_favorite_category.xml new file mode 100644 index 0000000000..74510f0842 --- /dev/null +++ b/OsmAnd/res/layout/add_new_favorite_category.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/bottom_sheet_item_with_descr_and_radio_btn.xml b/OsmAnd/res/layout/bottom_sheet_item_with_descr_and_radio_btn.xml index a346825302..d4d052c868 100644 --- a/OsmAnd/res/layout/bottom_sheet_item_with_descr_and_radio_btn.xml +++ b/OsmAnd/res/layout/bottom_sheet_item_with_descr_and_radio_btn.xml @@ -9,6 +9,7 @@ - + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/favorite_categories_dialog.xml b/OsmAnd/res/layout/favorite_categories_dialog.xml index e9503bd3b9..5dc2e799c4 100644 --- a/OsmAnd/res/layout/favorite_categories_dialog.xml +++ b/OsmAnd/res/layout/favorite_categories_dialog.xml @@ -1,5 +1,6 @@ + android:layout_height="wrap_content"> - + - + - + - - diff --git a/OsmAnd/res/layout/point_editor_fragment_new.xml b/OsmAnd/res/layout/point_editor_fragment_new.xml index 679ca022fe..6beccf0dd7 100644 --- a/OsmAnd/res/layout/point_editor_fragment_new.xml +++ b/OsmAnd/res/layout/point_editor_fragment_new.xml @@ -84,6 +84,7 @@ android:drawableEnd="@drawable/btn_circle_transparent_full" android:drawableRight="@drawable/btn_circle_transparent_full" android:drawablePadding="@dimen/favorites_list_item_height" + android:imeOptions="actionDone" android:inputType="textMultiLine" android:maxLines="4" android:minHeight="@dimen/favorites_list_item_height" @@ -93,7 +94,6 @@ android:paddingRight="@dimen/content_padding_small" android:scrollHorizontally="false" android:textSize="@dimen/default_list_text_size" - android:imeOptions="actionDone" tools:text="@string/lorem_ipsum" /> @@ -137,6 +137,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="start" + android:imeOptions="actionDone" android:maxLines="4" android:minHeight="@dimen/favorites_list_item_height" android:paddingStart="@dimen/content_padding_small" @@ -144,7 +145,6 @@ android:paddingEnd="@dimen/content_padding_small" android:paddingRight="@dimen/content_padding_small" android:textSize="@dimen/default_list_text_size" - android:imeOptions="actionDone" tools:text="@string/lorem_ipsum" /> @@ -248,6 +248,7 @@ android:drawablePadding="8dp" android:duplicateParentState="true" android:gravity="center" + android:imeOptions="actionDone" android:paddingStart="@dimen/content_padding_half" android:paddingLeft="@dimen/content_padding_half" android:paddingEnd="@dimen/content_padding_half" @@ -255,7 +256,6 @@ android:text="@string/add_description" android:textSize="@dimen/default_desc_text_size" osmand:typeface="@string/font_roboto_medium" - android:imeOptions="actionDone" tools:text="@string/add_description" /> + android:layout_marginBottom="@dimen/content_padding_half" + android:orientation="horizontal" /> diff --git a/OsmAnd/res/layout/preference_circle_item.xml b/OsmAnd/res/layout/preference_circle_item.xml index 662b848f29..8fab8547a4 100644 --- a/OsmAnd/res/layout/preference_circle_item.xml +++ b/OsmAnd/res/layout/preference_circle_item.xml @@ -2,8 +2,7 @@ + android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:orientation="vertical"> + android:layout_marginStart="@dimen/list_content_padding" + android:layout_marginLeft="@dimen/list_content_padding" + android:layout_marginEnd="@dimen/list_content_padding" + android:layout_marginRight="@dimen/list_content_padding" /> \ No newline at end of file diff --git a/OsmAnd/res/layout/search_gpx_list_item.xml b/OsmAnd/res/layout/search_gpx_list_item.xml new file mode 100644 index 0000000000..090513c7be --- /dev/null +++ b/OsmAnd/res/layout/search_gpx_list_item.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/track_split_interval.xml b/OsmAnd/res/layout/track_split_interval.xml index ae823012cd..2fdcfc467c 100644 --- a/OsmAnd/res/layout/track_split_interval.xml +++ b/OsmAnd/res/layout/track_split_interval.xml @@ -5,57 +5,25 @@ android:layout_height="match_parent" android:orientation="vertical"> - + android:layout_height="wrap_content" + android:ellipsize="end" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:textColor="?android:textColorSecondary" + android:textSize="@dimen/default_desc_text_size" + android:lineSpacingMultiplier="@dimen/bottom_sheet_text_spacing_multiplier" + android:text="@string/gpx_split_interval_descr" + android:paddingEnd="@dimen/content_padding" + android:paddingStart="@dimen/content_padding" /> - + - - - - - + @@ -143,6 +111,7 @@ android:layout_marginStart="@dimen/content_padding" android:layout_marginEnd="@dimen/content_padding" android:layout_marginBottom="@dimen/content_padding" + android:layout_marginTop="@dimen/content_padding_half" android:lineSpacingExtra="@dimen/line_spacing_extra_description" android:text="@string/gpx_split_interval_none_descr" android:textColor="?android:textColorSecondary" diff --git a/OsmAnd/res/layout/track_width_card.xml b/OsmAnd/res/layout/track_width_card.xml index 744c90d137..c44c777164 100644 --- a/OsmAnd/res/layout/track_width_card.xml +++ b/OsmAnd/res/layout/track_width_card.xml @@ -71,11 +71,20 @@ android:layout_weight="1" android:gravity="end" android:lineSpacingExtra="@dimen/line_spacing_extra_description" - android:textColor="?android:textColorPrimary" - android:textSize="@dimen/default_list_text_size" /> + android:textColor="?android:textColorSecondary" + android:textSize="@dimen/default_list_text_size" + tools:text="1" /> + + - - + android:textSize="@dimen/default_list_text_size" + tools:text="1" /> + android:textSize="@dimen/default_list_text_size" + tools:text="24" /> diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index e374f5a869..eddda38785 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -2123,10 +2123,6 @@ عرض مربع الحوار مؤقتاً " حفظ إلى " مكان - عرض/إخفاء المفضلة - عرض المفضلة - إخفاء المفضلة - عرض/إخفاء نقاط الاهتمام عرض %1$s إخفاء %1$s إضافة فئة @@ -2241,9 +2237,6 @@ \n • إضافة POI ورفعها مباشرة إلى الموقع (أو في وقت لاحق إن كنت غير متصل بالشبكة) \n عدل طلب البحث أو زد النطاق. - عرض/إخفاء ملاحظات OSM - إظهار ملاحظات OSM - إخفاء ملاحظات OSM مرتبة حسب المسافة نظرة عامة التكبير التلقائي @@ -2880,10 +2873,7 @@ تبديل اعرض المزيد المسارات على الخريطة - إظهار/إخفاء مسارات GPX إظهار أو إخفاء مسارات GPX المحددة على الخريطة. - إخفاء المسارات - عرض المسارات الرجاء إضافة الوجهة أولاً الطريق السابق إضافة نقاط بداية ونهاية @@ -3070,13 +3060,7 @@ تفضيل الطرق غير المعبدة عند التوجيه. تحرير خرائط OSM لإظهار أو إخفاء الخطوط الكنتورية على الخريطة. - إظهار الخطوط الكنتورية - إخفاء الخطوط الكنتورية - إظهار/إخفاء الخطوط الكنتورية لإظهار وإخفاء التضاريس على الخريطة. - إظهار التضاريس - إخفاء التضاريس - إظهار/إخفاء التضاريس لا يمكن بدء تشغيل أداة تحويل النص إلى كلام. تصدير الوضع وضع أوسماند: %1$s @@ -3557,9 +3541,6 @@ إضافة وصف حذف الوصف زر لإظهار طبقة التضاريس أو إخفائها على الخريطة. - إظهار التضاريس - إخفاء التضاريس - إظهارأو إخفاء التضاريس المنحدرات التضاريس تمكين لعرض المنحدرات أو خريطة التضاريس. يمكنك قراءة المزيد عن أنواع الخرائط هذه على موقعنا. @@ -3680,9 +3661,6 @@ \n إستئناف يمكنك الوصول إلى هذه الإجراءات عن طريق النقر على زر \"%1$s\". - إخفاء وسائل النقل العام - إظهار وسائل النقل العام - إظهارأو إخفاء وسائل النقل العام زر لإظهار أو إخفاء وسائل النقل العام على الخريطة. إنشاء أو تعديل نقطة الأهتمام POI مكان الموقف @@ -3750,9 +3728,6 @@ ضبط ارتفاع السفينة يمكنك ضبط ارتفاع الحاوية لتجنب الجسور المنخفضة. ضع في اعتبارك أنه إذا كان الجسر متحركاً ، فسوف نستخدم ارتفاعه في الحالة المفتوحة. تحديد عرض السفينة لتجنب الجسور الضيقة - إظهار/إخفاء مابيلاري - إخفاء مابيلاري - إظهار مابيلاري إظهار أو إخفاء طبقة مابيلاري على الخريطة. POI كاميرا مراقبة السرعة إلغاء تثبيت كاميرات السرعة diff --git a/OsmAnd/res/values-az/strings.xml b/OsmAnd/res/values-az/strings.xml index e800999147..63278da079 100644 --- a/OsmAnd/res/values-az/strings.xml +++ b/OsmAnd/res/values-az/strings.xml @@ -741,10 +741,6 @@ Favorit əlavə et " burda saxlandı: " Yer - Favoritləri göstər/gizlət - Favoritləri göstər - Favoritləri gizlət - POI-ni göstər/gizlət %1$s-i göstər %1$s-i gizlət Kateqoriya əlavə et @@ -754,9 +750,6 @@ Xəritə stilləri Axtarış radiusunu artır Axtarış sorğusunu dəyişin və ya axtarış radiusunu artırın. - OSM qeydlərini göstər və ya gizlət - OSM qeydlərini göstər - OSM qeydlərini gizlət Bu fəaliyyət düyməsinə toxunulduqda, xəritədə OSM qeydləri göstəriləcək və ya gizlədiləcək. Məsafəyə görə sırala Favoritlərdə axtar @@ -2152,9 +2145,6 @@ Sil ton metr - Mapillary-ni göstər/gizlət - Mapillary-ni gizlət - Mapillary-ni göstər %1$s silindi Sil və yenidən başlat Vikipediya xəritələrini endir diff --git a/OsmAnd/res/values-b+ast/strings.xml b/OsmAnd/res/values-b+ast/strings.xml index f1815fc169..787572e21b 100644 --- a/OsmAnd/res/values-b+ast/strings.xml +++ b/OsmAnd/res/values-b+ast/strings.xml @@ -539,7 +539,6 @@ Aumentar el radiu de gueta Nun s\'alcontró nada Modifica la consulta o aumenta\'l radiu de gueta. - Alternar notes d\'OSM Tocar esti botón d\'aición amuesa/anubre nel mapa les notes d\'OSM. Plugin Esquema de colores @@ -1114,7 +1113,6 @@ Mou nocherniegu Tocar esti botón d\'aición amuesa/anubre nel mapa los puntos favoritos. Tocar esti botón d\'aición amuesa/anubre nel mapa los PdI. - Amosar/anubrir Favoritos Navegación Esti mensaxe inclúise nel campu de comentarios. Esbilla una estaya opcional. @@ -1308,7 +1306,6 @@ Anovar too (%1$sMB) Camudar l\'estilu del mapa Cambiar al mou día/nueche - Amosar/anubrir PdI Creación d\'elementos Configuración del mapa Puntu 1 diff --git a/OsmAnd/res/values-b+be+Latn/strings.xml b/OsmAnd/res/values-b+be+Latn/strings.xml index 5ae3b5317a..83b3e3f846 100644 --- a/OsmAnd/res/values-b+be+Latn/strings.xml +++ b/OsmAnd/res/values-b+be+Latn/strings.xml @@ -2017,9 +2017,6 @@ Praparcyjnaj pamiacі %4$s MB (Abmiežavańnie Android %5$s MB, Dalvik %6$s MB). Pavialičyć radyus pošuku Ničoha nie znojdziena Źmianicie pošukavy zapyt abo pavialičcie radyus pošuku. - Pakazać/schavać OSM-natatki - Pakazać OSM-natatki - Schavać OSM-natatki Nacisk na hetuju knopku pakaža ci schavaje OSM-natatki na mapie. Adsartavana pa adlehłaści Pošuk upadabanych @@ -2156,10 +2153,6 @@ Praparcyjnaj pamiacі %4$s MB (Abmiežavańnie Android %5$s MB, Dalvik %6$s MB). Ukliučyć Holas Dadać pieršy pramiežkavy punkt Pakazać pramiežkavy dyjaloh - Pakazać/schavać upadabanyja - Pakazać upadabanyja - Schavać upadabanyja - Pakazać/schavać POI Pakazać %1$s Schavać %1$s Dadać katehoryu @@ -2823,10 +2816,7 @@ Praparcyjnaj pamiacі %4$s MB (Abmiežavańnie Android %5$s MB, Dalvik %6$s MB). Pamianiać Pakazać boĺš Adliustroŭvajemyja sliady - Pakazać/schavać GPX-sliady Nacisk na knopku dziejannia pakaža ci schavaje abranyja GPX-sliady na mapie - Schavać GPX-sliady - Pakazać GPX-sliady Spačatku dadajcie punkt pryznačennia Papiaredni maršrut Dadać dom diff --git a/OsmAnd/res/values-b+hsb/strings.xml b/OsmAnd/res/values-b+hsb/strings.xml index 242e4465ce..d9c186a2d7 100644 --- a/OsmAnd/res/values-b+hsb/strings.xml +++ b/OsmAnd/res/values-b+hsb/strings.xml @@ -912,9 +912,6 @@ Pytanski radius powjetšić Žadyn pytanski wuslědk Změń pytanje abo powjetš jeho radius. - OSM-noticy pokazać/schować - OSM-noticy pokazać - OSM-noticy schować Sortěrowane po zdalenosći W faworitach pytać Sćehń reliefowu kartu, zo by so relief pokazał. @@ -1021,10 +1018,6 @@ Předchadny dypk dodać Přichodny dypk dodać Nawigaciju zahajić/přetorhnyć - Fawority pokazać/schować - Fawority pokazać - Fawority schować - POI pokazać/schować %1$s pokazać %1$s schować Kategoriju dodać @@ -1581,12 +1574,6 @@ Wšě karty aktualizować Chceš woprawdźe wšě (%1$d) karty aktualizować\? Změny na OSM - Pokazaj wysokostne linije - Schowaj wysokostne linije - Wysokostne linije pokazać/schować - Pokazaj relief - Schowaj relief - Relief pokazać/schować Profil eksportować OsmAnd-profil: %1$s Profil \'%1$s\' hižo eksistuje. Chceš jón přepisać\? diff --git a/OsmAnd/res/values-b+kab/strings.xml b/OsmAnd/res/values-b+kab/strings.xml index 89deec4af6..d10a9afb04 100644 --- a/OsmAnd/res/values-b+kab/strings.xml +++ b/OsmAnd/res/values-b+kab/strings.xml @@ -1044,8 +1044,6 @@ Swel… Ffer %1$S Sken %1$S - Inurifen - Sken inurifen Kkes tigawt Tigawt Taɣect: @@ -1254,9 +1252,6 @@ Fren ameccaq ugar n wanida ara d-yettwasiden ubrid. Abrid ad yettwasiḍen ticki ameccaq gar ubrid akked wadig-ik yugar azal i d-yettwammlen. Iberdan isnawanen - Sken/ffer akal - Ffer akal - Sken akal Taqeffalt i uskan neɣ tuffra n tissi n wakal n tkarḍa. Kkes aglam Fren agraw diff --git a/OsmAnd/res/values-be/phrases.xml b/OsmAnd/res/values-be/phrases.xml index 0cdf6d0599..5856703494 100644 --- a/OsmAnd/res/values-be/phrases.xml +++ b/OsmAnd/res/values-be/phrases.xml @@ -123,7 +123,7 @@ Пункт тэхагляду Аўтамыйка Запраўка;АЗС;Аўтазаправачная станцыя - Станцыя сілкавання + Станцыя зарадкі; Станцыя зарадкі для электрамабіля; Станцыя зарадкі для электрамабіляў; Кропка электрычнай зарадкі; Кропка зарадкі; Электронная зарадная станцыя; Абсталяванне для электрамабіляў Рамонтная эстакада/яма Кампрэсар для падпампоўкі шын Паркоўка @@ -3604,7 +3604,7 @@ Доступ для транспартных сродкаў: для вайскоўцаў Доступ для транспартных сродкаў: кур’еры / дастаўка Доступ для транспартных сродкаў: лясная гаспадарка - Доступ для аўтамабіляў: + Доступ для аўтамабіляў: так Доступ для аўтамабіляў: прыватны Доступ для аўтамабіляў: няма Доступ для аўтамабіляў: пункт прызначэння @@ -3804,7 +3804,7 @@ Прымітыўнае Кантраснае Толькі калі дазволеная хада - Доступ да сеціва + Доступ да сеціва: кліенты Не Так Тып стэнда @@ -3823,11 +3823,22 @@ Маленькія электрапрыборы Вулей Крама арэхаў - + ЗПГ Паслугі для грамадзян Іміграцыйныя візы Неіміграцыйныя візы Сувязь Консульства Амбасада + Вярхоўны камісарыят + Дэлегацыя + Аддзяленне + На чале з амбасадарам + Сувязь + Амбасада + Радыёлакацыйная вежа + Прыдарожная стаянка + Навесы + Дах + Пункт GPX \ No newline at end of file diff --git a/OsmAnd/res/values-be/strings.xml b/OsmAnd/res/values-be/strings.xml index 1f45267fa8..ba1b8d5015 100644 --- a/OsmAnd/res/values-be/strings.xml +++ b/OsmAnd/res/values-be/strings.xml @@ -598,7 +598,7 @@ Спампаваць новую версію праграмы, каб мець магчымасць выкарыстоўваць новыя файлы мапаў. Сеціўны Nominatim Вызначэнне становішча… - Маё становішча (знойдзена) + Маё месцазнаходжанне (знойдзена) Адрас… Улюбёныя мясціны… Нявызначана @@ -2137,10 +2137,6 @@ Выдаліць дзеянне Сапраўды выдаліць дзеянне \"%s\"\? Месца - Паказаць/схаваць улюбёныя мясціны - Паказаць улюбёныя мясціны - Схаваць улюбёныя мясціны - Паказаць/схаваць POI Паказаць %1$s Схаваць %1$s Дадаць катэгорыю @@ -2310,9 +2306,6 @@ Павялічыць радыус пошуку Нічога не знойдзена Змяніць пошукавы запыт альбо павялічыць радыус пошуку. - Паказаць/схаваць OSM-нататкі - Паказаць OSM-нататкі - Схаваць OSM-нататкі Кнопка для паказу / хавання OSM-нататак на мапе. Адсартавана па адлегласці Пошук ва ўлюбёных мясцінах @@ -2554,7 +2547,7 @@ Схаваць пройдзеныя Выкарыстоўваць становішча Дадаць ваша становішча як пункт адпраўлення пры планаванні маршруту. - Маё становішча + Маё месцазнаходжанне Фініш Планаваць маршрут Упарадкаваць @@ -2892,10 +2885,7 @@ Памяняць Паказаць больш Адлюстроўваемыя сляды - Паказаць/схаваць сляды Кнопка для адлюстравання/хавання абраных слядоў на мапе. - Схаваць сляды - Паказаць сляды Уключыць грамадскі транспарт для змен OsmAnd Live. Грамадскі транспарт OsmAnd Live %1$d перасадак @@ -3314,13 +3304,7 @@ Аддаваць перавагу дарогам без пакрыцця. Змены OSM Кнопка для адлюстравання/хавання контурных ліній на мапе. - Паказаць контурныя лініі - Схаваць контурныя лініі - Паказаць/схаваць контурныя лініі Кнопка для адлюстравання/хавання зацянення рэльефу на мапе. - Паказаць зацяненне рэльефу - Схаваць зацяненне рэльефу - Паказаць/схаваць зацяненне рэльефу Немагчыма запусціць механізм пераўтварэння тэксту ў гаворку. Экспарт профілю Профіль OsmAnd: %1$s @@ -3432,14 +3416,10 @@ Дадаць ці рэдагаваць улюбёнае Аднавіць прадвызначаны парадак элементаў Вярнуцца да рэдагавання - Паказаць грамадскі транспарт Кнопка для паказу ці хавання грамадскага транспарту на мапе. Дадаць профіль %1$s з %2$s Схілы - Паказаць ці схаваць рэльеф - Схаваць рэльеф - Паказаць рэльеф Выдаліць апісанне Дадаць апісанне Абраць групу @@ -3514,14 +3494,9 @@ Можна спалучаць тыпы POI з розных катэгорый. Націсніце \"Пераключыць\", каб абраць усе ці націсніце злева, каб абраць катэгорыю. Змяніць профіль праграмы Аглядная мапа свету (падрабязная) - Схаваць грамадскі транспарт - Паказаць ці схаваць грамадскі транспарт Пералічыць маршрут у выпадку адхілення Выдаліць Вызначце шырыню судна, каб пазбягаць вузкіх мастоў - Паказаць/схаваць Mapillary - Схаваць Mapillary - Паказаць Mapillary Пераключальнік для паказу альбо хавання пласта Mapillary. Пазначце даўжыню транспартнага сродку, дазволеную для руху па маршрутах. Ліміт даўжыні @@ -3979,15 +3954,15 @@ Падзяліць пасля Дадаць новы сегмент Профіль карыстальніка - "• Дададзена магчымасць экспарту і імпарту ўсіх даных, уключаючы налады, рэсурсы, мае месцы. + • Дададзена магчымасць экспарту і імпарту ўсіх даных, уключаючы налады, рэсурсы і мясціны. \n -\n • Планаванне маршруту: графікі для сегментаў трэка з маршрутам, дададзена магчымасць ствараць і рэдагаваць некалькі сегментаў трэка. +\n • Планаванне маршруту: графікі для сегментаў следу з маршрутам, дададзена магчымасць ствараць і рэдагаваць некалькі сегментаў следу. \n -\n • Дададзены OAuth метад аўтэнтыфікацыі для OpenStreetMap, палепшаны інтэрфейс дыялогаў OSM. +\n • Дададзены метад аўтэнтыфікацыі для OpenStreetMap OAuth, палепшаны інтэрфейс дыялогаў OSM. \n -\n • Падтрымка карыстальніцкіх колераў для абранага і маршрутных пунктаў трэка. +\n • Падтрымка адвольных колераў для ўлюбёных мясцін і пунктаў следу. \n -\n" +\n Вярнуць назад усе пункты Выберыце профіль, які будзе выкарыстоўвацца падчас запуску прыкладання. Апошні раз выкарыстоўвалася @@ -4019,10 +3994,10 @@ Выберыце папку або стварыце новую Пуста Аналіз паводле інтэрвалаў - Выгрузіць на OpenStreetMap - Змяніць трэк - Перайменаваць трэк - Змяніць папку + Адправіць на OpenStreetMap + Змяніць след + Змяніць назву следу + Змяніць каталог сек. Пры праходжанні Набліжэнне @@ -4034,48 +4009,48 @@ Інтэрвалы часу і адлегласці Профіль OsmAnd Час абвяшчэння - Час розных галасавых падказак залежыць ад тыпу запыту, бягучай хуткасці навігацыі і хуткасці навігацыі па змаўчанні. + Час вываду розных галасавых падказак залежыць ад тыпу падказкі, бягучай хуткасці навігацыі і прадвызначанай хуткасці навігацыі. Пачаць запіс - Паказаць трэк на мапе + Паказаць след на мапе Інвалідны вазок Пешы турызм - Хадзьба - Электраровар + Хада + Электрычны ровар Горны ровар Дарожны ровар Звычайны ровар Грузавік Малы грузавік Грузавік - Скутэр + Скутар Гоначны ровар Горны ровар Памылка сервера: %1$s Назва ўжо існуе - Выдаліць анлайн-маршрутызатар\? + Выдаліць сеціўную сістэму маршрутызацыі\? Чытаць цалкам Змяніць апісанне - Выдаліць маршрутныя пункты - Капіраваць да пазнак мапы - Капіраваць да абранага - Выгрузка - Выгрузка завершана - Выгрузка %1$d з %2$d - Выгружана %1$d з %2$d - Выберыце змены для выгрузкі - Рэльеф мясцовасці / Схілы / Гарызанталі - OpenPlaceReviews — гэта грамадскі праект пра месцы агульнага карыстання, такія як, рэстараны, гатэлі, музеі, пункты шляху. Ён збірае ўсе агульнадаступныя даныя пра іх, такія як, выявы, водгукі, спасылкі на іншыя сістэмы, спасылкі OpenStreetMap, Вікіпедыя. + Выдаліць пункты шляху + Скапіяваць у адзнакі + Скапіяваць ва ўлюбёныя + Адпраўленне + Паспяхова адпраўлена + Адпраўленне %1$d з %2$d + Адпраўлена %1$d з %2$d + Абярыце змены для адпраўлення + Рэльеф мясцовасці / Схілы / Контурныя лініі + OpenPlaceReviews — гэта грамадскі праект пра месцы агульнага карыстання, такія як рэстараны, гатэлі, музеі, пункты шляху. Ён збірае ўсе агульнадаступныя даныя пра іх, такія як, выявы, водгукі, спасылкі на іншыя сістэмы, спасылкі OpenStreetMap, Вікіпедыя. \n -\nУсе даныя OpenPlaceReview з\'яўляюцца адкрытымі і даступны тут: http://openplacereviews.org/data. +\nУсе даныя OpenPlaceReview адкрытыя і даступныя тут: http://openplacereviews.org/data. \n -\nВы можаце прачытаць больш па адрасу: http://openplacereviews.org +\nВы можаце прачытаць больш па адрасе: http://openplacereviews.org OpenPlaceReviews Выкарыстаць test.openplacereviews.org Увайсці ў OpenPlaceReviews Вада Зіма Снегаход - Язда + Верхавая язда Гонка Горны ровар Язда на ровары diff --git a/OsmAnd/res/values-bg/strings.xml b/OsmAnd/res/values-bg/strings.xml index 868d2d9386..215fbfee06 100644 --- a/OsmAnd/res/values-bg/strings.xml +++ b/OsmAnd/res/values-bg/strings.xml @@ -2063,9 +2063,6 @@ Маршрутът ще бъде преизчислен, ако разстоянието от маршрута до текущото местоположение е повече от избраната стойност. %1$s от %2$s Склонове - Показване/скриване на терена - Скриване на терена - Показване на терена Бутон за показване или скриване на терена върху картата. Изтриване на описанието Добавете описание diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index 5bcd59d0b8..a48a93b61f 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -2113,10 +2113,6 @@ El nom de l\'acció directa està duplicat Un commutador per mostrar o amagar els punts Preferits en el mapa. Un commutador per mostrar o amagar els PDIs en el mapa. - Mostra/amaga Preferits - Mostra Preferits - Amaga Preferits - Mostra/amaga PDI Mostra %1$s Amaga %1$s Afegeix una categoria @@ -2382,9 +2378,6 @@ Compreu i instal·leu el connector \'Corbes de nivell\' per visualitzar una gradació vertical d\'àrees. Baixeu el mapa \'Corbes de nivell\' per utilitzar-les en aquesta zona. Amaga començant pel nivell d\'escala - Mostra o amaga notes OSM - Mostra notes OSM - Amaga notes OSM Botó que mostra o amaga notes OSM al mapa. Ordenat per distància Cerca a Preferits @@ -2839,10 +2832,7 @@ Totes les cruïlles Tipus de carretera Sortida a - Mostra/amaga traces Un botó per mostrar o amagar les traces seleccionades al mapa. - Amaga les traces - Mostra les traces Pugeu a la parada Activa les modificacions del transport públic amb OsmAnd Live. Transport públic a OsmAnd Live @@ -3213,13 +3203,7 @@ Prefereix carreteres sense asfaltar a les asfaltades al generar rutes. Edicions a OSM Botó per a mostrar o amagar les corbes de nivell en el mapa. - Mostra les corbes de nivell - Amaga les corbes de nivell - Mostra/amaga les corbes de nivell Botó per a mostrar o amagar l\'ombrejat de relleu al mapa. - Mostra l\'ombrejat de relleu - Amaga l\'ombrejat de relleu - Mostra/amaga l\'ombrejat de relleu No es pot iniciar el sistema text a veu. L\'OsmAnd utilitza l\'estàndard UTM, que és molt similar però no idèntic al format UTM NATO. El format seleccionat s\'aplicarà a tota l\'aplicació. @@ -3461,9 +3445,6 @@ Afegiu una descripció Suprimeix la descripció Un botó per mostrar o amagar la capa de terreny al mapa. - Mostra el terreny - Amaga el terreny - Mostra o amaga el relleu Ombrejat del relleu Llegenda Nivells de zoom @@ -3560,9 +3541,6 @@ Podeu indicar l\'alçada del vaixell per evitar ponts baixos. Penseu que si el pont és mòbil, li aplicarem l\'alçada de quan estigui obert. Indiqueu l\'alçada del vaixell per evitar ponts baixos. Penseu que si el pont és mòbil, li aplicarem l\'alçada de quan estigui obert. Indiqueu l\'amplada del vaixell per evitar ponts ajustats - Mostra/amaga Mapil·lary - Amaga Mapillary - Mostra Mapillary Un commutador per mostrar o amagar la capa de Mapillary al mapa. Especifiqueu la llargada del vehicle que han de permetre les vies. Llargada màxima @@ -3636,8 +3614,6 @@ Subscripció - OsmAnd Live Compres OsmAnd Perfils de navegació - Amaga el transport públic - Mostra o amaga el transport públic Botó que mostra o oculta el transport públic al mapa. Crea o edita PDI Posicions d’aparcament @@ -3744,7 +3720,6 @@ \n • S\'han corregit problemes en la importació/exportació de la configuració dels perfils \n \n - Mostra el transport públic Afegeix un perfil Canvia el perfil de l\'aplicació Mapa general del món (detallat) diff --git a/OsmAnd/res/values-cs/strings.xml b/OsmAnd/res/values-cs/strings.xml index 94db359827..b03ed5cf61 100644 --- a/OsmAnd/res/values-cs/strings.xml +++ b/OsmAnd/res/values-cs/strings.xml @@ -2117,10 +2117,6 @@ Duplicitní název rychlé akce Tlačítko pro zobrazení nebo skrytí Oblíbených míst na mapě. Tlačítko pro zobrazení nebo skrytí bodů zájmu na mapě. - Zobrazit/skrýt Oblíbená místa - Zobrazit oblíbená místa - Skrýt Oblíbená místa - Zobrazit/skrýt POI Zobrazit %1$s Skrýt %1$s Přidat kategorii @@ -2227,8 +2223,6 @@ Zadat cíl Nahradit cíl Přidat první mezicíl - Zobrazit OSM poznámky - Skrýt OSM poznámky Tlačítko pro zobrazení nebo skrytí OpenStreetMap poznámek na mapě. Seřazeno podle vzdálenosti Hledat v Oblíbených @@ -2276,7 +2270,6 @@ Zvětšit okruh hledání Nic nalezeno Změňte vyhledávací dotaz nebo zvětšete okruh hledání. - Zobrazit nebo skrýt OSM poznámky Oprávnění Nepodařilo se naimportovat soubor. Prosím zkontrolujte, zda má OsmAnd oprávnění ke čtení souboru. Vzdálenost opravená @@ -2843,10 +2836,7 @@ Typy silnic Výjezd na Vyměnit - Zobrazit/skrýt stopy Tlačítko pro zobrazení nebo skrytí vybraných stop na mapě. - Skrýt stopy - Zobrazit stopy %1$d přenosů Přidat počáteční a cílový bod Přidat počáteční bod @@ -3255,9 +3245,6 @@ Trasa bude přepočítána, pokud vzdálenost od trasy k aktuální poloze je větší než zvolená hodnota. %1$s z %2$s Svahy - Zobrazit nebo skrýt terén - Skrýt terén - Zobrazit terén Tlačítko pro zobrazení nebo skrytí vrstvy terénu na mapě. Smazat popis Přidat popis @@ -3459,9 +3446,6 @@ Video poznámky Nastavte výšku plavidla, abyste se vyhnuli nízkým mostům. Mějte na paměti, že u pohyblivých mostů se zohledňuje jejich výška v otevřeném stavu. Nastavte šířku plavidla, abyste se vyhnuli úzkým mostům - Zobrazit/skrýt Mapillary - Skrýt Mapillary - Zobrazit Mapillary Přepínač pro zobrazení nebo skrytí mapové vrstvy Mapillary. Zadejte délku vozidla, která musí být na trase povolená. Omezení délky @@ -3639,9 +3623,6 @@ Položky v úvodním panelu a kontextovém menu Nastavení uživatelského rozhraní Úvodní panel - Skrýt veřejnou dopravu - Zobrazit veřejnou dopravu - Zobrazit nebo skrýt veřejnou dopravu Tlačítko pro zobrazení nebo skrytí veřejné dopravy na mapě. Vytvořit nebo upravit bod zájmu Parkovací místa @@ -3758,13 +3739,7 @@ \n \n Tuto změnu můžete aplikovat na všechny profily nebo jen na vybraný profil. - Zobrazit/skrýt stínování svahů - Skrýt stínování svahů - Zobrazit stínování svahů Tlačítko pro zobrazení nebo skrytí stínování svahů na mapě. - Zobrazit/skrýt vrstevnice - Skrýt vrstevnice - Zobrazit vrstevnice Tlačítko pro zobrazení nebo skrytí vrstevnic na mapě. Nepodařilo se spustit modul převodu textu na řeč. Bílá diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index c176ef70df..6ae0917dba 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -2123,10 +2123,6 @@ Dublet genvejsnavn En til/fra-knap til at vise eller skjule Favoritpunkter på kortet. En til/fra-knap til at vise eller skjule interessepunkter på kortet. - Vis/skjul Favoritter - Vis Favoritter - Skjul Favoritter - Vis/skjul intetessepunkt (IP) Vis %1$s Skjul %1$s Tilføj en kategori @@ -2394,9 +2390,6 @@ Skjul fra zoom-niveau Sorteret efter afstand Søg i Favoritter - Vis eller skjul OSM-noter - Vis OSM-noter - Skjul OSM-noter Knap til at vise eller skjule OSM-noter på kortet. Start søgning igen Øg søgeradius @@ -2849,10 +2842,7 @@ Vejtyper Stå af ved Stig på ved stoppested - Vis/skjul GPX spor En knap til at vise eller skjule valgte GPX-spor på kortet. - Skjul GPX spor - Vis GPX spor Angiv en destination først Aktivér offentlig transport for OsmAnd Live ændringer. OsmAnd Live offentlig transport @@ -3267,13 +3257,7 @@ Foretræk ikke-asfalterede veje fremfor asfalterede veje. OSM redigeringer Knap der viser eller skjuler højdekurver på kortet. - Vis højdekurver - Skjul højdekurver - Vis/skjul højdekurver En knap der viser eller skjuler reliefskygger på kortet. - Vis reliefskygger - Skjul reliefskygger - Vis/skjul reliefskygger Hvid Tekst-til-tale-programmet kan ikke startes. Simuler positionen ved hjælp af et optaget GPX-spor. @@ -3436,9 +3420,6 @@ Ruten genberegnes, hvis afstanden fra ruten til den aktuelle placering er større end den valgte værdi. %1$s af %2$s Skråninger - Vis/skjul terræn - Skjul terræn - Vis terræn En knap der viser eller skjuler terrænlag på kortet. Slet beskrivelse Tilføj beskrivelse @@ -3560,9 +3541,6 @@ Navigationsprofiler OsmAnd Tracker OsmAnd køb - Skjul offentlig transport - Vis offentlig transport - Vis/skjul offentlig transport En knap til at vise eller skjule offentlig transport på kortet. Opret/rediger IP Parkeringsplads @@ -3586,7 +3564,7 @@ Hver navigationsinstruktion tænder skærmen. Navigationsinstruktioner Tænd/sluk-knap - Nærhedssensor + Nærhedsføler Hold skærmen tændt Hold skærmen slukket Pseudo-Mercatorprojektion @@ -3606,9 +3584,6 @@ Vis eller skjul yderligere kort-detaljer Natkort Tilføj onlinekilde - Vis/skjul Mapillary - Skjul Mapillary - Vis Mapillary Slet næste destinationspunkt Lydstyrkeknapper som zoom Angiv et navn til punktet @@ -3788,4 +3763,28 @@ Opdel før Opdel efter Tilføj et nyt segment + Start optagelse + Kørestol + + Varevogn + Tung gods transport + Elektrisk cykling + Bjerg cykling + Normal cykling + Racercykel + Lastbil + Server fejl: %1$s + Redigere beskrivelse + Send afsluttet + Sender %1$d af %2$d + Sendt %1$d af %2$d + Sender + Brug test.openplacereviews.org + Vinter + Ride + Cykle + Løbe + + Motorcykel + Bil \ No newline at end of file diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 931f8aaa37..73ae09b097 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -2111,11 +2111,9 @@ Aktionsname Eine Schaltfläche zum Hinzufügen einer Kartenmarkierung in der Bildschirmmitte. Ort - Favoriten ein-/ausblenden Eine Schaltfläche, um eine Audio-Notiz in der Bildschirmmitte einzufügen. Eine Schaltfläche, um eine Video-Notiz in der Bildschirmmitte einzufügen. Eine Schaltfläche, um eine Foto-Notiz in der Bildschirmmitte einzufügen. - POI ein-/ausblenden %1$s anzeigen %1$s ausblenden Kategorie hinzufügen @@ -2139,8 +2137,6 @@ Kartenquelle hinzufügen Die Kartenquelle wurde in „%s“ geändert. Schaltflächenposition ändern - Favoriten anzeigen - Favoriten ausblenden Kategorie, in der der Favorit gespeichert werden soll: Wählen Sie eine beliebige Kategorie. Schnellaktion @@ -2386,9 +2382,6 @@ Privatzugang erlauben Zugang zu Privatgrund erlauben. Farbschema - OSM-Hinweise ein- oder ausblenden - OSM-Hinweise einblenden - OSM-Hinweise ausblenden Schaltfläche zum Ein- oder Ausblenden von OSM-Hinweisen auf der Karte. Nach Entfernung sortiert In Favoriten suchen @@ -2853,10 +2846,7 @@ Von %1$s Schritt für Schritt Straßentypen - Tracks ein-/ausblenden Eine Schaltfläche zum Ein- oder Ausblenden ausgewählter Tracks auf der Karte. - Tracks ausblenden - Tracks einblenden Aussteigen bei Zusteigen an Haltestelle Aktivierung von OsmAnd Live für Änderungen bei öffentlichen Verkehrsmitteln. @@ -2986,7 +2976,7 @@ Änderungen speichern Änderungen am Profil zuerst speichern Profil löschen - Möchten Sie das Profil „%s“ wirklich löschen\? + Möchten Sie das Profil „%s“ wirklich löschen Wählen Sie zunächst ein Profil aus Bauen Sie ein eigenes Anwendungsprofil auf einem der Standardprofile der App auf. Dieses bestimmt die Grundeinstellungen wie Voreinstellungen zur Sichtbarkeit von Widgets und die Einheiten für Geschwindigkeit und Entfernungen. Dies sind die App-Standardprofile zusammen mit Beispielen für eigene Anwendungsprofile, die erweitert werden können: Navigationsart auswählen @@ -3271,13 +3261,7 @@ Bei der Navigation unbefestigte Straßen gegenüber befestigten bevorzugen. OSM-Bearbeitungen Schaltfläche zum Ein- und Ausblenden von Höhenlinien auf der Karte. - Höhenlinien anzeigen - Höhenlinien ausblenden - Höhenlinien ein-/ausblenden Schaltfläche zum Ein- oder Ausblenden der Reliefdarstellung. - Relief anzeigen - Relief ausblenden - Relief ein-/ausblenden Text-to-Speech-Engine kann nicht gestartet werden. Simulation Ihrer Position mit einem aufgezeichneten GPX-Track. Profil exportieren @@ -3496,9 +3480,6 @@ Beschreibung hinzufügen Beschreibung löschen Eine Schaltfläche zum Ein- und Ausblenden der Geländeebene auf der Karte. - Gelände einblenden - Gelände ausblenden - Gelände ein- oder ausblenden Relief Zoomstufen Transparenz @@ -3614,9 +3595,6 @@ \n Fortfahren Sie können auf diese Aktionen zugreifen, indem Sie auf die Schaltfläche \"%1$s\" tippen. - Öffentliche Verkehrsmittel ausblenden - Öffentliche Verkehrsmittel anzeigen - Öffentliche Verkehrsmittel anzeigen oder ausblenden Schaltfläche zum Ein- oder Ausblenden der öffentlichen Verkehrsmittel auf der Karte. POI erstellen oder bearbeiten Parkpositionen @@ -3689,9 +3667,6 @@ Sie können die Schiffshöhe einstellen, um niedrige Brücken zu vermeiden. Denken Sie daran, wenn die Brücke beweglich ist, werden wir ihre Höhe im offenen Zustand verwenden. Schiffshöhe einstellen, um niedrige Brücken zu vermeiden. Beachten Sie: Wenn die Brücke beweglich ist, verwendet die Berechnung ihre Höhe im geöffneten Zustand. Stellen Sie die Schiffsbreite ein, um schmale Brücken zu vermeiden - Mapillary ein-/ausblenden - Mapillary ausblenden - Mapillary anzeigen Eine Umschaltfläche zum Ein- oder Ausblenden des Mapillary-Layers auf der Karte. Blitzer deinstallieren Rechtliches @@ -4035,4 +4010,4 @@ sek Rennsport Erste Ankündigung (größere Distanz) - \ No newline at end of file + diff --git a/OsmAnd/res/values-el/strings.xml b/OsmAnd/res/values-el/strings.xml index 901ae967d1..73b9f244c5 100644 --- a/OsmAnd/res/values-el/strings.xml +++ b/OsmAnd/res/values-el/strings.xml @@ -1532,9 +1532,6 @@ Φωτογραφίες με σύνδεση Προσθήκη φωτογραφιών Δεν βρέθηκε τίποτα - Εμφάνιση ή απόκρυψη σημειώσεων OSM - Εμφάνιση σημειώσεων OSM - Απόκρυψη σημειώσεων OSM Προς Ετικέτες POI Χωρίς όνομα @@ -2635,10 +2632,6 @@ Διπλό όνομα γρήγορης ενέργειας Εναλλαγή εμφάνισης ή απόκρυψης των αγαπημένων σημείων στον χάρτη. Εναλλαγή εμφάνισης ή απόκρυψης ΣΕ στον χάρτη. - Εμφάνιση/απόκρυψη αγαπημένων - Εμφάνιση αγαπημένων - Απόκρυψη αγαπημένων - Εμφάνιση/απόκρυψη ΣΕ Εμφάνιση %1$s Απόκρυψη %1$s Προσθήκη κατηγορίας @@ -2901,10 +2894,7 @@ Αλλαγή Εμφάνιση περισσοτέρων Εμφανιζόμενα ίχνη - Εμφάνιση/απόκρυψη ιχνών GPX Πλήκτρο εμφάνισης ή απόκρυψης επιλεγμένων ιχνών GPX στον χάρτη. - Απόκρυψη ιχνών GPX - Εμφάνιση ιχνών GPX Παρακαλούμε ορίστε τον προορισμό πρώτα Προηγούμενη διαδρομή Προσθήκη κατοικίας @@ -3273,13 +3263,7 @@ Να προτιμώνται μη στρωμένοι δρόμοι για δρομολόγηση. Επεξεργασίες OSM Πλήκτρο εμφάνισης ή απόκρυψης ισοϋψών γραμμών στον χάρτη. - Εμφάνιση ισοϋψών γραμμών - Απόκρυψη ισοϋψών γραμμών - Εμφάνιση/Απόκρυψη ισοϋψών γραμμών Εμφάνιση ή απόκρυψη πλήκτρου σκίασης αναγλύφου στον χάρτη. - Εμφάνιση σκίασης ανάγλυφου - Απόκρυψη σκίασης ανάγλυφου - Εμφάνιση/Απόκρυψη σκίασης ανάγλυφου Αδυναμία εκκίνησης μηχανής κειμένου σε ομιλία. Προσομοίωση της θέσης σας χρησιμοποιώντας καταγεγραμμένη διαδρομή GPX. Εξαγωγή κατατομής (προφίλ) @@ -3497,9 +3481,6 @@ Μπορείτε να ορίσετε ύψος σκάφους για να αποφύγετε χαμηλές γέφυρες. Σημειώστε ότι εάν η γέφυρα είναι κινητή, θα χρησιμοποιηθεί το ύψος της ανοικτής κατάστασης. Ορίστε ύψος σκάφος για αποφυγή χαμηλών γεφυρών. Σημειώστε ότι εάν η γέφυρα είναι κινητή, θα χρησιμοποιηθεί το ύψος της στην ανοικτή κατάσταση. Ορίστε πλάτος σκάφους για αποφυγή στενών γεφυρών - Εμφάνιση/Απόκρυψη Mapillary - Απόκρυψη Mapillary - Εμφάνιση Mapillary Εναλλαγή εμφάνισης ή απόκρυψης της στρώσης Mapillary του χάρτη. Καθορίστε μήκος οχήματος που επιτρέπεται στους δρόμους. Όριο μήκους @@ -3601,9 +3582,6 @@ \n • Διόρθωση σφαλμάτων με RTL \n \n - Απόκρυψη δημόσιων συγκοινωνιών - Εμφάνιση δημόσιων συγκοινωνιών - Εμφάνιση/απόκρυψη δημόσιων συγκοινωνιών Πλήκτρο εμφάνισης ή απόκρυψης δημόσιων συγκοινωνιών στον χάρτη. Δημιουργία / Επεξεργασία ΣΕ Θέσεις στάθμευσης @@ -3715,9 +3693,6 @@ Η διαδρομή θα επανυπολογιστεί εάν η απόσταση από τη διαδρομή στην τρέχουσα θέση είναι μεγαλύτερη από την επιλεγμένη τιμή. %1$s από %2$s Πλαγιές - Εμφάνιση / απόκρυψη εδάφους - Απόκρυψη εδάφους - Εμφάνιση εδάφους Ένα πλήκτρο εμφάνισης ή απόκρυψης της στρώσης εδάφους στον χάρτη. Διαγραφή περιγραφής Προσθήκη περιγραφής diff --git a/OsmAnd/res/values-en-rGB/strings.xml b/OsmAnd/res/values-en-rGB/strings.xml index 97aedb7ad8..dd1352998f 100644 --- a/OsmAnd/res/values-en-rGB/strings.xml +++ b/OsmAnd/res/values-en-rGB/strings.xml @@ -96,9 +96,6 @@ Tapping the action button will add a map marker at the screen centre location. Tapping the action button will add a GPX waypoint at the screen centre location. Tapping the action button will show or hide the favourite points on the map. - Show/hide favourites - Show Favourites - Hide Favourites Category to save the Favourite in: Analyse on map You have cancelled your OsmAnd Live subscription diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index f8442229c2..4527d0bd13 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -2117,10 +2117,6 @@ Duplikata nomo de rapida ago Butono por montri/kaŝi ŝatatajn ejojn sur la mapo. Butono por montri/kaŝi interesejojn sur la mapo. - Montri/kaŝi ŝatatajn - Montri ŝatatajn - Kaŝi ŝatatajn - Montri/kaŝi interesejojn Montri %1$s Kaŝi %1$s Aldoni kategorion @@ -2386,9 +2382,6 @@ Kaŝi komence de skal‑nivelo Ordigitaj laŭ distanco Serĉi en ŝatataj - Montri aŭ kaŝi OSM-rimarkojn - Montri OSM-rimarkojn - Kaŝi OSM-rimarkojn Butono por montri/kaŝi OSM‑rimarkojn sur la mapo. Rekomenci serĉon Pliigi serĉan radiuson @@ -2842,10 +2835,7 @@ Specoj de vojoj Eliru ĉe Atendu ĉe haltejo - Montri/kaŝi spurojn Butono por montri/kaŝi elektitajn spurojn sur la mapo. - Kaŝi spurojn - Montri spurojn Aktivigi publikan transporton por ŝanĝoj OsmAnd Live. Publika transporto OsmAnd Live Pliaj informoj pri kiel OsmAnd difinas kursojn estas legeblaj ĉe nia taglibro. @@ -3261,13 +3251,7 @@ Preferi vojojn sen firma pavimo. OSM‑redaktoj Butono por montri/kaŝi nivelkurbojn sur la mapo. - Montri nivelkurbojn - Kaŝi nivelkurbojn - Montri/kaŝi nivelkurbojn Butono por montri/kaŝi nivelombrumon (reliefon) sur la mapo. - Montri nivelombrumon - Kaŝi nivelombrumon - Montri/kaŝi nivelombrumon Antaŭkalkulas tempon de alveno por vojoj de nekonata speco kaj limigas rapidon por ĉiuj vojoj (povas influi kurs‑difinadon). Ne povas ekigi parolsintezilon. Elporti profilon @@ -3493,9 +3477,6 @@ Mapklarigo Nivelombrumo %1$s el %2$s - Montri aŭ kaŝi teren‑formon - Kaŝi teren‑formon - Montri teren‑formon Butono por montri/kaŝi tavolon de formo de tereno sur la mapo. Forigi priskribon Aldoni priskribon @@ -3608,9 +3589,6 @@ \n \n Vi povas ekigi tiujn agojn per frapeti la butonon “%1$s”. - Kaŝi publikan transporton - Montri publikan transporton - Montri aŭ kaŝi publikan transporton Butono por montri/kaŝi publikan transporton sur la mapo. Krei aŭ redakti interesejon Aldoni aŭ forigi ŝatatan ejojn @@ -3679,9 +3657,6 @@ Vi povas enigi alton de via akvoveturilo por eviti malaltajn pontojn. Estu konscia, ke se ponto estas movebla, la alto en ĝia malfermita stato estos uzata. Enigu alton de akvoveturilo por eviti malaltajn pontojn. Estu konscia, ke se ponto estas movebla, la alto en ĝia malfermita stato estos uzata. Enigu larĝon de akvoveturilo por eviti mallarĝajn pontojn - Montri/kaŝi Mapillary - Kaŝi Mapillary - Montri Mapillary Ŝaltilo por montri aŭ kaŝi tavolon de Mapillary sur la mapo. Malinstali informojn pri rapidkontroliloj Leĝaj diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml index c42ad76035..ebc5155a51 100644 --- a/OsmAnd/res/values-es-rAR/phrases.xml +++ b/OsmAnd/res/values-es-rAR/phrases.xml @@ -316,8 +316,8 @@ Oficina administrativa Aduana Ciudad - Pueblo - Pueblito;Villa + Ciudad pequeña + Pueblo;Villa Aldea Vivienda aislada Barrio;Suburbio diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index 5ab5e53945..b00f05b3e8 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -380,10 +380,10 @@ No se ha encontrado un desvío Actualización disponible para %1$s mapa(s) Encender pantalla - Accede a tantos tipos de mapas en línea (llamados teselas o ráster) que desees, desde teselas predefinidas de OSM (como Mapnik) a imágenes satelitales y capas de propósito especial como mapas del tiempo, mapas del clima, mapas geológicos, capas de sombreado, etc. -\n -\nCualquiera de estos mapas puede usarse como el mapa predefinido que se mostrará, o como una superposición o subyacencia de otro mapa base (como los mapas estándar de OsmAnd en línea). Ciertos elementos de los mapas vectoriales de OsmAnd pueden ocultarse a través del menú «Configurar mapa» para hacer cualquier subyacencia mas visible. -\n + Accede a tantos tipos de mapas en línea (llamados teselas o ráster) que desees, desde teselas predefinidas de OSM (como Mapnik) a imágenes satelitales y capas de propósito especial como mapas meteorológicos, mapas del clima, mapas geológicos, capas de sombreado, etc. +\n +\nCualquiera de estos mapas puede usarse como el mapa predefinido que se mostrará, o como una superposición o subyacencia de otro mapa base (como los mapas estándar de OsmAnd en línea). Ciertos elementos de los mapas vectoriales de OsmAnd pueden ocultarse a través del menú «Configurar mapa» para hacer cualquier subyacencia mas visible. +\n \nDescarga las teselas de los mapas directamente en línea, o prepáralo para su uso sin conexión (copiar manualmente en la carpeta de datos OsmAnd) como una base de datos SQLite que puede ser producida por una variedad de herramientas de preparación de mapas de terceros. Activa la funcionalidad para registrar y guardar tus trazas manualmente pulsando el widget de grabación GPX en el mapa, o automáticamente registrando todas tus rutas navegadas en un archivo GPX. \n @@ -418,7 +418,7 @@ Registra dónde se ha estacionado el automóvil, incluyendo cuánto tiempo queda. \n Tanto la ubicación como el tiempo del estacionamiento se muestran en el menú principal y en un widget sobre el mapa. Se puede añadir una alarma de recordatorio al calendario de Android. Crea caminos pulsando el mapa, usando o modificando archivos GPX existentes, para planificar un viaje y medir la distancia entre puntos. El resultado puede guardarse como un archivo GPX y usarse luego para la orientación. - Activa las funciones de accesibilidad del dispositivo, directamente en OsmAnd. Facilita por ejemplo, el ajuste de la velocidad de la voz para voces de texto a voz, la configuración de navegación D-pad, usando la rueda de desplazamiento para el control del zoom, o la retroalimentación de texto a voz, por ejemplo, para anunciar la ubicación automáticamente. + Activa las funciones de accesibilidad del dispositivo, directamente en OsmAnd. Facilita por ejemplo, el ajuste de la velocidad de la voz para voces de texto a voz, la configuración de navegación del pad direccional, usando la rueda de desplazamiento para el control del zoom, o la retroalimentación de texto a voz, por ejemplo, para anunciar la ubicación automáticamente. Haz contribuciones en OSM, como el crear o modificar objetos PDI, abrir o comentar notas de OSM y contribuir con archivos de trazas GPX grabados en OsmAnd, proporcionando tu nombre de usuario y contraseña. OpenStreetMap.org es un proyecto de mapeo de dominio público, global, libre e impulsado por la comunidad. Ajusta las funciones de desarrollo y depuración, como la simulación de navegación, el rendimiento del renderizado o las indicaciones por voz. Destinado para desarrolladores, no es necesario para el normal uso de la aplicación. Descargar el mapa especial sin conexión para mostrar las instalaciones de esquí. @@ -1056,8 +1056,8 @@ ¿Borrar «%1$s»? Suburbio Aldea - Villa - Pueblo + Pueblo + Ciudad pequeña Ciudad Parar simulación Iniciar simulación @@ -1662,7 +1662,7 @@ Navegación Ejecutar en modo reposo Información del favorito - Añadir a Favoritos + Añadir favorito Caminos Define la unidad de velocidad. Unidad de velocidad @@ -2120,10 +2120,6 @@ Nombre de la acción rápida duplicado Un botón que muestra u oculta los puntos favoritos en el mapa. Un botón que muestra u oculta los PDI en el mapa. - Mostrar u ocultar Favoritos - Mostrar Favoritos - Ocultar Favoritos - Mostrar u ocultar PDI Mostrar %1$s Ocultar %1$s Añadir una categoría @@ -2388,9 +2384,6 @@ Descarga la capa superpuesta del mapa «Sombreado» para mostrar el sombreado vertical. Instala el complemento «Curvas de nivel» para mostrar las áreas verticales graduadas. Ocultar desde el nivel de zoom - Mostrar u ocultar notas de OSM - Mostrar notas de OSM - Ocultar notas de OSM Un botón que muestra u oculta las notas de OSM en el mapa. Ordenados por distancia Buscar en Favoritos @@ -2675,7 +2668,7 @@ Wikiviajes Artículos de Wikiviajes en todo el mundo La página sólo está disponible en línea. ¿Abrirla en el navegador web? - Caché de imágenes + Almacén de imágenes Borrar historial de búsquedas Mostrar imágenes No @@ -2846,10 +2839,7 @@ Tipos de caminos Bajar en Esperar en la parada - Mostrar u ocultar trazas Un botón que muestra u oculta las trazas elegidas en el mapa. - Ocultar trazas - Mostrar trazas Activar el transporte público para los cambios de OsmAnd Live. Transporte público en OsmAnd Live %1$d transbordo(s) @@ -3265,13 +3255,7 @@ Prefiere los caminos sin pavimentar a los pavimentados para el trazado de rutas. Ediciones de OSM Un botón que muestra u oculta las curvas de nivel en el mapa. - Mostrar curvas de nivel - Ocultar curvas de nivel - Mostrar u ocultar curvas de nivel Un botón que muestra u oculta el sombreado de las colinas en el mapa. - Mostrar el sombreado - Ocultar el sombreado - Mostrar u ocultar el sombreado Imposible iniciar el motor de habla sintetizada. Simular la ubicación usando una traza GPX grabada. Exportar perfil @@ -3319,7 +3303,7 @@ Elegir el color Los perfiles predefinidos de OsmAnd no se pueden borrar, sino desactivar (en la pantalla anterior) u ordenarse en la parte inferior. Editar perfiles - El «Tipo de navegación» rige la forma en que se calculan las rutas. + El «Tipo de navegación» determina cómo se calculan las rutas. Aspecto del perfil Icono, color y nombre Editar la lista de perfiles @@ -3495,9 +3479,6 @@ Permite ver el sombreado o el mapa de pendientes. Puedes leer más sobre estos tipos de mapas en nuestro sitio. Sombreado Pendientes - Mostrar u ocultar terreno - Ocultar terreno - Mostrar terreno Un botón que muestra u oculta la capa del terreno en el mapa. Borrar descripción Añadir descripción @@ -3562,7 +3543,7 @@ Kirguís Kazajo Javanés - Gujarati + Gujaratí Chuvash Checheno Bávaro @@ -3589,7 +3570,7 @@ Marcadores del mapa Favoritos Suscripción - OsmAnd Live - Compras de OsmAnd + Compras en OsmAnd La guía para la simbología de un mapa. Perfiles de navegación • Nuevos mapas sin conexión de las pendientes @@ -3612,9 +3593,6 @@ \n \n Puedes acceder a estas acciones pulsando el botón «%1$s». - Ocultar transporte público - Mostrar transporte público - Mostrar u ocultar transporte público Botón que muestra u oculta el transporte público en el mapa. Crear o editar PDI Puestos de estacionamiento @@ -3697,9 +3675,6 @@ Legal Mantener Desinstalar - Mostrar u ocultar Mapillary - Ocultar Mapillary - Mostrar Mapillary Un botón que alterna la capa de Mapillary en el mapa. Rumbo %1$s borrado @@ -3919,7 +3894,7 @@ Elegir imagen Alemán (casual) %1$s * %2$s - Avión ligero + Aeronave ligera Unir segmentos Dividir antes Dividir después diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml index a231dfc79f..d645598dec 100644 --- a/OsmAnd/res/values-es-rUS/strings.xml +++ b/OsmAnd/res/values-es-rUS/strings.xml @@ -2120,10 +2120,6 @@ Nombre de la acción rápida duplicado Un botón que muestra u oculta los puntos favoritos en el mapa. Un botón que muestra u oculta los PDI en el mapa. - Mostrar u ocultar Favoritos - Mostrar Favoritos - Ocultar Favoritos - Mostrar u ocultar PDI Mostrar %1$s Ocultar %1$s Añadir una categoría @@ -2388,9 +2384,6 @@ Descarga la capa superpuesta del mapa «Sombreado» para mostrar el sombreado vertical. Instala el complemento «Curvas de nivel» para mostrar las áreas verticales graduadas. Ocultar desde el nivel de zoom - Mostrar u ocultar notas de OSM - Mostrar notas de OSM - Ocultar notas de OSM Un botón que muestra u oculta las notas de OSM en el mapa. Ordenados por distancia Buscar en Favoritos @@ -2846,10 +2839,7 @@ Tipos de caminos Bajar en Esperar en la parada - Mostrar u ocultar trazas Un botón que muestra u oculta las trazas elegidas en el mapa. - Ocultar trazas - Mostrar trazas Activar el transporte público para los cambios de OsmAnd Live. Transporte público en OsmAnd Live %1$d transbordo(s) @@ -3264,13 +3254,7 @@ Prefiere los caminos sin pavimentar a los pavimentados para el trazado de rutas. Ediciones de OSM Un botón que muestra u oculta las curvas de nivel en el mapa. - Mostrar curvas de nivel - Ocultar curvas de nivel - Mostrar u ocultar curvas de nivel Un botón que muestra u oculta el sombreado de las colinas en el mapa. - Mostrar el sombreado - Ocultar el sombreado - Mostrar u ocultar el sombreado Imposible iniciar el motor de habla sintetizada. Simular la ubicación usando una traza GPX grabada. Exportar perfil @@ -3496,9 +3480,6 @@ La ruta será recalculada si la distancia a la ubicación actual es mayor que el valor elegido. %1$s de %2$s Pendientes - Mostrar u ocultar terreno - Ocultar terreno - Mostrar terreno Un botón que muestra u oculta la capa del terreno en el mapa. Borrar descripción Añadir descripción @@ -3612,9 +3593,6 @@ \n Reanudar Puedes acceder a estas acciones pulsando el botón «%1$s». - Ocultar transporte público - Mostrar transporte público - Mostrar u ocultar transporte público Botón que muestra u oculta el transporte público en el mapa. Crear o editar PDI Puestos de estacionamiento @@ -3695,9 +3673,6 @@ \nPulsa en «%2$s», para borrar todos los datos relacionados con los radares de velocidad (alertas, notificaciones y PDI) hasta reinstalar OsmAnd completamente. Mantener Desinstalar - Mostrar u ocultar Mapillary - Ocultar Mapillary - Mostrar Mapillary Un botón que alterna la capa de Mapillary en el mapa. Rumbo %1$s borrado diff --git a/OsmAnd/res/values-es/phrases.xml b/OsmAnd/res/values-es/phrases.xml index ef46a9d93d..3bbabd071b 100644 --- a/OsmAnd/res/values-es/phrases.xml +++ b/OsmAnd/res/values-es/phrases.xml @@ -3881,4 +3881,14 @@ Embajada Consulado Embajada + Biblioteca móvil (parada) + Registro de cumbre: no + Registro de cumbre: sí + Estado de la pista: cerrada + Estado de la pista: abierta + Patrullado: no + Patrullado: sí + Arbolado: sí + Nombre de la pista + Salto con esquís \ No newline at end of file diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index b0b779d318..1c21bdf4f0 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -2,7 +2,7 @@ Configurar pantalla Carriles - Sin caminos sin pavimentar + Sólo caminos pavimentados Sin ferris Evitar… Mostrar alertas… @@ -14,16 +14,16 @@ Usar superpuestos fluorescentes Usa colores fluorescentes para mostrar trazas y rutas. Edición sin conexión - Si la edición sin conexión está habilitada, los cambios se guardarán primero localmente y se cargarán a pedido; de lo contrario, los cambios se cargarán inmediatamente. + Si se activa la edición sin conexión, los cambios serán guardados localmente primero y serán cargados por solicitud, de lo contrario los cambios serán cargados inmediatamente. Los cambios de PDI dentro de la aplicación no afectan a los archivos de mapa descargados; en su lugar, los cambios se guardan como un archivo en el dispositivo. Subiendo… - {0} PDI/Notas de OSM subidos + {0} PDI/notas de OSM subidos Enviar todos Subir edición a OSM Borrar edición Edición asíncrona OSM: - PDI/Notas de OSM guardados en el dispositivo - Muestra y gestiona PDI/Notas de OSM en la base de datos de tu dispositivo. + PDI/notas de OSM guardados en el dispositivo + Muestra y gestiona PDI/notas de OSM en la base de datos del dispositivo. Indica el intervalo del seguimiento en línea. Intervalo del seguimiento en línea Indica la dirección web con sintaxis de parámetros : lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}. @@ -50,7 +50,7 @@ Indicaciones por voz (TTS, preferido) Wikipedia (sin conexión) Definido por el usuario - Ya existe un archivo con los Favoritos exportados previamente. ¿Quiere sustituirlo? + Ya existe un archivo con los Favoritos exportados previamente. ¿Quieres sustituirlo\? Ajustes de perfiles específicos Perfil predefinido La vista del mapa y los ajustes de navegación se recuerdan por el perfil usado. Elige tu perfil predefinido aquí. @@ -63,14 +63,14 @@ Configura la pantalla y ajustes globales de la aplicación. Ajustes globales de la aplicación Usuario de OSM - Necesario para envíos a openstreetmap.org. + Necesario para envíos a OpenStreetMap.org. Contraseña Modo reposo OsmAnd se ejecuta en modo reposo con la pantalla apagada. Descargar un mapa vectorial sin conexión de esta ubicación en «Ajustes → Gestionar mapas», o cambiar al complemento «Mapas en línea». Sin espacio suficiente para descargar %1$s MB (disponible: %2$s). ¿Descargar {0} archivo(s)\? -\nUtilizado {1} MB (de {2} MB). +\n Utilizado {1} MB (de {2} MB). Tema transparente La biblioteca nativa es incompatible con este dispositivo. Inicializando biblioteca nativa… @@ -81,7 +81,7 @@ Centrado automático del mapa activado. Opciones específicas de dibujo vectorial Superpuesta / subyacente - Ajustes de la fuente del mapa + Ajustes del repositorio de mapas Ajustes del mapa vectorial ¿Borrar «%1$s»? Suburbio @@ -130,7 +130,9 @@ No, gracias Descarga el mapa base mundial para una vista general global en zooms pequeños. Descarga los datos («sin conexión») para usar los mapas sin conexión. - \n\nMantenga pulsado para opciones + " +\n +\nMantén pulsado para opciones" Versión local %1$d de %2$d elemento(s) desactivado(s). %1$d de %2$d elemento(s) borrado(s). @@ -178,7 +180,7 @@ Ajustar transparencia de la capa superpuesta. Transparencia de superposición Ajustar transparencia del mapa base. - Transparencia de mapa base + Transparencia del mapa base Definir transparencia (0 - transparente, 255 - opaco) Mapa subyacente… Mapa subyacente @@ -303,7 +305,7 @@ Mostrar teléfono del PDI Sitio web Teléfono - escriba el filtro + escribe el filtro Pantalla de alta resolución No estira (ni hace borrosas) las teselas de mapa en pantallas de alta densidad. Ubicación aún desconocida. @@ -341,7 +343,7 @@ Favoritos Notas de OSM (en línea) Superposición de PDI… - Fuente del mapa… + Repositorio de mapas… Capas de mapas Buscar PDI Usa un dispositivo con rueda de desplazamiento para mover el mapa. @@ -358,7 +360,7 @@ Intervalo de activación del GPS Método de ubicación usado del modo reposo: Proveedor de ubicación - Realiza un seguimiento de su ubicación con la pantalla apagada. + Realiza un seguimiento de tu ubicación con la pantalla apagada. Ejecutar OsmAnd en modo reposo El servicio de navegación en modo reposo, necesita un proveedor de ubicación para activarse. Ocultar filtro @@ -438,7 +440,7 @@ Búsqueda sin conexión Búsqueda en línea Máximo zoom en línea - No busca en los mapas en línea niveles de zoom más allá de éste. + No buscar en los mapas en línea para niveles de zoom más allá de esto. Distancia total %1$s, tiempo de viaje %2$d h %3$d min. Servicios de navegación con o sin conexión. Servicio de navegación @@ -486,10 +488,10 @@ Terminado Usa Internet para calcular la ruta. Usar navegación en línea - Indica los ajustes de OpenStreetMap.org (OSM) necesarios para envíos a OSM. + Indica los ajustes de OpenStreetMap.org (OSM) necesarios para subir ediciones. Indica el idioma, descargar/recargar datos. Datos - Edición OpenStreetMap + Edición de OpenStreetMap Nivel de zoom según la velocidad (mientras el mapa se sincroniza con la ubicación actual). Zoom automático del mapa Ajustes adicionales @@ -516,9 +518,9 @@ Visión 3D del mapa Muestra la última superposición de PDI usada. Mostrar superposición de PDI - Elegir origen de las teselas de mapas en línea o en caché. - Fuente de teselas del mapa - Fuente del mapa + Elige el repositorio de los mapas en línea o teselas en caché. + Repositorio de teselas del mapa + Repositorio del mapa Usar Internet Mostrar su ubicación Mostrar coordenadas GPS en el mapa @@ -601,20 +603,20 @@ Para países donde la gente conduce por el lado izquierdo del camino. Punto de partida aún no determinado. ¿Cancelar la descarga\? - El mapa base necesario para proporcionar funcionalidad básica está en la cola de descargas. - Activa el complemento «Mapas en línea», para elegir diferentes fuentes de mapas + El mapa base necesario para proporcionar la funcionalidad básica, está en la cola de descarga. + Activa el complemento «Mapas en línea», para elegir diferentes repositorios de mapas Mapas en línea y teselas Usa mapas en línea (descarga y guarda teselas en la tarjeta de memoria). Mapas en línea - Elige las fuentes de teselas de mapas en línea o en caché. - Accede a muchos tipos de mapas en línea (llamados teselas o ráster), desde teselas predefinidas de OpenStreetMap (como Mapnik) a imágenes satelitales y capas de propósito especial como mapas meteorológicos, mapas del clima, mapas geológicos, capas de sombreado, etc. + Elige los repositorios de teselas de mapas en línea o en caché. + Accede a tantos tipos de mapas en línea (llamados teselas o ráster) que desees, desde teselas predefinidas de OSM (como Mapnik) a imágenes satelitales y capas de propósito especial como mapas meteorológicos, mapas del clima, mapas geológicos, capas de sombreado, etc. \n -\nCualquiera de estos mapas puede mostrarse como el mapa (base) principal, o como una superposición o subyacencia de otro mapa base (como los mapas estándar de OsmAnd sin conexión). Ciertos elementos de los mapas vectoriales OsmAnd se pueden ocultar a través del menú «Configurar mapa» para hacer más visible cualquier mapa subyacente. +\nCualquiera de estos mapas puede usarse como el mapa predefinido que se mostrará, o como una superposición o subyacencia de otro mapa base (como los mapas estándar de OsmAnd en línea). Ciertos elementos de los mapas vectoriales de OsmAnd pueden ocultarse a través del menú «Configurar mapa» para hacer cualquier subyacencia mas visible. \n -\nDescarga los mapas de teselas directamente a través de fuentes en línea, o prepararlos para tu uso sin conexión (copiándolos manualmente en la carpeta de datos OsmAnd) como una base de datos SQLite que puede generarse con varias herramientas de preparación de mapas de terceros. +\nDescarga las teselas de los mapas directamente en línea, o prepáralo para su uso sin conexión (copiar manualmente en la carpeta de datos OsmAnd) como una base de datos SQLite que puede ser producida por una variedad de herramientas de preparación de mapas de terceros. Muestra los ajustes para activar en modo reposo el seguimiento y la navegación, activando periódicamente el dispositivo GPS (con la pantalla apagada). - Activa las funciones de accesibilidad del dispositivo directamente en OsmAnd. Facilita por ejemplo, el ajuste de la velocidad de la voz para voces de texto a voz, la configuración de navegación de pantalla con el panel direccional, usando la rueda de desplazamiento para el control del zoom, o la retroalimentación de texto a voz, por ejemplo, para anunciar la ubicación automáticamente. - Ajustes de funciones de desarrollo y depuración, como simulación de navegación, el rendimiento del renderizado, o las indicaciones por voz. Destinados a desarrolladores y no son necesarios para el uso normal de la aplicación. + Activa las funciones de accesibilidad del dispositivo, directamente en OsmAnd. Facilita por ejemplo, el ajuste de la velocidad de la voz para voces de texto a voz, la configuración de navegación del pad direccional, usando la rueda de desplazamiento para el control del zoom, o la retroalimentación de texto a voz, por ejemplo, para anunciar la ubicación automáticamente. + Ajusta las funciones de desarrollo y depuración, como la simulación de navegación, el rendimiento del renderizado o las indicaciones por voz. Destinado para desarrolladores, no es necesario para el normal uso de la aplicación. Complementos Los complementos activan ajustes avanzados y funcionalidades adicionales. Complementos @@ -734,7 +736,7 @@ Memoria asignada %1$s MB (Límite Android %2$s MB, Dalvik %3$s MB). Memoria asignada Memoria nativa total usada por la aplicación %1$s MB (Dalvik %2$s MB, otros %3$s MB). -\nMemoria proporcional %4$s MB (Límite Android %5$s MB, Dalvik %6$s MB). +\n Memoria proporcional %4$s MB (Límite Android %5$s MB, Dalvik %6$s MB). Memoria nativa total Velocidad del simulador de ruta: Horas @@ -780,49 +782,48 @@ Atributos de renderizado Estilo del mapa Visor y navegador móvil global de mapas OSM con y sin conexión - OsmAnd (OSM Automated Navigation Directions, y en español, Guía de Navegación Automatizada de OSM) -\n -\nOsmAnd es un software de navegación de código abierto con acceso a una amplia variedad de datos globales de OpenStreetMap (OSM). Todos los datos del mapa (vectores y teselas) pueden ser almacenados en la memoria del teléfono para su uso sin conexión. También ofrece funcionalidades de rutas con y sin conexión, incluyendo indicaciones giro-a-giro por voz. -\n -\n Algunas de las funciones fundamentales: -\n - Completa funcionalidad sin conexión (almacena los mapas vectoriales o teselas descargados en la memoria del dispositivo) -\n - Mapas vectoriales compactos disponibles de todo el planeta -\n - Descarga de mapas por país o región directamente desde la aplicación -\n - Posibilidad de superponer varias capas de mapa, como GPX o rutas de navegación, Puntos de Interés (PDI), Favoritos, curvas de nivel, paradas de transporte público, mapas adicionales con transparencia personalizable -\n - Búsqueda sin conexión de direcciones y sitios (PDI) -\n - Navegación sin conexión para distancias de rango medio -\n - Modos de automóvil, bicicleta y peatón con opcional: -\n - Cambio automático de modo diurno/nocturno -\n - Zoom del mapa según la velocidad -\n - Alineación del mapa, según la brújula o dirección del movimiento -\n - Indicación de carriles, visualización de límites de velocidad, voces grabadas y sintetizadas -\n -\n Limitaciones de la versión gratuita de OsmAnd: -\n - Limitado número de mapas descargados -\n - Sin acceso a los PDI descargados de Wikipedia. -\n -\n Los PDI de OsmAnd están siendo desarrollados activamente. Nuestro proyecto y su continuo progreso, se basa en contribuciones económicas para desarrollar y probar nuevas funcionalidades. Por favor, considere comprar OsmAnd+, financiar nuevas características o hacer una donación general en https://osmand.net. - Visor y navegador móvil global de mapas OSM con y sin conexión - OsmAnd+ (OSM Automated Navigation Directions, y en español, Guía de Navegación Automatizada de OSM) -\n -\nOsmAnd+ es un software de navegación de código abierto con acceso a una amplia variedad de datos globales de OpenStreetMap (OSM). Todos los datos del mapa (vectores y teselas), pueden ser almacenados en la memoria del teléfono para su uso sin conexión. Ofrece funcionalidades de rutas con y sin conexión, incluyendo guía de giro-a-giro por voz. -\n -\n OsmAnd+ es la versión de pago de la aplicación, comprándola das soporte al proyecto, financias el desarrollo de nuevas funciones, y recibes las últimas actualizaciones. -\n -\n Algunas de las funciones fundamentales: -\n - Completa funcionalidad sin conexión (guarda los mapas vectoriales o teselas descargados en el almacenamiento del dispositivo) -\n - Mapas mundiales vectoriales compactos disponibles -\n - Descarga ilimitada de mapas de países o regiones directamente desde la aplicación -\n - Posibilidad de superponer varias capas de mapa, como GPX o rutas de navegación, Puntos de Interés, Favoritos, curvas de nivel, paradas de transporte público, mapas adicionales con transparencia personalizable -\n -\n - Búsqueda sin conexión de direcciones y sitios (PDI) + OsmAnd (OSM Automated Navigation Directions, y en español, Guía de Navegación Automatizada de OSM) \n -\n - Rutas sin conexión para distancias de rango medio -\n - Modos de automóvil, bicicleta y peatón con opcional: -\n - Cambio automático de modo diurno/nocturno -\n - Zoom del mapa según la velocidad -\n - Alineación del mapa, según brújula o dirección del movimiento -\n - Indicación de carriles, mostrar límites de velocidad, voces grabadas y sintetizadas +\nOsmAnd es un software de navegación de código abierto con acceso a una amplia variedad de datos globales de OSM. Todos los datos del mapa (vectores y teselas) pueden ser almacenados en la memoria del teléfono para su uso sin conexión. También ofrece funcionalidades de rutas con y sin conexión, incluyendo indicaciones giro-a-giro por voz. +\n +\n Algunas de las funciones fundamentales: +\n - Completa funcionalidad sin conexión (almacena los mapas vectoriales o teselas descargados en la memoria del dispositivo) +\n - Mapas vectoriales compactos disponibles de todo el planeta +\n - Descarga de mapas por país o región directamente desde la aplicación +\n - Posibilidad de superponer varias capas de mapa, como GPX o rutas de navegación, Puntos de Interés (PDI), Favoritos, curvas de nivel, paradas de transporte público, mapas adicionales con transparencia personalizable +\n - Búsqueda sin conexión de direcciones y sitios (PDI) +\n - Navegación sin conexión para distancias de rango medio +\n - Modos de automóvil, bicicleta y peatón con opcional: +\n - Cambio automático de modo diurno/nocturno +\n - Zoom del mapa según la velocidad +\n - Alineación del mapa, según la brújula o dirección del movimiento +\n - Indicación de carriles, visualización de límites de velocidad, voces grabadas y sintetizadas +\n +\n Limitaciones de la versión gratuita de OsmAnd: +\n - Limitado número de mapas descargados +\n - Sin acceso a los PDI descargados de Wikipedia. +\n +\n Los PDI de OsmAnd están siendo desarrollados activamente. Nuestro proyecto y su continuo progreso, se basa en contribuciones económicas para desarrollar y probar nuevas funcionalidades. Por favor, considera comprar OsmAnd+, financiar nuevas funciones o hacer una donación general en https://osmand.net. + Visor y navegador móvil global de mapas OSM con y sin conexión + OsmAnd+ (OSM Automated Navigation Directions, y en español, Guía de Navegación Automatizada de OSM) +\n +\n OsmAnd+ es un software de navegación de código abierto con acceso a una amplia variedad de datos globales de OSM. Todos los datos del mapa (vectores y teselas), pueden ser almacenados en la memoria del teléfono para su uso sin conexión. Ofrece funcionalidades de rutas con y sin conexión, incluyendo guía de giro-a-giro por voz. +\n +\n OsmAnd+ es la versión de pago de la aplicación, comprándola ayudas al proyecto, financias el desarrollo de nuevas funciones, y recibes las últimas actualizaciones. +\n +\n Algunas de las funciones fundamentales: +\n - Completa funcionalidad sin conexión (guarda los mapas vectoriales o teselas descargados en el almacenamiento del dispositivo) +\n - Mapas mundiales vectoriales compactos disponibles +\n - Descarga ilimitada de mapas de países o regiones directamente desde la aplicación +\n - Posibilidad de superponer varias capas de mapa, como GPX o rutas de navegación, Puntos de Interés, Favoritos, curvas de nivel, paradas de transporte público, mapas adicionales con transparencia personalizable +\n +\n - Búsqueda sin conexión de direcciones y sitios (PDI) +\n - Rutas sin conexión para distancias de rango medio +\n - Modos de automóvil, bicicleta y peatón con opcional: +\n - Cambio automático de modo diurno/nocturno +\n - Zoom del mapa según la velocidad +\n - Alineación del mapa, según brújula o dirección del movimiento +\n - Indicación de carriles, mostrar límites de velocidad, voces grabadas y sintetizadas \n Sin autopistas Ajustar al camino @@ -852,7 +853,7 @@ Sin ruta Quitar destino Destino intermedio «%1$s» - Active el GPS en los ajustes + Activa el GPS en los ajustes Mostrar dirección de destino Activa el complemento «Grabación de viaje» para usar los servicios de registro de ubicación (grabación GPX, seguimiento en línea) Calcular ruta posiblemente no óptima en largas distancias @@ -860,7 +861,7 @@ Esquema de color del camino Aplicación ZXing Barcode Scanner no instalada. ¿Buscar en Google Play? Cerrar conjunto de cambios - El servicio de OsmAnd, aún está funcionando en modo reposo. ¿Quiere pararlo también\? + El servicio de OsmAnd, aún está funcionando en modo reposo. ¿Quieres pararlo también\? Ejecutar aplicación en modo seguro (usando código de Android, más lento, en vez del nativo). Modo seguro Ejecutando aplicación en modo seguro (desactivar en «Ajustes»). @@ -876,7 +877,7 @@ Límite de velocidad Fronteras Ocultar fronteras regionales (niveles administrativos 5–9). - piezas + partes Curvas de nivel Este complemento proporciona tanto una capa superpuesta de curvas de nivel y una capa (de relieve) sombreada, que se pueden visualizar sobre los mapas descargados de OsmAnd. Esta funcionalidad será muy apreciada por atletas, caminantes, excursionistas, y cualquiera interesado en la estructura de relieve de un paisaje. (Note que las curvas de nivel y/o los datos de relieve están disponibles en descargas adicionales separadas luego de activar el complemento.) \n @@ -932,7 +933,7 @@ Fotografiar Fotografiar ¿Parar la navegación? - ¿Estás seguro de que quieres limpiar tu destino (y los destinos intermedios)\? + ¿Limpiar el destino (y los destinos intermedios)\? Calcula rutas precisas sin interferencias. Aún está limitado por la distancia y es lento. Navegación precisa (alfa) Datos multimedia @@ -957,7 +958,7 @@ Nombre de calle Número Grabación de viaje - Configure como se grabarán sus viajes. + Configura como se grabarán tus viajes. Personaliza el aspecto de la aplicación. Tema Opciones de accesibilidad @@ -971,7 +972,7 @@ Usar sensor magnético Otra Quedan %1$d archivos - %1$d archivos para descargar + Faltan descargar %1$d archivos Versión completa ¿Descartar ruta\? Parar navegación @@ -997,8 +998,8 @@ Punto Nombre del archivo GPX Archivo GPX guardado en {0} - Crea caminos pulsando en el mapa, o usando o modificando archivos GPX existentes, para planificar un viaje y medir la distancia entre puntos. El resultado puede guardarse como un archivo GPX y usarse luego para la orientación. - Calculadora de distancias y herramienta de planificación + Crea caminos pulsando el mapa, usando o modificando archivos GPX existentes, para planificar un viaje y medir la distancia entre puntos. El resultado puede guardarse como un archivo GPX y usarse luego para la orientación. + Distancias y planificación * Pulse para marcar un punto. \n * Mantenga pulsado el mapa para quitar el punto anterior. \n * Mantenga pulsado en un punto para ver e incluir la descripción. @@ -1015,11 +1016,11 @@ Enfoque hiperfocal Profundidad de campo extendido (EDOF) Enfoque al infinito - Modo de enfoque macro (primer plano) + Enfoque macro (primer plano) Enfoque continuo Reproducir sonido al fotografiar Define el sonido o silencio al fotografiar. - Ir desde aquí + Ir desde Vía: Desde: Límite de velocidad @@ -1033,7 +1034,7 @@ Limpiar destinos intermedios Mantener destinos intermedios Ya se definieron destinos intermedios. - Llegar hasta aquí + Ir hasta Mapa: Hacia: Versión: @@ -1042,7 +1043,7 @@ Zoom mínimo: %1$s Zoom máximo URL - Definir/Editar… + Definir o editar… Japón Estados Unidos Canadá @@ -1051,15 +1052,15 @@ Región de conducción: EEUU, Europa, Reino Unido, Asia u otras. Región de conducción Zoom mínimo - Tiempo expirado (minutos) - Fuente de teselas «%1$s» guardada + Tiempo de expiración (minutos) + Repositorio de teselas «%1$s» guardada Datos de teselas: %1$s Tiempo de expiración (minutos): %1$s Información Información de la versión, licencias, miembros del proyecto Elegir existente… - Niveles de zooms descargados: %1$s - Proyección Mercator elíptica + Niveles de zoom descargados: %1$s + Proyección elíptica de Mercator Información de FPS Mapa base mundial Ampliar mapa @@ -1184,7 +1185,7 @@ Repite instrucciones de navegación a intervalos regulares. Repetir instrucciones de navegación Anuncio de llegada - ¿Cuándo quiere el anuncio de llegada? + ¿Cuándo quieres el anuncio de llegada\? Compartir Favoritos compartidos a través de OsmAnd Calcular ruta entre puntos @@ -1234,7 +1235,7 @@ Ordenar por nombre Define primero un archivo GPX manteniendo pulsado. Elegir una traza - No se encontraron descargas, compruebe su conexión a Internet. + No se encontraron descargas, comprueba tu conexión a Internet. Edificios Vías no aptas para vehículos Textos @@ -1413,11 +1414,11 @@ Desactivado Activado Editar grupo - Debe conectarse a Internet para instalar este complemento. + Debes conectarte a Internet para instalar este complemento. Vista invernal Vista náutica Descargue el mapa especial sin conexión para mostrar las instalaciones de esquí. - Descargue el mapa especial sin conexión para mostrar detalles náuticos. + Descargar el mapa especial sin conexión para mostrar los detalles náuticos. Activar Desactivar Obtener @@ -1431,13 +1432,13 @@ Mapa en línea Exportar Audio - Este complemento enriquece el mapa y la navegación de OsmAnd al producir también mapas náuticos para el canotaje, vela y otros tipos de deportes acuáticos. -\n -\nUn mapa especial complementado para OsmAnd proporcionará toda las marcas de navegación náutica y símbolos cartográficos para el interior, así como para la navegación cerca de la costa. La descripción de cada marca de navegación proporciona los datos necesarios para su identificación y su significado (categoría, forma, color, número, referencia, etc.). -\n + Enriquece el mapa y la navegación de OsmAnd al producir también mapas náuticos para el canotaje, vela y otros tipos de deportes acuáticos. +\n +\nUn mapa especial complementado para OsmAnd proporcionará toda las marcas de navegación náutica y símbolos cartográficos para el interior, así como para la navegación cerca de la costa. La descripción de cada marca de navegación proporciona los datos necesarios para su identificación y su significado (categoría, forma, color, número, referencia, etc.). +\n \nPara volver a uno de los estilos del mapas convencionales de OsmAnd, simplemente desactiva este complemento de nuevo, o cambia el «Estilo del mapa» en «Configurar mapa» cuando lo desees. - Este complemento para OsmAnd pone a su alcance detalles sobre pistas de esquí de descenso, de travesía, rutas de esquí alpino, teleféricos y remontes a nivel mundial. Las rutas y pistas se muestran por código de color en función de su dificultad y representados con un estilo del mapa especial «Invierno» que lo asemeja a un paisaje invernal nevado. -\n + Detalles sobre pistas de esquí de descenso, de travesía, rutas de esquí alpino, teleféricos y remontes a nivel mundial. Las rutas y pistas se muestran por código de color en función de su dificultad y representados con un estilo del mapa especial «Invierno» que lo asemeja a un paisaje invernal nevado. +\n \nActivando esta vista, cambia el estilo del mapa a «Invierno y esquí», mostrando las características del terreno en condiciones invernales. Esta vista se puede revertir desactivando de nuevo aquí o cambiando el «Estilo del mapa» en «Configurar mapa» cuando lo desees. Activando esta vista cambia el estilo del mapa OsmAnd a la «Vista turística», que es una vista de alto detalle especial para viajeros y conductores profesionales. \n @@ -1463,7 +1464,7 @@ Acción crear Acción modificar Acción borrar - Ediciones OSM + Ediciones de OSM h min restante(s) @@ -1545,7 +1546,7 @@ Wikipedia Wikipedia Ver detalles - ¿Estás seguro de que deseas borrar %1$d nota(s)\? + ¿Borrar %1$d nota(s)\? Wikipedia Servicio de ubicación desactivado. ¿Quieres activarlo? Prevenir grabación independiente @@ -1582,7 +1583,7 @@ Noruego Bokmål Volapuque Télugu - Newarí / Nepal Bhasa + Newar de Katmandú Predefinido (13) Predefinido (cian translúcido) Color del GPX @@ -1603,7 +1604,7 @@ Púrpura Púrpura translúcida Se requiere un reinicio para aplicar los cambios. - ¿Le gusta OsmAnd? + ¿Te gusta OsmAnd\? Califica la aplicación Por favor, califique a OsmAnd en Google Play Dinos por qué. @@ -1650,7 +1651,7 @@ El PDI se borrará una vez subido los cambios Número de líneas Mostrar al inicio - ¿Está seguro? + ¿Estás seguro\? Se perderán los cambios no guardados. ¿Continuar? Parar simulación de ubicación. Simular la ubicación, usando una ruta calculada o una traza GPX guardada. @@ -1673,7 +1674,7 @@ Navegación Ejecutar en modo reposo Información del favorito - Añadir a Favoritos + Añadir favorito Caminos Añadir nuevo Elegir categoría @@ -1711,7 +1712,7 @@ El mapa de %1$s está listo para usarse. Mostrar mapa Código QR - Ingrese nombre del país + Escribe el nombre del país El mapa base mundial (abarca todo el mundo en zooms pequeños), falta o está desactualizado. Considera descargarlo para una vista global. Nueva versión Primeros pasos con OsmAnd @@ -1775,7 +1776,7 @@ Se ofrece la opción de controlar la aplicación principalmente a través del panel de control flexible o de un menú estático. Se puede cambiar esto luego, en los ajustes del panel. Usar panel de control Usar menú - El botón del menú muestra el panel de control en lugar del menú + El botón del menú, muestra el panel de control en lugar del menú Acceso desde el mapa Indica el tipo de PDI correcto u omítelo. Sin escaleras @@ -1867,10 +1868,10 @@ Barra de herramientas Widgets ¡Sin espacio suficiente! -\nSe necesita temporalmente {3} MB, {1} MB constantemente. -\n(Sólo {2} MB disponible.) +\n Se necesita temporalmente {3} MB, {1} MB constantemente. +\n (Sólo {2} MB disponible.) ¿Descargar {0} archivo(s)\? -\nSe utiliza {3} MB temporalmente, {1} MB constantemente. (De {2} MB.) +\n Se utiliza {3} MB temporalmente, {1} MB constantemente. (De {2} MB.) Elegir marcador del mapa Otros marcadores Sube tu nota de OSM de forma anónima o usando tu perfil de OpenStreetMap.org. @@ -1880,14 +1881,14 @@ Recalcular ruta Donaciones Número de destinatarios - Ediciones %1$s de %3$s, posición %2$s + Ediciones: %1$s de %3$s, posición: %2$s Clasificación de editores OSM Suscripción de OsmAnd Live Suscribirse Necesario para informarte sobre tus contribuciones. Nombre público Ocultar mi nombre en los informes - Región soportada + Región admitida Coste mensual Pago mensual Activo @@ -1900,8 +1901,8 @@ Ajustes de suscripción Primero compra una suscripción a OsmAnd Live Esta suscripción permite actualizaciones cada hora para todos los mapa del mundo. -\nParte de los ingresos vuelven a la comunidad de OSM y se paga por cada contribución OSM. -\nSi amas a OsmAnd, OSM y quieres apoyarlos y ser apoyado por ellos, esta es una perfecta manera de hacerlo. +\n Parte de los ingresos vuelven a la comunidad de OSM y se paga por cada contribución OSM. +\n Si amas a OsmAnd, OSM y quieres apoyarlos y ser apoyado por ellos, esta es una perfecta manera de hacerlo. Mostrar barra de transparencia en el mapa Se ha cambiado a la memoria interna, porque la carpeta de almacenamiento de datos elegida está protegida de escritura. Elige un directorio de almacenamiento válido. Memoria compartida @@ -1951,7 +1952,7 @@ Indica la dirección del destino mediante vibración. Activa la navegación para cambios en vivo de OsmAnd. Navegación con OsmAnd Live - Complemento de accesibilidad: sin destino definido + Complemento de accesibilidad: Destino indefinido Rumbo magnético Rumbo relativo Traza actual @@ -2004,11 +2005,11 @@ Almacenamiento de datos de OsmAnd (para mapas, trazas, etc.): %1$s. Conceder permiso Permitir el acceso a la ubicación - Obtenga direcciones y descubra lugares nuevos, sin una conexión a Internet + Obtén direcciones y descubre sitios nuevos sin una conexión a Internet Encontrar mi ubicación - Suscripción mensual. Puedes cancelarla en cualquier momento en Google Play. - Donación a la comunidad de OSM - Parte de tu donación se envía a los contribuidores a OSM. El coste de la suscripción sigue siendo el mismo. + La suscripción se cobra por el período elegido. Puedes cancelarlo en cualquier momento en Google Play. + Donaciones a la comunidad de OSM + Parte de tu donación se envía a los colaboradores de OSM. El costo de la suscripción sigue siendo la misma. La suscripción permite actualizaciones cada hora, día o semana y descargas ilimitadas para los mapas de todo el mundo. Obtener Obtener por %1$s @@ -2022,7 +2023,7 @@ Subir PDI Cálculo de la ruta Ciudad o región - No tienes archivos de trazas aún + Sin archivos de trazas aún También puedes añadir archivos de trazas a la carpeta Añadir más… Aspecto @@ -2108,19 +2109,15 @@ Un botón que añade una nota fotográfica en el centro de la pantalla. Un botón que añade una nota de OSM en el centro de la pantalla. Un botón que añade un PDI en el centro de la pantalla. - Un botón que activa o desactiva las indicaciones por voz durante la navegación. + Un botón que des/activa las indicaciones por voz durante la navegación. Un botón que añade la ubicación del aparcamiento en el centro de la pantalla. Mostrar un diálogo temporal " guardado como " Lugar Acción rápida renombrada a «%1$s» para evitar duplicados. Nombre de la acción rápida duplicado - Un botón que muestra u oculta los Favoritos en el mapa. + Un botón que muestra u oculta los puntos favoritos en el mapa. Un botón que muestra u oculta los PDI en el mapa. - Mostrar/ocultar Favoritos - Mostrar Favoritos - Ocultar Favoritos - Mostrar/ocultar PDI Mostrar %1$s Ocultar %1$s Añadir una categoría @@ -2130,7 +2127,7 @@ Dejar el campo vacío para usar la dirección o el nombre del lugar. Este mensaje se incluye en el campo del comentario. Mensaje - Categoría en la que quiere guardar el Favorito: + Categoría en la que quieres guardar el Favorito: Elige una categoría opcional. Lista de PDI Añade una o más categorías de PDI a mostrar en el mapa. @@ -2143,10 +2140,10 @@ Cambiar mapa subyacente Mapas subyacentes Añadir subyacencia - Cambiar fuente del mapa - Fuentes del mapa - Añadir fuente del mapa - Fuente del mapa cambiada a «%s». + Cambiar repositorio del mapa + Repositorio de mapas + Añadir repositorio del mapa + Repositorio del mapa cambiada a «%s». Cambiar ubicación del botón Mantener pulsado y arrastrar el botón para cambiar su ubicación en la pantalla. Nombre de la acción @@ -2175,13 +2172,13 @@ \nProporciona un código completo OLC completo y válido. \nÁrea representada: %1$s x %2$s - Un botón para paginar a través de la lista de abajo. + Un botón que muestra la siguiente lista. Mapa superpuesto cambiado a «%s». Mapa subyacente cambiado a «%s». Pendiente Añadir nueva carpeta Punto(s) borrado(s). - ¿Estás seguro de que deseas borrar %1$d punto(s)\? + ¿Borrar %1$d punto(s)\? Giros a pasar en esta ruta Puntos de ruta, puntos de interés, características nombradas Traza @@ -2210,32 +2207,32 @@ Elegir la fluctuación de elevación Circular por la derecha Automático - OsmAnd (OSM Automated Navigation Directions, y en español, Guía de Navegación Automatizada de OSM) es una aplicación de mapa y navegación con acceso a los datos libres de OpenStreetMap (OSM), en todo el mundo y de alta calidad. + OsmAnd (OSM Automated Navigation Directions, y en español, Guía de Navegación Automatizada de OSM) es una aplicación de mapa y navegación con acceso a los datos libres de OSM, en todo el mundo y de alta calidad. \n \n Disfruta del navegador por voz y óptico, la visualización de PDI (puntos de interés), la creación y gestión de trazas GPX, utiliza la información de visualización y la altitud de las curvas de nivel (mediante un complemento), elige entre modos de automóvil, bicicleta o peatón, edita en OSM y mucho más. Analizar en el mapa Visible Restaurar compras Tipografías del mapa - Navegación GPS -\n • Elige entre los modos sin conexión (sin cargos de roaming al viajar al extranjero) o en línea (más rápido) -\n • La guía por voz giro-a-giro lo guía a lo largo del camino (voces grabadas y sintetizadas) -\n • La ruta se recalcula al salirse de la misma -\n • Guía de carriles, nombres de calles y tiempo estimado al destino, lo ayudará a lo largo de la ruta -\n • Para hacer su viaje seguro, los modos diurno/nocturno se alternan automáticamente -\n • Muestra los límites de velocidad y obtiene un aviso al excederte del mismo -\n • El zoom del mapa se ajusta a la velocidad -\n • Busca destinos por dirección, por tipo (por ejemplo: aparcamientos, restaurantes, hoteles, gasolineras, museos), o por coordenadas geográficas -\n • Soporta puntos intermedios en el itinerario -\n • Graba tu viaje o sube una traza GPX y síguela + Navegación GPS +\n • Elige entre los modos sin conexión (sin cargos de roaming al viajar al extranjero) o en línea (más rápido) +\n • La guía por voz giro-a-giro lo guía a lo largo del camino (voces grabadas y sintetizadas) +\n • La ruta se recalcula al salirse de la misma +\n • Guía de carriles, nombres de calles y tiempo estimado al destino, lo ayudará a lo largo de la ruta +\n • Para hacer su viaje seguro, los modos diurno/nocturno se alternan automáticamente +\n • Muestra los límites de velocidad y obtiene un aviso al excederte del mismo +\n • El zoom del mapa se ajusta a la velocidad +\n • Busca destinos por dirección, por tipo (por ejemplo: aparcamientos, restaurantes, hoteles, gasolineras, museos), o por coordenadas geográficas +\n • Admite puntos intermedios en el itinerario +\n • Graba tu viaje o sube una traza GPX y síguela \n - Mapa -\n • Muestra PDI (puntos de interés) a tu alrededor -\n • Ajusta el mapa a la dirección del movimiento (o brújula) -\n • Muestra su ubicación y la dirección hacia dónde mira -\n • Comparte la ubicación para que tus amigos te encuentren -\n • Guarda sitios importantes en «Mis favoritos» -\n • Permite elegir como mostrar los nombres en el mapa: En inglés, local, u ortografía fonética + Mapa +\n • Muestra PDI (puntos de interés) a tu alrededor +\n • Ajusta el mapa a la dirección del movimiento (o brújula) +\n • Muestra tu ubicación y la dirección hacia dónde miras +\n • Comparte la ubicación para que tus amigos te encuentren +\n • Guarda sitios importantes en «Mis favoritos» +\n • Permite elegir cómo mostrar los nombres en el mapa: En inglés, local, u ortografía fonética \n • Muestra teselas en línea especiales, vista satelital (de Bing), diferentes superposiciones como trazas de travesía/navegación GPX y capas adicionales con transparencia personalizable \n Esquí @@ -2246,12 +2243,12 @@ \n• Vea la velocidad y altitud \n• La opción de grabación GPX, permite grabar el viaje y compartirlo \n• Mediante un complemento adicional, puedes activar las curvas de nivel y el sombreado de colinas - Caminar, senderismo, turismo de ciudad -\n • El mapa muestra las rutas para caminar y de senderismo -\n • Wikipedia en el idioma de preferencia, puede decir mucho durante una visita turística -\n • Las paradas de transporte público (autobús, tranvía, tren), incluyendo los nombres de línea, ayuda a navegar en una nueva ciudad -\n • Navegación GPS en el modo peatón, construye la ruta usando rutas de senderismo -\n • Suba y siga una ruta GPX o grabe y comparta sus propias rutas + Caminar, senderismo, turismo de ciudad +\n • El mapa muestra las rutas para caminar y de senderismo +\n • Wikipedia en el idioma de preferencia, puede decir mucho durante una visita turística +\n • Las paradas de transporte público (autobús, tranvía, tren), incluyendo los nombres de línea, ayuda a navegar en una nueva ciudad +\n • Navegación GPS en el modo peatón, construye la ruta usando rutas de senderismo +\n • Sube y sigue una ruta GPX o graba y comparte tus propias rutas \n Contribuye con OSM \n • Informa sobre problemas de datos en el mapa @@ -2273,15 +2270,15 @@ \n ¡Más países alrededor del globo están disponibles para descargar! \n Obtén un navegador confiable en tu país - ya sea Francia, Alemania, México, Reino Unido, España, Países bajos, Estados Unidos, Rusia, Brasil o cualquier otro. Alternar zoom automático del mapa - Botón para activar o desactivar el zoom automático controlado por la velocidad. - Activar zoom automático - Desactivar zoom automático + Un botón que alterna el zoom automático de acuerdo a la velocidad. + Activar el zoom automático + Desactivar el zoom automático Definir destino Reemplazar destino Añadir primer destino intermedio - Un botón que añade el centro de la pantalla como destino de la ruta, cualquier destino previamente elegido se convierte en el último destino intermedio. - Un botón que añade el centro de la pantalla como destino de la nueva ruta, reemplazando el anterior destino (si existe). - Un botón que añade el centro de la pantalla como el primer destino intermedio. + Un botón para hacer del centro de pantalla el destino de la ruta, un destino previamente elegido se convertiría en el último destino intermedio. + Un botón para hacer del centro de pantalla el nuevo destino de ruta, reemplazando el anterior destino (si existe). + Un botón para hacer del centro de pantalla el primer destino intermedio. Sin superposición Sin subyacencia Error @@ -2293,11 +2290,11 @@ Puntos de profundidad náuticos del hemisferio norte Curvas de profundidad náuticas Mapas náuticos - OsmAnd+ (OSM Automated Navigation Directions, y en español, Guía de Navegación Automatizada de OSM) es una aplicación de mapa y navegación con acceso a los datos libres de OpenStreetMap (OSM), en todo el mundo y de alta calidad. -\n Disfruta del navegador por voz y óptico, la visualización de PDI (puntos de interés), la creación y gestión de trazas GPX, utiliza la información de visualización y la altitud de las curvas de nivel (mediante un complemento), elige entre modos de automóvil, bicicleta o peatón, edita en OSM y mucho más. -\n -\nOsmAnd+ es la versión de pago. Comprando la aplicación, ayudas al proyecto, financiando el desarrollo de nuevas funciones y recibiendo las últimas actualizaciones. -\n + OsmAnd+ (OSM Automated Navigation Directions, y en español, Guía de Navegación Automatizada de OSM) es una aplicación de mapa y navegación con acceso a los datos libres de OSM, en todo el mundo y de alta calidad. +\n Disfruta del navegador por voz y óptico, la visualización de PDI (puntos de interés), la creación y gestión de trazas GPX, utiliza la información de visualización y la altitud de las curvas de nivel (mediante un complemento), elige entre modos de automóvil, bicicleta o peatón, edita en OSM y mucho más. +\n +\nOsmAnd+ es la versión de pago. Comprando la aplicación, ayudas al proyecto, financiando el desarrollo de nuevas funciones y recibiendo las últimas actualizaciones. +\n \nAlgunas de las principales funciones son: Elegir la calle en %1$s @@ -2314,20 +2311,20 @@ Ubicación propia animada Activa el desplazamiento animado del mapa para «Mi ubicación» durante la navegación. Resumen - Navegación + Navegación GPS \n • Funciona en línea (rápido) o sin conexión (sin cargos de roaming al viajar al extranjero) \n • Guía por voz giro-a-giro (voces grabadas y sintetizadas) -\n • (Opcional) Guía de carriles, nombres de calles y tiempo estimado de llegada -\n • Soporta puntos intermedios en tu itinerario +\n • (Opcional) Guía de carriles, nombres de calles y tiempo estimado al destino +\n • Admite puntos intermedios en el itinerario \n • La ruta se recalcula al salirse de la misma -\n • Busca lugares por dirección, por tipo (por ejemplo: Restaurantes, hoteles, gasolineras, museos), o por coordenadas geográficas +\n • Busca destinos por dirección, por tipo (por ejemplo: Restaurantes, hoteles, gasolineras, museos), o por coordenadas geográficas \n - Vista del mapa -\n • Muestra tu ubicación y orientación -\n • (Opcional) Ajusta el mapa a la dirección del movimiento (o la brújula) -\n • Guarda sitios importantes en «Favoritos» -\n • Muestra PDI (puntos de interés) a su alrededor -\n • Muestra teselas en línea especiales, vista satelital (de Bing), diferentes superposiciones como trazas de travesía/navegación GPX y capas adicionales con transparencia personalizable + Vista del mapa +\n • Muestra tu ubicación y orientación +\n • (Opcional) Ajusta el mapa a la dirección del movimiento (o la brújula) +\n • Guarda sitios importantes en «Favoritos» +\n • Muestra PDI (puntos de interés) a tu alrededor +\n • Muestra teselas en línea especiales, vista satelital (de Bing), diferentes superposiciones como trazas de travesía/navegación GPX y capas adicionales con transparencia personalizable \n • Permite elegir como mostrar los nombres en el mapa: en inglés, local, u ortografía fonética \n Uso de datos de OSM y Wikipedia @@ -2338,11 +2335,11 @@ \n • Mapas vectoriales reducidos sin conexión, actualizados al menos una vez cada mes \n \n • Elige entre datos completos de la región o sólo la red de rutas (Ejemplo: Todo Japón tiene 700 MB o sólo 200 MB para la red de rutas) - Funciones de seguridad -\n • (Opcional) El modo diurno/nocturno se alterna automáticamente -\n • (Opcional) Visualización del límite de velocidad, con aviso al excederte -\n • (Opcional) Zoom del mapa según la velocidad -\n • Comparta la ubicación para que sus amigos puedan encontrarlo + Funciones de seguridad +\n • (Opcional) El modo diurno/nocturno se alterna automáticamente +\n • (Opcional) Visualización del límite de velocidad, con aviso al excederte +\n • (Opcional) Zoom del mapa según la velocidad +\n • Comparte la ubicación para que tus amigos puedan encontrarte \n Funciones de ciclismo y peatón \n • Visualización de caminos para caminar, senderismo y ciclismo, ideal para actividades al aire libre @@ -2369,8 +2366,8 @@ \n • Medio Oriente: ** \n • África: ** \n • Antártida: * -\n ¡Más países alrededor del globo están disponibles para descargar! -\n Desde Afganistán a Zimbabue, desde Australia a Estados Unidos. Argentina, Brasil, Canadá, Francia, Alemania, México, Reino Unido, España, … +\n ¡Más países alrededor del globo están disponibles para descargar! +\nDesde Afganistán a Zimbabue, desde Australia a Estados Unidos. Argentina, Brasil, Canadá, Francia, Alemania, México, Reino Unido, España, … \n El nombre contiene demasiadas mayúsculas. ¿Continuar? Descarga el mapa de «Curvas de nivel» para usarlas en esta región. @@ -2382,10 +2379,7 @@ Permite acceder a áreas privadas. Nivel de zoom de pantalla: %1$s Para largas distancias: Añada destinos intermedios si no se encuentra ninguna ruta en 10 minutos. - Mostrar u ocultar notas de OSM - Mostrar notas de OSM - Ocultar notas de OSM - Botón para mostrar u ocultar las notas de OSM en el mapa. + Un botón que muestra u oculta las notas de OSM en el mapa. Ordenados por distancia Buscar en Favoritos Ocultar desde el nivel de zoom @@ -2393,17 +2387,17 @@ Aumentar radio de búsqueda Nada encontrado Cambiar la búsqueda o aumentar su radio. - Descarga el mapa «Superposición de sombreado» para mostrar el sombreado vertical. + Descarga la capa superpuesta del mapa «Sombreado» para mostrar el sombreado vertical. Instala el complemento «Curvas de nivel» para mostrar las áreas verticales graduadas. El destino se ubica en un área de acceso privado. ¿Permitir el uso de caminos privados para este viaje\? Widget de Mapillary - Fotos a nivel de calle en línea para todos. Descubre lugares, colabora, captura el mundo. + Fotos a nivel de calle en línea para todos. Descubre sitios, colabora, captura el mundo. Mapillary Añadir fotos Comparte tus imágenes a nivel de calle a través de Mapillary. Permite realizar contribuciones rápidas a Mapillary. - Fotos a nivel de calle para todos. Descubre lugares, colabora, captura el mundo. - No hay fotos aquí. + Fotos a nivel de calle para todos. Descubre sitios, colabora, captura el mundo. + Sin fotos aquí. Abrir Mapillary Instalar Mejorar cobertura de fotos con Mapillary @@ -2432,19 +2426,19 @@ Promedio %1$d de %2$d Ascenso/Descenso - Tiempo moviéndose + Tiempo en movimiento Máx/Min Min/Máx Rosa translúcido - Pausar/reanudar navegación - Botón para pausar o reanudar navegación. + Pausar o reanudar navegación + Un botón que pausa o reanuda la navegación. Mostrar diálogo «Navegación finalizada» - Iniciar/parar navegación - Botón para iniciar o terminar la navegación. + Iniciar o parar navegación + Un botón que inicia o detiene la navegación. Tiempo del búfer para el seguimiento en línea - Indica el tiempo que el búfer mantendrá los lugares para enviar sin conexión + Indica el tiempo que el búfer mantendrá los sitios para enviar sin conexión Añadir al menos un punto. - Nombre del GPX: + Nombre del archivo GPX: Mostrar en el mapa al guardar Navega por el mapa y añade puntos Medir distancia @@ -2456,7 +2450,7 @@ Punto de ruta 1 Punto de referencia 1 Sin animaciones - Desactiva las animaciones de los mapas. + Desactiva las animaciones del mapa. Mantener en el mapa ¿Salir sin guardar? Línea @@ -2473,16 +2467,16 @@ Añadir puntos de ruta Añadir línea Añadir favoritos - Importar Favoritos o añadir mediante puntos de marcación en el mapa. + Importa los Favoritos o añádelos marcando puntos en el mapa. Importar archivo GPX El archivo «%1$s» no contiene puntos de referencia, ¿Quieres importarlo como una traza? Mover punto Mover todo al historial Indicación de distancia Ordenar por - Elige cómo se indica la distancia y dirección a los marcadores del mapa en el mapa: + Elige cómo se indica la distancia y dirección a los marcadores del mapa: Umbral de orientación del mapa - Selecciona la velocidad a partir de la que la orientación del mapa cambia de «Dirección del movimiento» a «Dirección de la brújula». + Velocidad a partir de la cual la orientación del mapa cambia de «Dirección del movimiento» a «Dirección de la brújula». Todos los marcadores del mapa movidos al historial Marcador del mapa movido al historial Marcador del mapa movido a los activos @@ -2523,8 +2517,8 @@ No se pudo modificar la nota. Modificar nota Modificar nota de OSM - Añade una copia del punto de partida como destino. - Hacer ruta circular + Duplica el punto de partida y lo añade como destino. + Viaje de ida y vuelta Formato incorrecto Carretera Mostrar mapa @@ -2581,7 +2575,7 @@ Pulsa un marcador en el mapa para moverlo al primer lugar de los marcadores activos, sin abrir el menú contextual. Activar «Una pulsación» ¡Toma notas! - Añade una nota de audio, vídeo o foto a cualquier punto del mapa, utilizando el control o el menú contextual. + Añade una nota de audio, vídeo o foto a cualquier punto del mapa, usando el widget o el menú contextual. Notas A/V por fecha Por fecha Por tipo @@ -2602,7 +2596,7 @@ Archivo GPX con coordenadas y datos de todas las notas. Acciones Marcador - %1$s ediciones, suman %2$s mBTC + Ediciones: %1$s, total: %2$s mBTC Destinatarios de OSM Total de donaciones Sin nombre @@ -2616,7 +2610,7 @@ Archivo GPX Archivo OSC Elegir tipo de archivo - Exporta como notas OSM, PDIs o ambos. + Exportar como notas de OSM, PDI o ambos. Todos los datos Notas de OSM Vista turística @@ -2725,9 +2719,9 @@ Reiniciar aplicación Mostrar imágenes Has cancelado la suscripción de OsmAnd Live - Renueve la suscripción para continuar usando todas las funciones: + Renueva la suscripción para continuar usando todas las funciones: Basado en los artículos favoritos, se recomienda descargar los siguientes mapas: - Mapas que necesita + Mapas que necesitas Abrir enlace de Wikipedia en línea El enlace se abrirá en un navegador web. Obtenga una suscripción de OsmAnd Live para leer artículos de Wikipedia y Wikiviajes, sin conexión. @@ -2753,7 +2747,7 @@ Añadir punto Guardar como traza Añadiste %1$s puntos. Escribe un nombre de archivo y pulsa en «Guardar». - Por favor, envíe una captura de pantalla de esta notificación a support@osmand.net + Por favor, envía una captura de pantalla de esta notificación a support@osmand.net Editar acciones Punto %1$s borrado Mundo @@ -2799,7 +2793,7 @@ Guaraní Está utilizando el mapa «{0}» que funciona con OsmAnd. ¿Quiere ejecutar la versión completa de OsmAnd\? ¿Ejecutar OsmAnd\? - Un botón que alterna entre los modos diurno y nocturno para OsmAnd. + Un botón que alterna entre los modos diurno y nocturno de OsmAnd. Modo diurno Modo nocturno Alternar modos diurno/nocturno @@ -2833,7 +2827,7 @@ Añadir como «Casa» Añadir como «Trabajo» Trabajo - Por favor, primero define el destino + Primero define el destino Intercambiar Mostrar más Trazas mostradas @@ -2841,12 +2835,9 @@ En %1$s Giro a giro Tipos de caminos - Bajarse en + Bajar en Esperar en la parada - Mostrar/ocultar trazas Un botón que muestra u oculta las trazas elegidas en el mapa. - Ocultar trazas - Mostrar trazas Activar el transporte público para los cambios de OsmAnd Live. Transporte público en OsmAnd Live %1$d transbordo(s) @@ -2899,7 +2890,7 @@ Lea más sobre el cálculo de las rutas de OsmAnd en nuestro blog. La navegación en transporte público se encuentra actualmente en fase de pruebas beta, se esperan errores e imprecisiones. Añadir punto intermedio - Marque los tipos de transporte público a evitar para la navegación: + Marca los tipos de transporte público a evitar para la navegación: Evitar tipos de transporte… A pie Acorte la longitud de la etiqueta «%s» a menos de 255 caracteres. @@ -2962,7 +2953,7 @@ \n Transportador personal Monociclo - Escúter + Motoneta Precisión horizontal: %1$s, vertical: %2$s Precisión horizontal: %s Por favor, comparte tus comentarios y califica nuestro trabajo en Google Play. @@ -2993,7 +2984,7 @@ Esquí Esquí Mostrar regla radial - Ocultar regla radial + Ocultar regla de brújula Servicio de descarga de OsmAnd Magenta Icono @@ -3001,7 +2992,7 @@ Pulsa de nuevo para cambiar la orientación del mapa Velocidad mín. Velocidad máx. - Velocidad normal + Velocidad predefinida Cambiar los ajustes de la velocidad predefinida Definir velocidad mín/máx Nuevo perfil @@ -3022,20 +3013,20 @@ Guardar cambios Guardar primero los cambios del perfil Borrar perfil - ¿Estás seguro de que deseas borrar el perfil «%s»\? + ¿Borrar el perfil «%s»\? Elige un perfil para comenzar El perfil personalizado se basa en uno de los perfiles de aplicación predefinidos, lo que define los ajustes básicos como la visibilidad predefinida de los widgets, las unidades de velocidad y distancia. Estos son los perfiles de aplicación predefinidos, junto con ejemplos de perfiles personalizados a los que se pueden ampliar: Elegir el tipo de navegación Automóvil, camión, motocicleta Bicicleta de montaña, ciclomotor, caballo - Caminata, senderismo, carrera + Caminata, senderismo, correr Tipos de transporte público Barco, remo, vela - Avión, ala delta + Avión, planeador Línea recta BRouter (sin conexión) - Enrutamiento de OsmAnd - Perfil de enrutamiento personalizado + Navegación de OsmAnd + Perfil de navegación personalizado Enrutamiento especial Enrutamiento de terceros Perfiles que serán visibles en la aplicación. @@ -3107,7 +3098,7 @@ Considerar limitaciones temporales Unir espacios Predefinido - Campista + Casa rodante (camper) Ruta: distancia %1$s, tiempo de navegación %2$s \nCálculo: %3$.1f seg, %4$d carreteras, %5$d teselas) Occitano @@ -3239,7 +3230,7 @@ ¿Estás seguro de que quieres actualizar todos los (%1$d) mapas\? Ingresa la ruta a la carpeta Pegar la ruta a la carpeta con los datos de OsmAnd - Almacenamiento interno para OsmAnd, (oculto para el usuario y otras app)s. + Almacenamiento interno para OsmAnd, (oculto a los usuarios y otras aplicaciones). Descenso Nórdico Avanzado @@ -3252,38 +3243,32 @@ Grabar trazas en carpetas diarias Grabar trazas en subcarpetas por día de grabación (como 2019-01-01). Curvas de nivel y sombreado - Puedes aplicar este cambio a todos los perfiles o sólo al marcado actualmente. + Puedes aplicar este cambio a todos los perfiles o sólo al marcado. Compartido Preferir carreteras sin pavimentar Prefiere carreteras sin pavimentar sobre las pavimentadas para el enrutamiento. Ediciones de OSM Un botón que muestra u oculta las curvas de nivel en el mapa. - Mostrar curvas de nivel - Ocultar curvas de nivel - Mostrar/ocultar curvas de nivel - Un botón que muestra u oculta la sombra de una colina en el mapa. - Mostrar el sombreado - Ocultar el sombreado - Mostrar/ocultar el sombreado + Un botón que muestra u oculta el sombreado de las colinas en el mapa. Imposible iniciar el motor de habla sintetizada. Exportar perfil Perfil de OsmAnd: %1$s - \'%1$s\' ya existe. ¿Sobrescribir\? + El perfil «%1$s» ya existe. ¿Sobrescribir\? No se pudo exportar el perfil. Importar perfil - Añade un perfil abriendo su archivo con OsmAnd. + Añade un perfil abriendo este archivo con OsmAnd. Error de importación de %1$s: %2$s - %1$s importados. + «%1$s» importado(s). Blanco Alternar %1$s y %2$s Punto de partida - Estima la hora de llegada para tipos de vías desconocidos y límites de velocidad en todas las vías (puede afectar al enrutado) + Estima el tiempo de llegada para los tipos de caminos desconocidos, y limita la velocidad para todos los caminos (puede afectar a la ruta) Esquí de travesía Simular la ubicación usando una traza GPX grabada. Nombre de archivo vacío Traza guardada Revertir - Un botón que añade el centro de la pantalla como punto de partida. Pedirá luego que se fije el destino o iniciará el cálculo de la ruta. + Un botón para hacer que la pantalla se centre en el punto de partida. Luego define el destino o activa el cálculo de la ruta. Mostrar nodo de la red de rutas ciclistas ¿Borrar %1$s\? Diálogo de descarga del mapa @@ -3292,7 +3277,7 @@ Mapas sugeridos Estos mapas se necesitan para el complemento. Perfiles añadidos - Perfil añadido por complemento + Perfiles añadidos por el complemento Apagar Nuevo complemento añadido Unir segmentos @@ -3311,13 +3296,13 @@ Para desiertos y otras zonas escasamente pobladas. Más detallado. Icono de posición en movimiento Icono de posición en reposo - Al tocar \'Aplicar\' se eliminan los perfiles borrados de forma permanente. + Al pulsar en «Aplicar», los perfiles borrados se perderán completamente. Perfil principal Elegir el color - Los perfiles predefinidos de OsmAnd no pueden borrarse , pero sí desactivarse (en la pantalla anterior), o moverse a la parte inferior. + Los perfiles predefinidos de OsmAnd no se pueden borrar, sino desactivar (en la pantalla anterior) u ordenarse en la parte inferior. Editar perfiles El \'Tipo de navegación\' determina cómo se calculan las rutas. - Apariencia del perfil + Aspecto del perfil Icono, color y nombre Editar lista de perfiles Perfil seleccionado @@ -3326,46 +3311,46 @@ ¿Restablecer todos los ajustes del perfil\? %1$s %2$s %1$s: %2$s - Tasa - No hay reglas de enrutado en \"%1$s\". Por favor, elige otro archivo. + Calificar + No hay reglas de navegación en «%1$s». Elige otro archivo. Selecciona un archivo con la extensión %1$s en su lugar. Importar desde archivo - Importar archivo de enrutado + Importar archivo de ruta Importar perfil Navegación, precisión de registro - Tamaño de la imagen y calidad de audio y de vídeo - Registro, clave, edición sin conexión - Elige icono, color y nombre - Te permite compartir la ubicación actual utilizando la grabación del viaje. + Tamaño de imagen, calidad de audio y video + Inicio de sesión, contraseña, edición sin conexión + Elegir icono, color y nombre + Permite compartir la ubicación actual utilizando la grabación del viaje. Seguimiento en línea Precisión de registro Tus trazas grabadas están en %1$s, o en la carpeta de OsmAnd. - Puedes encontrar todas tus notas en %1$s. + Puedes encontrar todas tus notas multimedia en «%1$s». Notas de video - Notas de foto + Notas fotográficas Recálculo de la ruta Anunciar - Nombre de usuario y clave - Esta configuración de complementos es global, y se aplica a todos los perfiles + Nombre de usuario y contraseña + Los ajustes de este complemento son globales y se aplican a todos los perfiles Edición de OSM - Puedes ver todas las ediciones y errores de osm no subidos en %1$s. Los puntos ya subidos no se muestrarán más. + Vea todas las ediciones aún no subidas o errores de OSM en «%1$s». Los cambios ya cargados no se mostrarán más. OSM El icono se muestra mientras navega o mientras te estés moviendo. Icono que se muestra en reposo. - Selecciona y comparte logs detallados de la app - Un permiso es requerido para usar esta opción. - Efecto secundario: En su trayecto faltarán todos los tramos en los que no se haya cumplido el criterio de velocidad mínima (por ejemplo, cuando empuje su bicicleta por una colina empinada). Además, no habrá información sobre los periodos de descanso, como las pausas. Esto tiene efectos en cualquier análisis o post-proceso, como cuando se trata de determinar la duración total de su viaje, el tiempo en movimiento o su velocidad media. - Búfer de tiempo - Intervalo de tiempo - Dirección Web + Comprueba y comparte los registros detallados de la aplicación + Se necesita permiso para usar esta opción. + Efecto secundario: En la traza faltarán todos los tramos en los que no se haya cumplido el criterio de velocidad mínima (por ejemplo, cuando se empuja la bicicleta por una colina empinada). Además, no habrá información sobre los períodos de descanso, como las pausas. Esto tiene efectos en cualquier análisis o post-proceso, como cuando se trata de determinar la duración total del viaje, el tiempo en movimiento, o la velocidad promedio. + Memoria intermedia + Intervalo de seguimiento + Dirección web Notificación Velocidad mínima Precisión mínima Desplazamiento mínimo Restablecer la configuración del plugin a los valores por defecto - Usar aplicación del sistema - Sonido del obturador de la cámara - La autorización ha sido correcta + Usar la aplicación del sistema + Reproducir sonido al fotografiar + Autorización exitosa • Perfiles: ahora puedes cambiar el orden, definir el icono para el mapa, cambiar todos los ajustes para los perfiles base y restaurarlos de nuevo a los valores predefinidos \n \n • Se han añadido los números de salida en la navegación @@ -3391,42 +3376,42 @@ \n • Se ha añadido el mapa de la Antártida \n \n - Éste es un filtro de corte de baja velocidad para no registrar puntos por debajo de cierta velocidad. Esto puede hacer que las pistas grabadas sean más suaves cuando se ven en el mapa. - Recomendación: Intenta usar primero la detección de movimiento a través del filtro de desplazamiento mínimo (B), puede producir mejores resultados, y perderás menos datos. Si tus trazas siguen siendo ruidosas a bajas velocidades, prueba con valores distintos de cero aquí. Ten en cuenta que algunas mediciones pueden no informar de ningún valor de velocidad (algunos métodos basados en la red), en cuyo caso no se registraría nada. - Observación: comprobación de velocidad > 0: La mayoría de los chips de GPS reportan un valor de velocidad sólo si el algoritmo determina que estás en movimiento, y ninguno si no lo estás. Por lo tanto, usar el ajuste > 0 en este filtro en cierto sentido utiliza la detección de movimiento de los chips del GPS. Pero incluso si no se filtra aquí en el momento de la grabación, seguimos utilizando esta característica en nuestro análisis de GPX para determinar la distancia corregida, es decir, el valor mostrado en ese campo es la distancia registrada miestras está en movimiento. - Esto registrará sólo los puntos medidos con una exactitud mínima indicada (en metros/pies, según lo informado por Android para tu conjunto de chips). La exactitud es la proximidad de las mediciones a la posición real y no está directamente relacionada con la precisión, que es la dispersión de las mediciones repetidas. + Se trata de un filtro de corte de baja velocidad para no grabar puntos por debajo de una cierta velocidad. Esto puede hacer que las trazas grabadas se vean más suaves cuando se muestran en el mapa. + Recomendación: Prueba primero a utilizar la detección de movimiento mediante el filtro de desplazamiento mínimo de registro (B), puede producir mejores resultados y perderá menos datos. Si las trazas siguen siendo ruidosas a bajas velocidades, prueba aquí con valores distintos de cero. Tenga en cuenta que algunas mediciones pueden no informar ningún valor de velocidad (algunos métodos basados en la red), en cuyo caso no se registraría nada. + Observación: comprobar velocidad > 0: La mayoría de los chipsets de GPS informan un valor de velocidad sólo si el algoritmo determina que está en movimiento. Por lo tanto, el uso del ajuste > 0 en este filtro, en cierto sentido utiliza la detección de movimiento del conjunto de chips del GPS. Pero incluso si no se filtra aquí en el momento de la grabación, seguimos utilizando esta función en nuestro análisis GPX para determinar la distancia corregida, es decir, el valor que se muestra en ese campo es la distancia grabada en movimiento. + Esto registrará solo los puntos medidos con una indicación de precisión mínima (en metros o pies, según lo informado por Android para su conjunto de chips). La precisión es la proximidad de las mediciones a la ubicación real y no está directamente relacionada con la precisión, que es la dispersión de las mediciones repetidas. Reorganizar categorías - Cambia el criterio de ordenación de listas, oculta categorías. Puedes importar o exportar todos los cambios en perfiles. - Puedes añadir una nueva categoría personalizada seleccionando una o más categorías. + Cambia el orden de clasificación de la lista u oculta las categorías. Puedes importar o exportar todos los cambios con los perfiles. + Puedes añadir una nueva categoría personalizada marcando una o varias categorías. \"Restablecer valores predeterminados\" restablecerá el orden de clasificación al valor predeterminado de la instalación. Disponible Añadir categoría personalizada Mostrar sólo por la noche - Todos los ajustes del complemento se restauraron a lo predeterminado. - Todos los ajustes del perfil se restauran a lo predeterminado. + Todos los ajustes del complemento se restauraron al valor predefinido. + Todos los ajustes del perfil se restauraron al valor predefinido. %1$s/%2$s Ocaso a las %1$s Amanece a las %1$s - Elmodo de accesibilidad está desactivado en tu sistema Android. + El modo de accesibilidad se encuentra desactivado en el sistema. Usar el tiempo de apagado de pantalla del sistema Desactivado por defecto, si OsmAnd se ejecuta en primer plano, la pantalla no se apaga. \n \nSi está activada, OsmAnd utilizará los ajustes de tiempo de espera del sistema. - Borrar datos grabados + Vaciar datos grabados Copiar coordenadas Directo al punto - Por favor, proporciona un nombre para el perfil - Abrir configuración + Proporciona un nombre para el perfil + Abrir los ajustes Complemento desactivado - Este complemento es una app separada, deberás eliminarlo por separado si ya no planeas usarlo. -\n -\nEl complemento permanecerá en el dispositivo después de eliminar OsmAnd. + Este complemento es una aplicación independiente, deberás quitarlo por separado si no piensas seguir usándolo. +\n +\nEl complemento permanecerá en el dispositivo después de desinstalar OsmAnd. Menú - %1$s — %2$s — %3$s + %1$s → %2$s → %3$s Enrutado Incluir datos adicionales - El perfil importado contiene datos adicionales. Pulsa \"Importar\" para importar solo datos de perfil o seleccione datos adicionales. - Puedes seleccionar datos adicionales para exportar junto con el perfil. + El perfil importado contiene datos adicionales. Pulsa en «Importar» para importar sólo datos de perfil o marca datos adicionales. + Puedes marcar datos adicionales para exportar junto con el perfil. Perfiles Acciones rápidas No hay nada seleccionado @@ -3439,10 +3424,10 @@ Perfil personalizado Importar archivo de renderizado Terreno - Mapa de sombreado utilizando tonos oscuros para mostrar pendientes, picos y tierras bajas. + Mapa de sombreado usando sombras oscuras para mostrar las laderas, picos y tierras bajas. Pendiente utiliza colores para visualizar la inclinación del terreno. Establezca los niveles de zoom mínimo y máximo en los que se mostrará la capa. - Se necesitan mapas adicionales para ver sombreado en el mapa. + Se necesitan mapas adicionales para ver el sombreado en el mapa. Se necesitan mapas adicionales para ver Pendientes en el mapa. Puede leer más sobre Pendientes en %1$s. Transparencia @@ -3450,30 +3435,27 @@ Habilite para ver el sombreado o el mapa de pendiente. Puede leer más sobre este tipo de mapas en nuestro sitio. Sombreado Importación completa - Artículos añadidos - OsmAnd comprueba %1$s para ver si hay duplicados con los elementos existentes en la app. -\n + Elementos añadidos + OsmAnd comprueba %1$s para ver si hay duplicados con los elementos existentes en la aplicación. +\n \nPuede llevar algún tiempo. Importando - Importando datos de %1$s - No se pudo hacer una copia de seguridad del perfil. + Importando datos de «%1$s» + No se pudo respaldar el perfil. Guardando el nuevo perfil ¿Restaurar todos los ajustes del perfil\? Todos los ajustes del perfil se restaurarán a su estado original después de crear/importar este perfil. - Estás seguro de que quieres borrar los datos grabados\? + ¿Borrar los datos registrados\? Recalcular ruta en caso de desvío %1$s de %2$s - Cuestas - Mostrar o esconder terreno - Esconder terreno - Mostrar terreno + Pendientes Un botón para mostrar o esconder una capa de terreno en el mapa. - Borra descripción - Añade descripción + Borrar descripción + Añadir descripción Elige grupo Elige forma Reemplazar otro punto con este. - Cambios aplicados al perfil \'%1$s\'. + Cambios aplicados al perfil «%1$s». No se pudo leer \'%1$s\'. No se pudo escribir \'%1$s\'. No se pudo importar \'%1$s\'. @@ -3504,22 +3486,19 @@ Suscripción - OsmAnd Live Compras en OsmAnd Botón que muestra u oculta el transporte público en el mapa. - Regresar a editar - Cambiar el perfil de la aplicación - No se pudo encontrar ninguno de esos perfiles. - Mapas extras + Volver a la edición + Cambiar perfil de la aplicación + No se pudo encontrar ninguno de estos perfiles. + Mapas adicionales OsmAnd + Mapillary Viaje (Wikivoyage y Wikipedia) - Marcadores de mapa + Marcadores del mapa Favoritos Perfiles de navegación - Mostrar u ocultar transporte público - Ocultar transporte público - Mostrar transporte público - Crear o editar POI - Agregar o editar Favorito + Crear o editar PDI + Añadir o editar favorito Agregar perfil - Aragones + Aragonés Color personalizado %1$s / %2$s Acción rápida @@ -3527,7 +3506,7 @@ Medir distancia OsmAnd ya tiene elementos con los mismos nombres que los importados. \n -\nSelecciona una acción. +\nElige una acción. Personaliza la cantidad de elementos en el cajón, configure el mapa y el menú contextual. \n \nDesactiva los complementos no utilizados para ocultar todos sus controles de la aplicación. %1$s. @@ -3541,16 +3520,16 @@ Gujaratí Chuvasio Checheno - Baskir + Bashkir Lombardo - El pago se cargará a su cuenta de Google Play en la confirmación de la compra. + El pago será cargado a la cuenta de Google Play al confirmar la compra. \n -\nLa suscripción se renueva automáticamente a menos que se cancele antes de la fecha de renovación. Se le cobrará a su cuenta el período de renovación (mes / tres meses / año) solo en la fecha de renovación. +\nLa suscripción se renueva automáticamente a menos que se cancele antes de la fecha de renovación. Se le cobrará a su cuenta el período de renovación (mes/trimestre/año) sólo en la fecha de renovación. \n -\nPuede administrar y cancelar sus suscripciones yendo a la configuración de Google Play. +\nPuedes administrar y cancelar las suscripciones accediendo a los ajustes de Google Play. Combina tipos de POI de diferentes categorías. Toque \"Cambiar\" para seleccionar todo, toque el lado izquierdo para la selección de categoría. Restaurar pedido de artículos predeterminado - El botón de acción cambia los perfiles seleccionados. + El botón de acción alterna entre los perfiles elegidos. Antártida Ordenar por categoría Estilo de renderizado @@ -3558,12 +3537,12 @@ Distancia mínima para recalcular ruta Sin recálculo Seleccione los datos a importar. - Algunos artículos ya existen - Los elementos importados se agregarán con el prefijo - Mantén ambos + Algunos elementos ya existen + Los elementos serán importados con un prefijo + Mantener ambos Reemplazar todo Los elementos actuales serán reemplazados por los elementos del archivo - Listado %1$s, ya existe en OsmAnd. + El listado «%1$s», ya existe en OsmAnd. Aplicación predeterminada (%s) Leyenda Seleccione la distancia después de la cual se volverá a calcular la ruta. @@ -3578,15 +3557,15 @@ Reordenar u ocultar elementos de %1$s. Divisor Oculto - Estos elementos están ocultos en el menú, pero las opciones o complementos representados continuarán funcionando. - Solo tiene cuatro botones. + Estos elementos no se muestran en el menú, pero las opciones o complementos que representan seguirán funcionando. + Sólo contiene 4 botones. Acciones principales - Puede acceder a estas acciones tocando el botón “%1$s”. - Puede mover elementos solo dentro de esta categoría. - complemento de desarrollador + Puedes acceder a estas acciones pulsando el botón «%1$s». + Sólo puedes mover objetos dentro de esta categoría. + Complemento de desarrollador Esquí de travesía Motonieve - Complemento OsmAnd personalizado + Complemento personalizado de OsmAnd Artículos Selecciona los idiomas para los artículos de Wikipedia en el mapa. Cambia a cualquier idioma disponible mientras lees el artículo. Es posible que algunos artículos de Wikipedia no estén disponibles en su idioma. @@ -3599,13 +3578,13 @@ Kazajo Javanés Buscar tipos de PDI - Acción %1$s no admitida - Mapa general del mundo (detallado) + Acción «%1$s» no admitida + Mapa mundial general (detallado) Tipo no soportado Proporciona la anchura de tu vehículo, algunas restricciones de ruta pueden aplicarse para vehículos anchos. - Proporciona la altura de tu vehículo, algunas restricciones de ruta pueden aplicarse para vehículos altos. + Proporciona la altura del vehículo, pueden aplicarse algunas restricciones de ruta para vehículos altos. Proporciona el peso de tu vehículo, algunas restricciones de ruta pueden aplicarse para vehículos pesados. - OsmAnd GPX no está bien formado, por favor ponte en contacto con el equipo de soporte para investigar más a fondo. + El GPX de OsmAnd no está bien formado, por favor, contacta con el equipo de soporte para investigar más a fondo. Siempre Control de pantalla Apaga la pantalla según el tiempo de espera del sistema. @@ -3619,43 +3598,43 @@ Selecciona el tiempo de apagado de la pantalla después de despertarte. (\"%1$s\" no la apaga.) Mantener la pantalla encendida Mantener la pantalla apagada - Proyección Pseudo-Mercator + Proyección de pseudo-Mercator Un archivo de imagen por tesela Archivo SQLiteDB - Proporciona un nombre para la fuente del mapa en línea. - Escribe o pega la URL de la fuente en línea. - Editar fuente en línea + Proporciona un nombre para el repositorio del mapa en línea. + Ingresa o pega la URL del repositorio en línea. + Editar repositorio en línea Tiempo de expiración Proyección de Mercator Formato de almacenamiento - Establece un nivel de zoom mínimo y máximo para mostrar o cargar el mapa en línea. - Las teselas almacenadas se volverán a cargar después del tiempo especificado. Deja este campo vacío para que no se actualicen nunca las teselas de esta fuente. + Define un nivel de zoom mínimo y máximo para mostrar o cargar el mapa en línea. + Las teselas almacenadas serán renovadas después del número especificado en minutos. Dejar este campo vacío para que nunca se renueven las teselas de este repositorio. \n -\nUn día son 1.440 minutos. -\nUna semana son 10.080 minutos. -\nUn mes son 43.829 minutos. +\nUn día son 1440 minutos. +\nUna semana son 10 080 minutos. +\nUn mes son 43 829 minutos. Elige cómo se guardarán las teselas descargadas. - Puede exportar o importar acciones rápidas con perfiles de aplicación. + Puedes exportar o importar acciones rápidas con perfiles de aplicación. ¿Eliminar todo\? - ¿Estás seguro deseas eliminar de forma irreversible %d acciones rápidas\? + ¿Borrar irrevocablemente %d acciones rápidas\? Tiempo de apagado de la pantalla Si \"%1$s\" está encendido, el tiempo de actividad dependerá de ello. metros - Muestra u oculta detalles adicionales del mapa + Muestra u oculta los detalles adicionales del mapa Mapa nocturno No pude analizar la geointención \"%s\". División de grabación Indica la dirección web con sintaxis de parámetros : lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}. - Recomendación: Un ajuste de 5 metros puede funcionar bien para ti si no necesitas capturar detalles más finos que eso, y no quieres capturar explícitamente los datos mientras estás en reposo. - Efectos secundarios: Los períodos de descanso no se registran en absoluto o sólo en un punto. Los pequeños movimientos (en el mundo real) (por ejemplo, de lado, para marcar un posible desvío en su viaje) pueden ser filtrados. Su archivo contiene menos información para el post-procesado, y tiene peores estadísticas al filtrar puntos obviamente redundantes en el tiempo de registro, mientras que potencialmente mantiene los artefactos causados por la mala recepción o los efectos del chipset del GPS. - Este filtro evita que se registren puntos duplicados cuando ha habido muy poco movimiento real, y da un aspecto espacial más agradable a las pistas sin post-procesado posterior. - Observación: Si el GPS hubiera estado apagado inmediatamente antes de una medida, el primer punto medido podría tener una precisión disminuida, por lo que en nuestro código podríamos querer esperar un segundo más o menos antes de grabar un punto (o grabar el mejor de 3 puntos consecutivos, etc.), pero esto aún no se ha implementado. - Recomendación: Es difícil predecir lo que se registrará y lo que no, puede ser mejor apagar este filtro. - Efecto secundario: Como resultado del filtrado por precisión, pueden faltar puntos, por ejemplo, debajo de puentes, bajo árboles, entre edificios altos o con ciertas condiciones climáticas. - Todos los datos de los %1$s son importados, puedes usar los botones de abajo para abrir la parte necesaria de la aplicación para gestionarla. + Recomendación: Un ajuste de 5 metros puede funcionar bien si no necesitas capturar detalles más finos que eso, y no deseas capturar explícitamente los datos mientras está en reposo. + Efectos secundarios: Los períodos de descanso no se registran en absoluto o sólo en un punto cada uno. Los pequeños movimientos (del mundo real) (por ejemplo, hacia los lados, para marcar un posible desvío en su viaje) pueden ser filtrados. Su archivo contiene menos información para el post-procesamiento, y tiene peores estadísticas al filtrar los puntos obviamente redundantes en el tiempo de grabación, mientras que potencialmente mantiene los artefactos causados por la mala recepción o los efectos del chipset del GPS. + Este filtro evita que se registren puntos duplicados en los que puede haber muy poco movimiento real, y da un aspecto espacial más agradable a las pistas que no se procesan posteriormente. + Observación: Si el GPS se hubiera apagado inmediatamente antes de una grabación, el primer punto medido podría tener una precisión disminuida, por lo que en nuestro código puede que queramos esperar un segundo más o menos antes de grabar un punto (o grabar el mejor de 3 puntos consecutivos, etc.), pero esto todavía no se ha implementado. + Recomendación: Es difícil predecir lo que se grabará y lo que no, puede ser mejor apagar este filtro. + Efecto secundario: Como resultado del filtrado por precisión, pueden faltar puntos por ejemplo debajo de puentes, bajo árboles, entre edificios altos o con ciertas condiciones climáticas. + Todos los datos de «%1$s» fueron importados. Puedes usar los botones de abajo para gestionar la sección necesaria de la aplicación. Personalización de la interfaz de usuario - Elementos debajo de este punto separados por un divisor. - Min del sur + Los elementos debajo de este punto están separados por un divisor. + Min del Sur Yoruba Waray Uzbeko @@ -3663,14 +3642,14 @@ Tayiko Bávaro Trazador OsmAnd - La guía para la simbología del mapa. + La guía para la simbología de un mapa. Posiciones de estacionamiento Deshabilitado. Requiere \'Mantener la pantalla encendida\' dentro de \'Tiempo de espera después de la activación\'. - Afecta a la pantalla cuando se usa como mapa o superposición / subyacente. + Afectan a la pantalla al usarlos como mapa, superposición o subyacencia. \n -\n%1$s: el mapa está limitado al rango de nivel de zoom seleccionado. +\n%1$s: El mapa está limitado al rango de zoom elegidos. \n -\n%2$s son los niveles en los que las teselas originales serán visibles, fuera de estos valores se realizará un escalado. +\n%2$s son los niveles en los que las teselas originales son visibles, el aumento o reducción de escala ocurrirá fuera de estos valores. Desinstalar las cámaras de velocidad Legal PDIs de cámaras de velocidad @@ -3681,84 +3660,81 @@ \nSelecciona %1$s y recibirás alertas y advertencias sobre las cámaras de velocidad. \n \nSelecciona %2$s. Todos los datos relacionados con las cámaras de velocidad: alertas, notificaciones, PDIs, se eliminarán hasta que OsmAnd se reinstale completamente. - Mantener activo + Mantener Desinstalar Las alertas de cámaras de velocidad están prohibidas por la ley en algunos países. - Tiempo de espera de pantalla predeterminado + Tiempo predefinido de la espera de la pantalla tonos - Añadir fuente en línea - Aplicando estos cambios se borrarán los datos almacenados para esta fuente de teselas + Añadir repositorio en línea + Al aplicar estos cambios, los datos almacenados serán borrados para este repositorio de teselas Fijar la altura del navío Puedes establecer la altura del navío para evitar los puentes bajos. Ten en cuenta que si el puente es móvil, usaremos su altura en estado abierto. Fija la altura del navío para evitar los puentes bajos. Ten en cuenta que si el puente es móvil, usaremos su altura en estado abierto. Fija el ancho del navío para evitar puentes estrechos - Mostrar/ocultar Mapillary - Ocultar Mapillary - Mostrar Mapillary - Un conmutador para mostrar u ocultar la capa de Mapillary en el mapa. + Un botón que alterna la capa de Mapillary en el mapa. Especifica la longitud del vehículo que se permitirá en las rutas. Límite de longitud Rumbo - %1$s eliminado + %1$s borrado Reinicia la aplicación para borrar todos los datos de los radares de velocidad. Desinstalar y reiniciar Este dispositivo no tiene cámaras de velocidad. Patines en línea Controla el nivel de zoom del mapa usando los botones de volumen. Botones de volumen como zoom - Proporcione la longitud de su vehículo, se pueden aplicar algunas restricciones de rutas para vehículos largos. - Eliminar el punto de destino más cercano - Por favor, proporcione un nombre para el punto - Elimina el próximo destino de su ruta. Si se trata del destino, la navegación se detendrá. + Proporciona la longitud del vehículo, se pueden aplicar algunas restricciones de rutas para vehículos largos. + Borrar el punto de destino más cercano + Proporciona un nombre para el punto + Quita el siguiente destino de la ruta. Si es el destino final, la navegación se detendrá. Descargar mapas de Wikipedia - Abrir la pista existente - Crea una nueva ruta - Planea una ruta - Cambiar el tipo de ruta antes + Abrir traza existente + Crear nueva ruta + Planificar ruta + Cambiar el tipo de ruta anterior Borrar dirección Añadir dirección - Introducir la dirección + Ingresar dirección Hecho Traza simplificada Sólo se grabará la línea de la ruta, los puntos intermedios (waypoints) se borrarán. Nombre de archivo - %s archivos de traza seleccionados - GRABAR + %s archivo(s) de trazas marcado(s) + Grabar Especifica el intervalo de grabación general para trazas (activado a través del widget de grabación en el mapa). Pausar grabación del viaje - Seguir grabando el viaje + Reanudar grabación del viaje Predeterminado del sistema - Todos los segmentos siguientes + Todos los segmentos posteriores Segmento anterior Todos los segmentos anteriores - Sólo se recalculará el segmento elegido usando el perfil seleccionado. - Todos los segmentos siguientes se recalcularán usando el perfil seleccionado. - Todos los segmentos anteriores se recalcularán usando el perfil seleccionado. + Sólo el segmento marcado será recalculado usando el perfil elegido. + Todos los segmentos posteriores serán recalculados usando el perfil elegido. + Todos los segmentos anteriores serán recalculados usando el perfil elegido. Abrir traza guardada está guardada Añade al menos dos puntos. Seleccionar anchura Grabar automáticamente la traza durante la navegación - Consigue información sobre puntos de interés en Wikipedia, una guía de bolsillo sin conexión con artículos sobre lugares y destinos. - El punto agregado no será visible en el mapa, ya que el grupo seleccionado está oculto, puedes encontrarlo en \"%s\". + Obtén información sobre los puntos de interés de Wikipedia, una guía de bolsillo sin conexión que incluye artículos sobre objetos y destinos. + El punto añadido no será visible en el mapa, ya que el grupo elegido está oculto, se puede encontrar en «%s». Motocicleta de enduro - Moto scooter + Motoneta (motor) Silla de ruedas - Silla de ruedas hacia adelante - Go-cart - Nota OSM cerrada + Silla de ruedas (hacia adelante) + Go-kart + Nota de OSM cerrada Establece los días laborables para continuar Ruta entre puntos Añadir a una traza Mostrar los iconos de inicio y fin - Selecciona el intervalo con el que se mostrarán las marcas con la distancia o el tiempo sobre la traza. - Selecciona la opción de división deseada: por tiempo o por distancia. + Elige el intervalo de la traza en el que se mostrarán las marcas con la distancia o el tiempo. + Elige la opción de división deseada: por tiempo o por distancia. Personalizado Flechas de dirección Sólido - Ultimo editado + Última edición Importar traza - Selecciona un archivo de traza para abrirlo. + Marcar un archivo de traza para abrir. Sobrescribir traza Guardar como nueva traza Ruta inversa @@ -3772,10 +3748,10 @@ Perfil de navegación Selecciona un archivo de traza al que agregar el nuevo segmento. Fotos a pie de calle - ¿Estás seguro de que quieres descartar todos los cambios en la ruta planeada\? - En caso de dirección contraria + ¿Descartar todos los cambios en la ruta planificada\? + En caso de dirección inversa Guardar como nuevo archivo de traza - Añadir a un archivo de traza + Añadir a un archivo de trazas Trazas Trazas Trazas @@ -3783,23 +3759,23 @@ Ruta de traza Añadir archivos de traza Importa o graba archivos de trazas - Añadir punto de ruta de la traza - Añadir punto de ruta de la traza - Grabación de viaje + Añadir punto de referencia de la traza + Añadir punto de referencia de la traza + Grabación del viaje Guardar como archivo de traza Seguir traza Elige el archivo de la traza a seguir - Elige el archivo de traza a seguir o impórtalo desde tu dispositivo. + Elige el archivo de la traza a seguir o impórtala desde el dispositivo. Selecciona otra traza Navegar desde mi ubicación a la traza Apuntar a la traza para navegar Inicio de la traza Punto más cercano - Adherir a las carreteras - Recortar antes de - Recortar después de - Cambiar el tipo de ruta después de - El registro de trazas se detendrá cuando se mate la aplicación (a través de aplicaciones recientes). (La indicación OsmAnd de fondo desaparece de la barra de notificaciones de Android.) + Unir a los caminos + Recortar antes + Recortar después + Cambiar el tipo de ruta posterior + La grabación de la traza se pausará al cerrar la aplicación (mediante aplicaciones recientes). (La indicación de fondo de OsmAnd, desaparecerá de la barra de notificaciones de Android.) Rehacer - Función actualizada de Planificar una ruta: permite utilizar diferentes tipos de navegación por segmento y la inclusión de trazas \n @@ -3822,28 +3798,28 @@ MGRS Novedades MGRS - OsmAnd usa MGRS, que es similar al formato UTM NATO. + OsmAnd usa MGRS, similar al formato UTM de la OTAN. Iconos de inicio y fin - Desarollo - El fichero ya está importado en OsmAnd + Desarrollo + El archivo ya fue importado en OsmAnd Mapas locales %1$s — %2$s - Servicio + Comodidad Especial Transporte Servicio Símbolos Deporte Emergencia - Viajar + Viaje Añadir al menos dos puntos Cuenta Login Gestionar suscripción Enviar fichero GPX a OpenStreetMap - Introduzca las etiquetas separadas por una coma. - Cerrar Nota de OSM - Comentar Nota de OSM + Ingresa etiquetas separadas por comas. + Cerrar nota de OSM + Comentar nota de OSM Añadir foto Registrar en \nOpenPlaceReviews.org @@ -3854,15 +3830,15 @@ Lancha a motor Añadir a Mapillary Añadir a OpenPlaceReviews - OsmAnd muestra fotos de diferentes fuentes: -\nOpenPlaceReviews - fotos POI; -\nMapillary - imágenes a nivel de calle; -\nWeb / Wikimedia - fotos POI según los datos de OpenStreetMap. + OsmAnd muestra fotos de varios repositorios: +\nOpenPlaceReviews (fotos de PDI); +\nMapillary (imágenes a nivel de calle); +\nWeb / Wikimedia (fotos de PDI según datos de OpenStreetMap). Recursos - Tamaño de fichero aproximado + Tamaño aproximado del archivo Seleccione los datos para exportar al fichero. Necesario para importar - No hay espacio suficiente + Sin espacio suficiente • Se ha añadido la opción de exportar e importar todos los datos, incluyendo los ajustes, los recursos y «Mis sitios» \n \n • Planificar ruta: gráficos para los segmentos de trazas con la ruta y añadio capacidad de crear o editar trazas de segmentos múltiples @@ -3880,35 +3856,35 @@ \nPuedes administrar y cancelar las suscripciones en los ajustes de AppGallery. Desarrollo nativo del transporte público Cambiar al cálculo de ruta Java (seguro) del transporte público - Los datos de %1$s sólo están disponibles con las carreteras, calcula una ruta usando \"Ruta entre puntos\" para ver los gráficos. + Los datos de «%1$s» sólo están disponibles con los caminos, calcula una ruta usando «Ruta entre puntos» para ver los gráficos. Separador - \"Público\" significa que la traza se muestra públicamente en sus trazas de GPS y en listas de trazas de GPS públicas, y en la lista de trazas públicas con marcas de tiempo en forma sin formato. Los datos proporcionados a través de la API no hacen referencia a su página de seguimiento. Las marcas de tiempo de los puntos de seguimiento no están disponibles a través de la API de GPS pública y los puntos de seguimiento no están ordenados cronológicamente. - \"Privado\" significa que la traza no aparece en ninguna lista pública, pero los puntos de la traza en orden no cronológico están disponibles a través de la API de GPS pública sin marcas de tiempo. - \"Identificable\" significa que la traza se mostrará públicamente en sus trazas GPS y en listas de trazas GPS públicas, es decir, otros usuarios podrán descargar la traza sin procesar y asociarla con su nombre de usuario. Los datos de puntos de seguimiento públicos con marca de tiempo de la API de GPS que se proporcionan a través de la API de puntos de seguimiento harán referencia a su página de seguimiento original. - \"Rastreable\" significa que el rastreo no aparece en ningún listado público, pero los trackpoints son procesados con marcas de tiempo (que no se pueden asociar con usted directamente) lo hacen mediante descargas de la API de GPS pública. + «Público» significa que la traza se mostrará públicamente en tu listado de trazas y en los listados de trazas GPS públicas con marcas de tiempo en bruto. Los datos servidos a través de la API no harán referencia a su página de trazas. Las marcas de tiempo de los puntos de la traza no estarán disponible a través de la API pública de GPS, aunque los puntos se ordenan cronológicamente. + «Privado» significa que la traza no aparecerá en ninguna lista pública, pero el conjunto de puntos seguirá estando disponible en orden cronológico a través de la API pública de GPS y sin marcas de tiempo. + «Identificable» significa que la traza se mostrará públicamente en tu listado de trazas y en el listado de trazas GPS públicas, es decir que otros usuarios podrán descargar la traza en bruto y asociarla con su nombre de usuario. Los datos servidos a través de la API de conjunto de puntos hará referencia a la página original de la traza. + «Trazable» significa que la traza no aparece en ninguna lista pública, pero el conjunto de puntos procesados con marcas de tiempo (no se pueden asociar directamente con usted) estarán disponibles a través de la API pública de GPS. Alemán (casual) Para conducción de motos de nieve con carreteras y pistas exclusivas. - Gracias por comprar \'Contour lines\' + Gracias por comprar las «Curvas de nivel» Evite las aceras Evite las aceras Datos OsmAnd Live Datos OsmAnd Live - Enrutamiento de dos fases para la navegación del automóvil. - Inicie sesión con OAuth para usar las funciones de osmedit - Iniciar sesión a través de OAuth - Borrar token de OpenStreetMap OAuth - Desconectado + Navegación bifásica en automóvil. + Ingresar con OAuth para usar las funciones de edición de OSM + Ingresar a través de OAuth + Vaciar llave OAuth de OpenStreetMap + Sesión finalizada Utilice un algoritmo de enrutamiento de 2-fases A * - Deberas iniciar sesión para subir cambios nuevos o modificados. + Debes iniciar sesión para subir los cambios nuevos o modificados. \n -\nPuede iniciar sesión utilizando el método seguro OAuth o utilizar su nombre de usuario y contraseña. +\nPuedes ingresar usando el método seguro de OAuth o con nombre de usuario y contraseña. %1$s * %2$s Permitir vías de agua intermitentes Gráfico - Por favor espera. -\nEl gráfico estará disponible después del nuevo cálculo de la ruta. - Inicie sesión en OpenStreetMap - Inicie sesión en OpenStreetMap.org + Ten paciencia. +\nEl gráfico estará disponible al recalcular la ruta. + Iniciar sesión en OpenStreetMap + Ingresar en OpenStreetMap.org Iniciar sesión con OpenStreetMap Usar nombre de usuario y contraseña Toque el botón para configurar un método de pago en Google Play para corregir su suscripción. @@ -3916,11 +3892,11 @@ La suscripción a OsmAnd Live ha sido pausada La suscripción a OsmAnd Live está en espera Historial de marcadores - Puede iniciar sesión utilizando el método seguro OAuth o utilizar su nombre de usuario y contraseña. + Puedes iniciar sesión con el método seguro de OAuth o usar el nombre de usuario y contraseña. Las fotos son proporcionadas por el proyecto de datos abiertos OpenPlaceReviews.org. Para cargar sus fotos, debe registrarse en su sitio web. - No se puede cargar la imagen. Vuelve a intentarlo más tarde + No se puede subir la imagen, inténtalo más tarde Seleccionar imagen - Tu dispositivo solo tiene %1$s libres. Libere espacio o anule la selección de algunos elementos para exportar. + El dispositivo sólo tiene %1$s libre. Por favor, libera algo de espacio o desmarca algunos elementos a exportar. Seleccione los grupos que se importarán. Seleccione los elementos que se importarán. Cambie para usar dev.openstreetmap.org en lugar de openstreetmap.org para probar la carga de OSM Note / POI / GPX. @@ -3929,11 +3905,11 @@ Unir segmentos Dividir antes Dividir después - Añadir un nuevo segmento + Añadir nuevo segmento Perfil de OsmAnd Perfil de usuario Invertir todos los puntos - Seleccione el perfil que se utilizará al iniciar la aplicación. + Elige el perfil que será usado al iniciar la aplicación. Utilizado por última vez Prefiero rutas de senderismo Prefiero rutas de senderismo @@ -3941,4 +3917,53 @@ Permitir arroyos y desagües Permitir vías de agua intermitentes Tiempo de indicaciones por voz + Usar test.openplacereviews.org + OpenPlaceReviews es un proyecto impulsado por la comunidad sobre lugares públicos como restaurantes, hoteles, museos, puntos de referencia. Recoge toda la información pública sobre ellos como fotos, reseñas, enlaces a otros servicios como OpenStreetMap y Wikipedia. +\n +\nTodos los datos de OpenPlaceReviews son abiertos y están disponibles para todos: http://openplacereviews.org/data. +\n +\nPuedes leer más en: https://openplacereviews.org + OpenPlaceReviews + La URL con todos los parámetros se verá así: + Motores de navegación en línea + Motor de navegación en línea + Error de servidor: %1$s + El nombre ya existe + Acceder a OpenPlaceReviews + Si no, mantenerlo vacío + Sombreado / Pendiente / Curvas de nivel + Editar traza + Editar motor de navegación en línea + Borrar puntos de referencia + ¿Borrar este motor de navegación en línea\? + Copiar a «Marcadores del mapa» + Copiar a favoritos + Copiar dirección + Leer completo + Editar descripción + Cambiar carpeta + Tiempo de anuncio + Preparación larga + Preparar + Pasando + Fuera de la ruta + Intervalos de tiempo y distancia + El tiempo de anuncio de las diferentes indicaciones por voz depende del tipo de mensaje, la velocidad de navegación actual y la velocidad de navegación predefinida. + Has llegado al destino + Acercarse + Analizar intervalos divididos + Añadir motor de navegación en línea + Invierno + Agua + Peatón + Motonieve + Correr + Equitación + Carreras + Todo terreno + Bicicleta de montaña + Motocicleta + Senderismo + Bicicleta + Automóvil \ No newline at end of file diff --git a/OsmAnd/res/values-et/strings.xml b/OsmAnd/res/values-et/strings.xml index 7061f624dc..a258173a70 100644 --- a/OsmAnd/res/values-et/strings.xml +++ b/OsmAnd/res/values-et/strings.xml @@ -162,9 +162,6 @@ Paigalda Mapillary piltide lisamiseks sellesse asukohta kaardil. Siin puuduvad fotod. Taaskäivita otsing - Lülita OSM märkmed sisse või välja - Näita OSM märkmed - Peida OSM Notes Täname sind tagasiside eest Sõlme või teed ei leidunud. Otsingutulemused puuduvad\? @@ -601,10 +598,7 @@ Pöörangupõhine Välju Sisene peatuses - Kuva/peida rajad Nupp valitud radade kaardil kuvamiseks või peitmiseks. - Peida rajad - Kuva rajad Palun määra esmalt sihtkoht Luba ühistransport OsmAnd Live muudatustele. OsmAnd Live ühistransport @@ -991,13 +985,7 @@ Teekonna koostamisel eelista katteta teid pinnatud teedele. OSM muudatused Nupp kõrgusjoonte kuvamiseks või peitmiseks kaardil. - Kuva kõrgusjooned - Peida kõrgusjooned - Kuva/peida kõrgusjooned Nupp künkavarjutuste kuvamiseks või peitmiseks kaardil. - Kuva künkavarjutus - Peida künkavarjutus - Kuva/peida künkavarjutus Kõnesünteesi mootorit ei saa käivitada. Ekspordi profiil OsmAnd profiil: %1$s @@ -3127,10 +3115,6 @@ Koht Dubleerimise vältimiseks nimetati kiirtegevus ümber %1$s. Kiirtegevuse nime duplikaat - Kuva/peida lemmikud - Kuva lemmikud - Peida lemmikud - Kuva/peida HP Kuva %1$s Peida %1$s Lisa kategooria @@ -3441,9 +3425,6 @@ Teekonna ümberarvutus, kui kaugus teekonnast praegusesse asukohta on suurem valitud väärtusest. %1$s %2$s-st Nõlvad - Kuva või peida maastik - Peida maastik - Kuva maastik Nupp maastikukihi kuvamiseks või peitmiseks kaardil. Kustuta kirjeldus Lisa kirjeldus @@ -3528,9 +3509,6 @@ Valige kaardil olevad Vikipeedia artiklite keeled. Artikli lugemise ajal kasuta ükskõik millist saadaolevat keelt. %1$s / %2$s Otsi huvipunktide tüüpe - Peida ühistranspordi teave - Näita ühistranspordi teavet - Kuva või peida ühistransport Nupp, mis kuvab või peidab ühistranspordiandmed kaardil. Lisa või muuda huvipunkti Öine kaart @@ -3541,9 +3519,6 @@ Madalate sildade vältimiseks saad kirjeldada laeva kõrguse. Palun arvesta, et liikuva silla puhul me kasutame seda kõrgust ka siis, kui sild on avatud. Madalate sildade vältimiseks kirjelda laeva kõrgus. Palun arvesta, et liikuva silla puhul me kasutame seda kõrgust ka siis, kui sild on avatud. Lühikeste sildade vältimiseks kirjelda laeva laius - Näita või peida Mapillary andmed - Peida Mapillary andmed - Näita Mapillary andmeid Nupp, mis näitab või peidab kaardil Mapillary kihti. Eemalda ja taaskäivita Rulluisud diff --git a/OsmAnd/res/values-eu/strings.xml b/OsmAnd/res/values-eu/strings.xml index 44936b286b..ef6c04acb4 100644 --- a/OsmAnd/res/values-eu/strings.xml +++ b/OsmAnd/res/values-eu/strings.xml @@ -2125,10 +2125,6 @@ Area honi dagokio: %1$s x %2$s Pantailaren erdian aparkaleku bat gehitzeko botoia. " hona gorde da: " Tokia - Erakutsi/ezkutatu gogokoak - Erakutsi gogokoak - Ezkutatu gogokoak - Erakutsi/ezkutatu POI Erakutsi %1$s Ezkutatu %1$s Gehitu kategoria bat @@ -2269,9 +2265,6 @@ Area honi dagokio: %1$s x %2$s Handitu bilaketaren erradioa Ez da ezer aurkitu Aldatu bilaketa edo handitu erradioa. - Erakutsi edo ezkutatu OSM oharrak - Erakutsi OSM oharrak - Ezkutatu OSM oharrak Mapan OSM oharrak erakutsi edo ezkutatzeko botoia. Distantziaren arabera ordenatuta Bilatu gogokoetan @@ -2846,7 +2839,6 @@ Area honi dagokio: %1$s x %2$s Aldatu Erakutsi gehiago Bistaratutako lorratzak - Erakutsi/ezkutatu lorratzak Gehitu tarteko puntua %1$d transferentzia Gehitu irteera eta helburua @@ -2884,8 +2876,6 @@ Area honi dagokio: %1$s x %2$s Eskailera Bidea Zehaztu gabea - Ezkutatu lorratzak - Erakutsi lorratzak Gehitu helburua aurretik Aurreko ibilbidea Graduak @@ -3265,13 +3255,7 @@ Area honi dagokio: %1$s x %2$s Hobetsi asfaltatu gabeko bideak ibilbideetan. OSM edizioak Sestra-kurbak mapan erakusteko edo ezkutatzeko botoia. - Erakutsi sestra-kurbak - Ezkutatu sestra-kurbak - Erakutsi/ezkutatu sestra-kurbak Erliebe-itzalak mapan erakutsi edo ezkutatzeko botoia. - Erakutsi erliebe-itzalak - Ezkutatu erliebe-itzalak - Erakutsi/ezkutatu erliebe-itzalak Ezin da testu-ahots motorra abiarazi. Simulatu zure posizioa grabatutako GPX lorratz bat erabiliz. Esportatu profila @@ -3489,9 +3473,6 @@ Area honi dagokio: %1$s x %2$s Gehitu deskripzioa Ezabatu deskripzioa Mapako terreno geruza erakutsi edo ezkutatzeko botoia. - Erakutsi terrenoa - Ezkutatu terrenoa - Erakutsi edo ezkutatu terrenoa Maldak Erliebea Gaitu erliebea edo malda mapa ikusteko. Mapa mota hauei buruz gehiago irakur dezakezu gure gunean @@ -3553,9 +3534,6 @@ Area honi dagokio: %1$s x %2$s OsmAnd erosketak Maparen sinbologiari gida. Nabigazio profilak - Ezkutatu garraio publikoa - Erakutsi garraio publikoa - Erakutsi edo ezkutatu garraio publikoa OsmAnd aztarnaria Jarraitu Pertsonalizatu \"Tiradera\", \"Konfiguratu mapa\" eta \"Laster-menua\" ataletan dauden elementu kopurua. @@ -3675,9 +3653,6 @@ Area honi dagokio: %1$s x %2$s metro Erakutsi edo ezkutatu maparen xehetasun gehigarriak Gauerako mapa - Erakutsi/ezkutatu Mapillary - Ezkutatu Mapillary - Erakutsi Mapillary Egina Ezabatu hurrengo norako puntua. Bolumen botoiak zoom egiteko diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml index 6c5174e96c..01a39b1c6a 100644 --- a/OsmAnd/res/values-fa/strings.xml +++ b/OsmAnd/res/values-fa/strings.xml @@ -2180,10 +2180,6 @@ نام تکراری برای کنش فوری دکمه‌ای برای پنهان/آشکارکردن علاقه‌مندی‌ها روی نقشه. دکمه‌ای برای پنهان/آشکارکردن POIها روی نقشه. - آشکار/پنهان‌کردن علاقه‌مندی‌ها - نشان‌دادن علاقه‌مندی‌ها - مخفی‌کردن علاقه‌مندی‌ها - آشکار/پنهان‌کردن POIها نشان‌دادن %1$s پنهان‌کردن %1$s افزودن دسته @@ -2288,9 +2284,6 @@ مقصد شما در ناحیه‌ای با دسترسی خصوصی قرار دارد. دسترسی به جاده‌های خصوصی برای این سفر مجاز شود؟ شروع مجدد جست‌وجو چیزی پیدا نشد - آشکار/پنهان‌کردن یادداشت‌های OSM - آشکارکردن یادداشت‌های OSM - پنهان‌کردن یادداشت‌های OSM دکمه‌ای برای آشکار/پنهان کردن یادداشت‌های OSM بر روی نقشه. مرتب‌شده بر اساس مسافت جست‌وجو در علاقه‌مندی‌ها @@ -2866,10 +2859,7 @@ نوع جاده‌ها ایستگاه پیاده‌شدن ایستگاه سوارشدن - آشکار/پنهان کردن ردها دکمه‌ای برای آشکار/پنهان کردن ردهای انتخابی بر روی نقشه. - پنهان‌کردن ردها - آشکارکردن ردها حمل‌ونقل عمومی با استفاده از به‌روزرسانی‌های OsmAnd Live فعال شود. حمل‌ونقل عمومی با OsmAnd Live %1$d انتقال @@ -3284,13 +3274,7 @@ در مسیریابی، جاده‌های روسازی‌نشده را به روسازی‌شده ترجیح می‌دهد. ویرایش‌های OSM دکمه‌ای برای آشکار/پنهان کردن منحنی‌های میزان روی نقشه. - نشان‌دادن منحنی‌های میزان - پنهان‌کردن منحنی‌های میزان - آشکار/پنهان کردن منحنی‌های میزان دکمه‌ای برای آشکار/پنهان کردن سایه‌روشن‌ها روی نقشه. - نشان‌دادن سایه‌روشن‌ها - پنهان‌کردن سایه‌روشن‌ها - آشکار/پنهان کردن سایه‌روشن‌ها شروع موتور متن به گفتار ناموفق بود. موقعیت خود را با استفاده از یک رد GPX ضبط‌شده شبیه‌سازی کنید. پروفایل OsmAnd:‏ %1$s @@ -3523,9 +3507,6 @@ سایه‌روشن %1$s از %2$s شیب‌ها - آشکار یا پنهان کردن ناهمواری‌ها - پنهان‌کردن ناهمواری‌ها - نمایش ناهمواری‌ها دکمه‌ای برای آشکار یا پنهان کردن لایهٔ ناهمواری‌ها روی نقشه. دایره حذف توضیحات @@ -3638,9 +3619,6 @@ ایجاد یا ویرایش POI افزودن یا ویرایش علاقه‌مندی برای دسترسی به این کنش‌ها می‌توانید روی دکمهٔ «%1$s» بزنید. - مخفی‌کردن حمل‌ونقل عمومی - نمایش حمل‌ونقل عمومی - آشکار یا پنهان کردن حمل‌ونقل عمومی دکمه‌ای برای آشکار یا پنهان کردن حمل‌ونقل عمومی روی نقشه. با لمس دکمهٔ عملیاتی بین پروفایل‌های انتخاب‌شده جابه‌جا شوید. افزودن پروفایل @@ -3710,9 +3688,6 @@ می‌توانید ارتفاع کشتی را برای پرهیز از پل‌های کوتاه وارد کنید. به یاد داشته باشید که اگر پل متحرک است، در حالت باز نیز ارتفاع کشتی را در نظر می‌گیریم. ارتفاع کشتی را برای پرهیز از پل‌های کوتاه وارد کنید. به یاد داشته باشید که اگر پل متحرک است، در حالت باز نیز ارتفاع کشتی را در نظر می‌گیریم. عرض کشتی را برای پرهیز از پل های باریک وارد کنید - آشکار/پنهان کردن مپیلاری - آشکارکردن مپیلاری - پنهان‌کردن مپیلاری دکمه‌ای برای آشکار/پنهان کردن لایهٔ مپیلاری روی نقشه. حذف نصب دوربین‌های سرعت حذف نصب و شروع دوباره diff --git a/OsmAnd/res/values-fi/strings.xml b/OsmAnd/res/values-fi/strings.xml index 3801bf19b4..e2ecb5d234 100644 --- a/OsmAnd/res/values-fi/strings.xml +++ b/OsmAnd/res/values-fi/strings.xml @@ -1920,10 +1920,6 @@ Jos pidät OsmAndista ja OSMsta ja haluat tukea niitä, on tämä täydellinen t KP lista Viesti Konfiguroi kartta - Näytä/piilota suosikit - Näytä suosikit - Piilota suosikit - Näytä/piilota KP:t Näytä %1$s Piilota %1$s Lisää luokka @@ -2002,9 +1998,6 @@ Jos pidät OsmAndista ja OSMsta ja haluat tukea niitä, on tämä täydellinen t Mapillary Käynnistä haku uudelleen Mitään ei löytynyt - Näytä/piilota OSM-huomautukset - Näytä OSM-huomautukset - Piilota OSM-huomautukset Lajiteltu etäisyyden perusteella Etsi suosikeista Piilota zoomaustasosta @@ -2275,7 +2268,6 @@ Jos pidät OsmAndista ja OSMsta ja haluat tukea niitä, on tämä täydellinen t Muuta Näytä lisää Näytetyt jäljet - Näytä/piilota GPX jäljet Profiilin asetukset: Määritä profiili Vaihda profiilia @@ -2304,12 +2296,6 @@ Jos pidät OsmAndista ja OSMsta ja haluat tukea niitä, on tämä täydellinen t Oletuksena Jälkien tallennuskansio OSM-muokkaukset - Näytä korkeuskäyrät - Piilota korkeuskäyrät - Näytä/piilota korkeuskäyrät - Näytä rinnevarjostus - Piilota rinnevarjostus - Näytä/piilota rinnevarjostus Vie profiili OsmAnd profiili: %1$s \'%1$s\' on jo olemassa. Korvataanko\? @@ -2329,8 +2315,6 @@ Jos pidät OsmAndista ja OSMsta ja haluat tukea niitä, on tämä täydellinen t Jälki Jäljet Valitse seurattava jälki tiedosto - Piilota GPX jäljet - Näytä GPX jäljet Hiihto Hiihto Hiihto @@ -2602,8 +2586,6 @@ Jos pidät OsmAndista ja OSMsta ja haluat tukea niitä, on tämä täydellinen t Palvelu Hätätapaus Liikenne - Näytä julkinen liikenne - Piilota julkinen liikenne Symbolit Korvaa toinen kohde tällä. Kansiot diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 7eec7e78e9..4dda03c224 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -2099,10 +2099,6 @@ Emplacement Ce nom existe déjà, l\'action rapide a été renommée en %1$s. Nom d\'action rapide en double - Afficher / masquer les favoris - Afficher les favoris - Masquer les favoris - Afficher / masquer les points d\'intérêt Afficher %1$s Masquer %1$s Ajouter une catégorie @@ -2305,9 +2301,6 @@ Téléchargez le greffon \'Courbes de niveaux\' pour mieux visualiser le relief. Masquer à partir du niveau de zoom Téléchargez la sur-couche \'Ombrage du relief\' pour mieux visualiser le relief. - Afficher ou masquer les notes OSM - Afficher les notes OSM - Masquer les notes OSM Bouton pour afficher ou masquer les notes OSM sur la carte. Trier par distance Rechercher dans les favoris @@ -2834,9 +2827,6 @@ Instructions pas à pas Types de route Sortir à - Afficher / masquer les traces - Masquer les traces - Afficher les traces Activer les modifications de transports publics en temps réel avec OsmAnd Live. Transports publics OsmAnd Live Panneau d\'affichage à l\'arrêt @@ -3253,13 +3243,7 @@ Privilégier les routes non pavées pour l\'itinéraire. Modifications OSM Bouton affichant ou masquant les courbes de niveaux sur la carte. - Afficher les courbes de niveaux - Masquer les courbes de niveaux - Afficher / masquer les courbes de niveaux Bouton affichant ou masquant l\'ombrage du relief sur la carte. - Afficher l\'ombrage du relief - Masquer l\'ombrage du relief - Afficher / masquer l\'ombrage du relief Impossible de démarrer le moteur de synthèse vocale. Simulez votre position à l\'aide d\'une trace GPX enregistrée. Exporter le profil @@ -3486,9 +3470,6 @@ Active l\'affichage de l\'ombrage du relief et l\'inclinaison. Vous pouvez en savoir plus sur ces types de cartes sur notre site. Ombrage du relief Pentes - Affiche ou masque le terrain - Masquer le terrain - Afficher le terrain Un bouton pour afficher ou masquer la couche terrain sur la carte. Supprimer la description Ajouter une description @@ -3600,9 +3581,6 @@ \n \n Vous pouvez accéder à ces actions en appuyant sur le bouton \"%1$s\". - Masquer les transports publics - Afficher les transports publics - Affiche ou masque les transports publics Bouton pour afficher ou masquer les transports publics sur la carte. Créer ou modifier un PI Emplacements de stationnement @@ -3671,9 +3649,6 @@ Vous pouvez définir la hauteur du navire pour éviter les ponts bas. Souvenez-vous que si le pont est mobile, nous utiliserons sa hauteur en position ouverte. Définir la hauteur du navire afin d\'éviter les ponts bas. Souvenez-vous que si le pont est mobile, nous utiliserons sa hauteur en position ouverte. Définir la largeur du navire pour éviter les ponts étroits - Afficher/masquer Mapillary - Masquer Mapillary - Afficher Mapillary Bouton pour afficher ou masquer la couche Mapillary sur la carte. Dans certains pays ou régions, l\'utilisation d\'avertisseurs de radars est interdit par la loi. \n diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml index 31607c9fc5..f12b12da6c 100644 --- a/OsmAnd/res/values-gl/strings.xml +++ b/OsmAnd/res/values-gl/strings.xml @@ -2087,10 +2087,6 @@ Lon %2$s Duplicidade do nome da acción rápida Un botón que amosa ou agocha os Favoritos no mapa. Un botón que amosa ou agocha os PDI no mapa. - Amosar/Agochar os Favoritos - Amosar Favoritos - Agochar os Favoritos - Amosar/Agochar os PDI Amosar %1$s Agochar %1$s Engadir unha categoría @@ -2228,9 +2224,6 @@ Lon %2$s Reiniciar procura Aumentar o raio de procura Non se atopou ren - Amosar ou agochar as notas do OSM - Amosar notas do OSM - Agochar notas do OSM Ordenado por distancia Procurar nos Favoritos Estrada @@ -2853,10 +2846,7 @@ Lon %2$s Trocar Amosar máis Pistas amosadas - Amosar/agochar pistas Un botón que amosa ou agocha as pistas escollidas no mapa. - Agochar pistas - Amosar pistas %1$d transferencias Engadir orixe e destino Engadir punto de comezo @@ -3271,13 +3261,7 @@ Lon %2$s Preferir as estradas sen pavimentar aos pavimentados para o trazado de rutas. Edicións do OSM Un botón que amosa ou agocha as curvas de nivel no mapa. - Amosar curvas de nivel - Agochar curvas de nivel - Amosar/agochar curvas de nivel Un botón que amosa ou agocha a sombra dos outeiros no mapa. - Amosar sombreados - Agochar sombreados - Amosar/agochar sombreados Non é posíbel comezar o motor de síntese de voz. Simular a túa posición empregando unha pista GPX gravada. Exportar o perfil @@ -3552,9 +3536,6 @@ Lon %2$s A ruta será recalculada se a distancia á localización actual é maior que o valor escollido. %1$s de %2$s Pendentes - Amosar ou agochar terreo - Agochar terreo - Amosar terreo Un botón que amosa ou agocha a capa do terreo no mapa. Eliminar descrición Engadir descrición @@ -3619,9 +3600,6 @@ Lon %2$s \n Retomar Podes acceder a estas accións premendo no botón “%1$s”. - Agochar transporte público - Amosar transporte público - Amosar ou agochar transporte público Botón que amosa ou agocha o transporte público no mapa. Crear ou editar PDI Posicións de aparcamento @@ -3691,10 +3669,7 @@ Lon %2$s Podes definir a altura da embarcación para evitar pontes baixas. Lémbrate se a ponte é móbil, empregaremos a súa altura no estado aberto. Define o alto da embarcación para evitar pontes baixas. Lémbrate se a ponte é móbil, empregaremos a súa altura no estado aberto. Estabelecer o largo da embarcación para evitar pontes estreitas - Amosar/agochar o Mapillary - Agochar o Mapillary Un botón para amosar ou agochar a capa do Mapillary no mapa. - Amosar o Mapillary Desinstalar radares de velocidade Legal PDI de radares de velocidade diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml index 47a3917779..fe6e171440 100644 --- a/OsmAnd/res/values-hu/strings.xml +++ b/OsmAnd/res/values-hu/strings.xml @@ -2112,10 +2112,6 @@ A gyorsművelet neve kétszer szerepel Gomb, amely a térképen megjeleníti vagy elrejti a Kedvenc helyeket. Gomb, amely a térképen megjeleníti vagy elrejti az érdekes pontokat (POI-kat). - Kedvencek megjelenítése/elrejtése - Kedvencek megjelenítése - Kedvencek elrejtése - POI-k megjelenítése/elrejtése %1$s megjelenítése %1$s elrejtése Kategória hozzáadása @@ -2239,9 +2235,6 @@ Utca kijelölése itt: %1$s Cím megadása - OSM-jegyzetek megjelenítése / elrejtése - OSM-jegyzetek megjelenítése - OSM-jegyzetek elrejtése Gomb, amely a térképen megjeleníti vagy elrejti az OSM-jegyzeteket. Távolság szerinti sorrendben Keresés a Kedvencekben @@ -2797,10 +2790,7 @@ Részletes navigáció Úttípusok Szálljon le itt: - Nyomvonalak megjelenítése/elrejtése Gomb, amely a térképen megjeleníti vagy elrejti a nyomvonalakat. - Nyomvonalak elrejtése - Nyomvonalak megjelenítése Először adjon meg egy célpontot Tömegközlekedés engedélyezése OsmAnd Live frissítésekkel. OsmAnd Live tömegközlekedés @@ -3095,12 +3085,6 @@ %1$s kB Összes térkép frissítése Biztos, hogy az összes (%1$d) térképet frissíti\? - Szintvonalak megjelenítése - Szintvonalak elrejtése - Szintvonalak megjelenítése/elrejtése - Domborzatárnyékolás megjelenítése - Domborzatárnyékolás elrejtése - Domborzatárnyékolás megjelenítése/elrejtése Nyomvonal tárolási mappája A nyomvonalak tárolhatók a \'rec\' mappában, illetve havi vagy napi bontás szerinti mappákban. Nyomvonalak felvétele a \'rec\' mappába @@ -3414,9 +3398,6 @@ Az útvonal újraszámításra kerül, amennyiben az útvonal és a jelenlegi helyzet közötti távolság nagyobb, mint a kiválasztott érték. %1$s a %2$s-ból Lejtők - Domborzat megjelenítése vagy elrejtése - Domborzat elrejtése - Domborzat megjelenítése Váltógomb, amely a térképen megjeleníti vagy elrejti a domborzati réteget. Leírás törlése Leírás hozzáadása @@ -3511,9 +3492,6 @@ Ezekhez a műveletekhez a \"%1$s\" gombra koppintva férhet hozzá. %1$s / %2$s Nem támogatott művelet: %1$s - Tömegközlekedés elrejtése - Tömegközlekedés megjelenítése - Tömegközlekedés megjelenítése vagy elrejtése POI készítése vagy módosítása Parkolási pozíció Kedvenc hozzáadása vagy módosítása @@ -3602,9 +3580,6 @@ Adja meg a hajómagasságot az alacsony hidak elkerüléséhez. Ne feledje, amennyiben a híd mozdítható, a nyitott állapotú magasságát vesszük figyelembe. Megadhatja a hajómagasságot az alacsony hidak elkerüléséhez. Ne feledje, amennyiben a híd mozdítható, a nyitott állapotú magasságát vesszük figyelembe. Adja meg a hajószélességet a keskeny hidak elkerüléséhez - Mapillary megjelenítése/elrejtése - Mapillary elrejtése - Mapillary megjelenítése Váltógomb, amely a térképen megjeleníti vagy elrejti a Mapillary réteget. Traffipaxok eltávolítása Jogi diff --git a/OsmAnd/res/values-hy/strings.xml b/OsmAnd/res/values-hy/strings.xml index 4d997b73ce..d6b1964c02 100644 --- a/OsmAnd/res/values-hy/strings.xml +++ b/OsmAnd/res/values-hy/strings.xml @@ -247,9 +247,6 @@ Ավելացնել որոնման շառավղը Ոչինչ չի գտնվել Փոխել հարցումը կամ ավելացնել որոնման շառավիղը։ - Ցույց տալ/թաքցնել OSM նշումները - Ցույց տալ OSM նշումները - Թաքցնել OSM նշումները Քարտեզի վրա ցույց տալ կամ թաքցնել OSM նշումները կոճակը: Դասավորված է ըստ հեռավորության Որոնում Սիրվածում @@ -2484,10 +2481,6 @@ Կրկնօրինակ անուն գտնվեց Սեղմելով գործողության կոճակը ցույց կտա կամ կթաքցնի «Սիրված» կետերը քարտեզի վրա: Սեղմելով գործողության կոճակը ցույց կտա կամ կթաքցնի POI կետերը քարտեզի վրա: - Ցուցադրել/թաքցնել «Սիրված»-ը - Ցուցադրել «Սիրված»-ը - Թաքցնել «Սիրված»-ը - Ցուցադրել/թաքցնել POI Ցուցադրել %1$s Թաքցնել %1$s Ավելացնել կատեգորիա @@ -2870,9 +2863,6 @@ Պահել ակտիվ Ջնջել Որոշ երկրներում արագության վերահսկողության տեսախցիկների ծանուցումը արգելված է օրենքով ։ - Ցույց տալ/Թաքցնել Mapillary - Թաքցնել - Ցույց տալ Mapillary Անջատիչ - Mapillary շերտը ցույց տալու կամ թաքցնել ու քարտեզի վրա: Կողմնորոշում %1$s ջնջվեց @@ -2959,9 +2949,6 @@ OsmAnd-ի գնումները Տեղեկանք քարտեզի խորհրդանիշներին: Նավիգացիոն պրոֆիլներ - Թաքցնել հասարակական տրանսպորտը - Ցույց տալ հասարակական տրանսպորտը - Ցույց տալ / թաքցնել հասարակական տրանսպորտը Կոճակ, որը ցույց է տալիս կամ թաքցնում է հասարակական տրանսպորտը քարտեզի վրա: Ստեղծել / Խմբագրել POI Ավելացնել / Խմբագրել Սիրվածն-րը diff --git a/OsmAnd/res/values-id/strings.xml b/OsmAnd/res/values-id/strings.xml index 066b53f1b6..d69eb004e6 100644 --- a/OsmAnd/res/values-id/strings.xml +++ b/OsmAnd/res/values-id/strings.xml @@ -233,9 +233,6 @@ Tingkatkan radius pencarian Tidak ada yang ditemukan Ubah kata pencarian atau tingkatkan radius pencarian. - Tampil/sembunyikan Catatan OSM - Tampilkan Catatan OSM - Sembunyikan Catatan OSM Mengetuk tombol tindakan akan menampilkan atau menyembunyikan Catatan OSM di peta. Diurutkan menurut jarak Cari Favorit diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml index baf977ae9c..09b929262e 100644 --- a/OsmAnd/res/values-is/strings.xml +++ b/OsmAnd/res/values-is/strings.xml @@ -1801,10 +1801,6 @@ Forstilling á nafni " vistað í " Staður - Birta/Fela eftirlæti - Birta eftirlæti - Fela eftirlæti - Birta/Fela merkisstaði Sýna %1$s Fela %1$s Bæta við flokki @@ -2049,9 +2045,6 @@ Byrja leit aftur Stækka radíus leitar Ekkert fannst - Birta/fela OSM-minnispunkta - Birta OSM-minnispunkta - Fela OSM-minnispunkta Raðað eftir vegalengd Leita í eftirlætum Viðbót @@ -2850,10 +2843,7 @@ Gerðir vega Fara útaf við Fara um borð við stöðvunina - Birta/Fela ferla Hnappur til að birta eða fela valda ferla á kortinu. - Fela ferla - Birta ferla Virkja breytingar á almenningssamgöngum í OsmAnd Live. Almenningssamgöngur OsmAnd Live Lestu meira á blogginu okkar um hvernig OsmAnd reiknar leiðir. @@ -3268,13 +3258,7 @@ Velja frekar vegi með óbundnu slitlagi við leiðagerð. OSM-breytingar Hnappur til að birta eða fela hæðarlínur á kortinu. - Birta hæðarlínur - Fela hæðarlínur - Birta/Fela hæðarlínur Hnappur til að birta eða fela hæðaskyggingu á kortinu. - Birta hæðaskyggingu - Fela hæðaskyggingu - Birta/Fela hæðaskyggingu Gat ekki ræst talgervil. Herma eftir staðsetningu þinni með áður skráðum GPX-ferli. Flytja út snið @@ -3497,9 +3481,6 @@ Virkja til að sjá hæðaskyggingar eða brekkur á korti. Þú getur lesið meira um þessa eiginleika á vefnum okkar. Hæðaskygging Brekkur - Birta eða fela yfirborð - Fela yfirborð - Sýna yfirborð Hnappur til að birta eða fela yfirborðslag á kortinu. Endurreikna leið ef farið er út af fyrirfram gefinni leið Veldu þá vegalengd sem þarf til að leiðin verði endurreiknuð. @@ -3597,7 +3578,6 @@ Gat ekki fundið nein slík snið. Settu inn eða afritaðu og límdu slóð á nettengdan kortagjafa. Kortamerki - Fela almenningssamgöngur Nota tímamörk kerfis fyrir skjá Breyta nettengdum gagnagjafa OsmAnd rekjari @@ -3610,7 +3590,6 @@ Þú getur komist í þessar aðgerðir með því að ýta á \"%1$s\"-hnappinn. Áskrift - OsmAnd Live Alltaf - Birta eða fela almenningssamgöngur Endurheimta sjálfgefna röð atriða Óstudd tegund Leiðsagnarleiðbeiningar @@ -3620,7 +3599,6 @@ Halda áfram OsmAnd + Mapillary Bæta við eða breyta eftirlæti - Birta almenningssamgöngur Sjálfgefin tímamörk fyrir skjá Hnappur til að birta eða fela almenningssamgöngur á kortinu. Nálægðarskynjari @@ -3672,9 +3650,6 @@ Merktar hraðamyndavélar Halda virku Aðvaranir vegna hraðamyndavéla eru bannaðar með lögum í sumum löndum. - Sýna/fela Mapillary - Fela Mapillary - Sýna Mapillary Víxlhnappur til að birta eða fela Mapillary-lagið á kortinu. Stefna %1$s eytt diff --git a/OsmAnd/res/values-it/strings.xml b/OsmAnd/res/values-it/strings.xml index b0fed91a00..0b578f99f3 100644 --- a/OsmAnd/res/values-it/strings.xml +++ b/OsmAnd/res/values-it/strings.xml @@ -2120,10 +2120,6 @@ Nome dell\'azione veloce duplicato Questo pulsante d’azione mostra o nasconde i preferiti sulla mappa. Questo pulsante azione mostra o nasconde i PDI sulla mappa. - Mostra/nascondi preferiti - Mostra preferiti - Nascondi preferiti - Mostra/nascondi PDI Mostra %1$s Nascondi %1$s Aggiungi una categoria @@ -2250,9 +2246,6 @@ Aumenta il raggio di ricerca Nessun risultato Cambia la ricerca o aumenta il raggio. - Mostra/nascondi le Note OSM - Mostra le note OSM - Nascondi le note OSM Toccando il pulsante azione verranno mostrate o nascoste le note OSM sulla mappa. Ordinato per distanza Cerca nei Preferiti @@ -2829,9 +2822,6 @@ Tipi di strade Mostra di più Tracciati visualizzati - Mostra/nascondi tracce GPX - Nascondi Tracciati GPX - Mostra Tracciati GPX Modalità %s Evita tipi di trasporto… A piedi @@ -3252,13 +3242,7 @@ Preferisci le strade pavimentate. Modifiche OSM Un controllo per mostrare o nascondere nella mappa le linee isoipse. - Mostra le linee isoipse - Nascondi le linee isoipse - Mostra/nascondi le linee isoipse Un controllo per mostrare o nascondere nella mappa le ombreggiature dei rilievi. - Mostra l\'ombreggiatura dei rilievi - Nascondi l\'ombreggiatura dei rilievi - Mostra/nascondi l\'ombreggiatura dei rilievi Impossibile avviare il motore dal-testo-alla-voce. Simula la mia posizione utilizzando una traccia GPX registrata. Utilizzata per stimare l\'orario d\'arrivo per le strade di tipo sconosciute e come limite di velocità per tutte le strade (può influenzare il calcolo del percorso) @@ -3476,9 +3460,6 @@ Aggiungi descrizione Elimina descrizione Un bottone per mostrare o nascondere la vista rilievo sulla mappa. - Mostra rilievo - Nascondi rilievo - Mostra/nascondi rilievo Pendenze Ombreggiatura rilievi Puoi avere maggiori informazioni sulle Pendenze in %1$s. @@ -3514,9 +3495,6 @@ Tutte le lingue Plugin sviluppatore Oggetti - Nascondi i trasporti pubblici - Mostra i trasporti pubblici - Mostra/nascondi i trasporti pubblici Il pulsante mostra o nasconde nella mappa i trasporti pubblici. Crea/Modifica PDI Posizione di parcheggio @@ -3672,9 +3650,6 @@ Puoi mpostare l\'altezza dell\'imbarcazione per evitare ponti bassi. Ricorda che, se il ponte è mobile, useremo la sua altezza da aperto. Imposta l\'altezza dell\'imbarcazione per evitare ponti bassi. Ricorda che, se il ponte è mobile, useremo la sua altezza da aperto. Imposta la larghezza della\"imbarcazione per evitare i ponti stretti - Mostra/nascondi Mapillary - Nascondi Mapillary - Mostra Mapillary Un pulsante per visualizzare nella mappa o nascondere il livello Mapillary . Fornisci la lunghezza del tuo veicolo, alcune restrizioni di percorso potrebbero essere applicate per veicoli. Disinstalla autovelox diff --git a/OsmAnd/res/values-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml index a9c6fff921..c299b049d4 100644 --- a/OsmAnd/res/values-iw/strings.xml +++ b/OsmAnd/res/values-iw/strings.xml @@ -1125,9 +1125,6 @@ הגדלת רדיוס החיפוש לא נמצא כלום עריכת החיפוש או הגדלת הטווח. - הצגה או הסתרה של הערות OSM - הצגת הערות OSM - הסתרת הערות OSM כפתור להצגה או להסתרה של הערות OSM על המפה. מסודר לפי מרחק חיפוש במועדפים @@ -1649,10 +1646,6 @@ מיקום בורר להצגה או הסתרה של הנקודות המועדפות במפה. בורר להצגה או הסתרה של נקודות עניין במפה. - הצגה/הסתרה של מועדפים - הצגת מועדפים - הסתרת מועדפים - הצגה/הסרה של נקודות עניין הצגת %1$s הסתרת %1$s הוספת קטגוריה @@ -2843,10 +2836,7 @@ פנייה אחר פנייה סוגי כבישים לצאת ב־ - הצגה/הסתרה של מסלולים כפתור להצגה או הסתרה של המסלולים הנבחרים במפה. - הסתרת מסלולים - הצגת מסלולים הפעלת תחבורה ציבורית לשינויים ב־OsmAnd החי. OsmAnd חי תחבורה ציבורית %1$d העברות @@ -3257,13 +3247,7 @@ להעדיף דרכים לא סלולות על פני סלולות בבחירת מסלול. עריכות OSM כפתור להצגה או להסתרה של קווי מתאר במפה. - הצגת קווי מתאר - הסתרת קווי מתאר - הצגה/הסתרה של קווי מתאר כפתור להצגה או הסתרה של הצללות במפה. - הצגת הצללה - הסתרת הצללה - הצגה/הסתרה של הצללה לא ניתן להפעיל מנוע המרת טקסט לדיבור. הדמיית המיקום שלך באמצעות מסלול GPX שהוקלט מראש. ייצוא פרופיל @@ -3470,9 +3454,6 @@ הצללה %1$s מתוך %2$s מדרונות - הצגה או הסתרה של תוואי שטח - הסתרת תוואי שטח - הצגת תוואי שטח כפתור להצגה או הסתרה של שכבת תוואי שטח על גבי המפה. מחיקת תיאור הוספת תיאור @@ -3591,9 +3572,6 @@ תקן מר״ב ב־OsmAnd נעשה שימוש בתקן מר״ב, שדומה אך לא זהה לתצורת המר״ב של נאט״ו. ניתן לגשת לפעולות האלו על ידי לחיצה על הכפתור „%1$s”. - הסתרת תחבורה ציבורית - הצגת תחבורה ציבורית - הצגת או הסתרת תחב״צ כפתור להצגה או הסתרה של תחבורה ציבורית על המפה. יצירה או עריכה של נקודת עניין מקומות חנייה @@ -3686,9 +3664,6 @@ ניתן להגדיר את גובה כלי השיט כדי להימנע מגשרים נמוכים. נא לשים לב שאם הגשר נע, אנו נשתמש בגובהו במצב הפתוח. יש להגדיר את גובה כלי השיט כדי להימנע מגשרים נמוכים. נא לשים לב שאם הגשר נע, אנו נשתמש בגובהו במצב הפתוח. הגדרת רוחב כלי השיט כדי להימנע מגשרים צרים - הצגת/הסתרת Mapillary - הסתרת Mapillary - הצגת Mapillary מפסק להצגה או הסתרה של שכבת Mapillary על גבי המפה. הסרת מצלמות מהירות משפטי diff --git a/OsmAnd/res/values-ja/strings.xml b/OsmAnd/res/values-ja/strings.xml index a5edb2aaeb..ace0b01cd1 100644 --- a/OsmAnd/res/values-ja/strings.xml +++ b/OsmAnd/res/values-ja/strings.xml @@ -2141,10 +2141,6 @@ POIの更新は利用できません クイックアクション名の重複 マップ画面でのお気に入り地点の表示/非表示の切替が出来ます。 マップ画面でのPOIの表示/非表示の切替が出来ます。 - お気に入りの表示/非表示 - お気に入りを表示 - お気に入りを非表示 - POIの表示/非表示 %1$sを表示 %1$sを非表示 カテゴリーを追加 @@ -2349,9 +2345,6 @@ POIの更新は利用できません  • オプションで速度と標高表示ができます  • 等高線と山陰の表示(要追加プラグイン) " - OSMメモの表示/非表示 - OSMメモを表示 - OSMメモを非表示 マップ画面でのOSMメモの表示/非表示を切り替えるボタンです。 距離順で並べ替え お気に入りで検索 @@ -2792,10 +2785,7 @@ POIの更新は利用できません 入れ替え さらに表示 マップ上の経路 - GPX経路の表示/非表示 マップ上にある選択したGPX経路の表示/非表示を切り替えるボタンです。 - 経路の非表示 - 経路の表示 最初に目的地を設定して下さい 前回のルート 立方メートル @@ -3267,13 +3257,7 @@ POIの更新は利用できません オック語 OSMの編集 マップ上の等高線の表示/非表示を切り替えられるボタンです。 - 等高線を表示 - 等高線を非表示 - 等高線を表示/非表示 マップ上の陰影起伏図の表示/非表示を切り替えられるボタンです。 - 陰影起伏図を表示 - 陰影起伏図を非表示 - 陰影起伏図の表示/非表示 テキスト読み上げエンジンを起動できません。 プロファイルのエクスポート OsmAndプロファイル:%1$s @@ -3497,9 +3481,6 @@ POIの更新は利用できません ズームレベル 陰影起伏図 勾配 - 地形を表示/非表示 - 地形を非表示 - 地形を表示 マップ上の地形レイヤーの表示/非表示を切り替えるボタンです。 説明を削除 説明を追加 @@ -3508,9 +3489,6 @@ POIの更新は利用できません 円形 四角形 最小 - 公共交通機関を非表示 - 公共交通機関を表示 - 公共交通機関の表示/非表示 マップ内公共交通機関の表示/非表示を切り替えるボタンです。 POIの作成/編集 駐車位置 @@ -3737,9 +3715,6 @@ POIの更新は利用できません 低い橋を避けるために船の高さを調整できます。橋が可動式の場合は、開いた状態の高さが参照されます。 低い橋を避けるために船の高さを設定します。注:橋が可動式の場合は、開いた状態の高さが参照されます。 狭い橋を避けるために船の幅を設定します - Mapillaryの表示切替 - Mapillaryを非表示 - Mapillaryを表示 マップ上のMapillaryレイヤーの表示/非表示を切り替えるトグルボタンです。 ルート検索時に指定した車両の長さを考慮します。 長さ制限 diff --git a/OsmAnd/res/values-ka/strings.xml b/OsmAnd/res/values-ka/strings.xml index 786b5de97c..296d28d3e6 100644 --- a/OsmAnd/res/values-ka/strings.xml +++ b/OsmAnd/res/values-ka/strings.xml @@ -1223,9 +1223,6 @@ ახალი პროფილის ჩაწერა %1$s %2$s-დან დაქანებები - რელიეფის ჩვენება/დამალვა - რელიეფის დამალვა - რელიეფის ჩვენება რელიეფის შრის საჩვენებელი ღილაკი. აღწერის წაშლა აღწერის დამატება @@ -1797,9 +1794,6 @@ შემობრუნება თეთრი %1$d გადმოწერა - ბილიკების ჩვენება - ბილიკების დამალვა - ბილიკების ჩვენება/დამალვა გამოსვლა %1$s-ით ნაჩვენები ბილიკები @@ -1959,10 +1953,6 @@ რუკის გამართვა %1$s-ის დამალვა %1$s-ის ჩვენება - POI-ს ჩვენება/დამალვა - რჩეულების დამალვა - რჩეულების ჩვენება - რჩეულების ჩვენება/დამალვა მოქმედების წაშლა მოქმედების დამატება რჩეულის დამატება @@ -2220,9 +2210,6 @@ მიმართულების ისრები მოტოციკლი Enduro მოტორიანი სკუტერი - Mapillary-ის ჩვენება/დამალვა - Mapillary-ის დამალვა - Mapillary-ის ჩვენება წავშალოთ ყველა\? ეკრანის კონტროლი ნავიგაციის ინსტრუქციები @@ -2287,9 +2274,6 @@ საწყისი წერტილი პროფილის იმპორტი პროფილის ექსპორტი - ბორცვების დამალვა/ჩვენება - ბორცვების დამალვა - ბორცვების ჩვენება %1$s კბ %1$s მბ %1$s გბ @@ -2365,7 +2349,6 @@ როგორ გავხსნათ Wikipedia-ს სტატიები\? მოგესალმებით სატესტო ვერსიაში რუკაზე ისრების ჩვენება - OSM-ჩანაწერების ჩვენება ან დამალვა აკრიფეთ ქალაქის სახელი ან მისამართი %1$s-ის რუკაზე ჩვენება მდებარეობა: @@ -2540,8 +2523,6 @@ გზის დაგეგმვა Wikipedia-ის რუკების გადმოწერა აპის პროფილის შეცვლა - საზოგადოებრივი ტრანსპორტის დამალვა - საზოგადოებრივი ტრანსპორტის ჩვენება OsmAnd + Mapillary %1$s / %2$s მოქმედების შეცდომა %1$s @@ -2561,9 +2542,6 @@ შეტყობნებები რუკის დიალოგის ფანჯარა OsmAnd-ის პროფილი: %1$s - კონტურული ხაზების ჩვენება/დამალვა - კონტურული ხაზების დამალვა - კონტურული ხაზების ჩვენება ყველა რუკის განახლება გამოყენებულია %1$s კბ გამოყენებულია %1$s მბ diff --git a/OsmAnd/res/values-kn/strings.xml b/OsmAnd/res/values-kn/strings.xml index 9ecd3c89bb..96d53b96cc 100644 --- a/OsmAnd/res/values-kn/strings.xml +++ b/OsmAnd/res/values-kn/strings.xml @@ -240,8 +240,6 @@ ಚಿತ್ರಗಳನ್ನು ಸೇರಿಸಿ ಮ್ಯಾಪಿಲರಿ ಏನೂ ಸಿಗಲಿಲ್ಲ :( - ಒಎಸ್ಎಂ ಟಿಪ್ಪಣಿಗಳನ್ನು ತೋರಿಸು - ಒಎಸ್ಎಂ ಟಿಪ್ಪಣಿಗಳನ್ನು ಅಡಗಿಸು ಬಣ್ಣವನ್ನು ಬದಲಿಸು ಹೆಸರನ್ನು ಸಂಪಾದಿಸು ವಿಳಾಸವನ್ನು ಟೈಪಿಸು @@ -320,13 +318,7 @@ ಸುಸಜ್ಜಿತ ರಸ್ತೆಗಳಿಗೆ ಆದ್ಯತೆ ನೀಡಿ. OSM ಪರಿಶಲನೆಗಳು ನಕ್ಷೆಯಲ್ಲಿ ಬಾಹ್ಯರೇಖೆಗಳನ್ನು ತೋರಿಸಲು ಅಥವಾ ಮರೆಮಾಡಲು ಟಾಗಲ್. - ಬಾಹ್ಯರೇಖೆ ರೇಖೆಗಳನ್ನು ತೋರಿಸಿ - ಬಾಹ್ಯರೇಖೆ ರೇಖೆಗಳನ್ನು ಮರೆಮಾಡಿ - ಬಾಹ್ಯರೇಖೆಗಳನ್ನು ತೋರಿಸಿ / ಮರೆಮಾಡಿ ನಕ್ಷೆಯಲ್ಲಿ \'ಹಿಲ್ಶೇಡ್\' ಅನ್ನು ತೋರಿಸಲು ಅಥವಾ ಮರೆಮಾಡಲು ಟಾಗಲ್ ಮಾಡಿ. - ಹಿಲ್ಶೇಡ್ ತೋರಿಸು - ಹಿಲ್ಶೇಡ್ ಅನ್ನು ಮರೆಮಾಡಿ - ಹಿಲ್ಶೇಡ್ ಅನ್ನು ತೋರಿಸಿ / ಮರೆಮಾಡಿ text-to-speech ಎಂಜಿನ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ ಪ್ರೊಫೈಲನ್ನು ಬೇರೆಡೆಗೆ ರಫ್ತುಮಾಡಿ OsmAnd ಪ್ರೊಫೈಲ್:%1$s diff --git a/OsmAnd/res/values-lt/strings.xml b/OsmAnd/res/values-lt/strings.xml index eb1d4b98bc..1a1cc5ffc0 100644 --- a/OsmAnd/res/values-lt/strings.xml +++ b/OsmAnd/res/values-lt/strings.xml @@ -2048,7 +2048,6 @@ Tai yra puikus būdas paremti OsmAnd ir OSM, jei jie jums patinka. Pridėti veiksmą Ištrinti veiksmą Vieta - Rodyti/slėpti LV Pridėti kategoriją Pranešimas Žemėlapio stiliai @@ -2069,9 +2068,6 @@ Tai yra puikus būdas paremti OsmAnd ir OSM, jei jie jums patinka. Padidinti paieškos spindulį Nepavyko nieko rasti Pakeiskite paieškos užklausą arba padidinkite paieškos spindulį. - Rodyti/slėpti OSM Pastabas - Rodyti OSM Pastabas - Slėpti OSM Pastabas Ieškoti parankiniuose Įskiepis Spalvų schema @@ -2141,9 +2137,6 @@ Tai yra puikus būdas paremti OsmAnd ir OSM, jei jie jums patinka. Rodyti parankinių dialogą Rodyti tarpinį dialogo langą " įrašytas į " - Rodyti/slėpti parankinius - Rodyti Parankinius - Slėpti Parankinius Rodyti %1$s Slėpti %1$s Navigacija @@ -2620,10 +2613,7 @@ Tai yra puikus būdas paremti OsmAnd ir OSM, jei jie jums patinka. Dienos metas Kelių tipai Rodyti daugiau - Rodyti/slėpti GPX pėdsakus Paspaudus šį mygtuką žemėlapyje parodomi arba paslepiami GPX pėdsakai - Slėpti GPX pėdsakus - Rodyti GPX pėdsakus Prašome iš pradžių pridėti tikslą Ankstesnis maršrutas Pridėti namus @@ -2730,9 +2720,6 @@ Tai yra puikus būdas paremti OsmAnd ir OSM, jei jie jums patinka. Atkurti Ieškoti gatvės Matuoti atstumą - Rodyti/paslėpti viešąjį transportą - Paslėpti viešąjį transportą - Rodyti viešąjį transportą Pridėti profilį Nepalaikomas tipas Įjungimo/išjungimo mygtukas @@ -2745,7 +2732,6 @@ Tai yra puikus būdas paremti OsmAnd ir OSM, jei jie jums patinka. Išinstaliuoti Naktinis žemėlapis metrai - Rodyti Mapillary Ilgio limitas Guolis %1$s ištrinta diff --git a/OsmAnd/res/values-lv/strings.xml b/OsmAnd/res/values-lv/strings.xml index 7120ce1b02..27ad892e50 100644 --- a/OsmAnd/res/values-lv/strings.xml +++ b/OsmAnd/res/values-lv/strings.xml @@ -2072,10 +2072,6 @@ Apraksta laukumu: %1$s x %2$s Vieta Spiežot darbības pogu, tiks rādīti vai slēpti favorīti. Spiežot darbības pogu, tiks rādīti vai slēpti POI. - Rādīt/nerādīt izlasi - Rādīt favorītus - Nerādīt izlasi - Rādīt/slēpt POI Rādīt %1$s Paslēpt %1$s Pievienot kategoriju @@ -2170,8 +2166,6 @@ Apraksta laukumu: %1$s x %2$s Ieteicamais reljefs: līdzens vai kalnains. Slīpums Berberu - Rādīt OSM piezīmes - Nerādīt OSM piezīmes Nospiežot darbības pogu, tiek rādītas vai slēptas OEM piezīmes uz kartes. Sakārtots pēc distances Meklēt Izlasē @@ -2202,7 +2196,6 @@ Apraksta laukumu: %1$s x %2$s Paplašināt meklēšanas rādiusu Neko neatrada Meklējiet pēc cita vārda vai palieliniet meklēšanas rādiusu. - Rādīt/nerādīt OSM piezīmes Atļaut piekļūšanu privātajām teritorijām. Maršruta gaitā iespējot kartes pagriešanas animāciju no manas atrašanās vietas. Ieslēdz vai izslēdz automātisko tālummaiņu, atkarībā no kustības ātruma. @@ -2670,10 +2663,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl Soli pa solim Iziet pie Soliņš pieturā - Rādīt/Slēpt GPX trekus Nospiežot šo pogu, tiek parādīti vai slēpti izvēlētie GPX treki uz kartes - Paslēpt GPX trekus - Parādīt GPX trekus Vispirms pievienojiet galapunktu Iespējot sabiedrisko transportu OsmAnd Live. OsmAnd Live sabiedriskais transports diff --git a/OsmAnd/res/values-ml/strings.xml b/OsmAnd/res/values-ml/strings.xml index 9b57d104e0..e4d1f3be78 100644 --- a/OsmAnd/res/values-ml/strings.xml +++ b/OsmAnd/res/values-ml/strings.xml @@ -1695,9 +1695,6 @@ "വീണ്ടും തെരയുക " "തെരച്ചില്‍ വൃത്തം വലുതാക്കുക " "ഒന്നും കണ്ടെത്താനായില്ല " - "ഓഎസ് എം കുറിപ്പുകള്‍ (നോട്ട്സ്) കാണിക്കുക/കാണിക്കാതിരിക്കുക " - ഓഎസ് എം കുറിപ്പുകള്‍ (നോട്ട്സ്) കാണിക്കുക - "ഓഎസ് എം കുറിപ്പുകള്‍ (നോട്ട്സ്) കാണിക്കാതിരിക്കുക " ഓഎസ് എം കുറിപ്പുകള്‍ (നോട്ട്സ്) കാണാന്‍/കാണാതിരിക്കാന്‍ ഈ ആക്ഷന്‍ ബട്ടണ്‍ അമത്തുക "ദൂരക്രമത്തിലടുക്കുക " "താല്‍പര്യമുള്ളവയില്‍ തെരയുക " @@ -2343,10 +2340,6 @@ സ്ഥലം "അതിവേഗ പ്രവൃത്തിയുടെ നാമം ഉപയോഗത്തിലുണ്ട്, ഡ്യൂപ്ലിക്കേഷൻ ഒഴിവാക്കുന്നതിന് %1$s എന്നാക്കി മാറ്റി." ദ്രുത പ്രവർത്തനത്തിന്റെ പേര് ഒന്നിലധികം പകര്‍പ്പിലുണ്ട് - പ്രിയപ്പെട്ടവ കാണിക്കുക / മറയ്ക്കുക - പ്രിയപ്പെട്ടവ കാണിക്കുക - പ്രിയങ്കരങ്ങൾ മറയ്ക്കുക - POI കാണിക്കുക / മറയ്ക്കുക %1$s കാണിക്കുക %1$s മറയ്ക്കുക ഒരു വിഭാഗം ചേർക്കുക @@ -2650,10 +2643,7 @@ %1$s-ല്‍ പുറത്തേക്ക് എത്തുക സ്റ്റോപ്പിൽ നിന്ന് കയറുക - GPX ട്രാക്കുകൾ കാണിക്കുക / മറയ്ക്കുക "ഈ ബട്ടണ്‍ തെരഞ്ഞെടുത്ത GPX ട്രാക്കുകൾ മാപ്പില്‍ കാണിക്കാന്‍ /മറയ്ക്കാന്‍ ഉപയോഗിക്കാം" - GPX ട്രാക്കുകൾ മറയ്ക്കുക - GPX ട്രാക്കുകൾ കാണിക്കുക ആദ്യം ലക്ഷ്യസ്ഥാനം ചേർക്കുക "OsmAnd ലൈവ് മാറ്റങ്ങൾക്കായി പൊതു ഗതാഗത സംവിധാനത്തെ പ്രാപ്തമാക്കുക." "ഓഎസ്എംആന്റ് ലൈവ് പൊതു ഗതാഗതം" diff --git a/OsmAnd/res/values-nb/strings.xml b/OsmAnd/res/values-nb/strings.xml index 5d0a58d52d..5324099e36 100644 --- a/OsmAnd/res/values-nb/strings.xml +++ b/OsmAnd/res/values-nb/strings.xml @@ -1969,12 +1969,8 @@ Navigering Kartinnstilling Legg til en kategori - Skjul favoritter - Vis/skjul interessepunkt Vis %1$s Skjul %1$s - Vis favoritter - Vis/skjul favoritter Sted Legg til favoritt Tale på/av @@ -2132,9 +2128,6 @@ Filtrer bilder etter innsender, dato eller type. Kun aktivt på nærgående forstørrelsesnivå. Installer Mapillary for å legge til bilder i denne kartposisjonen. Foto på gatenivå for alle. Oppdag plasser, samarbeid, fang inn verden. - Vis/skjul OSM-notater - Vis OSM-notater - Skjul OSM-notater Knapp til å vise eller skjule OSM-notater på kartet. Takk for at du kjøpte \'Havdybdekonturer\' Havdybdekonturer @@ -2852,10 +2845,7 @@ Veityper Gå av på Sitt på stoppet - Vis/skjul spor Knapp for å vise eller skjule valgte spor på kartet. - Skjul spor - Vis spor Skru på offentlig transport i OsmAnd Live-endringer. Offentlig transport i OsmAnd Live %1$d overføringer @@ -3162,13 +3152,7 @@ Er du sikker på at du vil oppdatere alle (%1$d) kart\? Foretrekk veier uten fast dekke Foretrekk veier uten fast dekke framfor med fast dekke for ruting. - Vis koter - Skjul koter - Vis/skjul koter En knapp for å vise eller skjule relieffskygger på kartet. - Vis relieffskygge - Skjul relieffskygge - Vis/skjul relieffskygge Kan ikke starte tekst-til-tale-motor. Simuler posisjonen din ved bruk av et innspilt GPX-spor. OsmAnd-profil: %1$s @@ -3393,9 +3377,6 @@ Åpne innstillinger Terreng %1$s av %2$s - Vis eller skjul terreng - Skjul terreng - Vis terreng Slett beskrivelse Legg til beskrivelse Velg gruppe @@ -3451,11 +3432,8 @@ Mål avstand Reising (Wikivoyage og Wikipedia) Navigasjonsprofiler - Skjul offentlig transport - Vis offentlig transport Tilbake til redigering Opprett eller rediger interessepunkt - Vis eller skjul offentlig transport Legg til profil Knapp for vising eller skjuling av offentlig transport på kartet. Direkte-til-punkt @@ -3582,9 +3560,6 @@ Du kan sette fartøyhøyde for å unngå lave broer. Hvis broen endrer høyde, brukes høyden i åpen tilstand. Slett nærmeste målpunkt Navngi punktet - Vis/skjul Mapillary - Skjul Mapillary - Vis Mapillary Peiling %1$s slettet Lydstyrkeknapper til forstørring diff --git a/OsmAnd/res/values-nl/strings.xml b/OsmAnd/res/values-nl/strings.xml index 5209bca499..2aed93b35e 100644 --- a/OsmAnd/res/values-nl/strings.xml +++ b/OsmAnd/res/values-nl/strings.xml @@ -2118,10 +2118,6 @@ Sneltoets-duplicaat Een schakelknop om Favorieten al dan niet te tonen op de kaart. Een schakelknop om POI’s al dan niet op de kaart te tonen. - Favorieten tonen /verbergen - Favorieten tonen - Favorieten verbergen - POI’s tonen/verbergen %1$s tonen %1$s verbergen Categorie toevoegen @@ -2327,9 +2323,6 @@ \n Naam bevat erg veel hoofdletters, toch doorgaan? Zoek in Favorieten - OSM-opmerkingen tonen of verbergen - OSM-opmerkingen tonen - OSM-opmerkingen verbergen Knop om OSM-opmerkingen al dan niet te tonen. Gesorteerd op afstand Uw bestemming ligt in een gebied dat particulier eigendom is. Wilt u gebruik van particuliere wegen voor deze route toestaan\? @@ -2859,10 +2852,7 @@ Wissel Toon meer Getoonde tracks - GPX-tracks tonen/verbergen Een knop om geselecteerde GPX-tracks al dan niet te tonen op de kaart. - GPX-tracks verbergen - GPX-tracks tonen Voeg a.u.b. eerst de Bestemming in Vorige route Thuisadres toevoegen @@ -3129,13 +3119,7 @@ Naast elkaar Kaarten Knop om hoogtelijnen al dan niet te tonen op de kaart. - Hoogtelijnen tonen - Hoogtelijnen verbergen - Hoogtelijnen tonen/verbergen Knop om de reliëfschaduw al dan niet te tonen op de kaart. - Reliëfschaduw tonen - Reliëfschaduw verbergen - Reliëfschaduw tonen/verbergen Track opgeslagen Toon knooppunt van de fietsroutes Hoogtelijnen en reliëfschaduw @@ -3408,9 +3392,6 @@ Kan profiel niet back-uppen. %1$s van %2$s Hellingen - Terrein tonen / verbergen - Terrein verbergen - Terrein tonen Een knop om de terreinlaag al dan niet te tonen op de kaart. Beschrijving verwijderen Beschrijving toevoegen @@ -3445,9 +3426,6 @@ Het toepassen van deze wijzigingen wist de cache van deze rasterkaartbron Stel de hoogte van het vaartuig in Stel de hoogte van het vaartuig in om lage bruggen te vermijden. Let op, als de brug beweegbaar is, gebruiken we de hoogte in geopende toestand. - Mapillary tonen/verbergen - Mapillary verbergen - Mapillary tonen Een schakelknop om de Mapillary-laag al dan niet te tonen op de kaart. Geef de toegestane voertuiglengte op voor routes. Maximale lengte @@ -3561,9 +3539,6 @@ Aangepaste kleur %1$s / %2$s POI-types zoeken - OV-informatie verbergen - OV-informatie tonen - OV-informatie tonen/verbergen Knop om OV-informatie al dan niet te tonen op de kaart. Favoriet toevoegen / bewerken POI toevoegen / bewerken diff --git a/OsmAnd/res/values-oc/strings.xml b/OsmAnd/res/values-oc/strings.xml index 28149e979a..7e0d9fa6ed 100644 --- a/OsmAnd/res/values-oc/strings.xml +++ b/OsmAnd/res/values-oc/strings.xml @@ -136,10 +136,7 @@ De l\'envèrs Mostrar mai Traças vesedoiras - Mòstrar/ Amagar la traça GPS De quichar sus lo boton mòstra ò amaga la traça GPS sus la mapa - Amagar la traça GPS - Mostrar la traça GPS Començatz per indicar una destinacion Itinerari precedent Ajustar lo domicile @@ -482,13 +479,7 @@ Preferissi lei rotas sensa quitran. Edicions d\'OSM Un commutador per mostrar o amagar lei corbas de nivèu sus la mapa. - Mostrar lei corbas de nivèu - Amagar lei corbas de nivèu - Mòstra/Amaga lei corbas de nivèu Un commutador per mostrar o amagar l\'ombrejat de relèu de la mapa. - Mostrar l’ombrejat de relèu - Amagar l’ombrejat de relèu - Mòstra/Amaga l’ombrejat de relèu Exportar lo perfiu Perfiu d\'OsmAnd: %1$s Lo perfiu \'%1$s\' existís ja. Lo volètz subrescriure\? diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index 384f3f73a1..63c8be8d06 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -2134,10 +2134,6 @@ Kopia nazwy szybkiej czynności Przełącznik wyświetlania lub ukrywania ulubionych miejsc na mapie. Przełącznik wyświetlania lub ukrywania użytecznych miejsc na mapie. - Przełącz widoczność ulubionych - Pokaż Ulubione - Ukryj Ulubione - Przełącz widoczność użytecznych miejsc Tworzenie elementów Ta wiadomość uzupełni się w polu komentarza. Wiadomość @@ -2282,9 +2278,6 @@ Zainstaluj wtyczkę \'Poziomice\', aby pokazać stopniowane obszary pionowe. Pobierz mapę \"Cieniowanie Rzeźby Terenu\", by wyświetlić cieniowanie pionowe. Kup i zainstaluj wtyczkę \'Poziomice\', aby pokazać stopniowane obszary pionowe. - Pokaż lub ukryj uwagi OSM - Pokaż uwagi OSM - Ukryj uwagi OSM Przybliżony zasięg i jakość mapy: \n • Europa Zachodnia: **** \n • Europa Wschodnia: *** @@ -2845,10 +2838,7 @@ Wymień Wyświetl więcej Wyświetlane ślady - Pokaż/Ukryj ślady Przycisk do pokazywania lub ukrywania wybranych śladów na mapie. - Ukryj ślady - Pokaż ślady Proszę najpierw ustalić cel Poprzednia trasa Dowiedz się więcej na naszym blogu, jak OsmAnd wyznacza trasy. @@ -3264,12 +3254,6 @@ Preferuje drogi nieutwardzone. Zmiany OSM Przełącza wyświetlenie poziomic na mapie. - Wyświetl poziomice - Ukryj poziomice - Przełącz widoczność poziomic - Wyświetl cieniowanie terenu - Ukryj cieniowanie terenu - Przełącz widoczność cieniowania terenu Przycisk do pokazywania lub ukrywania cieniowania terenu na mapie. Nie można uruchomić mechanizmu zamiany tekstu na mowę. Wspólne @@ -3484,9 +3468,6 @@ Dodaj opis Usuń opis Przycisk do wyświetlania lub ukrywania warstwy terenu na mapie. - Pokaż teren - Ukryj teren - Pokaż lub ukryj teren Nachylenie Włącz, aby wyświetlić cieniowanie wzniesień lub stoków. Możesz przeczytać więcej o tego rodzaju mapach na naszej stronie. Legenda @@ -3611,9 +3592,6 @@ \n \n Powrót do edycji - Ukryj transport publiczny - Pokaż transport publiczny - Pokaż lub ukryj transport publiczny Utwórz lub edytuj użyteczne miejsce Dodaj lub edytuj ulubione miejsce Przycisk akcji przełącza między wybranymi profilami. @@ -3665,9 +3643,6 @@ Ustaw wysokość statku, by unikać niskich mostów. Uwaga: dla mostów zwodzonych liczymy wysokość podniesionego mostu. Ustaw wysokość statku Ustaw szerokość statku, by unikać wąskich mostów - Pokaż/ukryj Mapillary - Ukryj Mapillary - Pokaż Mapillary Wprowadź szerokość pojazdu, niektóre restrykcje dróg mogą dotyczyć szerokich pojazdów. Wprowadź wysokość pojazdu, niektóre restrykcje dróg mogą dotyczyć wysokich pojazdów. Wprowadź wagę pojazdu, niektóre restrykcje dróg mogą dotyczyć ciężkich pojazdów. diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index 7a21af4cd6..c142233a7a 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -2049,9 +2049,6 @@ Aumentar o raio de busca Nada encontrado Modifique o texto da pesquisa ou aumente o raio de busca. - Mostrar ou ocultar notas do OSM - Mostrar Anotações do OSM - Ocultar notas OSM Botão para mostrar ou ocultar notas do OSM no mapa. Classificado por distância Pesquisar Favoritos @@ -2457,10 +2454,6 @@ Nome de ação rápida duplicado Uma alternância para mostrar ou ocultar os pontos Favoritos no mapa. Alternar para mostrar ou ocultar POIs no mapa. - Mostrar/ocultar favoritos - Mostrar Favoritos - Ocultar favoritos - Mostrar/ocultar POI Mostrar %1$s Ocultar %1$s Adicionar uma categoria @@ -2841,10 +2834,7 @@ Tipos de estrada Desembarque em Embarque na parada - Mostrar/ocultar trilhas Um botão para mostrar ou ocultar as trilhas selecionadas no mapa. - Ocultar trilhas - Mostrar trilhas Habilitar o transporte público para alterações do OsmAnd Live. Transporte público OsmAnd Live Não pavimentado @@ -3257,13 +3247,7 @@ Prefira não pavimentada sobre estradas pavimentadas para o roteamento. Edições OSM Botão que mostra ou oculta linhas de contorno no mapa. - Mostrar curvas de nível - Ocultar linhas de contorno - Mostrar/ocultar linhas de contorno Um botão para mostrar ou ocultar sombras de relevo. - Mostrar sombras de relevo - Ocultar sombras de relevo - Mostrar/ocultar sombras de relevo Não é possível iniciar o mecanismo de conversão de texto em fala. Simule sua posição usando um rasteador GPX gravada. Exportar perfil @@ -3489,9 +3473,6 @@ Sombras de relevo %1$s de %2$s Encostas - Mostrar ou ocultar terreno - Ocultar terreno - Mostrar terreno Um botão para mostrar ou ocultar a camada do terreno no mapa. Excluir descrição Adicionar descrição @@ -3604,9 +3585,6 @@ \n \n Você pode acessar essas ações tocando no botão “%1$s”. - Ocultar transporte público - Mostrar transporte público - Mostrar ou ocultar transporte público Botão que mostra ou oculta o transporte público no mapa. Criar ou editar POI Posições de estacionamento @@ -3675,9 +3653,6 @@ Você pode definir a altura da embarcação para evitar pontes baixas. Lembre-se, se a ponte for móvel, usaremos sua altura no estado aberto. Defina a altura da embarcação para evitar pontes baixas. Lembre-se, se a ponte for móvel, usaremos sua altura no estado aberto. Defina a largura da embarcação para evitar pontes estreitas - Mostrar/ocultar Mapillary - Ocultar Mapillary - Mostrar Mapillary Uma alternância para mostrar ou ocultar a camada Mapillary no mapa. Desinstalar radares de velocidade Legal diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml index b5ddfb1f86..ea9a5d328b 100644 --- a/OsmAnd/res/values-pt/strings.xml +++ b/OsmAnd/res/values-pt/strings.xml @@ -1911,9 +1911,6 @@ Aumentar raio de pesquisa Nada encontrado Altere a pesquisa ou aumente o raio dela. - Mostrar ou ocultar anotações do OSM - Mostrar anotações OSM - Ocultar anotações do OSM Botão para mostrar ou ocultar anotações OSM no mapa. Ordenar por distância Pesquisar em Favoritos @@ -2725,10 +2722,6 @@ Nome de ação rápida duplicado Uma alternância para mostrar ou ocultar os pontos favoritos no mapa. Uma alternância para mostrar ou ocultar PIs no mapa. - Mostrar/esconder favoritos - Mostrar Favoritos - Esconder favoritos - Mostrar/esconder POI Mostrar %1$s Esconder %1$s Adicionar uma categoria @@ -2894,9 +2887,7 @@ Trocar Mostrar mais Trilhos mostrados - Mostrar/ocultar trilhos Um botão para mostrar ou ocultar trilhos selecionados no mapa. - Ocultar trilhos Sem elétricos Evita elétricos Sem autocarros @@ -2913,7 +2904,6 @@ Paralelos Seixos Caminho para cavaleiros - Mostrar trilhos Por favor defina primeiro o destino Rota anterior Adicionar casa @@ -3284,13 +3274,7 @@ Aspeto do perfil Edições OSM Botão que mostra ou oculta curvas de nível no mapa. - Mostrar curvas de nível - Ocultar curvas de nível - Mostrar/ocultar curvas de nível Um botão para mostrar ou ocultar sombras de relevo. - Mostrar sombras de relevo - Ocultar sombras de relevo - Mostrar/ocultar sombras de relevo Não é possível iniciar o mecanismo de conversão de texto em fala. Simule a sua posição usando um caminho GPX gravado. Exportar o perfil @@ -3345,9 +3329,6 @@ Sombras de relevo %1$s de %2$s Pistas - Mostrar ou ocultar terrenos - Ocultar terreno - Mostrar terreno Um botão para mostrar ou esconder a camada do terreno no mapa. Apagar descrição Adicionar descrição @@ -3591,9 +3572,6 @@ Lombardo Cor customizada Combinar categorias de POI de categorias diferentes. Toque em trocar para selecionar tudo, toque no lado esquerdo para seleção da categoria. - Ocultar o transporte público - Mostrar transporte público - Mostrar ou ocultar transportes públicos Botão que mostra ou oculta o transporte público no mapa. Criar ou editar um POI Posições de estacionamento @@ -3658,7 +3636,6 @@ Go-cart Os alertas de radares de velocidade em alguns países são proibidos por lei. Manter ativo - Ocultar Mapillary Forneça um nome para o ponto A aplicação dessas alterações limpará os dados em cache dessa origem de bloco Este aparelho não possui câmeras de velocidade. @@ -3681,7 +3658,6 @@ %1$s apagado Uma alternância para mostrar ou ocultar a camada Mapillary no mapa. Definir altura da embarcação - Mostrar Mapillary Motocicleta enduro Patins em linha Desativado. Requer \'manter o ecrã ligadp\' em \'tempo limite após a ativação\'. @@ -3712,7 +3688,6 @@ Pode definir a altura da embarcação para evitar pontes baixas. Lembre-se, se a ponte for móvel, usaremos sua altura no estado aberto. Cadeira de rodas para a frente Controlar o nível de ampliação do mapa pelos botões de volume do aparelho. - Mostrar/ocultar Mapillary Desinstalar radares de velocidade Anotaçaõ OSM fechada Desinstalar e reiniciar @@ -3957,4 +3932,25 @@ Editar trilho Renomear trilho Mudar pasta + Sombras de relevo / Pistas / Curvas de nível + OpenPlaceReviews é um projeto comunitário sobre lugares públicos como restaurantes, hotéis, museus, pontos de passagem. Recolhe toda a informação pública sobre eles, como fotos, resenhas, ligações para outros sistemas OpenStreetMap, Wikipedia. +\n +\nTodos os dados OpenPlaceReview estão abertos e disponíveis para todos: http://openplacereviews.org/data. +\n +\nPode ler mais em: http://openplacereviews.org + OpenPlaceReviews + Usar test.openplacereviews.org + Fazer login no OpenPlaceReviews + Água + Inverno + Moto de neve + Equitação + Corrida + Mountainbike + Ciclismo + A correr + Caminhando + Fora da estrada + Motocicleta + Carro \ No newline at end of file diff --git a/OsmAnd/res/values-ro/strings.xml b/OsmAnd/res/values-ro/strings.xml index 22bec3c3c9..c6f961eb7c 100644 --- a/OsmAnd/res/values-ro/strings.xml +++ b/OsmAnd/res/values-ro/strings.xml @@ -1803,9 +1803,6 @@ Măriți aria de căutare Nimic găsit Modifică criteriile de căutare sau mărește aria de căutare. - Comutare note OSM - Arată notele OSM - Ascunde notele OSM Atingând acest buton de acțiune, se afișează sau se ascund notele OSM de pe hartă. Sortat după distanță Caută Favorite @@ -2204,9 +2201,6 @@ Schimbați Afișați mai multe Trasee afișate - Afișați/Ascundeți traseele GPX - Ascundeți traseele GPX - Afișați traseele GPX Selectați destinația mai întâi Ruta anterioară Adăugați acasă @@ -2381,13 +2375,7 @@ Prefer drumurile nepavate. Editare OSM Comută pentru a afișa sau ascunde liniile de contur pe hartă. - Afişează conturul liniilor - Ascunde conturul liniilor - Afişează-ascunde conturul liniilor Comută pentru a arăta sau ascunde umbrele de pe hartă. - Arata si umbrele - Ascunde afisarea umbrelor - Afişează/ascunde umbrele Motorul text-to-speech nu porneste. Exportă profilul Profil osmand exportat %1$s @@ -2825,9 +2813,6 @@ tone metrii Adăugare surse online - Afișare/ascundere Mapillary - Ascundere Mapillary - Afișare Mapillary O comutare pentru a afișa sau ascunde stratul Mapillary pe hartă. Specificați lungimea vehiculului care trebuie permisă pe rute. Limită lungime diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml index f9cf872da1..fe3993e225 100644 --- a/OsmAnd/res/values-ru/phrases.xml +++ b/OsmAnd/res/values-ru/phrases.xml @@ -3885,4 +3885,5 @@ Патрулируется: да Название трассы Лыжный трамплин + По лесу: да \ No newline at end of file diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index b77fe2b33d..0bfdc0b4b1 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -40,9 +40,6 @@ Увеличить радиус поиска Ничего не найдено Изменить запрос или увеличить радиус поиска. - Показать/скрыть OSM-заметки - Показать OSM-заметки - Скрыть OSM-заметки Переключатель отображения OSM-заметок на карте. Отсортировано по расстоянию Поиск в избранных @@ -147,7 +144,6 @@ Обнаружен дубликат имени Переключатель, чтобы показать или скрыть избранные точки на карте. Переключатель, чтобы показать или скрыть POI на карте. - Показать/скрыть избранные Категория Действия Если оставить это поле пустым, то оно будет автоматически заполнено адресом или названием места. @@ -2258,9 +2254,6 @@ Добавить Удалить действие Вы уверены, что хотите удалить действие «%s»\? - Показать избранные - Скрыть избранные - Показать/скрыть POI Показать %1$s Скрыть %1$s Настройки карты @@ -2868,9 +2861,6 @@ Поменять Показать больше Отображаемые треки - Показать/скрыть треки - Скрыть треки - Показать треки Время суток По шагам Типы дорог @@ -3228,13 +3218,7 @@ Вы можете применить это ко всем или только к выбранному профилю. Общий Переключатель, показывающая или скрывающая контурные линии на карте. - Показать контурные линии - Скрыть контурные линии - Показать/скрыть контурные линии Переключатель, чтобы показать или скрыть затенение рельефа на карте. - Показать затенение рельефа - Скрыть затенение рельефа - Показать/скрыть затенение рельефа Экспорт профиля Профиль OsmAnd: %1$s «%1$s» уже существует. Перезаписать\? @@ -3482,10 +3466,7 @@ Пересчитывать маршрут в случае отклонения %1$s из %2$s Настройка минимального и максимального уровней масштабирования, при которых слой будет отображаться. - Показать или скрыть рельеф Переключатель, чтобы показать или скрыть слой рельефа местности на карте. - Показать рельеф - Скрыть рельеф Рельеф Лыжный туризм Снегоход @@ -3609,9 +3590,6 @@ \n \n Функции, доступные при нажатии кнопки «%1$s». - Скрыть общественный транспорт - Показать общественный транспорт - Показать/скрыть общественный транспорт Добавить или изменить избранное Создать или изменить POI Возврат к редактированию @@ -3680,9 +3658,6 @@ Вы можете указать высоту судна, чтобы избегать низких мостов. Имейте в виду, что если мост раздвижной, будет использована его высота в открытом состоянии. Укажите высоту судна, чтобы избежать низких мостов. Имейте в виду, что если мост раздвижной, будет использована его высота в открытом состоянии. Укажите ширину судна, чтобы избежать узких мостов - Показать/скрыть Mapillary - Скрыть Mapillary - Показать Mapillary Переключатель, чтобы показать или скрыть слой Mapillary на карте. Законодательство В некоторых странах и регионах использование предупреждений о камерах контроля скорости запрещено законом. @@ -4015,4 +3990,13 @@ Вода Зима Верховая езда + Инвертировать все точки + Разрешить ручьи и стоки + Разрешить ручьи и стоки + OpenPlaceReviews - это управляемый сообществом проект об общественных местах, таких как рестораны, отели, музеи, путевые точки. Он собирает всю общедоступную информацию о них, такую как фотографии, обзоры, ссылки на другие системы, ссылки OpenStreetMap, Wikipedia. +\n +\nВсе данные OpenPlaceReview открыты и доступны всем: http://openplacereviews.org/data. +\n +\nВы можете узнать больше на: http://openplacereviews.org + Гонки \ No newline at end of file diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml index 0f5d4c3fdb..d00dbd0aab 100644 --- a/OsmAnd/res/values-sc/strings.xml +++ b/OsmAnd/res/values-sc/strings.xml @@ -2119,10 +2119,6 @@ Ammustra una ventana intermèdia Unu butone pro ammustrare o cuare sos puntos preferidos in sa mapa. Unu butone pro ammustrare o cuare sos PDI in sa mapa. - Ammustra/cua sos preferidos - Ammustra sos preferidos - Cua sos preferidos - Ammustra/cua sos PDI Ammustra %1$s Cua %1$s Annanghe una categoria @@ -2389,9 +2385,6 @@ Còmpora e installa s\'estensione \'Curvas de Livellu\' pro ammustrare sas àreas verticales graduadas. Chirca in sos preferidos Ordinados pro distàntzia - Ammustra/cua sas notas OSM - Ammustra sas notas OSM - Cua sas notas OSM Unu butone pro ammustrare o cuare sas Notas OSM in sa mapa. Torra a incumintzare sa chirca Ismànnia su raju de chirca @@ -2844,10 +2837,7 @@ Castas de àndalas Essi in Àrtzia in sa firmada - Ammustra/cua sas rastas Unu butone pro ammustrare o cuare sas rastas ischertadas in sa mapa. - Istichi sas rastas - Ammustra sas rastas Abìlita su trasportu pùblicu pro sas modìficas de OsmAnd Live. Trasportu pùblicu in OsmAnd Live %1$d tramudòngios @@ -3262,13 +3252,7 @@ Preferi caminos no apamentados a sos caminos pamentados pro s\'àndala. Modìficas de OSM Butone chi ammustrat o cuat sas curvas de livellu in sa mapa. - Ammustra sas curvas de livellu - Cua sas curvas de livellu - Ammustra/cua sas curvas de livellu Unu butone pro ammustrare o cuare sas umbraduras de sos rilievos in sa mapa. - Ammustra sas umbraduras de sos rilievos - Cua sas umbraduras de sos rilievos - Ammustra/cua sas umbraduras de sos rilievos Allughidura de su motore de sìntesi vocale fallida. Sìmula sa positzione tua impreende una rasta GPX registrada. Esporta su profilu @@ -3494,9 +3478,6 @@ Umbraduras de sos rilievos %1$s de %2$s Pistas - Ammustra o cua su terrinu - Cua su terrinu - Ammustra su terrinu Unu butone pro ammustrare o cuare s\'istratu de su terrinu in sa mapa. Iscantzella sa descritzione Annanghe una descritzione @@ -3610,9 +3591,6 @@ \n Sighi Podes atzèdere a custas atziones incarchende su butone \"%1$s\". - Cua sos trasportos pùblicos - Ammustra sos trasportos pùblicos - Ammustra o cua sos trasportos pùblicos Butone pro ammustrare o cuare sos trasportos pùblicos in sa mapa. Crea o modìfica unu PDI Logos de parchègiu @@ -3680,9 +3658,6 @@ Podes impostare s\'artària de sa barca pro evitare sos pontes bassos. Ammenta·ti chi, si su ponte est mòbile, amus a impreare s\'artària sua de cando est abertu. Imposta s\'artària de sa barca pro evitare sos pontes bassos. Ammenta·ti chi, si su ponte est mòbile, amus a impreare s\'artària sua de cando est abertu. Imposta sa largària de sa barca pro evitare pontes astrintos - Ammustra/cua Mapillary - Cua Mapillary - Ammustra Mapillary Unu butone pro ammustrare o cuare s\'istratu de Mapillary in sa mapa. Disinstalla sos autovelox Legale diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml index 2fd8af51aa..5b2e98d67b 100644 --- a/OsmAnd/res/values-sk/strings.xml +++ b/OsmAnd/res/values-sk/strings.xml @@ -2124,10 +2124,6 @@ Duplicitný názov rýchlej akcie Prepínač pre zobrazenie alebo skrytie Obľúbených bodov na mape. Prepínač pre zobrazenie alebo skrytie bodov záujmu na mape. - Zobraziť/skryť Obľúbené body - Zobraziť Obľúbené body - Skryť Obľúbené body - Zobraziť/skryť body záujmu Zobraziť %1$s Skryť %1$s Pridať kategóriu @@ -2387,9 +2383,6 @@ Stiahnite mapu \"Vrstevnice\" pre tento región. Zoradené podľa vzdialenosti Hľadať v Obľúbených bodoch - Zobraziť alebo skryť OSM poznámky - Zobraziť OSM poznámky - Skryť OSM poznámky Tlačidlo pre zobrazenie alebo skrytie OSM poznámok na mape. Váš cieľ je v oblasti so súkromným prístupom. Povoliť vstup na súkromné cesty pre tento výlet\? Znovu začať hľadanie @@ -2844,10 +2837,7 @@ Druhy ciest Vystúpte na Nastúpte na zastávke - Zobraziť/skryť stopy Tlačidlo pre zobrazenie alebo skrytie zvolených stôp na mape. - Skryť stopy - Zobraziť stopy %1$d prestup(y) Pridať východzí a cieľový bod Pridať východzí bod @@ -3272,13 +3262,7 @@ Vymazať %1$s\? Úpravy OSM Tlačidlo pre zobrazenie alebo skrytie vrstevníc na mape. - Zobraziť vrstevnice - Skryť vrstevnice - Zobraziť/skryť vrstevnice Tlačidlo pre zobrazenie alebo skrytie tieňovaných svahov na mape. - Zobraziť tieňované svahy - Skryť tieňované svahy - Zobraziť/skryť tieňované svahy Nepodarilo sa spustiť modul prevodu textu na reč. Simulovať polohu pomocou zaznamenanej stopy GPX. Importovať profil @@ -3492,9 +3476,6 @@ Trasa bude prepočítaná ak vzdialenosť od trasy k aktuálnej polohe je väčšia ako zvolená hodnota. %1$s z %2$s Sklony svahov - Zobraziť alebo skryť terén - Skryť terén - Zobraziť terén Tlačidlo pre zobrazenie alebo skrytie vrstvy terénu na mape. Vymazať popis Pridať popis @@ -3606,9 +3587,6 @@ \n • Opravy chýb pre jazyky písané sprava doľava \n \n - Skryť verejnú dopravu - Zobraziť verejnú dopravu - Zobraziť alebo skryť verejnú dopravu Tlačidlo na zobrazenie alebo skrytie verejnej dopravy na mape. Vytvoriť alebo upraviť bod záujmu Parkovacie miesta @@ -3689,9 +3667,6 @@ \nZvoľte %2$s a všetky údaje o rýchlostných radaroch budú odstránené, až kým nebude OsmAnd znovu preinštalovaný. Ponechať aktívne V niektorých krajinách je varovanie pred rýchlostnými radarmi zakázané zákonom. - Zobraziť/skryť Mapillary - Skryť Mapillary - Zobraziť Mapillary Prepínač pre zobrazenie alebo skrytie vrstvy Mapillary na mape. Smerovanie %1$s vymazané diff --git a/OsmAnd/res/values-sl/strings.xml b/OsmAnd/res/values-sl/strings.xml index e78029cd1b..94ff5eb396 100644 --- a/OsmAnd/res/values-sl/strings.xml +++ b/OsmAnd/res/values-sl/strings.xml @@ -2095,10 +2095,6 @@ Ali ste prepričani, da želite izbrisati dejanje »%s«? Ime dejanja Mesto - Pokaži/Skrij priljubljene - Pokaži priljubljene - Skrij priljubljene - Pokaži/Skrij točke POI Pokaži %1$s Skrij %1$s Dodaj kategorijo @@ -2258,9 +2254,6 @@ Povečaj območje iskanja Ni zadetkov Poskusite zamenjati iskalni niz ali pa povečajte obseg iskanja. - Preklopi vidnost opomb OSM - Pokaži Opombe OSM - Skrij Opombe OSM Razvrščeno po razdalji Iskanje med priljubljenimi Vstavek @@ -2874,9 +2867,6 @@ Zamenjaj Pokaži več Prikazane sledi - Pokaži/Skrij sledi GPX - Skrij sledi GPX - Pokaži sledi GPX Najprej je treba dodati cilj Predhodna pot Dodaj domači naslov @@ -3238,10 +3228,7 @@ Trenutna ciljna točka na poti bo izbrisana. Če je ta vaš cilj, bo navigacija zaustavljena. Podrobnosti o zanimivih točkah so na voljo na Wikipediji. Lahko je vaš žepni vodič, ki deluje tudi brez povezave – omogočiti je treba le vstavek Wikipedije in podrobno spoznati svet okoli vas. Omogoči za nadzor približevanja zemljevida z gumbi za glasnost. - Skrij Mapillary - Prikaži mapillary Dodaj spletni vir - Prikaži/skrij Mapillary Odstrani in ponovno zaženi Uporabi gumbe za glasnost za približevanje Prejmi zemljevide Wikipedije diff --git a/OsmAnd/res/values-sr/strings.xml b/OsmAnd/res/values-sr/strings.xml index a548052f4a..16020da81d 100644 --- a/OsmAnd/res/values-sr/strings.xml +++ b/OsmAnd/res/values-sr/strings.xml @@ -1245,9 +1245,6 @@ Повећај област претраге Нема ничег пронађеног Промените претрагу или повећајте област претраге. - Приказује или сакрива OSM белешке - Прикажи белешке ОСМ-а - Сакриј белешке ОСМ-а Дугме да прикажите или да сакријете OSM белешке на карти. Разврстано по удаљености Тражи у Омиљеним @@ -2218,10 +2215,6 @@ Прикажи дијалог за Омиљене " сачувано у " Место - Прикажи/сакриј Омиљене - Прикажи Омиљене - Сакриј Омиљене - Прикажи/сакриј тачке од интереса Прикажи %1$s Сакриј %1$s Додај категорију @@ -2901,10 +2894,7 @@ Прикажи још Приказане путање Укрцавање на стајању - Прикажи/сакриј путање Дугме које приказује или сакрива одабране путање са карте. - Сакриј путање - Прикажи путање Омогући јавни превоз на OsmAnd Live изменама. OsmAnd Live јавни превоз Калдрма @@ -3262,13 +3252,7 @@ Преферира неасфалтиране путеве испред асфалтрираних за рутирање. ОСМ измене Дугме које приказује или сакрива линије изохипси на карти. - Прикажи изохипсе - Сакриј изохипсе - Прикажи/сакриј изохипсе Дугме које приказује или сакрива рељеф на карти. - Прикажи рељеф - Сакриј рељеф - Прикажи/сакриј рељеф Не могу да покренем мотор за синтетизовање гласа. Симулирајте Вашу позицију користећу снимљену GPX стазу. Извези профил @@ -3467,9 +3451,6 @@ Поврати све поставке профила\? Чувам нови профил Не могу да направим резервну копију профила. - Прикажи или сакриј терен - Сакриј терен - Прикажи терен Дугме да прикаже или сакрите слој терена на карти. Обриши опис Додај опис @@ -3508,9 +3489,6 @@ OsmAnd куповине Упутство за легенду карте. Профили навођења - Сакриј јавни превоз - Прикажи јавни превоз - Прикажи или сакриј јавни превоз Дугме које приказује или скрива јавни превоз на карти. Паркинг позиције Поврати подразумевани поредак ставки @@ -3587,9 +3565,6 @@ Држи активним Избриши Упозорења за радаре су законом забрањене у неким државама. - Прикажи/сакриј Mapillary - Сакриј Mapillary - Прикажи Mapillary Јоруба Варајски Таџички diff --git a/OsmAnd/res/values-sv/strings.xml b/OsmAnd/res/values-sv/strings.xml index bb3003ee19..f9305301d2 100644 --- a/OsmAnd/res/values-sv/strings.xml +++ b/OsmAnd/res/values-sv/strings.xml @@ -2025,10 +2025,6 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s Lägg till favorit " har sparats i " Plats - Visa/Dölj favoriter - Visa favoriter - Dölj favoriter - Visa/Dölj POI Visa %1$s Dölj %1$s Lägg till en kategori @@ -2125,9 +2121,6 @@ Vänligen tillhandahåll fullständig kod Välj stad Välj postnummer Autozoomning på/av - Visa/Dölj OSM-anteckningar - Visa OSM-anteckningar - Dölj OSM-anteckningar Ett tryck på denna åtgärdsknapp visar eller döljer OSM-anteckningar på kartan. Starta om sökningen Utöka sökradien diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 2d2101489a..631aacada7 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -1981,9 +1981,6 @@ Düşük Su İşlem Adı - OSM notlarını göster ya da gizle - OSM notlarını göster - OSM notlarını gizle OSM notlarını haritada göstermek veya gizlemek için bir düğme. Mesafeye göre sıralandı Düğmeye uzunca basıp sürüklemek, ekrandaki konumunu değiştirir. @@ -2443,9 +2440,6 @@ Yol türleri Takas Daha fazla görüntüle - Yolları göster/gizle - Yolları Gizle - Yolları Göster Ev ekle Iş ekle İş @@ -2964,10 +2958,6 @@ " kaydedildi " Yer Hızlı eylem adı yinelenen - Sık Kullanılanları göster/gizle - Sık Kullanılanları göster - Sık Kullanılanları gizle - POI göster/gizle %1$s göster %1$s gizle Kategori ekle @@ -3265,13 +3255,7 @@ Yönlendirme için asfaltsız yolları asfaltlılara tercih et. OSM düzenlemeleri Eş yükselti eğrilerini haritada gösterme veya gizleme düğmesi. - Eş yükselti eğrilerini göster - Eş yükselti eğrilerini gizle - Eş yükselti eğrilerini göster/gizle Haritada tepe gölgelerini göstermek veya gizlemek için bir düğme. - Tepe gölgesini göster - Tepe gölgesini gizle - Tepe gölgesini göster/gizle Metinden konuşmaya motoru başlatılamıyor. Kayıtlı bir GPX yolu kullanarak konumunuzu simüle edin. Profili dışa aktar @@ -3497,9 +3481,6 @@ Güzergahtan geçerli konuma olan mesafe seçilen değerden fazla ise güzergah yeniden hesaplanacaktır. %1$s / %2$s Yamaçlar - Araziyi göster veya gizle - Araziyi gizle - Araziyi göster Haritada arazi katmanını göstermek veya gizlemek için bir düğme. Açıklamayı sil Açıklama ekle @@ -3613,9 +3594,6 @@ \n Devam ettir Bu eylemlere “%1$s” düğmesine dokunarak erişebilirsiniz. - Toplu taşıma araçlarını gizle - Toplu taşıma araçlarını göster - Toplu taşıma araçlarını göster veya gizle Haritada toplu taşıma araçlarını gösteren veya gizleyen düğme. POI oluştur veya düzenle Park etme alanları @@ -3683,9 +3661,6 @@ Alçak köprülerden kaçınmak için gemi yüksekliğini ayarlayabilirsiniz. Köprü hareket edebiliyorsa, açık durumdaki yüksekliğini kullanacağımızı unutmayın. Alçak köprülerden kaçınmak için gemi yüksekliğini ayarlayın. Köprü hareket edebiliyorsa, açık durumdaki yüksekliğini kullanacağımızı unutmayın. Dar köprülerden kaçınmak için gemi genişliğini ayarlayın - Mapillary\'i göster/gizle - Mapillary\'i gizle - Mapillary\'i göster Harita üzerinde Mapillary katmanını göstermek veya gizlemek için bir geçiş. Hız kameralarını kaldır Yasal diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index 6fba4223b3..ecbdddd2b2 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -2093,10 +2093,6 @@ Вилучити дію Ви впевнені, що хочете вилучити дію „%s“? Місце - Показати/приховати Закладки - Показати Закладки - Приховати Закладки - Показати/приховати POI Показати %1$s Приховати %1$s Додати категорію @@ -2210,9 +2206,6 @@ Нічого не знайдено Місце призначення розташовано в області з приватним доступом. Дозволити доступ до приватних доріг у цій подорожі\? Змініть пошуковий запит або ж розширте пошуковий радіус. - Показати/приховати примітки OSM - Показати примітки OSM - Приховати примітки OSM Натискання на кнопку дії покаже чи приховає примітки OSM на мапі. Відсортоване за відстанню Пошук у закладках @@ -2804,9 +2797,6 @@ Поміняти Показати більше Показані треки - Показати/Приховати треки - Приховати треки - Показати треки Спершу додайте пункт призначення Попередній маршрут Додати домівку @@ -3265,13 +3255,7 @@ Надати перевагу незаасфальтованим над асфальтованими дорогами для прокладки. Правки OSM Увімк/вимк показ горизонталей. - Показати горизонталі - Сховати горизонталі - Показати/приховати горизонталі Кнопка, що показує чи приховує горизонталі на мапі. - Показати затемнення рельєфу - Приховати затемнення рельєфу - Показати/приховати затемнення рельєфу Не вдається запустити рушій мовлення. Відтворити свою позицію за допомогою записаного треку GPX. Експорт профілю @@ -3496,9 +3480,6 @@ Пагорб %1$s з %2$s Схили - Показати чи приховати рельєф - Сховати місцевість - Показати місцевість Кнопка для відображення або приховування шару місцевості на мапі. Видалити опис Додати опис @@ -3610,9 +3591,6 @@ \n \n Розташування припаркованого авто - Приховати громадський транспорт - Показати громадський транспорт - Показати чи приховати громадський транспорт Кнопка показу або приховування громадського транспорту на мапі. Створити чи змінити POI Додати чи змінити закладку @@ -3681,9 +3659,6 @@ Ви можете встановити висоту судна, щоб уникнути низьких мостів. Майте на увазі, якщо міст рухомий, використовуватиметься його висота у відкритому стані. Встановіть висоту судна, щоб уникнути низьких мостів. Майте на увазі, якщо міст рухомий, використовуватиметься його висота у відкритому стані. Встановіть ширину судна, щоб уникнути вузьких мостів - Увімкнути/вимкнути Mapillary - Вимкнути Mapillary - Показати Mapillary Перемикач показує/приховує шар Mapillary на мапі. Видалити камери контролю швидкості Законодавство diff --git a/OsmAnd/res/values-zh-rCN/strings.xml b/OsmAnd/res/values-zh-rCN/strings.xml index 4f46e46e40..b1afb6439f 100644 --- a/OsmAnd/res/values-zh-rCN/strings.xml +++ b/OsmAnd/res/values-zh-rCN/strings.xml @@ -1249,9 +1249,6 @@ 增加搜索范围 什么都没找到 更改搜索或增加其半径。 - 显示/隐藏 OSM 注记 - 显示 OSM 注记 - 隐藏 OSM 注记 添加照片 允许进入私有土地。 全部下载 @@ -2382,10 +2379,6 @@ 快速动作名称重复 轻触动作按钮将会在地图上显示或隐收藏夹标点。 轻触动作按钮将会在地图上显示或隐藏 POI。 - 显示/隐藏收藏夹 - 显示收藏夹 - 隐藏收藏夹 - 显示/隐藏 POI 显示 %1$s 隐藏 %1$s 添加类别 @@ -2732,10 +2725,7 @@ 逐步 道路类型 退出于 - 显示/隐藏GPX轨迹 在地图中显示或隐藏已选中的GPX轨迹的按钮。 - 隐藏GPX轨迹 - 显示GPX路径 请先设置目的地 为OsmAnd Live启用公共交通的变更情况。 添加出发地和目的地 @@ -2894,9 +2884,6 @@ 透明度 缩放等级 图例 - 显示/隐藏地形 - 隐藏地形 - 显示地形 删除描述 添加描述 选择形状 @@ -2917,9 +2904,6 @@ 搜索兴趣点类型 半径尺 订阅 - OsmAnd Live - 隐藏公共交通 - 显示公共交通 - 显示/隐藏公共交通 创建/编辑兴趣点 编辑在线资源 正轴等角圆柱投影 @@ -2934,9 +2918,6 @@ 您可以设置船只高度,以避免过低桥梁。请记住,如果桥是可移动的,我们将使用它在打开状态下的高度。 设置船只高度,以避免过低桥梁。请记住,如果桥是可移动的,我们将使用它在打开状态下的高度。 设置船只宽度以避免狭窄的桥梁 - 显示/隐藏Mapillary - 隐藏Mapillary - 显示Mapillary %1$s 已删除 卸载并重新启动 删除下一个目的地 @@ -2959,10 +2940,6 @@ 允许专家路线 节点网络 隐藏罗盘标尺 - 显示/隐藏山体阴影 - 隐藏山体阴影 - 显示/隐藏轮廓线 - 隐藏轮廓线 在地图上显示或隐藏地形图层的按钮。 显示或隐藏其他地图细节 在地图上显示或隐藏Mapillary图层的开关。 diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 21e5de09a5..d980706693 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -2092,10 +2092,6 @@ 預設的名稱 " 儲存到 " 場所 - 顯示/隱藏我的收藏 - 顯示我的收藏 - 隱藏我的收藏 - 顯示/隱藏 POI 顯示 %1$s 隱藏 %1$s 增加一項類別 @@ -2382,9 +2378,6 @@ 安裝「等高線」外掛程式以顯示漸層垂直區域。 自此縮放等級開始隱藏 按距離排序 - 顯示或隱藏 OSM 註記 - 顯示 OSM 註記 - 隱藏 OSM 註記 在我的最愛中搜尋 顯示或隱藏地圖上的 OSM 註記的按鈕。 您的目的地位處私人通路的區域。本次旅程允許使用私人道路嗎? @@ -2839,10 +2832,7 @@ 道路類型 離開於 站點的座位 - 顯示/隱藏軌跡 在地圖上顯示或隱藏所選軌跡的按鈕。 - 隱藏軌跡 - 顯示軌跡 傳送紀錄檔 避免電車 避免電車 @@ -3257,13 +3247,7 @@ 在計算路徑時,相較於有鋪面的道路,較偏好無鋪面的道路。 OSM 編輯 在地圖上顯示或隱藏等高線的按鈕。 - 顯示等高線 - 隱藏等高線 - 顯示/隱藏等高線 在地圖上顯示或隱藏地形陰影的按鈕。 - 顯示地形陰影 - 隱藏地形陰影 - 顯示/隱藏地形陰影 無法啟動文字轉語音引擎。 使用已紀錄的 GPX 軌跡模擬您的位置。 匯出設定檔 @@ -3490,9 +3474,6 @@ 啟用以檢視地形陰影或坡度圖。您可以在我們的網站上閱讀更多關於這些地圖類型的資訊。 地形陰影 坡度 - 顯示或隱藏地形 - 隱藏地形 - 顯示地形 用於顯示或隱藏地圖上地形圖層的按鈕。 刪除描述 新增描述 @@ -3603,11 +3584,8 @@ \n • 修復 RTL 的臭蟲 \n \n - 顯示大眾運輸 您可以透過點選「%1$s」按鈕存取這些動作。 - 隱藏大眾運輸 在地圖上顯示或隱藏大眾運輸的按鈕。 - 顯示或隱藏大眾運輸 建立或編輯 POI 停車位置 新增與編輯收藏 @@ -3675,9 +3653,6 @@ 您可以設定船艦高度以避免矮橋。請記住,如果橋是可動式的,我們將會使用其在開啟狀態的高度。 設定船艦高度以避免矮橋。請記住,如果橋是可動式的,我們將會使用其開啟狀態的高度。 設定船艦寬度以避免窄橋 - 顯示/隱藏 Mapillary - 隱藏 Mapillary - 顯示 Mapillary 在地圖上顯示或隱藏 Mapillary 圖層的開關。 解除安裝測速照相 法律 diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml index 53138bcc18..675077e65c 100644 --- a/OsmAnd/res/values/phrases.xml +++ b/OsmAnd/res/values/phrases.xml @@ -4345,4 +4345,6 @@ Conference centre Geodesist + Local ref + diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 98c8410b5e..fcc2dd7b75 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -15,12 +15,13 @@ Please select another type of colorization. The track does not contain speed data. The track does not contain altitude data. + Interval + Show/hide + Copy POI name The recording will be continued. + Select category or add new one Distance by tap A toggle to show or hide the Coordinates widget on the map. - Show Coordinates widget - Hide Coordinates widget - Show/Hide coordinates widget Routing could avoid strong uphills. Application restart required to apply some settings. On pause @@ -343,9 +344,6 @@ Length limit Specify vehicle length to be permitted on routes. A toggle to show or hide the Mapillary layer on the map. - Show Mapillary - Hide Mapillary - Show/hide Mapillary Set vessel width to avoid narrow bridges Set vessel height to avoid low bridges. Keep in mind, if the bridge is movable, we will use its height in the open state. You can set vessel height to avoid low bridges. Keep in mind, if the bridge is movable, we will use its height in the open state. @@ -422,9 +420,6 @@ Parking positions Create or edit POI Button showing or hiding public transport on the map. - Show or hide public transport - Show public transport - Hide public transport • New offline Slope maps\n\n • Full customization of Favorites and GPX Waypoints – custom colors, icons, shapes\n\n @@ -522,9 +517,6 @@ Add description Delete description A button to show or hide terrain layer on the map. - Show terrain - Hide terrain - Show or hide terrain Slopes %1$s of %2$s The route will be recalculated if the distance from the route to the current location is more than selected value. @@ -725,13 +717,7 @@ Cannot start text-to-speech engine. OSM edits Button showing or hiding contour lines on the map. - Show contour lines - Hide contour lines - Show/hide contour lines A button to show or hide hillshades on the map. - Show hillshade - Hide hillshade - Show/hide hillshade You can apply this change to all or only the selected profile. Shared Prefer unpaved roads @@ -1118,10 +1104,7 @@ Swap Show more Displayed tracks - Show/hide tracks A button to show or hide selected tracks on the map. - Hide Tracks - Show Tracks Please set the destination first Previous route Add home @@ -1531,9 +1514,6 @@ Increase search radius Nothing found Change the search or increase its radius. - Show or hide OSM notes - Show OSM notes - Hide OSM notes Button to show or hide OSM notes on the map. Sorted by distance Search in Favorites @@ -2281,7 +2261,7 @@ Add Add to \'Favorites\' My Position - My Places + My places Favorites Tracks Currently recording track @@ -4015,10 +3995,6 @@ Quick action name duplicate A toggle to show or hide the Favorite points on the map. A toggle to show or hide POIs on the map. - Show/hide Favorites - Show Favorites - Hide Favorites - Show/hide POI Show %1$s Hide %1$s Add a category diff --git a/OsmAnd/src-google/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java b/OsmAnd/src-google/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java index d5ff6fcedf..df05570f57 100644 --- a/OsmAnd/src-google/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java +++ b/OsmAnd/src-google/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java @@ -6,9 +6,7 @@ import android.content.Intent; import android.net.Uri; import android.widget.Toast; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - +import com.android.billingclient.api.AccountIdentifiers; import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.BillingResult; import com.android.billingclient.api.Purchase; @@ -25,7 +23,6 @@ import net.osmand.plus.inapp.InAppPurchases.InAppSubscription.SubscriptionState; import net.osmand.plus.inapp.InAppPurchasesImpl.InAppPurchaseLiveUpdatesOldSubscription; import net.osmand.plus.inapp.util.BillingManager; import net.osmand.plus.settings.backend.CommonPreference; -import net.osmand.plus.settings.backend.OsmandPreference; import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.srtmplugin.SRTMPlugin; import net.osmand.util.Algorithms; @@ -37,6 +34,9 @@ import java.util.Arrays; import java.util.List; import java.util.Map.Entry; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { // The helper object @@ -77,6 +77,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { return billingManager; } + @Override protected void execImpl(@NonNull final InAppPurchaseTaskType taskType, @NonNull final InAppCommand runnable) { billingManager = new BillingManager(ctx, BASE64_ENCODED_PUBLIC_KEY, new BillingManager.BillingUpdatesListener() { @@ -126,7 +127,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { } billingManager.querySkuDetailsAsync(BillingClient.SkuType.INAPP, skuInApps, new SkuDetailsResponseListener() { @Override - public void onSkuDetailsResponse(BillingResult billingResult, final List skuDetailsListInApps) { + public void onSkuDetailsResponse(@NonNull BillingResult billingResult, final List skuDetailsListInApps) { // Is it a failure? if (billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK) { logError("Failed to query inapps sku details: " + billingResult.getResponseCode()); @@ -153,7 +154,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { billingManager.querySkuDetailsAsync(BillingClient.SkuType.SUBS, skuSubscriptions, new SkuDetailsResponseListener() { @Override - public void onSkuDetailsResponse(BillingResult billingResult, final List skuDetailsListSubscriptions) { + public void onSkuDetailsResponse(@NonNull BillingResult billingResult, final List skuDetailsListSubscriptions) { // Is it a failure? if (billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK) { logError("Failed to query subscriptipons sku details: " + billingResult.getResponseCode()); @@ -197,6 +198,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { if (skuDetails == null) { throw new IllegalArgumentException("Cannot find sku details"); } + BillingManager billingManager = getBillingManager(); if (billingManager != null) { billingManager.initiatePurchaseFlow(activity, skuDetails); @@ -321,7 +323,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { } @Override - public void onSkuDetailsResponse(BillingResult billingResult, List skuDetailsList) { + public void onSkuDetailsResponse(@NonNull BillingResult billingResult, List skuDetailsList) { logDebug("Query sku details finished."); @@ -442,19 +444,8 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { if (liveUpdatesPurchases.size() > 0) { List tokensSent = Arrays.asList(settings.BILLING_PURCHASE_TOKENS_SENT.get().split(";")); for (Purchase purchase : liveUpdatesPurchases) { - if ((Algorithms.isEmpty(settings.BILLING_USER_ID.get()) || Algorithms.isEmpty(settings.BILLING_USER_TOKEN.get())) - && !Algorithms.isEmpty(purchase.getDeveloperPayload())) { - String payload = purchase.getDeveloperPayload(); - if (!Algorithms.isEmpty(payload)) { - String[] arr = payload.split(" "); - if (arr.length > 0) { - settings.BILLING_USER_ID.set(arr[0]); - } - if (arr.length > 1) { - token = arr[1]; - settings.BILLING_USER_TOKEN.set(token); - } - } + if (needRestoreUserInfo()) { + restoreUserInfo(purchase); } if (!tokensSent.contains(purchase.getSku())) { tokensToSend.add(purchase); @@ -469,6 +460,37 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { } }; + private void restoreUserInfo(Purchase purchase) { + boolean restored = restoreUserInfoFromString(purchase.getDeveloperPayload()); + if (!restored) { + AccountIdentifiers accountIdentifiers = purchase.getAccountIdentifiers(); + if (accountIdentifiers != null) { + restoreUserInfoFromString(accountIdentifiers.getObfuscatedAccountId()); + } + } + } + + private boolean restoreUserInfoFromString(String userInfo) { + if (Algorithms.isEmpty(userInfo)) { + return false; + } + OsmandSettings settings = ctx.getSettings(); + String[] arr = userInfo.split(" "); + if (arr.length > 0) { + settings.BILLING_USER_ID.set(arr[0]); + } + if (arr.length > 1) { + token = arr[1]; + settings.BILLING_USER_TOKEN.set(token); + } + return needRestoreUserInfo(); + } + + private boolean needRestoreUserInfo() { + OsmandSettings settings = ctx.getSettings(); + return Algorithms.isEmpty(settings.BILLING_USER_ID.get()) || Algorithms.isEmpty(settings.BILLING_USER_TOKEN.get()); + } + private PurchaseInfo getPurchaseInfo(Purchase purchase) { return new PurchaseInfo(purchase.getSku(), purchase.getOrderId(), purchase.getPurchaseToken()); } @@ -511,7 +533,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { String introductoryPrice = skuDetails.getIntroductoryPrice(); String introductoryPricePeriod = skuDetails.getIntroductoryPricePeriod(); - String introductoryPriceCycles = skuDetails.getIntroductoryPriceCycles(); + int introductoryPriceCycles = skuDetails.getIntroductoryPriceCycles(); long introductoryPriceAmountMicros = skuDetails.getIntroductoryPriceAmountMicros(); if (!Algorithms.isEmpty(introductoryPrice)) { try { @@ -524,7 +546,8 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { } } - protected InAppCommand getPurchaseLiveUpdatesCommand(final WeakReference activity, final String sku, final String payload) { + @Override + protected InAppCommand getPurchaseLiveUpdatesCommand(final WeakReference activity, final String sku, final String userInfo) { return new InAppCommand() { @Override public void run(InAppPurchaseHelper helper) { @@ -534,7 +557,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { if (AndroidUtils.isActivityNotDestroyed(a) && skuDetails != null) { BillingManager billingManager = getBillingManager(); if (billingManager != null) { - billingManager.setPayload(payload); + billingManager.setObfuscatedAccountId(userInfo); billingManager.initiatePurchaseFlow(a, skuDetails); } else { throw new IllegalStateException("BillingManager disposed"); @@ -551,6 +574,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { }; } + @Override protected InAppCommand getRequestInventoryCommand() { return new InAppCommand() { @Override diff --git a/OsmAnd/src-huawei/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java b/OsmAnd/src-huawei/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java index 0f3536e5d0..7a16429bd5 100644 --- a/OsmAnd/src-huawei/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java +++ b/OsmAnd/src-huawei/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java @@ -276,7 +276,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { } } - protected InAppCommand getPurchaseLiveUpdatesCommand(final WeakReference activity, final String sku, final String payload) { + protected InAppCommand getPurchaseLiveUpdatesCommand(final WeakReference activity, final String sku, final String userInfo) { return new InAppCommand() { @Override public void run(InAppPurchaseHelper helper) { @@ -285,7 +285,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper { ProductInfo productInfo = getProductInfo(sku); if (AndroidUtils.isActivityNotDestroyed(a) && productInfo != null) { IapRequestHelper.createPurchaseIntent(getIapClient(), sku, - IapClient.PriceType.IN_APP_SUBSCRIPTION, payload, new IapApiCallback() { + IapClient.PriceType.IN_APP_SUBSCRIPTION, userInfo, new IapApiCallback() { @Override public void onSuccess(PurchaseIntentResult result) { if (result == null) { diff --git a/OsmAnd/src/net/osmand/data/PointDescription.java b/OsmAnd/src/net/osmand/data/PointDescription.java index 28c5e12519..41c46d0dcf 100644 --- a/OsmAnd/src/net/osmand/data/PointDescription.java +++ b/OsmAnd/src/net/osmand/data/PointDescription.java @@ -47,6 +47,7 @@ public class PointDescription { public static final String POINT_TYPE_OSM_BUG = "bug"; public static final String POINT_TYPE_WORLD_REGION = "world_region"; public static final String POINT_TYPE_GPX_ITEM = "gpx_item"; + public static final String POINT_TYPE_GPX_FILE = "gpx_file"; public static final String POINT_TYPE_WORLD_REGION_SHOW_ON_MAP = "world_region_show_on_map"; public static final String POINT_TYPE_BLOCKED_ROAD = "blocked_road"; public static final String POINT_TYPE_TRANSPORT_ROUTE = "transport_route"; @@ -297,6 +298,10 @@ public class PointDescription { return POINT_TYPE_GPX.equals(type); } + public boolean isGpxFile() { + return POINT_TYPE_GPX_FILE.equals(type); + } + @Override public int hashCode() { final int prime = 31; diff --git a/OsmAnd/src/net/osmand/plus/ContextMenuItem.java b/OsmAnd/src/net/osmand/plus/ContextMenuItem.java index 1ab526cbeb..f7b13fc78d 100644 --- a/OsmAnd/src/net/osmand/plus/ContextMenuItem.java +++ b/OsmAnd/src/net/osmand/plus/ContextMenuItem.java @@ -9,6 +9,7 @@ import androidx.annotation.LayoutRes; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.core.content.ContextCompat; + import net.osmand.plus.ContextMenuAdapter.OnItemDeleteAction; public class ContextMenuItem { @@ -164,7 +165,9 @@ public class ContextMenuItem { return description; } - public OnItemDeleteAction getItemDeleteAction() { return itemDeleteAction; } + public OnItemDeleteAction getItemDeleteAction() { + return itemDeleteAction; + } public ContextMenuAdapter.ItemClickListener getItemClickListener() { return itemClickListener; @@ -207,9 +210,7 @@ public class ContextMenuItem { } public void setColor(Context context, @ColorRes int colorRes) { - if (colorRes != INVALID_ID) { - this.color = ContextCompat.getColor(context, colorRes); - } + color = colorRes != INVALID_ID ? ContextCompat.getColor(context, colorRes) : null; } public void setSelected(boolean selected) { diff --git a/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java b/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java index 69c159bed0..66dbb1c75e 100644 --- a/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java +++ b/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java @@ -27,10 +27,12 @@ import net.osmand.plus.activities.SavingTrackHelper; import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType; import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType; +import net.osmand.plus.helpers.GpxUiHelper.GPXInfo; +import net.osmand.plus.helpers.SearchHistoryHelper; import net.osmand.plus.helpers.enums.MetricsConstants; import net.osmand.plus.mapmarkers.MapMarkersGroup; import net.osmand.plus.mapmarkers.MapMarkersHelper; -import net.osmand.plus.routing.RouteProvider; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.plus.track.GpxSplitType; import net.osmand.util.Algorithms; @@ -581,7 +583,7 @@ public class GpxSelectionHelper { } else if (obj.has(BACKUP)) { selectedGpxFilesBackUp.put(gpx, gpx.modifiedTime); } else { - SelectedGpxFile file = selectGpxFile(gpx, true, false, true, selectedByUser, false); + SelectedGpxFile file = selectGpxFile(gpx, true, false, true, selectedByUser, false, false); if (obj.has(HIDDEN_GROUPS)) { readHiddenGroups(file, obj.getString(HIDDEN_GROUPS)); } @@ -684,7 +686,13 @@ public class GpxSelectionHelper { app.getSettings().SELECTED_GPX.set(ar.toString()); } - private SelectedGpxFile selectGpxFileImpl(GPXFile gpx, GpxDataItem dataItem, boolean show, boolean notShowNavigationDialog, boolean syncGroup, boolean selectedByUser) { + private SelectedGpxFile selectGpxFileImpl(GPXFile gpx, + GpxDataItem dataItem, + boolean show, + boolean notShowNavigationDialog, + boolean syncGroup, + boolean selectedByUser, + boolean addToHistory) { boolean displayed; SelectedGpxFile sf; if (gpx != null && gpx.showCurrentTrack) { @@ -724,6 +732,15 @@ public class GpxSelectionHelper { if (sf != null) { sf.splitProcessed = false; } + if (show && selectedByUser && addToHistory) { + String path = gpx.path; + String rootGpxDir = app.getAppPath(IndexConstants.GPX_INDEX_DIR).getAbsolutePath() + '/'; + String fileName = path.replace(rootGpxDir, ""); + GPXInfo gpxInfo = GpxUiHelper.getGpxInfoByFileName(app, fileName); + if (gpxInfo != null) { + SearchHistoryHelper.getInstance(app).addNewItemToHistory(gpxInfo); + } + } return sf; } @@ -749,18 +766,39 @@ public class GpxSelectionHelper { return selectGpxFile(gpx, show, notShowNavigationDialog, true, true, true); } - public SelectedGpxFile selectGpxFile(GPXFile gpx, GpxDataItem dataItem, boolean show, boolean notShowNavigationDialog, boolean syncGroup, boolean selectedByUser) { - SelectedGpxFile sf = selectGpxFileImpl(gpx, dataItem, show, notShowNavigationDialog, syncGroup, selectedByUser); + public SelectedGpxFile selectGpxFile(GPXFile gpx, + GpxDataItem dataItem, + boolean show, + boolean notShowNavigationDialog, + boolean syncGroup, + boolean selectedByUser, + boolean addToHistory) { + SelectedGpxFile sf = selectGpxFileImpl(gpx, dataItem, show, notShowNavigationDialog, syncGroup, selectedByUser, addToHistory); saveCurrentSelections(); return sf; } - public SelectedGpxFile selectGpxFile(GPXFile gpx, boolean show, boolean notShowNavigationDialog, boolean syncGroup, boolean selectedByUser, boolean canAddToMarkers) { + public SelectedGpxFile selectGpxFile(GPXFile gpx, + boolean show, + boolean notShowNavigationDialog, + boolean syncGroup, + boolean selectedByUser, + boolean canAddToMarkers) { + return selectGpxFile(gpx, show, notShowNavigationDialog, syncGroup, selectedByUser, canAddToMarkers, true); + } + + public SelectedGpxFile selectGpxFile(GPXFile gpx, + boolean show, + boolean notShowNavigationDialog, + boolean syncGroup, + boolean selectedByUser, + boolean canAddToMarkers, + boolean addToHistory) { GpxDataItem dataItem = app.getGpxDbHelper().getItem(new File(gpx.path)); if (canAddToMarkers && show && dataItem != null && dataItem.isShowAsMarkers()) { app.getMapMarkersHelper().addOrEnableGroup(gpx); } - return selectGpxFile(gpx, dataItem, show, notShowNavigationDialog, syncGroup, selectedByUser); + return selectGpxFile(gpx, dataItem, show, notShowNavigationDialog, syncGroup, selectedByUser, addToHistory); } public void clearPoints(GPXFile gpxFile) { @@ -928,7 +966,7 @@ public class GpxSelectionHelper { } public boolean isFollowTrack(OsmandApplication app) { - RouteProvider.GPXRouteParamsBuilder routeParams = app.getRoutingHelper().getCurrentGPXRoute(); + GPXRouteParamsBuilder routeParams = app.getRoutingHelper().getCurrentGPXRoute(); if (routeParams != null) { return gpxFile.path.equals(routeParams.getFile().path); } diff --git a/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java b/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java index 6a52fe9804..883cc908c5 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java @@ -121,13 +121,22 @@ public class OsmAndFormatter { } public static String getFormattedTimeInterval(OsmandApplication app, double interval) { + String unitsStr; + double intervalInUnits; if (interval < 60) { - return interval + " " + app.getString(R.string.int_seconds); + unitsStr = app.getString(R.string.shared_string_sec); + intervalInUnits = interval; } else if (interval % 60 == 0) { - return (interval / 60) + " " + app.getString(R.string.int_min); + unitsStr = app.getString(R.string.int_min); + intervalInUnits = (interval / 60); } else { - return (interval / 60f) + " " + app.getString(R.string.int_min); + unitsStr = app.getString(R.string.int_min); + intervalInUnits = (interval / 60f); } + String formattedInterval = Algorithms.isInt(intervalInUnits) ? + String.format(Locale.US, "%d", (long) intervalInUnits) : + String.format("%s", intervalInUnits); + return formattedInterval + " " + unitsStr; } public static String getFormattedDistanceInterval(OsmandApplication app, double interval) { diff --git a/OsmAnd/src/net/osmand/plus/OsmAndLocationSimulation.java b/OsmAnd/src/net/osmand/plus/OsmAndLocationSimulation.java index 2dbd4f6dd9..8b62b540b3 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndLocationSimulation.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndLocationSimulation.java @@ -18,7 +18,7 @@ import net.osmand.GPXUtilities; import net.osmand.Location; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.helpers.GpxUiHelper; -import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.plus.settings.backend.ApplicationMode; import java.util.ArrayList; diff --git a/OsmAnd/src/net/osmand/plus/TargetPointsHelper.java b/OsmAnd/src/net/osmand/plus/TargetPointsHelper.java index 472899862b..bd77ebf33b 100644 --- a/OsmAnd/src/net/osmand/plus/TargetPointsHelper.java +++ b/OsmAnd/src/net/osmand/plus/TargetPointsHelper.java @@ -10,7 +10,7 @@ import net.osmand.data.LatLon; import net.osmand.data.LocationPoint; import net.osmand.data.PointDescription; import net.osmand.plus.GeocodingLookupService.AddressLookupRequest; -import net.osmand.plus.routing.RouteProvider.RouteService; +import net.osmand.plus.routing.RouteService; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.RoutingHelperUtils; import net.osmand.plus.settings.backend.ApplicationMode; diff --git a/OsmAnd/src/net/osmand/plus/UiUtilities.java b/OsmAnd/src/net/osmand/plus/UiUtilities.java index 269800c630..e6ce06ca35 100644 --- a/OsmAnd/src/net/osmand/plus/UiUtilities.java +++ b/OsmAnd/src/net/osmand/plus/UiUtilities.java @@ -1,6 +1,7 @@ package net.osmand.plus; import android.content.Context; +import android.content.pm.PackageManager; import android.content.res.ColorStateList; import android.graphics.Color; import android.graphics.Typeface; @@ -369,13 +370,14 @@ public class UiUtilities { break; } //Looks like screenOrientation correction must not be applied for devices without compass? - Sensor compass = ((SensorManager) app.getSystemService(Context.SENSOR_SERVICE)).getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); - if (compass == null) { + PackageManager manager = app.getPackageManager(); + boolean hasCompass = manager.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS); + if (!hasCompass) { screenOrientation = 0; } return screenOrientation; } - + public static void setupSnackbar(Snackbar snackbar, boolean nightMode) { setupSnackbar(snackbar, nightMode, null, null, null, null); } @@ -633,8 +635,9 @@ public class UiUtilities { } int activeDisableColor = getColorWithAlpha(activeColor, 0.25f); ColorStateList activeCsl = new ColorStateList(states, new int[] {activeColor, activeDisableColor}); - int inactiveColor = ContextCompat.getColor(ctx, nightMode ? R.color.icon_color_default_dark : R.color.icon_color_secondary_light); - ColorStateList inactiveCsl = new ColorStateList(states, new int[] {inactiveColor, inactiveColor}); + int inactiveColor = getColorWithAlpha(activeColor, 0.5f); + int inactiveDisableColor = ContextCompat.getColor(ctx, nightMode ? R.color.icon_color_default_dark : R.color.icon_color_secondary_light); + ColorStateList inactiveCsl = new ColorStateList(states, new int[] {inactiveColor, inactiveDisableColor}); slider.setTrackActiveTintList(activeCsl); slider.setTrackInactiveTintList(inactiveCsl); slider.setHaloTintList(activeCsl); diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 2273c91742..7e0a07e40c 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -93,6 +93,7 @@ import net.osmand.plus.importfiles.ImportHelper; import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment; import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.mapcontextmenu.builders.cards.dialogs.ContextMenuCardDialogFragment; +import net.osmand.plus.mapcontextmenu.editors.SelectFavoriteCategoryBottomSheet; import net.osmand.plus.mapcontextmenu.other.DestinationReachedMenu; import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu; import net.osmand.plus.mapmarkers.MapMarker; diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index bfc5077b2e..48cc860cb7 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -69,7 +69,7 @@ import net.osmand.plus.profiles.ProfileDataObject; import net.osmand.plus.profiles.ProfileDataUtils; import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu; import net.osmand.plus.routepreparationmenu.WaypointsFragment; -import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; @@ -441,7 +441,7 @@ public class MapActivityActions implements DialogProvider { } adapter.addItem(itemBuilder - .setTitleId(R.string.plan_a_route, mapActivity) + .setTitleId(R.string.plan_route, mapActivity) .setId(MAP_CONTEXT_MENU_MEASURE_DISTANCE) .setIcon(R.drawable.ic_action_ruler) .setOrder(MEASURE_DISTANCE_ITEM_ORDER) @@ -489,7 +489,7 @@ public class MapActivityActions implements DialogProvider { // new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, // REQUEST_LOCATION_FOR_DIRECTIONS_NAVIGATION_PERMISSION); //} - } else if (standardId == R.string.plan_a_route) { + } else if (standardId == R.string.plan_route) { mapActivity.getContextMenu().close(); MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), new LatLon(latitude, longitude)); } else if (standardId == R.string.avoid_road) { @@ -963,7 +963,7 @@ public class MapActivityActions implements DialogProvider { } }).createItem()); - optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.plan_a_route, mapActivity) + optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.plan_route, mapActivity) .setId(DRAWER_MEASURE_DISTANCE_ID) .setIcon(R.drawable.ic_action_plan_route) .setListener(new ItemClickListener() { diff --git a/OsmAnd/src/net/osmand/plus/activities/PluginsFragment.java b/OsmAnd/src/net/osmand/plus/activities/PluginsFragment.java index b1f16ee4e7..04666e9607 100644 --- a/OsmAnd/src/net/osmand/plus/activities/PluginsFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/PluginsFragment.java @@ -4,8 +4,8 @@ import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -22,7 +22,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.PopupMenu; -import androidx.core.content.ContextCompat; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; @@ -225,7 +224,11 @@ public class PluginsFragment extends BaseOsmAndFragment implements PluginStateLi pluginDescription.setText(plugin.getDescription()); int color = AndroidUtils.getColorFromAttr(context, R.attr.list_background_color); - pluginLogo.setImageDrawable(UiUtilities.tintDrawable(plugin.getLogoResource(), color)); + Drawable pluginIcon = plugin.getLogoResource(); + if (pluginIcon.getConstantState() != null) { + pluginIcon = pluginIcon.getConstantState().newDrawable().mutate(); + } + pluginLogo.setImageDrawable(UiUtilities.tintDrawable(pluginIcon, color)); pluginLogo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -249,7 +252,7 @@ public class PluginsFragment extends BaseOsmAndFragment implements PluginStateLi if (active) { pluginLogo.setBackgroundResource(nightMode ? R.drawable.bg_plugin_logo_enabled_dark : R.drawable.bg_plugin_logo_enabled_light); } else { - TypedArray attributes = context.getTheme().obtainStyledAttributes(new int[] {R.attr.bg_plugin_logo_disabled}); + TypedArray attributes = context.getTheme().obtainStyledAttributes(new int[]{R.attr.bg_plugin_logo_disabled}); pluginLogo.setBackgroundDrawable(attributes.getDrawable(0)); attributes.recycle(); } diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java index 536ef96541..9cb508141e 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java @@ -303,9 +303,9 @@ public class SearchHistoryFragment extends OsmAndListFragment implements SearchA iconId = R.drawable.ic_type_audio; } else if (pd.isVideoNote()) { iconId = R.drawable.ic_type_video; - }else if (pd.isPhotoNote()) { + } else if (pd.isPhotoNote()) { iconId = R.drawable.ic_type_img; - } else { + } else { iconId = R.drawable.ic_action_street_name; } return iconId; diff --git a/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java b/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java index 46708ce5ae..26fe55e1e8 100644 --- a/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java +++ b/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java @@ -18,7 +18,7 @@ import net.osmand.plus.R; import net.osmand.plus.TargetPointsHelper; import net.osmand.plus.TargetPointsHelper.TargetPoint; import net.osmand.plus.activities.MapActivity; -import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.settings.backend.OsmandSettings; diff --git a/OsmAnd/src/net/osmand/plus/dialogs/PluginInstalledBottomSheetDialog.java b/OsmAnd/src/net/osmand/plus/dialogs/PluginInstalledBottomSheetDialog.java index db9422859a..4cd675805b 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/PluginInstalledBottomSheetDialog.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/PluginInstalledBottomSheetDialog.java @@ -3,6 +3,7 @@ package net.osmand.plus.dialogs; import android.app.Activity; import android.content.Context; import android.graphics.Typeface; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.text.SpannableString; import android.view.View; @@ -11,12 +12,11 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; import androidx.fragment.app.FragmentManager; import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; -import net.osmand.plus.profiles.ProfileDataUtils; -import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; @@ -34,6 +34,8 @@ import net.osmand.plus.download.DownloadValidationManager; import net.osmand.plus.download.IndexItem; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.FontCache; +import net.osmand.plus.profiles.ProfileDataUtils; +import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.widgets.style.CustomTypefaceSpan; import org.apache.commons.logging.Log; @@ -87,11 +89,17 @@ public class PluginInstalledBottomSheetDialog extends MenuBottomSheetDialogFragm Typeface typeface = FontCache.getRobotoMedium(getContext()); SpannableString pluginTitleSpan = new SpannableString(plugin.getName()); pluginTitleSpan.setSpan(new CustomTypefaceSpan(typeface), 0, pluginTitleSpan.length(), 0); + Drawable pluginIcon = plugin.getLogoResource(); + if (pluginIcon.getConstantState() != null) { + pluginIcon = pluginIcon.getConstantState().newDrawable().mutate(); + } + pluginIcon = UiUtilities.tintDrawable(pluginIcon, ContextCompat.getColor( + context, nightMode ? R.color.icon_color_default_light : R.color.icon_color_default_dark)); BaseBottomSheetItem pluginTitle = new SimpleBottomSheetItem.Builder() .setTitle(pluginTitleSpan) .setTitleColorId(nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light) - .setIcon(plugin.getLogoResource()) + .setIcon(pluginIcon) .setLayoutId(R.layout.bottom_sheet_item_simple_56dp) .create(); items.add(pluginTitle); diff --git a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java index ce33c21803..e871969042 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java @@ -93,7 +93,6 @@ import net.osmand.plus.activities.ActivityResultListener; import net.osmand.plus.activities.ActivityResultListener.OnActivityResultListener; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.PluginsFragment; -import net.osmand.plus.dialogs.ConfigureMapMenu; import net.osmand.plus.dialogs.GpxAppearanceAdapter; import net.osmand.plus.dialogs.GpxAppearanceAdapter.AppearanceListItem; import net.osmand.plus.helpers.enums.MetricsConstants; @@ -751,13 +750,53 @@ public class GpxUiHelper { gpxDbHelper.updateShowStartFinish(item, showStartFinish); } - public static void updateGpxInfoView(View v, String itemTitle, GPXInfo info, GpxDataItem dataItem, boolean currentlyRecordingTrack, OsmandApplication app) { + public static void updateGpxInfoView(final @NonNull OsmandApplication app, + final @NonNull View v, + final @NonNull String itemTitle, + final @Nullable Drawable iconDrawable, + final @NonNull GPXInfo info) { + GpxDataItem item = getDataItem(app, info, new GpxDataItemCallback() { + @Override + public boolean isCancelled() { + return false; + } + + @Override + public void onGpxDataItemReady(GpxDataItem item) { + updateGpxInfoView(app, v, itemTitle, iconDrawable, info, item); + } + }); + if (item != null) { + updateGpxInfoView(app, v, itemTitle, iconDrawable, info, item); + } + } + + private static void updateGpxInfoView(@NonNull OsmandApplication app, + @NonNull View v, + @NonNull String itemTitle, + @Nullable Drawable iconDrawable, + @NonNull GPXInfo info, + @NonNull GpxDataItem dataItem) { + updateGpxInfoView(v, itemTitle, info, dataItem, false, app); + if (iconDrawable != null) { + ImageView icon = (ImageView) v.findViewById(R.id.icon); + icon.setImageDrawable(iconDrawable); + icon.setVisibility(View.VISIBLE); + } + } + + public static void updateGpxInfoView(View v, + String itemTitle, + GPXInfo info, + GpxDataItem dataItem, + boolean currentlyRecordingTrack, + OsmandApplication app) { TextView viewName = ((TextView) v.findViewById(R.id.name)); viewName.setText(itemTitle.replace("/", " • ").trim()); + viewName.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); ImageView icon = (ImageView) v.findViewById(R.id.icon); icon.setVisibility(View.GONE); //icon.setImageDrawable(app.getIconsCache().getThemedIcon(R.drawable.ic_action_polygom_dark)); - viewName.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); GPXTrackAnalysis analysis = null; if (currentlyRecordingTrack) { @@ -809,9 +848,23 @@ public class GpxUiHelper { } TextView descr = ((TextView) v.findViewById(R.id.description)); - descr.setVisibility(View.GONE); + if (descr != null) { + descr.setVisibility(View.GONE); + } - v.findViewById(R.id.check_item).setVisibility(View.GONE); + View checkbox = v.findViewById(R.id.check_item); + if (checkbox != null) { + checkbox.setVisibility(View.GONE); + } + } + + private static GpxDataItem getDataItem(@NonNull OsmandApplication app, + @NonNull GPXInfo info, + @Nullable GpxDataItemCallback callback) { + File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR); + String fileName = info.getFileName(); + File file = new File(dir, fileName); + return app.getGpxDbHelper().getItem(file, callback); } @TargetApi(Build.VERSION_CODES.KITKAT) @@ -884,6 +937,17 @@ public class GpxUiHelper { return list; } + @Nullable + public static GPXInfo getGpxInfoByFileName(@NonNull OsmandApplication app, @NonNull String fileName) { + final File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR); + List infoList = getSortedGPXFilesInfo(dir, null, false); + for (GPXInfo info : infoList) { + if (Algorithms.objectEquals(info.getFileName(), fileName)) { + return info; + } + } + return null; + } public static List getSortedGPXFilesInfo(File dir, final List selectedGpxList, boolean absolutePath) { final List list = new ArrayList<>(); diff --git a/OsmAnd/src/net/osmand/plus/helpers/SearchHistoryHelper.java b/OsmAnd/src/net/osmand/plus/helpers/SearchHistoryHelper.java index 693227f434..b71b83316f 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/SearchHistoryHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/SearchHistoryHelper.java @@ -6,6 +6,7 @@ import net.osmand.osm.AbstractPoiType; import net.osmand.plus.OsmandApplication; import net.osmand.plus.api.SQLiteAPI.SQLiteConnection; import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; +import net.osmand.plus.helpers.GpxUiHelper.GPXInfo; import net.osmand.plus.poi.PoiUIFilter; import net.osmand.util.Algorithms; @@ -16,6 +17,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static net.osmand.data.PointDescription.POINT_TYPE_GPX_FILE; + public class SearchHistoryHelper { private static final int HISTORY_LIMIT = 1500; @@ -53,6 +56,10 @@ public class SearchHistoryHelper { context.getPoiFilters().markHistory(filter.getFilterId(), true); } + public void addNewItemToHistory(GPXInfo gpxInfo) { + addNewItemToHistory(new HistoryEntry(0, 0, createPointDescription(gpxInfo))); + } + public List getHistoryEntries(boolean onlyPoints) { if (loadedEntries == null) { checkLoadedEntries(); @@ -75,6 +82,10 @@ public class SearchHistoryHelper { return new PointDescription(PointDescription.POINT_TYPE_CUSTOM_POI_FILTER, filter.getFilterId()); } + private PointDescription createPointDescription(GPXInfo gpxInfo) { + return new PointDescription(PointDescription.POINT_TYPE_GPX_FILE, gpxInfo.getFileName()); + } + public void remove(Object item) { PointDescription pd = null; if (item instanceof HistoryEntry) { @@ -83,6 +94,8 @@ public class SearchHistoryHelper { pd = createPointDescription((AbstractPoiType) item); } else if (item instanceof PoiUIFilter) { pd = createPointDescription((PoiUIFilter) item); + } else if (item instanceof GPXInfo) { + pd = createPointDescription((GPXInfo) item); } if (pd != null) { remove(pd); diff --git a/OsmAnd/src/net/osmand/plus/helpers/kml2gpx.xslt b/OsmAnd/src/net/osmand/plus/helpers/kml2gpx.xslt index 221b192405..2c899eb840 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/kml2gpx.xslt +++ b/OsmAnd/src/net/osmand/plus/helpers/kml2gpx.xslt @@ -178,17 +178,19 @@ - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java index 48fd643099..d511b7be85 100644 --- a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java +++ b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java @@ -364,8 +364,8 @@ public abstract class InAppPurchaseHelper { notifyDismissProgress(InAppPurchaseTaskType.PURCHASE_LIVE_UPDATES); if (!Algorithms.isEmpty(userId) && !Algorithms.isEmpty(token)) { logDebug("Launching purchase flow for live updates subscription for userId=" + userId); - final String payload = userId + " " + token; - exec(InAppPurchaseTaskType.PURCHASE_LIVE_UPDATES, getPurchaseLiveUpdatesCommand(activity, sku, payload)); + final String userInfo = userId + " " + token; + exec(InAppPurchaseTaskType.PURCHASE_LIVE_UPDATES, getPurchaseLiveUpdatesCommand(activity, sku, userInfo)); } else { notifyError(InAppPurchaseTaskType.PURCHASE_LIVE_UPDATES, "Empty userId"); stop(true); @@ -374,7 +374,7 @@ public abstract class InAppPurchaseHelper { } protected abstract InAppCommand getPurchaseLiveUpdatesCommand(final WeakReference activity, - final String sku, final String payload) throws UnsupportedOperationException; + final String sku, final String userInfo) throws UnsupportedOperationException; @SuppressLint("StaticFieldLeak") private class RequestInventoryTask extends AsyncTask { diff --git a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java index 7cc9a8fbee..e6ec431187 100644 --- a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java +++ b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java @@ -405,16 +405,12 @@ public abstract class InAppPurchases { String introductoryPrice, long introductoryPriceAmountMicros, String introductoryPeriodString, - String introductoryCycles) throws ParseException { + int introductoryCycles) throws ParseException { this.subscription = subscription; this.introductoryPrice = introductoryPrice; this.introductoryPriceAmountMicros = introductoryPriceAmountMicros; this.introductoryPeriodString = introductoryPeriodString; - try { - this.introductoryCycles = Integer.parseInt(introductoryCycles); - } catch (NumberFormatException e) { - throw new ParseException("Cannot parse introductoryCycles = " + introductoryCycles, 0); - } + this.introductoryCycles = introductoryCycles; introductoryPriceValue = introductoryPriceAmountMicros / 1000000d; introductoryPeriod = Period.parse(introductoryPeriodString); } diff --git a/OsmAnd/src/net/osmand/plus/inapp/util/BillingManager.java b/OsmAnd/src/net/osmand/plus/inapp/util/BillingManager.java index b5b3c654f9..ed1772be6f 100644 --- a/OsmAnd/src/net/osmand/plus/inapp/util/BillingManager.java +++ b/OsmAnd/src/net/osmand/plus/inapp/util/BillingManager.java @@ -2,9 +2,7 @@ package net.osmand.plus.inapp.util; import android.app.Activity; import android.content.Context; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; +import android.text.TextUtils; import com.android.billingclient.api.AcknowledgePurchaseParams; import com.android.billingclient.api.AcknowledgePurchaseResponseListener; @@ -25,7 +23,6 @@ import com.android.billingclient.api.SkuDetailsParams; import com.android.billingclient.api.SkuDetailsResponseListener; import net.osmand.PlatformUtil; -import net.osmand.util.Algorithms; import java.util.ArrayList; import java.util.Collections; @@ -33,6 +30,9 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + /** * Handles all the interactions with Play Store (via Billing library), maintains connection to * it through BillingClient and caches temporary states/data if needed @@ -58,7 +58,9 @@ public class BillingManager implements PurchasesUpdatedListener { // Public key for verifying signature, in base64 encoding private String mSignatureBase64; - private String mPayload; + + private String mObfuscatedAccountId; + private String mObfuscatedProfileId; private final BillingUpdatesListener mBillingUpdatesListener; private final List mPurchases = new ArrayList<>(); @@ -135,18 +137,29 @@ public class BillingManager implements PurchasesUpdatedListener { * Start a purchase flow */ public void initiatePurchaseFlow(final Activity activity, final SkuDetails skuDetails) { - initiatePurchaseFlow(activity, skuDetails, null); + initiatePurchaseFlow(activity, skuDetails, null, null); } /** * Start a purchase or subscription replace flow */ - public void initiatePurchaseFlow(final Activity activity, final SkuDetails skuDetails, final String oldSku) { + public void initiatePurchaseFlow(final Activity activity, final SkuDetails skuDetails, final String oldSku, final String purchaseToken) { Runnable purchaseFlowRequest = new Runnable() { @Override public void run() { - LOG.debug("Launching in-app purchase flow. Replace old SKU? " + (oldSku != null)); - BillingFlowParams purchaseParams = BillingFlowParams.newBuilder().setSkuDetails(skuDetails).setOldSku(oldSku).build(); + LOG.debug("Launching in-app purchase flow. Replace old SKU? " + (oldSku != null && purchaseToken != null)); + BillingFlowParams.Builder paramsBuilder = BillingFlowParams.newBuilder() + .setSkuDetails(skuDetails); + if (!TextUtils.isEmpty(mObfuscatedAccountId)) { + paramsBuilder.setObfuscatedAccountId(mObfuscatedAccountId); + } + if (!TextUtils.isEmpty(mObfuscatedProfileId)) { + paramsBuilder.setObfuscatedProfileId(mObfuscatedProfileId); + } + if (oldSku != null && purchaseToken != null) { + paramsBuilder.setOldSku(oldSku, purchaseToken); + } + BillingFlowParams purchaseParams = paramsBuilder.build(); mBillingClient.launchBillingFlow(activity, purchaseParams); } }; @@ -177,9 +190,11 @@ public class BillingManager implements PurchasesUpdatedListener { @Override public void run() { // Query the purchase async - SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder(); - params.setSkusList(skuList).setType(itemType); - mBillingClient.querySkuDetailsAsync(params.build(), + SkuDetailsParams params = SkuDetailsParams.newBuilder() + .setSkusList(skuList) + .setType(itemType) + .build(); + mBillingClient.querySkuDetailsAsync(params, new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(BillingResult billingResult, List skuDetailsList) { @@ -247,15 +262,6 @@ public class BillingManager implements PurchasesUpdatedListener { return Collections.unmodifiableList(mPurchases); } - - public String getPayload() { - return mPayload; - } - - public void setPayload(String payload) { - this.mPayload = payload; - } - /** * Handles the purchase *

Note: Notice that for each purchase, we check if signature is valid on the client. @@ -274,13 +280,9 @@ public class BillingManager implements PurchasesUpdatedListener { if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { // Acknowledge the purchase if it hasn't already been acknowledged. if (!purchase.isAcknowledged()) { - AcknowledgePurchaseParams.Builder builder = - AcknowledgePurchaseParams.newBuilder() - .setPurchaseToken(purchase.getPurchaseToken()); - if (!Algorithms.isEmpty(mPayload)) { - builder.setDeveloperPayload(mPayload); - } - AcknowledgePurchaseParams acknowledgePurchaseParams = builder.build(); + AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() + .setPurchaseToken(purchase.getPurchaseToken()) + .build(); mBillingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() { @Override public void onAcknowledgePurchaseResponse(BillingResult billingResult) { @@ -404,6 +406,14 @@ public class BillingManager implements PurchasesUpdatedListener { }); } + public void setObfuscatedAccountId(String obfuscatedAccountId) { + mObfuscatedAccountId = obfuscatedAccountId; + } + + public void setObfuscatedProfileId(String obfuscatedProfileId) { + mObfuscatedProfileId = obfuscatedProfileId; + } + private void executeServiceRequest(Runnable runnable) { if (mIsServiceConnected) { runnable.run(); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/AddNewFavoriteCategoryBottomSheet.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/AddNewFavoriteCategoryBottomSheet.java new file mode 100644 index 0000000000..d90c06b609 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/AddNewFavoriteCategoryBottomSheet.java @@ -0,0 +1,248 @@ +package net.osmand.plus.mapcontextmenu.editors; + +import android.content.res.ColorStateList; +import android.os.Bundle; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; + +import com.google.android.material.textfield.TextInputEditText; +import com.google.android.material.textfield.TextInputLayout; + +import net.osmand.AndroidUtils; +import net.osmand.plus.FavouritesDbHelper; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.base.MenuBottomSheetDialogFragment; +import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; +import net.osmand.plus.helpers.ColorDialogs; +import net.osmand.plus.myplaces.AddNewTrackFolderBottomSheet; +import net.osmand.plus.routepreparationmenu.cards.BaseCard; +import net.osmand.plus.track.ColorsCard; +import net.osmand.plus.track.CustomColorBottomSheet; +import net.osmand.util.Algorithms; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class AddNewFavoriteCategoryBottomSheet extends MenuBottomSheetDialogFragment implements CustomColorBottomSheet.ColorPickerListener, BaseCard.CardListener { + + + public static final String TAG = AddNewTrackFolderBottomSheet.class.getName(); + private static final String KEY_CTX_EDIT_CAT_EDITOR_TAG = "key_ctx_edit_cat_editor_tag"; + private static final String KEY_CTX_EDIT_GPX_FILE = "key_ctx_edit_gpx_file"; + private static final String KEY_CTX_EDIT_GPX_CATEGORIES = "key_ctx_edit_gpx_categories"; + private static final String KEY_CTX_EDIT_CAT_NEW = "key_ctx_edit_cat_new"; + private static final String KEY_CTX_EDIT_CAT_NAME = "key_ctx_edit_cat_name"; + private static final String KEY_CTX_EDIT_CAT_COLOR = "key_ctx_edit_cat_color"; + FavouritesDbHelper favoritesHelper; + private boolean isNew = true; + private String name = ""; + private boolean isGpx; + private ArrayList gpxCategories; + private int selectedColor; + private ColorsCard colorsCard; + private TextInputEditText editText; + private TextInputLayout nameTextBox; + private View view; + private String editorTag; + private SelectFavoriteCategoryBottomSheet.CategorySelectionListener selectionListener; + + public static AddNewFavoriteCategoryBottomSheet createInstance(@NonNull String editorTag, @Nullable Set gpxCategories, boolean isGpx) { + AddNewFavoriteCategoryBottomSheet fragment = new AddNewFavoriteCategoryBottomSheet(); + Bundle bundle = new Bundle(); + bundle.putString(KEY_CTX_EDIT_CAT_EDITOR_TAG, editorTag); + bundle.putBoolean(KEY_CTX_EDIT_GPX_FILE, isGpx); + if (gpxCategories != null) { + bundle.putStringArrayList(KEY_CTX_EDIT_GPX_CATEGORIES, new ArrayList<>(gpxCategories)); + } + fragment.setArguments(bundle); + fragment.setRetainInstance(true); + return fragment; + } + + public void setSelectionListener(SelectFavoriteCategoryBottomSheet.CategorySelectionListener selectionListener) { + this.selectionListener = selectionListener; + } + + @Override + protected int getRightBottomButtonTextId() { + return R.string.shared_string_save; + } + + private boolean isGpxCategoryExists(@NonNull String name) { + boolean res = false; + if (gpxCategories != null) { + String nameLC = name.toLowerCase(); + for (String category : gpxCategories) { + if (category.toLowerCase().equals(nameLC)) { + res = true; + break; + } + } + } + return res; + } + + @Override + protected void onRightBottomButtonClick() { + name = editText.getText().toString().trim(); + FragmentActivity activity = getActivity(); + if (activity != null) { + boolean exists = isGpx ? isGpxCategoryExists(name) : favoritesHelper.groupExists(name); + if (exists) { + AlertDialog.Builder b = new AlertDialog.Builder(activity); + b.setMessage(getString(R.string.favorite_category_dublicate_message)); + b.setNegativeButton(R.string.shared_string_ok, null); + b.show(); + } else { + if (activity instanceof MapActivity) { + if (!isGpx) { + favoritesHelper.addEmptyCategory(name, selectedColor); + } + PointEditor editor = ((MapActivity) activity).getContextMenu().getPointEditor(editorTag); + + if (editor != null) { + editor.setCategory(name, selectedColor); + } + + if (selectionListener != null) { + selectionListener.onCategorySelected(name, selectedColor); + } + } + dismiss(); + } + } + } + + @Override + protected UiUtilities.DialogButtonType getRightBottomButtonType() { + return UiUtilities.DialogButtonType.PRIMARY; + } + + @Nullable + public FavouritesDbHelper getHelper() { + return favoritesHelper; + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + saveState(outState); + super.onSaveInstanceState(outState); + } + + public void saveState(Bundle bundle) { + bundle.putString(KEY_CTX_EDIT_CAT_EDITOR_TAG, editorTag); + bundle.putString(KEY_CTX_EDIT_CAT_NEW, Boolean.valueOf(isNew).toString()); + bundle.putString(KEY_CTX_EDIT_CAT_NAME, editText.getText().toString().trim()); + bundle.putString(KEY_CTX_EDIT_CAT_COLOR, "" + selectedColor); + bundle.putBoolean(KEY_CTX_EDIT_GPX_FILE, isGpx); + if (gpxCategories != null) { + bundle.putStringArrayList(KEY_CTX_EDIT_GPX_CATEGORIES, gpxCategories); + } + } + + @Override + public void createMenuItems(Bundle savedInstanceState) { + OsmandApplication app = requiredMyApplication(); + favoritesHelper = app.getFavorites(); + + if (savedInstanceState != null) { + restoreState(savedInstanceState); + } else if (getArguments() != null) { + restoreState(getArguments()); + } + + + items.add(new TitleItem(getString(R.string.favorite_category_add_new_title))); + selectedColor = getResources().getColor(R.color.color_favorite); + + view = UiUtilities.getInflater(app, nightMode).inflate(R.layout.add_new_favorite_category, null); + nameTextBox = view.findViewById(R.id.name_text_box); + nameTextBox.setBoxBackgroundColorResource(nightMode ? R.color.list_background_color_dark : R.color.activity_background_color_light); + nameTextBox.setHint(app.getResources().getString(R.string.favorite_category_name)); + ColorStateList colorStateList = ColorStateList.valueOf(ContextCompat + .getColor(app, nightMode ? R.color.text_color_secondary_dark : R.color.text_color_secondary_light)); + nameTextBox.setDefaultHintTextColor(colorStateList); + editText = view.findViewById(R.id.name_edit_text); + editText.setText(name); + editText.requestFocus(); + AndroidUtils.softKeyboardDelayed(getActivity(), editText); + nameTextBox.setStartIconTintList(ColorStateList.valueOf(selectedColor)); + nameTextBox.setBoxStrokeColorStateList(ColorStateList.valueOf(selectedColor)); + + BaseBottomSheetItem editFolderName = new BaseBottomSheetItem.Builder() + .setCustomView(view) + .create(); + items.add(editFolderName); + MapActivity mapActivity = (MapActivity) getActivity(); + List colors = new ArrayList<>(); + for (int color : ColorDialogs.pallette) { + colors.add(color); + } + colorsCard = new ColorsCard(mapActivity, selectedColor, this, colors, app.getSettings().CUSTOM_TRACK_COLORS, null); + colorsCard.setListener(this); + LinearLayout selectColor = view.findViewById(R.id.select_color); + selectColor.addView(colorsCard.build(view.getContext())); + } + + private void updateColorSelector(int color) { + ((TextView) view.findViewById(R.id.color_name)).setText(ColorDialogs.getColorName(color)); + selectedColor = color; + nameTextBox.setStartIconTintList(ColorStateList.valueOf(selectedColor)); + nameTextBox.setBoxStrokeColorStateList(ColorStateList.valueOf(selectedColor)); + } + + @Override + public void onCardLayoutNeeded(@NonNull BaseCard card) { + + } + + @Override + public void onCardPressed(@NonNull BaseCard card) { + if (card instanceof ColorsCard) { + int color = ((ColorsCard) card).getSelectedColor(); + updateColorSelector(color); + } + } + + @Override + public void onCardButtonPressed(@NonNull BaseCard card, int buttonIndex) { + + } + + @Override + public void onColorSelected(Integer prevColor, int newColor) { + colorsCard.onColorSelected(prevColor, newColor); + int color = colorsCard.getSelectedColor(); + updateColorSelector(color); + } + + public void restoreState(Bundle bundle) { + editorTag = bundle.getString(KEY_CTX_EDIT_CAT_EDITOR_TAG); + String isNewStr = bundle.getString(KEY_CTX_EDIT_CAT_NEW); + if (isNewStr != null) { + isNew = Boolean.parseBoolean(isNewStr); + } + name = bundle.getString(KEY_CTX_EDIT_CAT_NAME); + if (name == null) { + name = ""; + } + String colorStr = bundle.getString(KEY_CTX_EDIT_CAT_COLOR); + if (!Algorithms.isEmpty(colorStr)) { + selectedColor = Integer.parseInt(colorStr); + } + isGpx = bundle.getBoolean(KEY_CTX_EDIT_GPX_FILE, false); + gpxCategories = bundle.getStringArrayList(KEY_CTX_EDIT_GPX_CATEGORIES); + } +} diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragment.java index c24a29ff71..8b8fc64f5b 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragment.java @@ -24,6 +24,7 @@ import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; import net.osmand.AndroidUtils; import net.osmand.plus.OsmandApplication; @@ -31,6 +32,7 @@ import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.base.BaseOsmAndFragment; +import net.osmand.plus.base.BottomSheetDialogFragment; import net.osmand.plus.widgets.AutoCompleteTextViewEx; import net.osmand.util.Algorithms; @@ -136,9 +138,10 @@ public abstract class PointEditorFragment extends BaseOsmAndFragment { @Override public boolean onTouch(final View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { + FragmentManager fragmentManager = getFragmentManager(); DialogFragment dialogFragment = createSelectCategoryDialog(); - if (dialogFragment != null) { - dialogFragment.show(getChildFragmentManager(), SelectCategoryDialogFragment.TAG); + if (fragmentManager != null && dialogFragment != null) { + dialogFragment.show(fragmentManager, SelectFavoriteCategoryBottomSheet.class.getSimpleName()); } return true; } @@ -179,7 +182,7 @@ public abstract class PointEditorFragment extends BaseOsmAndFragment { protected DialogFragment createSelectCategoryDialog() { PointEditor editor = getEditor(); if (editor != null) { - return SelectCategoryDialogFragment.createInstance(editor.getFragmentTag()); + return SelectFavoriteCategoryBottomSheet.createInstance(editor.getFragmentTag()); } else { return null; } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragmentNew.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragmentNew.java index 84a1d64714..946351baa0 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragmentNew.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragmentNew.java @@ -38,6 +38,7 @@ import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -66,6 +67,7 @@ import org.json.JSONObject; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -124,7 +126,7 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen @SuppressLint("ClickableViewAccessibility") @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + Bundle savedInstanceState) { app = requireMyApplication(); nightMode = app.getDaynightHelper().isNightModeForMapControls(); @@ -144,7 +146,7 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen selectedShape = getBackgroundType(); selectedIcon = getIconId(); - Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); + Toolbar toolbar = view.findViewById(R.id.toolbar); toolbar.setBackgroundColor(ContextCompat.getColor(requireContext(), nightMode ? R.color.app_bar_color_dark : R.color.list_background_color_light)); toolbar.setTitle(getToolbarTitle()); @@ -159,7 +161,7 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen } }); - final ScrollView scrollView = (ScrollView) view.findViewById(R.id.editor_scroll_view); + final ScrollView scrollView = view.findViewById(R.id.editor_scroll_view); scrollViewY = scrollView.getScrollY(); scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { @Override @@ -175,14 +177,14 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen }); final int activeColorResId = getActiveColorRes(); - ImageView toolbarAction = (ImageView) view.findViewById(R.id.toolbar_action); + ImageView toolbarAction = view.findViewById(R.id.toolbar_action); view.findViewById(R.id.background_layout).setBackgroundResource(nightMode ? R.color.app_bar_color_dark : R.color.list_background_color_light); - ImageView replaceIcon = (ImageView) view.findViewById(R.id.replace_action_icon); + ImageView replaceIcon = view.findViewById(R.id.replace_action_icon); replaceIcon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_replace, activeColorResId)); - ImageView deleteIcon = (ImageView) view.findViewById(R.id.delete_action_icon); + ImageView deleteIcon = view.findViewById(R.id.delete_action_icon); deleteIcon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_delete_dark, activeColorResId)); - ImageView groupListIcon = (ImageView) view.findViewById(R.id.group_list_button_icon); + ImageView groupListIcon = view.findViewById(R.id.group_list_button_icon); groupListIcon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_group_select_all, activeColorResId)); addToHiddenGroupInfo = view.findViewById(R.id.add_hidden_group_info); addToHiddenGroupInfo.setText(getString(R.string.add_hidden_group_info, getString(R.string.shared_string_my_places))); @@ -190,9 +192,10 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen groupList.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + FragmentManager fragmentManager = getFragmentManager(); DialogFragment dialogFragment = createSelectCategoryDialog(); - if (dialogFragment != null) { - dialogFragment.show(getChildFragmentManager(), SelectCategoryDialogFragment.TAG); + if (fragmentManager != null && dialogFragment != null) { + dialogFragment.show(fragmentManager, SelectFavoriteCategoryBottomSheet.class.getSimpleName()); } } }); @@ -217,10 +220,10 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen UiUtilities.setupDialogButton(nightMode, cancelButton, UiUtilities.DialogButtonType.SECONDARY, R.string.shared_string_cancel); UiUtilities.setupDialogButton(nightMode, saveButton, UiUtilities.DialogButtonType.PRIMARY, R.string.shared_string_save); - final TextInputLayout nameCaption = (TextInputLayout) view.findViewById(R.id.name_caption); + final TextInputLayout nameCaption = view.findViewById(R.id.name_caption); nameCaption.setHint(getString(R.string.shared_string_name)); - nameEdit = (EditText) view.findViewById(R.id.name_edit); + nameEdit = view.findViewById(R.id.name_edit); nameEdit.setText(getNameInitValue()); nameEdit.addTextChangedListener(new TextWatcher() { @Override @@ -238,15 +241,15 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen }); checkEmptyName(nameEdit.getText(), nameCaption, saveButton); - nameIcon = (ImageView) view.findViewById(R.id.name_icon); + nameIcon = view.findViewById(R.id.name_icon); TextView categoryEdit = view.findViewById(R.id.groupName); if (categoryEdit != null) { AndroidUtils.setTextPrimaryColor(view.getContext(), categoryEdit, nightMode); categoryEdit.setText(getCategoryInitValue()); } - descriptionEdit = (EditText) view.findViewById(R.id.description_edit); - addressEdit = (EditText) view.findViewById(R.id.address_edit); + descriptionEdit = view.findViewById(R.id.description_edit); + addressEdit = view.findViewById(R.id.address_edit); AndroidUtils.setTextPrimaryColor(view.getContext(), descriptionEdit, nightMode); AndroidUtils.setTextPrimaryColor(view.getContext(), addressEdit, nightMode); AndroidUtils.setHintTextSecondaryColor(view.getContext(), descriptionEdit, nightMode); @@ -257,7 +260,7 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen descriptionCaption = view.findViewById(R.id.description); addressCaption = view.findViewById(R.id.address); - addDelDescription = (TextView) view.findViewById(R.id.description_button); + addDelDescription = view.findViewById(R.id.description_button); addAddressBtn = view.findViewById(R.id.address_button); deleteAddressIcon = view.findViewById(R.id.delete_address_icon); deleteAddressIcon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_trash_basket_16, activeColorResId)); @@ -519,8 +522,10 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen FlowLayout selectShape = view.findViewById(R.id.select_shape); for (BackgroundType backgroundType : BackgroundType.values()) { if (backgroundType.isSelected()) { + int minimalPaddingBetweenIcon = app.getResources().getDimensionPixelSize(R.dimen.favorites_select_icon_button_right_padding); selectShape.addView(createShapeItemView(backgroundType, selectShape), - new FlowLayout.LayoutParams(0, 0)); + new FlowLayout.LayoutParams(minimalPaddingBetweenIcon, 0)); + selectShape.setHorizontalAutoSpacing(true); } } } @@ -561,7 +566,7 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen ((TextView) rootView.findViewById(R.id.shape_name)).setText(backgroundType.getNameId()); ImageView background = newShape.findViewById(R.id.background); background.setImageDrawable(UiUtilities.tintDrawable(AppCompatResources.getDrawable(app, backgroundType.getIconId()), - selectedColor)); + selectedColor)); selectedShape = backgroundType; setBackgroundType(backgroundType); updateNameIcon(); @@ -569,9 +574,9 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen private void setShapeSelectorBackground(BackgroundType backgroundType, ImageView background) { background.setImageDrawable(UiUtilities.tintDrawable(AppCompatResources.getDrawable(app, backgroundType.getIconId()), - ContextCompat.getColor(app, - nightMode ? R.color.inactive_buttons_and_links_bg_dark - : R.color.inactive_buttons_and_links_bg_light))); + ContextCompat.getColor(app, + nightMode ? R.color.inactive_buttons_and_links_bg_dark + : R.color.inactive_buttons_and_links_bg_light))); } private String getInitCategory() { @@ -643,7 +648,9 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen horizontalSelectionAdapter.notifyDataSetChanged(); iconCategoriesRecyclerView.smoothScrollToPosition(horizontalSelectionAdapter.getItemPositionByTitle(selectedIconCategory)); for (String name : iconNameList) { - selectIcon.addView(createIconItemView(name, selectIcon), new FlowLayout.LayoutParams(0, 0)); + int minimalPaddingBetweenIcon = app.getResources().getDimensionPixelSize(R.dimen.favorites_select_icon_button_right_padding); + selectIcon.addView(createIconItemView(name, selectIcon), new FlowLayout.LayoutParams(minimalPaddingBetweenIcon, 0)); + selectIcon.setHorizontalAutoSpacing(true); } } } @@ -701,9 +708,9 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen private void setIconSelectorBackground(ImageView backgroundCircle) { backgroundCircle.setImageDrawable(UiUtilities.tintDrawable(AppCompatResources.getDrawable(app, R.drawable.bg_point_circle), - ContextCompat.getColor(app, nightMode - ? R.color.inactive_buttons_and_links_bg_dark - : R.color.inactive_buttons_and_links_bg_light))); + ContextCompat.getColor(app, nightMode + ? R.color.inactive_buttons_and_links_bg_dark + : R.color.inactive_buttons_and_links_bg_light))); } private void updateNameIcon() { @@ -720,7 +727,7 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen byte[] buffer = new byte[size]; is.read(buffer); is.close(); - json = new String(buffer, "UTF-8"); + json = new String(buffer, StandardCharsets.UTF_8); } catch (IOException ex) { ex.printStackTrace(); return null; @@ -732,7 +739,18 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen protected DialogFragment createSelectCategoryDialog() { PointEditor editor = getEditor(); if (editor != null) { - return SelectCategoryDialogFragment.createInstance(editor.getFragmentTag()); + return SelectFavoriteCategoryBottomSheet.createInstance(editor.getFragmentTag()); + } else { + return null; + } + } + + @Nullable + protected AddNewFavoriteCategoryBottomSheet createAddCategoryDialog() { + PointEditor editor = getEditor(); + if (editor != null) { + return AddNewFavoriteCategoryBottomSheet.createInstance(editor.getFragmentTag(), getCategories(), + !editor.getFragmentTag().equals(FavoritePointEditor.TAG)); } else { return null; } @@ -887,8 +905,6 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen return true; } - ; - String getNameTextValue() { EditText nameEdit = view.findViewById(R.id.name_edit); return nameEdit.getText().toString().trim(); @@ -1006,12 +1022,10 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment implemen holder.groupButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - PointEditor editor = getEditor(); - if (editor != null) { - EditCategoryDialogFragment dialogFragment = - EditCategoryDialogFragment.createInstance(editor.getFragmentTag(), getCategories(), - !editor.getFragmentTag().equals(FavoritePointEditor.TAG)); - dialogFragment.show(requireActivity().getSupportFragmentManager(), EditCategoryDialogFragment.TAG); + FragmentManager fragmentManager = getFragmentManager(); + DialogFragment dialogFragment = createAddCategoryDialog(); + if (fragmentManager != null && dialogFragment != null) { + dialogFragment.show(fragmentManager, SelectFavoriteCategoryBottomSheet.class.getSimpleName()); } } }); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/RtePtEditorFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/RtePtEditorFragment.java index 840ebba24f..9bbbb0ec34 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/RtePtEditorFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/RtePtEditorFragment.java @@ -23,7 +23,7 @@ public class RtePtEditorFragment extends WptPtEditorFragment { @Override protected DialogFragment createSelectCategoryDialog() { PointEditor editor = getEditor(); - return editor != null ? SelectCategoryDialogFragment.createInstance(editor.getFragmentTag()) : null; + return editor != null ? SelectFavoriteCategoryBottomSheet.createInstance(editor.getFragmentTag()) : null; } public static void showInstance(final MapActivity mapActivity) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/SelectFavoriteCategoryBottomSheet.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/SelectFavoriteCategoryBottomSheet.java new file mode 100644 index 0000000000..c3ee4169dc --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/SelectFavoriteCategoryBottomSheet.java @@ -0,0 +1,232 @@ +package net.osmand.plus.mapcontextmenu.editors; + +import android.app.Activity; +import android.graphics.PorterDuff; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.ScrollView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.content.res.AppCompatResources; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.fragment.app.FragmentActivity; + +import net.osmand.AndroidUtils; +import net.osmand.GPXUtilities; +import net.osmand.plus.FavouritesDbHelper; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.base.MenuBottomSheetDialogFragment; +import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; +import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerItem; +import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.helpers.FontCache; +import net.osmand.plus.myplaces.AddNewTrackFolderBottomSheet; +import net.osmand.util.Algorithms; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class SelectFavoriteCategoryBottomSheet extends MenuBottomSheetDialogFragment { + + public static final String TAG = SelectFavoriteCategoryBottomSheet.class.getSimpleName(); + private static final String KEY_CTX_SEL_CAT_EDITOR_TAG = "key_ctx_sel_cat_editor_tag"; + private static String editorTag; + private OsmandApplication app; + private GPXUtilities.GPXFile gpxFile; + private Map gpxCategories; + private SelectFavoriteCategoryBottomSheet.CategorySelectionListener selectionListener; + + + private static Drawable getIcon(final Activity activity, int resId, int color) { + Drawable drawable = AppCompatResources.getDrawable(activity, resId); + if (drawable != null) { + drawable = DrawableCompat.wrap(drawable).mutate(); + drawable.clearColorFilter(); + drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); + } + return drawable; + } + + public static SelectFavoriteCategoryBottomSheet createInstance(String editorTag) { + SelectFavoriteCategoryBottomSheet fragment = new SelectFavoriteCategoryBottomSheet(); + Bundle bundle = new Bundle(); + bundle.putString(KEY_CTX_SEL_CAT_EDITOR_TAG, editorTag); + fragment.setArguments(bundle); + fragment.setRetainInstance(true); + return fragment; + } + + public void setSelectionListener(SelectFavoriteCategoryBottomSheet.CategorySelectionListener selectionListener) { + this.selectionListener = selectionListener; + } + + public GPXUtilities.GPXFile getGpxFile() { + return gpxFile; + } + + public void setGpxFile(GPXUtilities.GPXFile gpxFile) { + this.gpxFile = gpxFile; + } + + public void setGpxCategories(Map gpxCategories) { + this.gpxCategories = gpxCategories; + } + + @Override + public void createMenuItems(Bundle savedInstanceState) { + app = requiredMyApplication(); + if (savedInstanceState != null) { + restoreState(savedInstanceState); + } else if (getArguments() != null) { + restoreState(getArguments()); + } + + BaseBottomSheetItem titleItem = new BottomSheetItemWithDescription.Builder() + .setDescription(getString(R.string.select_category_descr)) + .setTitle(getString(R.string.favorite_category_select)) + .setLayoutId(R.layout.bottom_sheet_item_title_with_description) + .create(); + items.add(titleItem); + final FragmentActivity activity = requireActivity(); + + View addNewCategoryView = UiUtilities.getInflater(app, nightMode).inflate(R.layout.bottom_sheet_item_with_descr_64dp, null); + addNewCategoryView.setMinimumHeight(getResources().getDimensionPixelSize(R.dimen.bottom_sheet_list_item_height)); + TextView title = addNewCategoryView.findViewById(R.id.title); + Typeface typeface = FontCache.getRobotoMedium(getContext()); + title.setTypeface(typeface); + AndroidUiHelper.updateVisibility(addNewCategoryView.findViewById(R.id.description), false); + BaseBottomSheetItem addNewFolderItem = new SimpleBottomSheetItem.Builder() + .setTitle(getString(R.string.favorite_category_add_new)) + .setTitleColorId(nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light) + .setIcon(getActiveIcon(R.drawable.ic_action_folder_add)) + .setLayoutId(R.layout.bottom_sheet_item_with_descr_64dp) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MapActivity mapActivity = (MapActivity) getActivity(); + Set categories = gpxCategories != null ? gpxCategories.keySet() : null; + AddNewFavoriteCategoryBottomSheet fragment = AddNewFavoriteCategoryBottomSheet.createInstance(editorTag, categories, gpxFile != null); + if (mapActivity != null) { + fragment.show(mapActivity.getSupportFragmentManager(), AddNewTrackFolderBottomSheet.class.getName()); + } + fragment.setSelectionListener(selectionListener); + dismiss(); + } + }) + .setCustomView(addNewCategoryView) + .create(); + items.add(addNewFolderItem); + + DividerItem dividerItem = new DividerItem(app); + dividerItem.setMargins(0, 0, 0, 0); + items.add(dividerItem); + + View favoriteCategoryList = UiUtilities.getInflater(app, nightMode).inflate(R.layout.favorite_categories_dialog, null); + ScrollView scrollContainer = favoriteCategoryList.findViewById(R.id.scroll_container); + final int dp16 = AndroidUtils.dpToPx(app, 16f); + scrollContainer.setPadding(dp16,0, dp16,0); + LinearLayout favoriteCategoryContainer = favoriteCategoryList.findViewById(R.id.list_container); + + final FavouritesDbHelper favoritesHelper = app.getFavorites(); + if (gpxFile != null) { + if (gpxCategories != null) { + for (Map.Entry e : gpxCategories.entrySet()) { + String categoryName = e.getKey(); + String favoriteCategoryCount = String.valueOf(e.getKey().length()); + favoriteCategoryContainer.addView(createCategoryItem(activity, nightMode, categoryName, e.getValue(), favoriteCategoryCount, false)); + } + } + } else { + List gs = favoritesHelper.getFavoriteGroups(); + for (final FavouritesDbHelper.FavoriteGroup category : gs) { + String favoriteCategoryCount; + if (Algorithms.isEmpty(category.getPoints())) { + favoriteCategoryCount = app.getString(R.string.shared_string_empty); + } else { + favoriteCategoryCount = String.valueOf(category.getPoints().size()); + } + favoriteCategoryContainer.addView(createCategoryItem(activity, nightMode, category.getDisplayName(getContext()), + category.getColor(), favoriteCategoryCount, !category.isVisible())); + } + } + items.add(new BaseBottomSheetItem.Builder() + .setCustomView(favoriteCategoryList) + .create()); + } + + private View createCategoryItem(@NonNull final Activity activity, boolean nightMode, final String categoryName, final int categoryColor, String categoryPointCount, boolean isHidden) { + View itemView = UiUtilities.getInflater(activity, nightMode).inflate(R.layout.bottom_sheet_item_with_descr_and_radio_btn, null); + final AppCompatImageView button = (AppCompatImageView) itemView.findViewById(R.id.icon); + final int dp8 = AndroidUtils.dpToPx(app, 8f); + button.setPadding(0,0, dp8,0); + LinearLayout descriptionContainer = itemView.findViewById(R.id.descriptionContainer); + descriptionContainer.setPadding(0, 0, 0, 0); + View divider = itemView.findViewById(R.id.divider_bottom); + divider.setVisibility(View.GONE); + itemView.setPadding(0, 0, 0, 0); + final RadioButton compoundButton = itemView.findViewById(R.id.compound_button); + int activeColorId = nightMode ? + R.color.active_color_primary_dark : R.color.active_color_primary_light; + int disableColorId = nightMode ? + R.color.icon_color_default_dark : R.color.icon_color_default_light; + UiUtilities.setupCompoundButton(nightMode, ContextCompat.getColor(app, + nightMode ? activeColorId : disableColorId), compoundButton); + + if (isHidden) { + button.setImageResource(R.drawable.ic_action_hide); + } else { + if (categoryColor != 0) { + button.setImageDrawable(getIcon(activity, R.drawable.ic_action_folder, categoryColor)); + } else { + button.setImageDrawable(getIcon(activity, R.drawable.ic_action_folder, ContextCompat.getColor(activity, + gpxFile != null ? R.color.gpx_color_point : R.color.color_favorite))); + } + } + String name = categoryName.length() == 0 ? getString(R.string.shared_string_favorites) : categoryName; + TextView text = itemView.findViewById(R.id.title); + TextView description = itemView.findViewById(R.id.description); + text.setText(name); + description.setText(String.valueOf(categoryPointCount)); + descriptionContainer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + FragmentActivity a = getActivity(); + compoundButton.setSelected(true); + if (a instanceof MapActivity) { + PointEditor pointEditor = ((MapActivity) a).getContextMenu().getPointEditor(editorTag); + if (pointEditor != null) { + pointEditor.setCategory(categoryName, categoryColor); + } + if (selectionListener != null) { + selectionListener.onCategorySelected(categoryName, categoryColor); + } + } + dismiss(); + } + }); + return itemView; + } + + public void restoreState(Bundle bundle) { + editorTag = bundle.getString(KEY_CTX_SEL_CAT_EDITOR_TAG); + } + + public interface CategorySelectionListener { + + void onCategorySelected(String category, int color); + } + +} diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/WptPtEditorFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/WptPtEditorFragment.java index f5ef3033c8..a3efbca5ad 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/WptPtEditorFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/WptPtEditorFragment.java @@ -67,7 +67,7 @@ public class WptPtEditorFragment extends PointEditorFragment { protected DialogFragment createSelectCategoryDialog() { WptPtEditor editor = getWptPtEditor(); if (editor != null) { - SelectCategoryDialogFragment selectCategoryDialogFragment = SelectCategoryDialogFragment.createInstance(editor.getFragmentTag()); + SelectFavoriteCategoryBottomSheet selectCategoryDialogFragment = SelectFavoriteCategoryBottomSheet.createInstance(editor.getFragmentTag()); GPXFile gpx = editor.getGpxFile(); if (gpx != null) { selectCategoryDialogFragment.setGpxFile(gpx); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/WptPtEditorFragmentNew.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/WptPtEditorFragmentNew.java index c948b5414e..456049403e 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/WptPtEditorFragmentNew.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/WptPtEditorFragmentNew.java @@ -81,7 +81,7 @@ public class WptPtEditorFragmentNew extends PointEditorFragmentNew { protected DialogFragment createSelectCategoryDialog() { WptPtEditor editor = getWptPtEditor(); if (editor != null) { - SelectCategoryDialogFragment selectCategoryDialogFragment = SelectCategoryDialogFragment.createInstance(editor.getFragmentTag()); + SelectFavoriteCategoryBottomSheet selectCategoryDialogFragment = SelectFavoriteCategoryBottomSheet.createInstance(editor.getFragmentTag()); GPXFile gpx = editor.getGpxFile(); if (gpx != null) { selectCategoryDialogFragment.setGpxFile(gpx); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/RoutePreferencesMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/RoutePreferencesMenu.java index 005433cbe2..897de79b6c 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/RoutePreferencesMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/RoutePreferencesMenu.java @@ -36,7 +36,7 @@ import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.LocalRoutingPar import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.MuteSoundRoutingParameter; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.OtherSettingsRoutingParameter; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.VoiceGuidanceRoutingParameter; -import net.osmand.plus.routing.RouteProvider; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; @@ -373,13 +373,13 @@ public class RoutePreferencesMenu { } private void updateSpinnerItems(final TextView gpxSpinner) { - RouteProvider.GPXRouteParamsBuilder rp = mapActivity.getRoutingHelper().getCurrentGPXRoute(); + GPXRouteParamsBuilder rp = mapActivity.getRoutingHelper().getCurrentGPXRoute(); gpxSpinner.setText(rp == null ? mapActivity.getString(R.string.shared_string_none) : new File(rp.getFile().path).getName()); } private void showOptionsMenu(final TextView gpxSpinner) { - RouteProvider.GPXRouteParamsBuilder rp = mapActivity.getRoutingHelper().getCurrentGPXRoute(); + GPXRouteParamsBuilder rp = mapActivity.getRoutingHelper().getCurrentGPXRoute(); final PopupMenu optionsMenu = new PopupMenu(gpxSpinner.getContext(), gpxSpinner); MenuItem item = optionsMenu.getMenu().add( mapActivity.getString(R.string.shared_string_none)); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/ShareMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/ShareMenu.java index 53384024ff..5d040765b6 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/ShareMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/ShareMenu.java @@ -38,7 +38,7 @@ public class ShareMenu extends BaseMenuController { MESSAGE(R.drawable.ic_action_message, R.string.shared_string_send), CLIPBOARD(R.drawable.ic_action_copy, R.string.shared_string_copy), ADDRESS(R.drawable.ic_action_street_name, R.string.copy_address), - NAME(R.drawable.ic_action_copy, R.string.copy_location_name), + NAME(R.drawable.ic_action_copy, R.string.copy_poi_name), COORDINATES(R.drawable.ic_action_copy, R.string.copy_coordinates), GEO(R.drawable.ic_world_globe_dark, R.string.share_geo), QR_CODE(R.drawable.ic_action_qrcode, R.string.shared_string_qr_code); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java index e0efd25a7e..bf86142181 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java @@ -1,9 +1,7 @@ package net.osmand.plus.mapcontextmenu.other; -import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Matrix; -import android.graphics.PointF; import android.graphics.drawable.Drawable; import android.util.Pair; import android.view.MotionEvent; @@ -20,7 +18,6 @@ import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.highlight.Highlight; import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; -import com.github.mikephil.charting.listener.BarLineChartTouchListener; import com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture; import com.github.mikephil.charting.listener.OnChartGestureListener; import com.github.mikephil.charting.listener.OnChartValueSelectedListener; @@ -611,39 +608,39 @@ public class TrackDetailsMenu { } }); - final float minDragTriggerDist = AndroidUtils.dpToPx(app, 3); - chart.setOnTouchListener(new BarLineChartTouchListener(chart, chart.getViewPortHandler().getMatrixTouch(), 3f) { - private PointF touchStartPoint = new PointF(); - - @SuppressLint("ClickableViewAccessibility") - @Override - public boolean onTouch(View v, MotionEvent event) { - switch (event.getAction() & MotionEvent.ACTION_MASK) { - case MotionEvent.ACTION_DOWN: - saveTouchStart(event); - break; - case MotionEvent.ACTION_POINTER_DOWN: - if (event.getPointerCount() >= 2) { - saveTouchStart(event); - } - break; - case MotionEvent.ACTION_MOVE: - if (mTouchMode == NONE && mChart.hasNoDragOffset()) { - float touchDistance = distance(event.getX(), touchStartPoint.x, event.getY(), touchStartPoint.y); - if (Math.abs(touchDistance) > minDragTriggerDist) { - mTouchMode = DRAG; - } - } - break; - } - return super.onTouch(v, event); - } - - private void saveTouchStart(MotionEvent event) { - touchStartPoint.x = event.getX(); - touchStartPoint.y = event.getY(); - } - }); +// final float minDragTriggerDist = AndroidUtils.dpToPx(app, 3); +// chart.setOnTouchListener(new BarLineChartTouchListener(chart, chart.getViewPortHandler().getMatrixTouch(), 3f) { +// private PointF touchStartPoint = new PointF(); +// +// @SuppressLint("ClickableViewAccessibility") +// @Override +// public boolean onTouch(View v, MotionEvent event) { +// switch (event.getAction() & MotionEvent.ACTION_MASK) { +// case MotionEvent.ACTION_DOWN: +// saveTouchStart(event); +// break; +// case MotionEvent.ACTION_POINTER_DOWN: +// if (event.getPointerCount() >= 2) { +// saveTouchStart(event); +// } +// break; +// case MotionEvent.ACTION_MOVE: +// if (mTouchMode == NONE && mChart.hasNoDragOffset()) { +// float touchDistance = distance(event.getX(), touchStartPoint.x, event.getY(), touchStartPoint.y); +// if (Math.abs(touchDistance) > minDragTriggerDist) { +// mTouchMode = DRAG; +// } +// } +// break; +// } +// return super.onTouch(v, event); +// } +// +// private void saveTouchStart(MotionEvent event) { +// touchStartPoint.x = event.getX(); +// touchStartPoint.y = event.getY(); +// } +// }); chart.setOnChartGestureListener(new OnChartGestureListener() { boolean hasTranslated = false; float highlightDrawX = -1; diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java index 5454febb86..74f636802a 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java @@ -2073,7 +2073,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route private void startTrackNavigation() { MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { - if (editingCtx.hasRoute()) { + if (editingCtx.hasRoute() || editingCtx.hasChanges()) { String trackName = getSuggestedFileName(); GPXFile gpx = editingCtx.exportGpx(trackName); if (gpx != null) { diff --git a/OsmAnd/src/net/osmand/plus/onlinerouting/engine/GpxEngine.java b/OsmAnd/src/net/osmand/plus/onlinerouting/engine/GpxEngine.java index 736d09611a..6dc5ed6d88 100644 --- a/OsmAnd/src/net/osmand/plus/onlinerouting/engine/GpxEngine.java +++ b/OsmAnd/src/net/osmand/plus/onlinerouting/engine/GpxEngine.java @@ -46,11 +46,15 @@ public class GpxEngine extends OnlineRoutingEngine { @Override protected void makeFullUrl(@NonNull StringBuilder sb, @NonNull List path) { + sb.append("?"); for (int i = 0; i < path.size(); i++) { LatLon point = path.get(i); - sb.append(point.getLongitude()).append(',').append(point.getLatitude()); + sb.append("point=") + .append(point.getLatitude()) + .append(',') + .append(point.getLongitude()); if (i < path.size() - 1) { - sb.append(';'); + sb.append('&'); } } } diff --git a/OsmAnd/src/net/osmand/plus/onlinerouting/engine/GraphhopperEngine.java b/OsmAnd/src/net/osmand/plus/onlinerouting/engine/GraphhopperEngine.java index ae62b8c71d..f86e8e66fc 100644 --- a/OsmAnd/src/net/osmand/plus/onlinerouting/engine/GraphhopperEngine.java +++ b/OsmAnd/src/net/osmand/plus/onlinerouting/engine/GraphhopperEngine.java @@ -87,16 +87,19 @@ public class GraphhopperEngine extends JsonOnlineRoutingEngine { protected void makeFullUrl(@NonNull StringBuilder sb, @NonNull List path) { sb.append("?"); - for (LatLon point : path) { + for (int i = 0; i < path.size(); i++) { + LatLon point = path.get(i); sb.append("point=") .append(point.getLatitude()) .append(',') - .append(point.getLongitude()) - .append('&'); + .append(point.getLongitude()); + if (i < path.size() - 1) { + sb.append('&'); + } } String vehicle = get(EngineParameter.VEHICLE_KEY); if (!isEmpty(vehicle)) { - sb.append("vehicle=").append(vehicle); + sb.append('&').append("vehicle=").append(vehicle); } String apiKey = get(EngineParameter.API_KEY); if (!isEmpty(apiKey)) { diff --git a/OsmAnd/src/net/osmand/plus/onlinerouting/engine/OnlineRoutingEngine.java b/OsmAnd/src/net/osmand/plus/onlinerouting/engine/OnlineRoutingEngine.java index 670375c0b5..f296115c3e 100644 --- a/OsmAnd/src/net/osmand/plus/onlinerouting/engine/OnlineRoutingEngine.java +++ b/OsmAnd/src/net/osmand/plus/onlinerouting/engine/OnlineRoutingEngine.java @@ -41,6 +41,8 @@ public abstract class OnlineRoutingEngine implements Cloneable { private final Set allowedParameters = new HashSet<>(); public OnlineRoutingEngine(@Nullable Map params) { + // Params represents the entire state of an engine object. + // An engine object with null params used only to provide information about the engine type if (!isEmpty(params)) { this.params.putAll(params); } diff --git a/OsmAnd/src/net/osmand/plus/osmedit/ShowHideOSMBugAction.java b/OsmAnd/src/net/osmand/plus/osmedit/ShowHideOSMBugAction.java index 39082ea6e9..5d2ed59049 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/ShowHideOSMBugAction.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/ShowHideOSMBugAction.java @@ -15,10 +15,10 @@ import net.osmand.plus.quickaction.QuickActionType; public class ShowHideOSMBugAction extends QuickAction { public static final QuickActionType TYPE = new QuickActionType(24, - "osmbug.showhide", ShowHideOSMBugAction.class). - nameRes(R.string.quick_action_showhide_osmbugs_title).iconRes(R.drawable.ic_action_osm_note).nonEditable(). - category(QuickActionType.CONFIGURE_MAP); - + "osmbug.showhide", ShowHideOSMBugAction.class) + .nameActionRes(R.string.quick_action_show_hide_title) + .nameRes(R.string.osm_notes).iconRes(R.drawable.ic_action_osm_note).nonEditable() + .category(QuickActionType.CONFIGURE_MAP); public ShowHideOSMBugAction() { super(TYPE); @@ -55,10 +55,9 @@ public class ShowHideOSMBugAction extends QuickAction { @Override public String getActionText(OsmandApplication application) { - - return application.getSettings().SHOW_OSM_BUGS.get() - ? application.getString(R.string.quick_action_osmbugs_hide) - : application.getString(R.string.quick_action_osmbugs_show); + String nameRes = application.getString(getNameRes()); + String actionName = isActionWithSlash(application) ? application.getString(R.string.shared_string_hide) : application.getString(R.string.shared_string_show); + return application.getString(R.string.ltr_or_rtl_combine_via_dash, actionName, nameRes); } @Override diff --git a/OsmAnd/src/net/osmand/plus/quickaction/AddQuickActionDialog.java b/OsmAnd/src/net/osmand/plus/quickaction/AddQuickActionDialog.java index 41a25beb12..9183338021 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/AddQuickActionDialog.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/AddQuickActionDialog.java @@ -53,7 +53,13 @@ public class AddQuickActionDialog extends MenuBottomSheetDialogFragment { null, false); TextView title = itemView.findViewById(R.id.title); ImageView icon = itemView.findViewById(R.id.image); - title.setText(action.getNameRes()); + if (action.getActionNameRes() != 0) { + String name = getString(action.getNameRes()); + String actionName = getString(action.getActionNameRes()); + title.setText(getString(R.string.ltr_or_rtl_combine_via_dash, actionName, name)); + } else { + title.setText(action.getNameRes()); + } icon.setImageResource(action.getIconRes()); items.add(new BaseBottomSheetItem.Builder() .setCustomView(itemView) diff --git a/OsmAnd/src/net/osmand/plus/quickaction/CreateEditActionDialog.java b/OsmAnd/src/net/osmand/plus/quickaction/CreateEditActionDialog.java index 81476161f9..819c0b9b77 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/CreateEditActionDialog.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/CreateEditActionDialog.java @@ -197,13 +197,12 @@ public class CreateEditActionDialog extends DialogFragment } private void setupHeader(View root, Bundle savedInstanceState){ - ImageView image = (ImageView) root.findViewById(R.id.image); - EditText name = (EditText) root.findViewById(R.id.name); + EditText nameEditText = (EditText) root.findViewById(R.id.name); int buttonsAndLinksTextColorResId = isLightContent ? R.color.active_buttons_and_links_text_light : R.color.active_buttons_and_links_text_dark; - name.setTextColor(ContextCompat.getColor(getContext(), buttonsAndLinksTextColorResId)); + nameEditText.setTextColor(ContextCompat.getColor(getContext(), buttonsAndLinksTextColorResId)); - name.addTextChangedListener(new TextWatcher() { + nameEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @@ -218,12 +217,20 @@ public class CreateEditActionDialog extends DialogFragment } }); - name.setEnabled(action.isActionEditable()); - action.setAutoGeneratedTitle(name); - - if (savedInstanceState == null) name.setText(action.getName(getContext())); - else action.setName(name.getText().toString()); + nameEditText.setEnabled(action.isActionEditable()); + action.setAutoGeneratedTitle(nameEditText); + if (savedInstanceState == null) { + String name = action.getName(getContext()); + if (action.getActionNameRes() != 0) { + String actionName = getString(action.getActionNameRes()); + nameEditText.setText(getString(R.string.ltr_or_rtl_combine_via_dash, actionName, name)); + } else { + nameEditText.setText(name); + } + } else { + action.setName(nameEditText.getText().toString()); + } image.setImageResource(action.getIconRes(getApplication())); } diff --git a/OsmAnd/src/net/osmand/plus/quickaction/QuickAction.java b/OsmAnd/src/net/osmand/plus/quickaction/QuickAction.java index c2e73cdc1b..dafbbbac49 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/QuickAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/QuickAction.java @@ -48,6 +48,10 @@ public class QuickAction { return actionType == null ? 0 : actionType.getNameRes(); } + public int getActionNameRes() { + return actionType == null ? 0 : actionType.getActionNameRes(); + } + public int getIconRes() { return actionType == null ? 0 : actionType.getIconRes(); } diff --git a/OsmAnd/src/net/osmand/plus/quickaction/QuickActionRegistry.java b/OsmAnd/src/net/osmand/plus/quickaction/QuickActionRegistry.java index 9ea226366a..f1d4bac7e5 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/QuickActionRegistry.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/QuickActionRegistry.java @@ -66,6 +66,8 @@ public class QuickActionRegistry { nameRes(R.string.quick_action_add_configure_map).category(QuickActionType.CONFIGURE_MAP); public static final QuickActionType TYPE_NAVIGATION = new QuickActionType(0, ""). nameRes(R.string.quick_action_add_navigation).category(QuickActionType.NAVIGATION); + public static final QuickActionType TYPE_CONFIGURE_SCREEN = new QuickActionType(0, ""). + nameRes(R.string.map_widget_config).category(QuickActionType.CONFIGURE_SCREEN); private final OsmandSettings settings; @@ -248,6 +250,7 @@ public class QuickActionRegistry { filterQuickActions(TYPE_ADD_ITEMS, result); filterQuickActions(TYPE_CONFIGURE_MAP, result); filterQuickActions(TYPE_NAVIGATION, result); + filterQuickActions(TYPE_CONFIGURE_SCREEN, result); return result; } diff --git a/OsmAnd/src/net/osmand/plus/quickaction/QuickActionType.java b/OsmAnd/src/net/osmand/plus/quickaction/QuickActionType.java index 4e201d06e0..9d29039764 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/QuickActionType.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/QuickActionType.java @@ -10,11 +10,13 @@ public class QuickActionType { public static final int CREATE_CATEGORY = 0; public static final int CONFIGURE_MAP = 1; public static final int NAVIGATION = 2; + public static final int CONFIGURE_SCREEN = 3; private final int id; private final String stringId; private boolean actionEditable; private @StringRes int nameRes; + private @StringRes int nameActionRes; private @DrawableRes int iconRes; private Class cl; private int category; @@ -36,6 +38,11 @@ public class QuickActionType { return this; } + public QuickActionType nameActionRes(int nameActionRes) { + this.nameActionRes = nameActionRes; + return this; + } + public QuickActionType category(int cat) { this.category = cat; return this; @@ -101,6 +108,10 @@ public class QuickActionType { return nameRes; } + public int getActionNameRes() { + return nameActionRes; + } + public int getIconRes() { return iconRes; } diff --git a/OsmAnd/src/net/osmand/plus/quickaction/actions/FavoriteAction.java b/OsmAnd/src/net/osmand/plus/quickaction/actions/FavoriteAction.java index fbe79b0681..ecd277b092 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/actions/FavoriteAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/actions/FavoriteAction.java @@ -22,6 +22,7 @@ import net.osmand.plus.activities.MapActivity; import net.osmand.plus.mapcontextmenu.editors.EditCategoryDialogFragment; import net.osmand.plus.mapcontextmenu.editors.FavoritePointEditor; import net.osmand.plus.mapcontextmenu.editors.SelectCategoryDialogFragment; +import net.osmand.plus.mapcontextmenu.editors.SelectFavoriteCategoryBottomSheet; import net.osmand.plus.quickaction.QuickAction; import net.osmand.plus.quickaction.QuickActionType; import net.osmand.plus.widgets.AutoCompleteTextViewEx; @@ -175,13 +176,13 @@ public class FavoriteAction extends QuickAction { @Override public void onClick(final View view) { - SelectCategoryDialogFragment dialogFragment = SelectCategoryDialogFragment.createInstance(""); + SelectFavoriteCategoryBottomSheet dialogFragment = SelectFavoriteCategoryBottomSheet.createInstance(""); dialogFragment.show( activity.getSupportFragmentManager(), SelectCategoryDialogFragment.TAG); - dialogFragment.setSelectionListener(new SelectCategoryDialogFragment.CategorySelectionListener() { + dialogFragment.setSelectionListener(new SelectFavoriteCategoryBottomSheet.CategorySelectionListener() { @Override public void onCategorySelected(String category, int color) { @@ -191,12 +192,12 @@ public class FavoriteAction extends QuickAction { } }); - SelectCategoryDialogFragment dialogFragment = (SelectCategoryDialogFragment) + SelectFavoriteCategoryBottomSheet dialogFragment = (SelectFavoriteCategoryBottomSheet) activity.getSupportFragmentManager().findFragmentByTag(SelectCategoryDialogFragment.TAG); if (dialogFragment != null) { - dialogFragment.setSelectionListener(new SelectCategoryDialogFragment.CategorySelectionListener() { + dialogFragment.setSelectionListener(new SelectFavoriteCategoryBottomSheet.CategorySelectionListener() { @Override public void onCategorySelected(String category, int color) { @@ -211,7 +212,7 @@ public class FavoriteAction extends QuickAction { if (dialog != null) { - dialogFragment.setSelectionListener(new SelectCategoryDialogFragment.CategorySelectionListener() { + dialogFragment.setSelectionListener(new SelectFavoriteCategoryBottomSheet.CategorySelectionListener() { @Override public void onCategorySelected(String category, int color) { diff --git a/OsmAnd/src/net/osmand/plus/quickaction/actions/GPXAction.java b/OsmAnd/src/net/osmand/plus/quickaction/actions/GPXAction.java index 6fc153bb23..d0bfd98cbf 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/actions/GPXAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/actions/GPXAction.java @@ -16,6 +16,7 @@ import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.mapcontextmenu.editors.EditCategoryDialogFragment; import net.osmand.plus.mapcontextmenu.editors.SelectCategoryDialogFragment; +import net.osmand.plus.mapcontextmenu.editors.SelectFavoriteCategoryBottomSheet; import net.osmand.plus.quickaction.QuickAction; import net.osmand.plus.quickaction.QuickActionType; import net.osmand.plus.widgets.AutoCompleteTextViewEx; @@ -119,13 +120,13 @@ public class GPXAction extends QuickAction { @Override public void onClick(final View view) { - SelectCategoryDialogFragment dialogFragment = SelectCategoryDialogFragment.createInstance(""); + SelectFavoriteCategoryBottomSheet dialogFragment = SelectFavoriteCategoryBottomSheet.createInstance(""); dialogFragment.show( activity.getSupportFragmentManager(), - SelectCategoryDialogFragment.TAG); + SelectFavoriteCategoryBottomSheet.TAG); - dialogFragment.setSelectionListener(new SelectCategoryDialogFragment.CategorySelectionListener() { + dialogFragment.setSelectionListener(new SelectFavoriteCategoryBottomSheet.CategorySelectionListener() { @Override public void onCategorySelected(String category, int color) { @@ -135,12 +136,12 @@ public class GPXAction extends QuickAction { } }); - SelectCategoryDialogFragment dialogFragment = (SelectCategoryDialogFragment) + SelectFavoriteCategoryBottomSheet dialogFragment = (SelectFavoriteCategoryBottomSheet) activity.getSupportFragmentManager().findFragmentByTag(SelectCategoryDialogFragment.TAG); if (dialogFragment != null) { - dialogFragment.setSelectionListener(new SelectCategoryDialogFragment.CategorySelectionListener() { + dialogFragment.setSelectionListener(new SelectFavoriteCategoryBottomSheet.CategorySelectionListener() { @Override public void onCategorySelected(String category, int color) { @@ -155,7 +156,7 @@ public class GPXAction extends QuickAction { if (dialog != null) { - dialogFragment.setSelectionListener(new SelectCategoryDialogFragment.CategorySelectionListener() { + dialogFragment.setSelectionListener(new SelectFavoriteCategoryBottomSheet.CategorySelectionListener() { @Override public void onCategorySelected(String category, int color) { diff --git a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideCoordinatesWidgetAction.java b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideCoordinatesWidgetAction.java index d0f0728c19..225fe3b0e3 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideCoordinatesWidgetAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideCoordinatesWidgetAction.java @@ -14,9 +14,10 @@ import net.osmand.plus.quickaction.QuickActionType; public class ShowHideCoordinatesWidgetAction extends QuickAction { public static final QuickActionType TYPE = new QuickActionType(35, "coordinates.showhide", ShowHideCoordinatesWidgetAction.class) - .nameRes(R.string.quick_action_showhide_coordinates_widget) + .nameActionRes(R.string.quick_action_show_hide_title) + .nameRes(R.string.coordinates_widget) .iconRes(R.drawable.ic_action_coordinates_widget).nonEditable() - .category(QuickActionType.CONFIGURE_MAP); + .category(QuickActionType.CONFIGURE_SCREEN); public ShowHideCoordinatesWidgetAction() { super(TYPE); @@ -49,10 +50,9 @@ public class ShowHideCoordinatesWidgetAction extends QuickAction { @Override public String getActionText(OsmandApplication application) { - - return application.getSettings().SHOW_COORDINATES_WIDGET.get() - ? application.getString(R.string.quick_action_coordinates_widget_hide) - : application.getString(R.string.quick_action_coordinates_widget_show); + String nameRes = application.getString(getNameRes()); + String actionName = isActionWithSlash(application) ? application.getString(R.string.shared_string_hide) : application.getString(R.string.shared_string_show); + return application.getString(R.string.ltr_or_rtl_combine_via_dash, actionName, nameRes); } @Override diff --git a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideFavoritesAction.java b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideFavoritesAction.java index 0bad3af2a9..019c27dc07 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideFavoritesAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideFavoritesAction.java @@ -14,11 +14,11 @@ import net.osmand.plus.quickaction.QuickActionType; public class ShowHideFavoritesAction extends QuickAction { public static final QuickActionType TYPE = new QuickActionType(4, - "favorites.showhide", ShowHideFavoritesAction.class). - nameRes(R.string.quick_action_showhide_favorites_title).iconRes(R.drawable.ic_action_favorite).nonEditable(). - category(QuickActionType.CONFIGURE_MAP); - - + "favorites.showhide", ShowHideFavoritesAction.class) + .nameActionRes(R.string.quick_action_show_hide_title) + .nameRes(R.string.shared_string_favorites) + .iconRes(R.drawable.ic_action_favorite).nonEditable() + .category(QuickActionType.CONFIGURE_MAP); public ShowHideFavoritesAction() { super(TYPE); @@ -51,10 +51,9 @@ public class ShowHideFavoritesAction extends QuickAction { @Override public String getActionText(OsmandApplication application) { - - return application.getSettings().SHOW_FAVORITES.get() - ? application.getString(R.string.quick_action_favorites_hide) - : application.getString(R.string.quick_action_favorites_show); + String nameRes = application.getString(getNameRes()); + String actionName = isActionWithSlash(application) ? application.getString(R.string.shared_string_hide) : application.getString(R.string.shared_string_show); + return application.getString(R.string.ltr_or_rtl_combine_via_dash, actionName, nameRes); } @Override diff --git a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideGpxTracksAction.java b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideGpxTracksAction.java index 34ce197220..49fb552e9f 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideGpxTracksAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideGpxTracksAction.java @@ -16,10 +16,10 @@ public class ShowHideGpxTracksAction extends QuickAction { public static final QuickActionType TYPE = new QuickActionType(28, - "gpx.showhide", ShowHideGpxTracksAction.class). - nameRes(R.string.quick_action_show_hide_gpx_tracks).iconRes(R.drawable.ic_action_polygom_dark).nonEditable(). - category(QuickActionType.CONFIGURE_MAP); - + "gpx.showhide", ShowHideGpxTracksAction.class) + .nameActionRes(R.string.quick_action_show_hide_title) + .nameRes(R.string.show_gpx).iconRes(R.drawable.ic_action_polygom_dark).nonEditable() + .category(QuickActionType.CONFIGURE_MAP); public ShowHideGpxTracksAction() { super(TYPE); @@ -54,9 +54,9 @@ public class ShowHideGpxTracksAction extends QuickAction { @Override public String getActionText(OsmandApplication application) { - return application.getSelectedGpxHelper().isShowingAnyGpxFiles() - ? application.getString(R.string.quick_action_gpx_tracks_hide) - : application.getString(R.string.quick_action_gpx_tracks_show); + String nameRes = application.getString(getNameRes()); + String actionName = isActionWithSlash(application) ? application.getString(R.string.shared_string_hide) : application.getString(R.string.shared_string_show); + return application.getString(R.string.ltr_or_rtl_combine_via_dash, actionName, nameRes); } @Override diff --git a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideMapillaryAction.java b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideMapillaryAction.java index ba6c7d7391..82fa73be91 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideMapillaryAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideMapillaryAction.java @@ -18,7 +18,8 @@ public class ShowHideMapillaryAction extends QuickAction { public static final QuickActionType TYPE = new QuickActionType(33, "mapillary.showhide", ShowHideMapillaryAction.class) - .nameRes(R.string.quick_action_showhide_mapillary_title) + .nameActionRes(R.string.quick_action_show_hide_title) + .nameRes(R.string.mapillary) .iconRes(R.drawable.ic_action_mapillary).nonEditable() .category(QuickActionType.CONFIGURE_MAP); @@ -56,10 +57,9 @@ public class ShowHideMapillaryAction extends QuickAction { @Override public String getActionText(OsmandApplication application) { - - return application.getSettings().SHOW_MAPILLARY.get() - ? application.getString(R.string.quick_action_mapillary_hide) - : application.getString(R.string.quick_action_mapillary_show); + String nameRes = application.getString(getNameRes()); + String actionName = isActionWithSlash(application) ? application.getString(R.string.shared_string_hide) : application.getString(R.string.shared_string_show); + return application.getString(R.string.ltr_or_rtl_combine_via_dash, actionName, nameRes); } @Override diff --git a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHidePoiAction.java b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHidePoiAction.java index 51b9b300ed..742045809c 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHidePoiAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHidePoiAction.java @@ -37,10 +37,11 @@ public class ShowHidePoiAction extends QuickAction { public static final QuickActionType TYPE = new QuickActionType(5, - "poi.showhide", ShowHidePoiAction.class). - nameRes(R.string.quick_action_showhide_poi_title).iconRes(R.drawable.ic_action_info_dark). - category(QuickActionType.CONFIGURE_MAP); - + "poi.showhide", ShowHidePoiAction.class) + .nameActionRes(R.string.quick_action_show_hide_title) + .nameRes(R.string.poi) + .iconRes(R.drawable.ic_action_info_dark) + .category(QuickActionType.CONFIGURE_MAP); public static final String KEY_FILTERS = "filters"; @@ -56,10 +57,8 @@ public class ShowHidePoiAction extends QuickAction { @Override public String getActionText(OsmandApplication application) { - - return !isCurrentFilters(application) - ? application.getString(R.string.quick_action_poi_show, getName(application)) - : application.getString(R.string.quick_action_poi_hide, getName(application)); + String actionName = isActionWithSlash(application) ? application.getString(R.string.shared_string_hide) : application.getString(R.string.shared_string_show); + return application.getString(R.string.ltr_or_rtl_combine_via_dash, actionName, getName(application)); } @Override diff --git a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideTransportLinesAction.java b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideTransportLinesAction.java index 61f04f2c6f..2e4dd985ed 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideTransportLinesAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideTransportLinesAction.java @@ -16,7 +16,8 @@ public class ShowHideTransportLinesAction extends QuickAction { public static final QuickActionType TYPE = new QuickActionType(31, "transport.showhide", ShowHideTransportLinesAction.class) - .nameRes(R.string.quick_action_show_hide_transport) + .nameActionRes(R.string.quick_action_show_hide_title) + .nameRes(R.string.poi_filter_public_transport) .iconRes(R.drawable.ic_action_transport_bus).nonEditable() .category(QuickActionType.CONFIGURE_MAP); @@ -48,10 +49,9 @@ public class ShowHideTransportLinesAction extends QuickAction { @Override public String getActionText(OsmandApplication application) { - - return TransportLinesMenu.isShowLines(application) - ? application.getString(R.string.quick_action_transport_hide) - : application.getString(R.string.quick_action_transport_show); + String nameRes = application.getString(getNameRes()); + String actionName = isActionWithSlash(application) ? application.getString(R.string.shared_string_hide) : application.getString(R.string.shared_string_show); + return application.getString(R.string.ltr_or_rtl_combine_via_dash, actionName, nameRes); } @Override diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java index 89afe180e2..e75efb2c25 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java @@ -58,7 +58,7 @@ import net.osmand.plus.routepreparationmenu.RouteDetailsFragment.CumulativeInfo; import net.osmand.plus.routepreparationmenu.RouteDetailsFragment.RouteDetailsFragmentListener; import net.osmand.plus.routepreparationmenu.cards.PublicTransportCard; import net.osmand.plus.routing.RouteDirectionInfo; -import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.TransportRoutingHelper; import net.osmand.plus.settings.backend.OsmandSettings; diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java index 93b26b82a4..b5abb80b65 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java @@ -58,8 +58,8 @@ import net.osmand.plus.routepreparationmenu.cards.SelectTrackCard; import net.osmand.plus.routepreparationmenu.cards.TrackEditCard; import net.osmand.plus.routepreparationmenu.cards.TracksToFollowCard; import net.osmand.plus.routing.IRouteInformationListener; -import net.osmand.plus.routing.RouteProvider; -import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; +import net.osmand.plus.routing.RouteService; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.track.TrackSelectSegmentBottomSheet; @@ -224,7 +224,7 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca RoutingHelper routingHelper = app.getRoutingHelper(); GPXRouteParamsBuilder rparams = routingHelper.getCurrentGPXRoute(); - boolean osmandRouter = mode.getRouteService() == RouteProvider.RouteService.OSMAND; + boolean osmandRouter = mode.getRouteService() == RouteService.OSMAND; if (rparams != null && osmandRouter) { cardsContainer.addView(buildDividerView(cardsContainer, false)); diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java index f88f499125..2475d70f34 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java @@ -100,7 +100,7 @@ import net.osmand.plus.routepreparationmenu.cards.SimpleRouteCard; import net.osmand.plus.routepreparationmenu.cards.TracksCard; import net.osmand.plus.routing.IRouteInformationListener; import net.osmand.plus.routing.RouteCalculationResult; -import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.RoutingHelperUtils; import net.osmand.plus.routing.TransportRoutingHelper; diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java index 25c158a042..9e3c633544 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java @@ -47,7 +47,8 @@ import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.OtherSettingsRo import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.RouteSimulationItem; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.ShowAlongTheRouteItem; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.TimeConditionalRoutingItem; -import net.osmand.plus.routing.RouteProvider; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; +import net.osmand.plus.routing.RouteService; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.CommonPreference; @@ -501,7 +502,7 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { } private BaseBottomSheetItem createGpxRoutingItem(final LocalRoutingParameter optionsItem) { - RouteProvider.GPXRouteParamsBuilder routeParamsBuilder = mapActivity.getRoutingHelper().getCurrentGPXRoute(); + GPXRouteParamsBuilder routeParamsBuilder = mapActivity.getRoutingHelper().getCurrentGPXRoute(); String description = null; int descriptionColorId; if (routeParamsBuilder == null) { @@ -661,11 +662,11 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { private List getRoutingParameters(ApplicationMode applicationMode) { List routingParameters; - boolean osmandRouter = applicationMode.getRouteService() == RouteProvider.RouteService.OSMAND; + boolean osmandRouter = applicationMode.getRouteService() == RouteService.OSMAND; if (!osmandRouter) { - if (applicationMode.getRouteService() == RouteProvider.RouteService.STRAIGHT) { + if (applicationMode.getRouteService() == RouteService.STRAIGHT) { routingParameters = AppModeOptions.STRAIGHT.routingParameters; - } else if (applicationMode.getRouteService() == RouteProvider.RouteService.DIRECT_TO) { + } else if (applicationMode.getRouteService() == RouteService.DIRECT_TO) { routingParameters = AppModeOptions.DIRECT_TO.routingParameters; } else { routingParameters = AppModeOptions.OTHER.routingParameters; diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java index 165ca20944..5f405c90b6 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java @@ -37,9 +37,8 @@ import net.osmand.plus.dashboard.DashboardOnMap; import net.osmand.plus.download.DownloadActivity; import net.osmand.plus.download.DownloadActivityType; import net.osmand.plus.helpers.FileNameTranslationHelper; -import net.osmand.plus.routing.RouteProvider; -import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; -import net.osmand.plus.routing.RouteProvider.RouteService; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; +import net.osmand.plus.routing.RouteService; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.voice.JSMediaCommandPlayerImpl; @@ -243,24 +242,25 @@ public class RoutingOptionsHelper { TargetPointsHelper tg = app.getTargetPointsHelper(); List ps = rp.getPoints(app); if (ps.size() > 0) { + TargetPoint pointToStart = tg.getPointToStart(); + TargetPoint pointToNavigate = tg.getPointToNavigate(); if (rp.getFile().hasRoute()) { tg.clearStartPoint(false); Location finishLoc = ps.get(ps.size() - 1); - TargetPoint pn = tg.getPointToNavigate(); - tg.navigateToPoint(new LatLon(finishLoc.getLatitude(), finishLoc.getLongitude()), false, -1, pn != null ? pn.getOriginalPointDescription() : null); + tg.navigateToPoint(new LatLon(finishLoc.getLatitude(), finishLoc.getLongitude()), + false, -1, pointToNavigate != null ? pointToNavigate.getOriginalPointDescription() : null); tg.updateRouteAndRefresh(true); } else { Location first = ps.get(0); Location end = ps.get(ps.size() - 1); - TargetPoint pn = tg.getPointToNavigate(); boolean update = false; - if (pn == null - || MapUtils.getDistance(pn.point, new LatLon(first.getLatitude(), first.getLongitude())) < 10) { + if (pointToNavigate == null + || MapUtils.getDistance(pointToNavigate.point, new LatLon(first.getLatitude(), first.getLongitude())) < 10) { tg.navigateToPoint(new LatLon(end.getLatitude(), end.getLongitude()), false, -1); update = true; } - if (tg.getPointToStart() == null - || MapUtils.getDistance(tg.getPointToStart().point, + if (pointToStart == null + || MapUtils.getDistance(pointToStart.point, new LatLon(end.getLatitude(), end.getLongitude())) < 10) { tg.setStartPoint(new LatLon(first.getLatitude(), first.getLongitude()), false, null); update = true; @@ -458,7 +458,7 @@ public class RoutingOptionsHelper { public List getOsmandRouterParameters(ApplicationMode am) { OsmandSettings settings = app.getSettings(); List list = new ArrayList(); - boolean osmandRouter = am.getRouteService() == RouteProvider.RouteService.OSMAND; + boolean osmandRouter = am.getRouteService() == RouteService.OSMAND; if (!osmandRouter) { list.add(new OtherLocalRoutingParameter(R.string.calculate_osmand_route_without_internet, app.getString(R.string.calculate_osmand_route_without_internet), settings.GPX_ROUTE_CALC_OSMAND_PARTS.get())); @@ -490,7 +490,7 @@ public class RoutingOptionsHelper { } public List getRoutingParametersInner(ApplicationMode am) { - boolean osmandRouter = am.getRouteService() == RouteProvider.RouteService.OSMAND; + boolean osmandRouter = am.getRouteService() == RouteService.OSMAND; if (!osmandRouter) { return getOsmandRouterParameters(am); } @@ -1061,7 +1061,7 @@ public class RoutingOptionsHelper { private List getRoutingParametersForProfileType(ApplicationMode appMode) { if (appMode != null) { - boolean osmandRouter = appMode.getRouteService() == RouteProvider.RouteService.OSMAND; + boolean osmandRouter = appMode.getRouteService() == RouteService.OSMAND; if (!osmandRouter) { return PermanentAppModeOptions.OTHER.routingParameters; } else if (appMode.isDerivedRoutingFrom(ApplicationMode.CAR)) { diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/TrackEditCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/TrackEditCard.java index 646e2da386..e924b46aba 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/TrackEditCard.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/TrackEditCard.java @@ -20,7 +20,7 @@ import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper.GPXInfo; import net.osmand.plus.helpers.TrackSelectSegmentAdapter; -import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.util.Algorithms; import java.io.File; diff --git a/OsmAnd/src/net/osmand/plus/routing/GPXRouteParams.java b/OsmAnd/src/net/osmand/plus/routing/GPXRouteParams.java new file mode 100644 index 0000000000..9290195acd --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/routing/GPXRouteParams.java @@ -0,0 +1,214 @@ +package net.osmand.plus.routing; + +import net.osmand.GPXUtilities.GPXFile; +import net.osmand.GPXUtilities.Route; +import net.osmand.GPXUtilities.WptPt; +import net.osmand.Location; +import net.osmand.PlatformUtil; +import net.osmand.data.LatLon; +import net.osmand.data.LocationPoint; +import net.osmand.data.WptLocationPoint; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.router.RouteSegmentResult; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static net.osmand.plus.routing.RouteProvider.collectSegmentPointsFromGpx; +import static net.osmand.router.RouteExporter.OSMAND_ROUTER_V2; + +public class GPXRouteParams { + + private static final String OSMAND_ROUTER = "OsmAndRouter"; + + protected List wpt; + protected List route; + protected List directions; + protected List points = new ArrayList<>(); + protected List segmentEndpoints = new ArrayList<>(); + protected List routePoints = new ArrayList<>(); + protected boolean reverse; + protected boolean passWholeRoute; + protected boolean calculateOsmAndRoute; + protected boolean useIntermediatePointsRTE; + protected boolean calculateOsmAndRouteParts; + + boolean addMissingTurns = true; + + public List getPoints() { + return points; + } + + public List getWpt() { + return wpt; + } + + public Location getStartPointForRoute() { + if (!points.isEmpty()) { + return points.get(0); + } + return null; + } + + public Location getEndPointForRoute() { + if (!points.isEmpty()) { + return points.get(points.size()); + } + return null; + } + + public LatLon getLastPoint() { + if (!points.isEmpty()) { + Location l = points.get(points.size() - 1); + return new LatLon(l.getLatitude(), l.getLongitude()); + } + return null; + } + + public GPXRouteParams prepareGPXFile(GPXRouteParamsBuilder builder) { + GPXFile file = builder.file; + reverse = builder.reverse; + passWholeRoute = builder.passWholeRoute; + calculateOsmAndRouteParts = builder.calculateOsmAndRouteParts; + useIntermediatePointsRTE = builder.isUseIntermediatePointsRTE(); + builder.calculateOsmAndRoute = false; // Disabled temporary builder.calculateOsmAndRoute; + if (!file.isPointsEmpty()) { + wpt = new ArrayList(file.getPoints().size()); + for (WptPt w : file.getPoints()) { + wpt.add(new WptLocationPoint(w)); + } + } + int selectedSegment = builder.getSelectedSegment(); + if (OSMAND_ROUTER_V2.equals(file.author)) { + route = RouteProvider.parseOsmAndGPXRoute(points, file, segmentEndpoints, selectedSegment); + if (selectedSegment == -1) { + routePoints = file.getRoutePoints(); + } else { + routePoints = file.getRoutePoints(selectedSegment); + } + if (reverse) { + Collections.reverse(points); + Collections.reverse(routePoints); + Collections.reverse(segmentEndpoints); + } + addMissingTurns = route != null && route.isEmpty(); + } else if (file.isCloudmadeRouteFile() || OSMAND_ROUTER.equals(file.author)) { + directions = RouteProvider.parseOsmAndGPXRoute(points, file, segmentEndpoints, + OSMAND_ROUTER.equals(file.author), builder.leftSide, 10, selectedSegment); + if (OSMAND_ROUTER.equals(file.author) && file.hasRtePt()) { + // For files generated by OSMAND_ROUTER use directions contained unaltered + addMissingTurns = false; + } + if (reverse) { + // clear directions all turns should be recalculated + directions = null; + Collections.reverse(points); + Collections.reverse(segmentEndpoints); + addMissingTurns = true; + } + } else { + // first of all check tracks + if (!useIntermediatePointsRTE) { + collectSegmentPointsFromGpx(file, points, segmentEndpoints, selectedSegment); + } + if (points.isEmpty()) { + for (Route rte : file.routes) { + for (WptPt pt : rte.points) { + points.add(RouteProvider.createLocation(pt)); + } + } + } + if (reverse) { + Collections.reverse(points); + Collections.reverse(segmentEndpoints); + } + } + return this; + } + + public static class GPXRouteParamsBuilder { + + private static final org.apache.commons.logging.Log log = PlatformUtil.getLog(GPXRouteParamsBuilder.class); + + boolean calculateOsmAndRoute = false; + // parameters + private final GPXFile file; + private boolean reverse; + private boolean leftSide; + private boolean passWholeRoute; + private boolean calculateOsmAndRouteParts; + private int selectedSegment = -1; + + public GPXRouteParamsBuilder(GPXFile file, OsmandSettings settings) { + leftSide = settings.DRIVING_REGION.get().leftHandDriving; + this.file = file; + } + + public boolean isReverse() { + return reverse; + } + + public boolean isCalculateOsmAndRouteParts() { + return calculateOsmAndRouteParts; + } + + public void setCalculateOsmAndRouteParts(boolean calculateOsmAndRouteParts) { + this.calculateOsmAndRouteParts = calculateOsmAndRouteParts; + } + + public boolean isUseIntermediatePointsRTE() { + return file.hasRtePt() && !file.hasTrkPt(); + } + + public boolean isCalculateOsmAndRoute() { + return calculateOsmAndRoute; + } + + public void setCalculateOsmAndRoute(boolean calculateOsmAndRoute) { + this.calculateOsmAndRoute = calculateOsmAndRoute; + } + + public int getSelectedSegment() { + return selectedSegment; + } + + public void setSelectedSegment(int selectedSegment) { + this.selectedSegment = selectedSegment; + } + + public void setPassWholeRoute(boolean passWholeRoute) { + this.passWholeRoute = passWholeRoute; + } + + public boolean isPassWholeRoute() { + return passWholeRoute; + } + + public GPXRouteParams build(OsmandApplication app) { + GPXRouteParams res = new GPXRouteParams(); + try { + res.prepareGPXFile(this); + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + app.showShortToastMessage(app.getString(R.string.gpx_parse_error) + " " + e.getMessage()); + } + return res; + } + + public void setReverse(boolean reverse) { + this.reverse = reverse; + } + + public GPXFile getFile() { + return file; + } + + public List getPoints(OsmandApplication app) { + GPXRouteParams copy = build(app); + return copy.getPoints(); + } + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/routing/GpxApproximator.java b/OsmAnd/src/net/osmand/plus/routing/GpxApproximator.java index 65e683a734..ca10de2812 100644 --- a/OsmAnd/src/net/osmand/plus/routing/GpxApproximator.java +++ b/OsmAnd/src/net/osmand/plus/routing/GpxApproximator.java @@ -7,7 +7,6 @@ import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.data.LatLon; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.routing.RouteProvider.RoutingEnvironment; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.router.RouteCalculationProgress; import net.osmand.router.RoutePlannerFrontEnd.GpxPoint; diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationParams.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationParams.java index 7b38b5c91a..0c4f2a4cb6 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationParams.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationParams.java @@ -4,7 +4,6 @@ import net.osmand.Location; import net.osmand.data.LatLon; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.routing.RouteProvider.GPXRouteParams; import net.osmand.router.RouteCalculationProgress; import java.util.List; diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java index e6efcc321f..7b7bd7d8d9 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java @@ -15,7 +15,6 @@ import net.osmand.data.QuadRect; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.routing.AlarmInfo.AlarmInfoType; -import net.osmand.plus.routing.RouteProvider.RouteService; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.router.ExitInfo; import net.osmand.router.RouteSegmentResult; @@ -291,12 +290,16 @@ public class RouteCalculationResult { } public List getOriginalRoute(int startIndex) { + return getOriginalRoute(startIndex, segments.size()); + } + + public List getOriginalRoute(int startIndex, int endIndex) { if (segments.size() == 0) { return null; } - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(segments.get(startIndex++)); - for (int i = startIndex; i < segments.size(); i++) { + for (int i = startIndex; i < endIndex; i++) { if (segments.get(i - 1) != segments.get(i)) { list.add(segments.get(i)); } diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index 19d0fcd3f7..e5974fc32d 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -1,7 +1,6 @@ package net.osmand.plus.routing; -import android.content.Context; import android.os.Bundle; import android.util.Base64; @@ -16,8 +15,6 @@ import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.binary.BinaryMapIndexReader; import net.osmand.data.LatLon; -import net.osmand.data.LocationPoint; -import net.osmand.data.WptLocationPoint; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.TargetPointsHelper; @@ -25,6 +22,7 @@ import net.osmand.plus.TargetPointsHelper.TargetPoint; import net.osmand.plus.onlinerouting.OnlineRoutingHelper; import net.osmand.plus.onlinerouting.engine.OnlineRoutingEngine.OnlineRoutingResponse; import net.osmand.plus.render.NativeOsmandLibrary; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.CommonPreference; import net.osmand.plus.settings.backend.OsmandSettings; @@ -70,279 +68,14 @@ import javax.xml.parsers.ParserConfigurationException; import btools.routingapp.IBRouterService; -import static net.osmand.router.RouteExporter.OSMAND_ROUTER_V2; - public class RouteProvider { + private static final org.apache.commons.logging.Log log = PlatformUtil.getLog(RouteProvider.class); - private static final String OSMAND_ROUTER = "OsmAndRouter"; private static final int MIN_DISTANCE_FOR_INSERTING_ROUTE_SEGMENT = 60; private static final int ADDITIONAL_DISTANCE_FOR_START_POINT = 300; private static final int MIN_STRAIGHT_DIST = 50000; - public enum RouteService { - OSMAND("OsmAnd (offline)"), - BROUTER("BRouter (offline)"), - STRAIGHT("Straight line"), - DIRECT_TO("Direct To"), - ONLINE("Online engine"); - - private final String name; - - RouteService(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public boolean isOnline() { - return this != OSMAND && this != BROUTER; - } - - boolean isAvailable(OsmandApplication ctx) { - if (this == BROUTER) { - return ctx.getBRouterService() != null; - } - return true; - } - - public static RouteService[] getAvailableRouters(OsmandApplication ctx) { - List list = new ArrayList<>(); - for (RouteService r : values()) { - if (r.isAvailable(ctx)) { - list.add(r); - } - } - return list.toArray(new RouteService[0]); - } - } - - public static class RoutingEnvironment { - private RoutePlannerFrontEnd router; - private RoutingContext ctx; - private RoutingContext complexCtx; - private PrecalculatedRouteDirection precalculated; - - public RoutingEnvironment(RoutePlannerFrontEnd router, RoutingContext ctx, RoutingContext complexCtx, PrecalculatedRouteDirection precalculated) { - this.router = router; - this.ctx = ctx; - this.complexCtx = complexCtx; - this.precalculated = precalculated; - } - - public RoutePlannerFrontEnd getRouter() { - return router; - } - - public RoutingContext getCtx() { - return ctx; - } - - public RoutingContext getComplexCtx() { - return complexCtx; - } - - public PrecalculatedRouteDirection getPrecalculated() { - return precalculated; - } - } - - public RouteProvider() { - } - - public static class GPXRouteParamsBuilder { - boolean calculateOsmAndRoute = false; - // parameters - private final GPXFile file; - private boolean reverse; - private boolean leftSide; - private boolean passWholeRoute; - private boolean calculateOsmAndRouteParts; - private int selectedSegment = -1; - - public GPXRouteParamsBuilder(GPXFile file, OsmandSettings settings) { - leftSide = settings.DRIVING_REGION.get().leftHandDriving; - this.file = file; - } - - public boolean isReverse() { - return reverse; - } - - public boolean isCalculateOsmAndRouteParts() { - return calculateOsmAndRouteParts; - } - - public void setCalculateOsmAndRouteParts(boolean calculateOsmAndRouteParts) { - this.calculateOsmAndRouteParts = calculateOsmAndRouteParts; - } - - public boolean isUseIntermediatePointsRTE() { - return file.hasRtePt() && !file.hasTrkPt(); - } - - public boolean isCalculateOsmAndRoute() { - return calculateOsmAndRoute; - } - - public void setCalculateOsmAndRoute(boolean calculateOsmAndRoute) { - this.calculateOsmAndRoute = calculateOsmAndRoute; - } - - public int getSelectedSegment() { - return selectedSegment; - } - - public void setSelectedSegment(int selectedSegment) { - this.selectedSegment = selectedSegment; - } - - public void setPassWholeRoute(boolean passWholeRoute) { - this.passWholeRoute = passWholeRoute; - } - - public boolean isPassWholeRoute() { - return passWholeRoute; - } - - public GPXRouteParams build(OsmandApplication app) { - GPXRouteParams res = new GPXRouteParams(); - try { - res.prepareGPXFile(this); - } catch (RuntimeException e) { - log.error(e.getMessage(), e); - app.showShortToastMessage(app.getString(R.string.gpx_parse_error) + " " + e.getMessage()); - } - return res; - } - - public void setReverse(boolean reverse) { - this.reverse = reverse; - } - - public GPXFile getFile() { - return file; - } - - public List getPoints(OsmandApplication app) { - GPXRouteParams copy = build(app); - return copy.getPoints(); - } - } - - public static class GPXRouteParams { - List points = new ArrayList<>(); - List directions; - List route; - List routePoints = new ArrayList<>(); - boolean reverse; - boolean calculateOsmAndRoute; - boolean passWholeRoute; - boolean calculateOsmAndRouteParts; - boolean useIntermediatePointsRTE; - private List wpt; - - boolean addMissingTurns = true; - - public List getPoints() { - return points; - } - - public Location getStartPointForRoute(){ - if(!points.isEmpty()){ - return points.get(0); - } - return null; - } - - public Location getEndPointForRoute(){ - if(!points.isEmpty()){ - return points.get(points.size()); - } - return null; - } - - public LatLon getLastPoint() { - if(!points.isEmpty()){ - Location l = points.get(points.size() - 1); - LatLon point = new LatLon(l.getLatitude(), l.getLongitude()); - return point; - } - return null; - } - - public GPXRouteParams prepareGPXFile(GPXRouteParamsBuilder builder) { - GPXFile file = builder.file; - reverse = builder.reverse; - passWholeRoute = builder.passWholeRoute; - calculateOsmAndRouteParts = builder.calculateOsmAndRouteParts; - useIntermediatePointsRTE = builder.isUseIntermediatePointsRTE(); - builder.calculateOsmAndRoute = false; // Disabled temporary builder.calculateOsmAndRoute; - if (!file.isPointsEmpty()) { - wpt = new ArrayList(file.getPoints().size()); - for(WptPt w : file.getPoints()) { - wpt.add(new WptLocationPoint(w)); - } - } - int selectedSegment = builder.getSelectedSegment(); - if (OSMAND_ROUTER_V2.equals(file.author)) { - route = parseOsmAndGPXRoute(points, file, selectedSegment); - if (selectedSegment == -1) { - routePoints = file.getRoutePoints(); - } else { - routePoints = file.getRoutePoints(selectedSegment); - } - if (reverse) { - Collections.reverse(points); - Collections.reverse(routePoints); - } - addMissingTurns = route != null && route.isEmpty(); - } else if (file.isCloudmadeRouteFile() || OSMAND_ROUTER.equals(file.author)) { - directions = parseOsmAndGPXRoute(points, file, OSMAND_ROUTER.equals(file.author), builder.leftSide, 10, selectedSegment); - if (OSMAND_ROUTER.equals(file.author) && file.hasRtePt()) { - // For files generated by OSMAND_ROUTER use directions contained unaltered - addMissingTurns = false; - } - if (reverse) { - // clear directions all turns should be recalculated - directions = null; - Collections.reverse(points); - addMissingTurns = true; - } - } else { - // first of all check tracks - if (!useIntermediatePointsRTE) { - List segments = file.getNonEmptyTrkSegments(false); - if (selectedSegment != -1 && segments.size() > selectedSegment) { - TrkSegment segment = segments.get(selectedSegment); - for (WptPt p : segment.points) { - points.add(createLocation(p)); - } - } else { - for (TrkSegment tkSeg : segments) { - for (WptPt p : tkSeg.points) { - points.add(createLocation(p)); - } - } - } - } - if (points.isEmpty()) { - for (Route rte : file.routes) { - for (WptPt pt : rte.points) { - points.add(createLocation(pt)); - } - } - } - if (reverse) { - Collections.reverse(points); - } - } - return this; - } - } - public static Location createLocation(WptPt pt){ Location loc = new Location("OsmandRouteProvider"); loc.setLatitude(pt.lat); @@ -420,8 +153,9 @@ public class RouteProvider { GPXRouteParams gpxParams = routeParams.gpxRoute; boolean calcWholeRoute = routeParams.gpxRoute.passWholeRoute && (routeParams.previousToRecalculate == null || !routeParams.onlyStartPointChanged); boolean calculateOsmAndRouteParts = gpxParams.calculateOsmAndRouteParts; + boolean reverseRoutePoints = gpxParams.reverse && gpxParams.routePoints.size() > 1; List gpxRouteResult = routeParams.gpxRoute.route; - if (gpxParams.reverse && gpxParams.routePoints.size() > 1) { + if (reverseRoutePoints) { List gpxRouteLocations = new ArrayList<>(); List gpxRoute = new ArrayList<>(); WptPt firstGpxPoint = gpxParams.routePoints.get(0); @@ -481,18 +215,25 @@ public class RouteProvider { List firstSegmentRoute = null; List lastSegmentRoute = null; List gpxRoute; + if (nearestGpxPointInd > 0) { nearestGpxLocation = gpxRouteLocations.get(nearestGpxPointInd); - gpxRoute = result.getOriginalRoute(nearestGpxPointInd); - if (gpxRoute.size() > 0) { - gpxRoute.remove(0); - } - } else { - if (!gpxRouteLocations.isEmpty()) { - nearestGpxLocation = gpxRouteLocations.get(0); - } - gpxRoute = result.getOriginalRoute(); + } else if (!gpxRouteLocations.isEmpty()) { + nearestGpxLocation = gpxRouteLocations.get(0); } + if (calculateOsmAndRouteParts && !reverseRoutePoints && !Algorithms.isEmpty(gpxParams.segmentEndpoints)) { + gpxRoute = findRouteWithIntermediateSegments(routeParams, result, gpxRouteLocations, gpxParams.segmentEndpoints, nearestGpxPointInd); + } else { + if (nearestGpxPointInd > 0) { + gpxRoute = result.getOriginalRoute(nearestGpxPointInd); + if (gpxRoute.size() > 0) { + gpxRoute.remove(0); + } + } else { + gpxRoute = result.getOriginalRoute(); + } + } + if (calculateOsmAndRouteParts && routeParams.start != null && nearestGpxLocation != null && nearestGpxLocation.distanceTo(routeParams.start) > MIN_DISTANCE_FOR_INSERTING_ROUTE_SEGMENT) { @@ -534,6 +275,7 @@ public class RouteProvider { } final List inputDirections = gpxParams.directions; List gpxDirections = calcDirections(startI, endI, inputDirections); + insertIntermediateSegments(routeParams, gpxRoute, gpxDirections, gpxParams.segmentEndpoints, calculateOsmAndRouteParts); insertInitialSegment(routeParams, gpxRoute, gpxDirections, calculateOsmAndRouteParts); insertFinalSegment(routeParams, gpxRoute, gpxDirections, calculateOsmAndRouteParts); @@ -683,6 +425,68 @@ public class RouteProvider { } } + public void insertIntermediateSegments(RouteCalculationParams routeParams, List points, List directions, + List segmentEndpoints, boolean calculateOsmAndRouteParts) { + for (int i = 0; i < segmentEndpoints.size() - 1; i++) { + Location prevSegmentPoint = segmentEndpoints.get(i); + Location newSegmentPoint = segmentEndpoints.get(i + 1); + + if (prevSegmentPoint.distanceTo(newSegmentPoint) <= MIN_DISTANCE_FOR_INSERTING_ROUTE_SEGMENT) { + continue; + } + int index = points.indexOf(newSegmentPoint); + if (calculateOsmAndRouteParts && index != -1 && points.contains(prevSegmentPoint)) { + LatLon end = new LatLon(newSegmentPoint.getLatitude(), newSegmentPoint.getLongitude()); + RouteCalculationResult newRes = findOfflineRouteSegment(routeParams, prevSegmentPoint, end); + + if (newRes != null && newRes.isCalculated()) { + List loct = newRes.getImmutableAllLocations(); + List dt = newRes.getImmutableAllDirections(); + + for (RouteDirectionInfo directionInfo : dt) { + directionInfo.routePointOffset += points.size(); + } + points.addAll(index, loct); + directions.addAll(dt); + } + } + } + } + + public List findRouteWithIntermediateSegments(RouteCalculationParams routeParams, + RouteCalculationResult result, + List gpxRouteLocations, + List segmentEndpoints, + int nearestGpxPointInd) { + List newGpxRoute = new ArrayList<>(); + + int lastIndex = nearestGpxPointInd; + for (int i = 0; i < segmentEndpoints.size() - 1; i++) { + Location prevSegmentPoint = segmentEndpoints.get(i); + Location newSegmentPoint = segmentEndpoints.get(i + 1); + + if (prevSegmentPoint.distanceTo(newSegmentPoint) <= MIN_DISTANCE_FOR_INSERTING_ROUTE_SEGMENT) { + continue; + } + int indexNew = findNearestGpxPointIndexFromRoute(gpxRouteLocations, newSegmentPoint, routeParams.gpxRoute.calculateOsmAndRouteParts); + int indexPrev = findNearestGpxPointIndexFromRoute(gpxRouteLocations, prevSegmentPoint, routeParams.gpxRoute.calculateOsmAndRouteParts); + if (indexPrev != -1 && indexPrev > nearestGpxPointInd && indexNew != -1) { + newGpxRoute.addAll(result.getOriginalRoute(lastIndex, indexPrev)); + lastIndex = indexNew; + + LatLon end = new LatLon(newSegmentPoint.getLatitude(), newSegmentPoint.getLongitude()); + RouteCalculationResult newRes = findOfflineRouteSegment(routeParams, prevSegmentPoint, end); + List segmentResults = newRes.getOriginalRoute(); + if (!Algorithms.isEmpty(segmentResults)) { + newGpxRoute.addAll(segmentResults); + } + } + } + newGpxRoute.addAll(result.getOriginalRoute(lastIndex)); + + return newGpxRoute; + } + private RouteCalculationResult findOfflineRouteSegment(RouteCalculationParams rParams, Location start, LatLon end) { RouteCalculationParams newParams = new RouteCalculationParams(); @@ -771,13 +575,6 @@ public class RouteProvider { return nearestPointIndex; } - protected String getString(Context ctx, int resId){ - if(ctx == null){ - return ""; //$NON-NLS-1$ - } - return ctx.getString(resId); - } - public RoutingEnvironment getRoutingEnvironment(OsmandApplication ctx, ApplicationMode mode, LatLon start, LatLon end) throws IOException { RouteCalculationParams params = new RouteCalculationParams(); params.ctx = ctx; @@ -788,11 +585,11 @@ public class RouteProvider { } public List generateGpxPoints(RoutingEnvironment env, GpxRouteApproximation gctx, LocationsHolder locationsHolder) { - return env.router.generateGpxPoints(gctx, locationsHolder); + return env.getRouter().generateGpxPoints(gctx, locationsHolder); } public GpxRouteApproximation calculateGpxPointsApproximation(RoutingEnvironment env, GpxRouteApproximation gctx, List points, ResultMatcher resultMatcher) throws IOException, InterruptedException { - return env.router.searchGpxRoute(gctx, points, resultMatcher); + return env.getRouter().searchGpxRoute(gctx, points, resultMatcher); } protected RoutingEnvironment calculateRoutingEnvironment(RouteCalculationParams params, boolean calcGPXRoute, boolean skipComplex) throws IOException { @@ -885,7 +682,7 @@ public class RouteProvider { if (params.intermediates != null) { inters = new ArrayList(params.intermediates); } - return calcOfflineRouteImpl(params, env.router, env.ctx, env.complexCtx, st, en, inters, env.precalculated); + return calcOfflineRouteImpl(params, env.getRouter(), env.getCtx(), env.getComplexCtx(), st, en, inters, env.getPrecalculated()); } private RoutingConfiguration initOsmAndRoutingConfig(Builder config, final RouteCalculationParams params, OsmandSettings settings, @@ -1012,7 +809,9 @@ public class RouteProvider { return new RouteCalculationResult("Empty result"); } - private static List parseOsmAndGPXRoute(List points, GPXFile gpxFile, int selectedSegment) { + protected static List parseOsmAndGPXRoute(List points, GPXFile gpxFile, + List segmentEndpoints, + int selectedSegment) { List segments = gpxFile.getNonEmptyTrkSegments(false); if (selectedSegment != -1 && segments.size() > selectedSegment) { TrkSegment segment = segments.get(selectedSegment); @@ -1022,37 +821,51 @@ public class RouteProvider { RouteImporter routeImporter = new RouteImporter(segment); return routeImporter.importRoute(); } else { - for (TrkSegment ts : segments) { - for (WptPt p : ts.points) { - points.add(createLocation(p)); - } - } + collectPointsFromSegments(segments, points, segmentEndpoints); RouteImporter routeImporter = new RouteImporter(gpxFile); return routeImporter.importRoute(); } } - private static List parseOsmAndGPXRoute(List points, GPXFile gpxFile, boolean osmandRouter, - boolean leftSide, float defSpeed, int selectedSegment) { + protected static void collectSegmentPointsFromGpx(GPXFile gpxFile, List points, + List segmentEndpoints, int selectedSegment) { + List segments = gpxFile.getNonEmptyTrkSegments(false); + if (selectedSegment != -1 && segments.size() > selectedSegment) { + TrkSegment segment = segments.get(selectedSegment); + for (WptPt wptPt : segment.points) { + points.add(createLocation(wptPt)); + } + } else { + collectPointsFromSegments(segments, points, segmentEndpoints); + } + } + + protected static void collectPointsFromSegments(List segments, List points, List segmentEndpoints) { + Location lastPoint = null; + for (int i = 0; i < segments.size(); i++) { + TrkSegment segment = segments.get(i); + for (WptPt wptPt : segment.points) { + points.add(createLocation(wptPt)); + } + if (i <= segments.size() - 1 && lastPoint != null) { + segmentEndpoints.add(lastPoint); + segmentEndpoints.add(points.get((points.size() - segment.points.size()))); + } + lastPoint = points.get(points.size() - 1); + } + } + + protected static List parseOsmAndGPXRoute(List points, GPXFile gpxFile, + List segmentEndpoints, + boolean osmandRouter, boolean leftSide, + float defSpeed, int selectedSegment) { List directions = null; if (!osmandRouter) { for (WptPt pt : gpxFile.getPoints()) { points.add(createLocation(pt)); } } else { - List segments = gpxFile.getNonEmptyTrkSegments(false); - if (selectedSegment != -1 && segments.size() > selectedSegment) { - TrkSegment segment = segments.get(selectedSegment); - for (WptPt p : segment.points) { - points.add(createLocation(p)); - } - } else { - for (TrkSegment ts : segments) { - for (WptPt p : ts.points) { - points.add(createLocation(p)); - } - } - } + collectSegmentPointsFromGpx(gpxFile, points, segmentEndpoints, selectedSegment); } float[] distanceToEnd = new float[points.size()]; for (int i = points.size() - 2; i >= 0; i--) { @@ -1317,9 +1130,10 @@ public class RouteProvider { bpars.putString("turnInstructionFormat", "osmand"); bpars.putString("acceptCompressedResult", "true"); - OsmandApplication ctx = (OsmandApplication) params.ctx; + OsmandApplication ctx = params.ctx; List res = new ArrayList(); - List dir = new ArrayList<>(); + List dir = new ArrayList<>(); + List segmentEndpoints = new ArrayList<>(); IBRouterService brouterService = ctx.getBRouterService(); if (brouterService == null) { @@ -1332,22 +1146,22 @@ public class RouteProvider { boolean isZ64Encoded = gpxMessage.startsWith("ejY0"); // base-64 version of "z64" - if (!( isZ64Encoded || gpxMessage.startsWith("<") ) ) { + if (!(isZ64Encoded || gpxMessage.startsWith("<"))) { return new RouteCalculationResult(gpxMessage); } InputStream gpxStream; - if ( isZ64Encoded ) { - ByteArrayInputStream bais = new ByteArrayInputStream( Base64.decode(gpxMessage, Base64.DEFAULT) ); - bais.read( new byte[3] ); // skip prefix - gpxStream = new GZIPInputStream( bais ); + if (isZ64Encoded) { + ByteArrayInputStream bais = new ByteArrayInputStream(Base64.decode(gpxMessage, Base64.DEFAULT)); + bais.read(new byte[3]); // skip prefix + gpxStream = new GZIPInputStream(bais); } else { gpxStream = new ByteArrayInputStream(gpxMessage.getBytes("UTF-8")); } GPXFile gpxFile = GPXUtilities.loadGPXFile(gpxStream); - dir = parseOsmAndGPXRoute(res, gpxFile, true, params.leftSide, params.mode.getDefaultSpeed(), -1); + dir = parseOsmAndGPXRoute(res, gpxFile, segmentEndpoints, true, params.leftSide, params.mode.getDefaultSpeed(), -1); if (dir != null) { addMissingTurns = false; @@ -1390,6 +1204,4 @@ public class RouteProvider { } return new RouteCalculationResult(segments, computeDirections, params, null, false); } - - -} +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteRecalculationHelper.java b/OsmAnd/src/net/osmand/plus/routing/RouteRecalculationHelper.java index 175003fe18..8fb8201dea 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteRecalculationHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteRecalculationHelper.java @@ -6,6 +6,7 @@ import net.osmand.Location; import net.osmand.data.LatLon; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.router.RouteCalculationProgress; @@ -179,7 +180,7 @@ class RouteRecalculationHelper { } public void recalculateRouteInBackground(final Location start, final LatLon end, final List intermediates, - final RouteProvider.GPXRouteParamsBuilder gpxRoute, final RouteCalculationResult previousRoute, boolean paramsChanged, boolean onlyStartPointChanged) { + final GPXRouteParamsBuilder gpxRoute, final RouteCalculationResult previousRoute, boolean paramsChanged, boolean onlyStartPointChanged) { if (start == null || end == null) { return; } @@ -207,7 +208,7 @@ class RouteRecalculationHelper { params.mode = mode; params.ctx = app; boolean updateProgress = false; - if (params.mode.getRouteService() == RouteProvider.RouteService.OSMAND) { + if (params.mode.getRouteService() == RouteService.OSMAND) { params.calculationProgress = new RouteCalculationProgress(); updateProgress = true; } else { diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteService.java b/OsmAnd/src/net/osmand/plus/routing/RouteService.java new file mode 100644 index 0000000000..6565b09106 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/routing/RouteService.java @@ -0,0 +1,45 @@ +package net.osmand.plus.routing; + +import net.osmand.plus.OsmandApplication; + +import java.util.ArrayList; +import java.util.List; + +public enum RouteService { + OSMAND("OsmAnd (offline)"), + BROUTER("BRouter (offline)"), + STRAIGHT("Straight line"), + DIRECT_TO("Direct To"), + ONLINE("Online engine"); + + private final String name; + + RouteService(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public boolean isOnline() { + return this != OSMAND && this != BROUTER; + } + + boolean isAvailable(OsmandApplication ctx) { + if (this == BROUTER) { + return ctx.getBRouterService() != null; + } + return true; + } + + public static RouteService[] getAvailableRouters(OsmandApplication ctx) { + List list = new ArrayList<>(); + for (RouteService r : values()) { + if (r.isAvailable(ctx)) { + list.add(r); + } + } + return list.toArray(new RouteService[0]); + } +} diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingEnvironment.java b/OsmAnd/src/net/osmand/plus/routing/RoutingEnvironment.java new file mode 100644 index 0000000000..15b484cc67 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingEnvironment.java @@ -0,0 +1,36 @@ +package net.osmand.plus.routing; + +import net.osmand.router.PrecalculatedRouteDirection; +import net.osmand.router.RoutePlannerFrontEnd; +import net.osmand.router.RoutingContext; + +public class RoutingEnvironment { + + private RoutingContext ctx; + private RoutingContext complexCtx; + private RoutePlannerFrontEnd router; + private PrecalculatedRouteDirection precalculated; + + public RoutingEnvironment(RoutePlannerFrontEnd router, RoutingContext ctx, RoutingContext complexCtx, PrecalculatedRouteDirection precalculated) { + this.router = router; + this.ctx = ctx; + this.complexCtx = complexCtx; + this.precalculated = precalculated; + } + + public RoutePlannerFrontEnd getRouter() { + return router; + } + + public RoutingContext getCtx() { + return ctx; + } + + public RoutingContext getComplexCtx() { + return complexCtx; + } + + public PrecalculatedRouteDirection getPrecalculated() { + return precalculated; + } +} diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 1addb2f50a..8ab9405ee1 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -20,9 +20,7 @@ import net.osmand.plus.TargetPointsHelper.TargetPoint; import net.osmand.plus.helpers.enums.MetricsConstants; import net.osmand.plus.notifications.OsmandNotification.NotificationType; import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo; -import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder; -import net.osmand.plus.routing.RouteProvider.RouteService; -import net.osmand.plus.routing.RouteProvider.RoutingEnvironment; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener; import net.osmand.plus.settings.backend.OsmandSettings; @@ -670,9 +668,9 @@ public class RoutingHelper { private static float getDefaultAllowedDeviation(OsmandSettings settings, ApplicationMode mode, float posTolerance) { if (settings.DISABLE_OFFROUTE_RECALC.getModeValue(mode)) { return -1.0f; - } else if (mode.getRouteService() == RouteProvider.RouteService.DIRECT_TO) { + } else if (mode.getRouteService() == RouteService.DIRECT_TO) { return -1.0f; - } else if (mode.getRouteService() == RouteProvider.RouteService.STRAIGHT) { + } else if (mode.getRouteService() == RouteService.STRAIGHT) { MetricsConstants mc = settings.METRIC_SYSTEM.getModeValue(mode); if (mc == MetricsConstants.KILOMETERS_AND_METERS || mc == MetricsConstants.MILES_AND_METERS) { return 500.f; diff --git a/OsmAnd/src/net/osmand/plus/routing/TransportRoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/TransportRoutingHelper.java index 08da774f27..637e3078e7 100644 --- a/OsmAnd/src/net/osmand/plus/routing/TransportRoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/TransportRoutingHelper.java @@ -18,7 +18,6 @@ import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; import net.osmand.plus.render.NativeOsmandLibrary; import net.osmand.plus.routing.RouteCalculationParams.RouteCalculationResultListener; -import net.osmand.plus.routing.RouteProvider.RouteService; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.CommonPreference; import net.osmand.plus.settings.backend.OsmandSettings; diff --git a/OsmAnd/src/net/osmand/plus/search/QuickSearchDialogFragment.java b/OsmAnd/src/net/osmand/plus/search/QuickSearchDialogFragment.java index 9badea394e..22b75072ec 100644 --- a/OsmAnd/src/net/osmand/plus/search/QuickSearchDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/search/QuickSearchDialogFragment.java @@ -513,7 +513,7 @@ public class QuickSearchDialogFragment extends DialogFragment implements OsmAndC List historyEntries = new ArrayList(); List selectedItems = historySearchFragment.getListAdapter().getSelectedItems(); for (QuickSearchListItem searchListItem : selectedItems) { - Object object = searchListItem.getSearchResult().object; + Object object = searchListItem.getSearchResult().object;; if (object instanceof HistoryEntry) { historyEntries.add((HistoryEntry) object); } diff --git a/OsmAnd/src/net/osmand/plus/search/QuickSearchHelper.java b/OsmAnd/src/net/osmand/plus/search/QuickSearchHelper.java index 1213f550c1..2cf4226e12 100644 --- a/OsmAnd/src/net/osmand/plus/search/QuickSearchHelper.java +++ b/OsmAnd/src/net/osmand/plus/search/QuickSearchHelper.java @@ -23,6 +23,8 @@ import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.helpers.GpxUiHelper; +import net.osmand.plus.helpers.GpxUiHelper.GPXInfo; import net.osmand.plus.helpers.SearchHistoryHelper; import net.osmand.plus.helpers.SearchHistoryHelper.HistoryEntry; import net.osmand.plus.poi.NominatimPoiFilter; @@ -457,6 +459,15 @@ public class QuickSearchHelper implements ResourceListener { sr.objectType = ObjectType.POI_TYPE; publish = true; } + } else if (pd.isGpxFile()) { + GPXInfo gpxInfo = GpxUiHelper.getGpxInfoByFileName(app, pd.getName()); + if (gpxInfo != null) { + sr.localeName = gpxInfo.getFileName(); + sr.object = point; + sr.objectType = ObjectType.GPX_TRACK; + sr.relatedObject = gpxInfo; + publish = true; + } } else { sr.localeName = pd.getName(); sr.object = point; diff --git a/OsmAnd/src/net/osmand/plus/search/QuickSearchListAdapter.java b/OsmAnd/src/net/osmand/plus/search/QuickSearchListAdapter.java index 9251e555b0..c9a3d1d5e9 100644 --- a/OsmAnd/src/net/osmand/plus/search/QuickSearchListAdapter.java +++ b/OsmAnd/src/net/osmand/plus/search/QuickSearchListAdapter.java @@ -10,12 +10,10 @@ import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.ListView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.view.ContextThemeWrapper; import androidx.core.content.ContextCompat; import androidx.core.view.ViewCompat; @@ -32,8 +30,9 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.UiUtilities.UpdateLocationViewCache; import net.osmand.plus.chooseplan.ChoosePlanDialogFragment; +import net.osmand.plus.helpers.GpxUiHelper; +import net.osmand.plus.helpers.GpxUiHelper.GPXInfo; import net.osmand.plus.search.listitems.QuickSearchBannerListItem; -import net.osmand.plus.search.listitems.QuickSearchFreeBannerListItem; import net.osmand.plus.mapcontextmenu.MenuController; import net.osmand.plus.search.listitems.QuickSearchHeaderListItem; import net.osmand.plus.search.listitems.QuickSearchListItem; @@ -41,7 +40,9 @@ import net.osmand.plus.search.listitems.QuickSearchListItemType; import net.osmand.plus.search.listitems.QuickSearchMoreListItem; import net.osmand.plus.search.listitems.QuickSearchSelectAllListItem; import net.osmand.search.SearchUICore; +import net.osmand.search.core.ObjectType; import net.osmand.search.core.SearchPhrase; +import net.osmand.search.core.SearchResult; import net.osmand.search.core.SearchWord; import net.osmand.util.Algorithms; import net.osmand.util.OpeningHoursParser; @@ -209,143 +210,326 @@ public class QuickSearchListAdapter extends ArrayAdapter { public View getView(final int position, View convertView, @NonNull ViewGroup parent) { final QuickSearchListItem listItem = getItem(position); QuickSearchListItemType type = listItem.getType(); + LinearLayout view; if (type == QuickSearchListItemType.BANNER) { - final QuickSearchBannerListItem banner = (QuickSearchBannerListItem) listItem; - if (convertView == null) { - view = (LinearLayout) inflater.inflate(R.layout.search_banner_list_item, null); - } else { - view = (LinearLayout) convertView; - } - - ((TextView) view.findViewById(R.id.empty_search_description)).setText(R.string.nothing_found_descr); - - SearchUICore searchUICore = app.getSearchUICore().getCore(); - SearchPhrase searchPhrase = searchUICore.getPhrase(); - - String textTitle; - int minimalSearchRadius = searchUICore.getMinimalSearchRadius(searchPhrase); - if (searchUICore.isSearchMoreAvailable(searchPhrase) && minimalSearchRadius != Integer.MAX_VALUE) { - double rd = OsmAndFormatter.calculateRoundedDist(minimalSearchRadius, app); - textTitle = app.getString(R.string.nothing_found_in_radius) + " " - + OsmAndFormatter.getFormattedDistance((float) rd, app, false); - } else { - textTitle = app.getString(R.string.search_nothing_found); - } - ((TextView) view.findViewById(R.id.empty_search_title)).setText(textTitle); - - ViewGroup buttonContainer = view.findViewById(R.id.buttons_container); - if (buttonContainer != null) { - buttonContainer.removeAllViews(); - for (ButtonItem button : banner.getButtonItems()) { - View v = inflater.inflate(R.layout.search_banner_button_list_item, null); - TextView title = v.findViewById(R.id.title); - title.setText(button.getTitle()); - ImageView icon = v.findViewById(R.id.icon); - if (button.getIconId() != INVALID_ID) { - icon.setImageResource(button.getIconId()); - icon.setVisibility(View.VISIBLE); - } else { - icon.setVisibility(View.GONE); - } - v.setOnClickListener(button.getListener()); - buttonContainer.addView(v); - } - } + view = bindBannerItem(convertView, listItem); } else if (type == QuickSearchListItemType.FREE_VERSION_BANNER) { - if (convertView == null) { - view = (LinearLayout) inflater.inflate( - R.layout.read_wikipedia_ofline_banner, null); - } else { - view = (LinearLayout) convertView; - } - - View btnGet = view.findViewById(R.id.btn_get); - if (btnGet != null) { - btnGet.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - ChoosePlanDialogFragment.showWikipediaInstance( - activity.getSupportFragmentManager()); - } - }); - } + view = bindFreeVersionBannerItem(convertView); } else if (type == QuickSearchListItemType.SEARCH_MORE) { - if (convertView == null) { - view = (LinearLayout) inflater.inflate(R.layout.search_more_list_item, null); - } else { - view = (LinearLayout) convertView; - } - - if (listItem.getSpannableName() != null) { - ((TextView) view.findViewById(R.id.title)).setText(listItem.getSpannableName()); - } else { - ((TextView) view.findViewById(R.id.title)).setText(listItem.getName()); - } - - final QuickSearchMoreListItem searchMoreItem = (QuickSearchMoreListItem) listItem; - int emptyDescId = searchMoreItem.isSearchMoreAvailable() ? R.string.nothing_found_descr : R.string.modify_the_search_query; - ((TextView) view.findViewById(R.id.empty_search_description)).setText(emptyDescId); - - boolean emptySearchVisible = searchMoreItem.isEmptySearch() && !searchMoreItem.isInterruptedSearch(); - boolean moreDividerVisible = emptySearchVisible && searchMoreItem.isSearchMoreAvailable(); - view.findViewById(R.id.empty_search).setVisibility(emptySearchVisible ? View.VISIBLE : View.GONE); - view.findViewById(R.id.more_divider).setVisibility(moreDividerVisible ? View.VISIBLE : View.GONE); - SearchUICore searchUICore = app.getSearchUICore().getCore(); - SearchPhrase searchPhrase = searchUICore.getPhrase(); - - String textTitle; - int minimalSearchRadius = searchUICore.getMinimalSearchRadius(searchPhrase); - if (searchUICore.isSearchMoreAvailable(searchPhrase) && minimalSearchRadius != Integer.MAX_VALUE) { - double rd = OsmAndFormatter.calculateRoundedDist(minimalSearchRadius, app); - textTitle = app.getString(R.string.nothing_found_in_radius) + " " - + OsmAndFormatter.getFormattedDistance((float) rd, app, false); - } else { - textTitle = app.getString(R.string.search_nothing_found); - } - ((TextView) view.findViewById(R.id.empty_search_title)).setText(textTitle); - View primaryButton = view.findViewById(R.id.primary_button); - - ((TextView) view.findViewById(R.id.title)).setText(getIncreaseSearchButtonTitle(app, searchPhrase)); - - primaryButton.setVisibility(searchMoreItem.isSearchMoreAvailable() ? View.VISIBLE : View.GONE); - primaryButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - ((QuickSearchMoreListItem) listItem).onPrimaryButtonClick(); - } - }); - - View secondaryButton = view.findViewById(R.id.secondary_button); - secondaryButton.setVisibility(searchMoreItem.isSecondaryButtonVisible() ? - View.VISIBLE : View.GONE); - secondaryButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - searchMoreItem.onSecondaryButtonClick(); - } - }); + view = bindSearchMoreItem(convertView, listItem); } else if (type == QuickSearchListItemType.BUTTON) { - if (convertView == null) { - view = (LinearLayout) inflater.inflate(R.layout.search_custom_list_item, null); - } else { - view = (LinearLayout) convertView; - } - ((ImageView) view.findViewById(R.id.imageView)).setImageDrawable(listItem.getIcon()); - if (listItem.getSpannableName() != null) { - ((TextView) view.findViewById(R.id.title)).setText(listItem.getSpannableName()); - } else { - ((TextView) view.findViewById(R.id.title)).setText(listItem.getName()); - } + view = bindButtonItem(convertView, listItem); } else if (type == QuickSearchListItemType.SELECT_ALL) { - if (convertView == null) { - view = (LinearLayout) inflater.inflate(R.layout.select_all_list_item, null); - } else { - view = (LinearLayout) convertView; + view = bindSelectAllItem(position, convertView); + } else if (type == QuickSearchListItemType.HEADER) { + view = bindHeaderItem(convertView, listItem); + } else if (type == QuickSearchListItemType.TOP_SHADOW) { + return bindTopShadowItem(convertView); + } else if (type == QuickSearchListItemType.BOTTOM_SHADOW) { + return bindBottomShadowItem(convertView); + } else { + view = bindSearchResultItem(position, convertView, listItem); + } + + setupBackground(view); + setupDivider(position, view, listItem); + ViewCompat.setAccessibilityDelegate(view, accessibilityAssistant); + return view; + } + + private LinearLayout bindBannerItem(@Nullable View convertView, + @NonNull QuickSearchListItem listItem) { + QuickSearchBannerListItem banner = (QuickSearchBannerListItem) listItem; + LinearLayout view = getLinearLayout(convertView, R.layout.search_banner_list_item); + ((TextView) view.findViewById(R.id.empty_search_description)).setText(R.string.nothing_found_descr); + + SearchUICore searchUICore = app.getSearchUICore().getCore(); + SearchPhrase searchPhrase = searchUICore.getPhrase(); + + String textTitle; + int minimalSearchRadius = searchUICore.getMinimalSearchRadius(searchPhrase); + if (searchUICore.isSearchMoreAvailable(searchPhrase) && minimalSearchRadius != Integer.MAX_VALUE) { + double rd = OsmAndFormatter.calculateRoundedDist(minimalSearchRadius, app); + textTitle = app.getString(R.string.nothing_found_in_radius) + " " + + OsmAndFormatter.getFormattedDistance((float) rd, app, false); + } else { + textTitle = app.getString(R.string.search_nothing_found); + } + ((TextView) view.findViewById(R.id.empty_search_title)).setText(textTitle); + + ViewGroup buttonContainer = view.findViewById(R.id.buttons_container); + if (buttonContainer != null) { + buttonContainer.removeAllViews(); + for (ButtonItem button : banner.getButtonItems()) { + View v = inflater.inflate(R.layout.search_banner_button_list_item, null); + TextView title = v.findViewById(R.id.title); + title.setText(button.getTitle()); + ImageView icon = v.findViewById(R.id.icon); + if (button.getIconId() != INVALID_ID) { + icon.setImageResource(button.getIconId()); + icon.setVisibility(View.VISIBLE); + } else { + icon.setVisibility(View.GONE); + } + v.setOnClickListener(button.getListener()); + buttonContainer.addView(v); } - final CheckBox ch = (CheckBox) view.findViewById(R.id.toggle_item); + } + return view; + } + + private LinearLayout bindFreeVersionBannerItem(@Nullable View convertView) { + LinearLayout view = getLinearLayout(convertView, R.layout.read_wikipedia_ofline_banner); + View btnGet = view.findViewById(R.id.btn_get); + if (btnGet != null) { + btnGet.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ChoosePlanDialogFragment.showWikipediaInstance( + activity.getSupportFragmentManager()); + } + }); + } + return view; + } + + private LinearLayout bindSearchMoreItem(@Nullable View convertView, + @NonNull final QuickSearchListItem listItem) { + LinearLayout view = getLinearLayout(convertView, R.layout.search_more_list_item); + + if (listItem.getSpannableName() != null) { + ((TextView) view.findViewById(R.id.title)).setText(listItem.getSpannableName()); + } else { + ((TextView) view.findViewById(R.id.title)).setText(listItem.getName()); + } + + final QuickSearchMoreListItem searchMoreItem = (QuickSearchMoreListItem) listItem; + int emptyDescId = searchMoreItem.isSearchMoreAvailable() ? R.string.nothing_found_descr : R.string.modify_the_search_query; + ((TextView) view.findViewById(R.id.empty_search_description)).setText(emptyDescId); + + boolean emptySearchVisible = searchMoreItem.isEmptySearch() && !searchMoreItem.isInterruptedSearch(); + boolean moreDividerVisible = emptySearchVisible && searchMoreItem.isSearchMoreAvailable(); + view.findViewById(R.id.empty_search).setVisibility(emptySearchVisible ? View.VISIBLE : View.GONE); + view.findViewById(R.id.more_divider).setVisibility(moreDividerVisible ? View.VISIBLE : View.GONE); + SearchUICore searchUICore = app.getSearchUICore().getCore(); + SearchPhrase searchPhrase = searchUICore.getPhrase(); + + String textTitle; + int minimalSearchRadius = searchUICore.getMinimalSearchRadius(searchPhrase); + if (searchUICore.isSearchMoreAvailable(searchPhrase) && minimalSearchRadius != Integer.MAX_VALUE) { + double rd = OsmAndFormatter.calculateRoundedDist(minimalSearchRadius, app); + textTitle = app.getString(R.string.nothing_found_in_radius) + " " + + OsmAndFormatter.getFormattedDistance((float) rd, app, false); + } else { + textTitle = app.getString(R.string.search_nothing_found); + } + ((TextView) view.findViewById(R.id.empty_search_title)).setText(textTitle); + View primaryButton = view.findViewById(R.id.primary_button); + + ((TextView) view.findViewById(R.id.title)).setText(getIncreaseSearchButtonTitle(app, searchPhrase)); + + primaryButton.setVisibility(searchMoreItem.isSearchMoreAvailable() ? View.VISIBLE : View.GONE); + primaryButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ((QuickSearchMoreListItem) listItem).onPrimaryButtonClick(); + } + }); + + View secondaryButton = view.findViewById(R.id.secondary_button); + secondaryButton.setVisibility(searchMoreItem.isSecondaryButtonVisible() ? + View.VISIBLE : View.GONE); + secondaryButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + searchMoreItem.onSecondaryButtonClick(); + } + }); + return view; + } + + private LinearLayout bindButtonItem(@Nullable View convertView, + @NonNull QuickSearchListItem listItem) { + LinearLayout view = getLinearLayout(convertView, R.layout.search_custom_list_item); + ((ImageView) view.findViewById(R.id.imageView)).setImageDrawable(listItem.getIcon()); + if (listItem.getSpannableName() != null) { + ((TextView) view.findViewById(R.id.title)).setText(listItem.getSpannableName()); + } else { + ((TextView) view.findViewById(R.id.title)).setText(listItem.getName()); + } + return view; + } + + private LinearLayout bindSelectAllItem(final int position, + @Nullable View convertView) { + LinearLayout view = getLinearLayout(convertView, R.layout.select_all_list_item); + final CheckBox ch = (CheckBox) view.findViewById(R.id.toggle_item); + ch.setVisibility(View.VISIBLE); + ch.setChecked(selectAll); + ch.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + toggleCheckbox(position, ch); + } + }); + return view; + } + + private LinearLayout bindHeaderItem(@Nullable View convertView, + @NonNull QuickSearchListItem listItem) { + LinearLayout view = getLinearLayout(convertView, R.layout.search_header_list_item); + view.findViewById(R.id.top_divider) + .setVisibility(((QuickSearchHeaderListItem)listItem).isShowTopDivider() ? View.VISIBLE : View.GONE); + if (listItem.getSpannableName() != null) { + ((TextView) view.findViewById(R.id.title)).setText(listItem.getSpannableName()); + } else { + ((TextView) view.findViewById(R.id.title)).setText(listItem.getName()); + } + return view; + } + + private LinearLayout bindTopShadowItem(@Nullable View convertView) { + return getLinearLayout(convertView, R.layout.list_shadow_header); + } + + private LinearLayout bindBottomShadowItem(@Nullable View convertView) { + return getLinearLayout(convertView, R.layout.list_shadow_footer); + } + + private LinearLayout bindSearchResultItem(int position, + @Nullable View convertView, + @NonNull QuickSearchListItem listItem) { + SearchResult sr = listItem.getSearchResult(); + if (sr != null && sr.objectType == ObjectType.GPX_TRACK) { + return bindGpxTrack(position, convertView, listItem, (GPXInfo) sr.relatedObject); + } else { + return bindSearchResult(position, convertView, listItem); + } + } + + private LinearLayout bindGpxTrack(int position, + @Nullable View convertView, + @NonNull QuickSearchListItem listItem, + @NonNull GPXInfo gpxInfo) { + LinearLayout view = getLinearLayout(convertView, R.layout.search_gpx_list_item); + SearchResult sr = listItem.getSearchResult(); + setupCheckBox(position, view, listItem); + GpxUiHelper.updateGpxInfoView(app, view, sr.localeName, listItem.getIcon(), gpxInfo); + return view; + } + + private LinearLayout bindSearchResult(int position, + @Nullable View convertView, + @NonNull QuickSearchListItem listItem) { + LinearLayout view = getLinearLayout(convertView, R.layout.search_list_item); + setupCheckBox(position, view, listItem); + + ImageView imageView = (ImageView) view.findViewById(R.id.imageView); + TextView title = (TextView) view.findViewById(R.id.title); + TextView subtitle = (TextView) view.findViewById(R.id.subtitle); + + imageView.setImageDrawable(listItem.getIcon()); + String name = listItem.getName(); + if (listItem.getSpannableName() != null) { + title.setText(listItem.getSpannableName()); + } else { + title.setText(name); + } + + String desc = listItem.getTypeName(); + Object searchResultObject = listItem.getSearchResult().object; + if (searchResultObject instanceof AbstractPoiType) { + AbstractPoiType abstractPoiType = (AbstractPoiType) searchResultObject; + String synonyms[] = abstractPoiType.getSynonyms().split(";"); + QuickSearchHelper searchHelper = app.getSearchUICore(); + SearchUICore searchUICore = searchHelper.getCore(); + String searchPhrase = searchUICore.getPhrase().getText(true); + SearchPhrase.NameStringMatcher nm = new SearchPhrase.NameStringMatcher(searchPhrase, + CollatorStringMatcher.StringMatcherMode.CHECK_STARTS_FROM_SPACE); + + if (!searchPhrase.isEmpty() && !nm.matches(abstractPoiType.getTranslation())) { + if (nm.matches(abstractPoiType.getEnTranslation())) { + desc = listItem.getTypeName() + " (" + abstractPoiType.getEnTranslation() + ")"; + } else { + for (String syn : synonyms) { + if (nm.matches(syn)) { + desc = listItem.getTypeName() + " (" + syn + ")"; + break; + } + } + } + } + } + + boolean hasDesc = false; + if (!Algorithms.isEmpty(desc) && !desc.equals(name)) { + subtitle.setText(desc); + subtitle.setVisibility(View.VISIBLE); + hasDesc = true; + } else { + subtitle.setVisibility(View.GONE); + } + + Drawable typeIcon = listItem.getTypeIcon(); + ImageView group = (ImageView) view.findViewById(R.id.type_name_icon); + if (typeIcon != null && hasDesc) { + group.setImageDrawable(typeIcon); + group.setVisibility(View.VISIBLE); + } else { + group.setVisibility(View.GONE); + } + + LinearLayout timeLayout = (LinearLayout) view.findViewById(R.id.time_layout); + TextView timeText = (TextView) view.findViewById(R.id.time); + ImageView timeIcon = (ImageView) view.findViewById(R.id.time_icon); + if (listItem.getSearchResult().object instanceof Amenity + && ((Amenity) listItem.getSearchResult().object).getOpeningHours() != null) { + Amenity amenity = (Amenity) listItem.getSearchResult().object; + OpeningHoursParser.OpeningHours rs = OpeningHoursParser.parseOpenedHours(amenity.getOpeningHours()); + if (rs != null && rs.getInfo() != null) { + int colorOpen = R.color.ctx_menu_amenity_opened_text_color; + int colorClosed = R.color.ctx_menu_amenity_closed_text_color; + SpannableString openHours = MenuController.getSpannableOpeningHours( + rs.getInfo(), + ContextCompat.getColor(app, colorOpen), + ContextCompat.getColor(app, colorClosed)); + int colorId = rs.isOpenedForTime(Calendar.getInstance()) ? colorOpen : colorClosed; + timeLayout.setVisibility(View.VISIBLE); + timeIcon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_opening_hour_16, colorId)); + timeText.setText(openHours); + } else { + timeLayout.setVisibility(View.GONE); + } + } else { + timeLayout.setVisibility(View.GONE); + } + + updateCompassVisibility(view, listItem); + + return view; + } + + private LinearLayout getLinearLayout(@Nullable View convertView, int layoutId) { + if (convertView == null || isLayoutIdChanged(convertView, layoutId)) { + convertView = inflater.inflate(layoutId, null); + convertView.setTag(layoutId); + } + return (LinearLayout) convertView; + } + + private boolean isLayoutIdChanged(@NonNull View view, int layoutId) { + return !Algorithms.objectEquals(view.getTag(), layoutId); + } + + private void setupCheckBox(final int position, + @NonNull View rootView, + @NonNull QuickSearchListItem listItem) { + final CheckBox ch = (CheckBox) rootView.findViewById(R.id.toggle_item); + if (selectionMode) { ch.setVisibility(View.VISIBLE); - ch.setChecked(selectAll); + ch.setChecked(selectedItems.contains(listItem)); ch.setOnClickListener(new View.OnClickListener() { @Override @@ -353,139 +537,21 @@ public class QuickSearchListAdapter extends ArrayAdapter { toggleCheckbox(position, ch); } }); - } else if (type == QuickSearchListItemType.HEADER) { - if (convertView == null) { - view = (LinearLayout) inflater.inflate(R.layout.search_header_list_item, null); - } else { - view = (LinearLayout) convertView; - } - view.findViewById(R.id.top_divider) - .setVisibility(((QuickSearchHeaderListItem)listItem).isShowTopDivider() ? View.VISIBLE : View.GONE); - if (listItem.getSpannableName() != null) { - ((TextView) view.findViewById(R.id.title)).setText(listItem.getSpannableName()); - } else { - ((TextView) view.findViewById(R.id.title)).setText(listItem.getName()); - } - } else if (type == QuickSearchListItemType.TOP_SHADOW) { - if (convertView == null) { - view = (LinearLayout) inflater.inflate(R.layout.list_shadow_header, null); - } else { - view = (LinearLayout) convertView; - } - return view; - } else if (type == QuickSearchListItemType.BOTTOM_SHADOW) { - if (convertView == null) { - view = (LinearLayout) inflater.inflate(R.layout.list_shadow_footer, null); - } else { - view = (LinearLayout) convertView; - } - return view; } else { - if (convertView == null) { - view = (LinearLayout) inflater.inflate(R.layout.search_list_item, null); - } else { - view = (LinearLayout) convertView; - } - - final CheckBox ch = (CheckBox) view.findViewById(R.id.toggle_item); - if (selectionMode) { - ch.setVisibility(View.VISIBLE); - ch.setChecked(selectedItems.contains(listItem)); - ch.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - toggleCheckbox(position, ch); - } - }); - } else { - ch.setVisibility(View.GONE); - } - - ImageView imageView = (ImageView) view.findViewById(R.id.imageView); - TextView title = (TextView) view.findViewById(R.id.title); - TextView subtitle = (TextView) view.findViewById(R.id.subtitle); - - imageView.setImageDrawable(listItem.getIcon()); - String name = listItem.getName(); - if (listItem.getSpannableName() != null) { - title.setText(listItem.getSpannableName()); - } else { - title.setText(name); - } - - String desc = listItem.getTypeName(); - Object searchResultObject = listItem.getSearchResult().object; - if (searchResultObject instanceof AbstractPoiType) { - AbstractPoiType abstractPoiType = (AbstractPoiType) searchResultObject; - String synonyms[] = abstractPoiType.getSynonyms().split(";"); - QuickSearchHelper searchHelper = app.getSearchUICore(); - SearchUICore searchUICore = searchHelper.getCore(); - String searchPhrase = searchUICore.getPhrase().getText(true); - SearchPhrase.NameStringMatcher nm = new SearchPhrase.NameStringMatcher(searchPhrase, - CollatorStringMatcher.StringMatcherMode.CHECK_STARTS_FROM_SPACE); - - if (!searchPhrase.isEmpty() && !nm.matches(abstractPoiType.getTranslation())) { - if (nm.matches(abstractPoiType.getEnTranslation())) { - desc = listItem.getTypeName() + " (" + abstractPoiType.getEnTranslation() + ")"; - } else { - for (String syn : synonyms) { - if (nm.matches(syn)) { - desc = listItem.getTypeName() + " (" + syn + ")"; - break; - } - } - } - } - } - - boolean hasDesc = false; - if (!Algorithms.isEmpty(desc) && !desc.equals(name)) { - subtitle.setText(desc); - subtitle.setVisibility(View.VISIBLE); - hasDesc = true; - } else { - subtitle.setVisibility(View.GONE); - } - - Drawable typeIcon = listItem.getTypeIcon(); - ImageView group = (ImageView) view.findViewById(R.id.type_name_icon); - if (typeIcon != null && hasDesc) { - group.setImageDrawable(typeIcon); - group.setVisibility(View.VISIBLE); - } else { - group.setVisibility(View.GONE); - } - - LinearLayout timeLayout = (LinearLayout) view.findViewById(R.id.time_layout); - TextView timeText = (TextView) view.findViewById(R.id.time); - ImageView timeIcon = (ImageView) view.findViewById(R.id.time_icon); - if (listItem.getSearchResult().object instanceof Amenity - && ((Amenity) listItem.getSearchResult().object).getOpeningHours() != null) { - Amenity amenity = (Amenity) listItem.getSearchResult().object; - OpeningHoursParser.OpeningHours rs = OpeningHoursParser.parseOpenedHours(amenity.getOpeningHours()); - if (rs != null && rs.getInfo() != null) { - int colorOpen = R.color.ctx_menu_amenity_opened_text_color; - int colorClosed = R.color.ctx_menu_amenity_closed_text_color; - SpannableString openHours = MenuController.getSpannableOpeningHours( - rs.getInfo(), - ContextCompat.getColor(app, colorOpen), - ContextCompat.getColor(app, colorClosed)); - int colorId = rs.isOpenedForTime(Calendar.getInstance()) ? colorOpen : colorClosed; - timeLayout.setVisibility(View.VISIBLE); - timeIcon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_opening_hour_16, colorId)); - timeText.setText(openHours); - } else { - timeLayout.setVisibility(View.GONE); - } - } else { - timeLayout.setVisibility(View.GONE); - } - - updateCompassVisibility(view, listItem); + ch.setVisibility(View.GONE); } - view.setBackgroundColor(app.getResources().getColor( - app.getSettings().isLightContent() ? R.color.list_background_color_light : R.color.list_background_color_dark)); + } + + private void setupBackground(View view) { + int bgColorResId = isNightMode() ? + R.color.list_background_color_dark : + R.color.list_background_color_light; + view.setBackgroundColor(app.getResources().getColor(bgColorResId)); + } + + private void setupDivider(final int position, + @NonNull View view, + @NonNull QuickSearchListItem listItem) { View divider = view.findViewById(R.id.divider); if (divider != null) { if (position == getCount() - 1 || getItem(position + 1).getType() == QuickSearchListItemType.HEADER @@ -494,7 +560,7 @@ public class QuickSearchListAdapter extends ArrayAdapter { } else { divider.setVisibility(View.VISIBLE); if (getItem(position + 1).getType() == QuickSearchListItemType.SEARCH_MORE - || type == QuickSearchListItemType.SELECT_ALL) { + || listItem.getType() == QuickSearchListItemType.SELECT_ALL) { LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp1); p.setMargins(0, 0, 0 ,0); divider.setLayoutParams(p); @@ -505,8 +571,6 @@ public class QuickSearchListAdapter extends ArrayAdapter { } } } - ViewCompat.setAccessibilityDelegate(view, accessibilityAssistant); - return view; } public static String getIncreaseSearchButtonTitle(OsmandApplication app, SearchPhrase searchPhrase) { @@ -576,4 +640,8 @@ public class QuickSearchListAdapter extends ArrayAdapter { LatLon toloc = listItem.getSearchResult().location; app.getUIUtilities().updateLocationView(updateLocationViewCache, direction, distanceText, toloc); } + + private boolean isNightMode() { + return !app.getSettings().isLightContent(); + } } diff --git a/OsmAnd/src/net/osmand/plus/search/QuickSearchListFragment.java b/OsmAnd/src/net/osmand/plus/search/QuickSearchListFragment.java index f667595650..410f011154 100644 --- a/OsmAnd/src/net/osmand/plus/search/QuickSearchListFragment.java +++ b/OsmAnd/src/net/osmand/plus/search/QuickSearchListFragment.java @@ -11,6 +11,7 @@ import android.widget.ArrayAdapter; import android.widget.ListView; import net.osmand.GPXUtilities; +import net.osmand.IndexConstants; import net.osmand.data.Amenity; import net.osmand.data.City; import net.osmand.data.FavouritePoint; @@ -23,6 +24,8 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.base.OsmAndListFragment; +import net.osmand.plus.helpers.GpxUiHelper.GPXInfo; +import net.osmand.plus.helpers.SearchHistoryHelper; import net.osmand.plus.helpers.SearchHistoryHelper.HistoryEntry; import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType; import net.osmand.plus.search.listitems.QuickSearchBottomShadowListItem; @@ -30,10 +33,12 @@ import net.osmand.plus.search.listitems.QuickSearchButtonListItem; import net.osmand.plus.search.listitems.QuickSearchListItem; import net.osmand.plus.search.listitems.QuickSearchListItemType; import net.osmand.plus.search.listitems.QuickSearchTopShadowListItem; +import net.osmand.plus.track.TrackMenuFragment; import net.osmand.search.core.ObjectType; import net.osmand.search.core.SearchResult; import net.osmand.util.Algorithms; +import java.io.File; import java.util.ArrayList; import java.util.List; @@ -95,7 +100,8 @@ public abstract class QuickSearchListFragment extends OsmAndListFragment { || sr.objectType == ObjectType.FAVORITE || sr.objectType == ObjectType.RECENT_OBJ || sr.objectType == ObjectType.WPT - || sr.objectType == ObjectType.STREET_INTERSECTION) { + || sr.objectType == ObjectType.STREET_INTERSECTION + || sr.objectType == ObjectType.GPX_TRACK) { showResult(sr); } else { @@ -165,7 +171,9 @@ public abstract class QuickSearchListFragment extends OsmAndListFragment { public void showResult(SearchResult searchResult) { showResult = false; - if (searchResult.location != null) { + if (searchResult.objectType == ObjectType.GPX_TRACK) { + showTrackMenuFragment((GPXInfo) searchResult.relatedObject); + } else if (searchResult.location != null) { OsmandApplication app = getMyApplication(); String lang = searchResult.requiredSearchPhrase.getSettings().getLang(); boolean transliterate = searchResult.requiredSearchPhrase.getSettings().isTransliterate(); @@ -292,6 +300,16 @@ public abstract class QuickSearchListFragment extends OsmAndListFragment { } } + private void showTrackMenuFragment(GPXInfo gpxInfo) { + OsmandApplication app = getMyApplication(); + MapActivity mapActivity = getMapActivity(); + SearchHistoryHelper.getInstance(app).addNewItemToHistory(gpxInfo); + File file = new File(app.getAppPath(IndexConstants.GPX_INDEX_DIR), gpxInfo.getFileName()); + String path = file.getAbsolutePath(); + TrackMenuFragment.showInstance(mapActivity, path, false, null, QuickSearchDialogFragment.TAG); + dialogFragment.dismiss(); + } + public MapActivity getMapActivity() { return (MapActivity) getActivity(); } diff --git a/OsmAnd/src/net/osmand/plus/search/listitems/QuickSearchListItem.java b/OsmAnd/src/net/osmand/plus/search/listitems/QuickSearchListItem.java index 204c31de88..56b0b7a572 100644 --- a/OsmAnd/src/net/osmand/plus/search/listitems/QuickSearchListItem.java +++ b/OsmAnd/src/net/osmand/plus/search/listitems/QuickSearchListItem.java @@ -359,6 +359,8 @@ public class QuickSearchListItem { } else { return icon; } + case GPX_TRACK: + return getIcon(app, R.drawable.ic_action_polygom_dark); case LOCATION: return getIcon(app, R.drawable.ic_action_world_globe); case FAVORITE: diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/ApplicationMode.java b/OsmAnd/src/net/osmand/plus/settings/backend/ApplicationMode.java index f707f82f88..3d84bcf850 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/ApplicationMode.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/ApplicationMode.java @@ -14,7 +14,7 @@ import net.osmand.plus.R; import net.osmand.plus.profiles.LocationIcon; import net.osmand.plus.profiles.NavigationIcon; import net.osmand.plus.profiles.ProfileIconColors; -import net.osmand.plus.routing.RouteProvider.RouteService; +import net.osmand.plus.routing.RouteService; import net.osmand.util.Algorithms; import org.apache.commons.lang3.StringUtils; diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java index 1a2658870b..01758f60b2 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java @@ -48,7 +48,7 @@ import net.osmand.plus.profiles.NavigationIcon; import net.osmand.plus.profiles.ProfileIconColors; import net.osmand.plus.rastermaps.LayerTransparencySeekbarMode; import net.osmand.plus.render.RendererRegistry; -import net.osmand.plus.routing.RouteProvider.RouteService; +import net.osmand.plus.routing.RouteService; import net.osmand.plus.srtmplugin.TerrainMode; import net.osmand.plus.track.GradientScaleType; import net.osmand.plus.views.layers.RadiusRulerControlLayer.RadiusRulerMode; diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/NavigationFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/NavigationFragment.java index 8c45d89def..2e86899ee8 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/NavigationFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/NavigationFragment.java @@ -14,14 +14,13 @@ import net.osmand.plus.profiles.ProfileDataObject; import net.osmand.plus.profiles.ProfileDataUtils; import net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet; import net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet.DialogMode; -import net.osmand.plus.routing.RouteProvider.RouteService; +import net.osmand.plus.routing.RouteService; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.profiles.RoutingProfileDataObject.RoutingProfilesResources; import net.osmand.plus.profiles.SelectProfileBottomSheet; import net.osmand.plus.profiles.SelectProfileBottomSheet.OnSelectProfileCallback; -import net.osmand.plus.routing.RouteProvider; import net.osmand.plus.settings.preferences.SwitchPreferenceEx; import net.osmand.util.Algorithms; @@ -151,17 +150,17 @@ public class NavigationFragment extends BaseSettingsFragment implements OnSelect navigationType.setIcon(getActiveIcon(selectedRoutingProfileDataObject.getIconRes())); ApplicationMode appMode = getSelectedAppMode(); - RouteProvider.RouteService routeService; + RouteService routeService; if (profileKey.equals(RoutingProfilesResources.STRAIGHT_LINE_MODE.name())) { - routeService = RouteProvider.RouteService.STRAIGHT; + routeService = RouteService.STRAIGHT; } else if (profileKey.equals(RoutingProfilesResources.DIRECT_TO_MODE.name())) { - routeService = RouteProvider.RouteService.DIRECT_TO; + routeService = RouteService.DIRECT_TO; } else if (profileKey.equals(RoutingProfilesResources.BROUTER_MODE.name())) { - routeService = RouteProvider.RouteService.BROUTER; + routeService = RouteService.BROUTER; } else if (profileKey.startsWith(ONLINE_ROUTING_ENGINE_PREFIX)) { routeService = RouteService.ONLINE; } else { - routeService = RouteProvider.RouteService.OSMAND; + routeService = RouteService.OSMAND; } appMode.setRouteService(routeService); appMode.setRoutingProfile(profileKey); diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/ProfileAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/ProfileAppearanceFragment.java index 32136b8c09..b649ccf8cd 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/ProfileAppearanceFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/ProfileAppearanceFragment.java @@ -23,6 +23,21 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; +import androidx.activity.OnBackPressedCallback; +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.content.res.AppCompatResources; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; +import androidx.preference.Preference; +import androidx.preference.PreferenceViewHolder; +import androidx.recyclerview.widget.RecyclerView; + import net.osmand.AndroidUtils; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; @@ -39,7 +54,7 @@ import net.osmand.plus.profiles.SelectProfileBottomSheet.DialogMode; import net.osmand.plus.profiles.SelectProfileBottomSheet.OnSelectProfileCallback; import net.osmand.plus.routepreparationmenu.cards.BaseCard; import net.osmand.plus.routepreparationmenu.cards.BaseCard.CardListener; -import net.osmand.plus.routing.RouteProvider; +import net.osmand.plus.routing.RouteService; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.backup.ProfileSettingsItem; import net.osmand.plus.settings.backend.backup.SettingsHelper; @@ -56,21 +71,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import androidx.activity.OnBackPressedCallback; -import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.content.res.AppCompatResources; -import androidx.core.content.ContextCompat; -import androidx.core.graphics.drawable.DrawableCompat; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; -import androidx.fragment.app.FragmentManager; -import androidx.preference.Preference; -import androidx.preference.PreferenceViewHolder; -import androidx.recyclerview.widget.RecyclerView; - import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_SETTINGS_ID; import static net.osmand.plus.profiles.SelectProfileBottomSheet.PROFILES_LIST_UPDATED_ARG; import static net.osmand.plus.profiles.SelectProfileBottomSheet.PROFILE_KEY_ARG; @@ -310,7 +310,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment implements O outState.putString(PROFILE_STRINGKEY_KEY, changedProfile.stringKey); outState.putInt(PROFILE_ICON_RES_KEY, changedProfile.iconRes); outState.putSerializable(PROFILE_COLOR_KEY, changedProfile.color); - outState.putInt(PROFILE_CUSTOM_COLOR_KEY, changedProfile.customColor); + outState.putSerializable(PROFILE_CUSTOM_COLOR_KEY, changedProfile.customColor); if (changedProfile.parent != null) { outState.putString(PROFILE_PARENT_KEY, changedProfile.parent.getStringKey()); } @@ -325,7 +325,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment implements O changedProfile.stringKey = savedInstanceState.getString(PROFILE_STRINGKEY_KEY); changedProfile.iconRes = savedInstanceState.getInt(PROFILE_ICON_RES_KEY); changedProfile.color = (ProfileIconColors) savedInstanceState.getSerializable(PROFILE_COLOR_KEY); - changedProfile.customColor = savedInstanceState.getInt(PROFILE_CUSTOM_COLOR_KEY); + changedProfile.customColor = (Integer) savedInstanceState.getSerializable(PROFILE_CUSTOM_COLOR_KEY); String parentStringKey = savedInstanceState.getString(PROFILE_PARENT_KEY); changedProfile.parent = ApplicationMode.valueOfStringKey(parentStringKey, null); isBaseProfileImported = savedInstanceState.getBoolean(IS_BASE_PROFILE_IMPORTED); @@ -384,7 +384,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment implements O profileName.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { - if(hasFocus){ + if (hasFocus) { profileName.setSelection(profileName.getText().length()); AndroidUtils.showSoftKeyboard(getMyActivity(), profileName); } @@ -431,7 +431,9 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment implements O ArrayList icons = ProfileIcons.getIcons(); for (int iconRes : icons) { View iconItem = createIconItemView(iconRes, iconItems); - iconItems.addView(iconItem, new FlowLayout.LayoutParams(0, 0)); + int minimalPaddingBetweenIcon = app.getResources().getDimensionPixelSize(R.dimen.favorites_select_icon_button_right_padding); + iconItems.addView(iconItem, new FlowLayout.LayoutParams(minimalPaddingBetweenIcon, 0)); + iconItems.setHorizontalAutoSpacing(true); } setIconColor(changedProfile.iconRes); } else if (LOCATION_ICON_ITEMS.equals(preference.getKey())) { @@ -508,7 +510,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment implements O ImageView coloredCircle = iconItemView.findViewById(R.id.background); AndroidUtils.setBackground(coloredCircle, UiUtilities.tintDrawable(AppCompatResources.getDrawable(app, R.drawable.circle_background_light), - UiUtilities.getColorWithAlpha(ContextCompat.getColor(app, R.color.icon_color_default_light), 0.1f))); + UiUtilities.getColorWithAlpha(ContextCompat.getColor(app, R.color.icon_color_default_light), 0.1f))); coloredCircle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -856,11 +858,11 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment implements O } return false; } - + private boolean nameIsEmpty() { return changedProfile.name.trim().isEmpty(); } - + private void disableSaveButtonWithErrorMessage(String errorMessage) { saveButton.setEnabled(false); profileNameOtfb.setError(errorMessage, true); @@ -1003,7 +1005,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment implements O Integer customColor = null; int iconRes; String routingProfile; - RouteProvider.RouteService routeService; + RouteService routeService; NavigationIcon navigationIcon; LocationIcon locationIcon; @@ -1036,7 +1038,8 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment implements O if (parent != null ? !parent.equals(that.parent) : that.parent != null) return false; if (name != null ? !name.equals(that.name) : that.name != null) return false; if (color != that.color) return false; - if (customColor != null ? !customColor.equals(that.customColor) : that.customColor != null) return false; + if (customColor != null ? !customColor.equals(that.customColor) : that.customColor != null) + return false; if (routingProfile != null ? !routingProfile.equals(that.routingProfile) : that.routingProfile != null) return false; if (routeService != that.routeService) return false; diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java index d9290bdcbe..eb4f09f4aa 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java @@ -31,6 +31,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; +import net.osmand.plus.routing.RouteService; import net.osmand.plus.development.OsmandDevelopmentPlugin; import net.osmand.plus.routing.RouteProvider; import net.osmand.plus.routing.RoutingHelper; @@ -229,7 +230,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP fastRoute.setSummaryOn(R.string.shared_string_on); fastRoute.setSummaryOff(R.string.shared_string_off); - if (am.getRouteService() == RouteProvider.RouteService.OSMAND) { + if (am.getRouteService() == RouteService.OSMAND) { GeneralRouter router = app.getRouter(am); clearParameters(); if (router != null) { @@ -308,10 +309,10 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP } } setupTimeConditionalRoutingPref(); - } else if (am.getRouteService() == RouteProvider.RouteService.BROUTER) { + } else if (am.getRouteService() == RouteService.BROUTER) { screen.addPreference(fastRoute); setupTimeConditionalRoutingPref(); - } else if (am.getRouteService() == RouteProvider.RouteService.STRAIGHT) { + } else if (am.getRouteService() == RouteService.STRAIGHT) { Preference straightAngle = new Preference(app.getApplicationContext()); straightAngle.setPersistent(false); straightAngle.setKey(settings.ROUTE_STRAIGHT_ANGLE.getId()); diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/VehicleParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/VehicleParametersFragment.java index 3972b61c20..1b6f80848f 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/VehicleParametersFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/VehicleParametersFragment.java @@ -25,8 +25,7 @@ import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.helpers.enums.SpeedConstants; -import net.osmand.plus.routing.RouteProvider.RouteService; -import net.osmand.plus.routing.RoutingHelper; +import net.osmand.plus.routing.RouteService; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.StringPreference; import net.osmand.plus.settings.bottomsheets.VehicleParametersBottomSheet; diff --git a/OsmAnd/src/net/osmand/plus/srtmplugin/ContourLinesAction.java b/OsmAnd/src/net/osmand/plus/srtmplugin/ContourLinesAction.java index 15d33c8fa3..13210ed6fc 100644 --- a/OsmAnd/src/net/osmand/plus/srtmplugin/ContourLinesAction.java +++ b/OsmAnd/src/net/osmand/plus/srtmplugin/ContourLinesAction.java @@ -21,11 +21,10 @@ import static net.osmand.plus.srtmplugin.SRTMPlugin.CONTOUR_LINES_DISABLED_VALUE public class ContourLinesAction extends QuickAction { public static final QuickActionType TYPE = new QuickActionType(29, - "contourlines.showhide", ContourLinesAction.class). - nameRes(R.string.quick_action_show_hide_contour_lines).iconRes(R.drawable.ic_plugin_srtm).nonEditable(). - category(QuickActionType.CONFIGURE_MAP); - - + "contourlines.showhide", ContourLinesAction.class) + .nameActionRes(R.string.quick_action_show_hide_title) + .nameRes(R.string.srtm_plugin_name).iconRes(R.drawable.ic_plugin_srtm).nonEditable() + .category(QuickActionType.CONFIGURE_MAP); public ContourLinesAction() { super(TYPE); @@ -74,8 +73,14 @@ public class ContourLinesAction extends QuickAction { } @Override - public String getActionText(OsmandApplication app) { - return SRTMPlugin.isContourLinesLayerEnabled(app) ? app.getString(R.string.quick_action_contour_lines_hide) - : app.getString(R.string.quick_action_contour_lines_show); + public String getActionText(OsmandApplication application) { + String nameRes = application.getString(getNameRes()); + String actionName = isActionWithSlash(application) ? application.getString(R.string.shared_string_hide) : application.getString(R.string.shared_string_show); + return application.getString(R.string.ltr_or_rtl_combine_via_dash, actionName, nameRes); + } + + @Override + public boolean isActionWithSlash(OsmandApplication application) { + return SRTMPlugin.isContourLinesLayerEnabled(application); } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/srtmplugin/TerrainAction.java b/OsmAnd/src/net/osmand/plus/srtmplugin/TerrainAction.java index fdeb099cfa..61d09399e2 100644 --- a/OsmAnd/src/net/osmand/plus/srtmplugin/TerrainAction.java +++ b/OsmAnd/src/net/osmand/plus/srtmplugin/TerrainAction.java @@ -16,8 +16,8 @@ import net.osmand.plus.quickaction.QuickActionType; public class TerrainAction extends QuickAction { public static final QuickActionType TYPE = new QuickActionType(30, - "terrain.showhide", TerrainAction.class). - nameRes(R.string.quick_action_show_hide_terrain).iconRes(R.drawable.ic_action_hillshade_dark).nonEditable(). + "terrain.showhide", TerrainAction.class).nameActionRes(R.string.quick_action_show_hide_title). + nameRes(R.string.shared_string_terrain).iconRes(R.drawable.ic_action_hillshade_dark).nonEditable(). category(QuickActionType.CONFIGURE_MAP); @@ -62,7 +62,13 @@ public class TerrainAction extends QuickAction { @Override public String getActionText(OsmandApplication application) { - return application.getSettings().TERRAIN.get() ? application.getString(R.string.quick_action_terrain_hide) - : application.getString(R.string.quick_action_terrain_show); + String nameRes = application.getString(getNameRes()); + String actionName = isActionWithSlash(application) ? application.getString(R.string.shared_string_hide) : application.getString(R.string.shared_string_show); + return application.getString(R.string.ltr_or_rtl_combine_via_dash, actionName, nameRes); + } + + @Override + public boolean isActionWithSlash(OsmandApplication application) { + return application.getSettings().TERRAIN.get(); } } diff --git a/OsmAnd/src/net/osmand/plus/track/ColorsCard.java b/OsmAnd/src/net/osmand/plus/track/ColorsCard.java index 5f83dfc6c8..e6da7e736f 100644 --- a/OsmAnd/src/net/osmand/plus/track/ColorsCard.java +++ b/OsmAnd/src/net/osmand/plus/track/ColorsCard.java @@ -3,13 +3,13 @@ package net.osmand.plus.track; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.ImageView; -import android.widget.LinearLayout; -import com.google.android.material.internal.FlowLayout; +import androidx.annotation.ColorInt; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.ColorUtils; +import androidx.fragment.app.Fragment; -import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; @@ -19,6 +19,8 @@ import net.osmand.plus.routepreparationmenu.cards.BaseCard; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.ListStringPreference; import net.osmand.plus.track.CustomColorBottomSheet.ColorPickerListener; +import net.osmand.plus.widgets.FlowLayout; +import net.osmand.plus.widgets.FlowLayout.LayoutParams; import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; @@ -27,6 +29,7 @@ import java.util.ArrayList; import java.util.List; import androidx.annotation.ColorInt; +import androidx.annotation.ColorRes; import androidx.core.content.ContextCompat; import androidx.core.graphics.ColorUtils; import androidx.fragment.app.Fragment; @@ -34,19 +37,19 @@ import androidx.fragment.app.Fragment; public class ColorsCard extends BaseCard implements ColorPickerListener { public static final int MAX_CUSTOM_COLORS = 6; - public static final int MINIMUM_CONTRAST_RATIO = 3; + public static final double MINIMUM_CONTRAST_RATIO = 1.5; private static final Log log = PlatformUtil.getLog(TrackColoringCard.class); public static final int INVALID_VALUE = -1; - private Fragment targetFragment; + private final Fragment targetFragment; private ApplicationMode appMode; private ListStringPreference colorsListPreference; - private List colors; - private List customColors; + private final List colors; + private final List customColors; private int selectedColor; @@ -94,35 +97,41 @@ public class ColorsCard extends BaseCard implements ColorPickerListener { @Override protected void updateContent() { createColorSelector(); - updateColorSelector(selectedColor, view); + updateColorSelector(selectedColor); } private void createColorSelector() { - FlowLayout selectColor = view.findViewById(R.id.select_color); - selectColor.removeAllViews(); + FlowLayout selectCustomColor = view.findViewById(R.id.select_custom_color); + selectCustomColor.removeAllViews(); + selectCustomColor.setHorizontalAutoSpacing(true); + int minimalPaddingBetweenIcon = app.getResources().getDimensionPixelSize(R.dimen.favorites_select_icon_button_right_padding); for (int color : customColors) { - selectColor.addView(createColorItemView(color, selectColor, true)); + selectCustomColor.addView(createColorItemView(color, selectCustomColor, true), new LayoutParams(minimalPaddingBetweenIcon, 0)); } if (customColors.size() < 6) { - selectColor.addView(createAddCustomColorItemView(selectColor)); + selectCustomColor.addView(createAddCustomColorItemView(selectCustomColor), new LayoutParams(minimalPaddingBetweenIcon, 0)); } - selectColor.addView(createDividerView(selectColor)); + + FlowLayout selectDefaultColor = view.findViewById(R.id.select_default_color); + selectDefaultColor.removeAllViews(); + selectDefaultColor.setHorizontalAutoSpacing(true); for (int color : colors) { - selectColor.addView(createColorItemView(color, selectColor, false)); + selectDefaultColor.addView(createColorItemView(color, selectDefaultColor, false), new LayoutParams(minimalPaddingBetweenIcon, 0)); } - updateColorSelector(selectedColor, selectColor); + updateColorSelector(selectedColor); } - private void updateColorSelector(int color, View rootView) { - View oldColor = rootView.findViewWithTag(selectedColor); + private void updateColorSelector(int color) { + View oldColor = view.findViewWithTag(selectedColor); if (oldColor != null) { oldColor.findViewById(R.id.outline).setVisibility(View.INVISIBLE); ImageView icon = oldColor.findViewById(R.id.icon); - icon.setImageDrawable(UiUtilities.tintDrawable(icon.getDrawable(), R.color.icon_color_default_light)); + icon.setImageDrawable(UiUtilities.tintDrawable(icon.getDrawable(), + getResolvedColor(nightMode ? R.color.icon_color_default_dark : R.color.icon_color_default_light))); } - View newColor = rootView.findViewWithTag(color); + View newColor = view.findViewWithTag(color); if (newColor != null) { newColor.findViewById(R.id.outline).setVisibility(View.VISIBLE); } @@ -136,7 +145,11 @@ public class ColorsCard extends BaseCard implements ColorPickerListener { Drawable transparencyIcon = getTransparencyIcon(app, color); Drawable colorIcon = app.getUIUtilities().getPaintedIcon(R.drawable.bg_point_circle, color); Drawable layeredIcon = UiUtilities.getLayeredIcon(transparencyIcon, colorIcon); - double contrastRatio = ColorUtils.calculateContrast(color, ContextCompat.getColor(app, nightMode ? R.color.card_and_list_background_dark : R.color.card_and_list_background_light)); + int listBgColorId = nightMode ? + R.color.card_and_list_background_dark : + R.color.card_and_list_background_light; + int listBgColor = getResolvedColor(listBgColorId); + double contrastRatio = ColorUtils.calculateContrast(color, listBgColor); if (contrastRatio < MINIMUM_CONTRAST_RATIO) { backgroundCircle.setBackgroundResource(nightMode ? R.drawable.circle_contour_bg_dark : R.drawable.circle_contour_bg_light); } @@ -144,7 +157,7 @@ public class ColorsCard extends BaseCard implements ColorPickerListener { backgroundCircle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - updateColorSelector(color, rootView); + updateColorSelector(color); selectedColor = color; CardListener listener = getListener(); @@ -194,18 +207,7 @@ public class ColorsCard extends BaseCard implements ColorPickerListener { return colorItemView; } - private View createDividerView(FlowLayout rootView) { - LayoutInflater themedInflater = UiUtilities.getInflater(view.getContext(), nightMode); - View divider = themedInflater.inflate(R.layout.simple_divider_item, rootView, false); - - LinearLayout dividerContainer = new LinearLayout(view.getContext()); - dividerContainer.addView(divider); - dividerContainer.setPadding(0, AndroidUtils.dpToPx(app, 1), 0, AndroidUtils.dpToPx(app, 5)); - - return dividerContainer; - } - - private View createCircleView(ViewGroup rootView) { + private View createCircleView(FlowLayout rootView) { LayoutInflater themedInflater = UiUtilities.getInflater(view.getContext(), nightMode); View circleView = themedInflater.inflate(R.layout.point_editor_button, rootView, false); ImageView outline = circleView.findViewById(R.id.outline); diff --git a/OsmAnd/src/net/osmand/plus/track/SplitIntervalBottomSheet.java b/OsmAnd/src/net/osmand/plus/track/SplitIntervalBottomSheet.java index 15d94db2cc..7d36e90b27 100644 --- a/OsmAnd/src/net/osmand/plus/track/SplitIntervalBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/track/SplitIntervalBottomSheet.java @@ -3,7 +3,7 @@ package net.osmand.plus.track; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; -import android.widget.RadioGroup; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; @@ -25,6 +25,9 @@ import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.LongDescriptionItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.widgets.MultiStateToggleButton; +import net.osmand.plus.widgets.MultiStateToggleButton.OnRadioItemClickListener; +import net.osmand.plus.widgets.MultiStateToggleButton.RadioItem; import org.apache.commons.logging.Log; @@ -93,7 +96,6 @@ public class SplitIntervalBottomSheet extends MenuBottomSheetDialogFragment { @Override public void createMenuItems(Bundle savedInstanceState) { items.add(new TitleItem(getString(R.string.gpx_split_interval))); - items.add(new LongDescriptionItem(getString(R.string.gpx_split_interval_descr))); LayoutInflater themedInflater = UiUtilities.getInflater(requireContext(), nightMode); View view = themedInflater.inflate(R.layout.track_split_interval, null); @@ -106,29 +108,10 @@ public class SplitIntervalBottomSheet extends MenuBottomSheetDialogFragment { selectedSplitValue = view.findViewById(R.id.split_value_tv); splitIntervalNoneDescr = view.findViewById(R.id.split_interval_none_descr); - UiUtilities.setupSlider(slider, nightMode, null); + UiUtilities.setupSlider(slider, nightMode, null, true); - RadioGroup splitTypeGroup = view.findViewById(R.id.split_type); - if (selectedSplitType == GpxSplitType.NO_SPLIT) { - splitTypeGroup.check(R.id.no_split); - } else if (selectedSplitType == GpxSplitType.TIME) { - splitTypeGroup.check(R.id.time_split); - } else if (selectedSplitType == GpxSplitType.DISTANCE) { - splitTypeGroup.check(R.id.distance_split); - } - splitTypeGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(RadioGroup group, int checkedId) { - if (checkedId == R.id.no_split) { - selectedSplitType = GpxSplitType.NO_SPLIT; - } else if (checkedId == R.id.time_split) { - selectedSplitType = GpxSplitType.TIME; - } else if (checkedId == R.id.distance_split) { - selectedSplitType = GpxSplitType.DISTANCE; - } - updateSlider(); - } - }); + LinearLayout radioGroup = (LinearLayout) view.findViewById(R.id.custom_radio_buttons); + setupTypeRadioGroup(radioGroup); SimpleBottomSheetItem titleItem = (SimpleBottomSheetItem) new SimpleBottomSheetItem.Builder() .setCustomView(view) @@ -136,6 +119,35 @@ public class SplitIntervalBottomSheet extends MenuBottomSheetDialogFragment { items.add(titleItem); } + private void setupTypeRadioGroup(LinearLayout buttonsContainer) { + RadioItem none = createRadioButton(GpxSplitType.NO_SPLIT, R.string.shared_string_none); + RadioItem time = createRadioButton(GpxSplitType.TIME, R.string.shared_string_time); + RadioItem distance = createRadioButton(GpxSplitType.DISTANCE, R.string.distance); + + MultiStateToggleButton radioGroup = new MultiStateToggleButton(app, buttonsContainer, nightMode); + radioGroup.setItems(none, time, distance); + + if (selectedSplitType == GpxSplitType.NO_SPLIT) { + radioGroup.setSelectedItem(none); + } else { + radioGroup.setSelectedItem(selectedSplitType == GpxSplitType.TIME ? time : distance); + } + } + + private RadioItem createRadioButton(final GpxSplitType splitType, int titleId) { + String title = app.getString(titleId); + RadioItem item = new RadioItem(title); + item.setOnClickListener(new OnRadioItemClickListener() { + @Override + public boolean onRadioItemClick(RadioItem radioItem, View view) { + selectedSplitType = splitType; + updateSlider(); + return true; + } + }); + return item; + } + @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); diff --git a/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java index 3aaeebccae..f33571bdd6 100644 --- a/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java +++ b/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java @@ -424,15 +424,17 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy(); int tileBoxWidthPx = 0; int tileBoxHeightPx = 0; + int marginLeftPx = 0; if (!isPortrait()) { tileBoxWidthPx = tb.getPixWidth() - getWidth(); + marginLeftPx = getWidth(); } else { int fHeight = getViewHeight() - y - AndroidUtils.getStatusBarHeight(mapActivity); tileBoxHeightPx = tb.getPixHeight() - fHeight; } if (r.left != 0 && r.right != 0) { - mapActivity.getMapView().fitRectToMap(r.left, r.right, r.top, r.bottom, tileBoxWidthPx, tileBoxHeightPx, 0); + mapActivity.getMapView().fitRectToMap(r.left, r.right, r.top, r.bottom, tileBoxWidthPx, tileBoxHeightPx, 0, marginLeftPx); } } } diff --git a/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java b/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java index b72d4803fe..357ea3ba8a 100644 --- a/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java @@ -59,6 +59,7 @@ import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities.UpdateLocationViewCache; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.activities.MapActivity.ShowQuickSearchMode; import net.osmand.plus.activities.MapActivityActions; import net.osmand.plus.base.ContextMenuFragment; import net.osmand.plus.base.ContextMenuScrollFragment; @@ -81,7 +82,8 @@ import net.osmand.plus.myplaces.TrackActivityFragmentAdapter; import net.osmand.plus.osmedit.OsmEditingPlugin; import net.osmand.plus.routepreparationmenu.cards.BaseCard; import net.osmand.plus.routepreparationmenu.cards.BaseCard.CardListener; -import net.osmand.plus.routing.RouteProvider; +import net.osmand.plus.search.QuickSearchDialogFragment; +import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener; import net.osmand.plus.track.TrackSelectSegmentBottomSheet.OnSegmentSelectedListener; import net.osmand.plus.views.AddGpxPointBottomSheetHelper.NewGpxPoint; @@ -270,6 +272,8 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card if (contextMenu.isActive() && contextMenu.getPointDescription() != null && contextMenu.getPointDescription().isGpxPoint()) { contextMenu.show(); + } else if (Algorithms.objectEquals(returnScreenName, QuickSearchDialogFragment.TAG)) { + mapActivity.showQuickSearch(ShowQuickSearchMode.CURRENT, false); } else { mapActivity.launchPrevActivityIntent(); } @@ -1156,7 +1160,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { startNavigationForGPX(gpxFile, mapActivity.getMapActions()); - RouteProvider.GPXRouteParamsBuilder paramsBuilder = app.getRoutingHelper().getCurrentGPXRoute(); + GPXRouteParamsBuilder paramsBuilder = app.getRoutingHelper().getCurrentGPXRoute(); if (paramsBuilder != null) { paramsBuilder.setSelectedSegment(selectedSegment); app.getRoutingHelper().onSettingsChanged(true); diff --git a/OsmAnd/src/net/osmand/plus/track/TrackWidthCard.java b/OsmAnd/src/net/osmand/plus/track/TrackWidthCard.java index 2a8f34c024..9e98414d34 100644 --- a/OsmAnd/src/net/osmand/plus/track/TrackWidthCard.java +++ b/OsmAnd/src/net/osmand/plus/track/TrackWidthCard.java @@ -45,6 +45,7 @@ public class TrackWidthCard extends BaseCard { private GpxWidthAdapter widthAdapter; private View sliderContainer; + private RecyclerView groupRecyclerView; public TrackWidthCard(MapActivity mapActivity, TrackDrawInfo trackDrawInfo, OnNeedScrollListener onNeedScrollListener) { @@ -65,9 +66,10 @@ public class TrackWidthCard extends BaseCard { updateCustomWidthSlider(); widthAdapter = new GpxWidthAdapter(appearanceItems); - RecyclerView groupRecyclerView = view.findViewById(R.id.recycler_view); + groupRecyclerView = view.findViewById(R.id.recycler_view); groupRecyclerView.setAdapter(widthAdapter); groupRecyclerView.setLayoutManager(new LinearLayoutManager(app, RecyclerView.HORIZONTAL, false)); + scrollMenuToSelectedItem(); AndroidUiHelper.updateVisibility(view.findViewById(R.id.top_divider), isShowDivider()); } @@ -155,7 +157,7 @@ public class TrackWidthCard extends BaseCard { } } }); - UiUtilities.setupSlider(widthSlider, nightMode, null); + UiUtilities.setupSlider(widthSlider, nightMode, null, true); ScrollUtils.addOnGlobalLayoutListener(sliderContainer, new Runnable() { @Override public void run() { @@ -175,6 +177,13 @@ public class TrackWidthCard extends BaseCard { mapActivity.refreshMap(); } + private void scrollMenuToSelectedItem() { + int position = widthAdapter.getItemPosition(selectedItem); + if (position != -1) { + groupRecyclerView.scrollToPosition(position); + } + } + private class GpxWidthAdapter extends RecyclerView.Adapter { private List items; @@ -219,6 +228,7 @@ public class TrackWidthCard extends BaseCard { updateHeader(); updateCustomWidthSlider(); + scrollMenuToSelectedItem(); CardListener listener = getListener(); if (listener != null) { diff --git a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java index 475e7879aa..ad1a8bb190 100644 --- a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java +++ b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java @@ -638,8 +638,7 @@ public class OsmandMapTileView implements IMapDownloaderCallback { } else if (mapPosition == OsmandSettings.LANDSCAPE_MIDDLE_RIGHT_CONSTANT) { ratiox = 0.7f; } else { - boolean isLayoutRtl = AndroidUtils.isLayoutRtl(application); - ratiox = mapPositionX == 0 ? 0.5f : (isLayoutRtl ? 0.25f : 0.75f); + ratiox = mapPositionX == 0 ? 0.5f : (isLayoutRtl() ? 0.25f : 0.75f); } final int cy = (int) (ratioy * view.getHeight()); final int cx = (int) (ratiox * view.getWidth()); @@ -959,7 +958,8 @@ public class OsmandMapTileView implements IMapDownloaderCallback { if (tileBoxWidthPx > 0) { tbw = (int) (tileBoxWidthPx * border); if (marginLeftPx > 0) { - dx = (tb.getPixWidth() - tileBoxWidthPx) / 2 - marginLeftPx; + int offset = (tb.getPixWidth() - tileBoxWidthPx) / 2 - marginLeftPx; + dx = isLayoutRtl() ? -offset : offset; } } else if (tileBoxHeightPx > 0) { tbh = (int) (tileBoxHeightPx * border); @@ -1425,4 +1425,8 @@ public class OsmandMapTileView implements IMapDownloaderCallback { public Context getContext() { return activity; } + + public boolean isLayoutRtl() { + return AndroidUtils.isLayoutRtl(application); + } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java index 945796a726..ed425c0993 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java @@ -876,9 +876,13 @@ public class MapControlsLayer extends OsmandMapLayer { routePlanningBtn.updateVisibility(showBottomMenuButtons); menuControl.updateVisibility(showBottomMenuButtons); - boolean showZoomButtons = !routeDialogOpened && !shouldHideTopControls && !isInTrackAppearanceMode() - && (!isInGpxApproximationMode() || !isPotrait()) - && !isInFollowTrackMode() && (!isInChoosingRoutesMode() || !isInWaypointsChoosingMode() || !portrait); + boolean additionalDialogsHide = !isInGpxApproximationMode() + && !isInTrackAppearanceMode() + && !isInChoosingRoutesMode() + && !isInWaypointsChoosingMode(); + boolean showZoomButtons = !routeDialogOpened && !shouldHideTopControls + && !isInFollowTrackMode() + && (additionalDialogsHide || !portrait); mapZoomIn.updateVisibility(showZoomButtons); mapZoomOut.updateVisibility(showZoomButtons); @@ -1020,9 +1024,14 @@ public class MapControlsLayer extends OsmandMapLayer { public void updateMyLocationVisibility(MapHudButton backToLocationControl, RoutingHelper rh, boolean dialogOpened) { boolean tracked = mapActivity.getMapViewTrackingUtilities().isMapLinkedToLocation(); - boolean visible = !(tracked && rh.isFollowingMode()) && (!isInGpxApproximationMode() || !isPotrait()); + boolean visible = !(tracked && rh.isFollowingMode()); + boolean additionalDialogsHide = !isInTrackAppearanceMode() + && !isInGpxApproximationMode() + && !isInChoosingRoutesMode() + && !isInWaypointsChoosingMode() + && !isInFollowTrackMode(); backToLocationControl.updateVisibility(visible && !dialogOpened && !isInPlanRouteMode() - && !isInTrackAppearanceMode() && (!isInChoosingRoutesMode() || !isInWaypointsChoosingMode() || !isInFollowTrackMode() || !isPotrait())); + && (additionalDialogsHide || !isPotrait())); } public boolean onSingleTap(PointF point, RotatedTileBox tileBox) { diff --git a/OsmAnd/src/net/osmand/plus/views/layers/RouteLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/RouteLayer.java index f966b7d897..083d94f4ff 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/RouteLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/RouteLayer.java @@ -32,7 +32,7 @@ import net.osmand.plus.measurementtool.MeasurementToolFragment; import net.osmand.plus.profiles.LocationIcon; import net.osmand.plus.routing.RouteCalculationResult; import net.osmand.plus.routing.RouteDirectionInfo; -import net.osmand.plus.routing.RouteProvider; +import net.osmand.plus.routing.RouteService; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.TransportRoutingHelper; import net.osmand.plus.views.OsmandMapLayer; @@ -360,8 +360,8 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont } } else { RouteCalculationResult route = helper.getRoute(); - boolean directTo = route.getRouteService() == RouteProvider.RouteService.DIRECT_TO; - boolean straight = route.getRouteService() == RouteProvider.RouteService.STRAIGHT; + boolean directTo = route.getRouteService() == RouteService.DIRECT_TO; + boolean straight = route.getRouteService() == RouteService.STRAIGHT; publicTransportRouteGeometry.clearRoute(); routeGeometry.updateRoute(tb, route); if (directTo) { diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java index ac0765cee5..52801776cd 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java @@ -33,7 +33,6 @@ public class MapMarkersWidgetsFactory { private final MapActivity map; private MapMarkersHelper helper; - private int screenOrientation; private boolean portraitMode; private View topBar; @@ -59,7 +58,6 @@ public class MapMarkersWidgetsFactory { public MapMarkersWidgetsFactory(final MapActivity map) { this.map = map; helper = map.getMyApplication().getMapMarkersHelper(); - screenOrientation = map.getMyApplication().getUIUtilities().getScreenOrientation(); portraitMode = AndroidUiHelper.isOrientationPortrait(map); addressTopBar = map.findViewById(R.id.map_top_bar); @@ -245,7 +243,7 @@ public class MapMarkersWidgetsFactory { } dd.setImage(R.drawable.ic_arrow_marker_diretion, MapMarker.getColorId(marker.colorIndex)); if (heading != null && loc != null) { - dd.setAngle(mes[1] - heading + 180 + screenOrientation); + dd.setAngle(mes[1] - heading + 180); } if (newImage) { arrowImg.setImageDrawable(dd); diff --git a/OsmAnd/src/net/osmand/plus/widgets/FlowLayout.java b/OsmAnd/src/net/osmand/plus/widgets/FlowLayout.java index 63a43e56ad..16f87a9561 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/FlowLayout.java +++ b/OsmAnd/src/net/osmand/plus/widgets/FlowLayout.java @@ -1,7 +1,6 @@ package net.osmand.plus.widgets; import android.content.Context; -import android.os.Build; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; @@ -11,22 +10,7 @@ import net.osmand.AndroidUtils; public class FlowLayout extends ViewGroup { private int line_height; - - public static class LayoutParams extends ViewGroup.LayoutParams { - - final int horizontal_spacing; - final int vertical_spacing; - - /** - * @param horizontal_spacing Pixels between items, horizontally - * @param vertical_spacing Pixels between items, vertically - */ - public LayoutParams(int horizontal_spacing, int vertical_spacing) { - super(0, 0); - this.horizontal_spacing = horizontal_spacing; - this.vertical_spacing = vertical_spacing; - } - } + private boolean horizontalAutoSpacing; public FlowLayout(Context context) { super(context); @@ -36,16 +20,22 @@ public class FlowLayout extends ViewGroup { super(context, attrs); } + // If true, available horizontal space is added to items horizontalSpacing to fit the screen width. + public void setHorizontalAutoSpacing(boolean horizontalAutoSpacing) { + this.horizontalAutoSpacing = horizontalAutoSpacing; + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if ((MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED)) throw new AssertionError(); + if ((MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED)) + throw new AssertionError(); final int width = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight(); int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom(); final int count = getChildCount(); int line_height = 0; - int xpos = getPaddingLeft(); - int ypos = getPaddingTop(); + int horizontalPosition = getPaddingLeft(); + int verticalPosition = getPaddingTop(); int childHeightMeasureSpec; if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) { @@ -59,22 +49,22 @@ public class FlowLayout extends ViewGroup { if (child.getVisibility() != GONE) { final LayoutParams lp = (LayoutParams) child.getLayoutParams(); child.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), childHeightMeasureSpec); - final int childw = child.getMeasuredWidth(); - line_height = Math.max(line_height, child.getMeasuredHeight() + lp.vertical_spacing); - if (xpos + childw > width) { - xpos = getPaddingLeft(); - ypos += line_height; + final int childWidth = child.getMeasuredWidth(); + line_height = Math.max(line_height, child.getMeasuredHeight() + lp.verticalSpacing); + if (horizontalPosition + childWidth > width) { + horizontalPosition = getPaddingLeft(); + verticalPosition += line_height; } - xpos += childw + lp.horizontal_spacing; + horizontalPosition += childWidth + lp.horizontalSpacing; } } this.line_height = line_height; if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) { - height = ypos + line_height; + height = verticalPosition + line_height; } else if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) { - if (ypos + line_height < height) { - height = ypos + line_height; + if (verticalPosition + line_height < height) { + height = verticalPosition + line_height; } } setMeasuredDimension(width, height); @@ -95,30 +85,60 @@ public class FlowLayout extends ViewGroup { final int count = getChildCount(); final int width = r - l; boolean isLayoutRtl = AndroidUtils.isLayoutRtl(getContext()); - int xpos = isLayoutRtl ? width - getPaddingRight() : getPaddingLeft(); - int ypos = getPaddingTop(); + int horizontalPosition = isLayoutRtl ? width - getPaddingRight() : getPaddingLeft(); + int verticalPosition = getPaddingTop(); for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (child.getVisibility() != GONE) { - final int childw = child.getMeasuredWidth(); - final int childh = child.getMeasuredHeight(); final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + final int childWidth = child.getMeasuredWidth(); + final int childHeight = child.getMeasuredHeight(); + int freeSizeSpacing = getFreeSizeSpacing(width, lp, childWidth); if (isLayoutRtl) { - if (xpos - childw < l) { - xpos = width - getPaddingRight(); - ypos += line_height; + if (horizontalPosition - childWidth < getPaddingLeft()) { + horizontalPosition = width - getPaddingRight(); + verticalPosition += line_height; } - child.layout(xpos - childw, ypos, xpos, ypos + childh); - xpos -= childw + lp.horizontal_spacing; + child.layout(horizontalPosition - childWidth, verticalPosition, horizontalPosition, verticalPosition + childHeight); + horizontalPosition -= freeSizeSpacing; } else { - if (xpos + childw > width) { - xpos = getPaddingLeft(); - ypos += line_height; + if (horizontalPosition + childWidth > width) { + horizontalPosition = getPaddingLeft(); + verticalPosition += line_height; } - child.layout(xpos, ypos, xpos + childw, ypos + childh); - xpos += childw + lp.horizontal_spacing; + child.layout(horizontalPosition, verticalPosition, horizontalPosition + childWidth, verticalPosition + childHeight); + horizontalPosition += freeSizeSpacing; } } } } + + private int getFreeSizeSpacing(int width, LayoutParams lp, int childWidth) { + int freeSizeSpacing; + int itemsCount = width / (childWidth + lp.horizontalSpacing); + if (itemsCount > 1 && horizontalAutoSpacing) { + freeSizeSpacing = (width - childWidth) / (itemsCount-1); + } else if (!horizontalAutoSpacing) { + freeSizeSpacing = childWidth + lp.horizontalSpacing; + } else { + freeSizeSpacing = (width % childWidth / itemsCount); + } + return freeSizeSpacing; + } + + public static class LayoutParams extends ViewGroup.LayoutParams { + + final int horizontalSpacing; + final int verticalSpacing; + + /** + * @param horizontalSpacing Pixels between items, horizontally + * @param verticalSpacing Pixels between items, vertically + */ + public LayoutParams(int horizontalSpacing, int verticalSpacing) { + super(0, 0); + this.horizontalSpacing = horizontalSpacing; + this.verticalSpacing = verticalSpacing; + } + } } \ No newline at end of file