Merge branches 'master' and 'speed_cameras' of https://github.com/osmandapp/Osmand into speed_cameras

This commit is contained in:
veliymolfar 2020-06-11 11:09:37 +03:00
commit 6cf97379a7
36 changed files with 544 additions and 185 deletions

View file

@ -138,7 +138,7 @@ public class BinaryRoutePlanner {
checkIfGraphIsEmpty(ctx, ctx.getPlanRoadDirection() >= 0, graphDirectSegments, start, visitedDirectSegments,
"Route is not found from selected start point.");
if (ctx.planRouteIn2Directions()) {
forwardSearch = (nonHeuristicSegmentsComparator.compare(graphDirectSegments.peek(), graphReverseSegments.peek()) < 0);
forwardSearch = nonHeuristicSegmentsComparator.compare(graphDirectSegments.peek(), graphReverseSegments.peek()) <= 0;
// if (graphDirectSegments.size() * 2 > graphReverseSegments.size()) {
// forwardSearch = false;
// } else if (graphDirectSegments.size() < 2 * graphReverseSegments.size()) {
@ -798,10 +798,32 @@ public class BinaryRoutePlanner {
" distToEnd=" + distanceToEnd +
" segmentPoint=" + segmentPoint + " -- ", next, true);
}
if (!visitedSegments.containsKey(calculateRoutePointId(next, next.isPositive()))) {
if (next.getParentRoute() == null
|| ctx.roadPriorityComparator(next.distanceFromStart, next.distanceToEnd,
distFromStart, distanceToEnd) > 0) {
RouteSegment visIt = visitedSegments.get(calculateRoutePointId(next, next.isPositive()));
boolean toAdd = true;
if (visIt != null) {
// the segment was already visited! We need to follow better route if it exists
// that is very exceptional situation and almost exception, it can happen
// 1. when we underestimate distnceToEnd - wrong h()
// 2. because we process not small segments but the whole road, it could be that
// deviation from the road is faster than following the whole road itself!
if (TRACE_ROUTING) {
printRoad(">?", visitedSegments.get(calculateRoutePointId(next, next.isPositive())),
next.isPositive());
}
if (distFromStart < next.distanceFromStart) {
if (ctx.config.heuristicCoefficient <= 1) {
System.err.println("! Alert distance from start " + distFromStart + " < "
+ next.distanceFromStart + " id=" + next.road.id);
}
}
if (distFromStart < visIt.distanceFromStart && next.getParentRoute() == null) {
toAdd = true;
} else {
toAdd = false;
}
}
if (toAdd && (next.getParentRoute() == null || ctx.roadPriorityComparator(next.distanceFromStart,
next.distanceToEnd, distFromStart, distanceToEnd) > 0)) {
next.distanceFromStart = distFromStart;
next.distanceToEnd = distanceToEnd;
if (TRACE_ROUTING) {
@ -812,27 +834,6 @@ public class BinaryRoutePlanner {
next.setParentSegmentEnd(segmentPoint);
graphSegments.add(next);
}
} else {
// the segment was already visited! We need to follow better route if it exists
// that is very exceptional situation and almost exception, it can happen
// 1. when we underestimate distnceToEnd - wrong h()
// 2. because we process not small segments but the whole road, it could be that
// deviation from the road is faster than following the whole road itself!
if (distFromStart < next.distanceFromStart) {
if (ctx.config.heuristicCoefficient <= 1) {
System.err.println("! Alert distance from start " + distFromStart + " < "
+ next.distanceFromStart + " id=" + next.road.id);
}
// A: we can't change parent route just here, because we need to update visitedSegments
// presumably we can do visitedSegments.put(calculateRoutePointId(next), next);
// next.distanceFromStart = distFromStart;
// next.setParentRoute(segment);
// next.setParentSegmentEnd(segmentPoint);
if (ctx.visitor != null) {
// ctx.visitor.visitSegment(next, false);
}
}
}
}
}

View file

@ -234,6 +234,7 @@ public class RoutePlannerFrontEnd {
if (intermediates != null) {
for (LatLon l : intermediates) {
if (!addSegment(l, ctx, indexNotFound++, points, false)) {
System.out.println(points.get(points.size() - 1).getRoad().toString());
return null;
}
}
@ -300,7 +301,8 @@ public class RoutePlannerFrontEnd {
int py = MapUtils.get31TileNumberY(point.getLatitude());
int pind = st ? routeSegmentResult.getStartPointIndex() : routeSegmentResult.getEndPointIndex();
RouteDataObject r = routeSegmentResult.getObject();
RouteDataObject r = new RouteDataObject(routeSegmentResult.getObject());
routeSegmentResult.setObject(r);
QuadPoint before = null;
QuadPoint after = null;
if (pind > 0) {
@ -364,7 +366,7 @@ public class RoutePlannerFrontEnd {
ctx.calculationProgress.segmentNotFound = indexNotFound;
return false;
} else {
log.info("Route segment found " + f.getRoad().id + " " + f.getRoad().getName());
log.info("Route segment found " + f.road);
res.add(f);
return true;
}
@ -383,6 +385,10 @@ public class RoutePlannerFrontEnd {
ctx.precalculatedRouteDirection = routeDirection.adopt(ctx);
}
if (ctx.nativeLib != null) {
ctx.startX = start.preciseX;
ctx.startY = start.preciseY;
ctx.targetX = end.preciseX;
ctx.targetY = end.preciseY;
return runNativeRouting(ctx, recalculationEnd);
} else {
refreshProgressDistance(ctx);

View file

@ -1,6 +1,24 @@
package net.osmand.router;
import net.osmand.NativeLibrary;
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.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import gnu.trove.iterator.TIntIterator;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.set.hash.TIntHashSet;
import net.osmand.PlatformUtil;
import net.osmand.binary.BinaryMapIndexReader;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
@ -19,26 +37,6 @@ 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.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import gnu.trove.iterator.TIntIterator;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.set.hash.TIntHashSet;
public class RouteResultPreparation {
public static boolean PRINT_TO_CONSOLE_ROUTE_INFORMATION_TO_TEST = false;
@ -396,7 +394,6 @@ public class RouteResultPreparation {
}
// reverse it just to attach good direction roads
Collections.reverse(result);
segment = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentRoute() : finalSegment;
int parentSegmentEnd = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentSegmentEnd() : finalSegment.opposite.getSegmentStart();
parentRoutingTime = -1;
@ -623,7 +620,7 @@ public class RouteResultPreparation {
// calculateStatistics(result);
}
private void calculateStatistics(List<RouteSegmentResult> result) {
protected void calculateStatistics(List<RouteSegmentResult> result) {
InputStream is = RenderingRulesStorage.class.getResourceAsStream("default.render.xml");
final Map<String, String> renderingConstants = new LinkedHashMap<String, String>();
try {
@ -800,13 +797,22 @@ public class RouteResultPreparation {
}
if (dist < mergeDistance) {
mergeTurnLanes(leftside, currentSegment, nextSegment);
inferCommonActiveLane(currentSegment.getTurnType(), nextSegment.getTurnType());
TurnType turnType = currentSegment.getTurnType();
TIntHashSet possibleTurn = getPossibleTurnsFromActiveLanes(turnType.getLanes(), true);
if (possibleTurn.size() == 1) {
TurnType tt = TurnType.valueOf(possibleTurn.iterator().next(), currentSegment.getTurnType().isLeftSide());
tt.setLanes(turnType.getLanes());
tt.setSkipToSpeak(turnType.isSkipToSpeak());
currentSegment.setTurnType(tt);
turnType = tt;
}
inferCommonActiveLane(turnType, nextSegment.getTurnType());
merged = true;
}
}
if (!merged) {
TurnType tt = currentSegment.getTurnType();
inferActiveTurnLanesFromTurn(tt, TurnType.C);
inferActiveTurnLanesFromTurn(tt, tt.getValue());
}
nextSegment = currentSegment;
dist = 0;
@ -984,11 +990,9 @@ public class RouteResultPreparation {
if(turnSet.size() == 1) {
singleTurn = turnSet.iterator().next();
} else if(currentTurn.goAhead() && turnSet.contains(nextTurn.getValue())) {
if(currentTurn.isPossibleLeftTurn() &&
TurnType.isLeftTurn(nextTurn.getValue())) {
if (currentTurn.isPossibleLeftTurn() && TurnType.isLeftTurn(nextTurn.getValue())) {
singleTurn = nextTurn.getValue();
} else if(currentTurn.isPossibleLeftTurn() &&
TurnType.isLeftTurn(nextTurn.getActiveCommonLaneTurn())) {
} else if (currentTurn.isPossibleLeftTurn() && TurnType.isLeftTurn(nextTurn.getActiveCommonLaneTurn())) {
singleTurn = nextTurn.getActiveCommonLaneTurn();
} else if(currentTurn.isPossibleRightTurn() &&
TurnType.isRightTurn(nextTurn.getValue())) {
@ -1054,7 +1058,7 @@ public class RouteResultPreparation {
// add description about turn
double mpi = MapUtils.degreesDiff(prev.getBearingEnd(), rr.getBearingBegin());
if(noAttachedRoads){
// TODO VICTOR : look at the comment inside direction route
// VICTOR : look at the comment inside direction route
// ? avoid small zigzags is covered at (search for "zigzags")
// double begin = rr.getObject().directionRoute(rr.getStartPointIndex(), rr.getStartPointIndex() <
// rr.getEndPointIndex(), 25);
@ -1269,17 +1273,8 @@ public class RouteResultPreparation {
String[] splitLaneOptions = turnLanes.split("\\|", -1);
int activeBeginIndex = findActiveIndex(rawLanes, splitLaneOptions, rs.leftLanes, true,
rs.leftLanesInfo, rs.roadsOnLeft, rs.addRoadsOnLeft);
if(!rs.keepLeft && activeBeginIndex != -1 &&
splitLaneOptions.length > 0 && !splitLaneOptions[splitLaneOptions.length - 1].contains(";")) {
activeBeginIndex = Math.max(activeBeginIndex, 1);
}
int activeEndIndex = findActiveIndex(rawLanes, splitLaneOptions, rs.rightLanes, false,
rs.rightLanesInfo, rs.roadsOnRight, rs.addRoadsOnRight);
if(!rs.keepRight && activeEndIndex != -1 &&
splitLaneOptions.length > 0 && !splitLaneOptions[0].contains(";") ) {
activeEndIndex = Math.min(activeEndIndex, rawLanes.length - 1);
}
if (activeBeginIndex == -1 || activeEndIndex == -1 || activeBeginIndex > activeEndIndex) {
// something went wrong
return createSimpleKeepLeftRightTurn(leftSide, prevSegm, currentSegm, rs);
@ -1292,6 +1287,12 @@ public class RouteResultPreparation {
int tp = inferSlightTurnFromLanes(rawLanes, rs);
if (tp != t.getValue() && tp != 0) {
t = TurnType.valueOf(tp, leftSide);
} else {
if (rs.keepRight && TurnType.getSecondaryTurn(rawLanes[activeEndIndex]) == 0) {
t = TurnType.valueOf(TurnType.getPrimaryTurn(rawLanes[activeEndIndex]), leftSide);
} else if (rs.keepLeft && TurnType.getSecondaryTurn(rawLanes[activeBeginIndex]) == 0) {
t = TurnType.valueOf(TurnType.getPrimaryTurn(rawLanes[activeBeginIndex]), leftSide);
}
}
} else {
for (int k = 0; k < rawLanes.length; k++) {
@ -1597,59 +1598,11 @@ public class RouteResultPreparation {
}
private int inferSlightTurnFromLanes(int[] oLanes, RoadSplitStructure rs) {
TIntHashSet possibleTurns = new TIntHashSet();
for (int i = 0; i < oLanes.length; i++) {
if ((oLanes[i] & 1) == 0) {
continue;
}
if (possibleTurns.isEmpty()) {
// Nothing is in the list to compare to, so add the first elements
possibleTurns.add(TurnType.getPrimaryTurn(oLanes[i]));
if (TurnType.getSecondaryTurn(oLanes[i]) != 0) {
possibleTurns.add(TurnType.getSecondaryTurn(oLanes[i]));
}
if (TurnType.getTertiaryTurn(oLanes[i]) != 0) {
possibleTurns.add(TurnType.getTertiaryTurn(oLanes[i]));
}
} else {
TIntArrayList laneTurns = new TIntArrayList();
laneTurns.add(TurnType.getPrimaryTurn(oLanes[i]));
if (TurnType.getSecondaryTurn(oLanes[i]) != 0) {
laneTurns.add(TurnType.getSecondaryTurn(oLanes[i]));
}
if (TurnType.getTertiaryTurn(oLanes[i]) != 0) {
laneTurns.add(TurnType.getTertiaryTurn(oLanes[i]));
}
possibleTurns.retainAll(laneTurns);
TIntHashSet possibleTurns = getPossibleTurnsFromActiveLanes(oLanes, false);
if (possibleTurns.isEmpty()) {
// No common turns, so can't determine anything.
return 0;
}
}
}
// Remove all turns from lanes not selected...because those aren't it
for (int i = 0; i < oLanes.length; i++) {
if ((oLanes[i] & 1) == 0 && !possibleTurns.isEmpty()) {
possibleTurns.remove((Integer) TurnType.getPrimaryTurn(oLanes[i]));
if (TurnType.getSecondaryTurn(oLanes[i]) != 0) {
possibleTurns.remove((Integer) TurnType.getSecondaryTurn(oLanes[i]));
}
if (TurnType.getTertiaryTurn(oLanes[i]) != 0) {
possibleTurns.remove((Integer) TurnType.getTertiaryTurn(oLanes[i]));
}
}
}
// remove all non-slight turns // TEST don't pass
// if(possibleTurns.size() > 1) {
// TIntIterator it = possibleTurns.iterator();
// while(it.hasNext()) {
// int nxt = it.next();
// if(!TurnType.isSlightTurn(nxt)) {
// it.remove();
// }
// }
// }
int infer = 0;
if (possibleTurns.size() == 1) {
infer = possibleTurns.iterator().next();
@ -1688,6 +1641,53 @@ public class RouteResultPreparation {
return infer;
}
private TIntHashSet getPossibleTurnsFromActiveLanes(int[] oLanes, boolean onlyPrimary) {
TIntHashSet possibleTurns = new TIntHashSet();
for (int i = 0; i < oLanes.length; i++) {
if ((oLanes[i] & 1) == 0) {
continue;
}
if (possibleTurns.isEmpty()) {
// Nothing is in the list to compare to, so add the first elements
possibleTurns.add(TurnType.getPrimaryTurn(oLanes[i]));
if (!onlyPrimary && TurnType.getSecondaryTurn(oLanes[i]) != 0) {
possibleTurns.add(TurnType.getSecondaryTurn(oLanes[i]));
}
if (!onlyPrimary && TurnType.getTertiaryTurn(oLanes[i]) != 0) {
possibleTurns.add(TurnType.getTertiaryTurn(oLanes[i]));
}
} else {
TIntArrayList laneTurns = new TIntArrayList();
laneTurns.add(TurnType.getPrimaryTurn(oLanes[i]));
if (!onlyPrimary && TurnType.getSecondaryTurn(oLanes[i]) != 0) {
laneTurns.add(TurnType.getSecondaryTurn(oLanes[i]));
}
if (!onlyPrimary && TurnType.getTertiaryTurn(oLanes[i]) != 0) {
laneTurns.add(TurnType.getTertiaryTurn(oLanes[i]));
}
possibleTurns.retainAll(laneTurns);
if (possibleTurns.isEmpty()) {
// No common turns, so can't determine anything.
return possibleTurns;
}
}
}
// Remove all turns from lanes not selected...because those aren't it
for (int i = 0; i < oLanes.length; i++) {
if ((oLanes[i] & 1) == 0 && !possibleTurns.isEmpty()) {
possibleTurns.remove((Integer) TurnType.getPrimaryTurn(oLanes[i]));
if (TurnType.getSecondaryTurn(oLanes[i]) != 0) {
possibleTurns.remove((Integer) TurnType.getSecondaryTurn(oLanes[i]));
}
if (TurnType.getTertiaryTurn(oLanes[i]) != 0) {
possibleTurns.remove((Integer) TurnType.getTertiaryTurn(oLanes[i]));
}
}
}
return possibleTurns;
}
private boolean isMotorway(RouteSegmentResult s){
String h = s.getObject().getHighway();
return "motorway".equals(h) || "motorway_link".equals(h) ||

View file

@ -21,7 +21,9 @@ import gnu.trove.map.hash.TIntObjectHashMap;
public class RouteSegmentResult implements StringExternalizable<RouteDataBundle> {
private final RouteDataObject object;
// this should be bigger (50-80m) but tests need to be fixed first
private static final float DIST_BEARING_DETECT = 5;
private RouteDataObject object;
private int startPointIndex;
private int endPointIndex;
private List<RouteSegmentResult>[] attachedRoutes;
@ -444,11 +446,11 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
}
public float getBearingBegin() {
return (float) (object.directionRoute(startPointIndex, startPointIndex < endPointIndex) / Math.PI * 180);
return (float) (object.directionRoute(startPointIndex, startPointIndex < endPointIndex, DIST_BEARING_DETECT) / Math.PI * 180);
}
public float getBearing(int point, boolean plus) {
return (float) (object.directionRoute(point, plus) / Math.PI * 180);
return (float) (object.directionRoute(point, plus, DIST_BEARING_DETECT) / Math.PI * 180);
}
public float getDistance(int point, boolean plus) {
@ -456,7 +458,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
}
public float getBearingEnd() {
return (float) (MapUtils.alignAngleDifference(object.directionRoute(endPointIndex, startPointIndex > endPointIndex) - Math.PI) / Math.PI * 180);
return (float) (MapUtils.alignAngleDifference(object.directionRoute(endPointIndex, startPointIndex > endPointIndex, DIST_BEARING_DETECT) - Math.PI) / Math.PI * 180);
}
public void setSegmentTime(float segmentTime) {
@ -534,9 +536,15 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
this.description = description;
}
public void setObject(RouteDataObject r) {
this.object = r;
}
@Override
public String toString() {
return object.toString() + ": " + startPointIndex + "-" + endPointIndex;
}
}

View file

@ -467,15 +467,14 @@ public class RoutingContext {
long h2 = runGCUsedMemory();
float mb = (1 << 20);
log.warn("Unload tiles : estimated " + (sz1 - sz2) / mb + " ?= " + (h1 - h2) / mb + " actual");
log.warn("Used after " + h2 / mb + " of " + Runtime.getRuntime().totalMemory() / mb + " max "
+ maxMemory() / mb);
log.warn("Used after " + h2 / mb + " of " + Runtime.getRuntime().totalMemory() / mb );
} else {
float mb = (1 << 20);
int sz2 = getCurrentEstimatedSize();
log.warn("Unload tiles : occupied before " + sz1 / mb + " Mb - now " + sz2 / mb + "MB "
+ memoryLimit / mb + " limit MB " + config.memoryLimitation / mb);
long us2 = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
log.warn("Used memory before " + us1 / mb + "after " + us1 / mb + " of max " + maxMemory() / mb);
log.warn("Used memory before " + us1 / mb + "after " + us1 / mb );
}
}
if (!indexedSubregions.containsKey(tileId)) {
@ -507,12 +506,6 @@ public class RoutingContext {
return tileId;
}
private long maxMemory() {
// AVIAN FIXME
// return Runtime.getRuntime().maxMemory();
return 0;
}
public boolean checkIfMemoryLimitCritical(long memoryLimit) {

View file

@ -23,7 +23,7 @@ import net.osmand.osm.edit.Way;
import net.osmand.util.MapUtils;
public class TransportStopsRouteReader {
public static final int MISSING_STOP_SEARCH_RADIUS = 15000;
public static final int MISSING_STOP_SEARCH_RADIUS = 30000;
TLongObjectHashMap<TransportRoute> combinedRoutesCache = new TLongObjectHashMap<TransportRoute>();
Map<BinaryMapIndexReader, TIntObjectHashMap<TransportRoute>> routesFilesCache = new LinkedHashMap<BinaryMapIndexReader,
TIntObjectHashMap<TransportRoute>>();

View file

@ -38,15 +38,13 @@ public class RouteResultPreparationTest {
private static RoutePlannerFrontEnd fe;
private static RoutingContext ctx;
private String testName;
private LatLon startPoint;
private LatLon endPoint;
private Map<Long, String> expectedResults;
private Log log = PlatformUtil.getLog(RouteResultPreparationTest.class);
protected Log log = PlatformUtil.getLog(RouteResultPreparationTest.class);
public RouteResultPreparationTest(String testName, LatLon startPoint, LatLon endPoint, Map<Long, String> expectedResults) {
this.testName = testName;
this.startPoint = startPoint;
this.endPoint = endPoint;
this.expectedResults = expectedResults;

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View file

@ -0,0 +1,99 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="360dp"
android:height="90dp"
android:viewportWidth="360"
android:viewportHeight="90">
<path
android:pathData="M174,0H0V90H174V0Z"
android:fillColor="#F5F5F5"/>
<path
android:pathData="M360,0H186V90H360V0Z"
android:fillColor="#F5F5F5"/>
<path
android:pathData="M0,12V22H2C5.314,22 8,24.686 8,28V90H26V28C26,24.686 28.686,22 32,22H142C145.314,22 148,24.686 148,28V90H166V28C166,24.686 168.686,22 172,22H174V12H0Z"
android:fillColor="#D7D8DB"/>
<path
android:pathData="M224,32L244,12H256L233.801,39.748C232.663,41.172 230.939,42 229.116,42H218C214.686,42 212,44.686 212,48V90H194V48C194,44.686 191.314,42 188,42H186V32H224Z"
android:fillColor="#D7D8DB"/>
<path
android:pathData="M322,32L302,12H290L312.199,39.748C313.337,41.172 315.061,42 316.884,42H328C331.314,42 334,44.686 334,48V90H352V48C352,44.686 354.686,42 358,42H360V32H322Z"
android:fillColor="#D7D8DB"/>
<path
android:pathData="M0,85V90H174V80.391C164.31,86.609 153.528,86.146 144,79C133.811,86.642 122.189,86.642 112,79C101.811,86.642 90.189,86.642 80,79C69.811,86.642 58.189,86.642 48,79C37.811,86.642 26.189,86.642 16,79C8,85 0,85 0,85Z"
android:strokeAlpha="0.5"
android:fillColor="#237BFF"
android:fillAlpha="0.5"/>
<path
android:pathData="M89,32C89,30.895 88.105,30 87,30C85.895,30 85,30.895 85,32V36H89V32Z"
android:fillColor="#237BFF"/>
<path
android:pathData="M71,44C71,40.686 73.686,38 77,38H97C100.314,38 103,40.686 103,44V54H71V44ZM75,44H85V50H75V44ZM89,44H99V50H89V44Z"
android:fillColor="#237BFF"
android:fillType="evenOdd"/>
<path
android:pathData="M63,56V65.8C63,70.492 65.735,74.753 70,76.708L72.863,78.021C70.225,79.295 67.32,80 64,80C57.424,80 52.476,77.233 48,72.757C43.524,77.233 38.576,80 32,80C25.424,80 20.476,77.233 16,72.757C12.574,76.183 9.031,79.268 4.044,80.035C2.148,80.326 0.663,80.211 0,80.125V86.156C1.166,86.253 2.89,86.283 4.956,85.965C8.156,85.473 12.143,84.146 16.038,80.998C20.538,84.398 26.357,86 32,86C37.659,86 43.494,84.389 48,80.969C52.506,84.389 58.341,86 64,86C69.547,86 75.265,84.452 79.732,81.169L81.325,81.899C85.618,84.682 90.881,86 96,86C101.659,86 107.494,84.389 112,80.969C116.506,84.389 122.341,86 128,86C133.659,86 139.494,84.389 144,80.969C148.506,84.389 154.341,86 160,86C164.853,86 169.837,84.815 174,82.32V74.5C170.69,77.81 165.405,80 160,80C153.424,80 148.476,77.233 144,72.757C139.524,77.233 134.576,80 128,80C121.424,80 116.476,77.233 112,72.757C107.72,77.038 103.008,79.755 96.853,79.984L104,76.708C108.265,74.753 111,70.492 111,65.8V56H63ZM79,62V66.5L71,62H79ZM95,62V66.5L103,62H95Z"
android:fillColor="#237BFF"
android:fillType="evenOdd"/>
<path
android:pathData="M275,32C275,30.895 274.105,30 273,30C271.895,30 271,30.895 271,32V36H275V32Z"
android:fillColor="#237BFF"/>
<path
android:pathData="M257,44C257,40.686 259.686,38 263,38H283C286.314,38 289,40.686 289,44V54H257V44ZM261,44H271V50H261V44ZM275,44H285V50H275V44Z"
android:fillColor="#237BFF"
android:fillType="evenOdd"/>
<path
android:pathData="M249,56V65.8C249,70.492 251.735,74.753 256,76.708L258.863,78.021C256.225,79.295 253.32,80 250,80C243.424,80 238.476,77.233 234,72.757C229.524,77.233 224.576,80 218,80C211.424,80 206.476,77.233 202,72.757C198.574,76.183 195.031,79.268 190.044,80.035C188.148,80.326 186.663,80.211 186,80.125V86.156C187.166,86.253 188.89,86.283 190.956,85.965C194.156,85.473 198.143,84.146 202.038,80.998C206.538,84.398 212.357,86 218,86C223.659,86 229.494,84.389 234,80.969C238.506,84.389 244.341,86 250,86C255.547,86 261.265,84.452 265.732,81.169L267.325,81.899C271.618,84.682 276.881,86 282,86C287.659,86 293.494,84.389 298,80.969C302.506,84.389 308.341,86 314,86C319.659,86 325.494,84.389 330,80.969C334.506,84.389 340.341,86 346,86C350.853,86 355.837,84.815 360,82.32V74.5C356.69,77.81 351.405,80 346,80C339.424,80 334.476,77.233 330,72.757C325.524,77.233 320.576,80 314,80C307.424,80 302.476,77.233 298,72.757C293.72,77.038 289.008,79.755 282.853,79.984L290,76.708C294.265,74.753 297,70.492 297,65.8V56H249ZM265,62V66.5L257,62H265ZM281,62V66.5L289,62H281Z"
android:fillColor="#237BFF"
android:fillType="evenOdd"/>
<path
android:pathData="M54,23L60,29L66,23L54,23Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M54,90L60,84L66,90H54Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M59,33C59,32.448 59.448,32 60,32C60.552,32 61,32.448 61,33V40C61,40.552 60.552,41 60,41C59.448,41 59,40.552 59,40V33Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M59,59C59,58.448 59.448,58 60,58C60.552,58 61,58.448 61,59L61,66C61,66.552 60.552,67 60,67C59.448,67 59,66.552 59,66L59,59Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M60,71C59.448,71 59,71.448 59,72L59,79C59,79.552 59.448,80 60,80C60.552,80 61,79.552 61,79L61,72C61,71.448 60.552,71 60,71Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M59,46C59,45.448 59.448,45 60,45C60.552,45 61,45.448 61,46L61,53C61,53.552 60.552,54 60,54C59.448,54 59,53.552 59,53L59,46Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M111,29l-0,1l-51,0l-0,-1z"
android:strokeAlpha="0.5"
android:fillColor="#EE5622"
android:fillAlpha="0.5"/>
<path
android:pathData="M186,85V90H360V80.391C350.31,86.609 339.528,86.146 330,79C319.811,86.642 308.189,86.642 298,79C287.811,86.642 276.189,86.642 266,79C255.811,86.642 244.189,86.642 234,79C223.811,86.642 212.189,86.642 202,79C194,85 186,85 186,85Z"
android:strokeAlpha="0.5"
android:fillColor="#237BFF"
android:fillAlpha="0.5"/>
<path
android:pathData="M240,23L246,29L252,23L240,23Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M240,90L246,84L252,90H240Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M245,33C245,32.448 245.448,32 246,32C246.552,32 247,32.448 247,33V40C247,40.552 246.552,41 246,41C245.448,41 245,40.552 245,40V33Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M245,59C245,58.448 245.448,58 246,58C246.552,58 247,58.448 247,59L247,66C247,66.552 246.552,67 246,67C245.448,67 245,66.552 245,66L245,59Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M246,71C245.448,71 245,71.448 245,72L245,79C245,79.552 245.448,80 246,80C246.552,80 247,79.552 247,79L247,72C247,71.448 246.552,71 246,71Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M245,46C245,45.448 245.448,45 246,45C246.552,45 247,45.448 247,46L247,53C247,53.552 246.552,54 246,54C245.448,54 245,53.552 245,53L245,46Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M297,29l-0,1l-51,0l-0,-1z"
android:strokeAlpha="0.5"
android:fillColor="#EE5622"
android:fillAlpha="0.5"/>
</vector>

View file

@ -0,0 +1,99 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="360dp"
android:height="90dp"
android:viewportWidth="360"
android:viewportHeight="90">
<path
android:pathData="M174,0H0V90H174V0Z"
android:fillColor="#28292A"/>
<path
android:pathData="M360,0H186V90H360V0Z"
android:fillColor="#28292A"/>
<path
android:pathData="M0,12V22H2C5.314,22 8,24.686 8,28V90H26V28C26,24.686 28.686,22 32,22H142C145.314,22 148,24.686 148,28V90H166V28C166,24.686 168.686,22 172,22H174V12H0Z"
android:fillColor="#4B4C4E"/>
<path
android:pathData="M224,32L244,12H256L233.801,39.748C232.663,41.172 230.939,42 229.116,42H218C214.686,42 212,44.686 212,48V90H194V48C194,44.686 191.314,42 188,42H186V32H224Z"
android:fillColor="#4B4C4E"/>
<path
android:pathData="M322,32L302,12H290L312.199,39.748C313.337,41.172 315.061,42 316.884,42H328C331.314,42 334,44.686 334,48V90H352V48C352,44.686 354.686,42 358,42H360V32H322Z"
android:fillColor="#4B4C4E"/>
<path
android:pathData="M0,85V90H174V80.391C164.31,86.609 153.528,86.146 144,79C133.811,86.642 122.189,86.642 112,79C101.811,86.642 90.189,86.642 80,79C69.811,86.642 58.189,86.642 48,79C37.811,86.642 26.189,86.642 16,79C8,85 0,85 0,85Z"
android:strokeAlpha="0.5"
android:fillColor="#237BFF"
android:fillAlpha="0.5"/>
<path
android:pathData="M89,32C89,30.895 88.105,30 87,30C85.895,30 85,30.895 85,32V36H89V32Z"
android:fillColor="#237BFF"/>
<path
android:pathData="M71,44C71,40.686 73.686,38 77,38H97C100.314,38 103,40.686 103,44V54H71V44ZM75,44H85V50H75V44ZM89,44H99V50H89V44Z"
android:fillColor="#237BFF"
android:fillType="evenOdd"/>
<path
android:pathData="M63,56V65.8C63,70.492 65.735,74.753 70,76.708L72.863,78.021C70.225,79.295 67.32,80 64,80C57.424,80 52.476,77.233 48,72.757C43.524,77.233 38.576,80 32,80C25.424,80 20.476,77.233 16,72.757C12.574,76.183 9.031,79.268 4.044,80.035C2.148,80.326 0.663,80.211 0,80.125V86.156C1.166,86.253 2.89,86.283 4.956,85.965C8.156,85.473 12.143,84.146 16.038,80.998C20.538,84.398 26.357,86 32,86C37.659,86 43.494,84.389 48,80.969C52.506,84.389 58.341,86 64,86C69.547,86 75.265,84.452 79.732,81.169L81.325,81.899C85.618,84.682 90.881,86 96,86C101.659,86 107.494,84.389 112,80.969C116.506,84.389 122.341,86 128,86C133.659,86 139.494,84.389 144,80.969C148.506,84.389 154.341,86 160,86C164.853,86 169.837,84.815 174,82.32V74.5C170.69,77.81 165.405,80 160,80C153.424,80 148.476,77.233 144,72.757C139.524,77.233 134.576,80 128,80C121.424,80 116.476,77.233 112,72.757C107.72,77.038 103.008,79.755 96.853,79.984L104,76.708C108.265,74.753 111,70.492 111,65.8V56H63ZM79,62V66.5L71,62H79ZM95,62V66.5L103,62H95Z"
android:fillColor="#237BFF"
android:fillType="evenOdd"/>
<path
android:pathData="M275,32C275,30.895 274.105,30 273,30C271.895,30 271,30.895 271,32V36H275V32Z"
android:fillColor="#237BFF"/>
<path
android:pathData="M257,44C257,40.686 259.686,38 263,38H283C286.314,38 289,40.686 289,44V54H257V44ZM261,44H271V50H261V44ZM275,44H285V50H275V44Z"
android:fillColor="#237BFF"
android:fillType="evenOdd"/>
<path
android:pathData="M249,56V65.8C249,70.492 251.735,74.753 256,76.708L258.863,78.021C256.225,79.295 253.32,80 250,80C243.424,80 238.476,77.233 234,72.757C229.524,77.233 224.576,80 218,80C211.424,80 206.476,77.233 202,72.757C198.574,76.183 195.031,79.268 190.044,80.035C188.148,80.326 186.663,80.211 186,80.125V86.156C187.166,86.253 188.89,86.283 190.956,85.965C194.156,85.473 198.143,84.146 202.038,80.998C206.538,84.398 212.357,86 218,86C223.659,86 229.494,84.389 234,80.969C238.506,84.389 244.341,86 250,86C255.547,86 261.265,84.452 265.732,81.169L267.325,81.899C271.618,84.682 276.881,86 282,86C287.659,86 293.494,84.389 298,80.969C302.506,84.389 308.341,86 314,86C319.659,86 325.494,84.389 330,80.969C334.506,84.389 340.341,86 346,86C350.853,86 355.837,84.815 360,82.32V74.5C356.69,77.81 351.405,80 346,80C339.424,80 334.476,77.233 330,72.757C325.524,77.233 320.576,80 314,80C307.424,80 302.476,77.233 298,72.757C293.72,77.038 289.008,79.755 282.853,79.984L290,76.708C294.265,74.753 297,70.492 297,65.8V56H249ZM265,62V66.5L257,62H265ZM281,62V66.5L289,62H281Z"
android:fillColor="#237BFF"
android:fillType="evenOdd"/>
<path
android:pathData="M54,23L60,29L66,23L54,23Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M54,90L60,84L66,90H54Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M59,33C59,32.448 59.448,32 60,32C60.552,32 61,32.448 61,33V40C61,40.552 60.552,41 60,41C59.448,41 59,40.552 59,40V33Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M59,59C59,58.448 59.448,58 60,58C60.552,58 61,58.448 61,59L61,66C61,66.552 60.552,67 60,67C59.448,67 59,66.552 59,66L59,59Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M60,71C59.448,71 59,71.448 59,72L59,79C59,79.552 59.448,80 60,80C60.552,80 61,79.552 61,79L61,72C61,71.448 60.552,71 60,71Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M59,46C59,45.448 59.448,45 60,45C60.552,45 61,45.448 61,46L61,53C61,53.552 60.552,54 60,54C59.448,54 59,53.552 59,53L59,46Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M111,29l-0,1l-51,0l-0,-1z"
android:strokeAlpha="0.5"
android:fillColor="#EE5622"
android:fillAlpha="0.5"/>
<path
android:pathData="M186,85V90H360V80.391C350.31,86.609 339.528,86.146 330,79C319.811,86.642 308.189,86.642 298,79C287.811,86.642 276.189,86.642 266,79C255.811,86.642 244.189,86.642 234,79C223.811,86.642 212.189,86.642 202,79C194,85 186,85 186,85Z"
android:strokeAlpha="0.5"
android:fillColor="#237BFF"
android:fillAlpha="0.5"/>
<path
android:pathData="M240,23L246,29L252,23L240,23Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M240,90L246,84L252,90H240Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M245,33C245,32.448 245.448,32 246,32C246.552,32 247,32.448 247,33V40C247,40.552 246.552,41 246,41C245.448,41 245,40.552 245,40V33Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M245,59C245,58.448 245.448,58 246,58C246.552,58 247,58.448 247,59L247,66C247,66.552 246.552,67 246,67C245.448,67 245,66.552 245,66L245,59Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M246,71C245.448,71 245,71.448 245,72L245,79C245,79.552 245.448,80 246,80C246.552,80 247,79.552 247,79L247,72C247,71.448 246.552,71 246,71Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M245,46C245,45.448 245.448,45 246,45C246.552,45 247,45.448 247,46L247,53C247,53.552 246.552,54 246,54C245.448,54 245,53.552 245,53L245,46Z"
android:fillColor="#EE5622"/>
<path
android:pathData="M297,29l-0,1l-51,0l-0,-1z"
android:strokeAlpha="0.5"
android:fillColor="#EE5622"
android:fillAlpha="0.5"/>
</vector>

View file

@ -3765,4 +3765,5 @@
<string name="details_dialog_decr">التحكم في رؤية التفاصيل الإضافية الظاهرة على الخريطة</string>
<string name="shared_string_night_map">خريطة ليلية</string>
<string name="shared_string_all_time">كل الوقت</string>
<string name="turn_screen_on_power_button_disabled">ذوي الاحتياجات الخاصه. يتطلب \"إبقاء الشاشة قيد تشغيل\" تحت \"المهلة بعد الاستيقاظ\".</string>
</resources>

View file

@ -253,7 +253,7 @@
<string name="poi_fire_flapper">Fajrobrigada balailo</string>
<string name="poi_fire_hose">Fajrobrigada tubo</string>
<string name="poi_fire_water_pond">Fajrobrigada akvorezervujo</string>
<string name="poi_grit_bin">Salujego</string>
<string name="poi_grit_bin">Ujo kun sablo/salo</string>
<string name="poi_ambulance_station">Ambulanca stacio</string>
<string name="poi_ses_station">Stacio de civila defendo</string>
<string name="poi_emergency_access_point">Vivsava rekonebla signo</string>
@ -2924,7 +2924,7 @@
<string name="poi_cuisine_suki">suki (taja varmega poto)</string>
<string name="poi_cuisine_udon">udonoj (japanaj nudeloj)</string>
<string name="poi_cuisine_brasserie">brasserie (steko kun terpomfingroj)</string>
<string name="poi_cuisine_bubble_tea">bubble tea/boba (tajvana teo-trinnkaĵo)</string>
<string name="poi_cuisine_bubble_tea">bobelteo/boba (tajvana teo-trinnkaĵo)</string>
<string name="poi_cuisine_yakitori">jakitorio (rostita birdaĵo)</string>
<string name="poi_cuisine_sagardotegia">cidroj (pomvinoj)</string>
<string name="poi_cuisine_meat">viando</string>

View file

@ -1305,7 +1305,14 @@
<string name="live_monitoring_interval">Intervalo de enreta kurs-registrado</string>
<string name="live_monitoring_interval_descr">Difini intervalon de enreta kurs-registrado.</string>
<string name="live_monitoring_url">Adreso de enreta kurs-registrado</string>
<string name="live_monitoring_url_descr">Difini la retadreson uzante la jenajn argumentojn: latitudo={0}, longitudo={1}, tempomarko={2}, hdop(horizontala diluo de precizo)={3}, altitudo={4}, rapido={5}, birado={6}.</string>
<string name="live_monitoring_url_descr">Difini la retadreson uzante la jenajn argumentojn:
\n lat={0} (latitudo),
\n lon={1} (longitudo),
\n timestamp={2} (tempmarko),
\n hdop={3} (horizontala diluo de precizo),
\n altitude={4} (altitudo),
\n speed={5} (rapido),
\n bearing={6} (birado).</string>
<string name="change_markers_position">Ŝanĝi pozicion de marko</string>
<string name="current_track">Nuna spuro</string>
<string name="gpx_monitoring_disabled_warn">Konservu kurson uzante GPX-fenestraĵon aŭ per \'Registrado de kurso\' agordoj.</string>
@ -3768,4 +3775,5 @@
<string name="details_dialog_decr">Alĝustigi videblon de pliaj detaloj montrataj sur la mapo</string>
<string name="shared_string_night_map">Nokta mapo</string>
<string name="shared_string_all_time">Ĉiam</string>
<string name="turn_screen_on_power_button_disabled">Malŝaltita. Postulas “teni ekranon aktiva” en la sekcio “aktiveca periodo de ekrano”.</string>
</resources>

View file

@ -1390,7 +1390,7 @@ Lorratza %2$s</string>
<string name="context_menu_item_edit_waypoint">Editatu GPX bide-puntua</string>
<string name="shared_string_location">Kokapena</string>
<string name="read_more">Irakurri gehiago</string>
<string name="whats_new">Zer berri</string>
<string name="whats_new">Zer da berria</string>
<string name="rendering_attr_hideProposed_name">Proposatuko objektuak</string>
<string name="shared_string_update">Eguneratu</string>
<string name="shared_string_upload">Igo</string>
@ -3233,7 +3233,7 @@ Area honi dagokio: %1$s x %2$s</string>
<string name="analytics_pref_title">Analitikak</string>
<string name="turn_screen_on_info">Erakutsi mapa blokeo pantailan nabigazioan zehar.</string>
<string name="route_parameters_info">Ibilbide ezarpenak hautatutako \"%1$s.\" profilean.</string>
<string name="wake_time">Pantaila denbora-muga pertsonalizatua</string>
<string name="wake_time">Esnatu ondorengo denbora-muga</string>
<string name="units_and_formats">Unitate eta formatuak</string>
<string name="appearance">Itxura</string>
<string name="map_look_descr">Maparen itxura</string>
@ -3520,7 +3520,7 @@ Area honi dagokio: %1$s x %2$s</string>
<string name="shared_string_angle">Angelua</string>
<string name="recalc_angle_dialog_descr">Nire kokapenaren eta kalkulatutako ibilbidearen artean segmentu zuzen bat agertuko da ibilbidea berriz kalkulatu arte</string>
<string name="recalc_angle_dialog_title">Nire kokapena eta ibilbidearen arteko angelu minimoa</string>
<string name="button_rate">Tasa</string>
<string name="button_rate">Baloratu</string>
<string name="ltr_or_rtl_combine_via_space">%1$s %2$s</string>
<string name="ltr_or_rtl_combine_via_colon">%1$s: %2$s</string>
<string name="tracks_view_descr">Zure grabatutako lorratzak, %1$s, edo OsmAnd karpetan daude.</string>
@ -3750,7 +3750,7 @@ Area honi dagokio: %1$s x %2$s</string>
<string name="turn_screen_on_wake_time_descr">Hautatu pantailaren denbora-muga esnatu ondoren. (\"%1$s\" ez da aplikatzen denbora-muga.)</string>
<string name="keep_screen_on">Mantendu pantaila piztuta</string>
<string name="keep_screen_off">Mantendu pantaila itzalita</string>
<string name="screen_timeout_descr">Hau eraginkorra izateko \"%1$s\" desgaitu behar da.</string>
<string name="screen_timeout_descr">\"%1$s\" gaituta badago, jarduera denbora bere menpekoa izango da.</string>
<string name="pseudo_mercator_projection">Sasi-Mercator proiekzioa</string>
<string name="one_image_per_tile">Irudi fitxategi bat lauzako</string>
<string name="sqlite_db_file">SQLiteDB fitxategia</string>
@ -3772,9 +3772,16 @@ Area honi dagokio: %1$s x %2$s</string>
\nAste bat 10080 minutu dira.
\nHilabete bat 43829 minutu dira.</string>
<string name="tiles_storage_descr">Aukeratu nola gorde deskargatutako lauzak.</string>
<string name="default_screen_timeout">Sistemako pantailaren denbora-muga</string>
<string name="default_screen_timeout">Pantailaren denbora-muga lehenetsia</string>
<string name="export_import_quick_actions_with_profiles_promo">Ekintza azkarrak esportatu edo inportatu ditzakezu aplikazio-profilekin.</string>
<string name="shared_string_delete_all_q">Ezabatu denak\?</string>
<string name="delete_all_actions_message_q">Ziur behin betiko ezabatu nahi dituzula %d ekintza azkar\?</string>
<string name="screen_timeout">Pantailaren denbora-muga</string>
<string name="width_limit_description">Eman ibilgailuaren zabalera, ibilgailu zabalentzako zenbait ibilbide murriztu daitezke.</string>
<string name="height_limit_description">Eman zure ibilgailuaren altuera, ibilgailu altuetarako zenbait ibilbide murriztu daitezke.</string>
<string name="weight_limit_description">Eman zure ibilgailuaren pisua, ibilgailu astunentzako zenbait ibilbide murriztu daitezke.</string>
<string name="turn_screen_on_power_button_disabled">Desgaituta. \"Mantendu pantaila piztuta\" behar da \"Esnatu ondorengo denbora-muga\" atalean.</string>
<string name="shared_string_meters">metro</string>
<string name="details_dialog_decr">Kontrolatu mapan agertzen diren xehetasun gehigarrien ikusgaitasuna</string>
<string name="shared_string_night_map">Gauerako mapa</string>
</resources>

View file

@ -1352,4 +1352,103 @@
<string name="poi_trade_plumbing">لوازم لوله‌کشی</string>
<string name="poi_trade_wood">لوازم چوب</string>
<string name="poi_trade_tile">کاشی و موزاییک</string>
<string name="poi_piste_difficulty_expert">خبره</string>
<string name="poi_piste_difficulty_novice">تازه‌کار</string>
<string name="poi_piste_difficulty_advanced">پیشرفته</string>
<string name="poi_piste_difficulty_intermediate">متوسط</string>
<string name="poi_piste_difficulty_easy">آسان</string>
<string name="poi_sand">شن‌زار</string>
<string name="poi_grassland">چمن‌زار</string>
<string name="poi_grass">چمن</string>
<string name="poi_garden">باغ</string>
<string name="poi_information_office">دفتر</string>
<string name="poi_information_map">نقشه</string>
<string name="poi_pump_manual">دستی</string>
<string name="poi_generator_source_gas">منبع انرژی: گاز</string>
<string name="poi_trees_pomegranate">انار</string>
<string name="poi_trees_coffea">قهوه</string>
<string name="poi_trees_date">خرما</string>
<string name="poi_trees_mango">انبه</string>
<string name="poi_trees_kiwi">کیوی</string>
<string name="poi_trees_tea">چای</string>
<string name="poi_trees_peach">هلو</string>
<string name="poi_trees_walnut">گردو</string>
<string name="poi_trees_cherry">گیلاس</string>
<string name="poi_trees_coconut">نارگیل</string>
<string name="poi_trees_banana">موز</string>
<string name="poi_trees_almond">بادام</string>
<string name="poi_trees_orange">پرتغال</string>
<string name="poi_bicycle_parking_informal">غیررسمی</string>
<string name="poi_bicycle_parking_building">ساختمان ویژه</string>
<string name="poi_nudism_no">ممنوع</string>
<string name="poi_nudism_yes">مجاز</string>
<string name="poi_content_salt">محتوا: نمک</string>
<string name="poi_content_beer">محتوا: آب‌جو</string>
<string name="poi_content_gas">محتوا: گاز</string>
<string name="poi_seasonal_autumn">پاییز</string>
<string name="poi_seasonal_summer">تابستان</string>
<string name="poi_seasonal_wet_season">فصل مرطوب</string>
<string name="poi_seasonal_dry_season">فصل خشک</string>
<string name="poi_brand">برند</string>
<string name="poi_abandoned">رها شده</string>
<string name="poi_width">عرض</string>
<string name="poi_height">ارتفاع</string>
<string name="poi_maxweight">بیشیه وزن</string>
<string name="poi_maxheight">بیشینه ارتفاع</string>
<string name="poi_mobile">همراه</string>
<string name="poi_google_plus">گوگل‌پلاس</string>
<string name="poi_instagram">اینستاگرام</string>
<string name="poi_youtube">یوتیوب</string>
<string name="poi_skype">اسکایپ</string>
<string name="poi_email">رایانامه</string>
<string name="poi_website">وب‌گاه</string>
<string name="poi_phone">تلفن</string>
<string name="poi_opening_hours">ساعت باز شد</string>
<string name="poi_entrance_exit">خروج</string>
<string name="poi_entrance_main">ورودی اصلی</string>
<string name="poi_height_restrictor">محدودکننده ارتفاع</string>
<string name="poi_military_landuse">منطقه نظامی</string>
<string name="poi_atm">خودپرداز</string>
<string name="poi_smoking_area">فضای سیگار کشیدن</string>
<string name="poi_recreation_ground">فضای بازی</string>
<string name="poi_religious">فضای مذهبی</string>
<string name="poi_denomination_greek_catholic">کاتولیک یونان</string>
<string name="poi_denomination_church_of_england">کلیسای انگلیس</string>
<string name="poi_denomination_protestant">پروتستان</string>
<string name="poi_denomination_sunni">سنی</string>
<string name="poi_religion_bahai">بهایی</string>
<string name="poi_aquarium">آکواریوم</string>
<string name="poi_historic_tank">تانک تاریخی</string>
<string name="poi_historic_aircraft">هواپیمای تاریخی</string>
<string name="poi_ice_hockey">هاکی روی یخ</string>
<string name="poi_tax_advisor">دفتر مشاور مالیات</string>
<string name="poi_foundation">دفتر بنیاد</string>
<string name="poi_political_party">دفتر حزب سیاسی</string>
<string name="poi_silo">سیلو</string>
<string name="poi_radar">رادار</string>
<string name="poi_canal">کانال</string>
<string name="poi_meadow">علفزار</string>
<string name="poi_forest">جنگل با مدیریت انسانی</string>
<string name="poi_retail">خرده‌فروشی</string>
<string name="poi_recycling_christmas_trees">درختان کریسمس</string>
<string name="poi_recycling_low_energy_bulbs">لامپ‌های کم‌مصرف</string>
<string name="poi_recycling_paper_packaging">بسته‌بندی کاغذی</string>
<string name="poi_recycling_plastic_packaging">بسته‌بندی پلاستیکی</string>
<string name="poi_recycling_green_waste">زباله سبز</string>
<string name="poi_recycling_waste">زباله (کیسه‌های سیاه)</string>
<string name="poi_power_tower">برجک برق</string>
<string name="poi_power_pole">تیر برق</string>
<string name="poi_fuel_lpg">گاز مایع (ال‌پی‌جی)</string>
<string name="poi_fuel_diesel">دیزل</string>
<string name="poi_fire_hydrant_pressure_filter">فشار</string>
<string name="poi_video_telephone">ویدئو</string>
<string name="poi_volcano_status">وضعیت</string>
<string name="poi_volcano_type">نوع</string>
<string name="poi_bath_type">نوع</string>
<string name="poi_cash_withdrawal_bank_card">برداشت وجه</string>
<string name="poi_access_disabled">دسترسی معلولان</string>
<string name="poi_access_motorcycle">دسترسی موتور سیکلت</string>
<string name="poi_access_caravan">دسترسی کاروان</string>
<string name="poi_access_bus">دسترسی اتوبوس</string>
<string name="poi_climbing_crag">بله</string>
</resources>

View file

@ -3770,9 +3770,9 @@
<string name="turn_screen_on_power_button_descr">فشردن دکمهٔ خاموش/روشن دستگاه، صفحه را روشن می‌کند و OsmAnd را روی صفحهٔ قفل نمایش می‌دهد.</string>
<string name="turn_screen_on_power_button">دکمهٔ خاموش/روشن</string>
<string name="turn_screen_on_proximity_sensor">حسگر مجاورتی</string>
<string name="keep_screen_on">صفحه را روشن نگه دار</string>
<string name="keep_screen_on">روشن نگه داشتن صفحه</string>
<string name="keep_screen_off">صفحه را خاموش نگه دار</string>
<string name="mercator_projection"/>
<string name="mercator_projection">فراتابی مرکاتور</string>
<string name="one_image_per_tile">یک فایل تصویر برای هر کاشی</string>
<string name="map_source_zoom_levels_descr">این پارامترها هنگام استفاده از منبع به‌عنوان نقشه یا رولایه/زیرلایه، بر نمایش آن اثر می‌گذارند.
\n
@ -3805,4 +3805,8 @@
<string name="details_dialog_decr">نمایانی جزئیات اضافه‌تر روی نقشه را کنترل کنید</string>
<string name="shared_string_night_map">نقشهٔ شب</string>
<string name="shared_string_all_time">همیشه</string>
<string name="turn_screen_on_power_button_disabled">غیرفعال است. به گزینهٔ «روشن نگه داشتن صفحه» در قسمت «زمان خاموشی پس از بیدارباش» نیاز دارد.</string>
<string name="pseudo_mercator_projection">فراتابی شبه مرکاتور</string>
<string name="rendering_attr_piste_type_connection_name">اتصال</string>
<string name="rendering_attr_piste_difficulty_connection_name">اتصال</string>
</resources>

View file

@ -766,7 +766,7 @@
<string name="bg_service_sleep_mode_on">Arrêter
\n l\'exécution de l\'application en arrière-plan</string>
<string name="bg_service_screen_lock_toast">L\'écran est verrouillé</string>
<string name="bg_service_interval">Positionner l\'intervalle d\'activation :</string>
<string name="bg_service_interval">Définir l\'intervalle d\'activation :</string>
<string name="layer_map_appearance">Configurer l\'écran</string>
<string name="show_lanes">Voies de circulation</string>
<string name="avoid_unpaved">Éviter les voies non revêtues</string>
@ -3715,7 +3715,7 @@
\n
\n%2$s : Niveaux de zoom auxquels les tuiles originales seront visibles. En dehors de ces valeurs, il y aura une augmentation ou une diminution d\'échelle.</string>
<string name="turn_screen_on_navigation_instructions_descr">L\'écran s\'allumera pour afficher les instructions de navigation.</string>
<string name="turn_screen_on_wake_time_descr">Sélectionnez le temps d\'affichage de l\'écran après allumage (\"%1$s\" signifie pas d\'extinction).</string>
<string name="turn_screen_on_wake_time_descr">Sélectionnez la durée d\'affichage de l\'écran après allumage (\"%1$s\" signifie pas d\'extinction).</string>
<string name="screen_timeout_descr">Si l\'option \"%1$s\" est activée, le temps d\'activité en dépendra.</string>
<string name="expire_time_descr">Délai d\'expiration en minutes. Les tuiles en cache seront rechargées après ce délai. Laissez ce champ vide pour ne jamais rafraîchir les tuiles pour cette source.
\n
@ -3726,7 +3726,7 @@
<string name="screen_control">Contrôle de l\'écran</string>
<string name="system_screen_timeout">Utiliser le délai système pour lextinction de l\'écran</string>
<string name="turn_screen_on_options_descr">Options de réveil de l\'écran :</string>
<string name="turn_screen_on_descr">Sélectionnez les options de réveil de lécran (assurez-vous quOsmAnd est au premier plan au moment du verrouillage de lappareil) :</string>
<string name="turn_screen_on_descr">Sélectionnez les options d\'allumage de lécran (assurez-vous quOsmAnd est au premier plan au moment du verrouillage de lappareil) :</string>
<string name="turn_screen_on_navigation_instructions">Instructions de navigation</string>
<string name="turn_screen_on_power_button_descr">Appuyez sur le bouton d\'alimentation de l\'appareil pour allumer l\'écran avec OsmAnd par dessus lécran de verrouillage.</string>
<string name="turn_screen_on_power_button">Bouton marche / arrêt</string>
@ -3757,4 +3757,5 @@
<string name="details_dialog_decr">Contrôler la visibilité des autres détails affichés sur la carte</string>
<string name="shared_string_night_map">Carte nocturne</string>
<string name="shared_string_all_time">Tout le temps</string>
<string name="turn_screen_on_power_button_disabled">Désactivé. Nécessite l\'option « Garder l\'écran allumé » sous « Délai d\'affichage de l\'écran ».</string>
</resources>

View file

@ -3783,4 +3783,5 @@
<string name="details_dialog_decr">שליטה בהופעה של פירוט נוסף על המפה</string>
<string name="shared_string_night_map">מפת לילה</string>
<string name="shared_string_all_time">כל הזמן</string>
<string name="turn_screen_on_power_button_disabled">מושבת. נדרשת ההגדרה ‚להשאיר את המסך פעיל’ תחת ‚תפוגת זמן לאחר התעוררות’.</string>
</resources>

View file

@ -3257,7 +3257,7 @@
<string name="analytics_pref_title">Greiningar</string>
<string name="turn_screen_on_info">Birta kort á læsiskjá á meðan leiðsögn stendur.</string>
<string name="route_parameters_info">Stillingar leiðarvals í valda sniðinu \"%1$s\".</string>
<string name="wake_time">Vökutími</string>
<string name="wake_time">Tímamörk eftir vöknun</string>
<string name="units_and_formats">Einingar og snið þeirra</string>
<string name="appearance">Útlit</string>
<string name="map_look_descr">Útlit landakorts</string>
@ -3724,13 +3724,13 @@
<string name="unsupported_type_error">Óstudd tegund</string>
<string name="turn_screen_on_navigation_instructions">Leiðsagnarleiðbeiningar</string>
<string name="favorites_item">Eftirlæti</string>
<string name="screen_timeout_descr">Takmarkað af \"%1$s\", ef það er virkt.</string>
<string name="screen_timeout_descr">Ef \"%1$s\" valkosturinn er virkur, mun tími virkni vera háður honum.</string>
<string name="navigation_profiles_item">Leiðsagnarsnið</string>
<string name="shared_string_resume">Halda áfram</string>
<string name="mapillary_item">OsmAnd + Mapillary</string>
<string name="add_edit_favorite">Bæta við / breyta eftirlæti</string>
<string name="quick_action_transport_show">Birta almenningssamgöngur</string>
<string name="default_screen_timeout">Tímamörk kerfis fyrir skjá</string>
<string name="default_screen_timeout">Sjálfgefin tímamörk fyrir skjá</string>
<string name="quick_action_transport_descr">Hnappur til að birta eða fela almenningssamgöngur á kortinu.</string>
<string name="turn_screen_on_proximity_sensor">Nálægðarskynjari</string>
<string name="travel_item">Ferðalög (Wikipedia og Wikivoyage)</string>
@ -3746,4 +3746,13 @@
\nEin vika er 10.080 mínútur.
\nEinn mánuður er 43 829 mínútur.</string>
<string name="back_to_editing">Til baka í breytingar</string>
<string name="system_screen_timeout_descr">Slekkur á skjánum eftir að tímamörkum kerfis fyrir skjá er náð.</string>
<string name="delete_all_actions_message_q">Ertu viss um að þú viljir eyða %d flýtiaðgerðum\?</string>
<string name="quick_action_switch_profile_descr">Ef ýtt er á þennan aðgerðahnapp verður skipt á milli valinna notkunarsniða.</string>
<string name="shared_string_delete_all_q">Eyða öllu\?</string>
<string name="screen_timeout">Tímamörk skjás</string>
<string name="shared_string_tones">tónar</string>
<string name="shared_string_meters">metrar</string>
<string name="details_dialog_decr">Stýra sýnileika viðbótaratriða sem birtast á kortinu</string>
<string name="shared_string_night_map">Næturkort</string>
</resources>

View file

@ -3762,4 +3762,5 @@ Pôr do Sol: %2$s</string>
<string name="details_dialog_decr">Controlar a visibilidade dos detalhes adicionais mostrados no mapa</string>
<string name="shared_string_night_map">Mapa noturno</string>
<string name="shared_string_all_time">Tempo todo</string>
<string name="turn_screen_on_power_button_disabled">Desativado. Requer \'manter a tela ligada\' em \'tempo limite após a ativação\'.</string>
</resources>

View file

@ -3774,4 +3774,5 @@
<string name="details_dialog_decr">Управление отображением дополнительных деталей на карте</string>
<string name="shared_string_all_time">Всё время</string>
<string name="shared_string_night_map">Ночная карта</string>
<string name="turn_screen_on_power_button_disabled">Отключено. Необходимо включить «Держать экран включённым» в разделе «Время работы после пробуждения».</string>
</resources>

View file

@ -3733,4 +3733,8 @@
<string name="shared_string_delete_all_q">Iscantzellare totu\?</string>
<string name="delete_all_actions_message_q">Ses seguru de chèrrere iscantzellare definitivamente %d atziones lestras\?</string>
<string name="shared_string_all_time">Totu su tempus</string>
<string name="shared_string_meters">metros</string>
<string name="details_dialog_decr">Controlla sa visibilidade de delàllios additzionales ammustrados in sa mapa</string>
<string name="shared_string_night_map">Mapa noturna</string>
<string name="shared_string_tones">sonerias</string>
</resources>

View file

@ -3773,4 +3773,5 @@
<string name="details_dialog_decr">Ovládajte viditeľnosť ďalších detailov zobrazených na mape</string>
<string name="shared_string_night_map">Nočná mapa</string>
<string name="shared_string_all_time">Vždy</string>
<string name="turn_screen_on_power_button_disabled">Vypnuté. Vyžaduje \"Nechať obrazovku zapnutú\" pod \"Časový limit obrazovky po prebudení\".</string>
</resources>

View file

@ -3730,4 +3730,5 @@
<string name="shared_string_night_map">Gece haritası</string>
<string name="shared_string_all_time">Her zaman</string>
<string name="shared_string_tones">ton</string>
<string name="turn_screen_on_power_button_disabled">Devre dışı. \'Uyandıktan sonra zaman aşımı\' altındaki \'Ekranıık tut\' seçeneği gerekir.</string>
</resources>

View file

@ -3269,7 +3269,7 @@
<string name="pref_selected_by_default_for_profiles">Це налаштування вибране як усталене для профілів: %s</string>
<string name="turn_screen_on_info">Показати мапу на екрані блокування під час навігації.</string>
<string name="route_parameters_info">Налаштування для маршрутизації у вибраному профілі: %1$s.</string>
<string name="wake_time">Час очікування екрана</string>
<string name="wake_time">Час очікування після пробудження</string>
<string name="screen_alerts_descr">Попередження відображаються внизу зліва під час навігації.</string>
<string name="language_and_output">Мова та вивід</string>
<string name="osmand_settings_descr">Впливає на весь застосунок</string>
@ -3738,7 +3738,7 @@
<string name="turn_screen_on_wake_time_descr">Час очікування екрану після увімкнення. («%1$s» вимикає вимкнення екрану.)</string>
<string name="keep_screen_on">Тримати екран увімкненим</string>
<string name="keep_screen_off">Тримати екран вимкненим</string>
<string name="screen_timeout_descr">Використовується, тільки якщо \"%1$s\" вимкнено.</string>
<string name="screen_timeout_descr">Якщо функцію \"%1$s\" увімкнено, час роботи залежатиме від неї.</string>
<string name="pseudo_mercator_projection">Псевдопроєкція Меркатора</string>
<string name="one_image_per_tile">Один файл зображення на плитку</string>
<string name="sqlite_db_file">Файл SQLiteDB</string>
@ -3760,9 +3760,17 @@
\nОдин тиждень - 10 080 хвилин.
\nОдин місяць - 43 829 хвилин.</string>
<string name="tiles_storage_descr">Виберіть спосіб зберігання завантажених плиток.</string>
<string name="default_screen_timeout">Системний час очікування екрану</string>
<string name="default_screen_timeout">Усталений час очікування екрану</string>
<string name="export_import_quick_actions_with_profiles_promo">Ви можете експортувати або імпортувати швидкі дії з профілями застосунку.</string>
<string name="shared_string_delete_all_q">Видалити все\?</string>
<string name="delete_all_actions_message_q">Ви дійсно бажаєте безповоротно видалити %d швидких дій\?</string>
<string name="screen_timeout">Час очікування екрана</string>
<string name="weight_limit_description">Вкажіть вагу транспортного засобу, для важких транспортних засобів можуть застосовуватися деякі обмеження на маршрути.</string>
<string name="shared_string_tones">тонни</string>
<string name="shared_string_meters">метри</string>
<string name="details_dialog_decr">Керування відображенням додаткових деталей на мапі</string>
<string name="shared_string_night_map">Нічна мапа</string>
<string name="width_limit_description">Вкажіть ширину автомобіля, для великих транспортних засобів можуть застосовуватися обмеження на деяких маршрутах.</string>
<string name="height_limit_description">Вкажіть висоту автомобіля, для великих транспортних засобів можуть застосовуватися обмеження на деяких маршрутах.</string>
<string name="turn_screen_on_power_button_disabled">Вимкнено. Потребує \'Тримати екран увімкненим\' у розділі \'Час очікування після пробудження\'.</string>
</resources>

View file

@ -3770,4 +3770,5 @@
<string name="details_dialog_decr">控制地圖上顯示的額外詳細資訊可見程度</string>
<string name="shared_string_night_map">夜晚地圖</string>
<string name="shared_string_all_time">全部時間</string>
<string name="turn_screen_on_power_button_disabled">已停用。需要「喚醒後逾時」的「保持螢幕開啟」。</string>
</resources>

View file

@ -985,15 +985,14 @@ public class OsmandApplication extends MultiDexApplication {
public void setupDrivingRegion(WorldRegion reg) {
OsmandSettings.DrivingRegion drg = null;
WorldRegion.RegionParams params = reg.getParams();
boolean americanSigns = "american".equals(params.getRegionRoadSigns());
// boolean americanSigns = "american".equals(params.getRegionRoadSigns());
boolean leftHand = "yes".equals(params.getRegionLeftHandDriving());
OsmandSettings.MetricsConstants mc1 = "miles".equals(params.getRegionMetric()) ?
OsmandSettings.MetricsConstants.MILES_AND_FEET : OsmandSettings.MetricsConstants.KILOMETERS_AND_METERS;
OsmandSettings.MetricsConstants mc2 = "miles".equals(params.getRegionMetric()) ?
OsmandSettings.MetricsConstants.MILES_AND_METERS : OsmandSettings.MetricsConstants.KILOMETERS_AND_METERS;
for (OsmandSettings.DrivingRegion r : OsmandSettings.DrivingRegion.values()) {
if (r.americanSigns == americanSigns && r.leftHandDriving == leftHand &&
(r.defMetrics == mc1 || r.defMetrics == mc2)) {
if (r.leftHandDriving == leftHand && (r.defMetrics == mc1 || r.defMetrics == mc2)) {
drg = r;
break;
}

View file

@ -239,7 +239,7 @@ public class TestVoiceActivity extends OsmandActionBarActivity {
addButton(ll, "\u25BA (11.1) (TAP TO FULLY POPULATE)\n" + getVoiceSystemInfo(), builder(p).attention(""));
addButton(ll, "\u25BA (11.2) (TAP TO CHANGE)\n \u25CF Voice prompt delay for selected output: " +
((OsmandApplication) getApplication()).getSettings().VOICE_PROMPT_DELAY[((OsmandApplication) getApplication()).getSettings().AUDIO_MANAGER_STREAM.get()].get() +
"\u00A0ms.\nAvoids car stereo cutting off prompts. Default is 1500\u00A0ms for Phone call audio, or else 0\u00A0ms.", builder(p).attention(""));
"\u00A0ms\n (Avoids car stereo cutting off prompts. Default is 1500\u00A0ms for Phone call audio, or else 0\u00A0ms.)", builder(p).attention(""));
addButton(ll, "\u25BA (11.3) (TAP TO TOGGLE)\n \u25CF Display each TTS utterance on screen: " +
((OsmandApplication) getApplication()).getSettings().DISPLAY_TTS_UTTERANCE.get().toString(), builder(p).attention(""));
ll.forceLayout();
@ -310,7 +310,7 @@ public class TestVoiceActivity extends OsmandActionBarActivity {
}
buttonDelay.setText("\u25BA (11.2) (TAP TO CHANGE)\n \u25CF Voice prompt delay for selected output: " +
((OsmandApplication) getApplication()).getSettings().VOICE_PROMPT_DELAY[((OsmandApplication) getApplication()).getSettings().AUDIO_MANAGER_STREAM.get()].get() +
"\u00A0ms.\nAvoids car stereo cutting off prompts. Default is 1500\u00A0ms for Phone call audio, or else 0\u00A0ms.");
"\u00A0ms\n (Avoids car stereo cutting off prompts. Default is 1500\u00A0ms for Phone call audio, or else 0\u00A0ms.)");
}
if (description.startsWith("\u25BA (11.3)")) {
if (((OsmandApplication) getApplication()).getSettings().DISPLAY_TTS_UTTERANCE.get() == false) {

View file

@ -790,18 +790,19 @@ public class WaypointHelper {
} else if (type == ALARMS) {
//assign alarm list icons manually for now
String typeString = ((AlarmInfo) point).getType().toString();
OsmandSettings.DrivingRegion region = app.getSettings().DRIVING_REGION.get();
if (typeString.equals("SPEED_CAMERA")) {
return AppCompatResources.getDrawable(uiCtx, R.drawable.mx_highway_speed_camera);
} else if (typeString.equals("BORDER_CONTROL")) {
return AppCompatResources.getDrawable(uiCtx, R.drawable.mx_barrier_border_control);
} else if (typeString.equals("RAILWAY")) {
if (app.getSettings().DRIVING_REGION.get().americanSigns) {
if (region.isAmericanTypeSigns()) {
return AppCompatResources.getDrawable(uiCtx, R.drawable.list_warnings_railways_us);
} else {
return AppCompatResources.getDrawable(uiCtx, R.drawable.list_warnings_railways);
}
} else if (typeString.equals("TRAFFIC_CALMING")) {
if (app.getSettings().DRIVING_REGION.get().americanSigns) {
if (region.isAmericanTypeSigns()) {
return AppCompatResources.getDrawable(uiCtx, R.drawable.list_warnings_traffic_calming_us);
} else {
return AppCompatResources.getDrawable(uiCtx, R.drawable.list_warnings_traffic_calming);
@ -811,13 +812,13 @@ public class WaypointHelper {
} else if (typeString.equals("STOP")) {
return AppCompatResources.getDrawable(uiCtx, R.drawable.list_stop);
} else if (typeString.equals("PEDESTRIAN")) {
if (app.getSettings().DRIVING_REGION.get().americanSigns) {
if (region.isAmericanTypeSigns()) {
return AppCompatResources.getDrawable(uiCtx, R.drawable.list_warnings_pedestrian_us);
} else {
return AppCompatResources.getDrawable(uiCtx, R.drawable.list_warnings_pedestrian);
}
} else if (typeString.equals("TUNNEL")) {
if (app.getSettings().DRIVING_REGION.get().americanSigns) {
if (region.isAmericanTypeSigns()) {
return AppCompatResources.getDrawable(uiCtx, R.drawable.list_warnings_tunnel_us);
} else {
return AppCompatResources.getDrawable(uiCtx, R.drawable.list_warnings_tunnel);

View file

@ -3794,7 +3794,7 @@ public class OsmandSettings {
// this value string is synchronized with settings_pref.xml preference name
public final OsmandPreference<Boolean> SAFE_MODE = new BooleanPreference("safe_mode", false).makeGlobal();
public final OsmandPreference<Boolean> PT_SAFE_MODE = new BooleanPreference("pt_safe_mode", true).makeGlobal();
public final OsmandPreference<Boolean> PT_SAFE_MODE = new BooleanPreference("pt_safe_mode", false).makeGlobal();
public final OsmandPreference<Boolean> NATIVE_RENDERING_FAILED = new BooleanPreference("native_rendering_failed_init", false).makeGlobal();
public final OsmandPreference<Boolean> USE_OPENGL_RENDER = new BooleanPreference("use_opengl_render",
@ -4138,23 +4138,27 @@ public class OsmandSettings {
*/
public enum DrivingRegion {
EUROPE_ASIA(R.string.driving_region_europe_asia, MetricsConstants.KILOMETERS_AND_METERS, false, false),
US(R.string.driving_region_us, MetricsConstants.MILES_AND_FEET, false, true),
CANADA(R.string.driving_region_canada, MetricsConstants.KILOMETERS_AND_METERS, false, true),
UK_AND_OTHERS(R.string.driving_region_uk, MetricsConstants.MILES_AND_METERS, true, false),
JAPAN(R.string.driving_region_japan, MetricsConstants.KILOMETERS_AND_METERS, true, false),
AUSTRALIA(R.string.driving_region_australia, MetricsConstants.KILOMETERS_AND_METERS, true, true);
EUROPE_ASIA(R.string.driving_region_europe_asia, MetricsConstants.KILOMETERS_AND_METERS, false),
US(R.string.driving_region_us, MetricsConstants.MILES_AND_FEET, false),
CANADA(R.string.driving_region_canada, MetricsConstants.KILOMETERS_AND_METERS, false),
UK_AND_OTHERS(R.string.driving_region_uk, MetricsConstants.MILES_AND_METERS, true),
JAPAN(R.string.driving_region_japan, MetricsConstants.KILOMETERS_AND_METERS, true),
AUSTRALIA(R.string.driving_region_australia, MetricsConstants.KILOMETERS_AND_METERS, true);
public final boolean leftHandDriving;
public final boolean americanSigns;
public final MetricsConstants defMetrics;
public final int name;
DrivingRegion(int name, MetricsConstants def, boolean leftHandDriving, boolean americanSigns) {
DrivingRegion(int name, MetricsConstants def, boolean leftHandDriving) {
this.name = name;
defMetrics = def;
this.leftHandDriving = leftHandDriving;
this.americanSigns = americanSigns;
}
public boolean isAmericanTypeSigns() {
return this == OsmandSettings.DrivingRegion.AUSTRALIA ||
this == OsmandSettings.DrivingRegion.US ||
this == OsmandSettings.DrivingRegion.CANADA;
}
public String getDescription(Context ctx) {

View file

@ -149,7 +149,7 @@ public class ScreenAlertsFragment extends BaseSettingsFragment implements OnSpee
private Drawable getWarningIcon() {
ApplicationMode selectedMode = getSelectedAppMode();
boolean americanSigns = settings.DRIVING_REGION.getModeValue(selectedMode).americanSigns;
boolean americanSigns = settings.DRIVING_REGION.getModeValue(selectedMode).isAmericanTypeSigns();
if (settings.SHOW_TRAFFIC_WARNINGS.getModeValue(selectedMode)) {
return getIcon(americanSigns ? R.drawable.warnings_traffic_calming_us : R.drawable.warnings_traffic_calming);
} else if (settings.SHOW_PEDESTRIAN.getModeValue(selectedMode)) {

View file

@ -1290,8 +1290,12 @@ public class RouteInfoWidgetsFactory {
int locimgId = R.drawable.warnings_limit;
String text = "";
String bottomText = "";
OsmandSettings.DrivingRegion region = settings.DRIVING_REGION.get();
boolean americanType = region.isAmericanTypeSigns();
if(alarm.getType() == AlarmInfoType.SPEED_LIMIT) {
if(settings.DRIVING_REGION.get().americanSigns){
if(region == OsmandSettings.DrivingRegion.CANADA) {
locimgId = R.drawable.warnings_speed_limit_ca;
} else if(americanType){
locimgId = R.drawable.warnings_speed_limit_us;
//else case is done by drawing red ring
}
@ -1301,7 +1305,7 @@ public class RouteInfoWidgetsFactory {
} else if(alarm.getType() == AlarmInfoType.BORDER_CONTROL) {
locimgId = R.drawable.warnings_border_control;
} else if(alarm.getType() == AlarmInfoType.HAZARD) {
if(settings.DRIVING_REGION.get().americanSigns){
if (americanType) {
locimgId = R.drawable.warnings_hazard_us;
} else {
locimgId = R.drawable.warnings_hazard;
@ -1310,7 +1314,7 @@ public class RouteInfoWidgetsFactory {
//image done by drawing red ring
text = "$";
} else if(alarm.getType() == AlarmInfoType.TRAFFIC_CALMING) {
if(settings.DRIVING_REGION.get().americanSigns){
if (americanType) {
locimgId = R.drawable.warnings_traffic_calming_us;
} else {
locimgId = R.drawable.warnings_traffic_calming;
@ -1318,19 +1322,19 @@ public class RouteInfoWidgetsFactory {
} else if(alarm.getType() == AlarmInfoType.STOP) {
locimgId = R.drawable.warnings_stop;
} else if(alarm.getType() == AlarmInfoType.RAILWAY) {
if(settings.DRIVING_REGION.get().americanSigns){
if (americanType) {
locimgId = R.drawable.warnings_railways_us;
} else {
locimgId = R.drawable.warnings_railways;
}
} else if(alarm.getType() == AlarmInfoType.PEDESTRIAN) {
if(settings.DRIVING_REGION.get().americanSigns){
if (americanType) {
locimgId = R.drawable.warnings_pedestrian_us;
} else {
locimgId = R.drawable.warnings_pedestrian;
}
} else if(alarm.getType() == AlarmInfoType.TUNNEL) {
if(settings.DRIVING_REGION.get().americanSigns){
if (americanType) {
locimgId = R.drawable.warnings_tunnel_us;
} else {
locimgId = R.drawable.warnings_tunnel;
@ -1360,7 +1364,7 @@ public class RouteInfoWidgetsFactory {
if (!Algorithms.objectEquals(text, this.textString)) {
textString = text;
this.text.setText(this.textString);
if (alarm.getType() == AlarmInfoType.SPEED_LIMIT && settings.DRIVING_REGION.get().americanSigns) {
if (alarm.getType() == AlarmInfoType.SPEED_LIMIT && americanType) {
this.text.setPadding(0, AndroidUtils.dpToPx(layout.getContext(), 20f), 0, 0);
} else {
this.text.setPadding(0, 0, 0, 0);
@ -1370,7 +1374,7 @@ public class RouteInfoWidgetsFactory {
bottomTextString = bottomText;
this.bottomText.setText(this.bottomTextString);
this.bottomText.setTextColor(ContextCompat.getColor(layout.getContext(),
settings.DRIVING_REGION.get().americanSigns ? R.color.color_black : R.color.color_white));
americanType ? R.color.color_black : R.color.color_white));
}
}
}