diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java index 9450d589f90..e13d1679a16 100644 --- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java +++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java @@ -2275,10 +2275,12 @@ public String toString() { private static boolean testAddressSearch = false; private static boolean testAddressSearchName = false; private static boolean testAddressJustifySearch = false; - private static boolean testPoiSearch = true; + private static boolean testPoiSearch = false; private static boolean testPoiSearchOnPath = false; private static boolean testTransportSearch = false; - + private static boolean testPoiRouteByName = true; + private static boolean testPoiRouteByType = true; + private static int sleft = MapUtils.get31TileNumberX(27.55079); private static int sright = MapUtils.get31TileNumberX(27.55317); private static int stop = MapUtils.get31TileNumberY(53.89378); @@ -2319,13 +2321,25 @@ public static void main(String[] args) throws IOException { PoiRegion poiRegion = reader.getPoiIndexes().get(0); if (testPoiSearch) { testPoiSearch(reader, poiRegion); - testPoiSearchByName(reader); + testPoiSearchByName(reader, "central ukraine", 0, 0); } if (testPoiSearchOnPath) { testSearchOnthePath(reader); } } + if (testPoiRouteByName || testPoiRouteByType) { + int y = MapUtils.get31TileNumberY(36.023431); + int x = MapUtils.get31TileNumberX(14.298406); + if (testPoiRouteByName) { + testPoiSearchByName(reader, "Gozo Coastal Walk", x, y); // Malta - Gozo Island - osm_hiking track + } + if (testPoiRouteByType) { + testPoiSearchByType(reader, "routes", "osm_hiking", x, y); +// testPoiSearchByType(reader, "routes", null, x, y); + } + } + println("MEMORY " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())); //$NON-NLS-1$ println("Time " + (System.currentTimeMillis() - time)); //$NON-NLS-1$ } @@ -2436,16 +2450,49 @@ private static List readGPX(File f) { } return res; } + private static void testPoiSearchByType(BinaryMapIndexReader reader, String askType, String askSubType, int x, int y) throws IOException { + println("Searching by type/subtype..."); + + SearchRequest req = buildSearchPoiRequest(x, y, "", 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, + new SearchPoiTypeFilter() { + @Override + public boolean accept(PoiCategory type, String subcategory) { + return type.getKeyName().equals(askType) && (askSubType == null || subcategory.equals(askSubType)); + } + @Override + public boolean isEmpty() { + return false; + } + }, null, null); + + reader.searchPoi(req); + for (Amenity a : req.getSearchResults()) { + int distance = 0; + if (x > 0 && y > 0) { + distance = (int)MapUtils.getDistance(a.getLocation(), + MapUtils.get31LatitudeY(y), MapUtils.get31LongitudeX(x)); + } + println(a.getType().getTranslation() + + " " + a.getSubType() + " " + a.getName() + " " + a.getLocation() + + (distance > 0 ? (" Dist " + distance + " m") : "")); + } + } - private static void testPoiSearchByName(BinaryMapIndexReader reader) throws IOException { + private static void testPoiSearchByName(BinaryMapIndexReader reader, String query, int x, int y) throws IOException { println("Searching by name..."); - SearchRequest req = buildSearchPoiRequest(0, 0, "central ukraine", + SearchRequest req = buildSearchPoiRequest(x, y, query, 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, null); reader.searchPoiByName(req); for (Amenity a : req.getSearchResults()) { + int distance = 0; + if (x > 0 && y > 0) { + distance = (int)MapUtils.getDistance(a.getLocation(), + MapUtils.get31LatitudeY(y), MapUtils.get31LongitudeX(x)); + } println(a.getType().getTranslation() + - " " + a.getSubType() + " " + a.getName() + " " + a.getLocation()); + " " + a.getSubType() + " " + a.getName() + " " + a.getLocation() + + (distance > 0 ? (" Dist " + distance + " m") : "")); } } diff --git a/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java b/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java index ea2f5cbc6cf..4d84427b877 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java @@ -166,7 +166,12 @@ public String getAdditionalInfo(String key) { return null; } String str = additionalInfo.get(key); - str = unzipContent(str); + if (str == null && key.contains(":")) { + str = additionalInfo.get(key.replaceAll(":", "_-_")); // try content_-_uk after content:uk + } + if (str != null) { + str = unzipContent(str); + } return str; } @@ -425,7 +430,7 @@ public String getTagContent(String tag, String lang) { return translateName; } for (String nm : getAdditionalInfoKeys()) { - if (nm.startsWith(tag + ":")) { + if (nm.startsWith(tag + ":") || nm.startsWith(tag + "_-_")) { return getAdditionalInfo(nm); } } 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 6915e30536b..ae5f1852d14 100644 --- a/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java +++ b/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java @@ -829,6 +829,8 @@ public void structureWorldRegions(List loadedItems) { it.remove(); } else if (region.getRegionId().contains("basemap")) { it.remove(); + } else if (region.getRegionId().startsWith("World_")) { + it.remove(); } } else { it.remove(); diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/MapPoiTypes.java b/OsmAnd-java/src/main/java/net/osmand/osm/MapPoiTypes.java index 38bc5cf6f3d..05170babbd1 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/MapPoiTypes.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/MapPoiTypes.java @@ -547,10 +547,13 @@ public void initFromInputStream(InputStream is) { } } } - default -> log.warn("Unknown start tag encountered: " + name); + case "poi_types" -> { + // just ignore the root tag of poi_types.xml + } + default -> log.warn("Unknown start tag encountered: " + name); } - } else if (tok == XmlPullParser.END_TAG) { - String name = parser.getName(); + } else if (tok == XmlPullParser.END_TAG) { + String name = parser.getName(); switch (name) { case "poi_filter" -> { if (!lastFilterPoiAdditionalsCategories.isEmpty()) { diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/OsmRouteType.java b/OsmAnd-java/src/main/java/net/osmand/osm/OsmRouteType.java index 3846e8e8145..fd59f66fd96 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/OsmRouteType.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/OsmRouteType.java @@ -154,6 +154,8 @@ public static OsmRouteType convertFromOsmGPXTag(String tg) { case "btt": case "vth": case "mtb ride": + case "disused:mtb": + case "abandoned:mtb": return MOUNTAINBIKE; case "hiking": case "route=hiking": @@ -164,6 +166,13 @@ public static OsmRouteType convertFromOsmGPXTag(String tg) { case "randonnée": case "trekking": case "climbing": + case "ferrata": + case "via_ferrata": + case "proposed:hiking": + case "deprecated:hiking": + case "abandoned:hiking": + case "old_hiking": + case "canyoning": return HIKING; case "bike": case "biking": @@ -194,6 +203,8 @@ public static OsmRouteType convertFromOsmGPXTag(String tg) { case "network=ncn": case "network=icn": case "network=lcn": + case "proposed:bicycle": + case "old_bicycle": return CYCLING; case "car": case "motorcar": @@ -249,6 +260,8 @@ public static OsmRouteType convertFromOsmGPXTag(String tg) { case "network=iwn": case "network=lwn": case "network=rwn": + case "unmarked:foot": + case "nordic_walking": return WALKING; case "ling-moto": case "motorbiking": @@ -277,6 +290,9 @@ public static OsmRouteType convertFromOsmGPXTag(String tg) { case "lake": case "lakes": case "canal": + case "waterway": + case "motorboat": + case "canoe": return WATER; case "ski": case "skiing": @@ -289,6 +305,7 @@ public static OsmRouteType convertFromOsmGPXTag(String tg) { case "лыжня": case "nordic": case "piste": + case "piste:type=nordic": return WINTER; case "snowmobile=designated": case "snowmobile=permissive": @@ -301,6 +318,10 @@ public static OsmRouteType convertFromOsmGPXTag(String tg) { return RIDING; case "racing": return RACING; + case "inline_skates": + return INLINE_SKATES; + case "fitness_trail": + return FITNESS; } return null; } diff --git a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleSearchRequest.java b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleSearchRequest.java index 6811282c3c0..c4c911cc764 100644 --- a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleSearchRequest.java +++ b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRuleSearchRequest.java @@ -9,6 +9,10 @@ import net.osmand.binary.BinaryMapDataObject; import net.osmand.util.Algorithms; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; public class RenderingRuleSearchRequest { @@ -54,6 +58,29 @@ public RenderingRuleSearchRequest(RenderingRuleSearchRequest searchRequest) { saveState(); } + public static RenderingRuleSearchRequest initWithCustomProperties(RenderingRulesStorage renderingRules, int zoom, + Map customProperties) { + RenderingRuleSearchRequest searchRequest = new RenderingRuleSearchRequest(renderingRules); + + for (RenderingRuleProperty customProp : renderingRules.PROPS.getCustomRules()) { + String custom = customProperties != null ? customProperties.get(customProp.getAttrName()) : null; + if (customProp.isBoolean()) { + searchRequest.setBooleanFilter(customProp, custom != null ? "true".equals(custom) : false); + } else { + searchRequest.setStringFilter(customProp, custom != null ? custom : ""); + } + } + + if (zoom > 0) { + searchRequest.setIntFilter(renderingRules.PROPS.R_MINZOOM, zoom); + searchRequest.setIntFilter(renderingRules.PROPS.R_MAXZOOM, zoom); + } + + searchRequest.saveState(); + + return searchRequest; + } + RenderingRulesStorage getStorage() { return storage; } @@ -348,4 +375,68 @@ public String toString() { } return builder.toString(); } -} \ No newline at end of file + + public String searchIconByTags(Map transformedTags) { + return searchTopOrderedPropertyByTags(transformedTags, RenderingRulesStorage.POINT_RULES, + storage.PROPS.R_ICON, storage.PROPS.R_ICON_ORDER); + } + + private String searchTopOrderedPropertyByTags(Map transformedTags, int rulesNumber, + RenderingRuleProperty mainStringProperty, + RenderingRuleProperty orderIntProperty) { + + Map resultOrderMap = new HashMap<>(); + + for (Map.Entry entry : transformedTags.entrySet()) { + final String tag = entry.getKey(); + final String value = entry.getValue(); + clearState(); + setStringFilter(storage.PROPS.R_TAG, tag); + setStringFilter(storage.PROPS.R_VALUE, value); + clearValue(storage.PROPS.R_ADDITIONAL); // parent - no additional + + int order = 0; + String result = null; + search(rulesNumber); + + if (isSpecified(mainStringProperty)) { + result = getStringPropertyValue(mainStringProperty); + order = orderIntProperty != null ? getIntPropertyValue(orderIntProperty) : 0; + } + + // Cycle tags to visit "additional" rules. XXX: think how to optimize. + for (Map.Entry additional : transformedTags.entrySet()) { + final String aTag = additional.getKey(); + final String aValue = additional.getValue(); + + if (aTag.equals(tag) && aValue.equals(value)) { + continue; + } + + setStringFilter(storage.PROPS.R_ADDITIONAL, aTag + "=" + aValue); + search(rulesNumber); + + if (isSpecified(mainStringProperty)) { + String childResult = getStringPropertyValue(mainStringProperty); + if (childResult != null && (result == null || !result.equals(childResult))) { + order = orderIntProperty != null ? getIntPropertyValue(orderIntProperty) : 0; + result = childResult; + break; // enough + } + } + } + + if (result != null) { + resultOrderMap.put(result, order); + } + } + + if (!resultOrderMap.isEmpty()) { + Map.Entry bestResult = + Collections.min(resultOrderMap.entrySet(), Comparator.comparingInt(Map.Entry::getValue)); + return bestResult.getKey(); + } + + return null; + } +} diff --git a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRulesStorage.java b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRulesStorage.java index db619c6dece..2b639e050c9 100644 --- a/OsmAnd-java/src/main/java/net/osmand/render/RenderingRulesStorage.java +++ b/OsmAnd-java/src/main/java/net/osmand/render/RenderingRulesStorage.java @@ -616,26 +616,7 @@ public static void main(String[] args) throws XmlPullParserException, IOExceptio styleName = "test"; styleFile = new File(stylesDir, styleName +".render.xml"); } - final Map renderingConstants = new LinkedHashMap(); - - try { - XmlPullParser parser = PlatformUtil.newXMLPullParser(); - parser.setInput(defaultIS, "UTF-8"); - int tok; - while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) { - if (tok == XmlPullParser.START_TAG) { - String tagName = parser.getName(); - if (tagName.equals("renderingConstant")) { - if (!renderingConstants.containsKey(parser.getAttributeValue("", "name"))) { - renderingConstants.put(parser.getAttributeValue("", "name"), - parser.getAttributeValue("", "value")); - } - } - } - } - } finally { - defaultIS.close(); - } + final Map renderingConstants = readRenderingConstantsFromInputStream(defaultIS); RenderingRulesStorage storage = new RenderingRulesStorage(styleName, renderingConstants); final RenderingRulesStorageResolver resolver = new RenderingRulesStorageResolver() { @Override @@ -701,11 +682,66 @@ protected static void testSearch(RenderingRulesStorage storage) { public static RenderingRulesStorage getTestStorageForStyle(String filePath) throws XmlPullParserException, IOException { RenderingRulesStorage.STORE_ATTRIBUTES = true; - Map renderingConstants = new LinkedHashMap(); InputStream is = new FileInputStream(filePath); - // buggy attributes + final Map renderingConstants = readRenderingConstantsFromInputStream(is); + + is = new FileInputStream(filePath); + RenderingRulesStorage storage = new RenderingRulesStorage("default", renderingConstants); + final RenderingRulesStorageResolver resolver = new RenderingRulesStorageResolver() { + @Override + public RenderingRulesStorage resolve(String name, RenderingRulesStorageResolver ref) throws XmlPullParserException, IOException { + RenderingRulesStorage depends = new RenderingRulesStorage(name, null); + depends.parseRulesFromXmlInputStream(RenderingRulesStorage.class.getResourceAsStream(name + ".render.xml"), ref, false); + return depends; + } + }; + storage.parseRulesFromXmlInputStream(is, resolver, false); + return storage; + } + + public static RenderingRulesStorage initWithStylesFromResources(String... resourceFileNames) { try { + RenderingRulesStorage storage = null; + final String BASE_EXT = ".render.xml"; + final String ADDON_EXT = ".addon.render.xml"; + final String[] defaultStyles = new String[]{"default.render.xml"}; + + for (String resourceName : resourceFileNames != null ? resourceFileNames : defaultStyles) { + boolean addon = resourceName.endsWith(ADDON_EXT); + String styleName = resourceName.replace(ADDON_EXT, "").replace(BASE_EXT, ""); + Map constants = readRenderingConstantsFromInputStream( + RenderingRulesStorage.class.getResourceAsStream(resourceName)); + if (storage == null) { + storage = new RenderingRulesStorage(styleName, constants); + } else { + storage.renderingConstants.putAll(constants); + } + final RenderingRulesStorage.RenderingRulesStorageResolver resolver = (name, ref) -> { + final String resource = name + (addon ? ADDON_EXT : BASE_EXT); + final RenderingRulesStorage depends = new RenderingRulesStorage(name, + readRenderingConstantsFromInputStream(RenderingRulesStorage.class.getResourceAsStream(resource))); + final InputStream depStream = RenderingRulesStorage.class.getResourceAsStream(resource); + depends.parseRulesFromXmlInputStream(depStream, ref, false); + depStream.close(); + return depends; + }; + final InputStream xmlStream = RenderingRulesStorage.class.getResourceAsStream(resourceName); + storage.parseRulesFromXmlInputStream(xmlStream, resolver, addon); + xmlStream.close(); + } + return storage; + } catch (XmlPullParserException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static Map readRenderingConstantsFromInputStream(InputStream is) + throws XmlPullParserException, IOException { + Map renderingConstants = new LinkedHashMap<>(); + try (is) { XmlPullParser parser = PlatformUtil.newXMLPullParser(); parser.setInput(is, "UTF-8"); int tok; @@ -720,21 +756,8 @@ public static RenderingRulesStorage getTestStorageForStyle(String filePath) thro } } } - } finally { - is.close(); } - is = new FileInputStream(filePath); - RenderingRulesStorage storage = new RenderingRulesStorage("default", renderingConstants); - final RenderingRulesStorageResolver resolver = new RenderingRulesStorageResolver() { - @Override - public RenderingRulesStorage resolve(String name, RenderingRulesStorageResolver ref) throws XmlPullParserException, IOException { - RenderingRulesStorage depends = new RenderingRulesStorage(name, null); - depends.parseRulesFromXmlInputStream(RenderingRulesStorage.class.getResourceAsStream(name + ".render.xml"), ref, false); - return depends; - } - }; - storage.parseRulesFromXmlInputStream(is, resolver, false); - return storage; + return renderingConstants; } protected static void printAllRules(RenderingRulesStorage storage) { diff --git a/OsmAnd-java/src/main/java/net/osmand/router/HHRoutePlanner.java b/OsmAnd-java/src/main/java/net/osmand/router/HHRoutePlanner.java index 8c12c7239ed..154a0629b38 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/HHRoutePlanner.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/HHRoutePlanner.java @@ -1279,6 +1279,10 @@ private void recalculateNetworkCluster(HHRoutingContext hctx, NetworkDBPoint // SPEEDUP: Speed up by just clearing visited hctx.rctx.unloadAllData(); // needed for proper multidijsktra work RouteSegmentPoint s = loadPoint(hctx.rctx, start); + if (s == null) { + System.err.printf("HH recalculateNetworkCluster: loadPoint() is NULL for %s\n", start); + return; + } // hctx.rctx.calculationProgress = new RouteCalculationProgress(); // we should reuse same progress for cancellation hctx.rctx.config.MAX_VISITED = MAX_POINTS_CLUSTER_ROUTING * 2; long ps = calcRPId(s, s.getSegmentStart(), s.getSegmentEnd()); 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 37ae3173f16..244696507a2 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java @@ -1,26 +1,5 @@ package net.osmand.router; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; - -import org.apache.commons.logging.Log; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - import gnu.trove.list.array.TIntArrayList; import gnu.trove.set.hash.TIntHashSet; import net.osmand.PlatformUtil; @@ -40,6 +19,26 @@ import net.osmand.util.Algorithms; import net.osmand.util.MapAlgorithms; import net.osmand.util.MapUtils; +import org.apache.commons.logging.Log; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; public class RouteResultPreparation { @@ -1239,6 +1238,9 @@ private void inferCommonActiveLane(TurnType currentTurn, TurnType nextTurn) { TurnType.setTertiaryTurn(lanes, i, TurnType.getPrimaryTurn(lanes[i])); TurnType.setPrimaryTurn(lanes, i, singleTurn); } else { + if (lanes.length == 1) { + return; + } // disable lane lanes[i] = lanes[i] - 1; } diff --git a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java index c7e9a0dff4e..d4b4f2a1f22 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java @@ -289,6 +289,13 @@ public boolean sameSearchResult(SearchResult r1, SearchResult r2) { || (subType1.startsWith("route_hiking_") && subType1.endsWith("n_poi"))) { similarityRadius = 50000; } + final String ROUTE_ID = "route_id"; + final String ROUTE_TRACK = "route_track"; + final String ROUTE_TYPE_PREFIX = "activities_"; + if (Algorithms.stringsEqual(a1.getAdditionalInfo(ROUTE_ID), a2.getAdditionalInfo(ROUTE_ID)) + && (subType1.startsWith(ROUTE_TYPE_PREFIX) || subType1.equals(ROUTE_TRACK))) { + similarityRadius = 50000; + } } } else if (ObjectType.isAddress(r1.objectType) && ObjectType.isAddress(r2.objectType)) { similarityRadius = 100; diff --git a/OsmAnd-shared/src/commonMain/kotlin/net/osmand/shared/gpx/primitives/WptPt.kt b/OsmAnd-shared/src/commonMain/kotlin/net/osmand/shared/gpx/primitives/WptPt.kt index 1012774b6df..e4352d50b1c 100644 --- a/OsmAnd-shared/src/commonMain/kotlin/net/osmand/shared/gpx/primitives/WptPt.kt +++ b/OsmAnd-shared/src/commonMain/kotlin/net/osmand/shared/gpx/primitives/WptPt.kt @@ -104,9 +104,9 @@ class WptPt : GpxExtensions { desc: String?, name: String?, category: String?, - color: String, - icon: String, - background: String + color: String?, + icon: String?, + background: String? ) { this.lat = lat this.lon = lon diff --git a/OsmAnd-shared/src/commonMain/kotlin/net/osmand/shared/obd/OBDDataComputer.kt b/OsmAnd-shared/src/commonMain/kotlin/net/osmand/shared/obd/OBDDataComputer.kt index 164bfc74dcb..b9013267b5d 100644 --- a/OsmAnd-shared/src/commonMain/kotlin/net/osmand/shared/obd/OBDDataComputer.kt +++ b/OsmAnd-shared/src/commonMain/kotlin/net/osmand/shared/obd/OBDDataComputer.kt @@ -30,6 +30,12 @@ object OBDDataComputer { compute() } + fun clearCache() { + for (widget in widgets) { + widget.clearData() + } + } + fun registerLocation(l: OBDLocation) { if (widgets.isNotEmpty()) { // concurrency - change collection in one thread. Other places only read @@ -230,6 +236,13 @@ object OBDDataComputer { private var cachedVersion = 0 private var version = 0 + fun clearData() { + values = ArrayList() + value = null + cachedVersion = 0 + version = 0 + } + fun computeValue(): Any? { if (cachedVersion != version) { val v = version @@ -367,7 +380,7 @@ object OBDDataComputer { } private fun calculateFuelConsumption(locValues: ArrayList>): Float { - val first = locValues[0] + val first = locValues[locValues.size - 2] val last = locValues[locValues.size - 1] val diffPerc = (first.value as Number).toFloat() - (last.value as Number).toFloat() val diffTime = last.timestamp - first.timestamp diff --git a/OsmAnd-shared/src/commonMain/kotlin/net/osmand/shared/obd/OBDDispatcher.kt b/OsmAnd-shared/src/commonMain/kotlin/net/osmand/shared/obd/OBDDispatcher.kt index 895c1aab792..ad8caa12a93 100644 --- a/OsmAnd-shared/src/commonMain/kotlin/net/osmand/shared/obd/OBDDispatcher.kt +++ b/OsmAnd-shared/src/commonMain/kotlin/net/osmand/shared/obd/OBDDispatcher.kt @@ -140,6 +140,8 @@ object OBDDispatcher { fun stopReading() { log("stop reading") setReadWriteStreams(null, null) + sensorDataCache.clear() + OBDDataComputer.clearCache() log("after stop reading") } diff --git a/OsmAnd/.gitignore b/OsmAnd/.gitignore index a0adc593a42..c7655fb6391 100644 --- a/OsmAnd/.gitignore +++ b/OsmAnd/.gitignore @@ -53,6 +53,7 @@ use/ osmand.properties osmand.xml assets/specialphrases/* +assets/bundled_assets.json assets/voice/* assets/fonts/* assets/feature_articles/* diff --git a/OsmAnd/build-common.gradle b/OsmAnd/build-common.gradle index 96e399d9bc9..881b50a410d 100644 --- a/OsmAnd/build-common.gradle +++ b/OsmAnd/build-common.gradle @@ -166,6 +166,13 @@ tasks.register('collectHelpContentsStyle', Copy) { into "assets" } +tasks.register('copyBundledAssets', Copy) { + from("../../resources/bundled_assets.json") { + include "bundled_assets.json" + } + into "assets" +} + tasks.register('copyProjDb', Copy) { from("../../resources/proj") { include "proj.db" @@ -251,6 +258,7 @@ tasks.register('collectExternalResources') { copyMapPOIIcons, copyLargePOIIcons, validateTranslate, + copyBundledAssets, copyProjDb, copyColorPalettes, copyPoiCategories, diff --git a/OsmAnd/build-library.gradle b/OsmAnd/build-library.gradle index 1f1746e7cf8..45bd0b81393 100644 --- a/OsmAnd/build-library.gradle +++ b/OsmAnd/build-library.gradle @@ -51,6 +51,7 @@ android { osmandTask.dependsOn(copyRouteActivities) osmandTask.dependsOn(collectHelpContentsStyle) osmandTask.dependsOn(copyColorPalettes) + osmandTask.dependsOn(copyBundledAssets) osmandTask.dependsOn(copy3DModels) osmandTask.dependsOn(collectVoiceAssets) osmandTask.dependsOn(downloadWorldMiniBasemap) diff --git a/OsmAnd/build.gradle b/OsmAnd/build.gradle index 77053f7401e..647c9b5091f 100644 --- a/OsmAnd/build.gradle +++ b/OsmAnd/build.gradle @@ -43,9 +43,9 @@ android { defaultConfig { minSdkVersion 24 - versionCode 4900 + versionCode 5000 versionCode System.getenv("APK_NUMBER_VERSION") ? System.getenv("APK_NUMBER_VERSION").toInteger() : versionCode - versionName "4.9.0" + versionName "5.0.0" versionName System.getenv("APK_VERSION")? System.getenv("APK_VERSION").toString(): versionName versionName System.getenv("APK_VERSION_SUFFIX")? versionName + System.getenv("APK_VERSION_SUFFIX").toString(): versionName } diff --git a/OsmAnd/res/drawable/ic_action_car_running_time.xml b/OsmAnd/res/drawable/ic_action_car_running_time.xml new file mode 100644 index 00000000000..f9fc0a8d5f5 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_car_running_time.xml @@ -0,0 +1,14 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_data_grid.xml b/OsmAnd/res/drawable/ic_action_data_grid.xml new file mode 100644 index 00000000000..aeca3e85cbf --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_data_grid.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_obd_engine_speed.xml b/OsmAnd/res/drawable/ic_action_obd_engine_speed.xml new file mode 100644 index 00000000000..795bcf39d35 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_obd_engine_speed.xml @@ -0,0 +1,35 @@ + + + + + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_obd_fuel_consumption.xml b/OsmAnd/res/drawable/ic_action_obd_fuel_consumption.xml new file mode 100644 index 00000000000..f3ffa04cbe7 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_obd_fuel_consumption.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/OsmAnd/res/drawable/ic_action_obd_fuel_pressure.xml b/OsmAnd/res/drawable/ic_action_obd_fuel_pressure.xml new file mode 100644 index 00000000000..06fa96b8a93 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_obd_fuel_pressure.xml @@ -0,0 +1,32 @@ + + + + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_obd_fuel_remaining.xml b/OsmAnd/res/drawable/ic_action_obd_fuel_remaining.xml new file mode 100644 index 00000000000..85d52dea194 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_obd_fuel_remaining.xml @@ -0,0 +1,13 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_obd_speed.xml b/OsmAnd/res/drawable/ic_action_obd_speed.xml new file mode 100644 index 00000000000..b47e28b6796 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_obd_speed.xml @@ -0,0 +1,28 @@ + + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_obd_temperature_coolant.xml b/OsmAnd/res/drawable/ic_action_obd_temperature_coolant.xml new file mode 100644 index 00000000000..531be764425 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_obd_temperature_coolant.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/OsmAnd/res/drawable/ic_action_obd_temperature_engine_oil.xml b/OsmAnd/res/drawable/ic_action_obd_temperature_engine_oil.xml new file mode 100644 index 00000000000..1a336e9485d --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_obd_temperature_engine_oil.xml @@ -0,0 +1,13 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_obd_temperature_outside.xml b/OsmAnd/res/drawable/ic_action_obd_temperature_outside.xml new file mode 100644 index 00000000000..4998ffcab55 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_obd_temperature_outside.xml @@ -0,0 +1,14 @@ + + + + diff --git a/OsmAnd/res/drawable/ic_action_obd_throttle_position.xml b/OsmAnd/res/drawable/ic_action_obd_throttle_position.xml new file mode 100644 index 00000000000..d7edab9429d --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_obd_throttle_position.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/OsmAnd/res/drawable/widget_obd_engine_calculated_load_night.xml b/OsmAnd/res/drawable/widget_obd_engine_calculated_load_night.xml index 9b6fb4b0c5a..699174cc04c 100644 --- a/OsmAnd/res/drawable/widget_obd_engine_calculated_load_night.xml +++ b/OsmAnd/res/drawable/widget_obd_engine_calculated_load_night.xml @@ -5,7 +5,7 @@ android:viewportHeight="24"> + android:fillColor="#3D4958"/> diff --git a/OsmAnd/res/drawable/widget_obd_engine_runtime_day.xml b/OsmAnd/res/drawable/widget_obd_engine_runtime_day.xml index 9b6fb4b0c5a..cc4dd1f2276 100644 --- a/OsmAnd/res/drawable/widget_obd_engine_runtime_day.xml +++ b/OsmAnd/res/drawable/widget_obd_engine_runtime_day.xml @@ -4,24 +4,23 @@ android:viewportWidth="24" android:viewportHeight="24"> + android:pathData="M22.9448,11.0261L22.7343,10.6797C22.5759,10.4334 22.4045,10.1964 22.2209,9.9696L21.9233,9.3746L21.2513,5.3424C20.9299,3.4137 19.2611,2 17.3057,2H6.6943C4.7389,2 3.0701,3.4137 2.7487,5.3424L2.2917,8.0842C0.9767,8.4024 0,9.5872 0,11.0001C0,11.8886 0.3862,12.6868 1,13.2362L1,18.5C1,20.433 2.567,22 4.5,22C5.8962,22 7.1014,21.1825 7.6632,20.0001H9.7547C11.2208,21.8289 13.4736,23 16,23C20.4183,23 24,19.4183 24,15C24,13.5536 23.6161,12.1968 22.9448,11.0261Z" + android:fillColor="#2D3C53" + android:fillType="evenOdd"/> - + android:pathData="M16,11C16.5523,11 17,11.4477 17,12V15L18.6,16.2C19.0418,16.5314 19.1314,17.1582 18.8,17.6C18.4686,18.0418 17.8418,18.1314 17.4,17.8L15.4,16.3C15.1482,16.1111 15,15.8148 15,15.5V12C15,11.4477 15.4477,11 16,11Z" + android:fillColor="#6B5000" + android:fillType="evenOdd"/> diff --git a/OsmAnd/res/drawable/widget_obd_engine_runtime_night.xml b/OsmAnd/res/drawable/widget_obd_engine_runtime_night.xml index 9b6fb4b0c5a..c6f40016b30 100644 --- a/OsmAnd/res/drawable/widget_obd_engine_runtime_night.xml +++ b/OsmAnd/res/drawable/widget_obd_engine_runtime_night.xml @@ -4,24 +4,23 @@ android:viewportWidth="24" android:viewportHeight="24"> + android:pathData="M22.9448,11.0261L22.7343,10.6797C22.5759,10.4334 22.4045,10.1964 22.2209,9.9696L21.9233,9.3746L21.2513,5.3424C20.9299,3.4137 19.2611,2 17.3057,2H6.6943C4.7389,2 3.0701,3.4137 2.7487,5.3424L2.2917,8.0842C0.9767,8.4024 0,9.5872 0,11.0001C0,11.8886 0.3862,12.6868 1,13.2362L1,18.5C1,20.433 2.567,22 4.5,22C5.8962,22 7.1014,21.1825 7.6632,20.0001H9.7547C11.2208,21.8289 13.4736,23 16,23C20.4183,23 24,19.4183 24,15C24,13.5536 23.6161,12.1968 22.9448,11.0261Z" + android:fillColor="#47566B" + android:fillType="evenOdd"/> - + android:pathData="M16,11C16.5523,11 17,11.4477 17,12V15L18.6,16.2C19.0418,16.5314 19.1314,17.1582 18.8,17.6C18.4686,18.0418 17.8418,18.1314 17.4,17.8L15.4,16.3C15.1482,16.1111 15,15.8148 15,15.5V12C15,11.4477 15.4477,11 16,11Z" + android:fillColor="#6B5000" + android:fillType="evenOdd"/> diff --git a/OsmAnd/res/drawable/widget_obd_fuel_pressure_day.xml b/OsmAnd/res/drawable/widget_obd_fuel_pressure_day.xml index 9b6fb4b0c5a..24fe62532c6 100644 --- a/OsmAnd/res/drawable/widget_obd_fuel_pressure_day.xml +++ b/OsmAnd/res/drawable/widget_obd_fuel_pressure_day.xml @@ -1,27 +1,61 @@ + android:pathData="M22,21C22,22.1046 21.1046,23 20,23H16.7324C16.3866,23.5978 15.7403,24 15,24H9C8.2597,24 7.6134,23.5978 7.2676,23H4C2.8954,23 2,22.1046 2,21V19C2,17.8954 2.8954,17 4,17H7.2676C7.3169,16.9148 7.3723,16.8336 7.4331,16.7569C4.78,15.1915 3,12.3036 3,9C3,4.0294 7.0294,0 12,0C16.9706,0 21,4.0294 21,9C21,12.3036 19.22,15.1915 16.5669,16.7569C16.6278,16.8336 16.6831,16.9148 16.7324,17H20C21.1046,17 22,17.8954 22,19V21Z" + android:fillColor="#394642" + android:fillType="evenOdd"/> + android:pathData="M12,9m-7,0a7,7 0,1 1,14 0a7,7 0,1 1,-14 0"> + + + + + + + + android:pathData="M15,9V15.3264C17.3649,14.2029 19,11.7924 19,9C19,5.134 15.866,2 12,2C8.134,2 5,5.134 5,9C5,11.7924 6.635,14.2029 9,15.3264V9C9,7.3432 10.3431,6 12,6C13.6569,6 15,7.3432 15,9Z"> + + + + + + + + + + android:pathData="M11,12L13,12A1,1 0,0 1,14 13L14,13A1,1 0,0 1,13 14L11,14A1,1 0,0 1,10 13L10,13A1,1 0,0 1,11 12z" + android:fillColor="#474747"/> + + + android:pathData="M12,5C12.5523,5 13,4.5523 13,4C13,3.4477 12.5523,3 12,3C11.4477,3 11,3.4477 11,4C11,4.5523 11.4477,5 12,5Z" + android:fillColor="#ffffff"/> + + android:pathData="M11,9C11,8.4477 11.4477,8 12,8H17C17.5523,8 18,8.4477 18,9C18,9.5523 17.5523,10 17,10H12C11.4477,10 11,9.5523 11,9Z" + android:fillColor="#ffffff"/> diff --git a/OsmAnd/res/drawable/widget_obd_fuel_pressure_night.xml b/OsmAnd/res/drawable/widget_obd_fuel_pressure_night.xml index 9b6fb4b0c5a..4e4d6a9a92a 100644 --- a/OsmAnd/res/drawable/widget_obd_fuel_pressure_night.xml +++ b/OsmAnd/res/drawable/widget_obd_fuel_pressure_night.xml @@ -1,27 +1,61 @@ + android:pathData="M22,21C22,22.1046 21.1046,23 20,23H16.7324C16.3866,23.5978 15.7403,24 15,24H9C8.2597,24 7.6134,23.5978 7.2676,23H4C2.8954,23 2,22.1046 2,21V19C2,17.8954 2.8954,17 4,17H7.2676C7.3169,16.9148 7.3723,16.8336 7.4331,16.7569C4.78,15.1915 3,12.3036 3,9C3,4.0294 7.0294,0 12,0C16.9706,0 21,4.0294 21,9C21,12.3036 19.22,15.1915 16.5669,16.7569C16.6278,16.8336 16.6831,16.9148 16.7324,17H20C21.1046,17 22,17.8954 22,19V21Z" + android:fillColor="#595959" + android:fillType="evenOdd"/> + android:pathData="M12,9m-7,0a7,7 0,1 1,14 0a7,7 0,1 1,-14 0"> + + + + + + + + android:pathData="M15,9V15.3264C17.3649,14.2029 19,11.7924 19,9C19,5.134 15.866,2 12,2C8.134,2 5,5.134 5,9C5,11.7924 6.635,14.2029 9,15.3264V9C9,7.3432 10.3431,6 12,6C13.6569,6 15,7.3432 15,9Z"> + + + + + + + + + + android:pathData="M11,12L13,12A1,1 0,0 1,14 13L14,13A1,1 0,0 1,13 14L11,14A1,1 0,0 1,10 13L10,13A1,1 0,0 1,11 12z" + android:fillColor="#474747"/> + + + android:pathData="M12,5C12.5523,5 13,4.5523 13,4C13,3.4477 12.5523,3 12,3C11.4477,3 11,3.4477 11,4C11,4.5523 11.4477,5 12,5Z" + android:fillColor="#ffffff"/> + + android:pathData="M11,9C11,8.4477 11.4477,8 12,8H17C17.5523,8 18,8.4477 18,9C18,9.5523 17.5523,10 17,10H12C11.4477,10 11,9.5523 11,9Z" + android:fillColor="#ffffff"/> diff --git a/OsmAnd/res/drawable/widget_obd_temperature_engine_oil_day.xml b/OsmAnd/res/drawable/widget_obd_temperature_engine_oil_day.xml index 9b6fb4b0c5a..fd6fe7a8a7b 100644 --- a/OsmAnd/res/drawable/widget_obd_temperature_engine_oil_day.xml +++ b/OsmAnd/res/drawable/widget_obd_temperature_engine_oil_day.xml @@ -4,24 +4,14 @@ android:viewportWidth="24" android:viewportHeight="24"> + android:pathData="M3,17.8284L0.5858,15.4142C0.2107,15.0391 0,14.5304 0,14V8C0,6.8954 0.8954,6 2,6H5C5.6687,6 6.2932,6.3342 6.6641,6.8906L8,8.8945V4C8,2.3431 9.3432,1 11,1C12.3062,1 13.4175,1.8348 13.8293,3H14C15.6569,3 17,4.3432 17,6C17,6.5464 16.8539,7.0587 16.5987,7.5C16.8539,7.9413 17,8.4536 17,9C17,9.5464 16.8539,10.0587 16.5987,10.5C16.6295,10.5533 16.6588,10.6077 16.6864,10.663L21.3675,9.1026C21.9774,8.8993 22.6479,9.0016 23.1694,9.3775C23.691,9.7534 24,10.3571 24,11V16C24,16.5936 23.7364,17.1565 23.2804,17.5364L17.2804,22.5364C16.9209,22.836 16.4679,23 16,23H5C3.8954,23 3,22.1046 3,21V17.8284Z" + android:fillColor="#2D3C53" + android:fillType="evenOdd"/> + android:pathData="M8,11H7L5,8H2V14L5,17V21H16L22,16V11L16.9194,12.6935C16.6709,13.7437 15.8704,14.5805 14.8411,14.8805C14.9445,15.2356 15,15.6112 15,16C15,18.2091 13.2091,20 11,20C8.7909,20 7,18.2091 7,16C7,14.9845 7.3789,14.0586 8,13.3546V11ZM4,10.1056L5,11.6056V14.1716L4,13.1716V10.1056Z" + android:fillColor="#FFC107" + android:fillType="evenOdd"/> - - - - diff --git a/OsmAnd/res/drawable/widget_obd_temperature_engine_oil_night.xml b/OsmAnd/res/drawable/widget_obd_temperature_engine_oil_night.xml index 9b6fb4b0c5a..8b679a891a0 100644 --- a/OsmAnd/res/drawable/widget_obd_temperature_engine_oil_night.xml +++ b/OsmAnd/res/drawable/widget_obd_temperature_engine_oil_night.xml @@ -4,24 +4,14 @@ android:viewportWidth="24" android:viewportHeight="24"> + android:pathData="M3,17.8284L0.5858,15.4142C0.2107,15.0391 0,14.5304 0,14V8C0,6.8954 0.8954,6 2,6H5C5.6687,6 6.2932,6.3342 6.6641,6.8906L8,8.8945V4C8,2.3431 9.3432,1 11,1C12.3062,1 13.4175,1.8348 13.8293,3H14C15.6569,3 17,4.3432 17,6C17,6.5464 16.8539,7.0587 16.5987,7.5C16.8539,7.9413 17,8.4536 17,9C17,9.5464 16.8539,10.0587 16.5987,10.5C16.6295,10.5533 16.6588,10.6077 16.6864,10.663L21.3675,9.1026C21.9774,8.8993 22.6479,9.0016 23.1694,9.3775C23.691,9.7534 24,10.3571 24,11V16C24,16.5936 23.7364,17.1565 23.2804,17.5364L17.2804,22.5364C16.9209,22.836 16.4679,23 16,23H5C3.8954,23 3,22.1046 3,21V17.8284Z" + android:fillColor="#47566B" + android:fillType="evenOdd"/> + android:pathData="M8,11H7L5,8H2V14L5,17V21H16L22,16V11L16.9194,12.6935C16.6709,13.7437 15.8704,14.5805 14.8411,14.8805C14.9445,15.2356 15,15.6112 15,16C15,18.2091 13.2091,20 11,20C8.7909,20 7,18.2091 7,16C7,14.9845 7.3789,14.0586 8,13.3546V11ZM4,10.1056L5,11.6056V14.1716L4,13.1716V10.1056Z" + android:fillColor="#FFC107" + android:fillType="evenOdd"/> - - - - diff --git a/OsmAnd/res/drawable/widget_obd_throttle_position_day.xml b/OsmAnd/res/drawable/widget_obd_throttle_position_day.xml index 9b6fb4b0c5a..d83715c83b7 100644 --- a/OsmAnd/res/drawable/widget_obd_throttle_position_day.xml +++ b/OsmAnd/res/drawable/widget_obd_throttle_position_day.xml @@ -1,27 +1,55 @@ + android:pathData="M8.0001,1C7.1652,0.3733 6.1254,0 5,0C2.2386,0 0,2.2386 0,5C0,6.1254 0.3733,7.1652 1,8.0001V15.9999C0.3733,16.8348 0,17.8746 0,19C0,21.7614 2.2386,24 5,24C6.1254,24 7.1652,23.6267 8.0001,23H15.9999C16.8348,23.6267 17.8746,24 19,24C21.7614,24 24,21.7614 24,19C24,17.8746 23.6267,16.8348 23,15.9999V8.0001C23.6267,7.1652 24,6.1254 24,5C24,2.2386 21.7614,0 19,0C17.8746,0 16.8348,0.3733 15.9999,1H8.0001Z" + android:fillColor="#394642" + android:fillType="evenOdd"/> + + android:pathData="M19,12C19,15.866 15.866,19 12,19C8.134,19 5,15.866 5,12C5,8.134 8.134,5 12,5C15.866,5 19,8.134 19,12Z"> + + + + + + + + android:pathData="M19,12C19,14.2091 15.866,16 12,16C8.134,16 5,14.2091 5,12C5,9.7909 8.134,8 12,8C15.866,8 19,9.7909 19,12Z"> + + + + + + + + android:pathData="M5,6C5.5523,6 6,5.5523 6,5C6,4.4477 5.5523,4 5,4C4.4477,4 4,4.4477 4,5C4,5.5523 4.4477,6 5,6Z" + android:fillColor="#2D3C53"/> + android:pathData="M5,20C5.5523,20 6,19.5523 6,19C6,18.4477 5.5523,18 5,18C4.4477,18 4,18.4477 4,19C4,19.5523 4.4477,20 5,20Z" + android:fillColor="#2D3C53"/> + android:pathData="M20,5C20,5.5523 19.5523,6 19,6C18.4477,6 18,5.5523 18,5C18,4.4477 18.4477,4 19,4C19.5523,4 20,4.4477 20,5Z" + android:fillColor="#2D3C53"/> + android:pathData="M19,20C19.5523,20 20,19.5523 20,19C20,18.4477 19.5523,18 19,18C18.4477,18 18,18.4477 18,19C18,19.5523 18.4477,20 19,20Z" + android:fillColor="#2D3C53"/> diff --git a/OsmAnd/res/drawable/widget_obd_throttle_position_night.xml b/OsmAnd/res/drawable/widget_obd_throttle_position_night.xml index 9b6fb4b0c5a..2758a52dd03 100644 --- a/OsmAnd/res/drawable/widget_obd_throttle_position_night.xml +++ b/OsmAnd/res/drawable/widget_obd_throttle_position_night.xml @@ -1,27 +1,55 @@ + android:pathData="M8.0001,1C7.1652,0.3733 6.1254,0 5,0C2.2386,0 0,2.2386 0,5C0,6.1254 0.3733,7.1652 1,8.0001V15.9999C0.3733,16.8348 0,17.8746 0,19C0,21.7614 2.2386,24 5,24C6.1254,24 7.1652,23.6267 8.0001,23H15.9999C16.8348,23.6267 17.8746,24 19,24C21.7614,24 24,21.7614 24,19C24,17.8746 23.6267,16.8348 23,15.9999V8.0001C23.6267,7.1652 24,6.1254 24,5C24,2.2386 21.7614,0 19,0C17.8746,0 16.8348,0.3733 15.9999,1H8.0001Z" + android:fillColor="#47566B" + android:fillType="evenOdd"/> + + android:pathData="M19,12C19,15.866 15.866,19 12,19C8.134,19 5,15.866 5,12C5,8.134 8.134,5 12,5C15.866,5 19,8.134 19,12Z"> + + + + + + + + android:pathData="M19,12C19,14.2091 15.866,16 12,16C8.134,16 5,14.2091 5,12C5,9.7909 8.134,8 12,8C15.866,8 19,9.7909 19,12Z"> + + + + + + + + android:pathData="M5,6C5.5523,6 6,5.5523 6,5C6,4.4477 5.5523,4 5,4C4.4477,4 4,4.4477 4,5C4,5.5523 4.4477,6 5,6Z" + android:fillColor="#2D3C53"/> + android:pathData="M5,20C5.5523,20 6,19.5523 6,19C6,18.4477 5.5523,18 5,18C4.4477,18 4,18.4477 4,19C4,19.5523 4.4477,20 5,20Z" + android:fillColor="#2D3C53"/> + android:pathData="M20,5C20,5.5523 19.5523,6 19,6C18.4477,6 18,5.5523 18,5C18,4.4477 18.4477,4 19,4C19.5523,4 20,4.4477 20,5Z" + android:fillColor="#2D3C53"/> + android:pathData="M19,20C19.5523,20 20,19.5523 20,19C20,18.4477 19.5523,18 19,18C18.4477,18 18,18.4477 18,19C18,19.5523 18.4477,20 19,20Z" + android:fillColor="#2D3C53"/> diff --git a/OsmAnd/res/values-b+sr+Latn/phrases.xml b/OsmAnd/res/values-b+sr+Latn/phrases.xml index f4eabe188aa..d23b93d251c 100644 --- a/OsmAnd/res/values-b+sr+Latn/phrases.xml +++ b/OsmAnd/res/values-b+sr+Latn/phrases.xml @@ -4880,4 +4880,19 @@ Parko Tunel zabranjen za pešake Tunel zabranjen za bicikliste + Članci o putovanjima + Tačke na putovanjima + Druge rute + Tačke drugih ruta + Bicikl + Pešačenje + Trčanje + Hodanje + Sportovi na vodi + Zimski sportovi + Koturaljke + Jahanje konja + Motorne sanke + Staze za trčanje + Brdski biciklizam \ No newline at end of file diff --git a/OsmAnd/res/values-b+sr+Latn/strings.xml b/OsmAnd/res/values-b+sr+Latn/strings.xml index cae678145dd..f9303fb402e 100644 --- a/OsmAnd/res/values-b+sr+Latn/strings.xml +++ b/OsmAnd/res/values-b+sr+Latn/strings.xml @@ -5647,4 +5647,9 @@ Temperatura motornog ulja Prikazuje temperaturu motornog ulja vozila dobijenu iz obd skenera Nije moguće pokrenuti uparivanje s uređajem + Dinamično + Povezan na %s + Povezivanje s %s + Ikona se menja na temelju stanja akcije. + Isključeno iz %s \ No newline at end of file diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index 7f84f43a3c1..b2407a2af5c 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -4488,15 +4488,15 @@ Mostra / Amaga Pausa / Reprèn Pàl·lid - Activar / Desactivar + Activa / Desactiva Regne Unit i semblants Estil del mapa Índia Automàticament Simular - Inici / Stop + Inicia / Atura Crea - Reemplaça + Substitueix Font de dades OsmAnd proporciona dades meteorològiques de dues fonts: Sistema de Predicció Global dels Centres Nacionals de Predicció Ambiental @@ -4624,4 +4624,105 @@ Obre el menú principal. Inicia nou càlcul de la velocitat mitjana Dispositiu desconegut + Híbrid de gasolina + Radi de gir + Agafeu la sortida %1$d + Temperatura ambient + La icona canvia segons la situació de l’acció. + Dinàmic + S\'ha connectat a %s + S\'ha desconnectat de %s + S\'està connectant a %s + No pot iniciar l\'enllaç amb el dispositiu + Híbrid d\'etanol + Híírid diesel + OBD + % + RPM + rpm + Mostra la velocitat del vehicle que indicar el sensor OBD + Mostra les RPM del tacòmetre del vehicle segons el sensor OBD + Mostra la distància que pot recórrer el vehicle amb el combustible romanent segons el sensor OBD + Mostra el tipus de combustible del vehicle segons el sensor OBD + Temperatura d\'admissió + Combustible romanent (distància) + Lectures del vehicle + S\'esborrarà aquest giny. El podeu tornar a restablir a la pantalla Configuració. + Mostra la taxa de consum de combustible del vehicle segons OBD i la ubicació + Afegeix el giny a sobre + Mostra la temperatura de l\'aire d\'admisió del vehicle segons el sensor OBD + Configuració de les lectures del vehicle + Hidrogen + Mostra la temperatura ambient segons el sensor OBD + Voltatge de la bateria + Temperatura del líquid refrigerant + Eficiència del combustible (%) + Taxa de consum de combustible + Lectures del vehicle + Mostra el volum de combustible del dipòsit segons el sensor OBD + Tipus de combustible + Tipus de combustible desconegut + Un commutador per tornar a la pantalla anterior. + Interfície + Un commutador per mostrar o ocultar el menú lateral. + Un commutador per mostrar o ocultar la vista de recerca. + Pantalla anterior + Híbrid amb hidrogen + Motor híbrid elèctric i de combustió + Híbrid regeneratiu + Voleu esborrar aquest giny? + Afegeix el giny a sota + Opacitat de rerefons + Mostra la temperatura del líquid refrigerant del motor segons el sensor OBD + Mostra el voltatge de la bateria segons el sensor OBD + Afegeix el giny a la dreta + Afegeix el giny a l\'esquerra + Híbrid elèctric + Combustible romanent (litres) + Gireu fortament a l\'esquerra + Mapa a l\'esquerra + Gireu fortament a la dreta + Gireu lleugerament a la dreta + Gireu a l\'esquerra + Seleccioneu l\'orientació del mapa + Posició de navegació + Mostra l\'àrea circular que representa la precisió de la vostra ubicació actual + Gireu lleugerament a l\'esquerra + Estadístiques de consum (mitjana 1 / 5 / 15 minuts) + Perfil d\'aplicació anterior + Primera fita intermèdia + Nota d\'àudio + Nota de vídeo + Foto afegida + Punt d\'inici + Icona que es mostra quan no us moveu. + Mostra la posició sempre al centre + Tipus de coloració del terreny + Posició de repòs + Posició de repòs i de navegació + Feu mitja volta + Ubicació per GPX + Gran Oferta per %1$s mesos + Mostra l\'angle de visió que teniu davant + FPS dels darrers 1k frames: %1$s\nCPU (cel·les): %2$s\nCPU (temps ociòs): %3$s\nCPU (esperant GPU): %4$s + Vers la meva ubicació + Perfil d\'aplicació + Fixa + Mapa a baix + Mapa a la dreta + Proper punt de destinació + Icona de posició mentre esteu aturat + Icona que es mostra mentre esteu navegant o en moviment. + Icona de posició en navegació + Manteniu-vos a la dreta + Gireu a la dreta + Manteniu-vos a l\'esquerra + Pantalla d\'oratge + Accés gratuït a opcions com la baixada il·limitada de mapes, rerefons amb relleu 3D i d\'altres, durant %1$s mes(os) + Nivell de bateria per minut: %1$s\nConsum elèctric (mAh): %2$s + Esquema de colors del terreny + Mapa a dalt + Perfil d\'aplicació següent + Fons del mapa + Superposició \ No newline at end of file diff --git a/OsmAnd/res/values-cs/strings.xml b/OsmAnd/res/values-cs/strings.xml index c324ba93812..d2ffdbf4151 100644 --- a/OsmAnd/res/values-cs/strings.xml +++ b/OsmAnd/res/values-cs/strings.xml @@ -5635,4 +5635,10 @@ Rychlost vozidla Otáčky motoru 1. Připojte skener k portu OBD-II vašeho vozidla.\n\n 2. Zapněte motor vašeho vozidla\n\n 3. Povolte na svém zařízení Bluetooth\n\n 4. Klepněte na \'%1$s\' a vyberte svůj skener ze seznamu. + Připojeno k %s + Odpojeno od %s + Nelze zahájit párování se zařízením + Ikona se mění podle stavu akce. + Dynamický + Připojení k %s \ No newline at end of file diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index 1f3bd21e34a..146febb7224 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -5654,4 +5654,10 @@ Viser køretøjets brændstoftryk (målertryk) opnået fra obd-scanner Motoroliens temperatur Viser køretøjets motorolietemperatur opnået fra obd-scanner + Dynamisk + Forbinder til %s + Ikonet ændres baseret på handlingens tilstand. + Tilsluttet %s + Afkoblet fra %s + Kan ikke starte parring med enhed \ No newline at end of file diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 91e1a01fdd1..30f18d18653 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -5909,27 +5909,32 @@ Verbleibender Kraftstoff (%) Verbleibender Kraftstoff (l) Verbleibender Kraftstoff (km) - Kraftstoffverbrauch (obd) - Kraftstoffverbrauch l/h - Kraftstoffverbrauch %/h + Kraftstoffverbrauch (OBD) + Kraftstoffverbrauch (l/h) + Kraftstoffverbrauch (%/h) l %/h Maximum Kraftstoffverbrauch (l/km) Zeigt den rechnerischen Kraftstoffverbrauch des Fahrzeugs an (l/km) - Obd-Daten simulieren + OBD-Daten simulieren Motorlaufzeit - Zeigt die Laufzeit des Fahrzeugmotors an, die vom Obd-Scanner ermittelt wurde + Zeigt die Laufzeit des Fahrzeugmotors an, die vom OBD-Scanner ermittelt wurde Drosselklappenstellung - Zeigt den Kraftstoffdruck des Fahrzeugs (Überdruck) an, der vom Obd-Scanner ermittelt wurde + Zeigt den Kraftstoffdruck des Fahrzeugs (Überdruck) an, der vom OBD-Scanner ermittelt wurde Kraftstoffdruck - Zeigt den Kraftstoffdruck des Fahrzeugs (Überdruck) an, der vom Obd-Scanner ermittelt wurde + Zeigt den Kraftstoffdruck des Fahrzeugs (Überdruck) an, der vom OBD-Scanner ermittelt wurde Berechnete Motorlast Motoröltemperatur - Zeigt die vom Obd-Scanner ermittelte Motoröltemperatur des Fahrzeugs an - l/100km + Zeigt die Motoröltemperatur des Fahrzeugs an, die vom OBD-Scanner ermittelt wurde + l/100 km Zeigt den rechnerischen Kraftstoffverbrauch des Fahrzeugs an (%/h) kPa Zeigt die vom Sensor berechnete Motorlast des Fahrzeugs an Kopplung mit Gerät kann nicht gestartet werden + Dynamisch + Verbindung zu %s herstellen + Verbunden mit %s + Getrennt von %s + Symbol ändert sich je nach Aktionsstatus. \ No newline at end of file diff --git a/OsmAnd/res/values-el/strings.xml b/OsmAnd/res/values-el/strings.xml index c2b15c8e17f..455e4f63edf 100644 --- a/OsmAnd/res/values-el/strings.xml +++ b/OsmAnd/res/values-el/strings.xml @@ -45,27 +45,7 @@ \n \n Το OsmAnd είναι ενεργά στο στάδιο της ανάπτυξης και το εγχείρημά μας και η περαιτέρω ανάπτυξή του επαφίεται στις οικονομικές προσφορές για την χρηματοδότηση της ανάπτυξης και τις δοκιμές νέων λειτουργιών. Παρακαλούμε σκεφτείτε την αγορά του OsmAnd+, ή χρηματοδοτήστε συγκεκριμένες νέες λειτουργίες ή κάντε μια γενική δωρεά στο https://osmand.net. Προβολή παγκόσμιου χάρτη & πλοήγηση για χάρτες OSM χωρίς και με σύνδεση - OsmAnd+ (OSM Αυτοματοποιημένες Οδηγίες Πλοήγησης) -\n -\n Το OsmAnd+ είναι μια εφαρμογή πλοήγησης ανοικτού κώδικα με πρόσβαση σε μεγάλη ποικιλία από παγκόσμια δεδομένα OSM. Όλα τα δεδομένα χάρτη (διανυσματικά ή πλακίδια χάρτη) μπορούν να αποθηκευτούν στην κάρτα μνήμης του τηλεφώνου για χρήση χωρίς σύνδεση. Προσφέρεται επίσης λειτουργία δρομολόγησης χωρίς και με διαδίκτυο, συμπεριλαμβανομένων φωνητικών οδηγιών βήμα προς βήμα. -\n -\n Ο OsmAnd+ είναι η πληρωτέα έκδοση της εφαρμογής, με την αγορά της υποστηρίζετε το εγχείρημα, χρηματοδοτείτε την ανάπτυξη νέων λειτουργιών και λαμβάνετε τις τελευταίες ενημερώσεις. -\n -\n Μερικά από τα βασικά χαρακτηριστικά: -\n - Πλήρης λειτουργικότητα εκτός σύνδεσης (αποθήκευση των λαμβανόμενων χαρτών με διανύσματα ή πλακίδια στον αποθηκευτικό χώρο της συσκευής) -\n - Διαθέσιμοι συμπαγείς διανυσματικοί χάρτες για όλο τον κόσμο -\n - Απεριόριστη λήψη χαρτών χωρών ή περιοχών κατευθείαν από την εφαρμογή -\n - Χαρακτηριστικό της Wikipedia εκτός σύνδεσης (λήψη Σημ Ενδ Wikipedia), υπέροχο για αξιοθέατα -\n - Δυνατότητα επίστρωσης από αρκετές στρώσεις χάρτη, όπως GPX ή ίχνη πλοήγησης, Σημεία Ενδιαφέροντος, αγαπημένα, στάσεις Μ.Μ.Μ., πρόσθετους χάρτες με προσαρμόσιμη διαφάνεια, τοπογραφικά χαρακτηριστικά όπως ισοϋψείς καμπύλες/σκιαγράφιση λόφου/κλίση -\n -\n - Εκτός σύνδεσης αναζήτηση για διευθύνσεις και μέρη (ΣΕ) -\n - Εκτός σύνδεσης δρομολόγηση για μέσες αποστάσεις -\n - Λειτουργίες αυτοκινήτου, ποδηλάτου και πεζού με: -\n - προαιρετική αυτόματη εναλλαγή όψης ημέρας/νύχτας -\n - προαιρετική εστίαση χάρτη βάσει ταχύτητας -\n - προαιρετικός προσανατολισμός χάρτη βάσει της πυξίδας ή της κατεύθυνσης κίνησης -\n - προαιρετική καθοδήγηση με λωρίδες, εμφάνιση ορίου ταχύτητας, ηχογραφημένες και κειμένου σε ομιλία φωνές -\n + OsmAnd+ (OSM Αυτοματοποιημένες Οδηγίες Πλοήγησης)\n\n Το OsmAnd+ είναι μια εφαρμογή πλοήγησης ανοικτού κώδικα με πρόσβαση σε μεγάλη ποικιλία από παγκόσμια δεδομένα OSM. Όλα τα δεδομένα χάρτη (διανυσματικά ή πλακίδια χάρτη) μπορούν να αποθηκευτούν στην κάρτα μνήμης του τηλεφώνου για χρήση χωρίς σύνδεση. Προσφέρεται επίσης λειτουργία δρομολόγησης χωρίς και με διαδίκτυο, συμπεριλαμβανομένων φωνητικών οδηγιών βήμα προς βήμα.\n\n Το OsmAnd+ είναι η πληρωτέα έκδοση της εφαρμογής, με την αγορά της υποστηρίζετε το εγχείρημα, χρηματοδοτείτε την ανάπτυξη νέων λειτουργιών και λαμβάνετε τις τελευταίες ενημερώσεις.\n\n Μερικά από τα βασικά χαρακτηριστικά:\n - Πλήρης λειτουργικότητα εκτός σύνδεσης (αποθήκευση των λαμβανόμενων χαρτών με διανύσματα ή πλακίδια στον αποθηκευτικό χώρο της συσκευής)\n - Διαθέσιμοι συμπαγείς διανυσματικοί χάρτες για όλο τον κόσμο\n - Απεριόριστη λήψη χαρτών χωρών ή περιοχών κατευθείαν από την εφαρμογή\n - Χαρακτηριστικό της Wikipedia εκτός σύνδεσης (λήψη Σημ Ενδ Wikipedia), υπέροχο για αξιοθέατα\n - Δυνατότητα επίστρωσης από αρκετές στρώσεις χάρτη, όπως GPX ή ίχνη πλοήγησης, Σημεία Ενδιαφέροντος, αγαπημένα, στάσεις Μ.Μ.Μ., πρόσθετους χάρτες με προσαρμόσιμη διαφάνεια, τοπογραφικά χαρακτηριστικά όπως ισοϋψείς καμπύλες/σκιαγράφιση λόφου/κλίση\n\n - Εκτός σύνδεσης αναζήτηση για διευθύνσεις και μέρη (ΣΕ)\n - Εκτός σύνδεσης δρομολόγηση για μέσες αποστάσεις\n - Λειτουργίες αυτοκινήτου, ποδηλάτου και πεζού με:\n - προαιρετική αυτόματη εναλλαγή όψης ημέρας/νύχτας\n - προαιρετική εστίαση χάρτη βάσει ταχύτητας\n - προαιρετικός προσανατολισμός χάρτη βάσει της πυξίδας ή της κατεύθυνσης κίνησης\n - προαιρετική καθοδήγηση με λωρίδες, εμφάνιση ορίου ταχύτητας, ηχογραφημένες και κειμένου σε ομιλία φωνές Δημιουργία φίλτρου ΣΕ Τρόπος μετακίνησης: Τρόπος μετακίνησης: @@ -2331,41 +2311,12 @@ Βικιπαίδεια Διαδρομές πεζοπορίας Απόδοση δρόμων σύμφωνα με τα ίχνη OSMC. - Πλοήγηση GPS -\n • Επιλέξετε μεταξύ κατάστασης χωρίς σύνδεση (χωρίς επιβαρύνσεις περιαγωγής όταν είσαστε στο εξωτερικό) ή με σύνδεση (πιο γρήγορα) -\n • Η φωνητική καθοδήγηση σας οδηγεί στον δρόμο σας (ηχογραφημένες και σύνθετες φωνές) -\n • Η διαδρομή ανασυντίθεται όταν αποκλίνετε από αυτήν -\n • Καθοδήγηση λωρίδας, ονόματα οδών και εκτιμώμενος χρόνος άφιξης θα σας βοηθήσουν στη διαδρομή -\n • Για μεγαλύτερη ασφάλεια, η κατάσταση ημέρας/νύχτας αλλάζει αυτόματα -\n • Εμφανίστε τα όρια ταχύτητας και να πάρτε υπενθυμίσεις, εάν τα παραβιάζετε -\n • Η εστίαση χάρτη ρυθμίζεται ανάλογα με την ταχύτητά σας -\n • Αναζητήσετε προορισμούς κατά διεύθυνση, τύπο (π.χ.: χώροι στάθμευσης, εστιατόρια, ξενοδοχεία, βενζινάδικα, μουσεία), ή γεωγραφικές συντεταγμένες -\n • Υποστηρίζει ενδιάμεσα σημεία στο δρομολόγιό σας -\n • Καταγράψετε το δικό σας ίχνος ή να ανεβάσετε το ίχνος GPX και ακολουθήστε το -\n - Χάρτης -\n • Εμφανίζει ΣΕ (σημεία ενδιαφέροντος) γύρω σας -\n • Προσαρμόζει τον χάρτη στην κατεύθυνση της κίνησή σας (ή πυξίδας) -\n • Εμφανίζει τη θέση σας και την κατεύθυνση που ψάχνετε -\n • Μοιράζετε την τοποθεσία σας έτσι ώστε οι φίλοι σας να μπορούν να σας βρουν -\n • Διατηρεί τις πιο σημαντικές τοποθεσίες στα \'Αγαπημένα\' -\n • Σας επιτρέπει να επιλέξετε πώς να εμφανίζονται τα ονόματα στον χάρτη: στα αγγλικά, στην τοπική ονομασία ή με φωνητικό συλλαβισμό -\n • Εμφανίζει εξειδικευμένα διαδικτυακά πλακίδια, δορυφορική προβολή (από το Bing), διαφορετικά επιστρώματα όπως ίχνη περιήγησης/πλοήγησης GPX και πρόσθετα στρώματα με προσαρμόσιμη διαφάνεια -\n + Πλοήγηση GPS\n • Επιλέξετε μεταξύ κατάστασης χωρίς σύνδεση (χωρίς επιβαρύνσεις περιαγωγής όταν είσαστε στο εξωτερικό) ή με σύνδεση (πιο γρήγορα)\n • Η φωνητική καθοδήγηση σας οδηγεί στον δρόμο σας (ηχογραφημένες και σύνθετες φωνές)\n • Η διαδρομή ανασυντίθεται όταν αποκλίνετε από αυτήν\n • Καθοδήγηση λωρίδας, ονόματα οδών και εκτιμώμενος χρόνος άφιξης θα σας βοηθήσουν στη διαδρομή\n • Για μεγαλύτερη ασφάλεια, η κατάσταση ημέρας/νύχτας αλλάζει αυτόματα\n • Εμφανίστε τα όρια ταχύτητας και να πάρτε υπενθυμίσεις, εάν τα παραβιάζετε\n • Η εστίαση χάρτη ρυθμίζεται ανάλογα με την ταχύτητά σας\n • Αναζητήσετε προορισμούς κατά διεύθυνση, τύπο (π.χ.: χώροι στάθμευσης, εστιατόρια, ξενοδοχεία, βενζινάδικα, μουσεία), ή γεωγραφικές συντεταγμένες\n • Υποστηρίζει ενδιάμεσα σημεία στο δρομολόγιό σας\n • Καταγράψετε το δικό σας ίχνος ή να ανεβάσετε το ίχνος GPX και ακολουθήστε το + Χάρτης\n • Εμφανίζει ΣΕ (σημεία ενδιαφέροντος) γύρω σας\n • Προσαρμόζει τον χάρτη στην κατεύθυνση της κίνησή σας (ή πυξίδας)\n • Εμφανίζει τη θέση σας και την κατεύθυνση που ψάχνετε\n • Μοιράζετε την τοποθεσία σας έτσι ώστε οι φίλοι σας να μπορούν να σας βρουν\n • Διατηρεί τις πιο σημαντικές τοποθεσίες στα \'Αγαπημένα\'\n • Σας επιτρέπει να επιλέξετε πώς να εμφανίζονται τα ονόματα στον χάρτη: στα αγγλικά, στην τοπική ονομασία ή με φωνητικό συλλαβισμό\n • Εμφανίζει εξειδικευμένα διαδικτυακά πλακίδια, δορυφορική προβολή (από το Bing), διαφορετικά επιστρώματα όπως ίχνη περιήγησης/πλοήγησης GPX και πρόσθετα στρώματα με προσαρμόσιμη διαφάνεια Χιονοδρομίες \nΤο πρόσθετο χαρτών χιονοδρομιών σας επιτρέπει να δείτε ίχνη χιονοδρομιών με επίπεδο δυσκολίας και κάποιες πρόσθετες πληροφορίες, όπως τοποθεσίες αναβατορίων και άλλων εγκαταστάσεων. - Περπάτημα, πεζοπορία, γύρος της πόλης -\n • Ο χάρτης σας εμφανίζει διαδρομές περπατήματος και πεζοπορίας -\n • Η Βικιπαίδεια στην προτιμώμενη γλώσσα σας μπορεί να σας πει πολλά στον γύρο της πόλης -\n • Οι στάσεις της δημόσιας συγκοινωνίας (λεωφορείου, τροχιόδρομου, σιδηρόδρομου), συμπεριλαμβάνοντας τα ονόματα γραμμών, βοηθούν στην πλοήγηση σε μια νέα πόλη -\n • Η πλοήγηση GPS σε κατάσταση πεζού χτίζει τη διαδρομή σας χρησιμοποιώντας πεζοπορικές διαδρομές -\n • Ανεβάστε και ακολουθήστε μια διαδρομή GPX ή καταγράψετε και μοιραστείτε τη δική σας -\n - Συνεισφέρετε στο OSM -\n • Αναφέρετε σφάλματα δεδομένων -\n • Ανεβάστε ίχνη GPX στο OSM απευθείας από την εφαρμογή -\n • Προσθέστε ΣΕ και ανεβάστε τα απευθείας στο OSM (ή αργότερα εάν είσαστε χωρίς σύνδεση) -\n + Περπάτημα, πεζοπορία, γύρος της πόλης\n • Ο χάρτης σας εμφανίζει διαδρομές περπατήματος και πεζοπορίας\n • Η Βικιπαίδεια στην προτιμώμενη γλώσσα σας μπορεί να σας πει πολλά στον γύρο της πόλης\n • Οι στάσεις της δημόσιας συγκοινωνίας (λεωφορείου, τροχιόδρομου, σιδηρόδρομου), συμπεριλαμβάνοντας τα ονόματα γραμμών, βοηθούν στην πλοήγηση σε μια νέα πόλη\n • Η πλοήγηση GPS σε κατάσταση πεζού χτίζει τη διαδρομή σας χρησιμοποιώντας πεζοπορικές διαδρομές\n • Ανεβάστε και ακολουθήστε μια διαδρομή GPX ή καταγράψετε και μοιραστείτε τη δική σας + Συνεισφέρετε στο OSM\n • Αναφέρετε σφάλματα δεδομένων\n • Ανεβάστε ίχνη GPX στο OSM απευθείας από την εφαρμογή\n • Προσθέστε ΣΕ και ανεβάστε τα απευθείας στο OSM (ή αργότερα εάν είσαστε χωρίς σύνδεση) Το OsmAnd αναπτύσσεται ενεργά από λογισμικό ανοικτού κώδικα. Καθένας μπορεί να συνεισφέρει στην εφαρμογή αναφέροντας σφάλματα, βελτιώνοντας μεταφράσεις ή κωδικοποιώντας νέα χαρακτηριστικά. Επιπλέον, το έργο βασίζεται στις οικονομικές συνδρομές για χρηματοδότηση του κώδικα και των νέων λειτουργιών. \n Προσεγγιστική κάλυψη χάρτη και ποιότητας: \n • Δυτική Ευρώπη: **** @@ -2386,22 +2337,8 @@ \n Το OsmAnd+ είναι μια έκδοση της εφαρμογής επί πληρωμή. Αγοράζοντάς το, υποστηρίζετε το έργο, χρηματοδοτείτε την ανάπτυξη νέων γνωρισμάτων και παίρνετε τις τελευταίες ενημερώσεις. \n \n Μερικά από τα κύρια χαρακτηριστικά: - Πλοήγηση -\n • Εργασία με σύνδεση (γρήγορη) ή χωρίς σύνδεση (χωρίς τέλη περιαγωγής όταν είσαστε στο εξωτερικό) -\n • Φωνητική καθοδήγηση βήμα-βήμα (ηχογραφημένες και συνδυασμένες φωνές) -\n • Προαιρετική καθοδήγηση λωρίδας, εμφάνιση ονόματος οδού και εκτιμώμενος χρόνος άφιξης -\n • Υποστήριξη ενδιάμεσων σημείων στο δρομολόγιό σας -\n • Αυτόματη ανακατεύθυνση όποτε αποκλίνετε από τη διαδρομή -\n • Αναζήτηση για θέσεις κατά διεύθυνση, κατά τύπο (π.χ.: εστιατόρια, ξενοδοχεία, βενζινάδικα, μουσεία), ή με γεωγραφικές συντεταγμένες -\n - Προβολή χάρτη -\n • Εμφάνιση της θέσης σας και του προσανατολισμού -\n • Προαιρετικά, ευθυγράμμιση της εικόνας σύμφωνα με την πυξίδα ή την κατεύθυνση κίνησής σας -\n • Αποθήκευση των πιο σημαντικών μερών ως αγαπημένων -\n • Εμφάνιση ΣΕ (σημείων ενδιαφέροντος) γύρω σας -\n • Εμφάνιση ειδικών διαδικτυακών πλακιδίων, δορυφορική προβολή (από το Bing), διάφορα επιστρώματα όπως ίχνη GPX περιήγησης/πλοήγησης και πρόσθετα στρώματα με προσαρμόσιμη διαφάνεια -\n • Προαιρετικά, εμφάνιση ονομάτων μερών στα αγγλικά, σε τοπική γλώσσα ή με φωνητικό συλλαβισμό -\n + Πλοήγηση\n • Εργασία με σύνδεση (γρήγορη) ή χωρίς σύνδεση (χωρίς τέλη περιαγωγής όταν είσαστε στο εξωτερικό)\n • Φωνητική καθοδήγηση βήμα-βήμα (ηχογραφημένες και συνδυασμένες φωνές)\n • Προαιρετική καθοδήγηση λωρίδας, εμφάνιση ονόματος οδού και εκτιμώμενος χρόνος άφιξης\n • Υποστήριξη ενδιάμεσων σημείων στο δρομολόγιό σας\n • Αυτόματη ανακατεύθυνση όποτε αποκλίνετε από τη διαδρομή\n • Αναζήτηση για θέσεις κατά διεύθυνση, κατά τύπο (π.χ.: εστιατόρια, ξενοδοχεία, βενζινάδικα, μουσεία), ή με γεωγραφικές συντεταγμένες + Προβολή χάρτη\n • Εμφάνιση της θέσης σας και του προσανατολισμού\n • Προαιρετικά, ευθυγράμμιση της εικόνας σύμφωνα με την πυξίδα ή την κατεύθυνση κίνησής σας\n • Αποθήκευση των πιο σημαντικών μερών ως αγαπημένων\n • Εμφάνιση ΣΕ (σημείων ενδιαφέροντος) γύρω σας\n • Εμφάνιση ειδικών διαδικτυακών πλακιδίων, δορυφορική προβολή (από το Bing), διάφορα επιστρώματα όπως ίχνη GPX περιήγησης/πλοήγησης και πρόσθετα στρώματα με προσαρμόσιμη διαφάνεια\n • Προαιρετικά, εμφάνιση ονομάτων μερών στα αγγλικά, σε τοπική γλώσσα ή με φωνητικό συλλαβισμό Χρήση του OSM και δεδομένων βικιπαίδειας \n • Υψηλής ποιότητας πληροφορίες από τα καλύτερα συνεργατικά έργα του κόσμου \n • Τα δεδομένα OSM είναι διαθέσιμα ανά χώρα ή περιοχή @@ -2410,12 +2347,7 @@ \n • Σύντομη ενημέρωση διανυσματικών χαρτών χωρίς σύνδεση τουλάχιστον μια φορά τον μήνα \n \n • Επιλογή μεταξύ πλήρων δεδομένων της περιοχής και απλώς οδικού δικτύου (Παράδειγμα: Όλη η Ιαπωνία είναι 700 MB ή 200 MB για το οδικό δίκτυο της) - Χαρακτηριστικά ασφαλείας -\n • Προαιρετική αυτοματοποιημένη εναλλαγή προβολής ημέρας/νύχτας -\n • Προαιρετική εμφάνιση ορίου ταχύτητας, με υπενθύμιση εάν το υπερβείτε -\n • Προαιρετική εστίαση ανάλογα με την ταχύτητα -\n • Κοινοποίηση της θέσης σας, έτσι ώστε οι φίλοι σας να μπορούν να σας βρουν -\n + Χαρακτηριστικά ασφαλείας\n • Προαιρετική αυτοματοποιημένη εναλλαγή προβολής ημέρας/νύχτας\n • Προαιρετική εμφάνιση ορίου ταχύτητας, με υπενθύμιση εάν το υπερβείτε\n • Προαιρετική εστίαση ανάλογα με την ταχύτητα\n • Κοινοποίηση της θέσης σας, έτσι ώστε οι φίλοι σας να μπορούν να σας βρουν Λειτουργίες για ποδηλάτες και πεζούς \n • Προβολή μονοπατιών και ποδηλατοδρόμων, σημαντικό για υπαίθριες δραστηριότητες \n • Ειδικές διαδρομές και προβολή καταστάσεων για ποδήλατα και πεζούς @@ -2423,27 +2355,8 @@ \n • Προαιρετική καταγραφή ταξιδιών σε τοπικό αρχείο GPX ή διαδικτυακή υπηρεσία \n • Προαιρετική εμφάνιση ταχύτητας και υψομέτρου \n • Εμφάνιση ισοϋψών γραμμών και σκίαση αναγλύφου (μέσω προσθέτου) - Απευθείας συνεισφορά στο OSM -\n • Αναφορά σφαλμάτων δεδομένων -\n • Ανέβασμα ιχνών GPX στο OSM απευθείας από την εφαρμογή -\n • Προσθήκη ΣΕ και απευθείας ανέβασμα τους στο OSM (ή αργότερα εάν είναι χωρίς σύνδεση) -\n • Επίσης, προαιρετική καταγραφή ταξιδιού σε κατάσταση παρασκηνίου (ενώ η συσκευή είναι σε κατάσταση ύπνωσης) -\n Το OsmAnd είναι ενεργά αναπτυσσόμενο λογισμικό ανοικτού κώδικα. Καθένας μπορεί να συνεισφέρει στην εφαρμογή αναφέροντας σφάλματα, βελτιώνοντας τις μεταφράσεις, ή κωδικοποιώντας νέα χαρακτηριστικά. Επιπλέον, το έργο βασίζεται στις χρηματικές συνεισφορές για χρηματοδότηση κωδικοποίησης και ελέγχου των νέων λειτουργιών. -\n - Προσεγγιστική κάλυψη χαρτών και ποιότητα: -\n • Δυτική Ευρώπη: **** -\n • Ανατολική Ευρώπη: *** -\n • Ρωσία *** -\n • Βόρεια Αμερική: *** -\n • Νότια Αμερική: ** -\n • Ασία: ** -\n • Ιαπωνία & Κορέα: *** -\n • Μέση Ανατολή: ** -\n • Αφρική ** -\n • Ανταρκτική: * -\n Οι περισσότερες χώρες της Γης είναι διαθέσεις για λήψη -\n Από το Αφγανιστάν μέχρι τη Ζιμπάμπουε, από την Αυστραλία μέχρι τις ΗΠΑ. Αργεντινή, Βραζιλία, Καναδάς, Γαλλία, Γερμανία, Μεξικό, Ενωμένο Βασίλειο, Ισπανία, … -\n + Απευθείας συνεισφορά στο OSM\n • Αναφορά σφαλμάτων δεδομένων\n • Ανέβασμα ιχνών GPX στο OSM απευθείας από την εφαρμογή\n • Προσθήκη ΣΕ και απευθείας ανέβασμα τους στο OSM (ή αργότερα εάν είναι χωρίς σύνδεση)\n • Επίσης, προαιρετική καταγραφή ταξιδιού σε κατάσταση παρασκηνίου (ενώ η συσκευή είναι σε κατάσταση ύπνωσης)\n Το OsmAnd είναι ενεργά αναπτυσσόμενο λογισμικό ανοικτού κώδικα. Καθένας μπορεί να συνεισφέρει στην εφαρμογή αναφέροντας σφάλματα, βελτιώνοντας τις μεταφράσεις, ή κωδικοποιώντας νέα χαρακτηριστικά. Επιπλέον, το έργο βασίζεται στις χρηματικές συνεισφορές για χρηματοδότηση κωδικοποίησης και ελέγχου των νέων λειτουργιών. + Προσεγγιστική κάλυψη χαρτών και ποιότητα:\n • Δυτική Ευρώπη: ****\n • Ανατολική Ευρώπη: ***\n • Ρωσία ***\n • Βόρεια Αμερική: ***\n • Νότια Αμερική: **\n • Ασία: **\n • Ιαπωνία και Κορέα: ***\n • Μέση Ανατολή: **\n • Αφρική **\n • Ανταρκτική: *\n Οι περισσότερες χώρες της Γης είναι διαθέσιμες για λήψη\n Από το Αφγανιστάν μέχρι τη Ζιμπάμπουε, από την Αυστραλία μέχρι τις ΗΠΑ. Αργεντινή, Βραζιλία, Καναδάς, Γαλλία, Γερμανία, Μεξικό, Ηνωμένο Βασίλειο, Ισπανία, … Διαμοιρασμένη διαδρομή μέσω OsmAnd Πατήστε οποιοδήποτε υφιστάμενο στοιχείο για να δείτε περισσότερες λεπτομέρειες, παρατεταμένο πάτημα για απενεργοποίηση ή διαγραφή. Τρέχοντα δεδομένα στη συσκευή (%1$s ελεύθερα): Ενδιάμεση μνήμη χρόνου για διαδικτυακή ιχνογράφηση @@ -2897,27 +2810,7 @@ Νέα κατατομή (προφίλ) Κατάρρευση ΑΤΙΑ - • Κατατομές (προφίλ) εφαρμογής: Δημιουργήστε μια προσαρμοσμένη κατατομή για τις δικές σας ανάγκες, με προσαρμοσμένο εικονίδιο και χρώμα -\n -\n • Τώρα, προσαρμόστε οποιεσδήποτε προεπιλογές και μεγ/ελαχ ταχύτητα της κατατομής -\n -\n • Προστέθηκε γραφικό στοιχείο για τις τρέχουσες συντεταγμένες -\n -\n • Προστέθηκαν επιλογές για την εμφάνιση πυξίδας και χάρακα ακτίνας στον χάρτη -\n -\n • Διόρθωση παρασκηνίου καταγραφής ίχνους -\n -\n • Βελτιωμένες λήψεις χάρτη παρασκηνίου -\n -\n • Επιστροφή της επιλογής \'Ενεργοποίηση οθόνης\' -\n -\n • Διόρθωση επιλογής γλώσσας της βικιπαίδειας -\n -\n • Διόρθωση συμπεριφοράς πλήκτρου πυξίδας κατά την πλοήγηση -\n -\n • Άλλες διορθώσεις σφαλμάτων -\n -\n + • Κατατομές (προφίλ) εφαρμογής: Δημιουργήστε μια προσαρμοσμένη κατατομή για τις δικές σας ανάγκες, με προσαρμοσμένο εικονίδιο και χρώμα\n\n • Τώρα, προσαρμόστε οποιεσδήποτε προεπιλογές και μεγ/ελαχ ταχύτητα της κατατομής\n\n • Προστέθηκε γραφικό στοιχείο για τις τρέχουσες συντεταγμένες\n\n • Προστέθηκαν επιλογές για την εμφάνιση πυξίδας και χάρακα ακτίνας στον χάρτη\n\n • Διόρθωση παρασκηνίου καταγραφής ίχνους\n\n • Βελτιωμένες λήψεις χάρτη παρασκηνίου\n\n • Επιστροφή της επιλογής \'Ενεργοποίηση οθόνης\'\n\n • Διόρθωση επιλογής γλώσσας της Βικιπαίδειας\n\n • Διόρθωση συμπεριφοράς πλήκτρου πυξίδας κατά την πλοήγηση\n\n • Άλλες διορθώσεις σφαλμάτων Προσωπικός μεταφορέας Μονότροχο Βέσπα @@ -3190,23 +3083,7 @@ Να προτιμώνται μη στρωμένοι δρόμοι. Ενημέρωση όλων των χαρτών Ενημέρωση όλων των (%1$d) χαρτών; - • Ενημερώθηκε η εφαρμογή και οι ρυθμίσεις κατατομής (προφίλ): Οι ρυθμίσεις ταξινομούνται τώρα κατά τύπο. Κάθε κατατομή μπορεί να προσαρμοστεί ξεχωριστά. -\n -\n • Νέος διάλογος λήψης χάρτη που προτείνει χάρτη για λήψη κατά την πλοήγηση -\n -\n • Διορθώθηκαν τα νυκτερινά θέματα -\n -\n • Διορθώθηκαν αρκετά προβλήματα διαδρομών στον κόσμο -\n -\n • Ενημερώθηκαν οι χάρτες βάσης με περισσότερο λεπτομερές οδικό δίκτυο -\n -\n • Διορθώθηκαν οι πλημμυρισμένες περιοχές παγκοσμίως -\n -\n • Διαδρομές χιονοδρομίας: Προστέθηκαν κατατομές (προφίλ) υψομετρίας και πολυπλοκότητας διαδρομών στις λεπτομέρειες διαδρομών -\n -\n • Λοιπές διορθώσεις σφαλμάτων -\n -\n + • Ενημερώθηκε η εφαρμογή και οι ρυθμίσεις κατατομής (προφίλ): Οι ρυθμίσεις ταξινομούνται τώρα κατά τύπο. Κάθε κατατομή μπορεί να προσαρμοστεί ξεχωριστά.\n\n • Νέος διάλογος λήψης χάρτη που προτείνει χάρτη για λήψη κατά την πλοήγηση\n\n • Διορθώθηκαν τα νυκτερινά θέματα\n\n • Διορθώθηκαν αρκετά προβλήματα διαδρομών στον κόσμο\n\n • Ενημερώθηκαν οι χάρτες βάσης με περισσότερο λεπτομερές οδικό δίκτυο\n\n • Διορθώθηκαν οι πλημμυρισμένες περιοχές παγκοσμίως\n\n • Διαδρομές χιονοδρομίας: Προστέθηκαν κατατομές (προφίλ) υψομετρίας και πολυπλοκότητας διαδρομών στις λεπτομέρειες διαδρομών\n\n • Λοιπές διορθώσεις σφαλμάτων Εφαρμόστε αυτήν την αλλαγή σε όλες τις κατατομές (προφίλ) ή στην επιλεγμένη. Κοινόχρηστο Να προτιμώνται μη στρωμένοι δρόμοι @@ -3575,31 +3452,7 @@ Προεπιλεγμένη απενεργοποίηση: Όσο εκτελείται το OsmAnd στο προσκήνιο, η οθόνη δεν θα σβήσει. \n \nΕάν είναι ενεργό, το OsmAnd θα χρησιμοποιήσει τη ρύθμιση χρόνου αδράνειας του συστήματος. - • Κατατομές (προφίλ): τώρα μπορείτε να αλλάξετε τη σειρά, να ορίσετε εικονίδιο για τον χάρτη, να αλλάξετε όλες τις ρυθμίσεις για κατατομές βάσης και να τις επαναφέρετε στις προεπιλογές. -\n -\n • Προστέθηκε αριθμός εξόδου στην πλοήγηση -\n -\n • Ξαναδουλεύτηκαν οι ρυθμίσεις προσθέτου -\n -\n • Ξαναδουλεύτηκε η οθόνη ρυθμίσεων για γρήγορη πρόσβαση σε όλες τις κατατομές -\n -\n • Προστέθηκε επιλογή αντιγραφής ρυθμίσεων από άλλη κατατομή -\n -\n • Προστέθηκε η δυνατότητα αλλαγής σειράς ή απόκρυψης κατηγοριών ΣΕ στην αναζήτηση -\n -\n • Καλύτερη στοίχιση εικονιδίων ΣΕ στον χάρτη -\n -\n • Προστέθηκαν δεδομένα δύσης / ανατολής για τον χάρτη διαμόρφωσης -\n -\n • Προστέθηκαν εικονίδια οικίας/εργασίας στον χάρτη -\n -\n • Προστέθηκε υποστήριξη για περιγραφή πολλών γραμμών στις ρυθμίσεις -\n -\n • Προστέθηκε σωστή μεταγραφή στον χάρτη Ιαπωνίας -\n -\n • Προστέθηκε χάρτης της Ανταρκτικής -\n -\n + • Κατατομές (προφίλ): τώρα μπορείτε να αλλάξετε τη σειρά, να ορίσετε εικονίδιο για τον χάρτη, να αλλάξετε όλες τις ρυθμίσεις για κατατομές βάσης και να τις επαναφέρετε στις προεπιλογές.\n\n • Προστέθηκε αριθμός εξόδου στην πλοήγηση\n\n • Ξαναδουλεύτηκαν οι ρυθμίσεις προσθέτου\n\n • Ξαναδουλεύτηκε η οθόνη ρυθμίσεων για γρήγορη πρόσβαση σε όλες τις κατατομές\n\n • Προστέθηκε επιλογή αντιγραφής ρυθμίσεων από άλλη κατατομή\n\n • Προστέθηκε η δυνατότητα αλλαγής σειράς ή απόκρυψης κατηγοριών ΣΕ στην αναζήτηση\n\n • Καλύτερη στοίχιση εικονιδίων ΣΕ στον χάρτη\n\n • Προστέθηκαν δεδομένα δύσης / ανατολής για τον χάρτη διαμόρφωσης\n\n • Προστέθηκαν εικονίδια οικίας/εργασίας στον χάρτη\n\n • Προστέθηκε υποστήριξη για περιγραφή πολλών γραμμών στις ρυθμίσεις\n\n • Προστέθηκε σωστή μεταγραφή στον χάρτη Ιαπωνίας\n\n • Προστέθηκε χάρτης της Ανταρκτικής Ανταρκτική Ταξινόμηση κατά κατηγορία Συνέχιση @@ -4563,4 +4416,54 @@ Διαθέσιμο μέχρι %1$s Κάντε αναστροφή Στρίψτε ελαφρώς αριστερά + Μάθετε περισσότερα για τους αισθητήρες. + Άγνωστη συσκευή + Δεν χρησιμοποιείται + Δεν είναι δυνατή η έναρξη της σύζευξης με τη συσκευή + Πίεση καυσίμου + Καύσιμο που έμεινε (km) + Συνδέθηκε με %s + Συνδέεται με %s + Θερμοκρασία λαδιού μηχανής + Έναρξη / Παύση + Φυσιολογικό + Αυθεντικό + Εμφάνιση θέσης + Καύσιμο που έμεινε (%) + Ρυθμός κατανάλωσης καυσίμου (obd) + Ρυθμός κατανάλωσης καυσίμου l/h + Ρυθμός κατανάλωσης καυσίμου %/h + Οδικοί χάρτες + Αποσυνδέθηκε από %s + Ρυθμός κατανάλωσης καυσίμου (l/km) + Εμφανίζει τον ρυθμό κατανάλωσης καυσίμου του οχήματος βάσει υπολογισμών (%/h) + Επίπεδο καυσίμου (l) + Επίπεδο καυσίμου (%) + Καύσιμο που έμεινε (l) + Αύξηση + Σύνδεση με ευθεία γραμμή + Λήψη πλακιδίων + Διαγραφή Ομάδας + Εμφάνιση πλαγιάς + Χάρτης ύψους + Πως να το χρησιμοποιήσετε: + Εκτός σύνδεσης + Χιλιόμετρα ανά ώρα + Προσομοίωση δεδομένων obd + Εμφανίζει τον ρυθμό κατανάλωσης καυσίμου του οχήματος βάσει υπολογισμών (l/km) + Πληροφορίες οχήματος + Το OsmAnd υποστηρίζει Bluetooth συνδέσεις προς OBD-II σαρωτές. + Πως να συνδέσετε: + Μεγάλο + Κλείδωμα οθόνης + Μείωση + Σε σύνδεση + Μίλια ανά ώρα + Μέτρα/δευτερόλεπτο + Μόνο ότι λείπει + Δεν περιλαμβάνεται + Απόκρυψη πλαγιάς + Δεν υπάρχει σύνδεση στο διαδίκτυο + Παρακαλούμε ελέγξτε τη σύνδεσή σας και δοκιμάστε ξανά. + Πηγή \ No newline at end of file diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml index 68752882b0b..b5233500daf 100644 --- a/OsmAnd/res/values-es-rAR/phrases.xml +++ b/OsmAnd/res/values-es-rAR/phrases.xml @@ -4880,4 +4880,19 @@ No acepta Parkster Túnel prohibido para peatones Túnel prohibido para ciclistas + Artículos de viaje + Puntos de viaje + Otras rutas + Otros puntos de ruta + Bicicleta + Senderismo + Correr + Peatón + Deportes acuáticos + Equitación + Deportes de invierno + Motonieve + Circuitos aeróbicos + Patines en línea + Ciclismo de montaña \ No newline at end of file diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index b3323f75627..5f430cda076 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -196,7 +196,7 @@ Panel derecho Panel izquierdo Configurar mapa - A menos de + Dentro de Usuario anónimo Conectado como «%1$s» Tolerancia del límite de velocidad @@ -2504,7 +2504,7 @@ Mapa importado Escribe el nombre del archivo. Rutas a menos de - A menos de + Dentro de GG°MM′SS″ GG.GGGGGG° GG.GGGGG° @@ -5634,7 +5634,7 @@ Tiempo de funcionamiento del motor Muestra el tiempo de funcionamiento del motor, según el escáner OBD Simular datos OBD - Ubicación del acelerador + Posición del acelerador Muestra la presión del combustible (presión manométrica) según el escáner OBD kPa Presión del combustible @@ -5644,4 +5644,9 @@ Temperatura del aceite del motor Muestra la temperatura del aceite del motor, según el escáner OBD No es posible vincular con el dispositivo + El icono cambia según el estado de la acción. + Desconectado de %s + Conectando a %s + Dinámico + Conectado a %s \ No newline at end of file diff --git a/OsmAnd/res/values-es/phrases.xml b/OsmAnd/res/values-es/phrases.xml index b3101b695e6..60ae2b93bd4 100644 --- a/OsmAnd/res/values-es/phrases.xml +++ b/OsmAnd/res/values-es/phrases.xml @@ -4880,4 +4880,19 @@ Parco Túnel prohibido para peatones Túnel prohibido para ciclistas + Bicicleta + Senderismo + Correr + Peatonal + Deportes acuáticos + Equitación + Motonieve + Circuitos aeróbicos + Patines en línea + Bicicleta de montaña + Artículos de viajes + Puntos del viaje + Otras rutas + Otros puntos de la ruta + Deportes de invierno \ No newline at end of file diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index 877d7fbb160..d9dda8566d5 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -6035,4 +6035,9 @@ kPa Muestra la carga del motor calculada del vehículo basada en el sensor No se puede iniciar el emparejamiento con el dispositivo + El icono cambia según el estado de la acción. + Dinámico + Conectado a %s + Desconectado de %s + Connectando a %s \ No newline at end of file diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 89fb80851f1..f172114ff6d 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -5640,4 +5640,9 @@ Impossible d\'amorcer l\'association avec l\'appareil Affiche la charge moteur calculée à partir du capteur Charge moteur calculée + Dynamique + Connecté à %s + Déconnecté de %s + Connexion en cours à %s + L’icône change en fonction de l\'état de l\'action. \ No newline at end of file diff --git a/OsmAnd/res/values-hu/phrases.xml b/OsmAnd/res/values-hu/phrases.xml index 6f4226b7290..7ec3feb4416 100644 --- a/OsmAnd/res/values-hu/phrases.xml +++ b/OsmAnd/res/values-hu/phrases.xml @@ -597,7 +597,7 @@ Búvárfelszerelés-bolt Papírbolt Autógumibolt - State Emergency Service (állami vészhelyzeti szolgálat), AUS + Katasztrófavédelmi állomás Vészhelyzeti elérési pont Lépőkövek Műszaki vizsgáló állomás @@ -2360,7 +2360,7 @@ Bolgár Tibeti Leírás siketeknek - Defibrillátor + Defibrillátor;félautomata Defibrillátor Lóval szabad Lóval tilos @@ -3983,7 +3983,7 @@ Azonosítás chipkártyával Érintésmentes azonosítás Használat kerékpárral - Használat + Használat általában Használat rollerrel Délnyugati irány Délkeleti irány @@ -4853,4 +4853,31 @@ ezen keresztül: Vészhelyzeti megállóöböl Ingatlankezelő iroda + Csónakindító + Sólya (csónakkiemeléshez) + Sólya + Lókarám + Menedékhely csoportnak + Világítótorony + Természetes/veszélyeztetett környezet + Hulladéklerakó lakóautóknak + Melegedőhely + Gyors + Parkolóterület + Készpénzbefizetés + van + Peszketáriánus étel nincs + Alagút használata kerékpárosoknak tilos + Alagút használata gyalogosoknak tilos + Gátbevágás (elzárható) + Tűztorony + Lótámasz + Használat + Hófánkozás + nincs + Ügyfelek + Parco + Parcót nem fogad el + Parkster + Parkstert nem fogad el \ No newline at end of file diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml index c6c486e760a..39542f6ea87 100644 --- a/OsmAnd/res/values-hu/strings.xml +++ b/OsmAnd/res/values-hu/strings.xml @@ -773,28 +773,7 @@ Megjelenítési tulajdonságok Térképstílus Globális mobil térkép és navigáció, offline és online OSM-térképekkel - OsmAnd (OSM Automated Navigation Directions) -\n -\n Az OsmAnd nyílt forráskódú navigációs alkalmazás, amely a globális OSM adatok széles skáláját használja. Az alkalmazás internetkapcsolat nélkül is használható, mert minden (vektoros és csempés) térképadat tárolható a telefon memóriájában. Az alkalmazás továbbá offline és online útvonaltervezést is tartalmaz, részletes, hangvezérléses navigációval. -\n -\n Néhány fontos funkció: -\n - Teljesen offline működés (letöltött vektoros és csempés térképek tárolása a készülék tárhelyén) -\n - kompakt vektoros térképek az egész világról -\n - Ország- és régiótérképek letöltése közvetlenül az alkalmazásból -\n - Több térkép egymásra rétegezése, például állítható átlátszóságú GPX- vagy navigációs nyomvonalak, érdekes pontok, kedvencek, tömegközlekedési megállók és további térképek, topográfiai jellemzők, mint szintvonalak, árnyékolás, lejtés -\n - Címek és helyek (érdekes pontok) offline keresése -\n - Offline útvonaltervezés közepes távolságra -\n - Autós, kerékpáros és gyalogos módok a következő beállításokkal: -\n - éjszakai/nappali nézet automatikus átkapcsolása -\n - sebességfüggő térképnagyítás -\n - térképigazítás iránytű vagy mozgásirány szerint -\n - sávnavigáció, sebességkorlátozás kijelzése, rögzített és hangfelolvasásos (TTS) hangok -\n -\n Az OsmAnd ezen ingyenes verziójának korlátozásai: -\n - letölthető térképek számának korlátozása -\n - wikipédia-POI offline elérés nélkül -\n -\n Az OsmAndot aktívan fejlesztjük. Projektünk és a folyamatos előrelépés az új funkciók kifejlesztésére és tesztelésére kapott adományoktól függ. Kérjük, fontolja meg az OsmAnd+ megvásárlását vagy konkrét új funkciók finanszírozását vagy egy általános adományt a https://osmand.net oldalon. + OsmAnd (OSM Automated Navigation Directions) \n \n Az OsmAnd nyílt forráskódú navigációs alkalmazás, amely a globális OSM adatok széles skáláját használja. Az alkalmazás internetkapcsolat nélkül is használható, mert minden (vektoros és csempés) térképadat tárolható a telefon memóriájában. Az alkalmazás továbbá offline és online útvonaltervezést is tartalmaz, részletes, hangvezérléses navigációval. \n \n Néhány fontos funkció: \n - Teljesen offline működés (letöltött vektoros és csempés térképek tárolása a készülék tárhelyén) \n - kompakt vektoros térképek az egész világról \n - Ország- és régiótérképek letöltése közvetlenül az alkalmazásból \n - Több térkép egymásra rétegezése, például állítható átlátszóságú GPX- vagy navigációs nyomvonalak, érdekes pontok, kedvencek, tömegközlekedési megállók és további térképek, topográfiai jellemzők, mint szintvonalak, árnyékolás, lejtés \n - Címek és helyek (érdekes pontok) offline keresése \n - Offline útvonaltervezés közepes távolságra \n - Autós, kerékpáros és gyalogos módok a következő beállításokkal: \n - éjszakai/nappali nézet automatikus átkapcsolása \n - sebességfüggő térképnagyítás \n - térképigazítás iránytű vagy mozgásirány szerint \n - sávnavigáció, sebességkorlátozás kijelzése, rögzített és hangfelolvasásos (TTS) hangok \n \n Az OsmAnd ezen ingyenes verziójának korlátozásai: \n - letölthető térképek számának korlátozása \n - wikipédia-POI offline elérés nélkül \n \n Az OsmAndot aktívan fejlesztjük. Projektünk és a folyamatos előrelépés az új funkciók kifejlesztésére és tesztelésére kapott adományoktól függ. Fontolja meg az OsmAnd+ megvásárlását vagy konkrét új funkciók finanszírozását vagy egy általános adományt a https://osmand.net oldalon. OsmAnd+ (OSM Automated Navigation Directions) \n \n Az OsmAnd+ nyílt forráskódú navigációs alkalmazás, amely a globális OSM adatok széles skáláját használja. Az alkalmazás internetkapcsolat nélkül is használható, mert minden (vektoros és csempés) térképadat tárolható a telefon memóriájában. Az alkalmazás továbbá offline és online útvonaltervezést is tartalmaz, részletes, hangvezérléses navigációval. \n \n Az OsmAnd+ az alkalmazás fizetős verziója, megvásárlásával támogatja a projektet, új funkciók kifejlesztését finanszírozza és megkapja a legújabb frissítéseket. \n \n Néhány fontos funkció: \n - Teljesen offline működés (letöltött vektoros és csempés térképek tárolása a készülék tárhelyén) \n - Kompakt vektoros térképek az egész világról \n - Korlátlan számú ország- és régiótérkép letöltése közvetlenül az alkalmazásból \n - Offline Wikipédia-funkció (Wikipédiához kapcsolódó érdekes pontok letöltése), városnézéshez kiváló \n - Több térkép egymásra rétegezése, például állítható átlátszóságú GPX- vagy navigációs nyomvonalak, érdekes pontok, kedvencek, tömegközlekedési megállók és további térképek testreszabható átlátszósággal, topográfiai jellemzőkkel, például szintvonalakkal/domborzatárnyékolással/lejtviszonyokkal \n - Címek és helyek (érdekes pontok) offline keresése \n - Offline útvonaltervezés közepes távolságra \n \n- Autós, kerékpáros és gyalogos módok a következő beállításokkal: \n - Éjszakai/nappali nézet automatikus átkapcsolása \n - Sebességfüggő térképnagyítás \n - Térképigazítás iránytű vagy mozgásirány szerint \n - Sávnavigáció, sebességkorlátozás kijelzése, rögzített és hangfelolvasásos (TTS) hangok Globális mobil térkép és navigáció, offline és online OSM térképekkel Autópálya nélkül @@ -825,7 +804,7 @@ Nincs út Célpont törlése %1$s köztes célpont - Kérjük, engedélyezze a GPS-t a beállításokban + Engedélyezze a GPS-t a beállításokban Célpont irányának megjelenítése A pozíciónaplózási szolgáltatások (GPX naplózás, online útvonalrögzítés) használatához engedélyezze az „Utazás felvétele” bővítményt Esetlegesen nem optimális útvonal tervezése nagyobb távolságokra @@ -892,7 +871,7 @@ Alapértelmezett modulművelet: Alapértelmezett modulművelet Felvétel %1$s %3$s %2$s - Kérjük, fontolja meg a „Topográfia” bővítmény megvásárlását, ezzel is támogatva a további fejlesztéseket. + Fontolja meg a „Topográfia” bővítmény megvásárlását, ezzel is támogatva a további fejlesztéseket. Topográfia bővítmény Más sorrend Szinkronizálja a hang- és videójegyzeteket a Dropbox fiókjával. @@ -934,7 +913,7 @@ Kedvenc kijelölése OSM-módosítások További műveletek - Jelenleg nincs Wi-Fi kapcsolat. Szeretnéd a jelenlegi internetkapcsolatot használni a letöltéshez? + Jelenleg nincs Wi-Fi kapcsolat. Szeretné a jelenlegi internetkapcsolatot használni a letöltéshez? Elveti az útvonalat\? Navigáció megállítása Célpont törlése @@ -947,7 +926,7 @@ Az iránytű olvasásakor csökkenti a zajt, de növeli a tehetetlenségét. Kálmán-szűrő használata Szintvonalak - Kérjük, várja meg, amíg a jelenlegi feladat befejeződik + Várja meg, amíg a jelenlegi feladat befejeződik Letöltés… idő pontosság @@ -974,7 +953,7 @@ Pont törlése A köztes célpontok optimális rendezése a célponthoz vezető útvonalon. Rendezés háztól-házig - Kérjük, a „Beállítások”-ban adja meg OSM-felhasználónevét és jelszavát + A „Beállításokban” adja meg az OSM-felhasználónevét és -jelszavát Köztes célpontok törlése Köztes célpontok megtartása Már vannak beállított köztes célpontjai. @@ -1030,7 +1009,7 @@ Megad/Szerkeszt… Föld alaptérkép Térképnagyítás - Kérjük, először számítsa ki az útvonalat + Először számítsa ki az útvonalat Szimuláció a tervezett útvonalon Szimuláció GPX nyomvonalon Emlékezzen a választásra @@ -1380,7 +1359,7 @@ Napi összeállítások letöltése. Engedélyezés Letiltás - A bővítmény telepítéséhez csatlakoznia kell az internetre. + A bővítmény telepítéséhez internetkapcsolat szükséges. Beszerzés Build-ok Sítérképnézet @@ -1448,7 +1427,7 @@ Megtekintés ez előtt: A-GPS információk A-GPS adatok letöltve: %1$s - Üdvözlünk + Üdvözöljük OSM-módosítások hozzáadva a helyi módosításkészlethez Megjelölés törlésre Helyek @@ -1569,7 +1548,7 @@ Értékeld az alkalmazást Mondja el, miért. Mondja el javaslatait. - Kérjük, adjon pontszámot az OsmAndnak a Google Playen + Értékelje az OsmAndot a Gplayen Élő frissítések Nem érhetők el frissítések Véleménye és visszajelzése fontos számunkra. @@ -1598,7 +1577,7 @@ Nyitva tartás hozzáadása POI típus Sorok száma a kezdőlapon %1$s - Kérjük, adja meg a POI típusát. + Adja meg a POI típusát. Munkanapok Gyakori helyek Kedvencek @@ -1643,13 +1622,13 @@ Ingyenes verzió banner megjelenítése Az ingyenes verzió bannerének megjelenítése a fizetős verzióban is. Vásárlás - Kérjük, aktiválja a „Hajózásitérkép-nézet” bővítményt - Kérjük, aktiválja a „Topográfia” bővítményt + Aktiválja a „Hajózásitérkép-nézet” bővítményt + Aktiválja a „Topográfia” bővítményt Tovább Teljes verzió Letöltések %1$d fájl letöltése… - Kérjük, olyan kategórianevet válasszon, amely még nem létezik. + Olyan kategórianevet válasszon, amely még nem létezik. Kategórianév Új kategória hozzáadása A csak utakat tartalmazó térkép nem szükséges, mert le van töltve a teljes térkép. Letöltöd ennek ellenére? @@ -1730,7 +1709,7 @@ Típus nélkül menti a POI-t\? OSM-szerkesztés módosítása Kártya el lett rejtve - Kérjük, adja meg a helyes POI-típust, vagy hagyja ki ezt a lépést. + Adja meg a helyes POI-típust, vagy hagyja ki ezt a lépést. A menü gomb az irányítópultot indítja el a menü helyett Elérés a térképről Vágólapra másolva @@ -1781,7 +1760,7 @@ Éjjel Hónap és ország: Eltávolítás - Az alkalmazás átváltott belső memóriára, mert a kijelölt adattároló mappa írásvédett. Kérjük, jelöljön ki egy írható tárolómappát. + Az alkalmazás átváltott belső memóriára, mert a kijelölt adattároló mappa írásvédett. Jelöljön ki egy írható tárolómappát. Osztott memória Felső sáv Útvonal újratervezése @@ -1798,13 +1777,13 @@ Havi fizetés Aktív Inaktív - Kérjük, érvényes e-mail-címet adjon meg + Adjon meg egy érvényes e-mail-címet Nyilvános nevet adjon meg Köszönjük az OsmAnd támogatását! \nAz új funkciók aktiválásához az OsmAnd újraindítása szükséges. Az adománya egy részét a megadott régióban tevékenykedő OSM-szerkesztőknek továbbítjuk. Előfizetési beállítások - Először kérjük, vásároljon OsmAnd Live előfizetést + Először vásároljon OsmAnd Live előfizetést Ez az előfizetés a világ bármely térképének óránkénti frissítését teszi lehetővé. \nA bevételek egy része az OSM közösségnek jut vissza, és OSM szerkesztésenként kerül kifizetésre. \nHa szereti az OsmAndot és az OSM-et, és szeretné támogatni a fejlődésüket, ez ennek a tökéletes módja. @@ -1873,7 +1852,7 @@ Klipek újraírása, ha a felhasznált hely túllépi a tárolási méretet. A felvett klipek legnagyobb hossza. Az összes felvett klip által elfoglalható hely. - Kérjük, vegyen fel jelölőket a térképen + Vegyen fel jelölőket a térképen Nem találhatók útpontok Relatív irányszög Ne tervezzen újra, miután elhagyja a tervezett útvonalat. @@ -1960,7 +1939,7 @@ Korlátlan számú térképletöltés és -frissítés, valamint Wikipédia-bővítmény. Mérföld, méter Térkép keresése… - Engedélyezze az OsmAnd-nek a pozíciója meghatározását, hogy letölthető térképet javasolhasson a régióhoz. + Engedélyezze az OsmAnd számára a pozíciója meghatározását, hogy letölthető térképet javasolhasson a régióhoz. Hely nem található Nincs internetkapcsolat A térképek letöltéséhez szükséges. @@ -1985,7 +1964,7 @@ Szűrő mentése Szűrő törlése Új szűrő - Kérjük, adja meg az új szűrő nevét, ami hozzá fog adódni a „Kategóriák” fülhöz. + Adja meg az új szűrő nevét, ami hozzá fog adódni a „Kategóriák” fülhöz. kabil Folytatás Nincs adat @@ -2095,8 +2074,7 @@ Open Location Code (OLC) Érvénytelen OLC (Open Location Code) \n - Rövid OLC (Open Location Code) -\nKérjük, teljes kódot adjon meg + Rövid OLC (Open Location Code)\nTeljes kódot adjon meg Érvényes teljes OLC \nA következő területet jeleníti meg: %1$s x %2$s Gomb, amely lépteti az alábbi listát. @@ -2515,7 +2493,7 @@ Szerkesztheti, sőt szerkessze a Wikivoyage szócikkeit. Ossza meg tudását, tapasztalatait, tehetségét és figyelmességét. Szerkesztés elkezdése Szerezz korlátlan hozzáférést - Üdvözlünk a nyílt bétatesztben + Üdvözöljük a nyílt bétatesztben Útikalauzok Útikalauz a bolygó legérdekesebb helyeihez, az OsmAndon belül, internetkapcsolat nélkül. Az offline útikalauz funkció használatához vásárolja meg az alábbiak egyikét: @@ -2603,7 +2581,7 @@ Keresési sugár kiterjesztése ekkorára: %1$s %1$s pont törölve Hozzáadott %1$s pontot. Adjon meg egy fájlnevet, és koppintson a „Mentés”-re. - Kérjük, küldjön egy képernyőképet erről az értesítésről a support@osmand.net címre + Küldjön egy képernyőképet erről az értesítésről a support@osmand.net címre Csak 360°-os képek megjelenítése Fekete Koppintson egy gombra és hallgassa meg a megfelelő hangutasítást, hogy a hiányzó vagy hibás utasításokat meghallja @@ -2779,7 +2757,7 @@ Műholdak keresése Koordinátamodul A Kedvencek vagy GPX-útpontok csoportjaként hozzáadott és elhagyottként megjelölt jelölők a térképen maradnak. A jelölők akkor tűnnek el a térképről, ha a csoport nem aktív (ki van kapcsolva). - Kérjük, ossza meg visszajelzését, és értékelje munkánkat a Google Playen. + Ossza meg visszajelzését, és értékelje munkánkat a Google Playen. Adatvédelmi irányelvek Segítsen, hogy jobbá tehessük az OsmAndot Engedélyezze, hogy az OsmAnd névtelen alkalmazáshasználati adatokat gyűjtsön és dolgozzon fel. Nem gyűjtünk vagy tárolunk adatokat a helyzetéről vagy az Ön által a térképen megtekintett helyekről. @@ -2815,7 +2793,7 @@ Típus: %s Alapprofil Navigációtípus kijelölése - Kérjük, jelöljön ki egy navigációtípust az új alkalmazásprofilhoz + Jelöljön ki egy navigációtípust az új alkalmazásprofilhoz Profil nevének megadása Először meg kell adnia egy profilnevet. Ez a név már létezik @@ -2838,7 +2816,7 @@ Legkisebb/legnagyobb sebesség beállítása Új profil Összeomlás - Az OsmAnd a legutóbbi futtatáskor összeomlott. Kérjük, a hibaüzenet megosztásával segítsen az OsmAnd javításában. + Az OsmAnd a legutóbbi futtatáskor összeomlott. A hibaüzenet megosztásával segítsen az OsmAnd javításában. UFO (azonosítatlan repülő tárgy) Egyéni személyszállító (pl. Segway) Egykerekű @@ -3212,7 +3190,7 @@ Bővítmény kikapcsolva Beállítások megnyitása Nincs újratervezés - Kérjük, adjon nevet a profilnak + Adjon nevet a profilnak Válassza ki az importálandó adatot. Mindkettő megtartása Az összes cseréje @@ -3461,7 +3439,7 @@ A térképnagyítás szintjének vezérlése a készülék hangerőgombjaival. Hangerőgombok használata nagyításhoz Görkorcsolya - Kérjük, adjon nevet a pontnak + Adjon nevet a pontnak Adja meg a járműve hosszát (a hosszú járművekre útvonalkorlátozások vonatkozhatnak). Wikipédia-térképek letöltése További adatok kijelölése exportálásra a profillal együtt. @@ -3611,8 +3589,7 @@ Motorosszán vezetéshez külön utakkal és pályákkal. Grafikon %1$s adatok csak utakról állnak rendelkezésre. Az ábrák megtekintéséhez az „Útvonal tervezése pontok között” funkcióval számítsa ki az útvonalat. - Kérjük, várjon. -\nAz ábra az útvonal újratervezése után lesz látható. + Várjon.\nAz ábra az útvonal újratervezése után lesz látható. Helyi térképek Hasznos és fontos létesítmény Különleges @@ -3675,7 +3652,7 @@ Importálandó elemek kijelölése. OSM-jegyzet, POI vagy GPX-nyomvonal feltöltésének teszteléséhez az openstreetmap.org helyett kapcsoljon át a dev.openstreetmap.org-ra. A dev.openstreetmap.org használata - Nem lehet feltölteni a képet, kérjük, próbálja meg később + Nem lehet feltölteni a képet, próbálja meg később Kép kijelölése német (tegeződő) %1$s * %2$s @@ -3815,7 +3792,7 @@ Megjelenítés / elrejtés A nyomvonal nem tartalmaz magassági adatokat. A nyomvonal nem tartalmaz sebességadatokat. - Kérjük, válasszon másik színezéstípust. + Válasszon másik színezéstípust. A naplózási intervallum azt az időközt határozza meg, amelyenként az OsmAnd lekérdezi az aktuális pozícióadatokat. Mentés és folytatás Minden nem mentett adat törlődni fog. @@ -3847,7 +3824,7 @@ Bemondás túllépéskor Felhasználói pontok Kimenet - Kérjük, válassza ki a mértékegységet. A formátum módosításához újra le kell töltenie a fájlt. + Válassza ki a mértékegységet. A formátum módosításához újra le kell töltenie a fájlt. Az OsmAnd méterben és lábban adja meg a szintvonalak közötti távolságot. A mértékegység módosításához újra le kell töltenie a fájlt. láb Szintvonalak mértékegysége @@ -3868,16 +3845,15 @@ További keresés… %1$s %2$s %3$s OsmAnd Cloud - Hitelesítő kód elküldve ide: %1$s. Kérjük, írja be az alábbi mezőbe. + Hitelesítő kód elküldve ide: %1$s. Írja be az alábbi mezőbe. Ez 10 akár perc is lehet. Ha nincs a spam mappában, használja az alábbi gombot. Nem kaptam hitelesítő kódot Újraküldés Ez az e-mail-cím már regisztrálva van. Ez az e-mail-címe nincs regisztrálva az OsmAnd Cloud szolgáltatásban E-mail-cím hitelesítése - Kérjük, írja be a regisztrációhoz használt e-mail-címet. Egy egyszer használatos jelszót küldünk erre. - Kérjük, adja meg az e-mail címét, ahová küldünk egy ellenőrző kódot, -\nés minden adatát összekapcsoljuk vele. + Írja be a regisztrációhoz használt e-mail-címet. Egy egyszer használatos jelszót küldünk erre. + Adja meg az e-mail-címét, ahová küldünk egy ellenőrző kódot,\nés minden adatát összekapcsoljuk vele. Segítségre van szüksége\? Lépjen velünk kapcsolatba itt: %1$s Visszaállítás fájlból Biztonsági mentés fájlként @@ -3900,13 +3876,12 @@ Online Használhat előre meghatározott sablonokat, vagy a következő online útvonaltervezőket: OSRM, Graphhopper, openrouteservice és GPX. Külső - Nem sikerült betölteni az előre meghatározott sablonok listáját. -\nKérjük, ellenőrizze internetkapcsolatát. + Nem sikerült betölteni az előre meghatározott sablonok listáját. \nEllenőrízze az internetkapcsolatát. Előre meghatározott A biztonsági mentés kész Biztonsági mentés most Biztonsági mentés készítése - Ezen az eszközön sok változás van, kérjük, készítsen biztonsági mentést ezekről az adatokról, hogy el ne vesszenek. + Ezen az eszközön sok változás van, készítsen biztonsági mentést ezekről az adatokról, hogy el ne vesszenek. Ütközések Egyes fájlokat nem sikerült feltölteni a kiszolgálóra, mert ott egy újabb verzió van tárolva. Ütközések megtekintése @@ -4006,7 +3981,7 @@ Szintvonalak, domborzatárnyékolás, lejtésviszonyok Összes adat törlése… Minden adat törölve. - Kérjük, várjon, amíg az OsmAnd törli adatait a felhőből. Az eszközön lévő összes adat érintetlenül marad. + Várjon, amíg az OsmAnd törli adatait a felhőből. Az eszközön lévő összes adat érintetlenül marad. Minden adata sikeresen törlődött az OsmAnd Cloudból. Az összes verzióelőzmény el lett távolítva. Minden adat el lett távolítva. @@ -4113,9 +4088,7 @@ Átlátszó állapotsor A keresési előzményeket a beállításokban engedélyezheti. A meglátogatott térképjelölők listájának megjegyzéséhez engedélyezze az előzményeket. - Az Android új szabályai miatt 2021 novemberétől az OsmAnd 4.2 elveszíti a hozzáférést a megosztott tárhelyhez. -\n -\nKérjük, helyezze át az adatmappát Megosztott tárhelyből az elérhető tárhelybe. E nélkül az alkalmazás elveszíti a hozzáférést az adataihoz, például az offline térképekhez, a GPX-nyomvonalakhoz stb. + Az Android új szabályai miatt 2021 novemberétől az OsmAnd 4.2 elveszíti a hozzáférést a megosztott tárhelyhez. \n\nHelyezze át az adatmappát a „Megosztott” tárhelyből az elérhető tárhelybe. E nélkül az alkalmazás elveszíti a hozzáférést az adataihoz, például az offline térképekhez, a GPX-nyomvonalakhoz stb. Navigálás ide: Munkahely A legutóbb használt keresési találatok gyorsabb eléréséhez engedélyezze az előzményeket. %1$s le van tiltva @@ -4237,7 +4210,7 @@ A(z) „%1$s” eszközzel fájlhoz adhat útvonalakat. Nyomvonalak importálása Javasolt pontok kijelölése - Kérjük, nevezze el a csoportot. + Adjon nevet a csoportnak. A kijelölt útpontok hozzáadódnak a következő nyomvonalhoz: %1$s Fájl olvasása… Minden csoport @@ -4568,7 +4541,7 @@ Koordináták: térképközéppont A véletlenszerű egyedi felhasználóazonosító (UUID) a következőkre használható: offline térképek letöltése az OsmAnd szerverekről, a szervererőforrások méltányos igénybevételének nyomon követése, a forgalom mintázatainak előrejelzése és anonim havi térképjelentések készítése. A térképek letöltésével elfogadja a következőket: %1$s és %2$s. - Hozzáférés külső érzékelők adataihoz, mint pl pulzusszám, kerékpársebesség, -teljesítmény és pedálfordulatszám. Az eszközének ANT+ vezeték nélküli személyi hálózati protokollon keresztül kell csatlakoznia a megfelelő szenzorokhoz. + Hozzáférés külső érzékelők adataihoz, mint pl pulzusszám, kerékpársebesség, -teljesítmény és pedálfordulatszám. Az eszközének ANT+ vezeték nélküli személyi hálózati protokollon keresztül kell kapcsolódnia a megfelelő szenzorokhoz. GPS-jel elvesztésének és helyreállásának bemondása Külső érzékelők támogatása Külső érzékelők adatainak megjelenítése és rögzítése: kerékpár-sebesség, -teljesítmény, pedálfordulatszám, valamint pulzusszám. @@ -4579,9 +4552,7 @@ Térképjelek megjelenítése 1-es verzió Minden változtatás elvetésre kerül. - Az OsmAnd visszatért az „1-es verziójú” térkép-megjelenítőhöz. Megpróbálhat visszaváltani az új „2-es verziójú (OpenGL)” megjelenítő motorra a beállításokban. -\n -\nKérjük, támogassa a fejlesztéseket a hibanaplója elküldésével. + Az OsmAnd visszatért az „1-es verziójú” térkép-megjelenítőhöz. Megpróbálhat visszaváltani az új „2-es verziójú (OpenGL)” megjelenítő motorra a beállításokban. \n\nTámogassa a fejlesztéseket a hibanaplója elküldésével. A 2-es verzió (OpenGL) egy gyorsabb térkép-megjelenítő motor, amely 2,5D-s nézetet is tartalmaz. Az 1-es verzió volt az alapértelmezett az OsmAnd 4.3-as verziója előtt, régebbi eszközökön pedig még mindig előnyösebb a használata. Az OsmAnd térkép-megjelenítője nemrég összeomlott. Összeomlási napló megosztása @@ -4637,12 +4608,7 @@ Megjeleníti a szelet a jelenlegi térképközéppontnál. Megjeleníti a légnyomást a jelenlegi térképközéppontnál. A mértékegységek az időjárás bővítmény beállításaiban módosíthatók. - Funkciók: -\n- 24 órás és 7 napos időjárás-előrejelzés 5 rétegben -\n- helyalapú modulok, -\n- hőmérsékleti és légnyomásvonalak (izobárok). -\n -\nAz időjárási adatok szolgáltatója a Global Forecast System (GFS, %1$s). + Funkciók: \n- 24 órás és 7 napos időjárás-előrejelzés 5 rétegben \n- helyalapú modulok, \n- hőmérsékleti és légnyomásvonalak (izobárok).\n\nAz időjárási adatok szolgáltatója a Global Forecast System (GFS, %1$s). Megjeleníti a következő napnyugta idejét vagy az addig hátralévő időt. Megjeleníti a következő napkelte idejét vagy az addig hátralévő időt. Hátralévő idő @@ -4813,7 +4779,7 @@ Kapcsolódás A Bluetooth ki van kapcsolva Keresés - Szétkapcsolódva + Kapcsolat bontva Kapcsolódva Pedálfordulat Sebesség @@ -4831,8 +4797,8 @@ Fogadott adat Sebesség Párosítás - Szétkapcsolás - Szétkapcsolódva, %s + Kapcsolat bontása + Kapcsolat bontva, %s Keresés újra Új érzékelő párosítása Beállítások megnyitása @@ -4859,7 +4825,7 @@ Nincs találat Nyomvonal keresése név alapján %1$s nyomvonal - %1$s kapcsolódva + Kapcsolódva ezzel: %1$s Kerékpáros eszköz Vérnyomás Bluetooth engedély nincs megadva @@ -4870,7 +4836,7 @@ ütés Fülcimpa Láb - %1$s lekapcsolódott + Kapcsolat bontva ezzel: %1$s Kéz Csak név Szektorok @@ -4926,10 +4892,8 @@ Törlés kész Fiók törlése Az e-mail cím nem egyezik a bejelentkezéshez használt felhasználónévvel - A törlés előtt ellenőriznünk kell fiókját. -\n -\nKérjük, adja meg az e-mail címet, amellyel regisztrált. A következő lépéshez egyszeri jelszót küld a rendszer. - Fiókjának ellenőrzése + A törlés előtt hitelesíteni kell a fiókját.\n\nAdja meg az e-mail-címet, amellyel regisztrált. A következő lépéshez egyszeri jelszót küld a rendszer. + Fiókjának hitelesítése Minden fiók- és egyéb adat törölve lett az OsmAnd Cloud-ból. Pillanatokon belül törölve lesz minden fiók- és egyéb adat az OsmAnd Cloud-ból. \n @@ -5069,7 +5033,7 @@ Legnézettebb Adja meg a webcímet a következő paraméter szintaxissal: szélesség={0}, hosszúság={1}, időbélyeg={2}, hdop={3}, magasság={4}, sebesség={5}, irány={6}, eta={7}, etfa={8}, eda={9}, edfa={10}. Hőmérséklet - • Android Auto: 3D mód hozzáadva \n \n • Nyomvonalak: szűrők és intelligens mappák bevezetése, optimalizált memória a nagyobb fájlok számára \n \n • Továbbfejlesztett felső és alsó modulpanel az összes modul fogadásához \n \n • Továbbfejlesztett helyi erőforrás-kezelés \n \n • Testreszabható gomb-hozzárendelés külső vezérlőkhöz \n \n • Új widgetek: „Siklószám” és „Nap állása” \n \n • OsmAnd Cloud: Mostantól hozzáférhet a törölt fájlokhoz \n \n • Továbbfejlesztett vonalszínezés a lejtviszonyok módban új szimmetrikus gradienssel \n \n • Az átlátszó állapotsorral kapcsolatos probléma javítva \n \n • Hozzáadott támogatás az ANT+ hőmérséklet widgethez \n \n • Bemutatjuk az \"Elérhető RAM\" widgetet + • Android Auto: 3D mód hozzáadva \n \n • Nyomvonalak: szűrők és intelligens mappák bevezetése, optimalizált memória a nagyobb fájlok számára \n \n • Továbbfejlesztett felső és alsó modulpanel az összes modul fogadásához \n \n • Továbbfejlesztett helyi erőforrás-kezelés \n \n • Testreszabható gomb-hozzárendelés külső vezérlőkhöz \n \n • Új modulok: „Siklószám” és „Nap állása” \n \n • OsmAnd Cloud: Mostantól hozzáférhet a törölt fájlokhoz \n \n • Továbbfejlesztett vonalszínezés a lejtviszonyok módban új szimmetrikus gradienssel \n \n • Az átlátszó állapotsorral kapcsolatos probléma javítva \n \n • Hozzáadott támogatás az ANT+ hőmérséklet modulhoz \n \n • Bemutatjuk az \"Elérhető RAM\" modult Megjeleníti az érzékelő által mért hőmérsékletet Babakocsi Siklóernyőzés @@ -5142,7 +5106,7 @@ Mappa Nem meghatározott Nagyítás - Külső beviteli eszköz használatának engedélyezése az OsmAnd-nek + Külső beviteli eszköz használatának engedélyezése az OsmAnd számára Térkép tájolás módosítása Előző alkalmazásprofil A lenyomott billentyű kijelzése @@ -5206,8 +5170,8 @@ Az előző sorban összetett modul van %1$s modul csak a saját sorában helyezhető el. Pontos távolságadatok - Bármelyik csatlakoztatott - Bármelyik csatlakozva: %s + Bármelyik összekapcsolt + Bármelyik összekapcsolt: %s Útitérképek Minden nyomvonal Licenc @@ -5301,7 +5265,7 @@ Gomb törlése Biztos törölni akarja \"%1$s\"-t az összes hozzáadott művelettel együtt? Szükséges térképek - Néhány ehhez az útvonalhoz szükséges offline térkép hiányzik vagy nem naprakész. Kérjük, töltse le vagy frissítse ezeket a térképeket. + Néhány ehhez az útvonalhoz szükséges offline térkép hiányzik vagy nem naprakész. Töltse le vagy frissítse ezeket a térképeket. Szintén használt térképek: %1$s A szükséges térképek listájának lekérése… A hiányzó térképek listája légvonalú útvonalon alapul. A térképek pontos listájához az OsmAnd online előre ki tudja számítani az útvonalat. @@ -5408,8 +5372,7 @@ Időjárás-képernyő Alátétréteg Következő célpont - Töltöttségi szint / perc: %1$s -\nEnergiafogyasztás (mAh): %2$s + Töltöttségi szint / perc: %1$s\nEnergiafogyasztás (mAh): %2$s Megjelenítési statisztika (1/5/15 perces átlagok) Képkocka/másodperc a legutóbbi 1000 képre: %1$s \nCPU alap: %2$s @@ -5499,7 +5462,7 @@ Megnyitás böngészőben Forrás Nincs internetkapcsolat - Kérjük, ellenőrizze a kapcsolatát és próbálja újra. + Ellenőrizze az internetkapcsolatát és próbálja újra. Nincs elérhető fénykép Wikimedia Ehhez a helyhez még nem adtak hozzá felhasználói fotókat @@ -5547,9 +5510,9 @@ Akkumulátor feszültség Hűtőfolyadék hőmérséklete Üzemanyag-hatékonyság (%) - Üzemanyag-fogyasztás + Fogyasztás Megjeleníti az üzemanyag-fogyasztást az OBD adatai alapján - Hátralévő üzemanyag (távolság) + Maradék üzemanyag (távolság) Üzemanyagtípus Kövesse nyomon a legfontosabb járműmutatókat az OBD-II protokoll segítségével. Hozzáférhet az alábbi adatokhoz: * Motor fordulatszám * Üzemanyag-fogyasztás * Maradék üzemanyag * A motor indítása óta megtett távolság * Beszívott levegő hőmérséklete * Környezeti hőmérséklet * Hűtőfolyadék hőmérséklete * A jármű sebessége * Akkumulátor töltöttsége OBD támogatás @@ -5581,62 +5544,67 @@ Gomb OSM-szerkesztések megjelenítésére vagy rejtésére a térképen. Krosszmotor utak l/óra - • Teljes képernyős galérianézegető a Wikimedia képekhez\n\n • Új „Járműmetrika” bővítmény a jármű teljesítményének az OBD-II protokoll segítségével történő nyomon követésére\n\n • Tevékenységek rendelhetők a nyomvonalakhoz, melyek alapján szűrni lehet is őket\n\n • Új gyorsműveletek az utazás rögzítéséhez és az érintőképernyő zárolásához\n\n • Testreszabható térképgomb és precíz rácsok\n\n • Helyi menü és egy \"Átlagsebesség visszaállítása\" művelet a widgeteknél\n\n • Új \"Krosszmotor utak\" útvonalréteg\n\n • \"Nyomvonal automatikus rögzítése navigáció közben\" javítása\n\n • Javítva a probléma az elforgatott koordinátákkal az RTL-ben\n\n • Javítva a kihagyott szenzoradatok az aktuálisan rögzített nyomvonalhoz\n\n • Információk a kiválasztott pont környékéről\n\n • Gyorsművelet az OSM-szerkesztések láthatóságának szabályozására\n\n • Külön láthatósági paraméterek a terepszínezési opciókhoz\n\n • Koppintható ikon az út- vagy útvonalattribútumok megjelenítéséhez + • Teljes képernyős galérianézegető a Wikimedia képekhez\n\n • Új „Járműmetrika” bővítmény a jármű teljesítményének az OBD-II protokoll segítségével történő nyomon követésére\n\n • Tevékenységek rendelhetők a nyomvonalakhoz, melyek alapján szűrni lehet is őket\n\n • Új gyorsműveletek az utazás rögzítéséhez és az érintőképernyő zárolásához\n\n • Testreszabható térképgomb és precíz rácsok\n\n • Helyi menü és egy \"Átlagsebesség visszaállítása\" művelet a moduloknál\n\n • Új \"Krosszmotor utak\" útvonalréteg\n\n • \"Nyomvonal automatikus rögzítése navigáció közben\" javítása\n\n • Javítva a probléma az elforgatott koordinátákkal az RTL-ben\n\n • Javítva a kihagyott szenzoradatok az aktuálisan rögzített nyomvonalhoz\n\n • Információk a kiválasztott pont környékéről\n\n • Gyorsművelet az OSM-szerkesztések láthatóságának szabályozására\n\n • Külön láthatósági paraméterek a terepszínezési opciókhoz\n\n • Koppintható ikon az út- vagy útvonalattribútumok megjelenítéséhez Az érintőképernyő feloldva. - Az érintőképernyő le van zárva. Érintse meg a gombot a feloldáshoz. + Az érintőképernyő le van zárva. Koppintson a gombra a feloldáshoz. Az érintőképernyő le van zárva. A feloldáshoz nyomja meg a(z) %1$s gombot vagy koppintson a képernyőn megjelenő gombra. Az OsmAnd támogatja a Bluetooth-kapcsolatot használó OBD-II eszközöket. 2. Indítsa el a jármű motorját 3. Engedélyezze a Bluetooth-t a telefonján - 4. Érintse meg a „Csatlakozás”-t és válassza ki az OBD-II szkennert a listáról. + 4. Koppintson a „Kapcsolódásra” és válassza ki az OBD-olvasót a listáról. Tudjon meg többet az érzékelőkről. - Hátralévő üzemanyag (liter) + Maradék üzemanyag (liter) Jármű információ Bluetooth - 1. Csatlakoztassa a szkennert a járműve OBD-II portjához. - Hogyan csatlakoztatható: + 1. Helyezze az OBD-olvasó eszközt a járműve OBD-II aljzatába. + Hogyan működik: Útvonalvezetés Jármű sebessége Motor fordulatszáma - Nem található szkenner - Kapcsolja be a Bluetooth keresést és kapcsolja be a szkennert. - Tartsa készülékét a szkenner közelében. Győződjön meg arról, hogy a jármű motorja jár. - Ellenőrizze a következőket:\n – a Bluetooth be van-e kapcsolva\n – a motor jár-e\n – készüléke a szkenner hatókörén belül van. - Szkennerek keresése - Szkenner elfelejtése - A szkenner törlődik a listáról. Ezt a szkennert bármikor újra párosíthatja. - Valós idejű útbaigazítást biztosít, beleértve a következő kanyar távolságát, az út nevét, az aktuális utca nevét és a sávinformációkat. A widgetek navigáció közben aktívak. - 1. Csatlakoztassa a szkennert járműve OBD-II portjához.\n\n 2. Indítsa el a járműve motorját\n\n 3. Engedélyezze a Bluetooth-t a készülékén\n\n 4. Koppintson erre: „%1$s” és válassza ki a szkennert a listából. - Üzemanyag-fogyasztás (érzékelő) - Számítások alapján megjeleníti a jármű üzemanyag-fogyasztását liter/órában - Érzékelő adatai alapján megjeleníti a jármű üzemanyag-fogyasztását liter/órában + Nem található OBD-olvasó + Kapcsolja be a Bluetooth keresést és kapcsolja be az OBD-olvasót. + Tartsa készülékét az OBD-olvasó közelében. Győződjön meg arról, hogy a jármű motorja jár. + Ellenőrizze a következőket:\n – a Bluetooth be van-e kapcsolva\n – a motor jár-e\n – készüléke az OBD-olvasó hatókörén belül van. + OBD-olvasók keresése + OBD-olvasó elfelejtése + Az OBD-olvasó törlődik a listáról, de bármikor újra párosíthatja azt. + Valós idejű útbaigazítást biztosít, beleértve a következő kanyar távolságát, az út nevét, az aktuális utca nevét és a sávinformációkat. A modulok navigáció közben aktívak. + 1. Helyezze az OBD-olvasó eszközt a járműve OBD-II aljzatába.\n\n 2. Indítsa el a járműve motorját\n\n 3. Engedélyezze a Bluetooth-t a készülékén\n\n 4. Koppintson erre: „%1$s” és válassza ki a szkennert a listából. + Fogyasztás (érzékelő) + Megjeleníti a jármű számított időalapú üzemanyag-fogyasztását liter/órában + Megjeleníti a jármű üzemanyag-fogyasztását liter/órában az érzékelő adatai alapján Üzemanyagszint (l) Üzemanyagszint (%) Maradék üzemanyag (%) Maradék üzemanyag (l) Megtehető táv (km) - Üzemanyag-fogyasztás %/óra - Üzemanyag-fogyasztás (l/óra) - Üzemanyag fogyasztás (OBD) - Üzemanyag-fogyasztás l/óra + Fogyasztás %/óra + Fogyasztás (l/óra) + Fogyasztás (OBD) + Fogyasztás l/óra %/óra l Maximum l/100 km - Üzemanyag fogyasztás (l/km) - Számítások alapján megjeleníti a jármű üzemanyag fogyasztását (l/km) + Fogyasztás (l/km) + Megjeleníti a jármű számított távolságalapú üzemanyag fogyasztását (l/km) Motor üzemideje Fojtószelep helyzete OBD adatok szimulálása - Megjeleníti a motor üzemidejét az OBD szkenner adatai alapján + Megjeleníti a motor üzemidejét az OBD-olvasó adatai alapján Számított motorterhelés - Megjeleníti az üzemanyagnyomást az OBD szkenner adatai alapján - Megjeleníti a motorolaj hőmérsékletét az OBD szkenner adatai alapján - Megjeleníti az üzemanyag nyomást az OBD szkenner adatai alapján + Megjeleníti az üzemanyagnyomást az OBD-olvasó adatai alapján + Megjeleníti a motorolaj hőmérsékletét az OBD-olvasó adatai alapján + Megjeleníti az üzemanyag nyomást az OBD-olvasó adatai alapján Motorolaj-hőmérséklet kPa Üzemanyagnyomás Megjeleníti a jármű számított motorterhelését az érzékelő alapján - Megjeleníti számítások alapján a jármű üzemanyag-fogyasztási arányát (%/óra) + Megjeleníti a jármű számított relatív üzemanyag-fogyasztási arányát (%/óra) Nem lehet kezdeményezni a párosítást az eszközzel + Kapcsolat bontva ezzel: %s + Az ikon a műveleti állapot alapján változik. + Dinamikus + Kapcsolódva ehhez: %s + Kapcsolódás ehhez: %s \ No newline at end of file diff --git a/OsmAnd/res/values-in/strings.xml b/OsmAnd/res/values-in/strings.xml index 34d1b782dcb..844e9852079 100644 --- a/OsmAnd/res/values-in/strings.xml +++ b/OsmAnd/res/values-in/strings.xml @@ -5994,4 +5994,26 @@ Maksimum l %/j + Ikon berubah berdasarkan keadaan tindakan. + Tidak dapat memulai penyandingan dengan perangkat + Menampilkan tingkat konsumsi bahan bakar kendaraan berdasarka perhitungan (%/j) + l/100km + Tingkat konsumsi bahan bakar (l/km) + Waktu berjalan mesin + Menampilkan muatan mesin kendaraan yang telah dihitung berdasarkan sensor + Terputus dari %s + Terhubung ke %s + Dinamis + Menghubungkan ke %s + Menampilkan tingkat konsumsi bahan bakar kendaraan berdasarkan perhitungan (l/km) + Simulasikan data obd + Menampilkan waktu berjalan mesin kendaraan dari pemindai obd + Posisi throttle + Menampilkan tekanan bahan bakar kendaraan (pengukur tekanan) dari pemindai obd + kPa + Tekanan bahan bakar + Menampilkan tekanan bahan bakar kendaraan (pengukur tekanan) dari pemindai obd + Muatan mesin terhitung + Suhu minyak mesin + Menampilkan suhu minyak mesin kendaraan dari pemindai obd \ No newline at end of file diff --git a/OsmAnd/res/values-is/phrases.xml b/OsmAnd/res/values-is/phrases.xml index dcdfd3dc712..587d6cc343d 100644 --- a/OsmAnd/res/values-is/phrases.xml +++ b/OsmAnd/res/values-is/phrases.xml @@ -2026,7 +2026,7 @@ Án salerna Slökkviliðskústur Slökkviliðsvatnsból - SES-neyðarstöð + Björgunar- og neyðarstöð Landnotkun í atvinnuskyni Landnotkun fyrir verslun Skrifstofa þjóðskrár diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml index 90fa8bf7e5b..0de01e6a492 100644 --- a/OsmAnd/res/values-is/strings.xml +++ b/OsmAnd/res/values-is/strings.xml @@ -1965,11 +1965,7 @@ Veldu þegar birta á kort einungis með vegum: Stilla umferðaraðvaranir (hraðatakmarkanir, lokanir, umferðarhnúta, hraðahindranir, veggöng), aðvaranir um hraðamyndavélar og upplýsingar um akreinaskiptingar. Almenn skoðun landakorta í farsíma og flakk á ónettengdum sem nettengdum OSM-landakortum - Leggðu þitt fram til OSM -\n • Tilkynntu um villur í gögnum -\n • Sendu inn GPX-ferla til OSM beint úr forritinu -\n • Bættu við merkisstöðum og sendu þá beint inn til OSM (eða síðar ef engin nettenging er til staðar) -\n + Leggðu þitt fram til OSM \n • Tilkynntu um villur í gögnum \n • Sendu inn GPX-ferla til OSM beint úr forritinu \n • Bættu við merkisstöðum og sendu þá beint inn til OSM (eða síðar ef engin nettenging er til staðar) OsmAnd er opinn hugbúnaður og í stöðugri þróun. Hver sem er getur tekið þátt í gerð forritsins, til dæmis með því að tilkynna um hnökra, bæta þýðingar eða forrita nýja eiginleika. Lífleg staða verkefnisins og sífelldar endurbætur má þannig rekja til margra þátta samspils milli notenda og hönnuða. Verkefnið styðst líka við fjárhagslega styrki frá notendum sem nýtast til að fjármagna viðameiri forritun og prófanir. \n Gæði og áætluð þekja landakorta: \n • Vestur-Evrópa: **** @@ -2463,12 +2459,7 @@ \n OsmAnd+ er sú útgáfa forritsins sem þú borgar fyrir. Með því að kaupa hana, ertu að styðja við verkefnið, fjármagna þróun nýrra eiginleika, og færð í kaupbæti allar nýjustu uppfærslur. \n \n Nokkrir af helstu eiginleikunum: - Öryggiseiginleikar -\n • Hægt að velja sjálfvirka skiptingu milli dags- og nætursýnar -\n • Valkvæð birting hraðatakmarkana, með áminningu ef farið er yfir hraðatakmörk -\n • Hægt að láta aðdrátt vera háðan hraða -\n • Deildu staðsetningunni þinni svo að vinir þínir geti fundið þig -\n + Öryggiseiginleikar \n • Hægt að velja sjálfvirka skiptingu milli dags- og nætursýnar \n • Valkvæð birting hraðatakmarkana, með áminningu ef farið er yfir hraðatakmörk \n • Hægt að láta aðdrátt vera háðan hraða \n • Deildu staðsetningunni þinni svo að vinir þínir geti fundið þig Eiginleikar fyrir hjóla- og göngufólk \n • Skoðaðu göngu-, bakpokaferða- og hjólaslóðir, frábært fyrir útilífsfólk \n • Sérstakir birtingar- og leiðarvalshamir fyrir hjólandi og gangandi @@ -2476,14 +2467,7 @@ \n • Hægt að skrá ferð í GPX-skrá á tækinu eða í þjónustu á netinu \n • Valkvæð birting á hraða og hæðarupplýsingum \n • Birting á hæðarlínum og hæðaskyggingum (í gegnum forritsviðbót) - Skoðun landakorts -\n • Birting á staðsetningu þinni og stefnu -\n • Hægt er að láta skjáinn stefna samkvæmt áttavita eða hreyfingarstefnu þinni -\n • Vistaðu mikilvæga staði í Eftirlæti -\n • Birtu merkisstaði (POI - point of interests) í kringum þig -\n • Birtu sérstakar kortaflísar af netinu, gervihnattasýn (frá Bing), mismunandi þekjur á borð við GPX-ferla fyrir leiðsögn/ferðamennsku og viðbótarlög með sérsníðanlegu gegnsæi -\n • Hægt er að birta staðaheiti á ensku, tungumáli heimamanna eða með hljóðframburði -\n + Skoðun landakorts \n • Birting á staðsetningu þinni og stefnu \n • Hægt er að láta skjáinn stefna samkvæmt áttavita eða hreyfingarstefnu þinni \n • Vistaðu mikilvæga staði í Eftirlæti \n • Birtu merkisstaði (POI - point of interests) í kringum þig \n • Birtu sérstakar kortaflísar af netinu, gervihnattasýn (frá Bing), mismunandi þekjur á borð við GPX-ferla fyrir leiðsögn/ferðamennsku og viðbótarlög með sérsníðanlegu gegnsæi \n • Hægt er að birta staðaheiti á ensku, tungumáli heimamanna eða með hljóðframburði OsmAnd (OSM Automated Navigation Directions) \n \n OsmAnd leiðsöguforritið er opinn og frjáls hugbúnaður með aðgang að fjölbreyttum alþjóðlegum gögnum frá OpenStreetMap(OSM). Hægt er að vista öll kortagögn (vektor eða flísar) á minniskort síma fyrir notkun án nettengingar. OsmAnd býður einnig upp á leiðargerð, annað hvort ónettengda eða með nettengingu, með möguleika á raddleiðsögn. @@ -2506,69 +2490,17 @@ \n - Enginn aðgangur að ónettengdum Wikipedia-merkisstöðum. \n \n OsmAnd er í virkri þróun, verkefnið okkar og frekari framfarir byggjast á fjárframlögum til að fjármagna þróun og prófanir á nýjum eiginleikum. Vinsamlega íhugaðu að kaupa OsmAnd+, fjármagna sérstakar nýjar aðgerðir eða gefa almennt framlag á https://osmand.net. - GPS-leiðsögn -\n • Þú getur valið leiðsögn með nettengingu (hraðvirkt) eða án nettengingar (engin aukagjöld þegar þú ert erlendis) -\n • Raddleiðsögn beygju-fyrir-beygju (upptökur eða talgervill) -\n • Sjálfvirkur endurútreikningur leiðar þegar farið er út af leið -\n • Hægt að gefa ábendingar um akreinaskipti, birta götuheiti og áætlaðan komutíma -\n • Til að auka öryggið er hægt að velja sjálfvirka skiptingu milli dags- og nætursýnar -\n • Þú getur valið að birta hraðatakmarkanir, með áminningu ef farið er yfir löglegan hraða -\n • Hægt að láta aðdrátt vera háðan hraða -\n • Leit að stöðum eftir heimilisfangi, eftir tegund (t.d.: veitingastaður, hótel, bensínstöð, safn), eða eftir landfræðilegum hnitum -\n • Styður millipunkta á leiðinni þinni -\n • Þú getur skráð þinn eigin GPX-feril eða náð í einn slíkan og fylgt honum -\n - Landakort -\n • Birtir merkisstaði (POI - point of interests) í kringum þig -\n • Hægt er að láta kortið stefna samkvæmt áttavita eða hreyfingarstefnu þinni -\n • Sýnir hvar þú ert og hvert þú ert að horfa -\n • Deildu staðsetningunni þinni svo að vinir þínir geti fundið þig -\n • Vistaðu mikilvæga staði í Eftirlæti -\n • Hægt er að birta staðaheiti á ensku, tungumáli heimamanna eða með hljóðframburði -\n • Birtir sérstakar kortaflísar af netinu, gervihnattasýn (frá Bing), mismunandi þekjur á borð við GPX-ferla fyrir leiðsögn/ferðamennsku og viðbótarlög með sérsníðanlegu gegnsæi -\n + GPS-leiðsögn \n • Þú getur valið leiðsögn með nettengingu (hraðvirkt) eða án nettengingar (engin aukagjöld þegar þú ert erlendis) \n • Raddleiðsögn beygju-fyrir-beygju (upptökur eða talgervill) \n • Sjálfvirkur endurútreikningur leiðar þegar farið er út af leið \n • Hægt að gefa ábendingar um akreinaskipti, birta götuheiti og áætlaðan komutíma \n • Til að auka öryggið er hægt að velja sjálfvirka skiptingu milli dags- og nætursýnar \n • Þú getur valið að birta hraðatakmarkanir, með áminningu ef farið er yfir löglegan hraða \n • Hægt að láta aðdrátt vera háðan hraða \n • Leit að stöðum eftir heimilisfangi, eftir tegund (t.d.: veitingastaður, hótel, bensínstöð, safn), eða eftir landfræðilegum hnitum \n • Styður millipunkta á leiðinni þinni \n • Þú getur skráð þinn eigin GPX-feril eða náð í einn slíkan og fylgt honum + Landakort \n • Birtir merkisstaði (POI - point of interests) í kringum þig \n • Hægt er að láta kortið stefna samkvæmt áttavita eða hreyfingarstefnu þinni \n • Sýnir hvar þú ert og hvert þú ert að horfa \n • Deildu staðsetningunni þinni svo að vinir þínir geti fundið þig \n • Vistaðu mikilvæga staði í Eftirlæti \n • Hægt er að birta staðaheiti á ensku, tungumáli heimamanna eða með hljóðframburði \n • Birtir sérstakar kortaflísar af netinu, gervihnattasýn (frá Bing), mismunandi þekjur á borð við GPX-ferla fyrir leiðsögn/ferðamennsku og viðbótarlög með sérsníðanlegu gegnsæi Hjólreiðar \n • Þú finnur hjólastíga á kortinu \n • GPS-leiðsögn í hjólaham getur sett saman ferðina þína með því að nýta sér hjólastíga \n • Þú getur séð hraða þinn og hæð \n • Skráning GPX-ferla gerir þér kleift að skrá ferðina þína og að deila henni \n • Með forritsviðbót geturðu virkjað birtingu á hæðarlínum og skyggingu á landslagi - Ganga, fjallaferð, borgarferð -\n • Landakortið sýnir þér stíga fyrir göngu- og bakpokaferðir -\n • Efni af Wikipedia á tungumáli sem þú kýst helst getur sagt þér margt á meðan þú flakkar um borgir -\n • Biðstöðvar almenningssamgangna (strætó, sporvagnar, lestir) ásamt nöfnum leiða, hjálpa til við að rata í nýrri borg -\n • GPS-leiðsögn í gönguham getur sett saman ferðina þína með því að nýta sér göngustíga -\n • Þú getur sent inn og fylgt GPX-ferlum eða skráð og deilt þínum eigin -\n - OsmAnd+ (OSM Automated Navigation Directions) -\n -\n OsmAnd+ leiðsöguforritið er opinn og frjáls hugbúnaður með aðgang að fjölbreyttum alþjóðlegum gögnum frá OpenStreetMap(OSM). Hægt er að vista öll kortagögn (vektor eða flísar) á minniskort síma fyrir notkun án nettengingar. OsmAnd býður einnig upp á leiðargerð, annað hvort ónettengda eða með nettengingu, með möguleika á raddleiðsögn. -\n -\n OsmAnd+ er sú útgáfa forritsins sem þú borgar fyrir. Með því að kaupa hana, ertu að styðja við verkefnið, fjármagna þróun nýrra eiginleika, og færð í kaupbæti allar nýjustu uppfærslur. -\n -\n Nokkrir kjarnaeiginleikar: -\n - Fullkomin virkni án nettengingar (hægt að sækja og geyma vektorkort eða kortaflísar í tækinu) -\n - Þjöppuð ónettengd vektorkort tiltæk fyrir allan heiminn -\n - Hægt er að sækja ótakmörkuð lands- eða svæðiskort beint úr forritinu -\n - aðgangur að ónettengdum Wikipedia-merkisstöðum (sækja) -\n - Hægt að leggja nokkrar yfirlagsþekjur yfir kort, eins og GPX- eða leiðsagnarferla, merkisstaði, eftirlæti, hæðarlínur, biðstöðvar í almenningssamgöngum, viðbótarkort með sérsniðnu gegnsæi -\n -\n - Ónettengd leit að heimilisföngum og stöðum (POI) -\n - Ónettengd vegvísun á meðalvegalengdum -\n - Stillingar fyrir akandi, hjólandi og gangandi með: -\n - val um sjálfvirka skiptingu milli dag-/næturhams -\n - val um hraðaháða birtingu korta -\n - val um að stefna korta miðist við áttavita eða hreyfingarstefnu -\n - val um leiðbeiningar fyrir akreinaskipti, hraðatakmarkanir, upptökur eða TTS-talgervilsraddir -\n - Leiðsögn -\n • Virkar með nettengingu (hraðvirkt) eða án nettengingar (engin aukagjöld þegar þú ert erlendis) -\n • Raddleiðsögn beygju-fyrir-beygju (upptökur eða talgervill) -\n • Hægt að gefa ábendingar um akreinaskipti, birta götuheiti og áætlaðan komutíma -\n • Styður millipunkta á leiðinni þinni -\n • Sjálfvirkur endurútreikningur leiðar þegar farið er út af leið -\n • Leit að stöðum eftir heimilisfangi, eftir tegund (t.d.: veitingastaður, hótel, bensínstöð, safn), eða eftir landfræðilegum hnitum -\n + Ganga, fjallaferð, borgarferð \n • Landakortið sýnir þér stíga fyrir göngu- og bakpokaferðir \n • Efni af Wikipedia á tungumáli sem þú kýst helst getur sagt þér margt á meðan þú flakkar um borgir \n • Biðstöðvar almenningssamgangna (strætó, sporvagnar, lestir) ásamt nöfnum leiða, hjálpa til við að rata í nýrri borg \n • GPS-leiðsögn í gönguham getur sett saman ferðina þína með því að nýta sér göngustíga \n • Þú getur sent inn og fylgt GPX-ferlum eða skráð og deilt þínum eigin + OsmAnd+ (OSM Automated Navigation Directions) \n \n OsmAnd+ leiðsöguforritið er opinn og frjáls hugbúnaður með aðgang að fjölbreyttum alþjóðlegum gögnum frá OpenStreetMap(OSM). Hægt er að vista öll kortagögn (vektor eða flísar) á minniskort síma fyrir notkun án nettengingar. OsmAnd býður einnig upp á leiðargerð, annað hvort ónettengda eða með nettengingu, með möguleika á raddleiðsögn. \n \n OsmAnd+ er sú útgáfa forritsins sem þú borgar fyrir. Með því að kaupa hana, ertu að styðja við verkefnið, fjármagna þróun nýrra eiginleika, og færð í kaupbæti allar nýjustu uppfærslur. \n \n Nokkrir kjarnaeiginleikar: \n - Fullkomin virkni án nettengingar (hægt að sækja og geyma vektorkort eða kortaflísar í tækinu) \n - Þjöppuð ónettengd vektorkort tiltæk fyrir allan heiminn \n - Hægt er að sækja ótakmörkuð lands- eða svæðiskort beint úr forritinu \n - aðgangur að ónettengdum Wikipedia-merkisstöðum (sækja) \n - Hægt að leggja nokkrar yfirlagsþekjur yfir kort, eins og GPX- eða leiðsagnarferla, merkisstaði, eftirlæti, hæðarlínur, biðstöðvar í almenningssamgöngum, viðbótarkort með sérsniðnu gegnsæi \n \n - Ónettengd leit að heimilisföngum og stöðum (POI) \n - Ónettengd vegvísun á meðalvegalengdum \n - Stillingar fyrir akandi, hjólandi og gangandi með: \n - val um sjálfvirka skiptingu milli dag-/næturhams \n - val um hraðaháða birtingu korta \n - val um að stefna korta miðist við áttavita eða hreyfingarstefnu \n - val um leiðbeiningar fyrir akreinaskipti, hraðatakmarkanir, upptökur eða TTS-talgervilsraddir + Leiðsögn \n • Virkar með nettengingu (hraðvirkt) eða án nettengingar (engin aukagjöld þegar þú ert erlendis) \n • Raddleiðsögn beygju-fyrir-beygju (upptökur eða talgervill) \n • Hægt að gefa ábendingar um akreinaskipti, birta götuheiti og áætlaðan komutíma \n • Styður millipunkta á leiðinni þinni \n • Sjálfvirkur endurútreikningur leiðar þegar farið er út af leið \n • Leit að stöðum eftir heimilisfangi, eftir tegund (t.d.: veitingastaður, hótel, bensínstöð, safn), eða eftir landfræðilegum hnitum Settu inn skráarheitið. Villa í innflutningi landakorts Tókst að flytja inn landakort @@ -2982,27 +2914,7 @@ Veldu valkosti leiðsagnar fyrir sniðið Tilgreindu efri mörk á fjölda breytinga Fjöldi breytinga - • Forritasnið: útbúðu þín eigin snið fyrir þínar þarfir, með sérniðnum táknmyndum og litum -\n -\n • Nú er hægt að sérsníða í öllum sniðum jafnt sjálfgefinn hraða sem hámarks-/lágmarkshraða -\n -\n • Viðmótshluti með fyrirliggjandi hnitum -\n -\n • Bætt við valkosti til að birta áttavita og vegalengdarradíus á korti -\n -\n • Lagfærð ferilskráning í bakgrunni -\n -\n • Lagfært niðurhal korta í bakgrunni -\n -\n • Valkosturinn \'Kveikja á skjá\' kemur aftur inn -\n -\n • Lagfært val á tungumálum Wikipedia -\n -\n • Lagfærð hegðun áttavitahnapps við leiðsögn -\n -\n • Aðrir lagfærðir gallar -\n -\n + • Forritasnið: útbúðu þín eigin snið fyrir þínar þarfir, með sérniðnum táknmyndum og litum \n \n • Nú er hægt að sérsníða í öllum sniðum jafnt sjálfgefinn hraða sem hámarks-/lágmarkshraða \n \n • Viðmótshluti með fyrirliggjandi hnitum \n \n • Bætt við valkosti til að birta áttavita og vegalengdarradíus á korti \n \n • Lagfærð ferilskráning í bakgrunni \n \n • Lagfært niðurhal korta í bakgrunni \n \n • Valkosturinn \'Kveikja á skjá\' kemur aftur inn \n \n • Lagfært val á tungumálum Wikipedia \n \n • Lagfærð hegðun áttavitahnapps við leiðsögn \n \n • Aðrir lagfærðir gallar Vekja við beygjur Skilgreindu þann tíma sem kveikt er á skjánum. Nota nálægðarskynjara @@ -3166,23 +3078,7 @@ Velja frekar vegi með óbundnu slitlagi. Uppfæra öll kort Á að uppfæra öll (%1$d) kort\? - • Uppfærðar stillingar fyrir forrit og notkunarsnið: Stillingar eru núna flokkaðar eftir gerð þeirra. Hægt er að sérsníða hvert notkunarsnið sérstaklega. -\n -\n • Nýr niðurhalsgluggi fyrir landakort sem stingur upp á hvaða kort ætti að sækja -\n -\n • Lagfæringar á dökku þema -\n -\n • Löguð vandamál við leiðagerð víðsvegar um heiminn -\n -\n • Uppfært grunnkort með nákvæmara vegakerfi -\n -\n • Lagfærð flóðasvæði víðsvegar um heiminn -\n -\n • Skíðaleiðir: bætt við hæðarsniði og flækjustigi leiða í nákvæmari eiginleika leiðar -\n -\n • Auk ýmissa annarra lagfæringa -\n -\n + • Uppfærðar stillingar fyrir forrit og notkunarsnið: Stillingar eru núna flokkaðar eftir gerð þeirra. Hægt er að sérsníða hvert notkunarsnið sérstaklega. \n \n • Nýr niðurhalsgluggi fyrir landakort sem stingur upp á hvaða kort ætti að sækja \n \n • Lagfæringar á dökku þema \n \n • Löguð vandamál við leiðagerð víðsvegar um heiminn \n \n • Uppfært grunnkort með nákvæmara vegakerfi \n \n • Lagfærð flóðasvæði víðsvegar um heiminn \n \n • Skíðaleiðir: bætt við hæðarsniði og flækjustigi leiða í nákvæmari eiginleika leiðar \n \n • Auk ýmissa annarra lagfæringa Virkja þessa breytingu í öllum eða einungis völdu notkunarsniði. Sameiginlegt Velja vegi með óbundnu slitlagi @@ -4889,7 +4785,7 @@ BLE ANT Slökkt er á Bluetooth - Kveikja á Bluetooth til að finna og para skynjara. + Kveiktu á Bluetooth til að finna og para skynjara. Leita að skynjurum Ég veit ekki hvaða tegund skynjara ég er með Leita @@ -5657,13 +5553,61 @@ Snertiskjárinn er læstur. Ýttu á hnapp til að aflæsa. Bluetooth Upplýsingar farartækis - OsmAnd styður Bluetooth-tengingar við OBD-II skanna. + OsmAnd styður Bluetooth-tengingar við OBD-II skynjara. Hvernig skal tengjast: - 1. Tengdu skannann við OBD-II gátt farartækisins. + 1. Tengdu skynjarann við OBD-II gátt farartækisins. 2. Ræstu vél farartækisins - 4. Ýttu á \'Tengjast,\' og veldu skannann þinn úr listanum. + 4. Ýttu á \'Tengjast,\' og veldu skynjarann þinn úr listanum. Læra meira um skynjara. Snertiskjárinn er læstur. Til að aflæsa honum skaltu ýta á %1$s-hnappinn eða hnappinn á skjánum. Snertiskjárinn er ólæstur. Eldsneyti eftir (lítrar) + Leiðsögn leiðar + Athugaðu eftirfarandi:\n – Tryggðu að kveikt sé á Bluetooth\n – Vél farartækisins sé í gangi\n – Tryggðu að tækið þitt sé nógu nálægt skynjaranum. + Vélarhraði + Engir skynjarar fundust + Leita að skynjurum + Kveiktu á Bluetooth til að finna og tengja skynjara. + Haltu tækinu þínu nálægt skynjaranum. Gakktu úr skugga um að vélin sé í gangi. + Hraði farartækis + kPa + Eldsneyti eftir (%) + Eldsneyti eftir (l) + Eldsneyti eftir (km) + Eldsneytiseyðsla (obd) + Skynjari verður fjarlægður af listanum. Þú munt geta parað þennan skynjara aftur hvenær sem er. + Breytilegt + Tengt við %s + l/100km + Táknmynd breytist eftir stöðu aðgerðar. + Birtir þrýsting eldsneytis á farartæki frá OBD-skynjara + Birtir reiknað álag á vél byggt á skynjara + Hámark + l + %/klst + Eldsneytiseyðsla (l/klst) + Eldsneytiseyðsla (skynjari) + Birtir eldsneytiseyðslu farartækis út frá útreikningum (l/klst) + Magn eldsneytis (l) + Birtir eldsneytiseyðslu farartækis út frá skynjara (l/klst) + 1. Tengdu skynjarann í OBD-II gátt farartækisins.\n\n 2. Kveiktu á vél farartækisins\n\n 3. Virkjaðu Bluetooth á tækinu þínu\n\n 4. Ýttu á \'%1$s\' og veldu skynjarann þinn úr listanum. + Magn eldsneytis (%) + Eldsneytiseyðsla l/klst + Birtir eldsneytiseyðslu farartækis út frá útreikningum (%/klst) + Birtir eldsneytiseyðslu farartækis út frá útreikningum (l/km) + Birtir keyrslutíma vélar farartækis frá OBD-skynjara + Staða inngjafar + Þrýstingur eldsneytis + Birtir þrýsting eldsneytis á farartæki frá OBD-skynjara + Líkja eftir OBD-gögnum + Keyrslutími vélar + Reiknað álag á vél + Hitastig vélaolíu + Aftengt frá %s + Tengist við %s + Mistókst að setja af stað pörun við tækið + Eldsneytiseyðsla (l/km) + Eldsneytiseyðsla (%/klst + Gleyma skynjara + Birtir hitastig vélaolíu farartækis frá OBD-skynjara \ No newline at end of file diff --git a/OsmAnd/res/values-it/phrases.xml b/OsmAnd/res/values-it/phrases.xml index 9802fd506c5..07f1d7615e2 100644 --- a/OsmAnd/res/values-it/phrases.xml +++ b/OsmAnd/res/values-it/phrases.xml @@ -1381,7 +1381,7 @@ Sì;Senza spazzole Senza spazzola: no No;Autolavaggio: no - Terme + Terme libere Esterno Sì;Servizi igenici Accesso a servizi igienici: clienti diff --git a/OsmAnd/res/values-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml index 38fa4678101..d8275105502 100644 --- a/OsmAnd/res/values-iw/strings.xml +++ b/OsmAnd/res/values-iw/strings.xml @@ -5055,4 +5055,10 @@ פרטי כלי הרכב איך להתחבר: מרבי + לא ניתן להתחיל צימוד עם התקן + דינמי + מחובר אל %s + שינויי סמל לפי מצב פעולה. + מנותק מ־%s + התחברות אל %s \ No newline at end of file diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index 62b33715cb9..1b95f779420 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -5700,4 +5700,15 @@ Przełącznik do pokazywania lub ukrywania menu bocznego. Menu boczne Interfejs + Wskaźnik zużycia paliwa (l/km) + Dynamiczny + Połączono z %s + Rozłączono z %s + Łączę z %s + Nie można rozpocząć parowania z urządzeniem + Pokazuje zużycie paliwa pojazdu na podstawie obliczeń (%/h) + l/100km + Pokazuje zużycie paliwa pojazdu na podstawie obliczeń (l/km) + Symuluj dane obd + Ikona zmienia się w zależności od stanu akcji. \ No newline at end of file diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index 97772abbdd9..f3ded4bb77c 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -5983,4 +5983,5 @@ Configurações de métricas do veículo Mostra as RPM do tacômetro do veículo pelo sensor OBD A tela sensível ao toque está bloqueada. Para desbloquear, pressione o botão %1$s ou toque no botão na tela. + Dinâmico \ No newline at end of file diff --git a/OsmAnd/res/values-pt/phrases.xml b/OsmAnd/res/values-pt/phrases.xml index 9f8702c137c..c67585ab4ff 100644 --- a/OsmAnd/res/values-pt/phrases.xml +++ b/OsmAnd/res/values-pt/phrases.xml @@ -4878,4 +4878,6 @@ Parco não aceite Parkster Parkster não aceite + Túnel proibido para pedestres + Túnel proibido para ciclistas \ No newline at end of file diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index 4b725daba8c..cb873a874ca 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -5946,7 +5946,7 @@ t° всасываемого воздуха t° окружающего воздуха Напряжение батареи - Уровень топлива + Уровень топлива (%) Расход топлива Остаток топлива (расстояние) Тип топлива @@ -5981,7 +5981,7 @@ Переключатель для отображения или скрытия правок OSM на карте. Включение/отключение сенсорного экрана для предотвращения случайных нажатий л/ч - • Добавлен полноэкранный просмотр галереи изображений из Викимедиа\n\n• Добавлен новый плагин «Показатели ТС» для мониторинга производительности транспортного средства с использованием протокола OBD-II\n\n• Добавлена возможность назначать трекам вид активности и фильтровать их соответствующим образом\n\n• Реализованы новые быстрые действия для записи маршрута и блокировки сенсорного экрана\n\n• Введены настраиваемый внешний вид кнопок на карте и сетка для их привязки\n\n• Добавлено контекстное меню и действие «Сбросить среднюю скорость» для виджетов\n\n• Добавлен новый слой маршрута «Трассы для мотокросса»\n\n• Исправлена функция «Автозапись трека при навигации»\n\n• Исправлена проблема с перевернутыми координатами в RTL\n\n• Исправлено отсутствие данных датчиков для текущего записываемого трека\n\n• Добавлена информация об окружающих полигонах для выбранной точки\n\n• Добавлено быстрое действие для управления видимостью правок OSM\n\n• Разделены параметры видимости для опций окраски рельефа\n\n• Добавлен значок, который можно нажимать для отображения доступа или других атрибутов дороги или пути\n\n + • Добавлен полноэкранный просмотр галереи изображений из Викимедиа\n\n• Добавлен новый плагин «Показатели ТС» для мониторинга производительности транспортного средства с использованием протокола OBD-II\n\n• Добавлена возможность назначать трекам вид активности и фильтровать их соответствующим образом\n\n• Реализованы новые быстрые действия для записи маршрута и блокировки сенсорного экрана\n\n• Введены настраиваемый внешний вид кнопок на карте и сетка для их привязки\n\n• Добавлено контекстное меню и действие «Сбросить среднюю скорость» для виджетов\n\n• Добавлен новый слой маршрута «Трассы для мотокросса»\n\n• Исправлена функция «Автозапись трека при навигации»\n\n• Исправлена проблема с перевернутыми координатами в RTL\n\n• Исправлено отсутствие данных датчиков для текущего записываемого трека\n\n• Добавлена информация об окружающих полигонах для выбранной точки\n\n• Добавлено быстрое действие для управления видимостью правок OSM\n\n• Разделены параметры видимости для опций окраски рельефа\n\n• Добавлен значок, который можно нажимать для отображения доступа или других атрибутов дороги или пути Сенсорный экран разблокирован. Сенсорный экран заблокирован. Нажмите кнопку для разблокировки. Сенсорный экран заблокирован. Для разблокировки, нажмите кнопку "%1$s" или коснитесь кнопки на экране. @@ -6040,4 +6040,9 @@ t° моторного масла Список роликов Невозможно инициировать сопряжение с устройством + Динамический + Подключено к %s + Отключено от %s + Подключение к %s + Значок меняется в зависимости от состояния действия. \ No newline at end of file diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml index 1d43efde80e..128084b892a 100644 --- a/OsmAnd/res/values-sk/strings.xml +++ b/OsmAnd/res/values-sk/strings.xml @@ -5534,4 +5534,49 @@ Tlačidlo pre zobrazenie alebo skrytie lokálnych úprav OSM v mape. • Pridaný celoobrazovkový zobrazovač galérie pre obrázky Wikimedia\n\n • Pridaný nový modul \"Merania vozidla\" pre sledovanie výkonu vozidla pomocou protokolu OBD-II\n\n • Pridaná možnosť priradenia aktivít k stopám a filtrovania podľa nich\n\n • Pridaná rýchla akcia pre nahrávanie výletu a uzamknutie obrazovky\n\n • Pridaný modifikovateľný vzhľad tlačidla mapy a presná mriežka\n\n • Pridané kontextové menu a akcia \"Resetovať priemernú rýchlosť\" do nástrojov\n\n • Pridaná nová vrstva trás \"Trasy pre terénne bicykle\"\n\n • Opravené \"Automatické nahrávanie stopy počas navigácie\"\n\n • Opravený problém s vymenenými súradnicami v jazykoch čítaných sprava doľava\n\n • Opravené chýbajúce údaje zo senzorov pre práve nahrávanú stopu\n\n • Pridané informácie o okolitých oblastiach pre zvolený bod\n\n • Pridaná rýchla akcia pre ovládanie viditeľnosti Úprav OSM\n\n • Oddelené parametre pre viditeľnosť v možnostiach zafarbenia terénu\n\n • Pridaná stlačiteľná ikona pre zobrazenie povolení prístupu a iných vlastností ciest l/h + Poskytuje navádzanie po trase v reálnom čase, vrátane vzdialenosti k nasledovnej odbočke, názvu aktuálnej ulice a informácií o jazdných pruhoch. Nástroje sú aktívne počas navigácie. + Navádzanie po trase + Rýchlosť vozidla + Otáčky motora + l/100km + Spotreba paliva(l/h) + Spotreba paliva (snímač) + Zobrazuje rýchlosť spotreby paliva vozidla podľa výpočtov (l/h) + Zobrazuje rýchlosť spotreby paliva vozidla zo snímača OBD(l/h) + Úroveň paliva (l) + Ikona sa mení podľa stavu akcie. + Dynamický + Pripojené k %s + Odpojené od %s + Pripájam sa k %s + Nedá sa spustiť párovanie so zariadením + Zobrazuje rýchlosť spotreby paliva podľa výpočtov (%/h) + Čas behu motora + Tlak paliva + Zobrazuje tlak paliva vozidla zo snímača OBD + Vypočítané zaťaženie motora + Teplota motorového oleja + Úroveň paliva (%) + Spotreba paliva l/h + Spotreba paliva %/h + Zostatok paliva (vzdialenosť) + Typ paliva + Maximum + Simulovať OBD údaje + Spotreba paliva (l/km) + Zobrazuje rýchlosť spotreby paliva podľa výpočtov (l/km) + l + Efektivita paliva (%) + Spotreba paliva + Zobrazuje rýchlosť spotreby paliva podľa OBD + Zostatok paliva (litre) + kPa + Zobrazuje čas behu motora vozidla zo snímača OBD + %/h + Zobrazí teplotu motorového oleja zo snímača OBD + Zobrazí vypočítané zaťaženie motora zo snímača OBD + Zostatok paliva (%) + Zostatok paliva (l) + Zostatok paliva (km) + Spotreba paliva (OBD) \ No newline at end of file diff --git a/OsmAnd/res/values-sr/phrases.xml b/OsmAnd/res/values-sr/phrases.xml index ca93048d9d4..406a88644b0 100644 --- a/OsmAnd/res/values-sr/phrases.xml +++ b/OsmAnd/res/values-sr/phrases.xml @@ -4883,4 +4883,19 @@ Паркстер се не прима Тунел забрањен за бициклисте Тунел забрањен за пешаке + Тачке на путовањима + Планинарење + Спортови на води + Јахање коња + Зимски спортови + Моторне санке + Брдски бициклизам + Чланци о путовањима + Друге руте + Тачке других рута + Бицикл + Пешачење + Трчање + Стазе за трчање + Котураљке \ No newline at end of file diff --git a/OsmAnd/res/values-sr/strings.xml b/OsmAnd/res/values-sr/strings.xml index e83585f55bc..46927f2fd6c 100644 --- a/OsmAnd/res/values-sr/strings.xml +++ b/OsmAnd/res/values-sr/strings.xml @@ -5490,22 +5490,22 @@ Промени увећање карте. Отвара претрагу. Отвара навођење. - Средишти карту на Вашем тренутном положају. + Средишти карту на свом тренутном положају. Промени нагиб карте. Приказ стаза теренских мотоцикла Промени сликовне слојеве Отвара главног изборника. Промени начин приказа карте, слојеве или друге поставке. - Тип активности - Промени активност - Повећање - Смањење + Врста дејства + Промени дејство + Повећај + Смањи Отвори у прегледачу Извор - Нема интернет везе + Нема везе са Интернетом Проверите своју везу и покушајте поново. - Још увек није додата ниједна корисничка фотографија на ову локацију - Нема доступних фотографија + Још увек није додата ниједна корисничка фотографија на овај положај + Нема доступних слика Викимедиа V Није наведена врста горива @@ -5514,106 +5514,106 @@ КПГ Пропан Електрично - Двогоривно радно Бензин - Двогоривно радно Метанол - Двогоривно радно Етанол - Двогоривно радно ТНГ - Двогоривно радно КПГ - Двогоривно радно Електрично + Двогоривно покретано бензином + Двогоривно покретано метанолом + Двогоривно покретано етанолом + Двогоривно покретано ТНГ-ом + Двогоривно покретано КПГ-ом + Двогоривно покретано струјом Етанол Дизел ТНГ - Двогоривно радно Пропан - Хибридно Бензинско - Хибридно Етанол - Хибридно Дизел - Двогоривно радно Електрична и са УС машина - Хибридно Електрична и са УС машина - Хибридно Регенеративно - Хибридно Водоник - Хибридно Електрично + Двогоривно покретано пропаном + Хибридно бензинско + Хибридно етанолско + Хибридно дизелно + Двогоривно покретано струјом и машином на сагоревање + Хибридно струјно и унутрашње сагоревање + Хибридно повратно + Хибридно водоником + Хибридно струјно Водоник - Непознати тип горива + Непозната врста горива ДНВ Метрика возила % ОУМ оум - Приказује брзину возила преко ДНВ сензора - Приказује тахометарски ОУМ возила преко ДНВ сензора - Приказује температуру усисног ваздуха возила преко ДНВ сензора - Приказује температуру амбијенталног ваздуха преко ДНВ сензора - Приказује температуру расхладне течности мотора преко ДНВ сензора - Приказује ниво горива у возилу преко ДНВ сензора - Приказује врсту горива возила преко ДНВ сензора - Улазна температура - Амбијентална температура + Приказује брзину возила преко пријемника ДНВ + Приказује тахометарски ОУМ возила преко пријемника ДНВ + Приказује топлоту усисног ваздуха возила преко пријемника ДНВ + Приказује топлоту околине преко пријемника ДНВ + Приказује топлоту расхладне течности мотора преко пријемника ДНВ + Приказује ниво горива у возилу преко пријемника ДНВ + Приказује врсту горива возила преко пријемника ДНВ + Топлота усиса + Топлота околине Напон батерије - Температура расхладне течности - Ефикасност горива (%) + Топлота расхладне течности + Учинак горива (%) Стопа потрошње горива - Приказује стопу потрошње горива возила на основу ДНВ локације + Приказује стопу потрошње горива возила на основу положаја ДНВ Преостало гориво (растојање) - Тип горива + Врста горива Метрика возила ДНВ подршка - Пратите кључне метрике возила користећи ДНВ-ИИ протокол. Приступ подацима укључујући: * Брзина мотора * Потрошња горива * Преостало гориво * Раздаљина од покретања мотора * Усисна температура * Температура околине * Температура расхладне течности * Брзина возила * Проценат батерије - Двогоривно радно Водоник - Приказује напон батерије преко ДНВ сензора - Показује раздаљину коју возило може да пређе са преосталим горивом преко ОБД сензора + Пратите кључне метрике возила користећи ДНВ-ИИ протокол. Приступ подацима укључујући: * Брзина мотора * Потрошња горива * Преостало гориво * Раздаљина од покретања мотора * Топлота усиса * Топлота околине * Температура расхладне течности * Брзина возила * Проценат батерије + Двогоривно покретано водоником + Приказује напон батерије преко пријемника ДНВ + Показује раздаљину коју возило може да пређе са преосталим горивом преко пријемника ОБД Непознати уређај Подешавања метрике возила ИБВ ИБВ код преко ДНВ - Ресетуј просечну брзину + Поништи просечну брзину %1$s — %2$s - Почело је снимање новог сегмента путање. - Нови сегмент путовања - Дугме за покретање, паузирање или наставак снимања ГПКС стазе. - Покрени / Паузирај - Шеме боја - Путања не садржи податке за чување. - Дугме за чување ГПКС стазе и завршетак снимања путовања. + Почело је снимање новог дела путање. + Нови део путовања + Дугме за покретање, застанак или наставак снимања стазе ГПКС-а. + Покрени / застани + Образаци боја + Траг не садржи податке за чување. + Дугме за чување стазе ГПКС-а и завршетак снимања путовања. Прво започните снимање путовања. - Дугме за покретање новог сегмента у текућем ГПКС снимању стазе. - Дугме за чување тренутно снимљеног путовања као ГПКС фајла и наставак снимања нове стазе без прекида. + Дугме за покретање новог дела у текућем снимању стазе ГПКС-а. + Дугме за чување тренутно снимљеног путовања као датотеке ГПКС-а и наставак непрекидног снимања новог трага. Снимљено путовање и наставите - Листа филмова - Други линкови - Закључај екран - Омогућава или онемогућава функцију екрана осетљивог на додир да спречи случајне додире - Дугме за приказ или сакривање локалних ОСМ измена на мапи. + Списак филмова + Остале везе + Закључај заслон + Омогућава или онемогућава рад заслона осетљивог на додир ради спречавања случајних додира + Дугме за приказ или сакривање местних измена ОСМ-а на карти. Стазе теренских мотоцикла l/h - • Додан је прегледник галерије преко целог екрана за слике Викимедије\n\n • Уведен је нови додатак „Метрика возила“ за праћење перформанси возила користећи ДНВ-ИИ протокол\n\n • Додата могућност додељивања активности стазама и филтрирања у складу са тим\n\n • Имплементиране нове брзе акције за снимање путовања и закључавање екрана на додир\n\n • Уведен је прилагодљив изглед дугмета мапе и прецизна мрежа\n\n • Додат је контекстни мени и акција „Ресет просечне брзине“ у виџете\n\n • Додан је нови слој руте „Стазе теренских мотоцикла“\n\n • Исправљено „Аутоматско снимање стазе током навигације“\n\n • Решен проблем са преокренутим координатама у РТЛ-у\n\n • Исправљени пропуштени подаци сензора за тренутно снимљену стазу\n\n • Додате информације о околним подручјима за изабрану тачку\n\n • Додата брза акција за контролу видљивости ОСМ измена\n\n • Одвојени параметри видљивости за опције бојења терена\n\n • Додата икона која се може додирнути за приказ приступа или других атрибута пута или путање - Екран осетљив на додир је закључан. Да бисте откључали, притисните дугме %1$s или додирните дугме на екрану. - Екран осетљив на додир је откључан. - Екран осетљив на додир је закључан. Додирните дугме да бисте откључали. - 1. Повежите скенер са ДНВ-ИИ портом вашег возила. + • Додан је прегледник слика преко целог заслона за слике Викимедије\n\n • Уведен је нови додатак „Метрика возила“ за праћење учинка возила користећи ДНВ-ИИ протокол\n\n • Додата могућност додељивања дејстава стазама и одабира у складу са тим\n\n • Примењена су нова брза дејства за снимање путовања и закључавање заслона на додир\n\n • Уведен је прилагодљив изглед дугмета карте и тачна мрежа\n\n • Додат је приручни изборник и дејство „Поништавање просечне брзине“ у справице\n\n • Додан је нови слој путање „Стазе теренских мотоцикла“\n\n • Исправљено је „Самостално снимање стазе током навођења“\n\n • Решен је проблем са преокренутим координатама у РТЛ-у\n\n • Исправљено је пропуштање података пријемника за тренутно снимљени траг\n\n • Додати су подаци о околним подручјима за изабрану тачку\n\n • Додато је брзо дејство за управљање видљивости измена ОСМ-а\n\n • Одвојене су одреднице видљивости за могућности бојења терена\n\n • Додата је сличица која се може додирнути за приказ приступа или других својстава пута или путање + Заслон осетљив на додир је закључан. Ради откључавања притисните дугме %1$s или додирните дугме на заслону. + Заслон осетљив на додир је откључан. + Заслон осетљив на додир је закључан. Додирните дугме ради откључавања. + 1. Повежите пријемник са прикључком ДНВ-ИИ свог возила. Како повезати: - 4. Додирните „Повежи се“ и изаберите ваш скенер са листе. + 4. Додирните „Повежи се“ и изаберите свог пријемника са списка. Блутут - Инфо возила - ОсмАнд подржава Блутут везе са ДНВ-ИИ скенерима. - 2. Укључите мотор вашег возила - 3. Омогућите Блутут на вашем уређају - Сазнајте више о сензорима. + Подаци возила + ОсмАнд подржава Блутут везе са пријемницима ДНВ-ИИ. + 2. Укључите мотор свог возила + 3. Омогућите Блутут на свом уређају + Сазнајте више о пријемницима. Преостало гориво (литара) - Усмеравање руте + Усмеравање путањом Брзина возила Брзина мотора - Није пронађен ниједан скенер - Укључите Блутут проналажење и повезивање скенера. - Тражење скенера - Заборави скенер - Држите уређај близу скенера. Уверите се да мотор возила ради. - Пружа навођење руте у реалном времену, укључујући удаљеност до следећег скретања, назив пута, тренутни назив улице и информације о траци. Виџети су активни током навигације. - Молимо проверите следеће:\n – Уверите се да је Блутут укључен\n – Мотор возила ради\n – Уверите се да је ваш уређај у домету скенера. - Скенер ће бити уклоњен са листе. Моћи ћете поново да упарите овај скенер у било ком тренутку. - 1. Повежите скенер са ДНВ-ИИ портом вашег возила.\n\n 2. Укључите мотор вашег возила\n\n 3. Омогућите Блутут на свом уређају\n\n 4. Додирните „%1$s“ и изаберите свој скенер са листе. - Брзина потрошње горива (сензор) + Није пронађен ни један пријемник + Укључите Блутут проналажење и повезивање пријемника. + Тражење пријемника + Заборави пријемник + Држите уређај близу пријемника. Проверите да мотор возила ради. + Пружа тренутачно навођење путањом, укључујући удаљеност до следећег скретања, назив пута, тренутни назив улице и податке о траци. Справице се приказују током навођења. + Молимо проверите следеће:\n – Уверите се да је Блутут укључен\n – Мотор возила ради\n – Уверите се да је ваш уређај у домету пријемника мерача. + Пријемник ће бити уклоњен са списка. Моћи ћете поново да упарите овај пријемник у било ком тренутку. + 1. Повежите пријемник са прикључком ДНВ-ИИ свог возила.\n\n 2. Укључите мотор свог возила\n\n 3. Омогућите Блутут на свом уређају\n\n 4. Додирните „%1$s“ и изаберите свој пријемник са списка. + Брзина потрошње горива (пријемник) Приказује потрошњу горива возила на основу прорачуна (l/h) - Приказује потрошњу горива возила на основу сензора (l/h) + Приказује потрошњу горива возила на основу пријемника (l/h) Ниво горива (l) Ниво горива (%) Преостало гориво (%) @@ -5625,21 +5625,27 @@ Брзина потрошње горива (l/h) l %/h - Максимум + Највише Приказује потрошњу горива возила на основу прорачуна (l/km) Потрошња горива (l/km) - Симулирај днв податке + Опонашај податке днв Време рада мотора - Позиција гаса + Положај гаса kPa Притисак горива - Приказује притисак горива у возилу (манометарски притисак) добијен од днв скенера + Приказује притисак горива у возилу (манометарски притисак) добијен од пријемника днв Израчунато оптерећење мотора - Приказује израчунато оптерећење мотора возила на основу сензора - Температура моторног уља - Приказује температуру моторног уља возила добијену из днв скенера + Приказује израчунато оптерећење мотора возила на основу пријемника + Топлота моторног уља + Приказује топлоту моторног уља возила добијену од пријемника днв l/100km - Приказује време рада мотора возила добијено од днв скенера + Приказује време рада мотора возила добијено од примемника днв Приказује притисак горива у возилу (манометарски притисак) добијен од днв скенера Приказује потрошњу горива возила на основу прорачуна (%/h) + Нисам успео да се упарим са уређајем + Променљиво + Повезано са %s + Повезивање са %s + Промена сличице на основу стања радње. + Прекинута веза са %s \ No newline at end of file diff --git a/OsmAnd/res/values-vi/strings.xml b/OsmAnd/res/values-vi/strings.xml index e21c0eb1d0f..b61785426aa 100644 --- a/OsmAnd/res/values-vi/strings.xml +++ b/OsmAnd/res/values-vi/strings.xml @@ -54,9 +54,7 @@ Không cần Tải xuống bản đồ thế giới cơ sở để có cái nhìn tổng quan về toàn thế giới ở mức thu phóng thấp. Tải xuống dữ liệu (\'ngoại tuyến\') để sử dụng bản đồ ngoại tuyến. - " -\n -\nGiữ một lúc để mở chi tiết hơn" + \n\nGiữ lâu để hiện các tuỳ chọn Phiên bản cục bộ Đã hủy kích hoạt %1$d / %2$d mục. Đã xóa %1$d / %2$d mục. @@ -111,7 +109,7 @@ Chồng phủ bản đồ Chọn bản đồ cần chồng phủ Bản đồ đã được cài, \'Các thiết lập\' sẽ được cập nhật. - Chọn bản đồ cần cài đặt hoặc cập nhật. + Chọn các nguồn cho mảng bản đồ: Không thể thực hiện thao tác mà không có kết nối Internet. Cài đặt thêm… Tỉ lệ nhỏ nhất để hiển thị bản đồ vector thay cho bản đồ ảnh. @@ -793,4 +791,1227 @@ Hiện thông báo nổi về phím được nhấn Mở màn hình tìm kiếm Thay đổi hướng xoay bản đồ + Dữ liệu của tôi + Phong cách xử lý + Wikipedia và những bản đồ du lịch + Độ cao lớn nhất + Menu thông tin của đối tượng trên bản đồ + Định tuyến đường cho trượt tuyết + Ô thông tin về điều hướng + Tên quốc gia: A - Z + Tìm POI + Những bản đồ địa hình + RAM có + Lọc + Định tuyến đường cho xe gắn máy + Định tuyến đường cho tàu thuỷ + Về OsmAnd + Liên hệ với chúng tôi + Thư mục + Xoá bản đồ %1$s? + Giao diện bản đồ trượt tuyết + Tương tác với bản đồ + Những tệp được loại bỏ khỏi đám mây OsmAnd sẽ có ở đây trong %1$s ngày sau đó. + Thùng rác + Thư mục gốc + Tải lại các cung đường + Chưa được cài đặt + Hiện biểu tượng + Kích thước nhỏ trước + Tên quốc gia: Z - A + Về việc định tuyến đường của OsmAnd + Định tuyến đường thẳng (Máy bay) + Lên kế hoạch tuyến đường + Bản đồ và Dữ liệu + Ghi cung đường + Ô chứa thông tin + Thước bán kính và Thước + Tải và cài đặt phiên bản OsmAnd miễn phí + Tệp nhật ký chi tiết + Đặt câu hỏi, đề xuất tính năng + Tạo vấn đề trên GitHub + Bản đồ địa hình (3D) + %1$s có mặt như một phần của gói %2$s + Điều này sẽ loại bỏ thư mục thông minh \"%1$s\". (Không cung đường nào sẽ bị xoá.) + Thêm thư mục thông minh + Lưu thành thư mục thông minh + Cài đặt bộ lọc + Hiện nhiệt độ từ cảm biến + Những mảng bản đồ (Trực tuyến / Ngoại tuyến) + Những cung đường và những tuyến đường + Giao diện bản đồ OsmAnd + Tìm toạ độ + Định tuyến đường khi cưỡi ngựa + Chuẩn bị tuyến đường + Tìm tất cả + Nút bấm bản đồ + Chỉ bao gồm thông tin về sự cố + Báo cáo một vấn đề + Sao chép bản dựng + Tìm tất cả cung đường phù hợp + Menu thông tin của các cung đường + Những bản đồ Véc-tơ (Những giao diện bản đồ) + Ô thông tin điểm đánh dấu + Hiển thị bộ nhớ hiện có được phân bổ cho OsmAnd. + Nhiệt độ + Định tuyến đường cho Ô tô (Xe tải, Xe máy) + Định tuyến đường trực tiếp đến điểm (Tàu thuỷ) + Đã được tạo + Đặt lại tất cả + %s - %s + Ngày tạo + Làm trống tên + Chỉnh sửa bộ lọc + Thiết lập một tuyến đường + Được bao gồm + Thảo luận trên GitHub + Các cung đường phù hợp xuất hiện ở đây + Những bản đồ tiêu chuẩn + Bắt đầu với OsmAnd + Hướng dẫn sử dụng + Những phiên bản miễn phí + Lọc: %d + Thùng rác rỗng + Bộ nhớ đệm + Bản đồ %1$s đã cập nhật. + Hiện ít hơn + Định tuyến đường cho phương tiện công cộng + Thiết lập + Đang tải + %s - %s, %s + Lọc theo tên + Vận chuyển trẻ em + Thư mục Thông minh đã được lưu + Hồ sơ (Cài đặt) + Kích thước lớn trước + Nhập / Xuất + Nơi lưu trữ + Chi tiết tuyến đường + Những bước đầu tiên + Lời nhắc bằng giọng nói / Thông báo + Định tuyến đường cho xe đạp (xe đạp địa hình) + Điều hướng bởi cung đường + Điều hướng bởi các điểm đánh dấu + Được xem nhiều nhất + Thời tiết trực tuyến + Bản đồ & Tài Nguyên + Các thư mục thông minh cho phép việc nhóm các cung đường bằng các bộ lọc đã được áp dụng + Không có cung đường phù hợp + Loại bỏ các thay đổi của bộ lọc + Thư mục thông minh như vậy đã tồn tại + Xoá bản đồ + Những điểm trên bản đồ + Android Auto + CarPlay + Hướng dẫn điều hướng + Màn hình bản đồ trong khi điều hướng + Những tham số của tuyến đường + Định tuyến đường cho Tàu hoả + Nhật ký sự cố + Chung + Ô thông tin bản đồ + Menu chính + Tên cảm biến + Chu vi bánh xe + Tất cả thư mục + Đặt lại tất cả các bộ lọc? + Định tuyến đường trực tuyến + Định tuyến đường cho người đi bộ + Xoá tất cả lối tắt phím + Tối ưu hoá pin của Android có thể gây ra sự ngắt quãng và sai lệch khi ghi các cung đường.\n\nNếu bạn gặp phải vấn đề như vậy, bạn có thể thay đổi việc dùng pin thành \'Không giới hạn.\' + Cài đặt tối ưu hoá pin + Cho phép đi vào khu vực riêng tư (xe tải) + Tất cả màu sắc + A* 2-phase + Mượt + Bình minh + Xăng + Đi-ê-den + Điện + Chỉ rõ khoảng thời gian tính vận tốc trung bình. + Chọn danh mục phù hợp. + Nút như vậy đã có sẵn + Các nút được tuỳ biến + Chế độ + Mở trong trình duyệt + Chưa có ảnh nào của người dùng được thêm vào địa điểm này + Hiện không có ảnh nào + Giảm xuống + Mở menu chính. + Biểu tượng hành động + Riêng biệt + Kiểu chỉ đường + Hiện thời gian của bình minh tiếp theo hoặc thời gian còn lại cho đến bình mình. + Hiện thời gian của hoàng hôn tiếp theo hoặc thời gian còn lại cho đến hoàng hôn. + Hoàng hôn + inch + kn + Dặm trên giờ + Hành động này không được hỗ trợ bởi phong cách bản đồ đã chọn. + Hiện các ký hiệu trên bản đồ + Ô thông tin hiện khoảng cách đến điểm trung gian đầu tiên. Khi đã đi qua các điểm trung gian, khoảng cách sẽ được cập nhật tới điểm trung gian kế tiếp. + Cập nhật tiếp theo lúc %1$s. + Những bản cập nhật cho bản đồ được kiểm tra hàng giờ. + Những bản cập nhật cho bản đồ được kiểm tra hàng ngày. + Cân nhắc những trạm dừng + Danh mục vật liệu nguy hại / Xem xét quyền truy cập các vật liệu nguy hại + Cung cấp truy cập nhanh để bắt đầu/dừng việc tạo một ghi chú bằng âm thanh, video hoặc ảnh. + Wikimedia + Nguồn + Chọn một hành động và gán một phím bằng cách nhấn nút \"Thêm\". + Thêm hành động + Những bản đồ màu sắc của độ cao được dùng để thể hiện địa hình một cách trực quan. + Giấy phép + %1$s (%2$s) + Phiên bản 2 (OpenGL) là công cụ kết xuất bản đồ nhanh hơn, cũng bao gồm việc xem 2.5D. Kết xuất Phiên bản 1 là mặc định trước OsmAnd 4.3, và vẫn được ưu tiên cho những thiết bị cũ hơn. + Luôn hiện + Tránh khúc sông cạn + Thay đổi phong cách bản đồ, các lớp, và các cài đặt khác. + Chọn loại nhiên liệu cho động cơ của bạn, điều này cần thiết để ước tính sự phát thải CO2. + Danh mục vật liệu nguy hại + Vô hiệu các lớp bản đồ + Khoảng cách trong khi điều hướng + Khởi động lại ngay + Tác giả + Thời gian ngắn nhất trước + Knot + Một ô thông tin trùng lặp đang được thêm vào danh sách. + Ô thông tin hiện lối rẽ tiếp theo cùng với hướng di chuyển và khoảng cách đến nó. + Xem xét quyền được đi vào cho các phương tiện chở hàng hạng nhẹ + Sử dụng hồ sơ Xe tải cho các phương tiện nặng hơn 3,5 tấn. + Thời gian đến điểm đến + Tăng lên + Thay đổi các lớp phủ bản đồ + Thay đổi các lớp đường đồng mức + Mở Tìm kiếm. + Đặt trung tâm bản đồ theo vị trí hiện tại của bạn. + Không có phím nào được gán + Vô hiệu tất cả các lớp bản đồ nằm trên bản đồ chính (yêu cầu khởi động lại). + Những phím đã được gán + Cho phép hiện trên cùng + Hiện thông tin gỡ lỗi + Chính xác + Làm tròn + Phần mở rộng + Giá trị đã chọn + Bình minh tiếp theo + Nhiệt độ + Áp suất không khí + Phiên bản 1 + Phiên bản 2 (OpenGL) + Hiện giới hạn của các bản đồ đã tải + Văn bản, biển báo và những thứ khác. + Dùng các tính năng trả tiền trên các nền tảng khác nhau (Android/iOS/web) mà không tốn thêm chi phí nào. + Rẽ phải và hướng về bên trái + Rẽ phải và hướng về bên phải + Đi theo lối ra số %1$d và hướng về bên phải + Hiện khoảng cách của chuyến đi đang được ghi. + Bạn có thể cài đặt ô thông tin để hiện khoảng cách hoặc thời gian dự kiến đến điểm đánh dấu thứ nhất. + Ô thông tin hiện khoảng cách còn lại cho tới điểm đến cuối cùng. + Ô thông tin hiện thông tin về lối rẽ thứ hai nếu đến gần. + Hiện lên khi bản đồ được xoay + Sự phát thải CO2 + Khí nén thiên nhiên + Lai + Việc vận chuyển các chất nguy hại + Vận tốc trung bình + Tránh đường cao tốc + Tránh đường cao tốc + Tránh khúc sông cạn + Tránh đường chỉ thích hợp cho xe 4WD + Hiện số lượng vệ tinh hiện có và được sử dụng. + Lớp + OsmAnd đã quay lại kết xuất bản đồ \'Phiên bản 1\'. Bạn có thể chọn công cụ kết xuất \'Phiên bản 2 (OpenGL)\' mới hơn trong phần cài đặt.\n\nVui lòng hỗ trợ sự cải thiện bằng cách cung cấp nhật ký lỗi. + Tất cả thay đổi sẽ bị loại bỏ. + Đồng hồ chỉ tốc độ + Hiện vận tốc trung bình của chuyến đi hiện tại. + Thời gian đến điểm trung gian + Cho phép xe tải đi vào những khu vực riêng tư. + Lớp nhiệt độ + Lớp áp suất + Ô thông tin. + Việc sao chép chỉ hoàn thành được %1$s %. Nếu bạn dừng bây giờ, ứng dụng có thể không hoạt động bình thường. + Gió + dặm/giờ + Việc kết xuất bản đồ của OsmAnd đã hỏng gần đây. + Không có kết nối mạng + Vui lòng kiểm tra kết nối của bạn và thử lại. + Thay đổi mức thu phóng bản đồ. + Mở Điều hướng. + Tất cả sự gán phím cho loại đã chọn sẽ bị xoá. + Phím + Ré trái và hướng về bên trái + Rẽ trái và hướng về bên phải + Hiện tốc độ tối đa cho con đường hiện đang đi. + Hiện tốc độ hiện tại của bạn được lấy từ GPS. + Hiện tổng những lần đi xuống của chuyến đi đang được ghi. + Khoảng cách đến điểm trung gian + Thông báo việc tính toán lại tuyến đường + Đặt lại tất cả cài đặt về mặc định? + Khí hoá lỏng + Một nút để bắt đầu một đoạn mới trong bản ghi cung đường GPX hiện tại. + Chuyến đi đã được ghi và tiếp tục + SPM (bước/phút) + Chạm vào ô thông tin sẽ cho phép bạn ghi một video. + độ F + Quay đầu và hướng về bên phải + Đi theo lối ra số %1$d và hướng về bên trái + Đã được cập nhật: %1$s. + Chỉ áp dụng cho các xe tải giao hàng không quá 3,5 tấn. + Widget + A* classic + Tự động thu phóng + Khi bị vượt quá + Không hỏi lại + Công cụ kết xuất bản đồ + Trùng lặp + Chạm vào ô thông tin sẽ cho phép bạn chụp một tấm ảnh. + Hiện tổng những lần đi lên của chuyến đi đang được ghi. + Bao gồm những thay đổi OSM đã tạo cho đến %1$s. + Những bản cập nhật cho bản đồ được kiểm tra hàng tuần. + Ẩn các khu vực quân sự + Widget ở thanh trên cùng hiển thị khoảng cách và hướng đi đến điểm đánh dấu tiếp theo trên bản đồ tính từ vị trí hiện tại của bạn. Widget có thể được điều chỉnh để hiện 1 hoặc 2 điểm đánh dấu. + Những ô này hiện thông tin về bình minh và hoàng hôn tiếp theo. + Bình minh, hoàng hôn + Mi-li-mét + Ô thông tin hiện \"Thời gian đến\" hoặc \"Thời gian di chuyển\" đến điểm đến cuối cùng. Thời gian được cập nhật liên tục trong khi điều hướng và nó bằng với thời gian tính từ vị trí hiện tại. + Sự gán phím cho hành động đã chọn sẽ bị xoá. + Cập nhật tiếp theo vào %1$s lúc %2$s. + Sự gán phím mới + Phím \"%1$s\" + Thêm phím + Cho phép văn bản của bản đồ hiện chồng lên nhau + Các nút mặc định + Gửi mã định danh người dùng độc nhất (UUID) + Mã định danh + Tránh đường chỉ thích hợp cho xe 4WD + km/h + Điều khoản sử dụng + Cung cấp chỉ dẫn đường đi theo thời gian thực, bao gồm khoảng cách đến lối rẽ tiếp theo, tên đường, tên phố hiện tại và thông tin về làn đường. Ô thông tin hoạt động trong khi điều hướng. + Chỉ dẫn đường đi + Tốc độ của phương tiện + Đơn vị đo + Đơn vị đo có thể đổi trong phần cài đặt Thời tiết. + Quay đầu và hướng về bên trái + Những phương tiện giao hàng có thể bị giới hạn trên một số con đường. + Nhiên liệu được sử dụng bởi động cơ + Nhập như một cung đường + Dùng tên la tinh nếu thiếu + Tải xuống hoàn tất + Giao hàng + Thời gian đến dự kiến + Loại bỏ các thay đổi? + Bấm vào widget để đổi các chế độ. + Điểm đánh dấu thứ hai + Thời gian đến đích đến. + Cho phép hoặc không cho phép màn hình cảm ứng hoạt động để tránh việc chạm nhầm + Chạm hai lần vào nút la bàn để đổi hướng xoay của bản đồ. + Ô thông tin hiện \"Thời gian đến\" hoặc \"Thời gian di chuyển\" đến điểm trung gian đầu tiên. Thời gian được cập nhật liên tục trong khi điều hướng, khi đi qua các điểm trung gian, thời gian sẽ được cập nhất tới điểm trung gian kế tiếp. + Thời gian còn lại + Bằng việc tải bản đồ xuống, bạn đồng ý với %1$s và %2$s. + Thông báo việc mất và phục hồi tín hiệu GPS + Chạm vào ô thông tin sẽ cho phép bạn tạo một ghi chú âm thanh. + Xe gắn máy + Nhập/xuất + Xuất ra tệp + Lớp gió + Đổi chế độ bằng cách chạm vào ô thông tin. + Hoàng hôn tiếp theo + Ki-lô-mét trên giờ + độ C + Chia sẻ nhật ký lỗi + Hết hạn + Luôn ẩn + Hiện tốc độ hiện tại của bạn dựa trên tín hiệu GPS + Thêm nút + Thời tiết + kg + Widget Tên đường hiện tên đường hiện tại cùng với mũi tên chỉ đi thẳng, hoặc tên đường kế tiếp cùng với mũi tên chỉ hướng rẽ tiếp theo. + Một nút để lưu cung đường GPX và hoàn thành việc ghi lại chuyến đi. + Màn hình khoá + Cung đường không chứa dữ liệu để lưu. + Vui lòng bắt đầu việc ghi chuyến đi trước. + Đã bắt đầu ghi một đoạn cung đường mới. + Một nút để lưu chuyến đi đã được ghi dưới dạng tệp GPX và bắt đầu ghi một cung đường mới mà không bị gián đoạn. + Đoạn chuyến đi mới + Một nút để bắt đầu, dừng hoặc tiếp tục việc ghi cung đường GPX. + Bắt đầu / Tạm dừng + Thay đổi độ nghiêng của bản đồ. + Cảnh báo giới hạn tốc độ + Giới hạn + Tối ưu hoá pin + Đường dẫn + Bản quyền + Tất cả cung đường + Thời gian dài nhất trước + Lớp khả năng mưa + Khám phá dự báo thời tiết. + mm + m/s + Mét/giây + Bản lưu các điểm yêu thích + A (Không có hạn chế) + Hiện thời gian hiện tại được lấy từ thiết bị của bạn. + Hiện mức pin của thiết bị của bạn. + Bạn có thể cài đặt ô thông tin để hiện khoảng cách hoặc thời gian dự kiến đến điểm đánh dấu thứ hai. + Ẩn các khu vực quân sự + Tốc độ dưới %1$s sẽ được tính và ảnh hưởng đến tốc độ trung bình. + Thời gian tính bằng phút hoặc giờ để đến điểm đến của bạn. + Mây + Khả năng mưa + Hiện thời gian của chuyến đi đang được ghi. + Được ẩn khi nhìn về hướng Bắc + Tối ưu hoá pin của Android có thể gây ra sự ngắt quãng và sai lệch khi ghi các cung đường. + Điểm đánh dấu đầu tiên + Chỉ rõ khoảng thời gian để tính tốc độ trung bình (được dùng để ước tính thời gian đến nơi). + Những con đường và đường hầm có thể hạn chế việc vận chuyển chất nguy hại. + Hiện bố cục làn đường hiện tại và làm nổi bật làn cần đi trong khi dẫn đường. + Lớp mây + lít/h + Hiện hướng Bắc. + Nét cung đường + Việc xoá hoàn tất + Tất cả các nhóm + Không tìm thấy máy quét nào + Vui lòng kiểm tra những thứ sau:\n – Đảm bảo rằng Bluetooth được bật\n – Động cơ của xe đang chạy\n – Đảm bảo rằng thiết bị của bạn nằm trong vùng của máy quét. + Máy quét sẽ bị loại bỏ khởi danh sách. Bạn có thể ghép nối lại với máy quét này bất kỳ lúc nào. + Bluetooth + 3. Bật Bluetooth trên thiết bị của bạn + Màn hình cảm ứng được mở khoá. + Màn hình cảm ứng bị khoá. Để mở khoá, nhấn nút %1$s, hoặc chạm vào nút trên màn hình. + Hỗ trợ OBD + dp + Được làm trực quan bởi + Khám phá cung đường dưới dạng 3D đầy tính tương tác! Trực quan hoá chiều cao, tốc độ, và nhiều hơn nữa trực tiếp trong bản đồ. + Thay đổi diện mạo mặc đình của %1$s? + Chỉ rõ địa chỉ trang web với ký hiệu tham số: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}, eta={7}, etfa={8}, eda={9}, edfa={10}. + Tuyến đường ven núi (Đường leo núi) + Widget về điều hướng được bật trong khi dẫn đường để hiển thị thông tin như khoảng cách, thời gian đến hoặc thời gian còn lại, những lối rẽ tiếp theo, hướng đi, tên phố hiện tại/tiếp theo, làn đường, tốc độ tối đa, khi tiếp cận những cảnh báo, POIs, điểm trên bản đồ. + Thêm một hoặc nhiều widget từ danh sách những widget hiện có. + Bất kỳ thứ gì được kết nối + CAI + Xoá tài khoản? + Sự khác biệt lớn giữa những mức thu phóng khác nhau có thể làm tăng kích thước của dữ liệu được tải xuống. + Hiện lối đi cho xe đạp địa hình + Diesel + LPG + Methanol nhiên liệu kép + Xăng Lai + Ethanol Lai + Diesel Lai + Điện Lai + Điện và động cơ đốt trong Lai + Hydrogen nhiên liệu kép + % + RPM + rpm + Hiện nhiệt độ gió vào xe qua cảm biến OBD + Hiện nhiệt độ không khí xung quanh qua cảm biến OBD + Hiện nhiệt độ chất làm mát động cơ qua cảm biến OBD + Hiện quãng đường xe đi được với mức nhiên liệu còn lại qua cảm biến OBD + Nhiệt độ chất làm mát + Phép đo phương tiện + Sự tính gần đúng GPX + Loại bỏ loại \"%1$s\"? + Tỷ lệ lượn trung bình + Tỷ lệ lượn + Sau đây tất cả dữ liệu và tài khoản của bạn sẽ bị xoá khỏi OsmAnd Cloud.\n\nTất cả dữ liệu trong thiết bị vẫn nguyên vẹn. + Hành động này không thể hoàn tác. + Tài khoản của bạn và tất cả thông tin chi tiết về tài khoản sẽ bị %1$s + Những thiết bị thứ hai sẽ bị đăng xuất khỏi OsmAnd Cloud và mất quyền truy cập đến các tính năng trả phí. + Đường đồng mức địa thế, độ đổ bóng đồi núi theo thang đo xám và sự xác định độ dốc theo thang đo màu, để hiện đỉnh và vùng đất thấp. + Bật để xem những tuyến đường giao thông công cộng trên bản đồ. + Những tuyến một đường ray + Những widget nhìn thấy được + Những tuyến xe buýt + Những tuyến con thoi + Tấm ở trên cùng + Sự mô phỏng giống với thực tế + Tất cả + Bản đồ: + Đã kiểm tra + Dù lượn + Những tệp với những giới hạn tuyến đường + Sao chép đến + Vị trí ga + l + Loại hoạt động + Ethanol + Đường đi được tô màu theo độ cao. + Widget %1$s chỉ có thể được đặt ở hàng riêng của nó. + Con số khoảng cách chính xác + Bất kỳ thứ gì được kết nối: %s + Chỉ rõ khoảng thời gian cho việc tính trung bình lượn. + Tham gia vào một trong những nhóm chat Telegram địa phương của chúng tôi. + SAC + Kiểu phân loại độ khó cho tuyến đường. + Khí đốt + Chất rắn dễ cháy + Lưu độ lệch tới mỗi điểm cung đường trong khi ghi + Câu lạc bộ An-pơ I-ta-li-a + Tất cả dữ liệu từ OsmAnd Cloud sẽ bị %1$s. Dữ liệu trong thiết bị vẫn nguyên vẹn. + Widget về điều hướng được bật trong khi dẫn đường để hiển thị thông tin như khoảng cách, thời gian đến hoặc thời gian còn lại, những lối rẽ tiếp theo, hướng đi, tên phố hiện tại, làn đường, tốc độ tối đa, khi tiếp cận những cảnh báo, POIs, điểm trên bản đồ. + Kích thước tải xuống dự kiến + Số lượng các mảng + Những tuỳ chọn điểm đánh dấu bản đồ + Chọn các chế độ ứng dụng + OsmAnd sẽ áp dụng những thay đổi đến cung đường mà không cập nhật tệp. Bạn có thể lưu những thay đổi một cách thủ công. + Bộ nhớ + Ca-na-đa + Lối đi cho xe đạp địa hình + Dựa trên chỉ đường (C++) + Tấm ở dưới cùng + Đồ vật + Những nút bấm + Mức tiêu thụ nhiên liệu (cảm biến) + Hiện tỷ lệ lượn trung bình cho khoảng thời gian đã đặt. + Danh sách các nhóm + Từ: + Chế độ hiển thị đất công cộng + Độ dốc đi xuống + Sự làm quá mức theo chiều dọc + Những thay đổi + Không thay đổi + Tỉ lệ bản đồ + Ẩn ranh giới đất công cộng nhưng để lại các khu vực + Độ cao mục tiêu + Hiện tỷ lệ lượn cần để tới điểm đích. + Mua trên Android + Không có gì để xuất, thư mục rỗng + Qua: + Quảng cáo Hugerock cho %1$s tháng + Những bản đồ cần thiết + Bằng kiểu truy cập + Quản lí sự đăng ký. + Sự mô phỏng sẽ được thực hiện với vận tốc cố định như đã chọn. + Dừng và thoát + Không được dùng + không có + Biểu tượng thay đổi dựa trên tình trạng của hành động. + Động + Hiện áp suất nhiên liệu của phương tiện (áp suất đo) được lấy từ máy quét obd + Nhiệt đồ dầu động cơ + Hiện nhiệt độ dầu động cơ của phương tiện được lấy từ máy quét obd + %/h + Mức tiêu thụ nhiên liệu (l/h) + Mức nhiên liệu (l) + Mức nhiên liệu (%) + Tốc độ động cơ + Bật Bluetooth để tìm và kết nối với máy quét. + Vui lòng giữ thiết bị của bạn gần máy quét. Đảm bảo rằng động cơ xe đang hoạt động. + 1. Kết nối máy quét tới cổng OBD-II trên xe của bạn.\n\n 2. Bật động cơ xe\n\n 3. Bật Bluetooth trên thiết bị của bạn\n\n 4. Chạm vào \'%1$s\' và chọn máy quét của bạn từ danh sách. + 4. Chạm vào \'Kết nối\' và chọn máy quét của bạn từ danh sách. + Tìm hiểu thêm về các cảm biến. + Màn hình cảm ứng bị khoá. Chạm vào nút để mở khoá. + V + CNG + Propane + CNG nhiên liệu kép + Tái tạo Lai + Không rõ loại nhiên loại + Hiện vận tốc của xe qua cảm biến OBD + Hiện tốc độ quay RPM qua cảm biển OBD + Hiển thị thông tin đồ hoạ về vị trí của mỗi văn bản của bản đồ + Độ dốc đi lên + Đỉnh + Bản đồ còn thiếu hoặc đã cũ + Đường đi được tô màu dựa theo tốc độ di chuyển. + Thang đo + Mỗi cung đường sẽ dữ lại những tham số riêng của chúng. + Tải lên những phiên bản địa phương + Dựa trên chỉ đường (Java) + Sắp xếp thư mục con + Thêm vào + Widget hiện tỷ lệ lượn tới mục tiêu hoặc tỷ lệ lượn trung bình cho chuyến đi hiện tại. + Thanh điểm đánh dấu bản đồ + Tải xuống không hoàn thành. Nếu bạn làm gián đoạn việc tải xuống thì chỉ xem được một phần của các mảng. + Tự động ghi lại cung đường trong khi điều hướng và sau đó tự động lưu. + Vui lòng chọn ít nhất một thứ + Nhấn \"%1$s\".\nTrình quản lý tệp mở nơi cần tìm và mở thư mục osmand. + Cần cấp quyền để truy cập đến thư mục đã chọn. + Cách kết nối: + 1. Kết nối máy quét tới cổng OBD-II trên xe của bạn. + 2. Bật động cơ xe + Thông tin xe + OsmAnd hỗ trợ kết nối Bluetooth tới những máy quét OBD-II. + Tránh đá cuội + Đỉnh và đáy + Cung đường 3D + Dựa trên hình học (Java, nhanh) + Ẩn ranh giới đất công cộng + Dựa trên hình học (C++, nhanh) + Những tuyến đường ray hạng nhẹ + Bỏ + Phân bổ nhiều bộ nhớ hơn sẽ tăng tốc việc tính toán những tuyến đường dài (trên 500 km), nhưng có thể ảnh hưởng đến hoạt động của những ứng dụng khác.\nKhông có tác động đến tốc độ tính toán những tuyến đường ngắn. + Bộ nhớ được phân bổ cho việc chỉ đường + Bỏ qua việc di chuyển? OsmAnd không còn quyền truy cập đến những tệp của bạn ở bộ nhớ dùng chung.\n\nỨng dụng sẽ bắt đầu sử dụng thư mục dữ liệu mới của bạn. + Đã sao chép + Thoát? + Hiện + Nhập toạ độ + Chất nổ + Chất ô-xi hoá và ô-xi già hữu cơ + Chất ăn mòn + Áp dụng các thay đổi với những cung đường hiện có trong thư mục hoặc chỉ những cái mới? + Đã kết nối tới %s + Đã ngắt kết nối từ %s + Đang kết nối tới %s + Hiện mức tiêu thụ nhiên liệu dựa trên tính toán (l/h) + Hiện mức tiêu thụ nhiên liệu dựa trên cảm biến (l/h) + Đang tìm máy quét + Quên máy quét + Thay đổi hoạt động + Propane nhiên liệu kép + Hiện loại nhiên liệu của xe qua cảm biến OBD + Theo dõi các phép đo phương tiện chính bằng giao thức OBD-II. Truy cập dữ liệu bao gồm: * Tốc độ động cơ * Tiêu thụ nhiên liệu * Nhiên liệu còn lại * Khoảng cách từ khi bật động cơ * Nhiệt độ vào * Nhiệt độ xung quanh * Nhiệt độ chất làm mát * Vận tốc xe * Mức pin + Xăng nhiên liệu kép + Điện + Ethanol nhiên liệu kép + Độ cao cố định + Đáy + OsmAnd có thể lấy được dữ liệu độ cao từ những đường ở gần hoặc các bản đồ địa thế. + Các bản đồ cũng sẽ được dùng: %1$s + Tải xuống những phiên bản đám mây + Bằng kiểu truy cập hoặc tên quản lý + Diều bay không động cơ + Loại + Mua trên iOS + Điểm độ khó của lối đi bộ đường dài + Ẩn tất cả + Khoảng cách đến điểm đến + Chất phóng xạ + Dùng kết xuất sqlitedb cho đổ bóng đồi núi / độ dốc + Chất độc và lây nhiễm + Xăng + Hydrogen + Hiệu suất nhiên liệu (%) + Nhiệt độ xung quanh + Nhiên liệu còn lại (khoảng cách) + Điện áp pin + Zoom không hoạt ảnh + Hiện giới hạn thu phí trên đường + chưa kiểm tra + Đang lấy danh sách các bản đồ cần thiết… + Hiện giới hạn thu phí + Chúng tôi cần xác minh tài khoản của bạn trước khi xoá nó.\n\nVui lòng điền địa chỉ email bạn đã đăng ký. Một mật khẩu dùng một lần cho bước tiếp theo sẽ được gửi đến nó. + Cung đường sẽ được gắn với những con đường bằng các bản đồ ngoại tuyến, hình dạng của cung đường sẽ bị thay đổi. + Những tuyến tàu hoả + Những tuyến đường sắt leo núi + Loại hồ sơ ứng dụng + Nhập các cung đường + Methanol + Chọn cách thông tin về khoảng cách hiển thị trong widget điều hướng (khoảng cách đến điểm, lối rẽ tiếp theo, các làn đường).\n\nChọn \"%1$s\" để hiện số chính xác, hoặc \"%2$s\" để dễ đọc hơn. + Vui lòng đặt tên cho nhóm. + Một nút để bắt đầu một tuyến đường từ giữa màn hình. + Bạn có thể dùng công cụ \"%1$s\" để thêm tuyến đường vào tệp. + OpenStreetMap + Thoát mà không lưu những thay đổi? + %1$d tệp (%2$s) đã tồn tại ở mục tiêu \'%3$s\' và không bị ghi đè. + Thêm vào nhóm + độ chính xác + Vận tốc không đổi + Chế độ tốc độ + Định rõ/Chỉnh sửa… + Cho phép Cố định hướng Bắc ở trên + Nhóm chat Telegram + URL + Khác + Phiên bản: + Xoá nút + Hoàn thành %1$s + Độ nhạt + Văn bản của bản đồ + Dùng các bản đồ địa thế cho dữ liệu độ cao. Dạng hình học của cung đường không đổi. + Dùng các bản đồ địa thế + Hoạt động + Từ khoá + Chất lỏng dễ cháy + Trên những đoạn đường thẳng, vận tốc sẽ giống với vận tốc tối đa cho phép.\nỞ nơi giao nhau, sự mô phỏng sẽ chậm lại.\nNhững sự giảm tốc sẽ xảy ra khi có tín hiệu giao thông, biển bắt buộc dừng v.v. + Những cung đường tập luyện thể chất + Hiện những cung đường tập luyện thể chất + hoàn thành + Danh mục + Khác + kPa + Áp suất nhiên liệu + Hiện áp suất nhiên liệu của phương tiện (áp suất đo) được lấy từ máy quét obd + Đã tính toán tải động cơ + Hiện tải động cơ đã tính toán của phương tiện dựa trên cảm biến + Nhiên liệu còn lại (%) + Nhiên liệu còn lại (l) + Nhiên liệu còn lại (km) + Mức tiêu thụ nhiên liệu (obd) + Mức tiêu thụ nhiên liệu l/h + Mức tiêu thụ nhiên liệu %/h + LPG nhiên liệu kép + OBD + Nhiên liệu còn lại (lít) + Tránh đá cuội + Bằng cách thay đổi thang giá trị, bạn có thể thay đổi chiều cao của cung đường 3D. + OSM ID + Hàng trước có widget phức tạp + Có thể được dùng nếu có một lối tắt + Hàng hoá gây nguy hiểm + Thêm trang + Đang sao chép tệp: %1$s… + Nhấn \"%1$s\" để sao chép %2$s tệp từ \"%3$s\" đến \"%4$s\". Có thể mất một lúc. + Đang sao chép %1$s tệp %2$s + Các tệp còn lại: %1$s%2$s + Dùng bản đồ ngoại tuyến để tìm những đường ở gần và dữ liệu độ cao. Có thể điều chỉnh dạng hình học cung đường. + Bạn có chắc rằng bạn muốn xoá \"%1$s\" cùng với tất cả hành động đã được thêm vào? + Dùng những con đường ở gần + Không xoay bản đồ bằng cử chỉ trong chế độ bản đồ Hướng Bắc ở trên + Tránh + Những tuyến xe điện bánh hơi + Đang đọc các tệp… + Đã xử lý %1$s tệp, %2$s + Nhấn \"Chọn thư mực này\". + Tặng miễn phí + Viết độ lệch + Viết độ hướng đi + Chi tiết đáy biển + Cho phép quyền truy cập đến thư mục. Nếu không OsmAnd không thể sao chép các tệp. + Đã tìm thấy %1$s tệp %2$s + Có, bỏ qua + Bộ nhớ dùng chung + Thông báo… + Java (An toàn) + Tỷ lệ lượn tới mục tiêu + Lưu thành bản sao + Sự trực quan hoá 3D + Bằng tên quản lý + Zoom có hoạt ảnh + Sao lưu cài đặt miễn phí + Sao lưu yêu thích miễn phí + Thay đổi diện mạo mặc định + Những tuyến tàu điện nhỏ + Được dùng + Xoá tài khoản OsmAnd?\n\nHành động này không thể hoàn tác. + Bạn có thể kiểm soát sự xuất hiện của nhóm trên bản đồ. Nếu cung đường bị ẩn, tất cả các nhóm cũng sẽ bị ẩn. + Những tuyến chạy bộ + Nhật Bản + Trang %1$s + không có + %1$s, chứa %2$s các cung đường khác nhau. Chọn những cung đường cần nhập. + Bản đồ con đường + Dừng tải xuống + Bắt đầu sao chép + Thư mục con trong \"%1$s\" được sắp xếp bởi: \"%2$s\" + Quảng cáo Tripltek trong %1$s tháng + Quay lại hoạt động được nhấn + Bỏ gợi ý dẫn đường + Trên một số con đường và đường hầm, việc vận chuyển hàng độc hại bị cấm. + Đi tự do + Điều này sẽ không xoá sự đăng kí OsmAnd Pro của bạn. + Những biểu tượng ở mức thu phóng thấp + Công cụ tạo tuyến đường trên web + Không có tuyến đường nào + Đóng và mất toàn bộ những thay đổi? + Thoát mà không lưu những thay đổi? + Nút để hiện hoặc ẩn những chỉnh sửa OSM ngoại tuyến trên bản đồ. + Sự phối màu + Danh sách phim + Đặt lại tốc độ trung bình + Thiết bị không rõ + VIN + Mã VIN qua OBD + Không có loại nhiên liệu nào được cung cấp + Điện nhiên liệu kép + Điện và động cơ đốt trong nhiên liệu kép + Hydrogen Lai + Đơn vị đo phương tiện + Cài đặt Đơn vị đo phương tiện + Hiện điện áp pin qua cảm biến OBD + Hiện mức nhiên liệu của xe qua cảm biến OBD + Nhiệt độ vào + Mức tiêu thụ nhiên liệu + Loại nhiên liệu + Hiện mức tiêu thụ nhiên liệu dựa trên OBD và vị trí + Màu tường + Bằng cách đổi giá trị thang đo, bạn có thể nhấn mạnh hình 3D. + Một số bản đồ ngoại tuyến cần thiết cho tuyến đường này đang thiếu hoặc chưa được cập nhật. Vui lòng tải xuống hoặc cập nhật những bản đồ này. + Tamil (Ấn Độ) + Cần thêm bản đồ để xem Địa thế trên bản đồ. + Danh sách các bản đồ còn thiếu được dựa trên tuyến đường thẳng. Để lấy danh sách bản đồ chính xác, OsmAnd có thể tính trước tuyến đường của bạn qua mạng. + Với các điểm đặt + %1$s : %2$s + Phong cách bản đồ hàng hải + Lưu độ hướng đi tới mỗi điểm cung đường trong khi ghi + Câu lạc bộ An-pơ Thuỵ Sĩ + Đăng ký OsmAnd Cloud để có sao lưu miễn phí cho những thứ yêu thích và cài đặt của bạn. + Lấy OsmAnd Cloud + Tài khoản miễn phí + Một tuyến đường núi được trang bị những sợi cáp, tay nắm, thang và cầu cố định. + Tài khoản và tất cả dữ liệu đã bị xoá khỏi OsmAnd Cloud. + Bản đồ địa thế (3D) + Xoá %1$s tài khoản? + Đang xoá + Xoá tài khoản + Xác minh tài khoản của bạn + Độ dốc sử dụng màu sắc để làm trực quan mức độ dốc của địa hình. Bạn có thể đọc thêm về Độ dốc trong %1$s. + Hình 3D + Chưa có widget nào ở đây + Những widget hiện có + Vận tốc hiện tại + Giống với phong cách OpenStreetMap-carto như trên trang chính OSM + Tốc độ của sự mô phỏng sẽ tối đa trên những đoạn đường thẳng và chỉ chậm lại ở những nơi giao nhau. + Chế độ xem trước nhanh + Hiện những tuyến đường chạy bộ + Lưu những thay đổi đến tệp + Điểm đến + thời gian + vận tốc + Ưu tiên… + Đổ bóng đồi núi + \"Trang %1$s\" đã được loại bỏ. + đã kiểm tra + Bạn có thể chỉ rõ một thư mục dữ liệu mới sau này. + Xoá những mục lịch sử đã chọn? + Xoá %1$s mục lịch sử? + Hiển thị các cung đường như POI + Giáo dục + Điểm + Tới: + Email không khớp với tên đăng nhập + Xe đạp địa hình + Từ %1$s đến %2$s + độ cao + Chỉ áp dụng với cái mới + Không kiểm tra + %1$s • %2$s • %3$s + Kích thước bộ nhớ đệm + Không có dữ liệu OsmAnd nào được tìm thấy trong thư mục đã chọn. Vui lòng thử lại. + Hiển thị các cung đường + Do những thay đổi với quyền truy cập bộ nhớ của Android, OsmAnd không còn có thể dùng %1$s.\n\nSao chép tất cả dữ liệu của bạn đến thư mục mới. + Công nghiệp + Chơi + Huyết áp + Đã kết nối + Áp suất bóng chèn + Tìm hiểu thêm về cảm biến. + Xoá tệp + Đồng bộ ngay + Inch thuỷ ngân + Mi-li-mét thuỷ ngân + Hiển thị và ghi dữ liệu từ cảm biến bên ngoài: vận tốc xe đạp, sức mạnh xe đạp, nhịp đạp, và nhịp tim. + RPM + Kết quả tính toán là rỗng + Không có cảm biến nào thuộc loại này được kết nối + Nhịp mạch + Đảm bảo rằng:\n– Bluetooth được bật\n– Cảm biến được kích hoạt\n– Thiết bị này được đặt gần cảm biến + Phiên bản đám mây sẽ bị loại bỏ + Những thay đổi cục bộ + Những thay đổi đám mây sẽ bị loại bỏ + Hội xe đạp địa hình thế giới + Một nút chuyển để hiện hoặc ẩn lớp phủ ngưng tụ trên bản đồ. + Hiện nhiệt độ cho trung tâm bản đồ hiện tại. + Tạo bản đồ đổ bóng đồi núi từ bản đồ 3D + + %1$d (%2$d cung đường) + + BRouter + Hiện lên trong bản đồ + Nhịp đạp xe + trong + Điều này sẽ xoá thư mục \"%1$s\" và tất cả %2$s cung đường nằm trong này. + Hiện tất cả cung đường trên bản đồ + Thư mục rỗng + Khu vực + Áp suất động mạch + in + Chọn thứ cần đồng bộ + Bật để xem dữ liệu thời tiết đã chọn trên bản đồ. + Trục X + Đang tải %1$.1f/%2$.1f MB + Không tồn tại + Đồng bộ cuối cùng + Được mua trên + Dự báo đã lỗi thời. + Chỉ dùng Tên + %1$s cung đường + Viết dữ liệu từ các cảm biến bên ngoài đến GPX trong khi ghi hành trình. + Dữ liệu + Quên + Tỉ số truyền động + Pin + Bluetooth không được hỗ trợ + BLE + Một nút chuyển để hiện hoặc ẩn lớp phủ gió trên bản đồ. + Lấy độ lệch từ tuyến đường điều hướng đang đi theo. + Hiện mức RSSI của thiết bị bên ngoài của bạn. + Khu vực 1 + Khu vực 5 + Nhỏ + Quyền Bluetooth chưa được cấp + BPM + Tìm cung đường bằng tên + Không có kết quả + \"%1$s\". Một tệp với tên đó đã tồn tại. Thay thế sẽ ghi đè tất cả thay đổi đã tạo với phiên bản hiện tại. + Quên cảm biến + Thông tin + ĐIều này sẽ xoá bộ nhớ đệm cho các mảng thời tiết trực tuyến. + Chữ ký điện tử không hợp lệ + Tạo bản đồ độ dốc từ bản đồ 3D + pao + Ngày cũ nhất trước + Chọn một tệp đường để dùng cho việc di chuyển địa điểm. + Độ lệch gần đúng + Dựa vào hướng xoay Bản đồ: ở đáy cho hướng chuyển động, ở giữa cho những thứ khác. + Bạn có thể tải dự báo thời tiết cho 7 ngày. + Chia sẻ dưới dạng tệp + Kiểm tra cập nhật + Đường đồng mức đám mây + Đường đồng mức ngưng tụ + Một nút chuyển để ẩn hoặc hiện lớp phủ áp suất khí quyển trên bản đồ. + Chiều rộng đường kẻ + Bật để xem dữ liệu độ sâu biển trên bản đồ. + Dự báo ngoại tuyến + Bật để xem độ che phủ mây trên bản đồ. + Bật để xem lớp phủ ngưng tụ trên bản đồ. + Cổ tay + Xoá \"%1$s\"? + Tệp mới + Đám mây + Một bộ widget thể hiện nhiều thông tin thời tiết khác nhau. + Bật để xem lớp phủ áp suất trên bản đồ. + Hiển thị áp suất khí quyển cho trung tâm bản đồ hiện tại. + Hiện tốc độ gió cho trung tâm bản đồ hiện tại. + Hỗ trợ cảm biến bên ngoài + Không tìm thấy cảm biến + Mở cài đặt + Ghép nối + Ngày mới nhất trước + Gần nhất + Trục Y + Thiết bị xe đạp + Vành tai + Những xung đột + IMBA + Thang đo MTB + mmHg + Đóng hội thoại + Vui lòng giữ thiết bị gần cảm biến. Bạn cần kích hoạt cảm biến để OsmAnd có thể tìm thấy nó. + Thay đổi đám mây + Đã tải lên + Vận tốc + Dự báo thời tiết ngoại tuyến + Kết nối + inch + Tính toán độ cao ngoại tuyến, dựa trên dữ liệu bản đồ địa thế (3D). Sự khác biệt so với độ cao được ghi bởi thiết bị có thể được dùng để hiệu chỉnh số liệu. + Không tìm thấy POI + Đã kết nối, %s + Đang kiểm tra… + Héc-tô-pát-xcan + • Thêm trình xem thư viện toàn màn hình cho hình ảnh Wikimedia\n\n• Giới thiệu plugin mới \"Vehicle Metrics\" để theo dõi hiệu suất của xe bằng giao thức OBD-II\n\n• Thêm khả năng chỉ định hoạt động cho các tuyến đường và lọc chúng cho phù hợp\n\n• Triển khai các hành động nhanh mới để ghi lại chuyến đi và khóa màn hình cảm ứng\n\n• Giới thiệu giao diện nút bản đồ tùy chỉnh và lưới chính xác\n\n• Thêm menu ngữ cảnh và hành động \"Đặt lại tốc độ trung bình\" vào tiện ích\n\n• Thêm lớp tuyến đường mới \"Đường mòn xe đạp địa hình\"\n\n• Sửa lỗi \"Tự động ghi lại tuyến đường trong khi điều hướng\"\n\n• Sửa lỗi tọa độ bị đảo ngược trong RTL\n\n• Sửa lỗi dữ liệu cảm biến bị bỏ sót đối với tuyến đường hiện đang ghi lại\n\n• Thêm thông tin về các khu vực xung quanh cho điểm đã chọn\n\n• Thêm hành động nhanh để kiểm soát khả năng hiển thị của Chỉnh sửa OSM\n\n• Tách các tham số khả năng hiển thị cho các tùy chọn tô màu Địa hình\n\n• Thêm biểu tượng có thể chạm để hiển thị quyền truy cập hoặc đường khác hoặc thuộc tính đường dẫn + • Tùy chọn tô màu địa hình mới \"Độ cao\"\n\n• Bảng màu tùy chỉnh cho địa hình, đường đi và tuyến đường\n\n• Biến thể 3D cho biểu tượng vị trí\n\n• Hành động nhanh hiện có thể được gán cho bàn phím ngoài\n\n• Thời tiết: Làm mới giao diện người dùng, thêm hoạt ảnh gió\n\n• Cải tiến Đường đi 3D: tùy chọn trực quan hóa và tô màu mới\n\n• Mở rộng lựa chọn các tuyến đường du lịch trên bản đồ\n\n• Thêm tùy chọn chủ đề ứng dụng để theo dõi chế độ bản đồ\n\n• Đã sửa số liệu thống kê đường đi, sắp xếp và tìm kiếm\n\n• Chỉnh sửa OSM: đã xóa phương thức ủy quyền đăng nhập/mật khẩu\n\n• Chuyển sang bảng chia sẻ hệ thống bắt đầu từ Android 14 + • Tiện ích \"Đồng hồ tốc độ\" mới tương thích với Android Auto\n\n• Cấu hình màn hình bản đồ bằng cách thêm nhiều nút \"Hành động nhanh\"\n\n• Cải thiện khả năng đọc dữ liệu trong biểu đồ\n\n• Thêm bộ lọc theo dữ liệu cảm biến cho các tuyến đường\n\n• Cải thiện tùy chỉnh giao diện cho nhóm tuyến đường\n\n• Thêm hỗ trợ cho các thẻ GPX bổ sung\n\n• Tùy chỉnh \"Khoảng cách trong khi điều hướng\": chọn giữa các số chính xác hoặc làm tròn\n\n• Giao diện người dùng hợp nhất để chọn tuyến đường\n\n• Đăng nhập OpenStreetMap đã chuyển sang OAuth 2.0 + • Android Auto: Thêm chế độ 3D\n\n• Tracks: Giới thiệu bộ lọc và thư mục thông minh, bộ nhớ được tối ưu hóa cho các tệp lớn hơn\n\n• Cải thiện bảng tiện ích trên cùng và dưới cùng để chứa tất cả các tiện ích\n\n• Cải thiện quản lý tài nguyên cục bộ\n\n• Ánh xạ nút tùy chỉnh cho bộ điều khiển bên ngoài\n\n• Tiện ích mới: \"Tỷ lệ lướt\" và \"Vị trí mặt trời\"\n\n• OsmAnd Cloud: Bây giờ có thể truy cập các tệp đã xóa\n\n• Cải thiện màu sắc đường đua ở chế độ Độ dốc với độ dốc đối xứng mới\n\n• Giải quyết các sự cố với thanh trạng thái trong suốt\n\n• Thêm hỗ trợ cho tiện ích nhiệt độ ANT+\n\n• Giới thiệu tiện ích \"RAM khả dụng\" + • Cảm biến BLE/ANT+: kết nối được thiết kế lại, ghi và xem dữ liệu đã nhận vào GPX\n\n• Sao lưu miễn phí cho mục yêu thích và cài đặt vào \"OsmAnd Cloud\"\n\n• Định dạng mới cho bản đồ Địa hình với hỗ trợ 3D Relief\n\n• Quản lý tuyến đường: giao diện người dùng được cập nhật, thêm tính năng sắp xếp, hỗ trợ các thư mục lồng nhau\n\n• Android Auto: menu bắt đầu mới để truy cập mục yêu thích, tuyến đường và danh mục POI\n\n• Một danh sách tiện ích cho bảng điều khiển Trên cùng/Dưới cùng\n\n• Hồ sơ \"Train\" mới, cho phép tính toán các tuyến đường sắt\n\n• Đường đồng mức hoạt động với bất kỳ \"Nguồn bản đồ\" nào\n\n• Danh sách mở rộng các hành động mặc định cho bàn phím ngoài\n\n• Tệp định tuyến tùy chỉnh, thêm tùy chọn để xóa hoặc ghi đè\n\n• Thêm tùy chọn \"Thông báo độ lệch so với tuyến đường\"\n\n• Màn hình bắt đầu: thêm tùy chọn khôi phục trạng thái OsmAnd từ tệp\n\n• Đã thêm lớp \"Vật liệu nguy hiểm\" Điều hướng xe tải ở Bắc Mỹ\n\n• Đã thêm hỗ trợ \"Via ferrata\" cho tuyến đường dành cho người đi bộ\n\n• Đã thêm thang đo \"CAI\" để phân loại mức độ khó của các tuyến đường\n\n• Đã sửa lỗi lựa chọn ngôn ngữ cho từng ứng dụng\n\n• Đã thêm hỗ trợ cho các biểu tượng theo chủ đề\n\n• OsmAnd Cloud: đã thêm tùy chọn xóa tài khoản\n\n• Khả năng truy cập: kích thước mục tiêu cảm ứng cho các nút đã thay đổi thành 48 dp; đã khắc phục sự cố với giao diện người dùng bản đồ hiển thị cho trình đọc màn hình\n\n• Đã làm lại lời nhắc bằng giọng nói tiếng Nhật\n\n• Đã làm lại đánh giá độ dốc và thay đổi độ cao + • Công cụ kết xuất bản đồ Phiên bản 2 (OpenGL) mới, nhanh hơn, với chế độ xem 2.5D\n\n• Hoạt ảnh mượt mà về các thay đổi vị trí khi đang chuyển động\n\n• Tiện ích mới cho tọa độ trung tâm bản đồ và độ cao của địa lý\n\n• \"Khoảng cách chạm\": thêm tùy chọn kích thước văn bản\n\n• Tiện ích \"Đánh dấu bản đồ\": thêm tùy chọn để thay đổi hành vi nhấp\n\n• Đã sửa tùy chọn \"Vị trí vị trí\"\n\n• GPX: thêm hỗ trợ cho các thẻ \"liên kết\", \"cmt\", \"desc\" và cho bất kỳ tiện ích mở rộng tùy chỉnh nào\n\n• Sắp xếp lại danh sách \"Bản đồ hàng hải\"\n\n• Thêm hỗ trợ cho cảm biến ANT+\n\n• Thêm tùy chọn để vô hiệu hóa UUID tải xuống\n\n• Dự báo có thể điều chỉnh tốc độ mặc định cho thời gian đi bộ/đi bộ đường dài/chạy bộ phụ thuộc vào độ cao\n\n• Đã sửa lỗi đầu ra âm thanh và hành vi của thanh trượt âm lượng + Mặc định: tên điểm đánh dấu hàng hải (light character.group.period), chọn thông tin bổ sung vào các khu vực 1 đến 3 hoặc khu vực 1, 2, 3, 4, 5 ký tự ánh sáng + Ngón tay + Bàn tay + %1$s được nhập. + Tệp đã tồn tại + Giá trị cổng tối đa là %1$s + Tâm trương + Vô hiệu đỉnh đổ bóng trong 3D + Giá trị tối thiểu là \"%1$s\" %2$s. Dùng hồ sơ \"%3$s\" nếu trọng lượng của xe thấp hơn giá trị tối thiểu. + Chọn một định dạng âm thanh. Loại định dạng tệp chứa âm thanh là 3GPP (.3gp). + Hải lý/feet + Bỏ qua việc tải xuống + • Cải thiện menu \"Đường đi\" trong \"Cấu hình bản đồ\"\n\n• Menu ngữ cảnh hiện hiển thị tên bản địa hóa cho POI\n\n• Thêm tùy chọn chia sẻ tuyến đường theo liên kết\n\n• Thêm đơn vị chiều dài \"Hải lý/feet\"\n\n• Thêm chế độ cố định mới cho hướng bản đồ\n\n• Màn hình bắt đầu được đơn giản hóa\n\n• Đã sửa vị trí vị trí ở chế độ chia đôi màn hình trong Android Auto\n\n• Thêm biểu đồ \"Tốc độ/Độ dốc\" để phân tích đường đi\n\n• Android 13 đã di chuyển lựa chọn ngôn ngữ ứng dụng vào cài đặt hệ thống\n\n• Đã sửa lỗi hiển thị địa điểm Vegan\n\n• Thêm khả năng tải xuống các ô trực tuyến được sử dụng làm bản đồ \"Lớp phủ trên\" hoặc \"Lớp phủ bên dưới\"\n\n• Thêm hỗ trợ cho các đơn vị Anh cho \"Thông số xe\"\n\n• Hồ sơ xe gắn máy mới\n\n• \"Hiển thị vị trí\" đã thêm tùy chọn mới \"Tự động\"\n\n• Đã sửa lỗi cử chỉ bản đồ để nghiêng, thu phóng và xoay + Những thay đổi cục bộ sẽ bị loại bỏ + Đường đồng mức tốc độ gió + Bật để xem lớp phủ nhiệt độ trên bản đồ. + Cho phép chúng tôi xác định vị trí của bạn + Tải phiên bản đám mây + Bật để xem các đường đồng mức thời tiết trên bản đồ. + Chi tiết ánh sáng + Đã tìm thấy: %d + Chưa được đồng bộ + Thay đổi %1$s + Tất cả thay đổi đã được tải lên + Hiện thang đo MTB + Chọn lớp + Leo núi + Thêm thủ công… + Một nút chuyển để hiện hoặc ẩn lớp phủ nhiệt độ trên bản đồ. + Tính toán ngoại tuyến + Tốc độ + Xoá tệp + Toàn thế giới + Đường đồng mức + hPa + inHg + Xoá thư mục? + Chưa được ghi + Cung đường mới + Chế độ 2D + Một nút chuyển để ẩn hoặc hiện lớp phủ đám mây trên bản đồ. + Đã ngắt kết nối + Các cập nhật miễn phí (khẩn cấp) + Đang thực hiện + Tổng khoảng cách + Khoảng cách + Tìm lại + Bật để xem lớp phủ gió trên bản đồ. + RSSI + Xoá bộ nhớ đệm trực tuyến + pao + Thiết lập sao lưu + Những thay đổi + Tải lên thay đổi + Tất cả thay đổi được tạo trên thiết bị này đã được đồng bộ với OsmAnd Cloud. + Mở + Dự báo 24 giờ và 7 ngày, cập nhật mỗi 3 tiếng + Trên bản đồ + Ghép nối cảm biến mới + Chia sẻ đường dẫn + Tệp cục bộ sẽ được khôi phục + Xung đột + Ngắt kết nối + Tâm thu + Kết nối + Gốc + Dự báo thời tiết + Hải lý/mét + Không rõ + Tệp đã được sửa đổi + Tất cả thay đổi đã được tải xuống + Cho phép bạn mở một màn hình với thông tin thời tiết chi tiết. + Thư mục này không có cung đường nào. + Cảm biến sẽ bị loại bỏ khỏi danh sách. Bạn có thể ghép nối lại với cảm biến này sau. + Không thể tải %1$s mảng. + Khoảng cách + Những đường dẫn thứ ba + Sở hữu và quan sát mô hình tĩnh của khu vực bạn sống hoặc toàn bộ châu lục. + Nhấn giữ nút để thay đổi vị trí nút. + Oát + Nguồn dữ liệu + Xoá thư mục + Chế độ 3D + Hiện lên ở chế độ 3D + Chạm vào bản đồ bằng hai ngón tay và di chuyển chúng lên và xuống để thay đổi độ nghiêng của bản đồ. + Khu vực 2 + Khu vực 3 + Khu vực 4 + Bàn chân + Pin yếu + Chiều dài sải chân + Nhiệt độ + Dữ liệu nhận được + Không thể tìm thấy cảm biến nào + Khoảng cách dài nhất trước + Bluetooth đã được tắt + Ghép nối với cảm biến Bluetooth LE + Xoá \"%1$s\" khỏi OsmAnd Cloud? + Xoá phiên bản đám mây + Cho phép bản đồ 3D + Khoảng cách ngắn nhất trước + Tải lên tất cả + Không có xung đột nào. + Thất bại khi lấy danh sách tệp từ máy chủ. + Sự phân loại khúc + Không có phiên bản cục bộ. + Tốc độ di chuyển + Đồng bộ...%1$s + Đã được sửa đổi + Hiển thị lối đi dựa theo thang đo MTB của chúng. + Sự phối màu đường kẻ + Đường đồng mức độ sâu + Cung cấp\n- dự báo thời tiết 24 giờ và 7 ngày bao gồm 5 lớp\n- widget theo vị trí\n- đường đồng mức nhiệt độ / áp suất\n\nDữ liệu thời tiết được cung cấp bởi Hệ thống dự báo toàn cầu (GFS, %1$s). + Pin + Nhịp tim + %1$s đã kết nối + Danh mục POI + Tổng khoảng cách + Giá trị tối thiểu là \"%1$s\" tấn. Dùng hồ sơ \"%2$s\" nếu trọng lượng của xe thấp hơn giá trị tối thiểu. + Mở thời tiết + Bộ nhớ đệm trực tuyến + Hiện sự ngưng tụ cho trung tâm bản đồ hiện tại. + Ứng dụng máy ảnh + Được đồng bộ hoá gần nhất + Đã ngắt kết nối, %s + ANT + Bật Bluetooth để tìm và ghép nối với cảm biến. + Đang tìm kiếm cảm biến + Tôi không biết mình có loại cảm biến nào + Đang tìm kiếm + Bạn có thể ghép nối cảm biến Bluetooth và ANT+ với OsmAnd. + Ghép nối với cảm biến ANT+ + Âm thanh màn chụp + Thông báo sự chệch hướng + Bộ nhớ đệm ngoại tuyến + Tên thay thế + %1$s đã ngắt kết nối + Thiết bị đang hoạt động + Ngực + Hiện độ che phủ mây cho trung tâm bản đồ hiện tại. + Cảm biến bên ngoài + Toạ độ: Trung tâm bản đồ + Những con đường không cho phép giao hàng sẽ được tránh. + Để nhận dữ liệu %1$s, gắn cung đường của bạn với những con đường hoặc tính toán nó trực tuyến. + Chạm vào widget sẽ đổi sang chế độ thước đo bán kính. + Những điểm độ sâu của biển + Đến Cửa hàng + Hiện góc nghiêng máy ảnh trong chế độ nhìn rộng. Mặc định là 90° (không nghiêng). + Bấm vào widget + Hiện góc giữa hướng di chuyển về trước và điểm đích. + Tải xuống các mảng + Gắn cung đường của bạn với những con đường được phép để dẫn đường giữa các điểm và liên kết những chỉ dẫn rẽ chính xác và những thuộc tính của tuyến đường. + Vị trí hiển thị + Chỉ những cung đường đã được ghi mới có thể được gắn với đường đi. + Được bao gồm trong kế hoạch \"%1$s\" hiện tại của bạn + Truy cập cảm biến bên ngoài để đọc nhịp tim, vận tốc xe đạp, sức mạnh đạp xe, hoặc nhịp đạp của bạn. Yêu cầu thiết bị của bạn được kết nối tới cảm biến tương ứng thông qua giao thức mạng không dây cá nhân ANT+. + Hiện độ cao trên mực nước biển của vị trí địa lý hiện tại. + Một mã xác định người dùng ngẫu nhiên được dùng để tải các bản đồ ngoại tuyến từ máy chủ OsmAnd để giám sát việc sử dụng hợp lý các tài nguyên máy chủ, dự đoán mẫu hình lượng truy cập, và tạo các báo cáo bản đồ ẩn danh hàng tháng. + Không thể tìm được dịch vụ cần thiết \"%1$s\".\nBạn cần cài đặt hoặc cập nhật Dịch vụ Phần bổ trợ ANT+.\nBạn có muốn mở Play Store để làm điều đó? + Đọc dữ liệu + Nhịp tim + Nhịp đạp xe đạp + Vận tốc xe đạp + Hiện khoảng cách đã đi được + Toạ độ: vị trí hiện tại + Đi đến vị trí của điểm đánh dấu + Chuyển chế độ + Bình thường + Cao độ địa hình + Xoá nhóm \"%1$s\" và tất cả các điểm trong đó (%2$d)? + Theo mặc định, Android lưu các bản sao lưu của những thứ yêu thích, mã điện tử bản đồ và các cài đặt OsmAnd để khôi phục chúng trên thiết bị mới hoặc sau khi cài đặt lại. Bản sao lưu này bị giới hạn tới 25MB.\nKhi sử dụng OsmAnd Cloud, điều này có thể dẫn tới những hiểu lầm sau khi cài đặt lại. + Đường đồng mức nhiệt độ + Đường đồng mức áp suất + Khoảng cách + Màu vòng tròn + La bàn trên vòng tròn + Nhịp đạp xe đạp + Độ nghiêng máy ảnh + Một nút chuyển hiện hoặc ẩn widget trung tâm bản đồ trên bản đồ. + Thiếu phần phụ thuộc + Hiện độ cao trên mực nước biển của máy ảnh. + Kết nối với một đường thẳng + Đường đồng mức độ sâu + Độ rộng đường đồng mức độ sâu + Hiện nhịp tim của người dùng khi thực hiện một hành động cụ thể theo thời gian thực + Lên núi + Vòng tròn khoảng cách + Khoảng thời gian + Không thay đổi hồ sơ + Sao lưu tự động + Lớn + Chỉ thiếu + Khoảng cách từ máy ảnh đến mục tiêu + Hiện khoảng cách giữa máy ảnh và vị trí đích. + Widget nhà phát triển + Widget hiện khoảng cách hoặc thời gian đến dự kiến (ETA) cho hai điểm đánh dấu đầu tiên trong danh sách điểm đánh dấu bản đồ. + Có như một phần của sự đăng ký %1$s. + Bản đồ toàn thế giới + Hiện tốc độ di chuyển + Hiện lối đi MTB IMBA + Xoá nhóm + Hiện lối đi riêng cho xe đạp địa hình. + Cách dùng: + Toạ độ: Vị trí hiện tại + Tính độ cao trực tuyến trên máy chủ OsmAnd, dựa trên hình ảnh vệ tinh và các mẫu độ cao kỹ thuật số. Những sự khác biệt với độ cao được đo bởi thiết bị có thể được dùng để làm chính xác số liệu. + FPS kết xuất bản đồ + Hiện độ cao trên mực nước biển của trung tâm bản đồ hiện tại. + Mức độ thu phóng + Tăng tốc giả lập + Độ khó cho các lối cưỡi ngựa + Việc giả lập bỏ qua những mét đầu tiên + Hiện sức mạnh mà người đạp tạo ra để đưa xe đạp tiến về trước + Hiện tốc độ người dùng đạp xe + Hiện toạ độ vị trí địa lý của vị trí địa lý hiện tại + Độ cao: Trung tâm bản đồ + Hiện độ cao của vị trí địa lý hiện tại hoặc độ cao của trung tâm bản đồ hiện tại + Toạ độ: trung tâm bản đồ + Cài đặt vòng tròn + Xuống núi + Mua chéo + Bao gồm nhịp tim trong cung đường + Viết dữ liệu vào cung đường + Hiện mức thu phóng bản đồ hiện tại. + Một nút chuyển để hiện hoặc ẩn widget vị trí hiện tại trên bản đồ. + Hiện toạ độ vị trí địa lý của trung tâm bản đồ hiện tại + Hiện + Chạm vào bản đồ để xem khoảng cách giữa vị trí hiện tại của bạn và điểm đã chạm.\nChạm 2 ngón vào bản đồ để xem khoảng cách giữa các điểm đó + Góc giữa hướng bắc chuẩn và điểm đích được lấy từ vị trí của bạn. + Sửa chính xác độ cao + Sức mạnh xe đạp + Chạm vào widget sẽ chuyển các chế độ. + Cảm biến bên ngoài + Độ cao: vị trí hiện tại + Hiện tốc độ hiển thị bản đồ và các yếu tố bản đồ theo số khung hình trên giây (FPS). + Giả lập vị trí bởi GPX + Khám phá các kế hoạch + Chỉ rõ khoảng thời gian trong đó vận tốc trung bình được đo để tính thời gian đến dự kiến. + Sự phối màu đường đồng mức độ sâu + Độ cao máy ảnh + Tốc độ + Ưu tiên rời khỏi đường trượt tuyết + Mới bắt đầu + Cách đi trên tuyến đường + Ký hiệu + Đang đọc tệp… + Góc lệch thực + Hiện toạ độ địa lý của vị trí địa lý hiện tại. + Không thể làm được + Lấy dữ liệu độ cao + Nguồn vị trí + Chọn cạnh màn hình để thêm hoặc sắp xếp lại các widget. + Hiện độ cao trên mực nước biển của vị trí địa lý hiện tại. + Không ưu tiên + Những điểm đã chọn sẽ được thêm vào cung đường \"%1$s\" + Hiển thị giản lược các biểu tượng ở mức thu phóng thấp + Tăng sự trực quan của các hầm trên đường thuỷ + Tăng sự trực quan của các hầm trên đường thuỷ + Lấy thông tin độ cao + %1$s trên %2$s + Chỉ áp dụng đến những yêu thích mới + Biểu mẫu điểm đánh dấu + Nguy hiểm + Góc giữa hướng bắc từ tính và điểm đích quan sát từ vị trí của bạn. + Diện mạo mặc định + Chỉ khi cần thiết + Bạn có thể thay đổi định dạng dữ liệu được dùng trong: %1$s – %2$s – %3$s. + Chọn hành động. + Tính trực tuyến + Bạn có thể thay đổi định dạng toạ độ trong %1$s – %2$s – %3$s. + Tính độ cao + Áp dụng các thay đổi đến những điểm yêu thích đã có của nhóm hay chỉ những điểm mới? + Áp dụng các thay đổi đến những điểm đã tồn tại của nhóm hay chỉ những điểm mới? + Độ khó của đường cưỡi ngựa + Yêu cầu cao + Nguy cấp + Màu, biểu tượng và hình dạng mặc định sẽ được áp dụng với những điểm yêu thích đã thêm vào trong nhóm. + Áp dụng đến những điểm đã có + Đang tính độ cao + Không có dữ liệu độ cao + Không rời khỏi đường trượt tuyết + Cho phép + Thông thường + Những giới hạn xe ngựa + Chỉnh sửa danh mục + Theo yêu cầu + Hiện hồ sơ độ cao và độ dốc của tuyến đường hiện tại. + Một phần của phần bổ trợ %1$s. + Những điểm điều hướng + Hiện khoảng cách từ trung tâm màn hình đến điểm đỗ xe của bạn. + Cung cấp truy cập nhanh đến ứng dụng Mapillary để thêm hình ảnh đường phố. + Trung cấp + Cao cấp + Chuyên gia + Độ cao của vị trí hiện tại + Chọn những điểm được gợi ý + Chỉ áp dụng đến những điểm mới + Kết xuất bản đồ theo độ khó của đường cưỡi ngựa + Di chuyển bản đồ để chọn khu vực cần thiết. + Hình dạng + Khó + Công cụ thước đo bán kính hiển thị những vòng tròn khoảng cách quanh một điểm đã chọn trên bản đồ. + Hiện góc lệch tuyệt đối hoặc tương đối đến một đích theo đơn vị đo góc (trong chế độ 180 độ, 360 độ, hoặc mi-li-ra-đi-an). + • Thiết kế lại tiện ích: Giao diện mới, nhóm theo Trang, thay đổi thứ tự và kết hợp theo ý muốn.\n\n• Lộ trình đi bộ đường dài/đạp xe/du lịch: chạm vào biểu tượng lộ trình và nhận thông tin đầy đủ về lộ trình.\n\n• Nhóm yêu thích: đặt giao diện mặc định cho các điểm mới trong nhóm\n\n• Sửa lỗi: tự động cập nhật bản đồ ô trực tuyến + Xem xét quyền truy cập của những phương tiện được ngựa kéo + Thông tin văn bản bổ sung về phẩm chất bề mặt đáy biển, các loại bề mặt kết hợp, danh mục và phân loại rong biển hoặc cỏ biển + Theo mặc định, OsmAnd được cài từ Cửa hàng Play sử dụng %1$s để xác định vị trí.\n\nNếu bạn thấy thông tin vị trí không đúng hoặc dùng thiết bị không có %2$s, hãy thử chuyển sang \"%3$s\" \ No newline at end of file diff --git a/OsmAnd/res/values-zh-rTW/phrases.xml b/OsmAnd/res/values-zh-rTW/phrases.xml index 89c2cc12745..c1c56ffd9bb 100644 --- a/OsmAnd/res/values-zh-rTW/phrases.xml +++ b/OsmAnd/res/values-zh-rTW/phrases.xml @@ -4880,4 +4880,19 @@ 不接受 Parkster 隧道禁止行人通行 隧道禁止腳踏車騎士通行 + 其他路線 + 其他路線點 + 腳踏車 + 騎馬 + 冬季運動 + 雪地摩托車 + 直排輪鞋 + 山區騎乘 + 旅遊點 + 旅遊文章 + 健行 + 跑步 + 步行 + 水上運動 + 健身路徑 \ No newline at end of file diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index f9a50086e36..319cd3c401f 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -5632,4 +5632,9 @@ 燃料壓力 顯示從 OBD 掃描器取得的車輛燃料壓力(表壓力) 無法啟動與裝置的配對 + 動態 + 已連線至 %s + 與 %s 斷線 + 正在連線至 %s + 圖示會根據動作狀態變更。 \ No newline at end of file diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml index 281b47dcee3..8bb901d4136 100644 --- a/OsmAnd/res/values/phrases.xml +++ b/OsmAnd/res/values/phrases.xml @@ -5451,4 +5451,19 @@ Tunnel prohibited for pedestrians Tunnel prohibited for cyclists + Travel Articles + Travel Points + Other routes + Other routes points + Bicycle + Hiking + Running + Walking + Water sports + Horse riding + Winter sports + Snowmobile + Fitness trails + Inline skates + Mountain biking diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 764b283fbab..46c985c7f47 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -10,7 +10,7 @@ - For wording and consistency, please note https://docs.osmand.net/docs/technical/contributions/translating-osmand Thx - Hardy --> - + Icon changes based on action state. Dynamic Connected to %s diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java index 92477f8d995..dd2d274862b 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java @@ -12,6 +12,8 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.AssetManager; +import com.google.gson.Gson; + import androidx.annotation.NonNull; import net.osmand.IndexConstants; @@ -31,6 +33,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.Serializable; import java.net.URLConnection; import java.text.ParseException; @@ -182,33 +185,25 @@ private static List listTtsVoiceIndexes(@NonNull OsmandApplication ap return items; } + public static class AssetEntryList { + List assets = new ArrayList<>(); + } @NonNull public static List getBundledAssets(@NonNull AssetManager assetManager) throws XmlPullParserException, IOException { SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd.MM.yyyy", Locale.US); - XmlPullParser xmlParser = XmlPullParserFactory.newInstance().newPullParser(); - InputStream isBundledAssetsXml = assetManager.open("bundled_assets.xml"); - xmlParser.setInput(isBundledAssetsXml, "UTF-8"); - List assets = new ArrayList<>(); - int next; - while ((next = xmlParser.next()) != XmlPullParser.END_DOCUMENT) { - if (next == XmlPullParser.START_TAG && xmlParser.getName().equals("asset")) { - String source = xmlParser.getAttributeValue(null, "source"); - String destination = xmlParser.getAttributeValue(null, "destination"); - String combinedMode = xmlParser.getAttributeValue(null, "mode"); - AssetEntry ae = new AssetEntry(source, destination, combinedMode); - String version = xmlParser.getAttributeValue(null, "version"); - if (!Algorithms.isEmpty(version)) { - try { - ae.version = DATE_FORMAT.parse(version); - } catch (ParseException e) { - log.error(e.getMessage(), e); - } + InputStream isBundledAssetsXml = assetManager.open("bundled_assets.json"); + AssetEntryList lst = new Gson().fromJson(new InputStreamReader(isBundledAssetsXml), AssetEntryList.class); + for (AssetEntry ae : lst.assets) { + if (!Algorithms.isEmpty(ae.version)) { + try { + ae.dateVersion = DATE_FORMAT.parse(ae.version); + } catch (ParseException e) { + log.error(e.getMessage(), e); } - assets.add(ae); } } isBundledAssetsXml.close(); - return assets; + return lst.assets; } @NonNull @@ -408,13 +403,14 @@ public String getDestFile() { public static class AssetEntry { public final String source; public final String destination; - public final String combinedMode; - public Date version = null; + public final String mode; + public String version; + public Date dateVersion = null; public AssetEntry(String source, String destination, String combinedMode) { this.source = source; this.destination = destination; - this.combinedMode = combinedMode; + this.mode = combinedMode; } } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/download/local/BaseLocalItem.java b/OsmAnd/src/net/osmand/plus/download/local/BaseLocalItem.java index 93037fd1718..d2ead3968c3 100644 --- a/OsmAnd/src/net/osmand/plus/download/local/BaseLocalItem.java +++ b/OsmAnd/src/net/osmand/plus/download/local/BaseLocalItem.java @@ -4,6 +4,8 @@ import androidx.annotation.NonNull; +import net.osmand.plus.utils.AndroidUtils; + public abstract class BaseLocalItem { protected final LocalItemType type; @@ -23,6 +25,11 @@ public LocalItemType getType() { @NonNull public abstract String getDescription(@NonNull Context context); + @NonNull + public String getSizeDescription(@NonNull Context context) { + return AndroidUtils.formatSize(context, getSize()); + } + public abstract long getSize(); public abstract long getLastModified(); diff --git a/OsmAnd/src/net/osmand/plus/download/local/CollectLocalIndexesAlgorithm.java b/OsmAnd/src/net/osmand/plus/download/local/CollectLocalIndexesAlgorithm.java index e3e97cf7a1f..db7d09eefe7 100644 --- a/OsmAnd/src/net/osmand/plus/download/local/CollectLocalIndexesAlgorithm.java +++ b/OsmAnd/src/net/osmand/plus/download/local/CollectLocalIndexesAlgorithm.java @@ -13,8 +13,8 @@ import net.osmand.util.Algorithms; import java.io.File; -import java.util.Collection; -import java.util.HashMap; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -22,10 +22,7 @@ public class CollectLocalIndexesAlgorithm { private final OsmandApplication app; private final CollectLocalIndexesRules rules; - - private final Map separateSizeItemCalculations = new HashMap<>(); - private final Map separateSizeTypeCalculations = new HashMap<>(); - private final Map calculationLimitReached = new HashMap<>(); + private final List separateSizeCalculationItems = new ArrayList<>(); private CollectLocalIndexesAlgorithm(@NonNull CollectLocalIndexesRules rules) { this.app = rules.getApp(); @@ -38,7 +35,6 @@ private Map execute() { for (File directory : rules.getDirectories()) { collectFiles(categories, directory, rules.shouldAddUnknown(directory)); } - applySeparatelyCalculatedSize(categories.values()); return categories; } @@ -61,7 +57,7 @@ private void collectFiles(@NonNull Map categories, private boolean shouldSkipDirectory(@NonNull File directory) { LocalItem localItem = getSeparatelyCalculationSizeItem(directory); - return localItem != null && isCalculatedSizeLimitReached(localItem.getType()); + return localItem != null && localItem.isSizeCalculationLimitReached(); } private void addFile(@NonNull Map categories, @NonNull File file, boolean addUnknown) { @@ -108,37 +104,26 @@ private void addLiveItem(@NonNull LocalCategory category, @NonNull File file, @N } private void addSeparatelyCalculationItemIfNeeded(@NonNull LocalItem item) { - LocalItemType itemType = item.getType(); - if (rules.shouldCalculateSizeSeparately(itemType)) { - separateSizeItemCalculations.put(item, 0L); - if (!separateSizeTypeCalculations.containsKey(itemType)) { - separateSizeTypeCalculations.put(itemType, 0L); - } + LocalItemType type = item.getType(); + Long limit = rules.getCalculationSizeLimit(type); + if (limit != null && !separateSizeCalculationItems.contains(item)) { + separateSizeCalculationItems.add(item); + item.setSizeCalculationLimit(limit); + item.setSize(0); } } private void calculateSizeSeparatelyIfNeeded(@NonNull File file) { LocalItem localItem = getSeparatelyCalculationSizeItem(file); - if (localItem == null) return; - - long fileSize = file.length(); - Long itemSize = separateSizeItemCalculations.get(localItem); - itemSize = itemSize == null ? fileSize : itemSize + fileSize; - separateSizeItemCalculations.put(localItem, itemSize); - - LocalItemType type = localItem.getType(); - Long typeSize = separateSizeTypeCalculations.get(type); - typeSize = typeSize == null ? fileSize : typeSize + fileSize; - separateSizeTypeCalculations.put(type, typeSize); - - boolean limitReached = rules.isSeparatelyCalculatedSizeLimitReached(type, typeSize); - calculationLimitReached.put(type, limitReached); + if (localItem != null) { + localItem.setSize(localItem.getSize() + file.length()); + } } @Nullable private LocalItem getSeparatelyCalculationSizeItem(@NonNull File file) { String filePath = file.getAbsolutePath(); - for (LocalItem localItem : separateSizeItemCalculations.keySet()) { + for (LocalItem localItem : separateSizeCalculationItems) { String basePath = localItem.getPath(); if (filePath.startsWith(basePath)) { return localItem; @@ -147,43 +132,6 @@ private LocalItem getSeparatelyCalculationSizeItem(@NonNull File file) { return null; } - private void applySeparatelyCalculatedSize(@NonNull Collection categories) { - for (LocalItemType type : separateSizeTypeCalculations.keySet()) { - if (isCalculatedSizeLimitReached(type)) { - Long limit = rules.getCalculationSizeLimit(type); - LocalGroup group = getLocalGroupByType(categories, type); - if (group != null && limit != null) { - group.setSizeLimit(limit); - } - } - } - for (LocalItem localItem : separateSizeItemCalculations.keySet()) { - Long size = separateSizeItemCalculations.get(localItem); - if (size != null && !isCalculatedSizeLimitReached(localItem.getType())) { - localItem.setSize(size); - } else { - localItem.setSize(-1); - } - } - } - - private boolean isCalculatedSizeLimitReached(@NonNull LocalItemType type) { - Boolean limitReached = calculationLimitReached.get(type); - return limitReached != null && limitReached; - } - - @Nullable - private LocalGroup getLocalGroupByType(@NonNull Collection categories, - @NonNull LocalItemType type) { - for (LocalCategory category : categories) { - LocalGroup group = category.getGroups().get(type); - if (group != null) { - return group; - } - } - return null; - } - @NonNull public static Map execute(@NonNull CollectLocalIndexesRules rules) { return new CollectLocalIndexesAlgorithm(rules).execute(); diff --git a/OsmAnd/src/net/osmand/plus/download/local/CollectLocalIndexesRules.java b/OsmAnd/src/net/osmand/plus/download/local/CollectLocalIndexesRules.java index e84f0f50ef7..caee13a852f 100644 --- a/OsmAnd/src/net/osmand/plus/download/local/CollectLocalIndexesRules.java +++ b/OsmAnd/src/net/osmand/plus/download/local/CollectLocalIndexesRules.java @@ -53,23 +53,16 @@ public boolean shouldAddUnknown(@NonNull File directory, boolean addUnknown) { return addUnknown; } - public boolean shouldCalculateSizeSeparately(@NonNull LocalItemType type) { - return typesToCalculateSizeSeparately.containsKey(type); - } - - public boolean isSeparatelyCalculatedSizeLimitReached(@NonNull LocalItemType type, long size) { - Long limit = getCalculationSizeLimit(type); - if (limit != null && limit > 0) { - return size > limit; - } - return false; - } - @Nullable public Long getCalculationSizeLimit(@NonNull LocalItemType type) { return typesToCalculateSizeSeparately.get(type); } + @NonNull + public Collection getTypesToCalculateSizeSeparately() { + return typesToCalculateSizeSeparately.keySet(); + } + public static class Builder { private final OsmandApplication app; diff --git a/OsmAnd/src/net/osmand/plus/download/local/LocalGroup.java b/OsmAnd/src/net/osmand/plus/download/local/LocalGroup.java index ef8d1a63644..bbfdc6e4cb8 100644 --- a/OsmAnd/src/net/osmand/plus/download/local/LocalGroup.java +++ b/OsmAnd/src/net/osmand/plus/download/local/LocalGroup.java @@ -18,8 +18,6 @@ public class LocalGroup { private final LocalItemType type; private final Map items = new HashMap<>(); - private long sizeLimit = -1; - public LocalGroup(@NonNull LocalItemType type) { this.type = type; } @@ -56,29 +54,12 @@ public void removeItem(@NonNull OsmandApplication app, @NonNull BaseLocalItem it } } - public void setSizeLimit(long sizeLimit) { - this.sizeLimit = sizeLimit; - } - @NonNull public String getSizeDescription(@NonNull Context context) { - String formattedSize = AndroidUtils.formatSize(context, getSize()); - return hasSizeLimit() ? "≥ " + formattedSize : formattedSize; + return LocalItemUtils.getSizeDescription(context, items.values()); } public long getSize() { - return hasSizeLimit() ? sizeLimit : getTotalItemsSize(); - } - - private long getTotalItemsSize() { - long size = 0; - for (BaseLocalItem item : items.values()) { - size += item.getSize(); - } - return size; - } - - public boolean hasSizeLimit() { - return sizeLimit > 0; + return LocalItemUtils.calculateItemsSize(items.values()); } } diff --git a/OsmAnd/src/net/osmand/plus/download/local/LocalItem.java b/OsmAnd/src/net/osmand/plus/download/local/LocalItem.java index add6ae0f083..42489348eed 100644 --- a/OsmAnd/src/net/osmand/plus/download/local/LocalItem.java +++ b/OsmAnd/src/net/osmand/plus/download/local/LocalItem.java @@ -19,6 +19,7 @@ public class LocalItem extends BaseLocalItem implements Comparable { private final String path; private final String fileName; private long size; + private long sizeCalculationLimit = -1; @Nullable private Object attachedObject; @@ -49,9 +50,16 @@ public String getFileName() { return fileName; } + @NonNull + @Override + public String getSizeDescription(@NonNull Context context) { + String size = super.getSizeDescription(context); + return isSizeCalculationLimitReached() ? "≥ " + size : size; + } + @Override public long getSize() { - return size; + return isSizeCalculationLimitReached() ? sizeCalculationLimit : size; } public void setSize(long size) { @@ -97,6 +105,14 @@ public String getDescription(@NonNull Context context) { return LocalItemUtils.getItemDescription(context, this); } + public void setSizeCalculationLimit(long sizeCalculationLimit) { + this.sizeCalculationLimit = sizeCalculationLimit; + } + + public boolean isSizeCalculationLimitReached() { + return sizeCalculationLimit > 0 && sizeCalculationLimit <= size; + } + @Override public int compareTo(LocalItem item) { return fileName.compareTo(item.fileName); diff --git a/OsmAnd/src/net/osmand/plus/download/local/LocalItemUtils.java b/OsmAnd/src/net/osmand/plus/download/local/LocalItemUtils.java index 88d8d552154..54c930c8b78 100644 --- a/OsmAnd/src/net/osmand/plus/download/local/LocalItemUtils.java +++ b/OsmAnd/src/net/osmand/plus/download/local/LocalItemUtils.java @@ -52,6 +52,7 @@ import java.io.File; import java.text.DateFormat; import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Locale; @@ -283,20 +284,39 @@ public static CharSequence getItemName(@NonNull Context context, @NonNull LocalI @NonNull public static String getItemDescription(@NonNull Context context, @NonNull LocalItem item) { - long size = item.getSize(); - String formattedSize = AndroidUtils.formatSize(context, item.getSize()); + String formattedSize = item.getSizeDescription(context); if (item.getType() == CACHE) { return formattedSize; } else if (item.getType() == COLOR_DATA) { return ColorsPaletteUtils.getPaletteTypeName(context, item.getFile()); } else { String formattedDate = getFormattedDate(new Date(item.getLastModified())); - if (size > 0) { - return context.getString(R.string.ltr_or_rtl_combine_via_bold_point, formattedSize, formattedDate); - } else { - return formattedDate; + return context.getString(R.string.ltr_or_rtl_combine_via_bold_point, formattedSize, formattedDate); + } + } + + @NonNull + public static String getSizeDescription(@NonNull Context context, @NonNull Collection items) { + String formattedSize = AndroidUtils.formatSize(context, calculateItemsSize(items)); + String prefix = isSizeCalculated(items) ? "" : "≥ "; + return prefix + formattedSize; + } + + public static boolean isSizeCalculated(@NonNull Collection items) { + for (BaseLocalItem item : items) { + if (item instanceof LocalItem localItem && localItem.isSizeCalculationLimitReached()) { + return false; } } + return true; + } + + public static long calculateItemsSize(@NonNull Collection items) { + long size = 0; + for (BaseLocalItem item : items) { + size += item.getSize(); + } + return size; } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/download/local/LocalItemsLoaderTask.java b/OsmAnd/src/net/osmand/plus/download/local/LocalItemsLoaderTask.java index ca682491d9b..cfc118f29e0 100644 --- a/OsmAnd/src/net/osmand/plus/download/local/LocalItemsLoaderTask.java +++ b/OsmAnd/src/net/osmand/plus/download/local/LocalItemsLoaderTask.java @@ -17,7 +17,7 @@ public class LocalItemsLoaderTask extends AsyncTask> { private static final long BYTES_IN_MB = 1024 * 1024; - private static final long TILES_SIZE_CALCULATION_LIMIT = 5 * BYTES_IN_MB; + private static final long TILES_SIZE_CALCULATION_LIMIT = 50 * BYTES_IN_MB; private final OsmandApplication app; private final OsmandSettings settings; diff --git a/OsmAnd/src/net/osmand/plus/download/local/dialogs/LiveGroupItem.java b/OsmAnd/src/net/osmand/plus/download/local/dialogs/LiveGroupItem.java index dfc9316d0f4..fd42972b193 100644 --- a/OsmAnd/src/net/osmand/plus/download/local/dialogs/LiveGroupItem.java +++ b/OsmAnd/src/net/osmand/plus/download/local/dialogs/LiveGroupItem.java @@ -11,7 +11,6 @@ import net.osmand.plus.download.local.BaseLocalItem; import net.osmand.plus.download.local.LocalItem; import net.osmand.plus.download.local.LocalItemType; -import net.osmand.plus.utils.AndroidUtils; import java.util.ArrayList; import java.util.Date; @@ -51,8 +50,8 @@ public CharSequence getName(@NonNull Context context) { @NonNull @Override public String getDescription(@NonNull Context context) { + String size = getSizeDescription(context); String formattedDate = getFormattedDate(new Date(getLastModified())); - String size = AndroidUtils.formatSize(context, getSize()); return context.getString(R.string.ltr_or_rtl_combine_via_bold_point, size, formattedDate); } diff --git a/OsmAnd/src/net/osmand/plus/download/local/dialogs/LocalItemInfoCard.java b/OsmAnd/src/net/osmand/plus/download/local/dialogs/LocalItemInfoCard.java index 6c68914a532..2d0fe900511 100644 --- a/OsmAnd/src/net/osmand/plus/download/local/dialogs/LocalItemInfoCard.java +++ b/OsmAnd/src/net/osmand/plus/download/local/dialogs/LocalItemInfoCard.java @@ -46,7 +46,7 @@ protected void updateContent() { long size = localItem.getSize(); View sizeRow = container.findViewById(R.id.size); AndroidUiHelper.updateVisibility(sizeRow, size > 0); - setupRow(sizeRow, getString(R.string.shared_string_size), AndroidUtils.formatSize(app, size), true); + setupRow(sizeRow, getString(R.string.shared_string_size), localItem.getSizeDescription(app), true); } private void setupRow(@NonNull View view, @Nullable String title, @Nullable String description, boolean lastItem) { diff --git a/OsmAnd/src/net/osmand/plus/download/local/dialogs/viewholders/HeaderViewHolder.java b/OsmAnd/src/net/osmand/plus/download/local/dialogs/viewholders/HeaderViewHolder.java index ec6fd32d3a2..9d014291d58 100644 --- a/OsmAnd/src/net/osmand/plus/download/local/dialogs/viewholders/HeaderViewHolder.java +++ b/OsmAnd/src/net/osmand/plus/download/local/dialogs/viewholders/HeaderViewHolder.java @@ -7,9 +7,8 @@ import androidx.recyclerview.widget.RecyclerView; import net.osmand.plus.R; -import net.osmand.plus.download.local.BaseLocalItem; +import net.osmand.plus.download.local.LocalItemUtils; import net.osmand.plus.download.local.dialogs.HeaderGroup; -import net.osmand.plus.utils.AndroidUtils; public class HeaderViewHolder extends RecyclerView.ViewHolder { @@ -24,14 +23,6 @@ public HeaderViewHolder(@NonNull View itemView) { public void bindView(@NonNull HeaderGroup group) { title.setText(group.getName()); - count.setText(AndroidUtils.formatSize(itemView.getContext(), getSize(group))); - } - - public long getSize(@NonNull HeaderGroup group) { - long size = 0; - for (BaseLocalItem item : group.getItems()) { - size += item.getSize(); - } - return size; + count.setText(LocalItemUtils.getSizeDescription(itemView.getContext(), group.getItems())); } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AdditionalInfoBundle.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AdditionalInfoBundle.java index 7c94d010081..b76b5d8fb3f 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AdditionalInfoBundle.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AdditionalInfoBundle.java @@ -31,7 +31,7 @@ public class AdditionalInfoBundle { private static final List HIDDEN_EXTENSIONS = Arrays.asList( COLOR_NAME_EXTENSION, ICON_NAME_EXTENSION, BACKGROUND_TYPE_EXTENSION, PROFILE_TYPE_EXTENSION, ADDRESS_EXTENSION, AMENITY_ORIGIN_EXTENSION, - NAME, TYPE, SUBTYPE + TYPE, SUBTYPE ); private final OsmandApplication app; diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityUIHelper.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityUIHelper.java index 98157033d66..8ba381d500d 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityUIHelper.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityUIHelper.java @@ -303,6 +303,7 @@ private AmenityInfoRow createLocalizedAmenityInfoRow(@NonNull Context context, @ } collapsableView = new CollapsableView(llv, this, true); } + hasWiki = false; // allow another hasWiki try for infoRow at return return createAmenityInfoRow(context, headerKey, headerValue, collapsableView); } @@ -390,7 +391,7 @@ private AmenityInfoRow createAmenityInfoRow(@NonNull Context context, wikiAmenity.setAdditionalInfo(additionalInfoFiltered); wikiAmenity.setLocation(getLatLon()); String name = additionalInfoFiltered.get("name"); - if (Algorithms.isEmpty(name)) { + if (!Algorithms.isEmpty(name)) { wikiAmenity.setName(name); } diff --git a/OsmAnd/src/net/osmand/plus/myplaces/tracks/filters/viewholders/FilterRangeViewHolder.kt b/OsmAnd/src/net/osmand/plus/myplaces/tracks/filters/viewholders/FilterRangeViewHolder.kt index f250f47055f..88abaf9b4f2 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/tracks/filters/viewholders/FilterRangeViewHolder.kt +++ b/OsmAnd/src/net/osmand/plus/myplaces/tracks/filters/viewholders/FilterRangeViewHolder.kt @@ -231,6 +231,9 @@ open class FilterRangeViewHolder( measureUnitType: MeasureUnitType, value: String): OsmAndFormatter.FormattedValue { val metricsConstants: MetricsConstants = app.settings.METRIC_SYSTEM.get() + val params = OsmAndFormatter.OsmAndFormatterParams() + params.setExtraDecimalPrecision(3) + params.setForcePreciseValue(true) return when (measureUnitType) { MeasureUnitType.SPEED -> OsmAndFormatter.getFormattedSpeedValue(value.toFloat(), app) MeasureUnitType.ALTITUDE -> OsmAndFormatter.getFormattedAltitudeValue( @@ -240,7 +243,8 @@ open class FilterRangeViewHolder( MeasureUnitType.DISTANCE -> OsmAndFormatter.getFormattedDistanceValue( value.toFloat(), - app) + app, + params) MeasureUnitType.TIME_DURATION -> OsmAndFormatter.FormattedValue( value.toFloat() / 1000 / 60, diff --git a/OsmAnd/src/net/osmand/plus/plugins/odb/VehicleMetricsPlugin.kt b/OsmAnd/src/net/osmand/plus/plugins/odb/VehicleMetricsPlugin.kt index 5236deb32d7..ae9d8012084 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/odb/VehicleMetricsPlugin.kt +++ b/OsmAnd/src/net/osmand/plus/plugins/odb/VehicleMetricsPlugin.kt @@ -378,6 +378,7 @@ class VehicleMetricsPlugin(app: OsmandApplication) : OsmandPlugin(app), socket = null val lastConnectedDeviceInfo = connectedDeviceInfo connectedDeviceInfo = null + setLastConnectedDevice(null) if (lastConnectedDeviceInfo != null) { onDisconnected(lastConnectedDeviceInfo) } @@ -460,6 +461,9 @@ class VehicleMetricsPlugin(app: OsmandApplication) : OsmandPlugin(app), connectedDeviceInfo = null connectToObd(activity, deviceInfo) } + } else { + disconnect() + connectToObd(activity, deviceInfo) } return socket?.isConnected == true } diff --git a/OsmAnd/src/net/osmand/plus/plugins/rastermaps/DownloadTilesFragment.java b/OsmAnd/src/net/osmand/plus/plugins/rastermaps/DownloadTilesFragment.java index 49239b5ab10..7ab21551547 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/rastermaps/DownloadTilesFragment.java +++ b/OsmAnd/src/net/osmand/plus/plugins/rastermaps/DownloadTilesFragment.java @@ -9,8 +9,6 @@ import android.graphics.Bitmap; import android.os.AsyncTask; import android.os.Bundle; -import android.os.Handler; -import android.os.Message; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -49,12 +47,12 @@ import net.osmand.plus.utils.ColorUtilities; import net.osmand.plus.utils.OsmAndFormatter; import net.osmand.plus.utils.UiUtilities; -import net.osmand.plus.views.OsmandMapTileView.TouchListener; -import net.osmand.plus.widgets.dialogbutton.DialogButtonType; import net.osmand.plus.views.OsmandMapTileView; +import net.osmand.plus.views.OsmandMapTileView.TouchListener; import net.osmand.plus.views.layers.MapTileLayer; import net.osmand.plus.views.layers.base.OsmandMapLayer; import net.osmand.plus.widgets.dialogbutton.DialogButton; +import net.osmand.plus.widgets.dialogbutton.DialogButtonType; import java.text.MessageFormat; import java.util.List; @@ -78,7 +76,6 @@ public class DownloadTilesFragment extends BaseOsmAndFragment implements IMapLoc private View view; private View mapWindow; - private boolean mapWindowTouched; private boolean wasDrawerDisabled; private TextView tvDownloadTilesDesc; @@ -109,6 +106,7 @@ public class DownloadTilesFragment extends BaseOsmAndFragment implements IMapLoc private SelectTilesDownloadTypeAlertDialog alertDialog; private MapLayerType layerToDownload; + @Nullable private LockableScrollView scrollView; private IMapLocationListener mapLocationListener; private TouchListener touchListener; @@ -187,40 +185,43 @@ public void onGlobalLayout() { }); setupDownloadButton(); showHideMapControls(false); - if (portraitMode) { - setupScrollableMapView(); - } + setupScrollableMapView(); return view; } @SuppressLint("ClickableViewAccessibility") private void setupScrollableMapView() { - scrollView = view.findViewById(R.id.scroll_view); - mapLocationListener = getMapLocationListener(); - touchListener = getTouchListener(); + if (portraitMode) { + scrollView = view.findViewById(R.id.scroll_view); + mapLocationListener = getMapLocationListener(); + touchListener = getTouchListener(); - view.findViewById(R.id.map_window_container).setOnTouchListener((v, event) -> { - if (event.getAction() == MotionEvent.ACTION_DOWN){ - scrollView.setScrollingEnabled(false); - } - return false; - }); - scrollView.getViewTreeObserver().addOnScrollChangedListener(() -> { - OsmandMapTileView mapView = DownloadTilesFragment.this.mapView; - if (mapView != null) { - RotatedTileBox tileBox = mapView.getCurrentRotatedTileBox(); - View mapWindow = view.findViewById(R.id.map_window); - int[] xy = new int[2]; - mapWindow.getLocationOnScreen(xy); - int marginTop = xy[1]; - mapView.fitLocationToMap(lat, lon, tileBox.getZoom(), mapWindow.getWidth(), mapWindow.getHeight(), - marginTop, false); + view.findViewById(R.id.map_window_container).setOnTouchListener((v, event) -> { + if (event.getAction() == MotionEvent.ACTION_DOWN && scrollView != null) { + scrollView.setScrollingEnabled(false); + } + return false; + }); + if (scrollView != null) { + scrollView.getViewTreeObserver().addOnScrollChangedListener(() -> { + OsmandMapTileView mapView = DownloadTilesFragment.this.mapView; + if (mapView != null) { + RotatedTileBox tileBox = mapView.getCurrentRotatedTileBox(); + View mapWindow = view.findViewById(R.id.map_window); + int[] xy = new int[2]; + mapWindow.getLocationOnScreen(xy); + int marginTop = xy[1]; + mapView.fitLocationToMap(lat, lon, tileBox.getZoom(), mapWindow.getWidth(), + mapWindow.getHeight(), marginTop, false); + } + }); } - }); + } } - private IMapLocationListener getMapLocationListener(){ + @NonNull + private IMapLocationListener getMapLocationListener() { return (v, v1, o) -> { QuadRect rect = getLatLonRectOfMapWindow(); LatLon mapWindowCenter = new LatLon(rect.centerY(), rect.centerX()); @@ -229,9 +230,10 @@ private IMapLocationListener getMapLocationListener(){ }; } - private TouchListener getTouchListener(){ + @NonNull + private TouchListener getTouchListener() { return event -> { - if (event.getAction() == MotionEvent.ACTION_UP){ + if (event.getAction() == MotionEvent.ACTION_UP && scrollView != null) { scrollView.setScrollingEnabled(true); } }; @@ -510,6 +512,7 @@ public void onResume() { mapView.addMapLocationListener(this); handler.startUpdatesIfNotRunning(); showHideMapControls(false); + if (portraitMode) { mapView.addMapLocationListener(mapLocationListener); mapView.addTouchListener(touchListener); @@ -699,35 +702,4 @@ public static void showInstance(@NonNull FragmentManager fragmentManager, boolea .commitAllowingStateLoss(); } } - - @SuppressWarnings("deprecation") - private static class UpdateTilesHandler extends Handler { - - private static final int UPDATE_TILES_MESSAGE_ID = 0; - private static final long UPDATE_TILES_PREVIEW_INTERVAL = 500; - - private final Runnable updateTilesTask; - - public UpdateTilesHandler(@NonNull Runnable updateTilesTask) { - this.updateTilesTask = updateTilesTask; - } - - public void startUpdatesIfNotRunning() { - if (!hasMessages(UPDATE_TILES_MESSAGE_ID)) { - sendEmptyMessage(UPDATE_TILES_MESSAGE_ID); - } - } - - public void stopUpdates() { - removeMessages(UPDATE_TILES_MESSAGE_ID); - } - - @Override - public void handleMessage(@NonNull Message message) { - if (message.what == UPDATE_TILES_MESSAGE_ID) { - updateTilesTask.run(); - sendEmptyMessageDelayed(UPDATE_TILES_MESSAGE_ID, UPDATE_TILES_PREVIEW_INTERVAL); - } - } - } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/plugins/rastermaps/UpdateTilesHandler.java b/OsmAnd/src/net/osmand/plus/plugins/rastermaps/UpdateTilesHandler.java new file mode 100644 index 00000000000..9ecebcd090c --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/plugins/rastermaps/UpdateTilesHandler.java @@ -0,0 +1,37 @@ +package net.osmand.plus.plugins.rastermaps; + +import android.os.Handler; +import android.os.Message; + +import androidx.annotation.NonNull; + +@SuppressWarnings("deprecation") +class UpdateTilesHandler extends Handler { + + private static final int UPDATE_TILES_MESSAGE_ID = 0; + private static final long UPDATE_TILES_PREVIEW_INTERVAL = 500; + + private final Runnable updateTilesTask; + + public UpdateTilesHandler(@NonNull Runnable updateTilesTask) { + this.updateTilesTask = updateTilesTask; + } + + public void startUpdatesIfNotRunning() { + if (!hasMessages(UPDATE_TILES_MESSAGE_ID)) { + sendEmptyMessage(UPDATE_TILES_MESSAGE_ID); + } + } + + public void stopUpdates() { + removeMessages(UPDATE_TILES_MESSAGE_ID); + } + + @Override + public void handleMessage(@NonNull Message message) { + if (message.what == UPDATE_TILES_MESSAGE_ID) { + updateTilesTask.run(); + sendEmptyMessageDelayed(UPDATE_TILES_MESSAGE_ID, UPDATE_TILES_PREVIEW_INTERVAL); + } + } +} diff --git a/OsmAnd/src/net/osmand/plus/profiles/LocationIcon.java b/OsmAnd/src/net/osmand/plus/profiles/LocationIcon.java index fc84b3df647..3f226a71e21 100644 --- a/OsmAnd/src/net/osmand/plus/profiles/LocationIcon.java +++ b/OsmAnd/src/net/osmand/plus/profiles/LocationIcon.java @@ -72,7 +72,7 @@ public static boolean isDefaultModel(@NonNull String name) { } @Nullable - public static String getIconForDefaultModel(@NonNull String modelName){ + public static String getIconForDefaultModel(@NonNull String modelName) { if (!isModel(modelName)) { return null; } @@ -97,7 +97,7 @@ public static boolean isModelRepresented(@NonNull String name) { return false; } - private static List getDefaultIcons(){ + private static List getDefaultIcons() { return Arrays.asList(STATIC_DEFAULT, STATIC_CAR, STATIC_BICYCLE, MOVEMENT_DEFAULT, MOVEMENT_CAR, MOVEMENT_NAUTICAL); } @@ -160,6 +160,4 @@ public static String getActualIconName(@NonNull String name, boolean nav) { } return name; } - - } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/quickaction/MapButtonAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/quickaction/MapButtonAppearanceFragment.java index c23b2a613c5..b4a5a7604ce 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/MapButtonAppearanceFragment.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/MapButtonAppearanceFragment.java @@ -207,7 +207,7 @@ private void updateButtons() { String iconName = appearanceParams.getIconName(); if (Algorithms.isEmpty(iconName)) { params = new ButtonAppearanceParams(appearanceParams); - params.setIconName(buttonState.getPreferredIconName(iconName)); + params.setIconName(buttonState.getDefaultIconName()); } mapButtonCard.updateButton(params); applyButton.setEnabled(!Algorithms.objectEquals(originalAppearanceParams, appearanceParams)); @@ -215,7 +215,7 @@ private void updateButtons() { private void resetAppearance() { ButtonAppearanceParams defaultParams = buttonState.createDefaultAppearanceParams(); - appearanceParams.setIconName(defaultParams.getIconName()); + appearanceParams.setIconName(null); appearanceParams.setSize(defaultParams.getSize()); appearanceParams.setOpacity(defaultParams.getOpacity()); appearanceParams.setCornerRadius(defaultParams.getCornerRadius()); diff --git a/OsmAnd/src/net/osmand/plus/quickaction/MapButtonIconController.java b/OsmAnd/src/net/osmand/plus/quickaction/MapButtonIconController.java index 51c34ee1680..9c211654ff3 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/MapButtonIconController.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/MapButtonIconController.java @@ -64,8 +64,8 @@ public void setSelectedIconKey(@Nullable String selectedIconKey) { @Override protected void initIconCategories() { - initCustomCategory(); askInitDynamicCategory(); + initCustomCategory(); super.initIconCategories(); } @@ -93,11 +93,11 @@ protected void initCustomCategory() { } protected void askInitDynamicCategory() { - if (buttonState instanceof QuickActionButtonState state && state.isSingleAction()) { +// if (buttonState instanceof QuickActionButtonState state && state.isSingleAction()) { String translatedName = app.getString(R.string.shared_string_dynamic); dynamicCategory = new IconsCategory(DYNAMIC_KEY, translatedName, new ArrayList<>(), true); categories.add(dynamicCategory); - } +// } } public void updateAfterReset() { @@ -115,7 +115,7 @@ public void setSelectedCategory(@NonNull IconsCategory category) { @NonNull @Override protected IconsCategory findInitialIconCategory() { - return findIconCategory(buttonState.getSavedIconName()); + return findIconCategory(appearanceParams.getIconName()); } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/quickaction/QuickActionsWidget.java b/OsmAnd/src/net/osmand/plus/quickaction/QuickActionsWidget.java index 8c1ae350253..b003b46249e 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/QuickActionsWidget.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/QuickActionsWidget.java @@ -6,7 +6,6 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; -import android.app.Activity; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; @@ -196,14 +195,15 @@ private void updateControls(int position) { } private View createPageView(@NonNull ViewGroup container, int position) { + Context context = getContext(); boolean light = settings.isLightContent() && !app.getDaynightHelper().isNightMode(); - LayoutInflater inflater = UiUtilities.getInflater(container.getContext(), !light); + LayoutInflater inflater = UiUtilities.getInflater(context, !light); View page = inflater.inflate(R.layout.quick_action_widget_page, container, false); GridLayout gridLayout = page.findViewById(R.id.grid); QuickActionButtonState buttonState = selectedButton.getButtonState(); - boolean land = !AndroidUiHelper.isOrientationPortrait((Activity) getContext()); + boolean land = !AndroidUiHelper.isOrientationPortrait(context); int maxItems = actions.size() == 1 ? 1 : ACTIONS_PER_PAGE; for (int i = 0; i < maxItems; i++) { @@ -214,7 +214,7 @@ private View createPageView(@NonNull ViewGroup container, int position) { actions.get(i + (position * ACTIONS_PER_PAGE))); ((ImageView) view.findViewById(imageView)) - .setImageResource(action.getIconRes(app)); + .setImageResource(action.getIconRes(context)); ((TextView) view.findViewById(R.id.title)) .setText(action.getActionText(app)); diff --git a/OsmAnd/src/net/osmand/plus/quickaction/actions/NavStartStopAction.java b/OsmAnd/src/net/osmand/plus/quickaction/actions/NavStartStopAction.java index 50ab2da7421..923a9df9280 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/actions/NavStartStopAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/actions/NavStartStopAction.java @@ -22,7 +22,7 @@ public class NavStartStopAction extends QuickAction { private static final String KEY_DIALOG = "dialog"; public static final QuickActionType TYPE = new QuickActionType(NAV_START_STOP_ACTION_ID, - "nav.startstop", NavStartStopAction .class) + "nav.startstop", NavStartStopAction.class) .nameRes(R.string.shared_string_navigation).iconRes(R.drawable.ic_action_start_navigation).nonEditable() .category(QuickActionType.NAVIGATION) .nameActionRes(R.string.quick_action_verb_start_stop); @@ -90,8 +90,9 @@ public String getActionText(@NonNull OsmandApplication app) { public int getIconRes(Context context) { OsmandApplication app = (OsmandApplication) context.getApplicationContext(); RoutingHelper helper = app.getRoutingHelper(); - if (!helper.isRoutePlanningMode() && !helper.isFollowingMode()) { - return ((MapActivity) context).getMapActions().getRouteMode().getIconRes(); + + if (!helper.isRoutePlanningMode() && !helper.isFollowingMode() && context instanceof MapActivity activity) { + return activity.getMapActions().getRouteMode().getIconRes(); } return helper.getAppMode().getIconRes(); } diff --git a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHidePoiAction.java b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHidePoiAction.java index 254f0ca5e74..ffdbcdd8b4a 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHidePoiAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHidePoiAction.java @@ -19,18 +19,18 @@ import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; -import net.osmand.plus.widgets.ctxmenu.ContextMenuAdapter; -import net.osmand.plus.widgets.ctxmenu.ViewCreator; -import net.osmand.plus.widgets.ctxmenu.data.ContextMenuItem; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.utils.UiUtilities; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.poi.PoiFiltersHelper; import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.quickaction.QuickAction; import net.osmand.plus.quickaction.QuickActionType; import net.osmand.plus.render.RenderingIcons; +import net.osmand.plus.utils.UiUtilities; +import net.osmand.plus.widgets.ctxmenu.ContextMenuAdapter; +import net.osmand.plus.widgets.ctxmenu.ViewCreator; +import net.osmand.plus.widgets.ctxmenu.data.ContextMenuItem; import net.osmand.util.Algorithms; import org.json.JSONArray; @@ -40,7 +40,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.Set; public class ShowHidePoiAction extends QuickAction { private static final int defaultActionNameId = R.string.poi; @@ -108,7 +107,7 @@ public void execute(@NonNull MapActivity mapActivity) { boolean currentFilters = isCurrentFilters(app, poiFilters); mapActivity.getFragmentsHelper().closeQuickSearch(); - helper.clearGeneralSelectedPoiFilters(); + helper.clearAllSelectedPoiFilters(); if (!currentFilters) { for (PoiUIFilter filter : poiFilters) { if (filter.isStandardFilter()) { diff --git a/OsmAnd/src/net/osmand/plus/render/RendererRegistry.java b/OsmAnd/src/net/osmand/plus/render/RendererRegistry.java index e93e11d3d1c..a4615c9df4b 100644 --- a/OsmAnd/src/net/osmand/plus/render/RendererRegistry.java +++ b/OsmAnd/src/net/osmand/plus/render/RendererRegistry.java @@ -57,6 +57,8 @@ public class RendererRegistry { public static final String OSMASSISTANT_RENDER = "OSM Assistant"; public static final String PUBLICTRANSPORTROUTES_RENDER = "Public transport routes"; + private static boolean IGNORE_CACHED_STYLES = false; // enable to overwrite RENDERERS_DIR styles (debug) + private final OsmandApplication app; private RenderingRulesStorage defaultRender; @@ -243,7 +245,7 @@ public InputStream getInputStream(String name) throws FileNotFoundException { name = DEFAULT_RENDER; } File fl = getFileForInternalStyle(name); - if (fl.exists()) { + if (fl.exists() && !IGNORE_CACHED_STYLES) { is = new FileInputStream(fl); } else { copyFileForInternalStyle(name); diff --git a/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java b/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java index c3956a050be..0f7a2e28f61 100644 --- a/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java +++ b/OsmAnd/src/net/osmand/plus/resources/ResourceManager.java @@ -800,9 +800,9 @@ private void unpackBundledAssets(@NonNull AssetManager assetManager, @NonNull Fi boolean forceCheck) throws IOException, XmlPullParserException { List assetEntries = DownloadOsmandIndexesHelper.getBundledAssets(assetManager); for (AssetEntry asset : assetEntries) { - String[] modes = asset.combinedMode.split("\\|"); + String[] modes = asset.mode.split("\\|"); if (modes.length == 0) { - log.error("Mode '" + asset.combinedMode + "' is not valid"); + log.error("Mode '" + asset.mode + "' is not valid"); continue; } String installMode = null; @@ -845,8 +845,8 @@ private void unpackBundledAssets(@NonNull AssetManager assetManager, @NonNull Fi if (ASSET_COPY_MODE__copyOnlyIfDoesNotExist.equals(copyMode)) { if (!exists) { shouldCopy = true; - } else if (asset.version != null && - destinationFile.lastModified() < asset.version.getTime()) { + } else if (asset.dateVersion != null && + destinationFile.lastModified() < asset.dateVersion.getTime()) { shouldCopy = true; } } @@ -1493,16 +1493,26 @@ public BinaryMapIndexReader[] getTransportRoutingMapFiles() { return readers.toArray(new BinaryMapIndexReader[0]); } - public BinaryMapIndexReader[] getQuickSearchFiles() { + public BinaryMapIndexReader[] getQuickSearchFiles(List ignoreExtensions) { Collection fileReaders = getFileReaders(); List readers = new ArrayList<>(fileReaders.size()); for (BinaryMapReaderResource r : fileReaders) { - BinaryMapIndexReader shallowReader = r.getShallowReader(); - if (shallowReader != null && (shallowReader.containsPoiData() || shallowReader.containsAddressData()) && - !r.getFileName().endsWith(IndexConstants.BINARY_TRAVEL_GUIDE_MAP_INDEX_EXT)) { - BinaryMapIndexReader reader = r.getReader(BinaryMapReaderResourceType.QUICK_SEARCH); - if (reader != null) { - readers.add(reader); + boolean allow = true; + if (!Algorithms.isEmpty(ignoreExtensions)) { + for (String ext : ignoreExtensions) { + if (r.getFileName().endsWith(ext)) { + allow = false; + break; + } + } + } + if (allow) { + BinaryMapIndexReader shallowReader = r.getShallowReader(); + if (shallowReader != null && (shallowReader.containsPoiData() || shallowReader.containsAddressData())) { + BinaryMapIndexReader reader = r.getReader(BinaryMapReaderResourceType.QUICK_SEARCH); + if (reader != null) { + readers.add(reader); + } } } } diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java b/OsmAnd/src/net/osmand/plus/routing/RouteCalculationResult.java index 8beb6f12a94..5b6cb4f75f9 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.LatLon; import net.osmand.data.LocationPoint; import net.osmand.data.QuadRect; -import net.osmand.gpx.GPXFile; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.settings.backend.ApplicationMode; @@ -41,7 +40,10 @@ public class RouteCalculationResult { private static final double DISTANCE_CLOSEST_TO_INTERMEDIATE = 3000; private static final double DISTANCE_THRESHOLD_TO_INTERMEDIATE = 25; - private static final double DISTANCE_THRESHOLD_TO_INTRODUCE_FIRST_AND_LAST_POINTS = 50; + private static final double DISTANCE_THRESHOLD_TO_INTRODUCE_FIRST_AND_LAST_POINTS = 15; + + public static final String FIRST_LAST_LOCATION_PROVIDER = "FirstLastLocationProvider"; + // could not be null and immodifiable! private final List locations; private final List directions; @@ -809,7 +811,12 @@ private void removeUnnecessaryGoAhead(List directions) { public static void checkForDuplicatePoints(List locations, List directions) { // for (int i = 0; i < locations.size() - 1; ) { - if (locations.get(i).distanceTo(locations.get(i + 1)) == 0) { + Location loc = locations.get(i); + Location nextLoc = locations.get(i + 1); + if (loc.distanceTo(nextLoc) == 0) { + if (FIRST_LAST_LOCATION_PROVIDER.equals(loc.getProvider())) { + nextLoc.setProvider(FIRST_LAST_LOCATION_PROVIDER); + } locations.remove(i); if (directions != null) { for (RouteDirectionInfo info : directions) { @@ -875,17 +882,19 @@ private static boolean introduceFirstPoint(List locations, List segs, Location start) { Location firstLocation = Algorithms.isEmpty(locations) ? null : locations.get(0); if (firstLocation != null && firstLocation.distanceTo(start) > DISTANCE_THRESHOLD_TO_INTRODUCE_FIRST_AND_LAST_POINTS) { + Location startLocation = new Location(start); + startLocation.setProvider(FIRST_LAST_LOCATION_PROVIDER); // Start location can have wrong altitude double firstValidAltitude = getFirstValidAltitude(locations); if (!Double.isNaN(firstValidAltitude)) { - start.setAltitude(firstValidAltitude); + startLocation.setAltitude(firstValidAltitude); } // add start point - locations.add(0, start); + locations.add(0, startLocation); // Add artificial route segment if (segs != null) { - RouteSegmentResult straightSegment = generateStraightLineSegment(start, firstLocation); + RouteSegmentResult straightSegment = generateStraightLineSegment(startLocation, firstLocation); segs.add(0, straightSegment); } if (directions != null && !directions.isEmpty()) { @@ -916,11 +925,7 @@ private static boolean introduceLastPoint(List locations, List segs, LatLon end) { if (!locations.isEmpty()) { Location lastFoundLocation = locations.get(locations.size() - 1); - - Location endLocation = new Location(lastFoundLocation.getProvider()); - endLocation.setLatitude(end.getLatitude()); - endLocation.setLongitude(end.getLongitude()); - + Location endLocation = new Location(FIRST_LAST_LOCATION_PROVIDER, end.getLatitude(), end.getLongitude()); if (lastFoundLocation.distanceTo(endLocation) > DISTANCE_THRESHOLD_TO_INTRODUCE_FIRST_AND_LAST_POINTS) { int type = TurnType.C; if (directions != null && !directions.isEmpty()) { @@ -943,7 +948,7 @@ private static boolean introduceLastPoint(List locations, List 120 * 1000) { - waitAnnouncedSpeedLimit = ms; + // Wait 120 seconds after previous announcement + if (now - lastAnnouncedSpeedLimit > SPEEDING_ANNOUNCEMENTS_INTERVAL_MS) { + waitAnnouncedSpeedLimit = now; } } else { - // If we wait before more than 20 sec (reset counter) - if (ms - waitAnnouncedSpeedLimit > 20 * 1000) { + // If we wait before more than 30 seconds (reset counter) + if (now - waitAnnouncedSpeedLimit > SPEEDING_ANNOUNCEMENT_CANCEL_MS) { waitAnnouncedSpeedLimit = 0; - } else if (router.getSettings().SPEAK_SPEED_LIMIT.get() && ms - waitAnnouncedSpeedLimit > 10 * 1000) { - CommandBuilder p = getNewCommandPlayerToPlay(); - if (p != null) { - lastAnnouncedSpeedLimit = ms; - waitAnnouncedSpeedLimit = 0; - p.speedAlarm(maxSpeed, speed); + } else if (router.getSettings().SPEAK_SPEED_LIMIT.get()) { + // Wait 5 seconds before playing announcement + if (now - waitAnnouncedSpeedLimit > SPEEDING_ANNOUNCEMENT_WAITING_MS) { + CommandBuilder p = getNewCommandPlayerToPlay(); + if (p != null) { + lastAnnouncedSpeedLimit = now; + waitAnnouncedSpeedLimit = 0; + p.speedAlarm(maxSpeed, speed); + } + play(p); } - play(p); } } } diff --git a/OsmAnd/src/net/osmand/plus/search/QuickSearchHelper.java b/OsmAnd/src/net/osmand/plus/search/QuickSearchHelper.java index cca0e65b659..ec1e23a845b 100644 --- a/OsmAnd/src/net/osmand/plus/search/QuickSearchHelper.java +++ b/OsmAnd/src/net/osmand/plus/search/QuickSearchHelper.java @@ -158,7 +158,11 @@ private void refreshFilterOrders() { } public void setRepositoriesForSearchUICore(OsmandApplication app) { - BinaryMapIndexReader[] binaryMapIndexReaderArray = app.getResourceManager().getQuickSearchFiles(); + List ignoreExtensions = new ArrayList<>(); + if (!app.getSettings().SHOW_TRAVEL.get()) { + ignoreExtensions.add(IndexConstants.BINARY_TRAVEL_GUIDE_MAP_INDEX_EXT); + } + BinaryMapIndexReader[] binaryMapIndexReaderArray = app.getResourceManager().getQuickSearchFiles(ignoreExtensions); core.getSearchSettings().setOfflineIndexes(Arrays.asList(binaryMapIndexReaderArray)); core.getSearchSettings().setRegions(app.getRegions()); } diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomizationFields.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomizationFields.java new file mode 100644 index 00000000000..a0049a8472a --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmAndAppCustomizationFields.java @@ -0,0 +1,10 @@ +package net.osmand.plus.settings.backend; + +import net.osmand.plus.R; + +public class OsmAndAppCustomizationFields { + + public static int ROUTE_START_POINT = R.drawable.map_start_point; + public static int ROUTE_TARGET_POINT = R.drawable.map_target_point; + public static int ROUTE_INTERMEDIATE_POINT = R.drawable.map_intermediate_point; +} diff --git a/OsmAnd/src/net/osmand/plus/utils/OsmAndFormatter.java b/OsmAnd/src/net/osmand/plus/utils/OsmAndFormatter.java index ffd112b254a..2148b0ca14b 100644 --- a/OsmAnd/src/net/osmand/plus/utils/OsmAndFormatter.java +++ b/OsmAnd/src/net/osmand/plus/utils/OsmAndFormatter.java @@ -11,8 +11,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; -import androidx.core.text.TextUtilsCompat; -import androidx.core.view.ViewCompat; import com.jwetherell.openmap.common.LatLonPoint; import com.jwetherell.openmap.common.MGRSPoint; @@ -328,6 +326,7 @@ public static class OsmAndFormatterParams { public static final boolean DEFAULT_FORCE_TRAILING = true; public static final int DEFAULT_EXTRA_DECIMAL_PRECISION = 1; boolean forceTrailingZerosInDecimalMainUnit = DEFAULT_FORCE_TRAILING; + boolean forcePreciseValue = false; int extraDecimalPrecision = DEFAULT_EXTRA_DECIMAL_PRECISION; public static final OsmAndFormatterParams USE_LOWER_BOUNDS = useLowerBoundParam(); @@ -353,6 +352,14 @@ private OsmAndFormatterParams setTrailingZerosForMainUnit(boolean forceTrailingZ return this; } + public void setForcePreciseValue(boolean forceDecimalPlaces) { + this.forcePreciseValue = forceDecimalPlaces; + } + + public void setExtraDecimalPrecision(int extraDecimalPrecision) { + this.extraDecimalPrecision = extraDecimalPrecision; + } + } @NonNull @@ -405,7 +412,9 @@ public static FormattedValue getFormattedDistanceValue(float meters, @NonNull Os float floatDistance = meters / mainUnitInMeters; boolean forceTrailingZeros = pms.forceTrailingZerosInDecimalMainUnit; int decimalPrecision = pms.extraDecimalPrecision; - if (meters >= 100 * mainUnitInMeters) { + if(pms.forcePreciseValue) { + return formatValue(floatDistance, mainUnitStr, forceTrailingZeros, decimalPrecision, ctx); + } else if (meters >= 100 * mainUnitInMeters) { return formatValue((int) (meters / mainUnitInMeters + 0.5), mainUnitStr, forceTrailingZeros, 0, ctx); } else if (meters > 9.99f * mainUnitInMeters) { @@ -446,7 +455,6 @@ public static FormattedValue getFormattedDistanceValue(float meters, @NonNull Os } } - @NonNull public static String getFormattedAlt(double alt, OsmandApplication ctx) { OsmandSettings settings = ctx.getSettings(); diff --git a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java index d4c107cc530..e54ffe82163 100644 --- a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java +++ b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java @@ -1995,10 +1995,10 @@ public void showMessage(String msg) { private class MapTileViewMultiTouchZoomListener implements MultiTouchZoomListener, DoubleTapZoomListener { - private static final float ZONE_0_ANGLE_THRESHOLD = 2; - private static final float ZONE_1_ANGLE_THRESHOLD = 10; - private static final float ZONE_2_ANGLE_THRESHOLD = 15; - private static final float ZONE_3_ANGLE_THRESHOLD = 30; + private static final float ZONE_0_ANGLE_THRESHOLD = 5; + private static final float ZONE_1_ANGLE_THRESHOLD = 15; + private static final float ZONE_2_ANGLE_THRESHOLD = 20; + private static final float ZONE_3_ANGLE_THRESHOLD = 40; private static final float ZONE_0_ZOOM_THRESHOLD = 0.15f; private static final float ZONE_1_ZOOM_THRESHOLD = 0.6f; private static final float ZONE_2_ZOOM_THRESHOLD = 1.5f; diff --git a/OsmAnd/src/net/osmand/plus/views/controls/maphudbuttons/ButtonPositionSize.java b/OsmAnd/src/net/osmand/plus/views/controls/maphudbuttons/ButtonPositionSize.java index f76564ecd3a..a47f7a858a1 100644 --- a/OsmAnd/src/net/osmand/plus/views/controls/maphudbuttons/ButtonPositionSize.java +++ b/OsmAnd/src/net/osmand/plus/views/controls/maphudbuttons/ButtonPositionSize.java @@ -91,6 +91,12 @@ public ButtonPositionSize setPositionVertical(int posV) { return this; } + public ButtonPositionSize setMargin(int marginX, int marginY) { + this.marginX = marginX; + this.marginY = marginY; + return this; + } + public boolean isLeft() { return posH == POS_LEFT; } @@ -270,5 +276,4 @@ private static void moveButton(int space, ButtonPositionSize toMove, ButtonPosit toMove.marginY = space + overlap.marginY + overlap.height; } } - } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java index 932844ab9d7..ff93f61de9b 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java @@ -310,7 +310,11 @@ public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode if (invalidated) { setInvalidated(false); - app.runInUIThread(this::refreshButtons); + app.runInUIThread(() -> { + if (getMapActivity() != null) { + refreshButtons(); + } + }); } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapInfoLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapInfoLayer.java index 4c0bc717bf1..9e82b033f3b 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/MapInfoLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/MapInfoLayer.java @@ -120,12 +120,14 @@ public void setMapActivity(@Nullable MapActivity mapActivity) { if (bottomWidgetsPanel != null) { bottomWidgetsPanel.removeOnLayoutChangeListener(bottomPanelBoundsChangeListener); } + if (mapHudLayout != null) { + mapHudLayout.removeWidget(rulerWidget); + } mapDisplayPositionManager.unregisterCoveredScreenRectProvider(this); mapDisplayPositionManager.updateMapDisplayPosition(true); resetCashedTheme(); widgetRegistry.clearWidgets(); - mapHudLayout.removeWidget(rulerWidget); mapHudLayout = null; topWidgetsPanel = null; diff --git a/OsmAnd/src/net/osmand/plus/views/layers/PointNavigationLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/PointNavigationLayer.java index 49e64a83a1a..5606b61da76 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/PointNavigationLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/PointNavigationLayer.java @@ -1,5 +1,9 @@ package net.osmand.plus.views.layers; +import static net.osmand.plus.settings.backend.OsmAndAppCustomizationFields.ROUTE_INTERMEDIATE_POINT; +import static net.osmand.plus.settings.backend.OsmAndAppCustomizationFields.ROUTE_START_POINT; +import static net.osmand.plus.settings.backend.OsmAndAppCustomizationFields.ROUTE_TARGET_POINT; + import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; @@ -182,18 +186,18 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett if (pointToStart != null) { int x = MapUtils.get31TileNumberX(pointToStart.getLongitude()); int y = MapUtils.get31TileNumberY(pointToStart.getLatitude()); - drawMarker(markersCollection, mStartPoint, new PointI(x, y), null); + drawMarkerOpenGL(markersCollection, mStartPoint, new PointI(x, y), null); } for (int i = 0; i < intermediatePoints.size(); i++) { TargetPoint ip = intermediatePoints.get(i); int x = MapUtils.get31TileNumberX(ip.getLongitude()); int y = MapUtils.get31TileNumberY(ip.getLatitude()); - drawMarker(markersCollection, mIntermediatePoint, new PointI(x, y), String.valueOf(i + 1)); + drawMarkerOpenGL(markersCollection, mIntermediatePoint, new PointI(x, y), String.valueOf(i + 1)); } if (pointToNavigate != null) { int x = MapUtils.get31TileNumberX(pointToNavigate.getLongitude()); int y = MapUtils.get31TileNumberY(pointToNavigate.getLatitude()); - drawMarker(markersCollection, mTargetPoint, new PointI(x, y), null); + drawMarkerOpenGL(markersCollection, mTargetPoint, new PointI(x, y), null); } mapRenderer.addSymbolsProvider(markersCollection); this.mapMarkersCollection = markersCollection; @@ -226,9 +230,9 @@ private void updateTextSize() { } private void recreateBitmaps() { - mStartPoint = getScaledBitmap(R.drawable.map_start_point); - mTargetPoint = getScaledBitmap(R.drawable.map_target_point); - mIntermediatePoint = getScaledBitmap(R.drawable.map_intermediate_point); + mStartPoint = getScaledBitmap(ROUTE_START_POINT); + mTargetPoint = getScaledBitmap(ROUTE_TARGET_POINT); + mIntermediatePoint = getScaledBitmap(ROUTE_INTERMEDIATE_POINT); clearMapMarkersCollections(); } @@ -326,7 +330,7 @@ public boolean isObjectMovable(Object o) { @Override public void applyNewObjectPosition(@NonNull Object o, @NonNull LatLon position, - @Nullable ContextMenuLayer.ApplyMovedObjectCallback callback) { + @Nullable ContextMenuLayer.ApplyMovedObjectCallback callback) { boolean result = false; TargetPoint newTargetPoint = null; if (o instanceof TargetPoint) { @@ -357,9 +361,8 @@ public void applyNewObjectPosition(@NonNull Object o, @NonNull LatLon position, applyMovableObject(position); } - /** OpenGL */ - private void drawMarker(@NonNull MapMarkersCollection markersCollection, - @NonNull Bitmap bitmap, @NonNull PointI position, @Nullable String caption) { + private void drawMarkerOpenGL(@NonNull MapMarkersCollection markersCollection, + @NonNull Bitmap bitmap, @NonNull PointI position, @Nullable String caption) { if (!getMapView().hasMapRenderer()) { return; } @@ -374,7 +377,7 @@ private void drawMarker(@NonNull MapMarkersCollection markersCollection, .setPinIconHorisontalAlignment(MapMarker.PinIconHorisontalAlignment.Right); if (caption != null) { - initCaptionStyle(); + initCaptionStyleOpenGL(); mapMarkerBuilder .setCaptionStyle(captionStyle) .setCaptionTopSpace(-mIntermediatePoint.getHeight() * 0.7 - captionStyle.getSize() / 2) @@ -383,8 +386,7 @@ private void drawMarker(@NonNull MapMarkersCollection markersCollection, mapMarkerBuilder.buildAndAddToCollection(markersCollection); } - /** OpenGL */ - private void initCaptionStyle() { + private void initCaptionStyleOpenGL() { if (!getMapView().hasMapRenderer() || captionStyle != null) { return; } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/RouteLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/RouteLayer.java index c3bc6c2dbe0..48765784553 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/RouteLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/RouteLayer.java @@ -138,7 +138,7 @@ protected void initAttrs(float density) { @Override protected void initGeometries(float density) { routeWayContext = new RouteGeometryWayContext(getContext(), density); - routeWayContext.updatePaints(nightMode, attrs); + routeWayContext.updatePaints(nightMode, attrs, attrsW); routeGeometry = new RouteGeometryWay(routeWayContext); routeGeometry.baseOrder = getBaseOrder(); @@ -337,7 +337,7 @@ protected void updateAttrs(DrawSettings settings, RotatedTileBox tileBox) { nightMode = settings != null && settings.isNightMode(); if (updatePaints) { - routeWayContext.updatePaints(nightMode, attrs); + routeWayContext.updatePaints(nightMode, attrs, attrsW); publicTransportWayContext.updatePaints(nightMode, attrs, attrsPT, attrsW); } } @@ -647,6 +647,9 @@ private List calculateActionPoints(double topLatitude, double leftL int prevFinishPoint = -1; for (int routePoint = 0; routePoint < routeNodes.size(); routePoint++) { Location loc = routeNodes.get(routePoint); + if (RouteCalculationResult.FIRST_LAST_LOCATION_PROVIDER.equals(loc.getProvider())) { + continue; + } if (nf != null) { int pnt = nf.routeEndPointOffset == 0 ? nf.routePointOffset : nf.routeEndPointOffset; if(pnt < routePoint + cd ) { diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/CommonGeometryWayContext.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/CommonGeometryWayContext.java new file mode 100644 index 00000000000..f0ccb313154 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/CommonGeometryWayContext.java @@ -0,0 +1,91 @@ +package net.osmand.plus.views.layers.geometry; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RectF; + +import androidx.annotation.NonNull; + +import net.osmand.plus.R; +import net.osmand.plus.render.RenderingIcons; +import net.osmand.plus.views.layers.base.OsmandMapLayer.RenderingLineAttributes; + +public class CommonGeometryWayContext extends GeometryWayContext { + + protected RenderingLineAttributes attrsW; + private Bitmap walkArrowBitmap; + protected Bitmap walkInnerArrowBitmap; + + public CommonGeometryWayContext(@NonNull Context ctx, float density) { + super(ctx, density); + float scale = getApp().getOsmandMap().getCarDensityScaleCoef() * 0.5f; + walkInnerArrowBitmap = RenderingIcons.getBitmapFromVectorDrawable(ctx, getArrowBitmapResId(), scale); + } + + @Override + protected int getArrowBitmapResId() { + return R.drawable.map_route_direction_arrow; + } + + public RenderingLineAttributes getAttrsW() { + return attrsW; + } + + public void updatePaints(boolean nightMode, @NonNull RenderingLineAttributes attrs, + @NonNull RenderingLineAttributes attrsW) { + this.attrsW = attrsW; + updatePaints(nightMode, attrs); + } + + public Bitmap getWalkArrowBitmap() { + return walkArrowBitmap; + } + + @Override + protected boolean hasAttrs() { + return super.hasAttrs() && attrsW != null; + } + + @Override + protected void recreateBitmaps() { + super.recreateBitmaps(); + float walkCircleH = attrsW.paint.getStrokeWidth() * 1.33f; + float walkCircleW = attrsW.paint.getStrokeWidth(); + float walkCircleRadius = attrsW.paint.getStrokeWidth() / 2f; + + // create anchor bitmap + float density = getDensity(); + float margin = 2f * density; + + // create walk arrow bitmap + float width = walkCircleW + margin * 2; + float height = walkCircleH + margin * 2; + Bitmap bitmap = Bitmap.createBitmap((int) width, (int) height, Bitmap.Config.ARGB_8888); + + Canvas canvas = new Canvas(bitmap); + Paint paint = new Paint(); + paint.setAntiAlias(true); + paint.setStrokeWidth(1f * density); + + RectF rect = new RectF(margin, margin, width - margin, height - margin); + paint.setColor(attrsW.paint.getColor()); + paint.setStyle(Paint.Style.FILL); + canvas.drawRoundRect(rect, walkCircleRadius, walkCircleRadius, paint); + paint.setColor(getStrokeColor(paint.getColor())); + paint.setStyle(Paint.Style.STROKE); + canvas.drawRoundRect(rect, walkCircleRadius, walkCircleRadius, paint); + + Bitmap arrowBitmap = walkInnerArrowBitmap; + paint = new Paint(); + paint.setAntiAlias(true); + paint.setColor(Color.WHITE); + paint.setStrokeWidth(1f * density); + paint.setAlpha(200); + canvas.drawBitmap(arrowBitmap, width / 2 - arrowBitmap.getWidth() / 2f, height / 2 - arrowBitmap.getHeight() / 2f, paint); + + walkArrowBitmap = bitmap; + } +} diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/Geometry3DWayProvider.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/Geometry3DWayProvider.java index c9aeffeeb58..cfdeea484c7 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/Geometry3DWayProvider.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/Geometry3DWayProvider.java @@ -4,14 +4,15 @@ import net.osmand.plus.views.layers.geometry.GeometryWay.GeometryWayProvider; import net.osmand.shared.routing.RouteColorize; +import net.osmand.shared.routing.RouteColorize.RouteColorizationPoint; import java.util.List; public class Geometry3DWayProvider implements GeometryWayProvider { - private final List points; + private final List points; - public Geometry3DWayProvider(@NonNull List points) { + public Geometry3DWayProvider(@NonNull List points) { this.points = points; } @@ -38,6 +39,11 @@ public float getHeight(int index) { return (float) points.get(index).getValue(); } + @Override + public boolean isFirstLastLocation(int index) { + return false; + } + @Override public int getSize() { return points.size(); diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWalkWayStyle.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWalkWayStyle.java new file mode 100644 index 00000000000..a2440888e07 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWalkWayStyle.java @@ -0,0 +1,45 @@ +package net.osmand.plus.views.layers.geometry; + +import android.graphics.Bitmap; + +public class GeometryWalkWayStyle extends GeometryWayStyle { + + GeometryWalkWayStyle(CommonGeometryWayContext context) { + super(context); + } + + @Override + public boolean hasPathLine() { + return false; + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (!super.equals(other)) { + return false; + } + return other instanceof GeometryWalkWayStyle; + } + + public Bitmap getPointBitmap() { + return getContext().getWalkArrowBitmap(); + } + + @Override + public boolean hasPaintedPointBitmap() { + return true; + } + + @Override + public double getPointStepPx(double zoomCoef) { + return getPointBitmap().getHeight() * 1.2f * zoomCoef; + } + + @Override + public boolean isVisibleWhileZooming() { + return true; + } +} diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWay.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWay.java index 7ae7087dab9..06aef8d1ea4 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWay.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWay.java @@ -30,7 +30,7 @@ import gnu.trove.list.array.TByteArrayList; -public abstract class GeometryWay> { +public abstract class GeometryWay> { protected static final int INITIAL_POINT_INDEX_SHIFT = 1 << 30; private final Log log = PlatformUtil.getLog(GeometryWay.class); @@ -46,7 +46,6 @@ public abstract class GeometryWay points = new ArrayList<>(); //OpenGL protected final List> pathsData31Cache = new ArrayList<>(); - protected int startLocationIndexCached = -1; public int baseOrder = -1; public long linesPriority = Long.MIN_VALUE; public VectorLinesCollection vectorLinesCollection; @@ -60,6 +59,8 @@ public interface GeometryWayProvider { int getSize(); float getHeight(int index); + + boolean isFirstLastLocation(int index); } public GeometryWay(T context, D drawer) { @@ -146,7 +147,6 @@ public void clearWay() { private void clearPathCache() { pathsData31Cache.clear(); - startLocationIndexCached = -1; } public void resetSymbolProviders() { @@ -205,6 +205,11 @@ public void drawSegments(@NonNull RotatedTileBox tb, @Nullable Canvas canvas, do MapRendererView mapRenderer = getMapRenderer(); boolean hasMapRenderer = mapRenderer != null; + if (hasMapRenderer && !pathsData31Cache.isEmpty()) { + cutStartOfCachedPath(mapRenderer, tb, startLocationIndex, lastProjection); + return; + } + PathGeometryZoom geometryZoom = !hasMapRenderer ? getGeometryZoom(tb) : null; TByteArrayList simplification = geometryZoom != null ? geometryZoom.getSimplifyPoints() : null; List odistances = geometryZoom != null ? geometryZoom.getDistances() : null; @@ -212,24 +217,22 @@ public void drawSegments(@NonNull RotatedTileBox tb, @Nullable Canvas canvas, do clearArrays(); GeometryWayStyle defaultWayStyle = getDefaultWayStyle(); + GeometryWayStyle walkWayStyle = new GeometryWalkWayStyle(getContext()); GeometryWayStyle style = defaultWayStyle; boolean previousVisible = false; - if (lastProjection != null) { - previousVisible = addInitialPoint(tb, topLatitude, leftLongitude, bottomLatitude, rightLongitude, - style, previousVisible, lastProjection, startLocationIndex); - } - Location nextVisiblePoint = getNextVisiblePoint(); - if (nextVisiblePoint != null) { - boolean added = addInitialPoint(tb, topLatitude, leftLongitude, bottomLatitude, rightLongitude, - style, previousVisible, nextVisiblePoint, startLocationIndex); - if (added) { - previousVisible = true; + if (!hasMapRenderer) { + if (lastProjection != null) { + previousVisible = addInitialPoint(tb, topLatitude, leftLongitude, bottomLatitude, rightLongitude, + style, lastProjection, startLocationIndex); + } + Location nextVisiblePoint = getNextVisiblePoint(); + if (nextVisiblePoint != null) { + boolean added = addInitialPoint(tb, topLatitude, leftLongitude, bottomLatitude, rightLongitude, + style, nextVisiblePoint, startLocationIndex); + if (added) { + previousVisible = true; + } } - } - - if (hasMapRenderer && !pathsData31Cache.isEmpty()) { - cutStartOfCachedPath(mapRenderer, tb, startLocationIndex, previousVisible); - return; } GeometryWayProvider locationProvider = this.locationProvider; @@ -239,6 +242,10 @@ public void drawSegments(@NonNull RotatedTileBox tb, @Nullable Canvas canvas, do for (int i = startLocationIndex - (hasMapRenderer && startLocationIndex > 0 ? 1 : 0); i < locationProvider.getSize(); i++) { style = getStyle(i, defaultWayStyle); + if (locationProvider.isFirstLastLocation(i) + || (i < locationProvider.getSize() - 1 && locationProvider.isFirstLastLocation(i + 1))) { + style = walkWayStyle; + } if (shouldSkipLocation(simplification, styleMap, i)) { continue; } @@ -257,7 +264,7 @@ public void drawSegments(@NonNull RotatedTileBox tb, @Nullable Canvas canvas, do addLocation(tb, previous, dist, style, points); } else if (lastProjection != null) { addLocation(tb, lastProjection.getLatitude(), lastProjection.getLongitude(), i - 1, dist, true, - getStyle(i - 1, style), points); // first point + getStyle(i - 1, walkWayStyle), points); // first point } } addLocation(tb, i, dist, style, points); @@ -368,8 +375,7 @@ protected void addLocation(RotatedTileBox tb, double latitude, double longitude, } protected boolean addInitialPoint(RotatedTileBox tb, double topLatitude, double leftLongitude, double bottomLatitude, - double rightLongitude, GeometryWayStyle style, boolean previousVisible, - Location lastPoint, int startLocationIndex) { + double rightLongitude, GeometryWayStyle style, Location lastPoint, int startLocationIndex) { if (hasMapRenderer() || (leftLongitude <= lastPoint.getLongitude() && lastPoint.getLongitude() <= rightLongitude && bottomLatitude <= lastPoint.getLatitude() && lastPoint.getLatitude() <= topLatitude)) { addLocation(tb, lastPoint.getLatitude(), lastPoint.getLongitude(), startLocationIndex, 0, true, @@ -383,92 +389,50 @@ protected boolean addInitialPoint(RotatedTileBox tb, double topLatitude, double protected List> cutStartOfCachedPath(@NonNull MapRendererView mapRenderer, @NonNull RotatedTileBox tb, int startLocationIndex, - boolean previousVisible) { - List> croppedPathsData31 = new ArrayList<>(); - boolean drawNext = false; + Location lastProjection) { float passedDist = 0; - int firstX31 = -1; - int firstY31 = -1; - boolean create = !previousVisible || startLocationIndexCached == -1; - boolean update = false; + int passedLineId = 0; + int lastX31 = 0; + int lastY31 = 0; + float lastPathDist = 0; for (List pathsDataList : pathsData31Cache) { - if (drawNext) { - croppedPathsData31.add(pathsDataList); - drawPathLine(tb, pathsDataList); - continue; - } - List newPathsDataList = new ArrayList<>(); for (DrawPathData31 pathData : pathsDataList) { - if (drawNext) { - newPathsDataList.add(pathData); - continue; + boolean hasIndex = false; + for (Integer index : pathData.indexes) { + if (index <= startLocationIndex) { + hasIndex = true; + break; + } } - if (pathData.indexes.size() < 3 || pathData.indexes.contains(startLocationIndex)) { - List ind = new ArrayList<>(); - List tx = new ArrayList<>(); - List ty = new ArrayList<>(); - List heights = new ArrayList<>(); + if (hasIndex) { List indexes = pathData.indexes; - for (int i = 0; i < indexes.size(); i++) { + for (int i = 0; i < indexes.size() - 1; i++) { Integer index = indexes.get(i); - if (previousVisible && index >= INITIAL_POINT_INDEX_SHIFT) { - continue; - } - if (index >= startLocationIndex - 1) { - ind.add(index); - tx.add(pathData.tx.get(i)); - ty.add(pathData.ty.get(i)); - if (pathData.heights != null) { - heights.add(pathData.heights.get(i)); - } - if (firstX31 == -1) { - if (index >= startLocationIndexCached && index > 0) { - passedDist += pathData.distances.get(i); - } - firstX31 = pathData.tx.get(i); - firstY31 = pathData.ty.get(i); - } - } else if (!update && index >= startLocationIndexCached && index > 0) { - if (pathData.distances.get(i) == 0 && i > 0) { - passedDist += (float) MapUtils.measuredDist31( - pathData.tx.get(i - 1), pathData.ty.get(i - 1), pathData.tx.get(i), pathData.ty.get(i)); + if (index < startLocationIndex) { + lastX31 = pathData.tx.get(i); + lastY31 = pathData.ty.get(i); + if (passedLineId != pathData.lineId) { + passedDist = pathData.distances.get(i); } else { - passedDist += pathData.distances.get(i); + passedDist += i > 0 ? pathData.distances.get(i) : lastPathDist; } + passedLineId = pathData.lineId; + lastPathDist = pathData.distances.get(pathData.distances.size() - 1); } } - if (previousVisible) { - if (startLocationIndexCached == -1) { - startLocationIndexCached = startLocationIndex; - } - if (!update && !this.points.isEmpty() && firstX31 != -1) { - GeometryWayPoint firstPnt = this.points.get(0); - passedDist += (float) MapUtils.measuredDist31(firstX31, firstY31, firstPnt.tx31, firstPnt.ty31); - update = true; - } - } else { - drawNext = true; - } - if (create && tx.size() > 1) { - DrawPathData31 newPathData = new DrawPathData31(ind, tx, ty, pathData.style); - if (!heights.isEmpty()) { - newPathData.heights = heights; - } - newPathsDataList.add(newPathData); - } } } - if (create) { - croppedPathsData31.add(newPathsDataList); - drawPathLine(tb, newPathsDataList); - } } - if (update) { - updatePathLine(passedDist); - if (!create) { - return null; - } + if (lastProjection != null && lastX31 != 0 && lastY31 != 0) { + passedDist += (float) MapUtils.measuredDist31( + MapUtils.get31TileNumberX(lastProjection.getLongitude()), + MapUtils.get31TileNumberY(lastProjection.getLatitude()), lastX31, lastY31); } + + if (passedLineId > 0) { + updatePathLine(passedLineId, passedDist); + } + if (shouldDrawArrows()) { VectorLinesCollection vectorLinesCollection = this.vectorLinesCollection; VectorLineArrowsProvider vectorLineArrowsProvider = this.vectorLineArrowsProvider; @@ -483,7 +447,7 @@ protected List> cutStartOfCachedPath(@NonNull MapRendererVi } } - return create ? croppedPathsData31 : null; + return new ArrayList<>(pathsData31Cache); } protected boolean shouldDrawArrows() { @@ -515,7 +479,7 @@ public void drawRouteSegment(@NonNull RotatedTileBox tb, @Nullable Canvas canvas if (hasMapRenderer) { List pathsData = GeometryWayPathAlgorithms.calculatePath(points); if (!Algorithms.isEmpty(pathsData)) { - drawPathLine(tb, pathsData); + drawPathLine(pathsData); } pathsData31Cache.add(pathsData); } else if (canvas != null) { @@ -579,7 +543,7 @@ private void drawPathLine(Canvas canvas, RotatedTileBox tb, List p } } - private void drawPathLine(RotatedTileBox tb, List pathsData) { + private void drawPathLine(List pathsData) { MapRendererView mapRenderer = getMapRenderer(); if (mapRenderer != null) { VectorLinesCollection vectorLinesCollection = this.vectorLinesCollection; @@ -608,12 +572,12 @@ private void drawPathLine(RotatedTileBox tb, List pathsData) { } } - private void updatePathLine(float startingDistance) { + private void updatePathLine(int lineId, float startingDistance) { MapRendererView mapRenderer = getMapRenderer(); if (mapRenderer != null) { VectorLinesCollection vectorLinesCollection = this.vectorLinesCollection; if (vectorLinesCollection != null) { - drawer.updatePath(vectorLinesCollection, startingDistance); + drawer.updatePath(vectorLinesCollection, lineId, startingDistance); } } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayDrawer.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayDrawer.java index c850b5b0cb1..60a7711aa27 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayDrawer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayDrawer.java @@ -77,6 +77,8 @@ public static class DrawPathData31 { List distances; GeometryWayStyle style; + int lineId; + public DrawPathData31(@NonNull List indexes, @NonNull List tx, @NonNull List ty, @Nullable GeometryWayStyle style) { @@ -335,7 +337,9 @@ protected void updateVectorLine(@NonNull VectorLinesCollection collection, VectorLine line = lines.get(i); if (line.getLineId() == lineId) { line.setStartingDistance(startingDistance); - return; + } + if (line.getLineId() < lineId) { + line.setIsHidden(true); } } } @@ -381,16 +385,17 @@ public void drawPath(Canvas canvas, DrawPathData pathData) { public void drawPath(@NonNull VectorLinesCollection collection, int baseOrder, boolean shouldDrawArrows, @NonNull List pathsData) { - int lineId = LINE_ID; GeometryWayStyle prevStyle = null; List dataArr = new ArrayList<>(); + int lineId = LINE_ID; for (DrawPathData31 data : pathsData) { - if (prevStyle != null && (!Algorithms.objectEquals(data.style, prevStyle) || data.style.isUnique() + if (!dataArr.isEmpty() && prevStyle != null && (!Algorithms.objectEquals(data.style, prevStyle) || data.style.isUnique() || prevStyle.hasPathLine() != data.style.hasPathLine())) { drawVectorLine(collection, lineId++, baseOrder, shouldDrawArrows, true, prevStyle, dataArr); dataArr.clear(); } prevStyle = data.style; + data.lineId = lineId; dataArr.add(data); } if (!dataArr.isEmpty() && prevStyle != null) { @@ -398,8 +403,8 @@ public void drawPath(@NonNull VectorLinesCollection collection, int baseOrder, b } } - public void updatePath(@NonNull VectorLinesCollection collection, float startingDistance) { - updateVectorLine(collection, LINE_ID, startingDistance); + public void updatePath(@NonNull VectorLinesCollection collection, int lineId, float startingDistance) { + updateVectorLine(collection, lineId, startingDistance); } protected void drawVectorLine(@NonNull VectorLinesCollection collection, diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayLocationProvider.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayLocationProvider.java index 5f0cd2dfc91..0495eadbe91 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayLocationProvider.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayLocationProvider.java @@ -1,5 +1,7 @@ package net.osmand.plus.views.layers.geometry; +import static net.osmand.plus.routing.RouteCalculationResult.FIRST_LAST_LOCATION_PROVIDER; + import androidx.annotation.NonNull; import net.osmand.Location; @@ -34,4 +36,9 @@ public int getSize() { public float getHeight(int index) { return 0; } + + @Override + public boolean isFirstLastLocation(int index) { + return FIRST_LAST_LOCATION_PROVIDER.equals(locations.get(index).getProvider()); + } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayPathAlgorithms.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayPathAlgorithms.java index cf006ac089c..c0548c3e92c 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayPathAlgorithms.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayPathAlgorithms.java @@ -3,16 +3,17 @@ import android.graphics.Path; import android.graphics.PointF; -import net.osmand.core.jni.QListFloat; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import net.osmand.data.RotatedTileBox; +import net.osmand.plus.views.layers.geometry.GeometryWayDrawer.DrawPathData31; import net.osmand.util.MapAlgorithms; import net.osmand.util.MapUtils; import java.util.ArrayList; import java.util.List; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import gnu.trove.list.array.TByteArrayList; public class GeometryWayPathAlgorithms { @@ -142,8 +143,8 @@ public static List calculatePath(@NonNull Rotat return pathsData; } - public static List calculatePath(@NonNull List points) { - List pathsData = new ArrayList<>(); + public static List calculatePath(@NonNull List points) { + List pathsData = new ArrayList<>(); GeometryWayPoint firstPoint = points.get(0); GeometryWayStyle style = points.get(0).style; List ind = new ArrayList<>(); @@ -166,7 +167,7 @@ public static List calculatePath(@NonNull List if (style != null) { GeometryWayStyle newStyle = pnt.style; if (!style.equals(newStyle) || newStyle.isUnique()) { - GeometryWayDrawer.DrawPathData31 newPathData = new GeometryWayDrawer.DrawPathData31(ind, tx, ty, style); + DrawPathData31 newPathData = new DrawPathData31(ind, tx, ty, style); newPathData.heights = heights; newPathData.distances = distances; pathsData.add(newPathData); @@ -185,10 +186,10 @@ public static List calculatePath(@NonNull List } } if (tx.size() > 1) { - GeometryWayDrawer.DrawPathData31 newPathData = new GeometryWayDrawer.DrawPathData31(ind, tx, ty, style); - pathsData.add(newPathData); + DrawPathData31 newPathData = new DrawPathData31(ind, tx, ty, style); newPathData.heights = heights; newPathData.distances = distances; + pathsData.add(newPathData); } return pathsData; } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayPoint.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayPoint.java index b0e24a438b9..c7bca689b54 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayPoint.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayPoint.java @@ -10,7 +10,6 @@ public class GeometryWayPoint { public GeometryWayStyle style; public GeometryWayPoint() { - } public GeometryWayPoint(int ind, float tx, float ty) { diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayStyle.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayStyle.java index 929877af4b8..35b34620d63 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayStyle.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayStyle.java @@ -16,7 +16,7 @@ import java.lang.annotation.RetentionPolicy; import java.util.Arrays; -public abstract class GeometryWayStyle { +public abstract class GeometryWayStyle { private final T context; protected Integer color; diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayWptPtProvider.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayWptPtProvider.java index 9a3748a9af3..1112d6557b7 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayWptPtProvider.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GeometryWayWptPtProvider.java @@ -34,4 +34,9 @@ public float getHeight(int index) { public int getSize() { return points.size(); } + + @Override + public boolean isFirstLastLocation(int index) { + return false; + } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GradientGeometryWayProvider.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GradientGeometryWayProvider.java index 090a91841f9..fe6b7bd259c 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GradientGeometryWayProvider.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GradientGeometryWayProvider.java @@ -51,4 +51,9 @@ public int getSize() { public float getHeight(int index) { return heights == null ? 0 : heights.get(index); } + + @Override + public boolean isFirstLastLocation(int index) { + return false; + } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GradientPathGeometryZoom.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GradientPathGeometryZoom.java index 56d1282933d..4fd62ff48e4 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/GradientPathGeometryZoom.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/GradientPathGeometryZoom.java @@ -11,7 +11,7 @@ import gnu.trove.list.array.TByteArrayList; -class GradientPathGeometryZoom extends PathGeometryZoom { +public class GradientPathGeometryZoom extends PathGeometryZoom { public GradientPathGeometryZoom(GeometryWayProvider locationProvider, RotatedTileBox tb, boolean simplify, @NonNull List forceIncludedIndexes) { diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiColoringGeometryWay.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiColoringGeometryWay.java index 17f385b7cbf..860f0131ad6 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiColoringGeometryWay.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiColoringGeometryWay.java @@ -270,16 +270,15 @@ protected void addLocation(RotatedTileBox tb, int locationIdx, double dist, super.addLocation(tb, locationIdx, dist, style, points); if (points.size() > 1) { - if (style instanceof GeometryGradientWayStyle) { - GeometryGradientWayStyle prevStyle = (GeometryGradientWayStyle) points.get(points.size() - 2).style; - GeometryGradientWayStyle currStyle = (GeometryGradientWayStyle) style; + GeometryWayStyle pStyle = points.get(points.size() - 2).style; + if (style instanceof GeometryGradientWayStyle currStyle + && pStyle instanceof GeometryGradientWayStyle prevStyle) { if (!prevStyle.equals(currStyle)) { prevStyle.nextColor = currStyle.currColor; } } - if (style instanceof GeometryGradient3DWayStyle) { - GeometryGradient3DWayStyle prevStyle = (GeometryGradient3DWayStyle) points.get(points.size() - 2).style; - GeometryGradient3DWayStyle currStyle = (GeometryGradient3DWayStyle) style; + if (style instanceof GeometryGradient3DWayStyle currStyle + && pStyle instanceof GeometryGradient3DWayStyle prevStyle) { if (!prevStyle.equals(currStyle)) { prevStyle.nextOutlineColor = currStyle.currOutlineColor; } @@ -290,14 +289,13 @@ protected void addLocation(RotatedTileBox tb, int locationIdx, double dist, @Override protected boolean addInitialPoint(RotatedTileBox tb, double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, GeometryWayStyle style, - boolean previousVisible, Location lastPoint, int startLocationIndex) { + Location lastPoint, int startLocationIndex) { boolean added = super.addInitialPoint(tb, topLatitude, leftLongitude, bottomLatitude, rightLongitude, - style, previousVisible, lastPoint, startLocationIndex); + style, lastPoint, startLocationIndex); if (!added) { return false; } - if (style instanceof GeometryGradient3DWayStyle) { - GeometryGradient3DWayStyle gradientStyle = (GeometryGradient3DWayStyle) style; + if (style instanceof GeometryGradient3DWayStyle gradientStyle) { Geometry3DWayProvider provider = get3DLocationProvider(); if (startLocationIndex == 0) { int startColor = provider.getColor(0); @@ -318,8 +316,7 @@ protected boolean addInitialPoint(RotatedTileBox tb, double topLatitude, double gradientStyle.currOutlineColor = ColorPalette.Companion.getIntermediateColor(prevOutlineColor, nextOutlineColor, percent); gradientStyle.nextOutlineColor = nextOutlineColor; } - } else if (style instanceof GeometryGradientWayStyle) { - GeometryGradientWayStyle gradientStyle = (GeometryGradientWayStyle) style; + } else if (style instanceof GeometryGradientWayStyle gradientStyle) { GradientGeometryWayProvider provider = getGradientLocationProvider(); if (startLocationIndex == 0) { int startColor = provider.getColor(0); @@ -332,8 +329,7 @@ protected boolean addInitialPoint(RotatedTileBox tb, double topLatitude, double gradientStyle.currColor = ColorPalette.Companion.getIntermediateColor(prevColor, nextColor, percent); gradientStyle.nextColor = nextColor; } - } else if (coloringType.isRouteInfoAttribute() && style instanceof GeometrySolidWayStyle) { - GeometrySolidWayStyle prevStyle = (GeometrySolidWayStyle) style; + } else if (coloringType.isRouteInfoAttribute() && style instanceof GeometrySolidWayStyle prevStyle) { GeometrySolidWayStyle transparentWayStyle = getSolidWayStyle(Color.TRANSPARENT); int prevStyleIdx = startLocationIndex > 0 ? startLocationIndex - 1 : 0; prevStyle.color = getStyle(prevStyleIdx, transparentWayStyle).color; diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiColoringGeometryWayContext.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiColoringGeometryWayContext.java index cc5ab672fe7..ace0ca75080 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiColoringGeometryWayContext.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiColoringGeometryWayContext.java @@ -11,7 +11,7 @@ import net.osmand.plus.utils.AndroidUtils; import net.osmand.shared.routing.ColoringType; -public abstract class MultiColoringGeometryWayContext extends GeometryWayContext { +public abstract class MultiColoringGeometryWayContext extends CommonGeometryWayContext { private static final int SHADOW_COLOR = 0x80000000; diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiColoringGeometryWayDrawer.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiColoringGeometryWayDrawer.java index 02b186bfa8d..1f69d9f5129 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiColoringGeometryWayDrawer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiColoringGeometryWayDrawer.java @@ -1,8 +1,16 @@ package net.osmand.plus.views.layers.geometry; import android.content.Context; -import android.graphics.*; -import android.util.Pair; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.Shader; import android.util.Pair; import androidx.annotation.NonNull; @@ -10,13 +18,11 @@ import net.osmand.core.jni.QListFColorARGB; import net.osmand.core.jni.VectorLinesCollection; -import net.osmand.shared.routing.ColoringType; import net.osmand.plus.utils.AndroidUtils; import net.osmand.plus.utils.NativeUtilities; import net.osmand.plus.views.layers.MapTileLayer; -//import net.osmand.plus.views.layers.geometry.MultiColoringGeometryWay.GeometryGradientWayStyle; -//import net.osmand.plus.views.layers.geometry.MultiColoringGeometryWay.GeometrySolidWayStyle; import net.osmand.shared.ColorPalette; +import net.osmand.shared.routing.ColoringType; import net.osmand.util.Algorithms; import java.util.ArrayList; @@ -65,15 +71,16 @@ public void drawPath(@NonNull VectorLinesCollection collection, int baseOrder, protected void drawGradient(@NonNull VectorLinesCollection collection, int baseOrder, boolean shouldDrawArrows, @NonNull List pathsData) { - int lineId = LINE_ID; GeometryWayStyle prevStyle = null; List dataArr = new ArrayList<>(); + int lineId = LINE_ID; for (DrawPathData31 data : pathsData) { - if (prevStyle != null && data.style == null) { + if (!dataArr.isEmpty() && prevStyle != null && data.style == null) { drawVectorLine(collection, lineId++, baseOrder--, shouldDrawArrows, true, prevStyle, dataArr); dataArr.clear(); } prevStyle = data.style; + data.lineId = lineId; dataArr.add(data); } if (!dataArr.isEmpty() && prevStyle != null) { @@ -97,9 +104,19 @@ protected void drawVectorLine(@NonNull VectorLinesCollection collection, Bitmap pointBitmap = arrowPathPointSample.drawBitmap(getContext()); Bitmap specialPointBitmap = specialArrowPathPointSample.drawBitmap(getContext()); - GeometrySolidWayStyle solidWayStyle = (GeometrySolidWayStyle) style; - float bitmapStep = (float) solidWayStyle.getRegularPointStepPx(); - float specialBitmapStep = (float) solidWayStyle.getSpecialPointStepPx(); + if (pointBitmap == null) { + pointBitmap = style.getPointBitmap(); + } + + float bitmapStep; + float specialBitmapStep; + if (style instanceof GeometrySolidWayStyle solidWayStyle) { + bitmapStep = (float) solidWayStyle.getRegularPointStepPx(); + specialBitmapStep = (float) solidWayStyle.getSpecialPointStepPx(); + } else { + bitmapStep = (float) style.getPointStepPx(1); + specialBitmapStep = (float) style.getPointStepPx(1); + } Pair mappings = getColorizationMappings(pathsData); @@ -125,12 +142,10 @@ protected QListFColorARGB getColorizationMapping(@NonNull List p int color = 0; GeometryWayStyle style = data.style; if (style != null) { - if (style instanceof GeometryGradient3DWayStyle) { - GeometryGradient3DWayStyle wayStyle = (GeometryGradient3DWayStyle) style; + if (style instanceof GeometryGradient3DWayStyle wayStyle) { color = outline ? wayStyle.currOutlineColor : wayStyle.currColor; lastColor = outline ? wayStyle.nextOutlineColor : wayStyle.nextColor; - } else if (style instanceof GeometryGradientWayStyle) { - GeometryGradientWayStyle wayStyle = (GeometryGradientWayStyle) style; + } else if (style instanceof GeometryGradientWayStyle wayStyle) { color = wayStyle.currColor; lastColor = wayStyle.nextColor; } else { @@ -187,8 +202,8 @@ private boolean requireDrawingBorder() { @Override protected PathPoint getArrowPathPoint(float iconX, float iconY, GeometryWayStyle style, double angle, double percent) { - GeometrySolidWayStyle solidWayStyle = (GeometrySolidWayStyle) style; - return new ArrowPathPoint(iconX, iconY, angle, style, percent, solidWayStyle.useSpecialArrow()); + boolean useSpecialArrow = style instanceof GeometrySolidWayStyle && ((GeometrySolidWayStyle) style).useSpecialArrow(); + return new ArrowPathPoint(iconX, iconY, angle, style, percent, useSpecialArrow); } @NonNull @@ -211,9 +226,8 @@ private static class ArrowPathPoint extends PathPoint { @Override protected int[] getPointBitmapSize() { Bitmap bitmap = getPointBitmap(); - if (bitmap != null) { + if (bitmap != null && style instanceof GeometrySolidWayStyle arrowsWayStyle) { Context ctx = style.getCtx(); - GeometrySolidWayStyle arrowsWayStyle = (GeometrySolidWayStyle) style; if (useSpecialArrow) { int bitmapSize = (int) (arrowsWayStyle.getOuterCircleRadius() * 2 + AndroidUtils.dpToPxAuto(ctx, 2)); return new int[] {bitmapSize, bitmapSize}; @@ -231,13 +245,12 @@ protected int[] getPointBitmapSize() { @Override protected void draw(@NonNull Canvas canvas, @NonNull GeometryWayContext context) { - if (style instanceof GeometrySolidWayStyle && shouldDrawArrow()) { + if (style instanceof GeometrySolidWayStyle arrowsWayStyle && shouldDrawArrow()) { Bitmap bitmap = getPointBitmap(); if (bitmap == null) { return; } Context ctx = style.getCtx(); - GeometrySolidWayStyle arrowsWayStyle = (GeometrySolidWayStyle) style; float newWidth; if (useSpecialArrow) { @@ -264,6 +277,24 @@ protected void draw(@NonNull Canvas canvas, @NonNull GeometryWayContext context) int arrowColor = arrowsWayStyle.getPointColor(); paint.setColorFilter(new PorterDuffColorFilter(arrowColor, PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, matrix, paint); + } else if (style instanceof GeometryWalkWayStyle walkWayStyle && shouldDrawArrow()) { + Bitmap bitmap = walkWayStyle.getPointBitmap(); + if (bitmap == null) { + return; + } + float paintW2 = bitmap.getWidth() / 2f; + float paintH2 = bitmap.getHeight() / 2f; + Matrix matrix = getMatrix(); + matrix.reset(); + matrix.postRotate((float) angle, paintW2, paintH2); + matrix.postTranslate(x - paintW2, y - paintH2); + if (style.hasPaintedPointBitmap()) { + Paint paint = context.getPaintIconCustom(); + paint.setColorFilter(null); + canvas.drawBitmap(bitmap, matrix, paint); + } else { + canvas.drawBitmap(bitmap, matrix, context.getPaintIcon()); + } } } @@ -276,8 +307,7 @@ private void drawCircle(Canvas canvas, GeometrySolidWayStyle style) { } private int getCircleColor(@NonNull GeometrySolidWayStyle style) { - if (style instanceof GeometryGradientWayStyle) { - GeometryGradientWayStyle gradientStyle = ((GeometryGradientWayStyle) style); + if (style instanceof GeometryGradientWayStyle gradientStyle) { return ColorPalette.Companion.getIntermediateColor(gradientStyle.currColor, gradientStyle.nextColor, percent); } return style.getColor(0); diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiProfileGeometryWayContext.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiProfileGeometryWayContext.java index f48ed78d0ff..37142dd755f 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiProfileGeometryWayContext.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiProfileGeometryWayContext.java @@ -19,7 +19,7 @@ import java.util.HashMap; import java.util.Map; -public class MultiProfileGeometryWayContext extends GeometryWayContext { +public class MultiProfileGeometryWayContext extends CommonGeometryWayContext { @DrawableRes private static final int STRAIGHT_LINE_ICON_RES = R.drawable.ic_action_split_interval; diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiProfileGeometryWayDrawer.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiProfileGeometryWayDrawer.java index 58eabfc1177..dceaca62e0b 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiProfileGeometryWayDrawer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/MultiProfileGeometryWayDrawer.java @@ -39,22 +39,23 @@ private GeometryMultiProfileWayStyle getMultiProfileWayStyle(@Nullable GeometryW @Override public void drawPath(@NonNull VectorLinesCollection collection, int baseOrder, boolean shouldDrawArrows, @NonNull List pathsData) { - int lineId = LINE_ID; GeometryWayStyle prevStyle = null; List dataArr = new ArrayList<>(); + int lineId = LINE_ID; for (DrawPathData31 data : pathsData) { GeometryMultiProfileWayStyle style = getMultiProfileWayStyle(data.style); - if (prevStyle != null && !Algorithms.objectEquals(style, prevStyle) && !dataArr.isEmpty()) { + if (!dataArr.isEmpty() && prevStyle != null && !Algorithms.objectEquals(style, prevStyle) && !dataArr.isEmpty()) { drawVectorLine(collection, lineId++, baseOrder--, shouldDrawArrows, true, prevStyle, dataArr); dataArr.clear(); } prevStyle = style; + data.lineId = lineId; if (style != null && !style.isGap()) { dataArr.add(data); } } - if (!dataArr.isEmpty()) { + if (!dataArr.isEmpty() && prevStyle != null) { drawVectorLine(collection, lineId, baseOrder, shouldDrawArrows, true, prevStyle, dataArr); } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/PathGeometryZoom.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/PathGeometryZoom.java index 84a2f6a3890..5d7b21ed019 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/PathGeometryZoom.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/PathGeometryZoom.java @@ -12,7 +12,7 @@ import gnu.trove.list.array.TByteArrayList; -class PathGeometryZoom { +public class PathGeometryZoom { private static final float EPSILON_IN_DPI = 2; private final TByteArrayList simplifyPoints; diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/PublicTransportGeometryWay.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/PublicTransportGeometryWay.java index aad3d19dd7d..52e78d17cd6 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/PublicTransportGeometryWay.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/PublicTransportGeometryWay.java @@ -61,7 +61,7 @@ public PublicTransportGeometryWay(PublicTransportGeometryWayContext context) { @NonNull @Override - public GeometryWayStyle getDefaultWayStyle() { + public GeometryWayStyle getDefaultWayStyle() { return new GeometryWalkWayStyle(getContext()); } @@ -228,48 +228,6 @@ public void resetSymbolProviders() { } } - public static class GeometryWalkWayStyle extends PublicTransportGeometryWayStyle { - - GeometryWalkWayStyle(PublicTransportGeometryWayContext context) { - super(context); - } - - @Override - public boolean hasPathLine() { - return false; - } - - @Override - public boolean equals(Object other) { - if (this == other) { - return true; - } - if (!super.equals(other)) { - return false; - } - return other instanceof GeometryWalkWayStyle; - } - - public Bitmap getPointBitmap() { - return getContext().getWalkArrowBitmap(); - } - - @Override - public boolean hasPaintedPointBitmap() { - return true; - } - - @Override - public double getPointStepPx(double zoomCoef) { - return getPointBitmap().getHeight() * 1.2f * zoomCoef; - } - - @Override - public boolean isVisibleWhileZooming() { - return true; - } - } - public static class GeometryAnchorWayStyle extends GeometryWayStyle { GeometryAnchorWayStyle(PublicTransportGeometryWayContext context) { diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/PublicTransportGeometryWayContext.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/PublicTransportGeometryWayContext.java index 21341389140..ed3e29d4f79 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/PublicTransportGeometryWayContext.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/PublicTransportGeometryWayContext.java @@ -14,18 +14,14 @@ import androidx.annotation.NonNull; import net.osmand.plus.utils.ColorUtilities; -import net.osmand.plus.R; import net.osmand.plus.views.layers.base.OsmandMapLayer.RenderingLineAttributes; import java.util.HashMap; import java.util.Map; -public class PublicTransportGeometryWayContext extends GeometryWayContext { +public class PublicTransportGeometryWayContext extends CommonGeometryWayContext { private RenderingLineAttributes attrsPT; - private RenderingLineAttributes attrsW; - - private Bitmap walkArrowBitmap; private Bitmap anchorBitmap; private Map, Bitmap> stopBitmapsCache = new HashMap<>(); private final Map stopSmallBitmapsCache = new HashMap<>(); @@ -34,45 +30,28 @@ public PublicTransportGeometryWayContext(@NonNull Context ctx, float density) { super(ctx, density); } - @Override - protected int getArrowBitmapResId() { - return R.drawable.map_route_direction_arrow; - } - public RenderingLineAttributes getAttrsPT() { return attrsPT; } - public RenderingLineAttributes getAttrsW() { - return attrsW; + @Override + protected boolean hasAttrs() { + return super.hasAttrs() && attrsPT != null; } public void updatePaints(boolean nightMode, @NonNull RenderingLineAttributes attrs, - @NonNull RenderingLineAttributes attrsPT, @NonNull RenderingLineAttributes attrsW) { + @NonNull RenderingLineAttributes attrsPT, @NonNull RenderingLineAttributes attrsW) { this.attrsPT = attrsPT; - this.attrsW = attrsW; - updatePaints(nightMode, attrs); - } - - public Bitmap getWalkArrowBitmap() { - return walkArrowBitmap; + updatePaints(nightMode, attrs, attrsW); } public Bitmap getAnchorBitmap() { return anchorBitmap; } - @Override - protected boolean hasAttrs() { - return super.hasAttrs() && attrsPT != null && attrsW != null; - } - @Override protected void recreateBitmaps() { super.recreateBitmaps(); - float walkCircleH = attrsW.paint.getStrokeWidth() * 1.33f; - float walkCircleW = attrsW.paint.getStrokeWidth(); - float walkCircleRadius = attrsW.paint.getStrokeWidth() / 2f; float routeShieldRadius = attrsPT.paint3.getStrokeWidth() / 2f; // create anchor bitmap @@ -97,34 +76,6 @@ protected void recreateBitmaps() { canvas.drawCircle(x, y, routeShieldRadius, paint); anchorBitmap = bitmap; - - // create walk arrow bitmap - width = walkCircleW + margin * 2; - height = walkCircleH + margin * 2; - bitmap = Bitmap.createBitmap((int) width, (int) height, Bitmap.Config.ARGB_8888); - - canvas = new Canvas(bitmap); - paint = new Paint(); - paint.setAntiAlias(true); - paint.setStrokeWidth(1f * density); - - RectF rect = new RectF(margin, margin, width - margin, height - margin); - paint.setColor(attrsW.paint.getColor()); - paint.setStyle(Paint.Style.FILL); - canvas.drawRoundRect(rect, walkCircleRadius, walkCircleRadius, paint); - paint.setColor(getStrokeColor(paint.getColor())); - paint.setStyle(Paint.Style.STROKE); - canvas.drawRoundRect(rect, walkCircleRadius, walkCircleRadius, paint); - - Bitmap arrowBitmap = getArrowBitmap(); - paint = new Paint(); - paint.setAntiAlias(true); - paint.setColor(Color.WHITE); - paint.setStrokeWidth(1f * density); - paint.setAlpha(200); - canvas.drawBitmap(arrowBitmap, width / 2 - arrowBitmap.getWidth() / 2f, height / 2 - arrowBitmap.getHeight() / 2f, paint); - - walkArrowBitmap = bitmap; stopBitmapsCache = new HashMap<>(); } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/PublicTransportGeometryWayDrawer.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/PublicTransportGeometryWayDrawer.java index 9ecfe1605fb..1583f97c288 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/PublicTransportGeometryWayDrawer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/PublicTransportGeometryWayDrawer.java @@ -58,14 +58,14 @@ public void drawPath(Canvas canvas, DrawPathData pathData) { @Override public void drawPath(@NonNull VectorLinesCollection collection, int baseOrder, boolean shouldDrawArrows, @NonNull List pathsData) { - int lineId = LINE_ID; GeometryWayStyle prevStyle = null; List dataArr = new ArrayList<>(); RenderingLineAttributes attrsPT = getContext().getAttrsPT(); float width = attrsPT.paint.getStrokeWidth(); float outlineWidth = attrsPT.paint2.getStrokeWidth(); + int lineId = LINE_ID; for (DrawPathData31 data : pathsData) { - if (prevStyle != null && (!Algorithms.objectEquals(data.style, prevStyle) || data.style.isUnique())) { + if (!dataArr.isEmpty() && prevStyle != null && (!Algorithms.objectEquals(data.style, prevStyle) || data.style.isUnique())) { if (prevStyle instanceof GeometryTransportWayStyle) { int outlineColor = prevStyle.getStrokeColor(0); drawVectorLine(collection, lineId++, baseOrder--, shouldDrawArrows, prevStyle, @@ -76,6 +76,7 @@ public void drawPath(@NonNull VectorLinesCollection collection, int baseOrder, dataArr.clear(); } prevStyle = data.style; + data.lineId = lineId; dataArr.add(data); } if (!dataArr.isEmpty() && prevStyle != null) { diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/RouteGeometryWay.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/RouteGeometryWay.java index 79a50133e6c..50f9e31b4f2 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/RouteGeometryWay.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/RouteGeometryWay.java @@ -8,13 +8,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import net.osmand.Location; import net.osmand.core.android.MapRendererView; import net.osmand.core.jni.PointI; @@ -155,9 +148,9 @@ protected boolean shouldSkipLocation(@Nullable TByteArrayList simplification, Ma @Override protected boolean addInitialPoint(RotatedTileBox tb, double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, - GeometryWayStyle style, boolean previousVisible, Location lastPoint, int startLocationIndex) { + GeometryWayStyle style, Location lastPoint, int startLocationIndex) { boolean added = super.addInitialPoint(tb, topLatitude, leftLongitude, bottomLatitude, rightLongitude, - style, previousVisible, lastPoint, startLocationIndex); + style, lastPoint, startLocationIndex); if (added) { if (currentCachedSegment == null) { currentCachedSegment = new Segment(); @@ -172,9 +165,9 @@ protected boolean addInitialPoint(RotatedTileBox tb, protected List> cutStartOfCachedPath(@NonNull MapRendererView mapRenderer, @NonNull RotatedTileBox tb, int startLocationIndex, - boolean previousVisible) { - List> croppedPathData31 = super.cutStartOfCachedPath(mapRenderer, tb, startLocationIndex, previousVisible); - if (croppedPathData31 == null) { + Location lastProjection) { + List> croppedPathData31 = super.cutStartOfCachedPath(mapRenderer, tb, startLocationIndex, lastProjection); + if (croppedPathData31 == null || !cachedSegments.isEmpty()) { return null; } @@ -185,30 +178,25 @@ protected List> cutStartOfCachedPath(@NonNull MapRendererVi segment.indexes = new ArrayList<>(); segment.styles = new ArrayList<>(); - for (int lineIndex = 0; lineIndex < segmentData.size(); lineIndex++) { - DrawPathData31 line = segmentData.get(lineIndex); - - boolean lastLine = lineIndex + 1 == segmentData.size(); - int endIndex = lastLine - ? line.indexes.size() - : line.indexes.size() - 1; + for (int pathIndex = 0; pathIndex < segmentData.size(); pathIndex++) { + DrawPathData31 path31 = segmentData.get(pathIndex); + boolean lastPath = pathIndex + 1 == segmentData.size(); + int endIndex = lastPath ? path31.indexes.size() : path31.indexes.size() - 1; for (int i = 0; i < endIndex; i++) { - int index = line.indexes.get(i); + int index = path31.indexes.get(i); if (index >= INITIAL_POINT_INDEX_SHIFT) { - int x31 = line.tx.get(i); - int y31 = line.ty.get(i); + int x31 = path31.tx.get(i); + int y31 = path31.ty.get(i); double lat = MapUtils.get31LatitudeY(y31); double lon = MapUtils.get31LongitudeX(x31); segment.initialLocations.add(new Location("", lat, lon)); } - segment.indexes.add(index); - segment.styles.add(line.style); + segment.styles.add(path31.style); } } segments.add(segment); } - cachedSegments = segments; return croppedPathData31; @@ -436,8 +424,7 @@ private Integer getActionPointColor(@NonNull ActionPoint actionPoint) { } GeometryWayStyle style = segment.styles.get(pointOrder); - if (style instanceof GeometryGradientWayStyle) { - GeometryGradientWayStyle gradientStyle = (GeometryGradientWayStyle) style; + if (style instanceof GeometryGradientWayStyle gradientStyle) { if (pointOrder + 1 == segment.styles.size()) { return gradientStyle.nextColor; } else { diff --git a/OsmAnd/src/net/osmand/plus/views/layers/geometry/RouteGeometryWayContext.java b/OsmAnd/src/net/osmand/plus/views/layers/geometry/RouteGeometryWayContext.java index 779f829dbbe..51513e7db08 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/geometry/RouteGeometryWayContext.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/geometry/RouteGeometryWayContext.java @@ -5,8 +5,6 @@ import androidx.annotation.NonNull; -import net.osmand.plus.R; -import net.osmand.plus.card.color.palette.gradient.PaletteGradientColor; import net.osmand.plus.card.color.palette.gradient.PaletteGradientColor; import net.osmand.shared.routing.ColoringType; @@ -33,9 +31,4 @@ protected ColoringType getDefaultColoringType() { protected String getDefaultGradientPalette() { return PaletteGradientColor.DEFAULT_NAME; } - - @Override - protected int getArrowBitmapResId() { - return R.drawable.map_route_direction_arrow; - } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/CompassButtonState.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/CompassButtonState.java index 0f5ca7a7d09..ebf63b1282f 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/CompassButtonState.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/CompassButtonState.java @@ -127,11 +127,10 @@ public ButtonAppearanceParams createAppearanceParams() { @NonNull @Override - public ButtonAppearanceParams createDefaultAppearanceParams() { + public String getDefaultIconName() { CompassMode compassMode = settings.getCompassMode(); boolean nightMode = app.getDaynightHelper().isNightMode(); - String iconName = app.getResources().getResourceEntryName(compassMode.getIconId().getIconId(nightMode)); - return new ButtonAppearanceParams(iconName, getDefaultSize(), TRANSPARENT_ALPHA, ROUND_RADIUS_DP); + return app.getResources().getResourceEntryName(compassMode.getIconId().getIconId(nightMode)); } @Nullable diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/ConfigureMapButtonState.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/ConfigureMapButtonState.java index 9fff92a2fdd..3a527a3c5be 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/ConfigureMapButtonState.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/ConfigureMapButtonState.java @@ -60,9 +60,9 @@ public CommonPreference getVisibilityPref() { @NonNull @Override - public ButtonAppearanceParams createDefaultAppearanceParams() { + public String getDefaultIconName() { ApplicationMode appMode = settings.getApplicationMode(); - return new ButtonAppearanceParams(appMode.getIconName(), getDefaultSize(), TRANSPARENT_ALPHA, ROUND_RADIUS_DP); + return appMode.getIconName(); } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/DrawerMenuButtonState.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/DrawerMenuButtonState.java index b69184e1cad..827d90ea6d7 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/DrawerMenuButtonState.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/DrawerMenuButtonState.java @@ -53,10 +53,19 @@ public int getDefaultLayoutId() { @NonNull @Override - public ButtonAppearanceParams createDefaultAppearanceParams() { + public String getDefaultIconName() { boolean dashboard = settings.SHOW_DASHBOARD_ON_MAP_SCREEN.get(); - String iconName = dashboard ? "ic_dashboard" : "ic_navigation_drawer"; - return new ButtonAppearanceParams(iconName, getDefaultSize(), OPAQUE_ALPHA, RECTANGULAR_RADIUS_DP); + return dashboard ? "ic_dashboard" : "ic_navigation_drawer"; + } + + @Override + public float getDefaultOpacity() { + return OPAQUE_ALPHA; + } + + @Override + public int getDefaultCornerRadius() { + return RECTANGULAR_RADIUS_DP; } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/Map3DButtonState.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/Map3DButtonState.java index f73444e5c30..53a477f0cf0 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/Map3DButtonState.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/Map3DButtonState.java @@ -79,9 +79,8 @@ public CommonPreference getVisibilityPref() { @NonNull @Override - public ButtonAppearanceParams createDefaultAppearanceParams() { - String iconName = isFlatMapMode() ? "ic_action_3d" : "ic_action_2d"; - return new ButtonAppearanceParams(iconName, getDefaultSize(), TRANSPARENT_ALPHA, ROUND_RADIUS_DP); + public String getDefaultIconName() { + return isFlatMapMode() ? "ic_action_3d" : "ic_action_2d"; } public boolean isFlatMapMode() { diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/MapButtonState.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/MapButtonState.java index 950b1d96e1d..3abea74b530 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/MapButtonState.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/MapButtonState.java @@ -1,6 +1,8 @@ package net.osmand.plus.views.mapwidgets.configure.buttons; import static net.osmand.plus.quickaction.ButtonAppearanceParams.BIG_SIZE_DP; +import static net.osmand.plus.quickaction.ButtonAppearanceParams.ROUND_RADIUS_DP; +import static net.osmand.plus.quickaction.ButtonAppearanceParams.TRANSPARENT_ALPHA; import android.graphics.drawable.Drawable; @@ -26,7 +28,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Objects; public abstract class MapButtonState { @@ -86,15 +87,28 @@ public String getId() { public abstract boolean isEnabled(); + @NonNull + public ButtonAppearanceParams createDefaultAppearanceParams() { + return new ButtonAppearanceParams(getDefaultIconName(), getDefaultSize(), getDefaultOpacity(), getDefaultCornerRadius()); + } + @LayoutRes public abstract int getDefaultLayoutId(); + @NonNull + public abstract String getDefaultIconName(); + public int getDefaultSize() { return BIG_SIZE_DP; } - @NonNull - public abstract ButtonAppearanceParams createDefaultAppearanceParams(); + public float getDefaultOpacity() { + return TRANSPARENT_ALPHA; + } + + public int getDefaultCornerRadius() { + return ROUND_RADIUS_DP; + } @Nullable public String getSavedIconName() { @@ -169,16 +183,6 @@ public ButtonAppearanceParams createAppearanceParams() { return new ButtonAppearanceParams(iconName, size, opacity, cornerRadius); } - @NonNull - public String getPreferredIconName(@Nullable String originalName) { - return Objects.requireNonNull(getPreferredIconName(originalName, true)); - } - - @Nullable - public String getPreferredIconName(@Nullable String originalName, boolean overwriteEmpty) { - return Algorithms.isEmpty(originalName) && overwriteEmpty ? "" : originalName; - } - @NonNull public ButtonPositionSize createButtonPosition() { ButtonPositionSize position = setupButtonPosition(new ButtonPositionSize(getId())); diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/MyLocationButtonState.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/MyLocationButtonState.java index 0cd39b35a7d..fe504e51e0e 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/MyLocationButtonState.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/MyLocationButtonState.java @@ -53,8 +53,13 @@ public CommonPreference getVisibilityPref() { @NonNull @Override - public ButtonAppearanceParams createDefaultAppearanceParams() { - return new ButtonAppearanceParams("ic_my_location", getDefaultSize(), OPAQUE_ALPHA, ROUND_RADIUS_DP); + public String getDefaultIconName() { + return "ic_my_location"; + } + + @Override + public float getDefaultOpacity() { + return OPAQUE_ALPHA; } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/NavigationMenuButtonState.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/NavigationMenuButtonState.java index eae4911dd1b..7435fd001d6 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/NavigationMenuButtonState.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/NavigationMenuButtonState.java @@ -60,17 +60,23 @@ public int getDefaultLayoutId() { @NonNull @Override - public ButtonAppearanceParams createDefaultAppearanceParams() { - String iconName; + public String getDefaultIconName() { int routePlanningBtnImage = MapActivity.getMapRouteInfoMenu().getRoutePlanningBtnImage(); if (routePlanningBtnImage != 0) { - iconName = app.getResources().getResourceEntryName(routePlanningBtnImage); - } else if (app.getRoutingHelper().isFollowingMode()) { - iconName = "ic_action_start_navigation"; - } else { - iconName = "ic_action_gdirections_dark"; + return app.getResources().getResourceEntryName(routePlanningBtnImage); } - return new ButtonAppearanceParams(iconName, getDefaultSize(), OPAQUE_ALPHA, RECTANGULAR_RADIUS_DP); + boolean isFollowingMode = app.getRoutingHelper().isFollowingMode(); + return isFollowingMode ? "ic_action_start_navigation" : "ic_action_gdirections_dark"; + } + + @Override + public float getDefaultOpacity() { + return OPAQUE_ALPHA; + } + + @Override + public int getDefaultCornerRadius() { + return RECTANGULAR_RADIUS_DP; } @Nullable diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/QuickActionButtonState.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/QuickActionButtonState.java index 99718d54195..e84787ac22d 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/QuickActionButtonState.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/QuickActionButtonState.java @@ -30,7 +30,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Objects; public class QuickActionButtonState extends MapButtonState { @@ -185,31 +184,21 @@ public boolean isDefaultButton() { @Override public ButtonAppearanceParams createAppearanceParams() { ButtonAppearanceParams appearanceParams = super.createAppearanceParams(); - String savedName = getSavedIconName(); - if (Algorithms.isEmpty(savedName)) { - appearanceParams.setIconName(getPreferredIconName(savedName)); + if (Algorithms.isEmpty(getSavedIconName())) { + appearanceParams.setIconName(getDefaultIconName()); } return appearanceParams; } - @Nullable - public String getPreferredIconName(@Nullable String originalName, boolean overwriteIfEmpty) { - if (Algorithms.isEmpty(originalName) && overwriteIfEmpty) { - if (isSingleAction()) { - int iconId = getQuickActions().get(0).getIconRes(app); - if (iconId > 0) { - return app.getResources().getResourceEntryName(iconId); - } + @NonNull + public String getDefaultIconName() { + if (isSingleAction()) { + int iconId = getQuickActions().get(0).getIconRes(app); + if (iconId > 0) { + return app.getResources().getResourceEntryName(iconId); } - return DEFAULT_ICON_KEY; } - return originalName; - } - - @NonNull - @Override - public ButtonAppearanceParams createDefaultAppearanceParams() { - return new ButtonAppearanceParams(DEFAULT_ICON_KEY, getDefaultSize(), TRANSPARENT_ALPHA, ROUND_RADIUS_DP); + return DEFAULT_ICON_KEY; } @Nullable diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/QuickSearchButtonState.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/QuickSearchButtonState.java index 93432fa5148..ef9dcea2b71 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/QuickSearchButtonState.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/QuickSearchButtonState.java @@ -59,8 +59,8 @@ public int getDefaultSize() { @NonNull @Override - public ButtonAppearanceParams createDefaultAppearanceParams() { - return new ButtonAppearanceParams("ic_action_search_dark", getDefaultSize(), TRANSPARENT_ALPHA, ROUND_RADIUS_DP); + public String getDefaultIconName() { + return "ic_action_search_dark"; } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/ZoomInButtonState.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/ZoomInButtonState.java index 3a93ccc6ba8..17e693822b0 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/ZoomInButtonState.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/ZoomInButtonState.java @@ -7,6 +7,7 @@ import static net.osmand.plus.views.controls.maphudbuttons.ButtonPositionSize.POS_RIGHT; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; @@ -53,8 +54,8 @@ public int getDefaultLayoutId() { @NonNull @Override - public ButtonAppearanceParams createDefaultAppearanceParams() { - return new ButtonAppearanceParams("ic_zoom_in", getDefaultSize(), TRANSPARENT_ALPHA, ROUND_RADIUS_DP); + public String getDefaultIconName() { + return "ic_zoom_in"; } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/ZoomOutButtonState.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/ZoomOutButtonState.java index 6918f942a98..feadcaf6c07 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/ZoomOutButtonState.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/configure/buttons/ZoomOutButtonState.java @@ -53,8 +53,8 @@ public int getDefaultLayoutId() { @NonNull @Override - public ButtonAppearanceParams createDefaultAppearanceParams() { - return new ButtonAppearanceParams("ic_zoom_out", getDefaultSize(), TRANSPARENT_ALPHA, ROUND_RADIUS_DP); + public String getDefaultIconName() { + return "ic_zoom_out"; } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelLocalDataHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelLocalDataHelper.java index 8a9602e73ac..2d6257239e3 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelLocalDataHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelLocalDataHelper.java @@ -5,10 +5,10 @@ import net.osmand.IndexConstants; import net.osmand.PlatformUtil; -import net.osmand.plus.shared.SharedUtil; import net.osmand.plus.OsmandApplication; import net.osmand.plus.api.SQLiteAPI.SQLiteConnection; import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; +import net.osmand.plus.shared.SharedUtil; import net.osmand.plus.track.GpxSelectionParams; import net.osmand.plus.utils.AndroidDbUtils; import net.osmand.plus.wikivoyage.data.TravelHelper.GpxReadCallback; @@ -21,15 +21,7 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; public class TravelLocalDataHelper { @@ -505,7 +497,9 @@ public void onGpxFileRead(@Nullable GpxFile gpxFile) { rowsMap.put(BOOKMARKS_COL_CONTENT_JSON, article.contentsJson); rowsMap.put(BOOKMARKS_COL_CONTENT, article.content); rowsMap.put(BOOKMARKS_COL_LAST_MODIFIED, article.getFile().lastModified()); - rowsMap.put(BOOKMARKS_COL_GPX_GZ, Algorithms.stringToGzip(GpxUtilities.INSTANCE.asString(article.gpxFile))); + if (article.gpxFile != null) { + rowsMap.put(BOOKMARKS_COL_GPX_GZ, Algorithms.stringToGzip(GpxUtilities.INSTANCE.asString(article.gpxFile))); + } conn.execSQL(AndroidDbUtils.createDbInsertQuery(BOOKMARKS_TABLE_NAME, rowsMap.keySet()), rowsMap.values().toArray()); diff --git a/OsmAnd/test/java/net/osmand/test/activities/MapHudOverlapTest.java b/OsmAnd/test/java/net/osmand/test/activities/MapHudOverlapTest.java index 152491f9598..89a32f66e0a 100644 --- a/OsmAnd/test/java/net/osmand/test/activities/MapHudOverlapTest.java +++ b/OsmAnd/test/java/net/osmand/test/activities/MapHudOverlapTest.java @@ -31,7 +31,6 @@ import org.junit.runner.RunWith; import java.util.ArrayList; -import java.util.List; import java.util.Map; @LargeTest @@ -129,64 +128,4 @@ public boolean isIdleNow() { return checksCounter >= CHECKS_COUNT; } } - - @NonNull - public static List defaultLayoutExample() { - List lst = new ArrayList<>(); - - lst.add(new ButtonPositionSize("map_left_widgets_panel").fromLongValue(343901601804L)); - lst.add(new ButtonPositionSize("map_right_widgets_panel").fromLongValue(343903830029L)); - lst.add(new ButtonPositionSize("top_widgets_panel").fromLongValue(343602233395L)); - lst.add(new ButtonPositionSize("map_bottom_widgets_panel").fromLongValue(412326428723L)); - lst.add(new ButtonPositionSize("map.view.layers").fromLongValue(103552253958L)); - lst.add(new ButtonPositionSize("map.view.quick_search").fromLongValue(69192581574L)); - lst.add(new ButtonPositionSize("map.view.compass").fromLongValue(103787134982L)); - lst.add(new ButtonPositionSize("map.view.zoom_out").fromLongValue(171802624007L)); - lst.add(new ButtonPositionSize("map.view.zoom_id").fromLongValue(172071059463L)); - lst.add(new ButtonPositionSize("map.view.back_to_loc").fromLongValue(137442951687L)); - lst.add(new ButtonPositionSize("map.view.menu").fromLongValue(138080354311L)); - lst.add(new ButtonPositionSize("map.view.route_planning").fromLongValue(138080354823L)); - lst.add(new ButtonPositionSize("map.view.map_3d").fromLongValue(172238898375L)); - lst.add(new ButtonPositionSize("quick_actions").fromLongValue(103083213639L)); - lst.add(new ButtonPositionSize("quick_actions_1729770291750").fromLongValue(103385203975L)); - lst.add(new ButtonPositionSize("quick_actions_1729770294329").fromLongValue(103653639943L)); - lst.add(new ButtonPositionSize("quick_actions_1729770296201").fromLongValue(103418626951L)); - -// Pos map_left_widgets_panel x=(left ->0 ), y=(top ->9 ), w=12, h= 4 value = 343901601804 {main} -// Pos map_right_widgets_panel x=(right->0 ), y=(top ->9 ), w=13, h= 8 value = 343903830029 {main} -// Pos top_widgets_panel x=(left ->0 ), y=(top ->0 ), w=51, h= 9 value = 343602233395 {main} -// Pos map_bottom_widgets_panel x=(left ->0 ), y=(bott->0 ), w=51, h=18 value = 412326428723 {main} -// Pos map.view.layers x=(left ->0 ), y=(top ->14+), w= 6, h= 6 value = 103552253958 {main} -// Pos map.view.quick_search x=(left ->7+), y=(top ->14 ), w= 6, h= 6 value = 69192581574 {main} -// Pos map.view.compass x=(left ->0 ), y=(top ->21+), w= 6, h= 6 value = 103787134982 {main} -// Pos map.view.zoom_out x=(right->0 ), y=(bott->0+), w= 7, h= 7 value = 171802624007 {main} -// Pos map.view.zoom_id x=(right->0 ), y=(bott->8+), w= 7, h= 7 value = 172071059463 {main} -// Pos map.view.back_to_loc x=(right->8+), y=(bott->0 ), w= 7, h= 7 value = 137442951687 {main} -// Pos map.view.menu x=(left ->0+), y=(bott->19 ), w= 7, h= 7 value = 138080354311 {main} -// Pos map.view.route_planning x=(left ->8+), y=(bott->19 ), w= 7, h= 7 value = 138080354823 {main} -// Pos map.view.map_3d x=(right->19+), y=(bott->13+), w= 7, h= 7 value = 172238898375 {main} -// Pos quick_actions x=(right->13+), y=(top ->0+), w= 7, h= 7 value = 103083213639 {main} -// Pos quick_actions_1729770291750 x=(right->20+), y=(top ->9+), w= 7, h= 7 value = 103385203975 {main} -// Pos quick_actions_1729770294329 x=(right->28+), y=(top ->17+), w= 7, h= 7 value = 103653639943 {main} -// Pos quick_actions_1729770296201 x=(left ->14+), y=(top ->10+), w= 7, h= 7 value = 103418626951 {main} - -// lst.add(new ButtonPositionSize("topPanel", 7, POS_FULL_WIDTH, POS_TOP).setMoveDescendantsVertical()); -// -// lst.add(new ButtonPositionSize("leftWid", 7, POS_LEFT, POS_TOP). -// setMoveDescendantsVertical().setSize(10, 10)); -// -// lst.add(new ButtonPositionSize("zoomOut", 7, false, false).setMoveVertical()); -// lst.add(new ButtonPositionSize("zoomIn", 7, false, false).setMoveVertical()); -// lst.add(new ButtonPositionSize("myLoc", 7, false, false).setMoveHorizontal()); -// -// lst.add(new ButtonPositionSize("drawer", 7, true, false).setMoveHorizontal()); -// lst.add(new ButtonPositionSize("navigation", 7, true, false).setMoveHorizontal()); -// lst.add(new ButtonPositionSize("ruler", 10, true, false).setMoveHorizontal()); -// -// lst.add(new ButtonPositionSize("configMap", 6, true, true).setMoveHorizontal()); -// lst.add(new ButtonPositionSize("search", 6, true, true).setMoveHorizontal()); -// lst.add(new ButtonPositionSize("compass", 6, true, true).setMoveVertical()); - - return lst; - } } \ No newline at end of file diff --git a/OsmAnd/test/java/net/osmand/test/activities/OverlapButtonsTest.java b/OsmAnd/test/java/net/osmand/test/activities/OverlapButtonsTest.java index e0f015b480a..9de6dd702ad 100644 --- a/OsmAnd/test/java/net/osmand/test/activities/OverlapButtonsTest.java +++ b/OsmAnd/test/java/net/osmand/test/activities/OverlapButtonsTest.java @@ -1,21 +1,23 @@ package net.osmand.test.activities; +import static net.osmand.plus.views.controls.maphudbuttons.ButtonPositionSize.POS_FULL_WIDTH; +import static net.osmand.plus.views.controls.maphudbuttons.ButtonPositionSize.POS_TOP; + +import androidx.annotation.NonNull; + import net.osmand.plus.views.controls.maphudbuttons.ButtonPositionSize; import org.junit.Test; +import java.util.ArrayList; import java.util.List; -class OverlapButtonsTest { - - public static void main(String[] args) { - overlapTest(); - } +public class OverlapButtonsTest { @Test - public static void overlapTest() { + public void overlapTest() { System.out.println("--------START--------"); - List positions = MapHudOverlapTest.defaultLayoutExample(); + List positions = defaultLayoutExample(); for (ButtonPositionSize b : positions) { System.out.println(b); } @@ -26,4 +28,76 @@ public static void overlapTest() { } System.out.println("--------END--------"); } + + @NonNull + public static List defaultLayoutExample() { + List lst = new ArrayList<>(); + + lst.add(new ButtonPositionSize("map_left_widgets_panel").fromLongValue(343901601804L)); + lst.add(new ButtonPositionSize("map_right_widgets_panel").fromLongValue(343903830029L)); + lst.add(new ButtonPositionSize("top_widgets_panel").fromLongValue(343602233395L)); + lst.add(new ButtonPositionSize("map_bottom_widgets_panel").fromLongValue(412326428723L)); + lst.add(new ButtonPositionSize("map.view.layers").fromLongValue(103552253958L)); + lst.add(new ButtonPositionSize("map.view.quick_search").fromLongValue(69192581574L)); + lst.add(new ButtonPositionSize("map.view.compass").fromLongValue(103787134982L)); + lst.add(new ButtonPositionSize("map.view.zoom_out").fromLongValue(171802624007L)); + lst.add(new ButtonPositionSize("map.view.zoom_id").fromLongValue(172071059463L)); + lst.add(new ButtonPositionSize("map.view.back_to_loc").fromLongValue(137442951687L)); + lst.add(new ButtonPositionSize("map.view.menu").fromLongValue(138080354311L)); + lst.add(new ButtonPositionSize("map.view.route_planning").fromLongValue(138080354823L)); + lst.add(new ButtonPositionSize("map.view.map_3d").fromLongValue(172238898375L)); + lst.add(new ButtonPositionSize("quick_actions").fromLongValue(103083213639L)); + lst.add(new ButtonPositionSize("quick_actions_1729770291750").fromLongValue(103385203975L)); + lst.add(new ButtonPositionSize("quick_actions_1729770294329").fromLongValue(103653639943L)); + lst.add(new ButtonPositionSize("quick_actions_1729770296201").fromLongValue(103418626951L)); + +// Pos map_left_widgets_panel x=(left ->0 ), y=(top ->9 ), w=12, h= 4 value = 343901601804 {main} +// Pos map_right_widgets_panel x=(right->0 ), y=(top ->9 ), w=13, h= 8 value = 343903830029 {main} +// Pos top_widgets_panel x=(left ->0 ), y=(top ->0 ), w=51, h= 9 value = 343602233395 {main} +// Pos map_bottom_widgets_panel x=(left ->0 ), y=(bott->0 ), w=51, h=18 value = 412326428723 {main} +// Pos map.view.layers x=(left ->0 ), y=(top ->14+), w= 6, h= 6 value = 103552253958 {main} +// Pos map.view.quick_search x=(left ->7+), y=(top ->14 ), w= 6, h= 6 value = 69192581574 {main} +// Pos map.view.compass x=(left ->0 ), y=(top ->21+), w= 6, h= 6 value = 103787134982 {main} +// Pos map.view.zoom_out x=(right->0 ), y=(bott->0+), w= 7, h= 7 value = 171802624007 {main} +// Pos map.view.zoom_id x=(right->0 ), y=(bott->8+), w= 7, h= 7 value = 172071059463 {main} +// Pos map.view.back_to_loc x=(right->8+), y=(bott->0 ), w= 7, h= 7 value = 137442951687 {main} +// Pos map.view.menu x=(left ->0+), y=(bott->19 ), w= 7, h= 7 value = 138080354311 {main} +// Pos map.view.route_planning x=(left ->8+), y=(bott->19 ), w= 7, h= 7 value = 138080354823 {main} +// Pos map.view.map_3d x=(right->19+), y=(bott->13+), w= 7, h= 7 value = 172238898375 {main} +// Pos quick_actions x=(right->13+), y=(top ->0+), w= 7, h= 7 value = 103083213639 {main} +// Pos quick_actions_1729770291750 x=(right->20+), y=(top ->9+), w= 7, h= 7 value = 103385203975 {main} +// Pos quick_actions_1729770294329 x=(right->28+), y=(top ->17+), w= 7, h= 7 value = 103653639943 {main} +// Pos quick_actions_1729770296201 x=(left ->14+), y=(top ->10+), w= 7, h= 7 value = 103418626951 {main} + +// lst.add(new ButtonPositionSize("topPanel", 7, POS_FULL_WIDTH, POS_TOP).setMoveDescendantsVertical()); +// +// lst.add(new ButtonPositionSize("leftWid", 7, POS_LEFT, POS_TOP). +// setMoveDescendantsVertical().setSize(10, 10)); +// +// lst.add(new ButtonPositionSize("zoomOut", 7, false, false).setMoveVertical()); +// lst.add(new ButtonPositionSize("zoomIn", 7, false, false).setMoveVertical()); +// lst.add(new ButtonPositionSize("myLoc", 7, false, false).setMoveHorizontal()); +// +// lst.add(new ButtonPositionSize("drawer", 7, true, false).setMoveHorizontal()); +// lst.add(new ButtonPositionSize("navigation", 7, true, false).setMoveHorizontal()); +// lst.add(new ButtonPositionSize("ruler", 10, true, false).setMoveHorizontal()); +// +// lst.add(new ButtonPositionSize("configMap", 6, true, true).setMoveHorizontal()); +// lst.add(new ButtonPositionSize("search", 6, true, true).setMoveHorizontal()); +// lst.add(new ButtonPositionSize("compass", 6, true, true).setMoveVertical()); + + return lst; + } + + @NonNull + public static List defaultLayoutExample2() { + List lst = new ArrayList<>(); + lst.add(new ButtonPositionSize("map_left_widgets_panel", 12, true, true) + .setSize(12, 18).setMargin(0, 13)); + lst.add(new ButtonPositionSize("map_right_widgets_panel", 12, true, true) + .setSize(14, 12).setMargin(0, 13)); + lst.add(new ButtonPositionSize("top_widgets_panel", 12, POS_FULL_WIDTH, POS_TOP) + .setSize(51, 12).setMargin(0, 0)); + return lst; + } } \ No newline at end of file