Merge branch 'master' into plan_a_route
This commit is contained in:
commit
10e5005e5a
76 changed files with 3009 additions and 1087 deletions
|
@ -1,6 +1,7 @@
|
|||
|
||||
package net.osmand;
|
||||
|
||||
|
||||
import net.osmand.data.QuadRect;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
|
@ -42,7 +43,9 @@ import java.util.Stack;
|
|||
import java.util.TimeZone;
|
||||
|
||||
public class GPXUtilities {
|
||||
|
||||
public final static Log log = PlatformUtil.getLog(GPXUtilities.class);
|
||||
|
||||
private static final String ICON_NAME_EXTENSION = "icon";
|
||||
private static final String DEFAULT_ICON_NAME = "special_star";
|
||||
private static final String BACKGROUND_TYPE_EXTENSION = "background";
|
||||
|
@ -117,6 +120,13 @@ public class GPXUtilities {
|
|||
return extensions;
|
||||
}
|
||||
|
||||
public Map<String, String> getExtensionsToWrite() {
|
||||
if (extensions == null) {
|
||||
extensions = new LinkedHashMap<>();
|
||||
}
|
||||
return extensions;
|
||||
}
|
||||
|
||||
public GPXExtensionsWriter getExtensionsWriter() {
|
||||
return extensionsWriter;
|
||||
}
|
||||
|
@ -150,14 +160,7 @@ public class GPXUtilities {
|
|||
getExtensionsToWrite().remove("color");
|
||||
}
|
||||
|
||||
public Map<String, String> getExtensionsToWrite() {
|
||||
if (extensions == null) {
|
||||
extensions = new LinkedHashMap<>();
|
||||
}
|
||||
return extensions;
|
||||
}
|
||||
|
||||
private int parseColor(String colorString, int defColor) {
|
||||
protected int parseColor(String colorString, int defColor) {
|
||||
if (!Algorithms.isEmpty(colorString)) {
|
||||
if (colorString.charAt(0) == '#') {
|
||||
long color = Long.parseLong(colorString.substring(1), 16);
|
||||
|
@ -954,7 +957,6 @@ public class GPXUtilities {
|
|||
|
||||
sp = new SplitSegment(segment, k - 1, cf);
|
||||
currentMetricEnd += metricLimit;
|
||||
prev = sp.get(0);
|
||||
}
|
||||
total += currentSegment;
|
||||
}
|
||||
|
@ -1533,6 +1535,139 @@ public class GPXUtilities {
|
|||
}
|
||||
return new QuadRect(left, top, right, bottom);
|
||||
}
|
||||
|
||||
public int getGradientScaleColor(GradientScaleType gradientScaleType, int defColor) {
|
||||
String clrValue = null;
|
||||
if (extensions != null) {
|
||||
clrValue = extensions.get(gradientScaleType.getTypeName());
|
||||
}
|
||||
return parseColor(clrValue, defColor);
|
||||
}
|
||||
|
||||
public void setGradientScaleColor(GradientScaleType gradientScaleType, int gradientScaleColor) {
|
||||
getExtensionsToWrite().put(gradientScaleType.getTypeName(), Algorithms.colorToString(gradientScaleColor));
|
||||
}
|
||||
|
||||
public GradientScaleType getGradientScaleType() {
|
||||
if (extensions != null) {
|
||||
String gradientScaleTypeName = extensions.get("gradient_scale_type");
|
||||
if (!Algorithms.isEmpty(gradientScaleTypeName)) {
|
||||
try {
|
||||
return GradientScaleType.valueOf(gradientScaleTypeName);
|
||||
} catch (IllegalArgumentException e) {
|
||||
log.error("Error reading gradientScaleType", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setGradientScaleType(GradientScaleType gradientScaleType) {
|
||||
getExtensionsToWrite().put("gradient_scale_type", gradientScaleType.name());
|
||||
}
|
||||
|
||||
public GpxSplitType getSplitType() {
|
||||
if (extensions != null) {
|
||||
String gradientScaleTypeName = extensions.get("split_type");
|
||||
if (!Algorithms.isEmpty(gradientScaleTypeName)) {
|
||||
try {
|
||||
return GpxSplitType.valueOf(gradientScaleTypeName);
|
||||
} catch (IllegalArgumentException e) {
|
||||
log.error("Error reading GpxSplitType", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setSplitType(GpxSplitType gpxSplitType) {
|
||||
getExtensionsToWrite().put("split_type", gpxSplitType.name());
|
||||
}
|
||||
|
||||
public double getSplitInterval() {
|
||||
if (extensions != null) {
|
||||
String splitIntervalStr = extensions.get("split_interval");
|
||||
if (!Algorithms.isEmpty(splitIntervalStr)) {
|
||||
try {
|
||||
return Double.parseDouble(splitIntervalStr);
|
||||
} catch (NumberFormatException e) {
|
||||
log.error("Error reading split_interval", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void setSplitInterval(double splitInterval) {
|
||||
getExtensionsToWrite().put("split_interval", String.valueOf(splitInterval));
|
||||
}
|
||||
|
||||
public String getWidth(String defWidth) {
|
||||
String widthValue = null;
|
||||
if (extensions != null) {
|
||||
widthValue = extensions.get("width");
|
||||
}
|
||||
return widthValue != null ? widthValue : defWidth;
|
||||
}
|
||||
|
||||
public void setWidth(String width) {
|
||||
getExtensionsToWrite().put("width", width);
|
||||
}
|
||||
|
||||
public boolean isShowArrows() {
|
||||
String showArrows = null;
|
||||
if (extensions != null) {
|
||||
showArrows = extensions.get("show_arrows");
|
||||
}
|
||||
return Boolean.parseBoolean(showArrows);
|
||||
}
|
||||
|
||||
public void setShowArrows(boolean showArrows) {
|
||||
getExtensionsToWrite().put("show_arrows", String.valueOf(showArrows));
|
||||
}
|
||||
|
||||
public boolean isShowStartFinish() {
|
||||
if (extensions != null && extensions.containsKey("show_start_finish")) {
|
||||
return Boolean.parseBoolean(extensions.get("show_start_finish"));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void setShowStartFinish(boolean showStartFinish) {
|
||||
getExtensionsToWrite().put("show_start_finish", String.valueOf(showStartFinish));
|
||||
}
|
||||
|
||||
public enum GradientScaleType {
|
||||
SPEED("gradient_speed_color"),
|
||||
ALTITUDE("gradient_altitude_color"),
|
||||
SLOPE("gradient_slope_color");
|
||||
|
||||
private String typeName;
|
||||
|
||||
GradientScaleType(String typeName) {
|
||||
this.typeName = typeName;
|
||||
}
|
||||
|
||||
public String getTypeName() {
|
||||
return typeName;
|
||||
}
|
||||
}
|
||||
|
||||
public enum GpxSplitType {
|
||||
NO_SPLIT(-1),
|
||||
DISTANCE(1),
|
||||
TIME(2);
|
||||
|
||||
private int type;
|
||||
|
||||
GpxSplitType(int type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static String asString(GPXFile file) {
|
||||
|
|
|
@ -26,10 +26,9 @@ import net.osmand.data.QuadRect;
|
|||
import net.osmand.render.RenderingRuleSearchRequest;
|
||||
import net.osmand.render.RenderingRulesStorage;
|
||||
import net.osmand.router.NativeTransportRoutingResult;
|
||||
import net.osmand.router.PrecalculatedRouteDirection;
|
||||
import net.osmand.router.RouteCalculationProgress;
|
||||
import net.osmand.router.RouteSegmentResult;
|
||||
import net.osmand.router.RoutingConfiguration;
|
||||
import net.osmand.router.RoutingContext;
|
||||
import net.osmand.router.TransportRoutingConfiguration;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
|
@ -135,12 +134,10 @@ public class NativeLibrary {
|
|||
return nativeTransportRouting(new int[] { sx31, sy31, ex31, ey31 }, cfg, progress);
|
||||
}
|
||||
|
||||
public RouteSegmentResult[] runNativeRouting(int sx31, int sy31, int ex31, int ey31, RoutingConfiguration config,
|
||||
RouteRegion[] regions, RouteCalculationProgress progress, PrecalculatedRouteDirection precalculatedRouteDirection,
|
||||
boolean basemap, boolean publicTransport, boolean startTransportStop, boolean targetTransportStop) {
|
||||
public RouteSegmentResult[] runNativeRouting(RoutingContext c, RouteRegion[] regions, boolean basemap) {
|
||||
// config.router.printRules(System.out);
|
||||
return nativeRouting(new int[] { sx31, sy31, ex31, ey31 }, config, config.initialDirection == null ? -360 : config.initialDirection.floatValue(),
|
||||
regions, progress, precalculatedRouteDirection, basemap, publicTransport, startTransportStop, targetTransportStop);
|
||||
return nativeRouting(c, c.config.initialDirection == null ? -360 : c.config.initialDirection.floatValue(),
|
||||
regions, basemap);
|
||||
}
|
||||
|
||||
|
||||
|
@ -156,16 +153,15 @@ public class NativeLibrary {
|
|||
protected static native NativeRouteSearchResult loadRoutingData(RouteRegion reg, String regName, int regfp, RouteSubregion subreg,
|
||||
boolean loadObjects);
|
||||
|
||||
public static native void deleteNativeRoutingContext(long handle);
|
||||
|
||||
protected static native void deleteRenderingContextHandle(long handle);
|
||||
|
||||
protected static native void deleteRouteSearchResult(long searchResultHandle);
|
||||
|
||||
protected static native RouteDataObject[] getRouteDataObjects(RouteRegion reg, long rs, int x31, int y31);
|
||||
|
||||
protected static native RouteSegmentResult[] nativeRouting(int[] coordinates, RoutingConfiguration r,
|
||||
float initDirection, RouteRegion[] regions, RouteCalculationProgress progress,
|
||||
PrecalculatedRouteDirection precalculatedRouteDirection, boolean basemap,
|
||||
boolean publicTransport, boolean startTransportStop, boolean targetTransportStop);
|
||||
protected static native RouteSegmentResult[] nativeRouting(RoutingContext c, float initDirection, RouteRegion[] regions, boolean basemap);
|
||||
|
||||
protected static native NativeTransportRoutingResult[] nativeTransportRouting(int[] coordinates, TransportRoutingConfiguration cfg,
|
||||
RouteCalculationProgress progress);
|
||||
|
|
|
@ -4,6 +4,7 @@ import net.osmand.PlatformUtil;
|
|||
import net.osmand.ResultMatcher;
|
||||
import net.osmand.CollatorStringMatcher.StringMatcherMode;
|
||||
import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
|
||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
|
||||
import net.osmand.data.Building;
|
||||
import net.osmand.data.City;
|
||||
import net.osmand.data.LatLon;
|
||||
|
@ -23,9 +24,11 @@ import java.text.Collator;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import gnu.trove.set.hash.TLongHashSet;
|
||||
|
@ -40,7 +43,7 @@ public class GeocodingUtilities {
|
|||
public static final float STOP_SEARCHING_STREET_WITH_MULTIPLIER_RADIUS = 250;
|
||||
public static final float STOP_SEARCHING_STREET_WITHOUT_MULTIPLIER_RADIUS = 400;
|
||||
|
||||
public static final int DISTANCE_STREET_NAME_PROXIMITY_BY_NAME = 15000;
|
||||
public static final int DISTANCE_STREET_NAME_PROXIMITY_BY_NAME = 45000;
|
||||
public static final float DISTANCE_STREET_FROM_CLOSEST_WITH_SAME_NAME = 1000;
|
||||
|
||||
public static final float THRESHOLD_MULTIPLIER_SKIP_BUILDINGS_AFTER = 1.5f;
|
||||
|
@ -142,15 +145,12 @@ public class GeocodingUtilities {
|
|||
RoutePlannerFrontEnd rp = new RoutePlannerFrontEnd();
|
||||
List<GeocodingResult> lst = new ArrayList<GeocodingUtilities.GeocodingResult>();
|
||||
List<RouteSegmentPoint> listR = new ArrayList<BinaryRoutePlanner.RouteSegmentPoint>();
|
||||
rp.findRouteSegment(lat, lon, ctx, listR);
|
||||
// we allow duplications to search in both files for boundary regions
|
||||
rp.findRouteSegment(lat, lon, ctx, listR, false, true);
|
||||
double distSquare = 0;
|
||||
TLongHashSet set = new TLongHashSet();
|
||||
Set<String> streetNames = new HashSet<String>();
|
||||
Map<String, List<RouteRegion>> streetNames = new HashMap<>();
|
||||
for (RouteSegmentPoint p : listR) {
|
||||
RouteDataObject road = p.getRoad();
|
||||
if (!set.add(road.getId())) {
|
||||
continue;
|
||||
}
|
||||
// System.out.println(road.toString() + " " + Math.sqrt(p.distSquare));
|
||||
String name = Algorithms.isEmpty(road.getName()) ? road.getRef("", false, true) : road.getName();
|
||||
if (allowEmptyNames || !Algorithms.isEmpty(name)) {
|
||||
|
@ -164,7 +164,13 @@ public class GeocodingUtilities {
|
|||
sr.connectionPoint = new LatLon(MapUtils.get31LatitudeY(p.preciseY), MapUtils.get31LongitudeX(p.preciseX));
|
||||
sr.regionFP = road.region.getFilePointer();
|
||||
sr.regionLen = road.region.getLength();
|
||||
if (streetNames.add(sr.streetName)) {
|
||||
List<RouteRegion> plst = streetNames.get(sr.streetName);
|
||||
if (plst == null) {
|
||||
plst = new ArrayList<BinaryMapRouteReaderAdapter.RouteRegion>();
|
||||
streetNames.put(sr.streetName, plst);
|
||||
}
|
||||
if (!plst.contains(road.region)) {
|
||||
plst.add(road.region);
|
||||
lst.add(sr);
|
||||
}
|
||||
}
|
||||
|
@ -308,6 +314,48 @@ public class GeocodingUtilities {
|
|||
return res;
|
||||
}
|
||||
|
||||
public void filterDuplicateRegionResults(final List<GeocodingResult> res) {
|
||||
Collections.sort(res, DISTANCE_COMPARATOR);
|
||||
// filter duplicate city results (when building is in both regions on boundary)
|
||||
for (int i = 0; i < res.size() - 1;) {
|
||||
int cmp = cmpResult(res.get(i), res.get(i + 1));
|
||||
if (cmp > 0) {
|
||||
res.remove(i);
|
||||
} else if (cmp < 0) {
|
||||
res.remove(i + 1);
|
||||
} else {
|
||||
// nothing to delete
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int cmpResult(GeocodingResult gr1, GeocodingResult gr2) {
|
||||
boolean eqStreet = Algorithms.stringsEqual(gr1.streetName, gr2.streetName);
|
||||
if (eqStreet) {
|
||||
boolean sameObj = false;
|
||||
if (gr1.building != null && gr2.building != null) {
|
||||
if (Algorithms.stringsEqual(gr1.building.getName(), gr2.building.getName())) {
|
||||
// same building
|
||||
sameObj = true;
|
||||
}
|
||||
} else if (gr1.building == null && gr2.building == null) {
|
||||
// same street
|
||||
sameObj = true;
|
||||
}
|
||||
if (sameObj) {
|
||||
double cityDist1 = MapUtils.getDistance(gr1.searchPoint, gr1.city.getLocation());
|
||||
double cityDist2 = MapUtils.getDistance(gr2.searchPoint, gr2.city.getLocation());
|
||||
if (cityDist1 < cityDist2) {
|
||||
return -1;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
private List<GeocodingResult> loadStreetBuildings(final GeocodingResult road, BinaryMapIndexReader reader,
|
||||
GeocodingResult street) throws IOException {
|
||||
final List<GeocodingResult> streetBuildings = new ArrayList<GeocodingResult>();
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
package net.osmand.binary;
|
||||
|
||||
import net.osmand.Location;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
|
||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
|
||||
import net.osmand.util.Algorithms;
|
||||
import net.osmand.util.MapUtils;
|
||||
import net.osmand.util.TransliterationHelper;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Arrays;
|
||||
|
||||
|
@ -34,7 +37,7 @@ public class RouteDataObject {
|
|||
public int[] nameIds;
|
||||
// mixed array [0, height, cumulative_distance height, cumulative_distance, height, ...] - length is length(points)*2
|
||||
public float[] heightDistanceArray = null;
|
||||
|
||||
private static final Log LOG = PlatformUtil.getLog(RouteDataObject.class);
|
||||
public RouteDataObject(RouteRegion region) {
|
||||
this.region = region;
|
||||
}
|
||||
|
@ -56,6 +59,7 @@ public class RouteDataObject {
|
|||
this.pointsY = copy.pointsY;
|
||||
this.types = copy.types;
|
||||
this.names = copy.names;
|
||||
this.nameIds = copy.nameIds;
|
||||
this.restrictions = copy.restrictions;
|
||||
this.restrictionsVia = copy.restrictionsVia;
|
||||
this.pointTypes = copy.pointTypes;
|
||||
|
@ -426,12 +430,19 @@ public class RouteDataObject {
|
|||
int[] opointsX = pointsX;
|
||||
int[] opointsY = pointsY;
|
||||
int[][] opointTypes = pointTypes;
|
||||
String[][] opointNames = pointNames;
|
||||
int[][] opointNameTypes = pointNameTypes;
|
||||
pointsX = new int[pointsX.length + 1];
|
||||
pointsY = new int[pointsY.length + 1];
|
||||
boolean insTypes = this.pointTypes != null && this.pointTypes.length > pos;
|
||||
boolean insNames = this.pointNames != null && this.pointNames.length > pos;
|
||||
if (insTypes) {
|
||||
pointTypes = new int[opointTypes.length + 1][];
|
||||
}
|
||||
if (insNames) {
|
||||
pointNames = new String[opointNames.length + 1][];
|
||||
pointNameTypes = new int[opointNameTypes.length +1][];
|
||||
}
|
||||
int i = 0;
|
||||
for (; i < pos; i++) {
|
||||
pointsX[i] = opointsX[i];
|
||||
|
@ -439,18 +450,32 @@ public class RouteDataObject {
|
|||
if (insTypes) {
|
||||
pointTypes[i] = opointTypes[i];
|
||||
}
|
||||
if (insNames) {
|
||||
pointNames[i] = opointNames[i];
|
||||
pointNameTypes[i] = opointNameTypes[i];
|
||||
}
|
||||
}
|
||||
pointsX[i] = x31;
|
||||
pointsY[i] = y31;
|
||||
if (insTypes) {
|
||||
pointTypes[i] = null;
|
||||
}
|
||||
if (insNames) {
|
||||
pointNames[i] = null;
|
||||
pointNameTypes[i] = null;
|
||||
}
|
||||
for (i = i + 1; i < pointsX.length; i++) {
|
||||
pointsX[i] = opointsX[i - 1];
|
||||
pointsY[i] = opointsY[i - 1];
|
||||
if (insTypes && i < pointTypes.length) {
|
||||
pointTypes[i] = opointTypes[i - 1];
|
||||
}
|
||||
if (insNames && i < pointNames.length) {
|
||||
pointNames[i] = opointNames[i - 1];
|
||||
}
|
||||
if (insNames && i < pointNameTypes.length) {
|
||||
pointNameTypes[i] = opointNameTypes[i - 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -68,7 +68,6 @@ public class BinaryRoutePlanner {
|
|||
FinalRouteSegment searchRouteInternal(final RoutingContext ctx, RouteSegmentPoint start, RouteSegmentPoint end,
|
||||
RouteSegment recalculationEnd ) throws InterruptedException, IOException {
|
||||
// measure time
|
||||
ctx.timeToLoad = 0;
|
||||
ctx.memoryOverhead = 1000;
|
||||
|
||||
// Initializing priority queue to visit way segments
|
||||
|
@ -120,7 +119,9 @@ public class BinaryRoutePlanner {
|
|||
if (ctx.memoryOverhead > ctx.config.memoryLimitation * 0.95) {
|
||||
throw new IllegalStateException("There is not enough memory " + ctx.config.memoryLimitation / (1 << 20) + " Mb");
|
||||
}
|
||||
ctx.visitedSegments ++;
|
||||
if (ctx.calculationProgress != null) {
|
||||
ctx.calculationProgress.visitedSegments++;
|
||||
}
|
||||
if (forwardSearch) {
|
||||
boolean doNotAddIntersections = onlyBackward;
|
||||
processRouteSegment(ctx, false, graphDirectSegments, visitedDirectSegments,
|
||||
|
@ -164,12 +165,14 @@ public class BinaryRoutePlanner {
|
|||
throw new InterruptedException("Route calculation interrupted");
|
||||
}
|
||||
}
|
||||
ctx.visitedSegments += visitedDirectSegments.size() + visitedOppositeSegments.size();
|
||||
ctx.visitedDirectSegments += visitedDirectSegments.size();
|
||||
ctx.visitedOppositeSegments += visitedOppositeSegments.size();
|
||||
ctx.directQueueSize = graphDirectSegments.size(); // Math.max(ctx.directQueueSize, graphDirectSegments.size());
|
||||
ctx.oppositeQueueSize = graphReverseSegments.size();
|
||||
ctx.visitedOppositeSegments += visitedOppositeSegments.size();
|
||||
if (ctx.calculationProgress != null) {
|
||||
ctx.calculationProgress.visitedDirectSegments += visitedDirectSegments.size();
|
||||
ctx.calculationProgress.visitedOppositeSegments += visitedOppositeSegments.size();
|
||||
ctx.calculationProgress.directQueueSize += graphDirectSegments.size(); // Math.max(ctx.directQueueSize,
|
||||
// graphDirectSegments.size());
|
||||
ctx.calculationProgress.oppositeQueueSize += graphReverseSegments.size();
|
||||
ctx.calculationProgress.visitedOppositeSegments += visitedOppositeSegments.size();
|
||||
}
|
||||
return finalSegment;
|
||||
}
|
||||
|
||||
|
@ -371,18 +374,21 @@ public class BinaryRoutePlanner {
|
|||
}
|
||||
|
||||
public static void printDebugMemoryInformation(RoutingContext ctx) {
|
||||
printInfo(String.format("Time. Total: %.2f, to load: %.2f, to load headers: %.2f, to calc dev: %.2f ",
|
||||
(System.nanoTime() - ctx.timeToCalculate) / 1e6, ctx.timeToLoad / 1e6,
|
||||
ctx.timeToLoadHeaders / 1e6, ctx.timeNanoToCalcDeviation / 1e6));
|
||||
// GeneralRouter.TIMER = 0;
|
||||
int maxLoadedTiles = Math.max(ctx.maxLoadedTiles, ctx.getCurrentlyLoadedTiles());
|
||||
printInfo("Current loaded tiles : " + ctx.getCurrentlyLoadedTiles() + ", maximum loaded tiles " + maxLoadedTiles);
|
||||
printInfo("Loaded tiles " + ctx.loadedTiles + " (distinct " + ctx.distinctLoadedTiles + "), unloaded tiles " + ctx.unloadedTiles +
|
||||
", loaded more than once same tiles "
|
||||
+ ctx.loadedPrevUnloadedTiles);
|
||||
printInfo("Visited segments " + ctx.visitedSegments + ", relaxed roads " + ctx.relaxedSegments);
|
||||
printInfo("Priority queues sizes : " + ctx.directQueueSize + "/" + ctx.oppositeQueueSize);
|
||||
printInfo("Visited interval sizes: " + ctx.visitedDirectSegments + "/" + ctx.visitedOppositeSegments);
|
||||
if (ctx.calculationProgress != null) {
|
||||
RouteCalculationProgress p = ctx.calculationProgress;
|
||||
printInfo(String.format("Time. Total: %.2f, to load: %.2f, to load headers: %.2f, to find start/end: %.2f, extra: %.2f ",
|
||||
p.timeToCalculate / 1e6, p.timeToLoad / 1e6, p.timeToLoadHeaders / 1e6,
|
||||
p.timeToFindInitialSegments / 1e6, p.timeNanoToCalcDeviation / 1e6));
|
||||
// GeneralRouter.TIMER = 0;
|
||||
int maxLoadedTiles = Math.max(p.maxLoadedTiles, ctx.getCurrentlyLoadedTiles());
|
||||
printInfo("Current loaded tiles : " + ctx.getCurrentlyLoadedTiles() + ", maximum loaded tiles "
|
||||
+ maxLoadedTiles);
|
||||
printInfo("Loaded tiles " + p.loadedTiles + " (distinct " + p.distinctLoadedTiles + "), unloaded tiles "
|
||||
+ p.unloadedTiles + ", loaded more than once same tiles " + p.loadedPrevUnloadedTiles);
|
||||
printInfo("Visited segments: " + ctx.getVisitedSegments() + ", relaxed roads " + p.relaxedSegments);
|
||||
printInfo("Priority queues sizes : " + p.directQueueSize + "/" + p.oppositeQueueSize);
|
||||
printInfo("Visited interval sizes: " + p.visitedDirectSegments + "/" + p.visitedOppositeSegments);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -849,6 +855,7 @@ public class BinaryRoutePlanner {
|
|||
}
|
||||
|
||||
public static class RouteSegmentPoint extends RouteSegment {
|
||||
|
||||
public RouteSegmentPoint(RouteDataObject road, int segmentStart, double distSquare) {
|
||||
super(road, segmentStart);
|
||||
this.distSquare = distSquare;
|
||||
|
@ -873,6 +880,11 @@ public class BinaryRoutePlanner {
|
|||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("%d (%s): %s", segStart, getPreciseLatLon(), road);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class RouteSegment {
|
||||
|
|
|
@ -12,12 +12,29 @@ public class RouteCalculationProgress {
|
|||
public float totalEstimatedDistance = 0;
|
||||
|
||||
public float routingCalculatedTime = 0;
|
||||
public int loadedTiles = 0;
|
||||
|
||||
public int relaxedSegments = 0;
|
||||
public int visitedSegments = 0;
|
||||
public int visitedDirectSegments = 0;
|
||||
public int visitedOppositeSegments = 0;
|
||||
public int directQueueSize = 0;
|
||||
public int oppositeQueueSize = 0;
|
||||
|
||||
public int totalIterations = 1;
|
||||
public int iteration = -1;
|
||||
|
||||
public long timeNanoToCalcDeviation = 0;
|
||||
public long timeToLoad = 0;
|
||||
public long timeToLoadHeaders = 0;
|
||||
public long timeToFindInitialSegments = 0;
|
||||
public long timeToCalculate = 0;
|
||||
|
||||
public int distinctLoadedTiles = 0;
|
||||
public int maxLoadedTiles = 0;
|
||||
public int loadedPrevUnloadedTiles = 0;
|
||||
public int unloadedTiles = 0;
|
||||
public int loadedTiles = 0;
|
||||
|
||||
public boolean isCancelled;
|
||||
public boolean requestPrivateAccessRouting;
|
||||
|
||||
|
|
|
@ -117,15 +117,21 @@ public class RoutePlannerFrontEnd {
|
|||
}
|
||||
|
||||
public RouteSegmentPoint findRouteSegment(double lat, double lon, RoutingContext ctx, List<RouteSegmentPoint> list, boolean transportStop) throws IOException {
|
||||
return findRouteSegment(lat, lon, ctx, list, false, false);
|
||||
}
|
||||
|
||||
public RouteSegmentPoint findRouteSegment(double lat, double lon, RoutingContext ctx, List<RouteSegmentPoint> list, boolean transportStop,
|
||||
boolean allowDuplications) throws IOException {
|
||||
long now = System.nanoTime();
|
||||
int px = MapUtils.get31TileNumberX(lon);
|
||||
int py = MapUtils.get31TileNumberY(lat);
|
||||
ArrayList<RouteDataObject> dataObjects = new ArrayList<RouteDataObject>();
|
||||
ctx.loadTileData(px, py, 17, dataObjects);
|
||||
ctx.loadTileData(px, py, 17, dataObjects, allowDuplications);
|
||||
if (dataObjects.isEmpty()) {
|
||||
ctx.loadTileData(px, py, 15, dataObjects);
|
||||
ctx.loadTileData(px, py, 15, dataObjects, allowDuplications);
|
||||
}
|
||||
if (dataObjects.isEmpty()) {
|
||||
ctx.loadTileData(px, py, 14, dataObjects);
|
||||
ctx.loadTileData(px, py, 14, dataObjects, allowDuplications);
|
||||
}
|
||||
if (list == null) {
|
||||
list = new ArrayList<BinaryRoutePlanner.RouteSegmentPoint>();
|
||||
|
@ -167,6 +173,9 @@ public class RoutePlannerFrontEnd {
|
|||
return Double.compare(o1.distSquare, o2.distSquare);
|
||||
}
|
||||
});
|
||||
if (ctx.calculationProgress != null) {
|
||||
ctx.calculationProgress.timeToFindInitialSegments += (System.nanoTime() - now);
|
||||
}
|
||||
if (list.size() > 0) {
|
||||
RouteSegmentPoint ps = null;
|
||||
if (ctx.publicTransport) {
|
||||
|
@ -203,12 +212,12 @@ public class RoutePlannerFrontEnd {
|
|||
useSmartRouteRecalculation = use;
|
||||
}
|
||||
|
||||
// TODO native matches less roads
|
||||
public GpxRouteApproximation searchGpxRoute(GpxRouteApproximation gctx, List<LatLon> points) throws IOException, InterruptedException {
|
||||
gctx.ctx.timeToCalculate = System.nanoTime();
|
||||
long timeToCalculate = System.nanoTime();
|
||||
if (gctx.ctx.calculationProgress == null) {
|
||||
gctx.ctx.calculationProgress = new RouteCalculationProgress();
|
||||
}
|
||||
gctx.ctx.keepNativeRoutingContext = true;
|
||||
List<GpxPoint> gpxPoints = generageGpxPoints(points, gctx);
|
||||
GpxPoint start = null;
|
||||
GpxPoint prev = null;
|
||||
|
@ -270,6 +279,10 @@ public class RoutePlannerFrontEnd {
|
|||
}
|
||||
start = next;
|
||||
}
|
||||
if(gctx.ctx.calculationProgress != null) {
|
||||
gctx.ctx.calculationProgress.timeToCalculate = System.nanoTime() - timeToCalculate;
|
||||
}
|
||||
gctx.ctx.deleteNativeRoutingContext();
|
||||
BinaryRoutePlanner.printDebugMemoryInformation(gctx.ctx);
|
||||
calculateGpxRoute(gctx, gpxPoints);
|
||||
if (!gctx.res.isEmpty()) {
|
||||
|
@ -338,8 +351,8 @@ public class RoutePlannerFrontEnd {
|
|||
}
|
||||
if (gctx.distFromLastPoint(startPoint) > 1) {
|
||||
gctx.routeGapDistance += gctx.distFromLastPoint(startPoint);
|
||||
System.out.println(String.format("????? gap of route point = %f, gap of actual gpxPoint = %f ",
|
||||
gctx.distFromLastPoint(startPoint), gctx.distFromLastPoint(pnt.loc)));
|
||||
System.out.println(String.format("????? gap of route point = %f, gap of actual gpxPoint = %f, %s ",
|
||||
gctx.distFromLastPoint(startPoint), gctx.distFromLastPoint(pnt.loc), pnt.loc));
|
||||
}
|
||||
gctx.res.addAll(pnt.routeToTarget);
|
||||
i = pnt.targetInd;
|
||||
|
@ -524,7 +537,11 @@ public class RoutePlannerFrontEnd {
|
|||
// start point could shift to +-1 due to direction
|
||||
res.get(0).setStartPointIndex(start.pnt.getSegmentStart());
|
||||
} else {
|
||||
//throw new IllegalStateException("TODO");
|
||||
// for native routing this is possible when point lies on intersection of 2 lines
|
||||
// solution here could be to pass to native routing id of the route
|
||||
// though it should not create any issue
|
||||
System.out.println("??? not found " + start.pnt.getRoad().getId() + " instead "
|
||||
+ res.get(0).getObject().getId());
|
||||
}
|
||||
}
|
||||
start.routeToTarget = res;
|
||||
|
@ -585,7 +602,7 @@ public class RoutePlannerFrontEnd {
|
|||
|
||||
public List<RouteSegmentResult> searchRoute(final RoutingContext ctx, LatLon start, LatLon end, List<LatLon> intermediates,
|
||||
PrecalculatedRouteDirection routeDirection) throws IOException, InterruptedException {
|
||||
ctx.timeToCalculate = System.nanoTime();
|
||||
long timeToCalculate = System.nanoTime();
|
||||
if (ctx.calculationProgress == null) {
|
||||
ctx.calculationProgress = new RouteCalculationProgress();
|
||||
}
|
||||
|
@ -617,6 +634,7 @@ public class RoutePlannerFrontEnd {
|
|||
}
|
||||
routeDirection = PrecalculatedRouteDirection.build(ls, ctx.config.DEVIATION_RADIUS, ctx.getRouter().getMaxSpeed());
|
||||
}
|
||||
List<RouteSegmentResult> res ;
|
||||
if (intermediatesEmpty && ctx.nativeLib != null) {
|
||||
ctx.startX = MapUtils.get31TileNumberX(start.getLongitude());
|
||||
ctx.startY = MapUtils.get31TileNumberY(start.getLatitude());
|
||||
|
@ -630,13 +648,9 @@ public class RoutePlannerFrontEnd {
|
|||
ctx.precalculatedRouteDirection = routeDirection.adopt(ctx);
|
||||
}
|
||||
ctx.calculationProgress.nextIteration();
|
||||
List<RouteSegmentResult> res = runNativeRouting(ctx, recalculationEnd);
|
||||
if (res != null) {
|
||||
new RouteResultPreparation().printResults(ctx, start, end, res);
|
||||
}
|
||||
res = runNativeRouting(ctx, recalculationEnd);
|
||||
makeStartEndPointsPrecise(res, start, end, intermediates);
|
||||
return res;
|
||||
}
|
||||
} else {
|
||||
int indexNotFound = 0;
|
||||
List<RouteSegmentPoint> points = new ArrayList<RouteSegmentPoint>();
|
||||
if (!addSegment(start, ctx, indexNotFound++, points, ctx.startTransportStop)) {
|
||||
|
@ -654,7 +668,12 @@ public class RoutePlannerFrontEnd {
|
|||
return null;
|
||||
}
|
||||
ctx.calculationProgress.nextIteration();
|
||||
List<RouteSegmentResult> res = searchRouteImpl(ctx, points, routeDirection);
|
||||
res = searchRouteImpl(ctx, points, routeDirection);
|
||||
}
|
||||
if (ctx.calculationProgress != null) {
|
||||
ctx.calculationProgress.timeToCalculate += (System.nanoTime() - timeToCalculate);
|
||||
}
|
||||
BinaryRoutePlanner.printDebugMemoryInformation(ctx);
|
||||
if (res != null) {
|
||||
new RouteResultPreparation().printResults(ctx, start, end, res);
|
||||
}
|
||||
|
@ -769,8 +788,12 @@ public class RoutePlannerFrontEnd {
|
|||
if (ctx.nativeLib != null) {
|
||||
ctx.startX = start.preciseX;
|
||||
ctx.startY = start.preciseY;
|
||||
ctx.startRoadId = start.road.id;
|
||||
ctx.startSegmentInd = start.segStart;
|
||||
ctx.targetX = end.preciseX;
|
||||
ctx.targetY = end.preciseY;
|
||||
ctx.targetRoadId = end.road.id;
|
||||
ctx.targetSegmentInd = end.segStart;
|
||||
return runNativeRouting(ctx, recalculationEnd);
|
||||
} else {
|
||||
refreshProgressDistance(ctx);
|
||||
|
@ -834,11 +857,9 @@ public class RoutePlannerFrontEnd {
|
|||
ctx.checkOldRoutingFiles(ctx.startX, ctx.startY);
|
||||
ctx.checkOldRoutingFiles(ctx.targetX, ctx.targetY);
|
||||
|
||||
long time = System.currentTimeMillis();
|
||||
RouteSegmentResult[] res = ctx.nativeLib.runNativeRouting(ctx.startX, ctx.startY, ctx.targetX, ctx.targetY,
|
||||
ctx.config, regions, ctx.calculationProgress, ctx.precalculatedRouteDirection, ctx.calculationMode == RouteCalculationMode.BASE,
|
||||
ctx.publicTransport, ctx.startTransportStop, ctx.targetTransportStop);
|
||||
log.info("Native routing took " + (System.currentTimeMillis() - time) / 1000f + " seconds");
|
||||
// long time = System.currentTimeMillis();
|
||||
RouteSegmentResult[] res = ctx.nativeLib.runNativeRouting(ctx, regions, ctx.calculationMode == RouteCalculationMode.BASE);
|
||||
// log.info("Native routing took " + (System.currentTimeMillis() - time) / 1000f + " seconds");
|
||||
ArrayList<RouteSegmentResult> result = new ArrayList<RouteSegmentResult>(Arrays.asList(res));
|
||||
if (recalculationEnd != null) {
|
||||
log.info("Native routing use precalculated route");
|
||||
|
@ -849,9 +870,7 @@ public class RoutePlannerFrontEnd {
|
|||
current = pr;
|
||||
}
|
||||
}
|
||||
ctx.routingTime = ctx.calculationProgress.routingCalculatedTime;
|
||||
ctx.visitedSegments = ctx.calculationProgress.visitedSegments;
|
||||
ctx.loadedTiles = ctx.calculationProgress.loadedTiles;
|
||||
ctx.routingTime += ctx.calculationProgress.routingCalculatedTime;
|
||||
return new RouteResultPreparation().prepareResult(ctx, result, recalculationEnd != null);
|
||||
}
|
||||
|
||||
|
@ -865,7 +884,6 @@ public class RoutePlannerFrontEnd {
|
|||
}
|
||||
pringGC(ctx, true);
|
||||
List<RouteSegmentResult> res = searchRouteInternalPrepare(ctx, points.get(0), points.get(1), routeDirection);
|
||||
BinaryRoutePlanner.printDebugMemoryInformation(ctx);
|
||||
pringGC(ctx, false);
|
||||
makeStartEndPointsPrecise(res, points.get(0).getPreciseLatLon(), points.get(1).getPreciseLatLon(), null);
|
||||
return res;
|
||||
|
@ -912,16 +930,7 @@ public class RoutePlannerFrontEnd {
|
|||
List<RouteSegmentResult> res = searchRouteInternalPrepare(local, points.get(i), points.get(i + 1), routeDirection);
|
||||
makeStartEndPointsPrecise(res, points.get(i).getPreciseLatLon(), points.get(i + 1).getPreciseLatLon(), null);
|
||||
results.addAll(res);
|
||||
ctx.distinctLoadedTiles += local.distinctLoadedTiles;
|
||||
ctx.loadedTiles += local.loadedTiles;
|
||||
ctx.visitedSegments += local.visitedSegments;
|
||||
ctx.loadedPrevUnloadedTiles += local.loadedPrevUnloadedTiles;
|
||||
ctx.timeToCalculate += local.timeToCalculate;
|
||||
ctx.timeToLoad += local.timeToLoad;
|
||||
ctx.timeToLoadHeaders += local.timeToLoadHeaders;
|
||||
ctx.relaxedSegments += local.relaxedSegments;
|
||||
ctx.routingTime += local.routingTime;
|
||||
|
||||
// local.unloadAllData(ctx);
|
||||
if (restPartRecalculatedRoute != null) {
|
||||
results.addAll(restPartRecalculatedRoute);
|
||||
|
|
|
@ -394,8 +394,8 @@ public class RouteResultPreparation {
|
|||
private List<RouteSegmentResult> convertFinalSegmentToResults(RoutingContext ctx, FinalRouteSegment finalSegment) {
|
||||
List<RouteSegmentResult> result = new ArrayList<RouteSegmentResult>();
|
||||
if (finalSegment != null) {
|
||||
ctx.routingTime = finalSegment.distanceFromStart;
|
||||
println("Routing calculated time distance " + finalSegment.distanceFromStart);
|
||||
ctx.routingTime += finalSegment.distanceFromStart;
|
||||
// println("Routing calculated time distance " + finalSegment.distanceFromStart);
|
||||
// Get results from opposite direction roads
|
||||
RouteSegment segment = finalSegment.reverseWaySearch ? finalSegment :
|
||||
finalSegment.opposite.getParentRoute();
|
||||
|
@ -496,8 +496,9 @@ public class RouteResultPreparation {
|
|||
String msg = String.format("<test regions=\"\" description=\"\" best_percent=\"\" vehicle=\"%s\" \n"
|
||||
+ " start_lat=\"%.5f\" start_lon=\"%.5f\" target_lat=\"%.5f\" target_lon=\"%.5f\" "
|
||||
+ " routing_time=\"%.2f\" loadedTiles=\"%d\" visitedSegments=\"%d\" complete_distance=\"%.2f\" complete_time=\"%.2f\" >",
|
||||
ctx.config.routerName, startLat, startLon, endLat, endLon, ctx.routingTime, ctx.loadedTiles,
|
||||
ctx.visitedSegments, completeDistance, completeTime);
|
||||
ctx.config.routerName, startLat, startLon, endLat, endLon, ctx.routingTime,
|
||||
ctx.getLoadedTiles(),
|
||||
ctx.getVisitedSegments(), completeDistance, completeTime);
|
||||
// String msg = MessageFormat.format("<test regions=\"\" description=\"\" best_percent=\"\" vehicle=\"{4}\" \n"
|
||||
// + " start_lat=\"{0}\" start_lon=\"{1}\" target_lat=\"{2}\" target_lon=\"{3}\" {5} >",
|
||||
// startLat + "", startLon + "", endLat + "", endLon + "", ctx.config.routerName,
|
||||
|
|
|
@ -41,8 +41,6 @@ public class RoutingContext {
|
|||
|
||||
private final static Log log = PlatformUtil.getLog(RoutingContext.class);
|
||||
|
||||
|
||||
|
||||
// Final context variables
|
||||
public final RoutingConfiguration config;
|
||||
public final RouteCalculationMode calculationMode;
|
||||
|
@ -50,23 +48,31 @@ public class RoutingContext {
|
|||
public final Map<BinaryMapIndexReader, List<RouteSubregion>> map = new LinkedHashMap<BinaryMapIndexReader, List<RouteSubregion>>();
|
||||
public final Map<RouteRegion, BinaryMapIndexReader> reverseMap = new LinkedHashMap<RouteRegion, BinaryMapIndexReader>();
|
||||
|
||||
// 0. Reference to native routingcontext for multiple routes
|
||||
public long nativeRoutingContext;
|
||||
public boolean keepNativeRoutingContext;
|
||||
|
||||
// 1. Initial variables
|
||||
public int startX;
|
||||
public int startY;
|
||||
public long startRoadId;
|
||||
public int startSegmentInd;
|
||||
public boolean startTransportStop;
|
||||
public int targetX;
|
||||
public int targetY;
|
||||
public long targetRoadId;
|
||||
public int targetSegmentInd;
|
||||
public boolean targetTransportStop;
|
||||
|
||||
public boolean publicTransport;
|
||||
// deprecated
|
||||
public long firstRoadId;
|
||||
public int firstRoadDirection;
|
||||
|
||||
|
||||
public RouteCalculationProgress calculationProgress;
|
||||
public boolean leftSideNavigation;
|
||||
public List<RouteSegmentResult> previouslyCalculatedRoute;
|
||||
public PrecalculatedRouteDirection precalculatedRouteDirection;
|
||||
|
||||
|
||||
// 2. Routing memory cache (big objects)
|
||||
TLongObjectHashMap<List<RoutingSubregionTile>> indexedSubregions = new TLongObjectHashMap<List<RoutingSubregionTile>>();
|
||||
|
||||
|
@ -82,26 +88,8 @@ public class RoutingContext {
|
|||
public TileStatistics global = new TileStatistics();
|
||||
// updated by route planner in bytes
|
||||
public int memoryOverhead = 0;
|
||||
|
||||
|
||||
long timeNanoToCalcDeviation = 0;
|
||||
long timeToLoad = 0;
|
||||
long timeToLoadHeaders = 0;
|
||||
long timeToFindInitialSegments = 0;
|
||||
public long timeToCalculate = 0;
|
||||
|
||||
int distinctLoadedTiles = 0;
|
||||
int maxLoadedTiles = 0;
|
||||
int loadedPrevUnloadedTiles = 0;
|
||||
int unloadedTiles = 0;
|
||||
public float routingTime = 0;
|
||||
public int loadedTiles = 0;
|
||||
public int visitedSegments = 0;
|
||||
public int relaxedSegments = 0;
|
||||
public int visitedDirectSegments = 0;
|
||||
public int visitedOppositeSegments = 0;
|
||||
public int directQueueSize = 0;
|
||||
public int oppositeQueueSize = 0;
|
||||
|
||||
// callback of processing segments
|
||||
RouteSegmentVisitor visitor = null;
|
||||
|
||||
|
@ -208,11 +196,15 @@ public class RoutingContext {
|
|||
initTargetPoint(end);
|
||||
startX = start.road.getPoint31XTile(start.getSegmentStart());
|
||||
startY = start.road.getPoint31YTile(start.getSegmentStart());
|
||||
startRoadId = start.road.getId();
|
||||
startSegmentInd = start.getSegmentStart();
|
||||
}
|
||||
|
||||
public void initTargetPoint(RouteSegment end) {
|
||||
targetX = end.road.getPoint31XTile(end.getSegmentStart());
|
||||
targetY = end.road.getPoint31YTile(end.getSegmentStart());
|
||||
targetRoadId = end.road.getId();
|
||||
targetSegmentInd = end.getSegmentStart();
|
||||
}
|
||||
|
||||
public void unloadAllData() {
|
||||
|
@ -224,7 +216,9 @@ public class RoutingContext {
|
|||
if (tl.isLoaded()) {
|
||||
if(except == null || except.searchSubregionTile(tl.subregion) < 0){
|
||||
tl.unload();
|
||||
unloadedTiles ++;
|
||||
if(calculationProgress != null) {
|
||||
calculationProgress.unloadedTiles ++;
|
||||
}
|
||||
global.size -= tl.tileStatistics.size;
|
||||
}
|
||||
}
|
||||
|
@ -308,27 +302,37 @@ public class RoutingContext {
|
|||
} catch (IOException e) {
|
||||
throw new RuntimeException("Loading data exception", e);
|
||||
}
|
||||
|
||||
timeToLoad += (System.nanoTime() - now);
|
||||
if (calculationProgress != null) {
|
||||
calculationProgress.timeToLoad += (System.nanoTime() - now);
|
||||
}
|
||||
|
||||
} else {
|
||||
long now = System.nanoTime();
|
||||
NativeRouteSearchResult ns = nativeLib.loadRouteRegion(ts.subregion, loadObjectsInMemory);
|
||||
// System.out.println(ts.subregion.shiftToData + " " + Arrays.toString(ns.objects));
|
||||
ts.setLoadedNative(ns, this);
|
||||
timeToLoad += (System.nanoTime() - now);
|
||||
if (calculationProgress != null) {
|
||||
calculationProgress.timeToLoad += (System.nanoTime() - now);
|
||||
}
|
||||
loadedTiles++;
|
||||
}
|
||||
if (calculationProgress != null) {
|
||||
calculationProgress.loadedTiles++;
|
||||
}
|
||||
|
||||
if (wasUnloaded) {
|
||||
if(ucount == 1) {
|
||||
loadedPrevUnloadedTiles++;
|
||||
if(calculationProgress != null) {
|
||||
calculationProgress.loadedPrevUnloadedTiles++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(global != null) {
|
||||
global.allRoutes += ts.tileStatistics.allRoutes;
|
||||
global.coordinates += ts.tileStatistics.coordinates;
|
||||
}
|
||||
distinctLoadedTiles++;
|
||||
if (calculationProgress != null) {
|
||||
calculationProgress.distinctLoadedTiles++;
|
||||
}
|
||||
}
|
||||
global.size += ts.tileStatistics.size;
|
||||
}
|
||||
|
@ -402,7 +406,9 @@ public class RoutingContext {
|
|||
}
|
||||
collection.add(found);
|
||||
}
|
||||
timeToLoadHeaders += (System.nanoTime() - now);
|
||||
if (calculationProgress != null) {
|
||||
calculationProgress.timeToLoadHeaders += (System.nanoTime() - now);
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Loading data exception", e);
|
||||
|
@ -412,6 +418,10 @@ public class RoutingContext {
|
|||
}
|
||||
|
||||
public void loadTileData(int x31, int y31, int zoomAround, final List<RouteDataObject> toFillIn) {
|
||||
loadTileData(x31, y31, zoomAround, toFillIn, false);
|
||||
}
|
||||
|
||||
public void loadTileData(int x31, int y31, int zoomAround, final List<RouteDataObject> toFillIn, boolean allowDuplications) {
|
||||
int t = config.ZOOM_TO_LOAD_TILES - zoomAround;
|
||||
int coordinatesShift = (1 << (31 - config.ZOOM_TO_LOAD_TILES));
|
||||
if(t <= 0) {
|
||||
|
@ -422,7 +432,6 @@ public class RoutingContext {
|
|||
}
|
||||
|
||||
TLongHashSet ts = new TLongHashSet();
|
||||
long now = System.nanoTime();
|
||||
for(int i = -t; i <= t; i++) {
|
||||
for(int j = -t; j <= t; j++) {
|
||||
ts.add(getRoutingTile(x31 +i*coordinatesShift, y31 + j*coordinatesShift, 0));
|
||||
|
@ -432,8 +441,10 @@ public class RoutingContext {
|
|||
TLongObjectHashMap<RouteDataObject> excludeDuplications = new TLongObjectHashMap<RouteDataObject>();
|
||||
while (it.hasNext()) {
|
||||
getAllObjects(it.next(), toFillIn, excludeDuplications);
|
||||
if (allowDuplications) {
|
||||
excludeDuplications.clear();
|
||||
}
|
||||
}
|
||||
timeToFindInitialSegments += (System.nanoTime() - now);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
|
@ -516,7 +527,9 @@ public class RoutingContext {
|
|||
loaded++;
|
||||
}
|
||||
}
|
||||
maxLoadedTiles = Math.max(maxLoadedTiles, getCurrentlyLoadedTiles());
|
||||
if(calculationProgress != null) {
|
||||
calculationProgress.maxLoadedTiles = Math.max(calculationProgress.maxLoadedTiles, getCurrentlyLoadedTiles());
|
||||
}
|
||||
Collections.sort(list, new Comparator<RoutingSubregionTile>() {
|
||||
private int pow(int base, int pw) {
|
||||
int r = 1;
|
||||
|
@ -538,7 +551,9 @@ public class RoutingContext {
|
|||
i++;
|
||||
// System.out.println("Unload " + unload);
|
||||
unload.unload();
|
||||
unloadedTiles ++;
|
||||
if(calculationProgress != null) {
|
||||
calculationProgress.unloadedTiles ++;
|
||||
}
|
||||
global.size -= unload.tileStatistics.size;
|
||||
// tile could be cleaned from routing tiles and deleted from whole list
|
||||
|
||||
|
@ -789,7 +804,31 @@ public class RoutingContext {
|
|||
return map.keySet().toArray(new BinaryMapIndexReader[map.size()]);
|
||||
}
|
||||
|
||||
public int getVisitedSegments() {
|
||||
if(calculationProgress != null) {
|
||||
return calculationProgress.visitedSegments;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int getLoadedTiles() {
|
||||
if (calculationProgress != null) {
|
||||
return calculationProgress.loadedTiles;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public synchronized void deleteNativeRoutingContext() {
|
||||
if (nativeRoutingContext != 0) {
|
||||
NativeLibrary.deleteNativeRoutingContext(nativeRoutingContext);
|
||||
}
|
||||
nativeRoutingContext = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void finalize() throws Throwable {
|
||||
deleteNativeRoutingContext();
|
||||
super.finalize();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -236,13 +236,13 @@ public class TestRouting {
|
|||
throw new IllegalArgumentException(MessageFormat.format("Complete routing time (expected) {0} != {1} (original) : {2}", routing_time, calcRoutingTime, testDescription));
|
||||
}
|
||||
|
||||
if (visitedSegments > 0 && !isInOrLess(visitedSegments, ctx.visitedSegments, percent)) {
|
||||
if (visitedSegments > 0 && !isInOrLess(visitedSegments, ctx.getVisitedSegments(), percent)) {
|
||||
throw new IllegalArgumentException(MessageFormat.format("Visited segments (expected) {0} != {1} (original) : {2}", visitedSegments,
|
||||
ctx.visitedSegments, testDescription));
|
||||
ctx.getVisitedSegments(), testDescription));
|
||||
}
|
||||
if (loadedTiles > 0 && !isInOrLess(loadedTiles, ctx.loadedTiles, percent)) {
|
||||
if (loadedTiles > 0 && !isInOrLess(loadedTiles, ctx.getLoadedTiles(), percent)) {
|
||||
throw new IllegalArgumentException(MessageFormat.format("Loaded tiles (expected) {0} != {1} (original) : {2}", loadedTiles,
|
||||
ctx.loadedTiles, testDescription));
|
||||
ctx.getLoadedTiles(), testDescription));
|
||||
}
|
||||
|
||||
if(TEST_BOTH_DIRECTION){
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
<string name="get_telegram_title">Рэгістрацыя ў Telegram</string>
|
||||
<string name="get_telegram_account_first">Для абмену вам неабходны акаўнт Тэлеграм.</string>
|
||||
<string name="get_telegram_description_continue">Калі ласка, ўсталюйце Тэлеграм і наладзьце акаўнт.</string>
|
||||
<string name="get_telegram_after_creating_account">Пасля гэтага вы зможаце выкарыстоўваць дадатак.</string>
|
||||
<string name="get_telegram_after_creating_account">Пасля гэтага вы зможаце выкарыстоўваць праграму.</string>
|
||||
<string name="shared_string_all">Усе</string>
|
||||
<string name="shared_string_off">Выкл</string>
|
||||
<string name="already_registered_in_telegram">Вам неабходна мець акаўнт Тэлеграм і нумар тэлефона</string>
|
||||
|
@ -125,7 +125,7 @@
|
|||
<string name="shared_string_continue">Працягнуць</string>
|
||||
<string name="shared_string_cancel">Скасаваць</string>
|
||||
<string name="shared_string_settings">Налады</string>
|
||||
<string name="no_location_permission">Дадатак не мае дазволу на доступ да даных аб месцазнаходжанні.</string>
|
||||
<string name="no_location_permission">Праграма не мае дазволу на доступ да даных аб месцазнаходжанні.</string>
|
||||
<string name="gps_not_available">Калі ласка, ўключыце \"Месцазнаходжанне\" ў сістэмных наладах</string>
|
||||
<string name="location_service_no_gps_available">Абярыце аднаго пастаўшчыка месцазнаходжання, каб падзяліцца сваім месцазнаходжаннем.</string>
|
||||
<string name="osmand_service">Фонавы рэжым</string>
|
||||
|
@ -168,7 +168,7 @@
|
|||
<string name="shared_string_hour_short">г</string>
|
||||
<string name="shared_string_minute_short">хвіл</string>
|
||||
<string name="shared_string_second_short">сек</string>
|
||||
<string name="welcome_descr"><b>Назіральнік OsmAnd</b> Дае магчымасць дзяліцца сваім месцазнаходжаннем і бачыць месцазнаходжанне іншых у OsmAnd.<br/> <br/> Дадатак выкарыстоўвае Telegram API, таму вам неабходны акаўнт Тэлеграм.</string>
|
||||
<string name="welcome_descr"><b>Назіральнік OsmAnd</b> Дае магчымасць дзяліцца сваім месцазнаходжаннем і бачыць месцазнаходжанне іншых у OsmAnd.<br/> <br/> Праграма выкарыстоўвае Telegram API, таму вам неабходны акаўнт Тэлеграм.</string>
|
||||
<string name="my_location">Маё месцазнаходжанне</string>
|
||||
<string name="live_now">Зараз дзейнічае</string>
|
||||
<string name="send_location_as">Адправіць месцазнаходжанне як</string>
|
||||
|
@ -200,7 +200,7 @@
|
|||
<string name="timeline_description">Уключыць маніторынг, каб захоўваць пункты месцазнаходжання ў гісторыі.</string>
|
||||
<string name="app_name_short">Назіральнік OsmAnd</string>
|
||||
<string name="shared_string_telegram">Telegram</string>
|
||||
<string name="privacy_policy_use_telegram">Telegram (дадатак для ліставання) выкарыстоўваецца для зносін паміж людзьмі.</string>
|
||||
<string name="privacy_policy_use_telegram">Telegram (праграма для ліставання) выкарыстоўваецца для зносін паміж людзьмі.</string>
|
||||
<string name="privacy_policy_telegram_client">Назіральнік OsmAnd - адзін з кліентаў для адкрытай платформы Telegram. Вашыя кантакты могуць выкарыстоўваць іншы кліент.</string>
|
||||
<string name="privacy_policy_agree">Націскаючы \"Працягнуць\" вы пагаджаецеся з палітыкай прыватнасці Telegram і OsmAnd.</string>
|
||||
<string name="shared_string_accept">Ухваліць</string>
|
||||
|
|
|
@ -248,4 +248,20 @@
|
|||
<string name="start_location_sharing">Partager la position</string>
|
||||
<string name="show_on_map">Afficher sur la carte</string>
|
||||
<string name="already_registered_in_telegram">Vous avez besoin d\'un compte Telegram enregistré et d\'un numéro de téléphone</string>
|
||||
<string name="app_name">OsmAnd Online GPS Tracker</string>
|
||||
<string name="location_service_no_gps_available">Sélectionnez l’un des services de localisation pour partager votre position.</string>
|
||||
<string name="welcome_descr"><b>OsmAnd Tracker</b> vous permet de partager votre position et voir celle des autres dans OsmAnd.<br/><br/>Cette application utilise l\'API de Telegram, et donc vous avez besoin d\'un compte Telegram.</string>
|
||||
<string name="install_osmand_dialog_message">Vous avez besoin d\'installer la version gratuite ou payante d\'OsmAnd d\'abord</string>
|
||||
<string name="osmand_service_descr">OsmAnd Tracker s\'exécute en arrière-plan, écran éteint.</string>
|
||||
<string name="gps_not_available">Merci d\'activer la géolocalisation dans les paramètres du système</string>
|
||||
<string name="phone_number_descr">Numéro de téléphone au format international</string>
|
||||
<string name="phone_number_title">Numéro de téléphone</string>
|
||||
<string name="my_location_search_hint">Recherche : groupe ou contact</string>
|
||||
<string name="location_sharing_description">Sélectionner les contacts et les groupes avec lesquels vous souhaitez partager votre position.</string>
|
||||
<string name="set_time">Définir l\'heure</string>
|
||||
<string name="visible_time_for_all">Heure visible par tous</string>
|
||||
<string name="set_visible_time_for_all">Rendre l\'heure visible par tous</string>
|
||||
<string name="send_my_location_desc">Définir l\'intervalle minimum pour partager sa position.</string>
|
||||
<string name="stale_location_desc">La dernière fois qu\'un contact s\'est déplacé.</string>
|
||||
<string name="location_history_desc">Cacher les contacts qui ne se sont pas déplacés depuis un temps donné.</string>
|
||||
</resources>
|
|
@ -142,9 +142,7 @@
|
|||
<string name="shared_string_hour_short">h</string>
|
||||
<string name="shared_string_minute_short">min</string>
|
||||
<string name="shared_string_second_short">sek</string>
|
||||
<string name="welcome_descr">
|
||||
<b>Nadajnik OsmAnd</b> pozwala Ci udostępniać swoją lokalizację i widzieć ją w OsmAnd.<br/>
|
||||
<br/>Aplikacja używa API Telegram, a więc potrzebujesz konta Telegram.</string>
|
||||
<string name="welcome_descr"><b>Nadajnik OsmAnd</b> pozwala Ci udostępniać swoją lokalizację i widzieć ją w OsmAnd.<br/> <br/>Aplikacja używa API Telegram, a więc potrzebujesz konta Telegram.</string>
|
||||
<string name="my_location">Moja lokalizacja</string>
|
||||
<string name="live_now">Na żywo</string>
|
||||
<string name="enter_another_device_name">Wybierz nazwę, której jeszcze nie używasz</string>
|
||||
|
|
|
@ -955,6 +955,7 @@
|
|||
android:process="net.osmand.plus"
|
||||
android:label="@string/process_navigation_service"
|
||||
android:name="net.osmand.plus.NavigationService"
|
||||
android:foregroundServiceType="location"
|
||||
android:stopWithTask="false">
|
||||
<intent-filter>
|
||||
<action android:name="net.osmand.plus.NavigationService" />
|
||||
|
|
|
@ -22,8 +22,8 @@ task printc {
|
|||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 28
|
||||
buildToolsVersion "28.0.3"
|
||||
compileSdkVersion 29
|
||||
buildToolsVersion "29.0.3"
|
||||
// compileNdkVersion "android-ndk-r17b"
|
||||
|
||||
signingConfigs {
|
||||
|
|
|
@ -3806,4 +3806,8 @@
|
|||
<string name="plugin_wikipedia_description">الحصول على معلومات حول النقاط المثيرة للاهتمام من ويكيبيديا. إنه دليلك غير المتصل بجيبك - ما عليك سوى تمكين المكون الإضافي ويكبيديا والاستمتاع بمقالات حول الكائنات من حولك.</string>
|
||||
<string name="app_mode_enduro_motorcycle">دراجة نارية</string>
|
||||
<string name="app_mode_motor_scooter">سكوتر موتور</string>
|
||||
<string name="app_mode_wheelchair_forward">منحدرات للأمام</string>
|
||||
<string name="app_mode_wheelchair">منحدرات</string>
|
||||
<string name="app_mode_go_cart">عربة التسوق</string>
|
||||
<string name="osm_edit_closed_note">أغلق ملاحظة OSM</string>
|
||||
</resources>
|
|
@ -1049,7 +1049,7 @@
|
|||
<string name="poi_lighting_tower">Асвятляльная вежа</string>
|
||||
<string name="poi_rescue_station">Выратавальная станцыя</string>
|
||||
<string name="poi_traffic_signals_sound_walk">Толькі калі пераход дазволены</string>
|
||||
<string name="poi_traffic_signals_sound_no">Не</string>
|
||||
<string name="poi_traffic_signals_sound_no">Гук: не</string>
|
||||
<string name="poi_traffic_signals_sound_yes">Так</string>
|
||||
<string name="poi_tactile_paving_no">Без тактыльнага пакрыцця</string>
|
||||
<string name="poi_tactile_paving_yes">Так</string>
|
||||
|
@ -3638,4 +3638,12 @@
|
|||
<string name="poi_bath_open_air">На адкрытым паветры</string>
|
||||
<string name="poi_volcano_type">Тып</string>
|
||||
<string name="poi_volcano_status">Статус</string>
|
||||
<string name="poi_motor_vehicle_yes">Даступна для механічнага транспартнага сродку: так</string>
|
||||
<string name="poi_motor_vehicle_no">Даступна для механічнага транспартнага сродку: не</string>
|
||||
<string name="poi_motor_vehicle_private">Даступна для механічнага транспартнага сродку: прыватны доступ</string>
|
||||
<string name="poi_traffic_signals_arrow">Стрэлка</string>
|
||||
<string name="poi_traffic_signals_vibration">Вібрацыя</string>
|
||||
<string name="poi_fire_hydrant_pressure_filter">Ціск</string>
|
||||
<string name="poi_video_telephone">Відэа</string>
|
||||
<string name="poi_sms">SMS</string>
|
||||
</resources>
|
|
@ -7,16 +7,16 @@
|
|||
<string name="map_magnifier">Лупа мапы</string>
|
||||
<string name="base_world_map">Асноўная мапа свету</string>
|
||||
<string name="about_version">Версія:</string>
|
||||
<string name="shared_string_about">Пра дадатак</string>
|
||||
<string name="shared_string_about">Пра праграму</string>
|
||||
<string name="about_settings_descr">Версія, ліцэнзіі, удзельнікі праекта</string>
|
||||
<string name="local_index_tile_data_zooms">Спампаваныя маштабы: %1$s</string>
|
||||
<string name="local_index_tile_data_zooms">Спампаваныя ўзроўні маштабавання: %1$s</string>
|
||||
<string name="local_index_tile_data_expire">Тэрмін дзеяння (у хвілінах): %1$s</string>
|
||||
<string name="local_index_tile_data_downloadable">Можна спампаваць: %1$s</string>
|
||||
<string name="local_index_tile_data_maxzoom">Максімальнае павелічэнне: %1$s</string>
|
||||
<string name="local_index_tile_data_minzoom">Мінімальнае павелічэнне: %1$s</string>
|
||||
<string name="local_index_tile_data_name">Даныя фрагменту: %1$s</string>
|
||||
<string name="edit_tilesource_successfully">Крыніца фрагментаў мапы «%1$s» захаваная</string>
|
||||
<string name="edit_tilesource_elliptic_tile">Эліптычны меркатар</string>
|
||||
<string name="edit_tilesource_elliptic_tile">Эліптычная праекцыя меркатара</string>
|
||||
<string name="edit_tilesource_maxzoom">Максімальнае павелічэнне</string>
|
||||
<string name="edit_tilesource_expiration_time">Тэрмін дзеяння (у хвілінах)</string>
|
||||
<string name="edit_tilesource_minzoom">Мінімальнае павелічэнне</string>
|
||||
|
@ -100,7 +100,7 @@
|
|||
<string name="monitoring_settings_descr">Наладзьце запіс вашых паездак.</string>
|
||||
<string name="osmand_background_plugin_description">Паказвае налады ўключэння фонавага адсочвання і навігацыі праз перыядычнае абуджэнне GPS прылады (з выключаным экранам).</string>
|
||||
<string name="contribution_activity">Усталёўка версіі</string>
|
||||
<string name="choose_osmand_theme_descr">Наладка выгляду дадатку.</string>
|
||||
<string name="choose_osmand_theme_descr">Наладка выгляду праграмы.</string>
|
||||
<string name="choose_osmand_theme">Выгляд</string>
|
||||
<string name="accessibility_options">Налады адмысловых магчымасцяў</string>
|
||||
<string name="select_address_activity">Вызначце адрас</string>
|
||||
|
@ -139,10 +139,10 @@
|
|||
<string name="av_widget_action">Прадвызначанае дзеянне віджэта</string>
|
||||
<string name="av_video_format_descr">Фармат вываду відэа:</string>
|
||||
<string name="av_video_format">Фармат відэа</string>
|
||||
<string name="av_use_external_recorder_descr">Выкарыстоўваць сістэмны дадатак для запісу відэа.</string>
|
||||
<string name="av_use_external_recorder">Выкарыстоўваць сістэмны дадатак для запісу</string>
|
||||
<string name="av_use_external_camera_descr">Выкарыстоўваць сістэмны дадатак для фота.</string>
|
||||
<string name="av_use_external_camera">Выкарыстоўваць дадатак камеры</string>
|
||||
<string name="av_use_external_recorder_descr">Выкарыстоўваць сістэмную праграму для запісу відэа.</string>
|
||||
<string name="av_use_external_recorder">Выкарыстоўваць сістэмную праграму для запісу</string>
|
||||
<string name="av_use_external_camera_descr">Выкарыстоўваць сістэмную праграму для фота.</string>
|
||||
<string name="av_use_external_camera">Выкарыстоўваць праграму камеры</string>
|
||||
<string name="av_settings_descr">Наладзіць параметры аўдыё і відэа.</string>
|
||||
<string name="av_settings">Налады аўдыё і відэа </string>
|
||||
<string name="recording_error">Запісаць не атрымалася</string>
|
||||
|
@ -186,10 +186,10 @@
|
|||
<string name="rendering_attr_showRoadMaps_name">Мапы толькі дарог</string>
|
||||
<string name="safe_mode_description">Працаваць у бяспечным рэжыме (трохі павольней, але без уласных бібліятэк).</string>
|
||||
<string name="safe_mode">Бяспечны рэжым</string>
|
||||
<string name="native_library_not_running">Дадатак працуе ў бяспечным рэжыме (адключыць ў «Наладах»).</string>
|
||||
<string name="native_library_not_running">Праграма працуе ў бяспечным рэжыме (адключыць ў «Наладах»).</string>
|
||||
<string name="background_service_is_enabled_question">Фонавы рэжым OsmAnd па-ранейшаму працуе. Спыніць яго?</string>
|
||||
<string name="close_changeset">Закрыць набор змен</string>
|
||||
<string name="zxing_barcode_scanner_not_found">Дадатак «ZXing Barcode Scanner» не ўсталяваны. Знайсці ў Google Play\?</string>
|
||||
<string name="zxing_barcode_scanner_not_found">Праграма «ZXing Barcode Scanner» не ўсталяваная. Знайсці ў Google Play\?</string>
|
||||
<string name="rendering_attr_roadColors_description">Абярыце схему колераў дарог:</string>
|
||||
<string name="rendering_attr_roadColors_name">Схема колераў дарог</string>
|
||||
<string name="map_widget_show_destination_arrow">Паказваць напрамак да месца прызначэння</string>
|
||||
|
@ -240,7 +240,7 @@
|
|||
<string name="osmand_long_description_1000_chars">OsmAnd (OSM Automated Navigation Directions)
|
||||
\n
|
||||
\n
|
||||
\nOsmAnd — навігацыйны дадатак з адкрытым кодам з доступам да разнастайных даных ад OpenStreetMap (OSM). Усе даныя (вектарныя і растравыя) можна захаваць на картцы памяці для аўтаномнага выкарыстання. Таксама падтрымліваецца аўтаномная і сеціўная маршрутызацыя, уключаючы пакрокавае галасавое суправаджэнне.
|
||||
\nOsmAnd — навігацыйная праграма з адкрытым кодам з доступам да разнастайных даных ад OpenStreetMap (OSM). Усе даныя (вектарныя і растравыя) можна захаваць на картцы памяці для аўтаномнага выкарыстання. Таксама падтрымліваецца аўтаномная і сеціўная маршрутызацыя, уключаючы пакрокавае галасавое суправаджэнне.
|
||||
\n
|
||||
\n
|
||||
\nНекалькі асноўных магчымасцяў:
|
||||
|
@ -249,7 +249,7 @@
|
|||
\n
|
||||
\n - кампактная вектарная мапа ўсяго свету;
|
||||
\n
|
||||
\n - спампоўванне мапаў краін або рэгіёну непасрэдна ў дадатку;
|
||||
\n - спампоўванне мапаў краін або рэгіёну непасрэдна ў праграме;
|
||||
\n
|
||||
\n - магчымасць адлюстравання звестак на мапе, напрыклад пласт для пракладкі маршруту або пласт з запісам GPX-следу, з POI, улюбёнымі мясцінамі, ізалініямі вышынь, грамадскім транспартам, дадатковымі мапамі з магчымасцю налады ўзроўню празрыстасці;
|
||||
\n
|
||||
|
@ -257,7 +257,7 @@
|
|||
\n
|
||||
\n - пракладка маршрутаў па-за сецівам на кароткія адлегласці (эксперыментальная функцыя);
|
||||
\n
|
||||
\n - рэжымы для пешаходнай, аўтамабільнай і роваравай навігацыі з:
|
||||
\n - рэжымы для пешаходнай, аўтамабільнай і роварнай навігацыі з:
|
||||
\n
|
||||
\n - магчымасцю аўтаматычнага пераключэння дзённага/начнога адлюстравання;
|
||||
\n
|
||||
|
@ -282,7 +282,7 @@
|
|||
\n
|
||||
\n
|
||||
\n
|
||||
\n OsmAnd+ — навігацыйны дадатак з адкрытым кодам з доступам да разнастайных даных ад OpenStreetMap (OSM). Усе даныя (вектарныя і растравыя) можна захаваць на картцы памяці для далейшага аўтаномнага выкарыстання. Таксама падтрымліваецца аўтаномная і сеціўная маршрутызацыя, уключаючы пакрокавае галасавое суправаджэнне.
|
||||
\n OsmAnd+ — навігацыйная праграма з адкрытым кодам з доступам да разнастайных даных ад OpenStreetMap (OSM). Усе даныя (вектарныя і растравыя) можна захаваць на картцы памяці для далейшага аўтаномнага выкарыстання. Таксама падтрымліваецца аўтаномная і сеціўная маршрутызацыя, уключаючы пакрокавае галасавое суправаджэнне.
|
||||
\n
|
||||
\n
|
||||
\n
|
||||
|
@ -296,7 +296,7 @@
|
|||
\n
|
||||
\n - кампактная вектарная мапа для ўсяго cвету;
|
||||
\n
|
||||
\n - неабмежаваная колькасць спампоўванняў мапаў асобнай краіны або рэгіёну непасрэдна ў дадатку;
|
||||
\n - неабмежаваная колькасць спампоўванняў мапаў асобнай краіны або рэгіёну непасрэдна ў праграме;
|
||||
\n
|
||||
\n - магчымасць аўтаномнай працы з данымі Вікіпедыі (спампоўванне POI з Вікіпедыі) з\'яўляецца цудоўным інструментам для падарожнікаў;
|
||||
\n
|
||||
|
@ -370,7 +370,7 @@
|
|||
<string name="select_animate_speedup">Хуткасць сімуляцыі маршруту:</string>
|
||||
<string name="global_app_allocated_memory_descr">Адведзена памяці %1$s МБ (Абмежаванне Android %2$s МБ, Dalvik %3$s МБ).</string>
|
||||
<string name="global_app_allocated_memory">Адведзеная памяць</string>
|
||||
<string name="native_app_allocated_memory_descr">Агулам фізічнай памяці занятай дадаткам %1$s МБ (Dalvik %2$s МБ, іншае %3$s МБ).
|
||||
<string name="native_app_allocated_memory_descr">Агулам фізічнай памяці занятай праграмай %1$s МБ (Dalvik %2$s МБ, іншае %3$s МБ).
|
||||
\n Прапарцыйнай памяці %4$s МБ (Абмежаванне Android %5$s МБ, Dalvik %6$s МБ).</string>
|
||||
<string name="native_app_allocated_memory">Фізічнай памяці агулам</string>
|
||||
<string name="starting_point_too_far">Пункт адпраўлення знаходзіцца занадта далёка ад бліжэйшай дарогі.</string>
|
||||
|
@ -462,7 +462,7 @@
|
|||
<string name="validate_gpx_upload_name_pwd">Калі ласка, пазначце імя і пароль карыстальніка OSM, каб адсылаць GPX-файлы.</string>
|
||||
<string name="default_buttons_support">Падтрымка</string>
|
||||
<string name="support_new_features">Падтрымка новых магчымасцяў</string>
|
||||
<string name="support_new_features_descr">Ахвяраваць, каб убачыць новыя магчымасці, рэалізаваныя ў дадатку.</string>
|
||||
<string name="support_new_features_descr">Ахвяраваць, каб убачыць новыя магчымасці, рэалізаваныя ў праграме.</string>
|
||||
<string name="show_ruler_level">Паказваць маштаб</string>
|
||||
<string name="info_button">Інфармацыя</string>
|
||||
<string name="back_to_location">Вярнуцца да становішча</string>
|
||||
|
@ -518,7 +518,7 @@
|
|||
<string name="use_fluorescent_overlays_descr">Ужываць флюарэсцэнтныя колеры для слядоў і шляхоў.</string>
|
||||
<string name="offline_edition">Пазасеціўнае рэдагаванне</string>
|
||||
<string name="offline_edition_descr">Заўсёды выкарыстоўваць аўтаномнае рэдагаванне.</string>
|
||||
<string name="update_poi_does_not_change_indexes">Змены POI у дадатку не паўплываюць на cпампаваныя файлы мапаў, змены захоўваюцца як файлы на вашай прыладзе.</string>
|
||||
<string name="update_poi_does_not_change_indexes">Змены цікавых пунктаў (POI) у праграме не паўплываюць на cпампаваныя файлы мапаў, змены захоўваюцца як файлы на вашай прыладзе.</string>
|
||||
<string name="local_openstreetmap_uploading">Запампоўка…</string>
|
||||
<string name="local_openstreetmap_were_uploaded">{0} POI/нататкі запампаваныя</string>
|
||||
<string name="local_openstreetmap_uploadall">Запампаваць усё</string>
|
||||
|
@ -560,8 +560,8 @@
|
|||
<string name="global_settings">Агульныя налады</string>
|
||||
<string name="index_settings">Кіраваць файламі мапаў</string>
|
||||
<string name="general_settings">Агульныя</string>
|
||||
<string name="general_settings_descr">Налады экрана і агульныя налады дадатку.</string>
|
||||
<string name="global_app_settings">Агульныя налады дадатку</string>
|
||||
<string name="general_settings_descr">Налады экрана і агульныя налады праграмы.</string>
|
||||
<string name="global_app_settings">Агульныя налады праграмы</string>
|
||||
<string name="user_name">Вашае імя карыстальніка OSM</string>
|
||||
<string name="open_street_map_login_descr">Патрэбна для падачы ў openstreetmap.org.</string>
|
||||
<string name="user_password">Ваш пароль OSM</string>
|
||||
|
@ -599,7 +599,7 @@
|
|||
<string name="old_poi_file_should_be_deleted">Файл POI \'%1$s\' залішні і можа быць выдалены.</string>
|
||||
<string name="update_poi_file_not_found">Лакальны файл для падтрымкі змен у POI не знойдзены і не можа быць створаны.</string>
|
||||
<string name="button_upgrade_osmandplus">Палепшыць да OsmAnd+</string>
|
||||
<string name="map_version_changed_info">Спампаваць новую версію дадатку, каб мець магчымасць выкарыстоўваць новыя файлы мапаў.</string>
|
||||
<string name="map_version_changed_info">Спампаваць новую версію праграмы, каб мець магчымасць выкарыстоўваць новыя файлы мапаў.</string>
|
||||
<string name="poi_filter_nominatim">Сеціўны Nominatim</string>
|
||||
<string name="search_position_current_location_search">Вызначэнне становішча…</string>
|
||||
<string name="search_position_current_location_found">Маё становішча (знойдзена)</string>
|
||||
|
@ -671,7 +671,7 @@
|
|||
<string name="voice_stream_voice_call">Канал телефанавання (спыняе музыку з дынамікаў)</string>
|
||||
<string name="voice_stream_notification">Канал апавяшчэння</string>
|
||||
<string name="voice_stream_music">Канал медыя/навігацыі</string>
|
||||
<string name="warning_tile_layer_not_downloadable">Дадатак не можа спампаваць пласт мапы %1$s. Можа дапамагчы пераўсталёўка.</string>
|
||||
<string name="warning_tile_layer_not_downloadable">Праграма не можа спампаваць пласт мапы %1$s. Можа дапамагчы пераўсталёўка.</string>
|
||||
<string name="overlay_transparency_descr">Падладзіць празрыстаць накладзенага пласта.</string>
|
||||
<string name="overlay_transparency">Празрыстасць накладкі</string>
|
||||
<string name="map_transparency_descr">Падладзіць празрыстасць асноўнай мапы.</string>
|
||||
|
@ -752,14 +752,14 @@
|
|||
\nНавігацыя часова пераключаецца на сэрвіс CloudMade.</string>
|
||||
<string name="specified_dir_doesnt_exist">Не атрымалася знайсці вызначаны каталог.</string>
|
||||
<string name="application_dir">Каталог захоўвання даных</string>
|
||||
<string name="osmand_net_previously_installed">Усе аўтаномныя даныя ў старым усталяваным дадатку будуць падтрымлівацца новым, але ўлюбёныя мясціны патрэбна экспартаваць са старой версіі і імпартаваць у новую.</string>
|
||||
<string name="osmand_net_previously_installed">Усе аўтаномныя даныя ў старой усталяванай праграме будуць падтрымлівацца новыай, але ўлюбёныя мясціны патрэбна экспартаваць са старой версіі і імпартаваць у новую.</string>
|
||||
<string name="build_installed">Зборка {0} ўсталяваная ({1}).</string>
|
||||
<string name="downloading_build">Спампоўваецца зборка…</string>
|
||||
<string name="install_selected_build">Усталяваць OsmAnd - {0} з {1} {2} МБ?</string>
|
||||
<string name="loading_builds_failed">Не ўдалося атрымаць спіс зборак OsmAnd</string>
|
||||
<string name="loading_builds">Загружаюцца зборкі OsmAnd…</string>
|
||||
<string name="select_build_to_install">Абярыце зборку OsmAnd для ўсталёўкі</string>
|
||||
<string name="gps_status_app_not_found">Дадатак стану GPS не ўсталяваны. Пашукаць ў краме\?</string>
|
||||
<string name="gps_status_app_not_found">Праграма статусу GPS не ўсталяваная. Пашукаць ў краме\?</string>
|
||||
<string name="voice_is_not_available_msg">Галасавыя загады недаступныя. Калі ласка, перайдзіце ў \"Налады\" → \"Налады навігацыі\", абярыце профіль \"Галасавыя даныя\" і абярыце ці спампуйце пакунак галасавых падказак.</string>
|
||||
<string name="voice_is_not_available_title">Абярыце пакунак галасавых падказак</string>
|
||||
<string name="daynight_mode_day">Дзень</string>
|
||||
|
@ -893,7 +893,7 @@
|
|||
<string name="transport">Транспарт</string>
|
||||
<string name="show_transport_over_map_description">Паказаць прыпынкі грамадскага транспарту на мапе.</string>
|
||||
<string name="show_transport_over_map">Паказваць прыпынкі транспарту</string>
|
||||
<string name="hello">Навігацыйны дадатак OsmAnd</string>
|
||||
<string name="hello">Навігацыйная праграма OsmAnd</string>
|
||||
<string name="update_poi_success">Даныя POI былі абноўленыя ({0} аб\'ектаў загружана)</string>
|
||||
<string name="update_poi_error_local">Не атрымалася абнавіць лакальны спіс POI.</string>
|
||||
<string name="update_poi_error_loading">Не атрымалася загрузіць даныя з сервера.</string>
|
||||
|
@ -977,7 +977,7 @@
|
|||
<string name="mark_point">Мэта</string>
|
||||
<string name="use_english_names_descr">Выбар паміж мясцовымі і англійскімі назвамі.</string>
|
||||
<string name="use_english_names">Выкарыстоўваць англійскія назвы</string>
|
||||
<string name="app_settings">Налады дадатку</string>
|
||||
<string name="app_settings">Налады праграмы</string>
|
||||
<string name="search_address">Пошук адраса</string>
|
||||
<string name="choose_building">Абраць будынак</string>
|
||||
<string name="choose_street">Абраць вуліцу</string>
|
||||
|
@ -995,7 +995,7 @@
|
|||
<string name="show_location">Паказаць вашае становішча</string>
|
||||
<string name="show_gps_coordinates_text">Паказаць GPS-каардынаты на мапе</string>
|
||||
<string name="use_internet_to_download_tile">Спампаваць адсутныя фрагменты мапы</string>
|
||||
<string name="app_description">Навігацыйны дадатак</string>
|
||||
<string name="app_description">Навігацыйная праграма</string>
|
||||
<string name="search_button">Пошук</string>
|
||||
<string name="search_activity">Пошук</string>
|
||||
<string name="searchpoi_activity">Абраць POI</string>
|
||||
|
@ -1147,7 +1147,7 @@
|
|||
<string name="routing_attr_prefer_motorway_description">Аддаваць перавагу аўтамагістралям</string>
|
||||
<string name="animate_routing_route">Імітацыя з выкарыстаннем разлічанага маршруту</string>
|
||||
<string name="animate_routing_gpx">Імітацыя з выкарыстаннем GPX-следу</string>
|
||||
<string name="app_modes_choose">Профілі дадатку</string>
|
||||
<string name="app_modes_choose">Профілі праграмы</string>
|
||||
<string name="index_item_world_altitude_correction">Глабальная карэкцыя вышыні</string>
|
||||
<string name="index_item_world_seamarks">Навігацыйныя знакі ўсяго свету</string>
|
||||
<string name="index_item_world_bitcoin_payments">Плацяжы Bitcoin ўсяго свету</string>
|
||||
|
@ -1547,7 +1547,7 @@
|
|||
\n
|
||||
\nГэты стыль на любым маштабе мапы паказвае максімальную колькасць падрабязнасцяў для паездкі, наяўных у даных мапы (у прыватнасці, дарогі, дарожкі, сцяжынкі, і арыенціры).
|
||||
\n
|
||||
\nЁн таксама дакладна адлюстроўвае ўсе тыпы дарог праз колеравае кадаванне, што карысна, для, напрыклад, кіравання вялікімі транспартнымі сродкамі.
|
||||
\nЁн таксама дакладна адлюстроўвае ўсе тыпы дарог праз каляровае кадаванне, што карысна, для, напрыклад, кіравання вялікімі транспартнымі сродкамі.
|
||||
\n
|
||||
\nІ ён дадае адмысловыя турыстычныя налады, такія як роварныя маршруты або альпійскія горныя маршруты.
|
||||
\n
|
||||
|
@ -1574,7 +1574,7 @@
|
|||
<string name="rendering_value_highContrastRoads_name">Высокая кантрастнасць дарог</string>
|
||||
<string name="specified_directiory_not_writeable">Немагчыма стварыць мапы ў вызначаным каталозе</string>
|
||||
<string name="copying_osmand_file_failed">Перамясціць файлы не атрымалася</string>
|
||||
<string name="storage_directory_internal_app">Унутраная памяць дадатку</string>
|
||||
<string name="storage_directory_internal_app">Унутраная памяць праграмы</string>
|
||||
<string name="storage_directory_manual">Вызначана ўласнаручна</string>
|
||||
<string name="storage_directory_default">Унутраная памяць</string>
|
||||
<string name="shared_string_copy">Капіяваць</string>
|
||||
|
@ -1600,7 +1600,7 @@
|
|||
<string name="local_recordings_delete_all_confirm">Сапраўды хочаце выдаліць %1$d нататак\?</string>
|
||||
<string name="shared_string_import2osmand">Імпартаваць у OsmAnd</string>
|
||||
<string name="disable_recording_once_app_killed">Прадухіліць аўтаномны запіс</string>
|
||||
<string name="disable_recording_once_app_killed_descrp">Запіс GPX прыпыніцца, калі дадатак будзе забіты (праз надаўнія дадаткі). (Апавяшчэнне ў вобласці падказак Android пра фонавы рэжым OsmAnd знікне.)</string>
|
||||
<string name="disable_recording_once_app_killed_descrp">Запіс GPX прыпыніцца, калі праграма будзе забітая (праз надаўнія праграмы). (Апавяшчэнне ў вобласці падказак Android пра фонавы рэжым OsmAnd знікне.)</string>
|
||||
<string name="gps_network_not_enabled">Служба вызначэння месцазнаходжання выключаная. Уключыць яе\?</string>
|
||||
<string name="archive_wikipedia_data">Даныя Вікіпедыі састарэлі і больш непрыдатныя. Заархіваваць іх\?</string>
|
||||
<string name="download_wikipedia_files">Спампаваць дадатковыя даныя Вікіпедыі (%1$s МБ)\?</string>
|
||||
|
@ -1636,7 +1636,7 @@
|
|||
<string name="lang_bpy">Бішнупрыя</string>
|
||||
<string name="lang_nv">Наваха</string>
|
||||
<string name="lang_new">Неварская / Непал-бхаса</string>
|
||||
<string name="restart_is_required">Каб усе змены ўжыліся, патрэбна перезапусціць дадатак.</string>
|
||||
<string name="restart_is_required">Каб усе змены ўжыліся, патрэбна перезапусціць праграму.</string>
|
||||
<string name="rendering_attr_currentTrackColor_name">Колер GPX</string>
|
||||
<string name="rendering_attr_currentTrackWidth_name">Шырыня GPX</string>
|
||||
<string name="rendering_value_red_name">Чырвоны</string>
|
||||
|
@ -1657,7 +1657,7 @@
|
|||
<string name="rendering_value_default13_name">Прадвызначана (13)</string>
|
||||
<string name="rendering_value_defaultTranslucentCyan_name">Прадвызначана (празрысты сіні)</string>
|
||||
<string name="do_you_like_osmand">Вам падабаецца OsmAnd?</string>
|
||||
<string name="rate_this_app">Ацаніце гэты дадатак</string>
|
||||
<string name="rate_this_app">Ацаніце праграму</string>
|
||||
<string name="rate_this_app_long">Калі ласка, дайце ацэнку OsmAnd на Google Play</string>
|
||||
<string name="user_hates_app_get_feedback">Скажыце нам чаму.</string>
|
||||
<string name="user_hates_app_get_feedback_long">Калі ласка, пішыце прапановы.</string>
|
||||
|
@ -1760,7 +1760,7 @@
|
|||
<string name="share_menu_location">Падзяліцца месцазнаходжаннем</string>
|
||||
<string name="share_geo">геа:</string>
|
||||
<string name="show_on_start_description">\"Выключана\" наўпрост запускае мапу.</string>
|
||||
<string name="simulate_initial_startup">Імітаваць першы запуск дадатку</string>
|
||||
<string name="simulate_initial_startup">Імітаваць першы запуск праграмы</string>
|
||||
<string name="shared_string_qr_code">QR-код</string>
|
||||
<string name="map_downloaded">Мапа спампаваная</string>
|
||||
<string name="feedback">Зваротная сувязь</string>
|
||||
|
@ -1778,7 +1778,7 @@
|
|||
<string name="shared_string_update">Абнавіць</string>
|
||||
<string name="world_map_download_descr">Базавая мапа свету (якая пакрывае ўвесь свет пры малым маштабе) адсутнічае або састарэла. Калі ласка, спампуйце яе каб мець магчымасць базавага агляду ўсяго свету.</string>
|
||||
<string name="map_downloaded_descr">Мапа «%1$s» гатовая для выкарыстання.</string>
|
||||
<string name="simulate_initial_startup_descr">Усталёўвае прыкмету першага запуску дадатку, не змяняе іншых налад.</string>
|
||||
<string name="simulate_initial_startup_descr">Вызначае адзнаку першага запуску праграмы, не змяняе іншых налад.</string>
|
||||
<string name="enter_country_name">Увядзіце назву краіны</string>
|
||||
<string name="begin_with_osmand_menu_group">Першыя крокі з OsmAnd</string>
|
||||
<string name="help_us_to_improve_menu_group">Дапамажыце палепшыць OsmAnd</string>
|
||||
|
@ -1944,7 +1944,7 @@
|
|||
<string name="osm_live_active">Актыўны</string>
|
||||
<string name="osm_live_not_active">Не актыўны</string>
|
||||
<string name="show_transparency_seekbar">Паказаць празрыстую пошукавую панэль</string>
|
||||
<string name="storage_permission_restart_is_required">Дадатак мае дазвол на запіс на рухомы носьбіт, але патрабуецца перазагрузка.</string>
|
||||
<string name="storage_permission_restart_is_required">Праграма мае дазвол на запіс на рухомы носьбіт, але патрабуецца перазагрузка.</string>
|
||||
<string name="full_report">Поўная справаздача</string>
|
||||
<string name="open_street_map_login_and_pass">Імя карыстальніка і пароль OpenStreetMap</string>
|
||||
<string name="osm_live_thanks">Дзякуй вам за падтрымку OsmAnd!
|
||||
|
@ -2071,7 +2071,7 @@
|
|||
<string name="osm_live_banner_desc">Атрымайце неабмежаваную колькасць спампоўванняў мапаў у дадатак да штотыднёвых, штодзённых і нават штогадзінных абнаўленняў.</string>
|
||||
<string name="osmand_plus_banner_desc">Неабмежаваная колькасць спамоўванняў мапаў, абнаўленняў і ўбудова Wikipedia.</string>
|
||||
<string name="si_mi_meters">Мілі/метры</string>
|
||||
<string name="osm_live_payment_desc">Плата за падпіску спаганяецца штомесяц. Скасаваць яе на Google Play можна у любы момант.</string>
|
||||
<string name="osm_live_payment_desc">Плата за падпіску спаганяецца за абраны перыяд. Скасаваць яе на Google Play можна у любы момант.</string>
|
||||
<string name="donation_to_osm">Ахвяраванне супольнасці OpenStreetMap</string>
|
||||
<string name="donation_to_osm_desc">Частка вашага ахвяравання накіроўваецца ўдзельнікам праекта OpenStreetMap. Кошт падпіскі застаецца тым жа самым.</string>
|
||||
<string name="osm_live_subscription_desc">Падпіска дазваляе атрымліваць штогадзіныя, штодзённыя, штотыднёвыя абнаўленні і неабмежаваную колькасць спампоўванняў для ўсіх мапаў па ўсім свеце.</string>
|
||||
|
@ -2265,7 +2265,7 @@
|
|||
<string name="routing_attr_driving_style_balance_name">Збалансаваны</string>
|
||||
<string name="routing_attr_driving_style_safety_name">Аддаваць перавагу завулкам</string>
|
||||
<string name="do_not_send_anonymous_app_usage">На адсылаць ананімную статыстыку выкарыстання</string>
|
||||
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd збірае інфармацыю аб тым, якія часткі дадатку выкарыстоўваюцца вамі. Вашае месцазнаходжанне ніколі не адпраўляецца, як і ўсё, што вы ўводзіце, якія вобласці праглядаеце, што шукаеце ці спампоўваеце.</string>
|
||||
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd збірае інфармацыю аб тым, якія часткі праграмы выкарыстоўваюцца вамі. Ваша месцазнаходжанне ніколі не адпраўляецца, як і ўсё, што вы ўводзіце, якія вобласці праглядаеце, што шукаеце ці спампоўваеце.</string>
|
||||
<string name="do_not_show_startup_messages">Не паказваць паведамленні падчас запуску</string>
|
||||
<string name="do_not_show_startup_messages_desc">Не паказваць зніжкі і адмысловыя паведамленні аб мясцовых падзеях.</string>
|
||||
<string name="parking_options">Параметры паркоўкі</string>
|
||||
|
@ -2307,9 +2307,9 @@
|
|||
<string name="analyze_on_map">Аналізуй на мапе</string>
|
||||
<string name="shared_string_visible">Бачны</string>
|
||||
<string name="shared_string_paused">Прыпынена</string>
|
||||
<string name="osmand_extended_description_part1">OsmAnd (OSM Automated Navigation Directions) мапа і навігацыйны дадатак з доступам да бясплатных якасных мапаў усяго свету OpenStreetMap (OSM).
|
||||
<string name="osmand_extended_description_part1">OsmAnd (OSM Automated Navigation Directions) мапа і навігацыйная праграма з доступам да бясплатных якасных мапаў усяго свету OpenStreetMap (OSM).
|
||||
\n
|
||||
\nАтрымлівайце асалоду ад голасавога і візуальнага навігатара, прагляду карысных месцаў (анг. POI, points of interest), стварэння і кіравання GPX-слядоў, выкарыстання контурных ліній і інфармацыі аб вышыні (праз убудову), выбару паміж кіраваннем аўтамабілем, яздой на ровары і шпацырам, рэдагавання OSM і шмат іншым.</string>
|
||||
\nАтрымлівайце асалоду ад галасавога і візуальнага навігатара, прагляду цікавых пунктаў (анг. POI, points of interest), стварэння і кіравання GPX-слядоў, выкарыстання контурных ліній і інфармацыі аб вышыні (праз убудову), выбару паміж кіраваннем аўтамабілем, яздой на ровары і шпацырам, рэдагавання OSM і шмат іншым.</string>
|
||||
<string name="shared_string_overview">Агляд</string>
|
||||
<string name="osmand_plus_extended_description_part8">Прыблізнае пакрыццё і якасць мапы:
|
||||
\n • Заходняя Еўропа: ****
|
||||
|
@ -2354,10 +2354,10 @@
|
|||
<string name="display_zoom_level">Узровень маштабавання паказу: %1$s</string>
|
||||
<string name="route_is_too_long_v2">Для вялікіх адлегласцяў: калі ласка, дадайце прамежкавыя пункты, калі разлік не завяршыўся цягам 10 хвілін.</string>
|
||||
<string name="osmand_extended_description_part4">Лыжня
|
||||
\nУбудова лыжных мап для OsmAnd дазваляе бачыць лыжныя трасы з узроўнем складанасці і некаторай дадатковай інфармацыяй: размяшчэнне пад\'ёмнікаў і іншых аб\'ектаў.</string>
|
||||
\nУбудова лыжных мапаў для OsmAnd дазваляе бачыць лыжныя трасы з узроўнем складанасці і некаторай дадатковай інфармацыяй: размяшчэнне пад\'ёмнікаў і іншых аб\'ектаў.</string>
|
||||
<string name="save_poi_too_many_uppercase">Назва змяшчае занадта шмат вялікіх літар. Працягнуць\?</string>
|
||||
<string name="osmand_extended_description_part3">Мапа
|
||||
\n• Адлюстроўвае POI (пункт цікавасці) побач вас
|
||||
\n• Адлюстроўвае POI (цікавы пункт) побач вас
|
||||
\n• Адаптуе мапу ў напрамку вашага руху (ці компаса)
|
||||
\n• Паказвае, дзе вы знаходзіцеся і куды вы глядзіце
|
||||
\n• Дзяліцеся сваім месцазнаходжаннем, каб сябры змаглі знайсці вас
|
||||
|
@ -2386,7 +2386,7 @@
|
|||
\n</string>
|
||||
<string name="osmand_extended_description_part7">Удзел у OSM
|
||||
\n • Паведамленне аб памылках
|
||||
\n • Спампоўванне GPX-слядоў у OSM проста з дадатку
|
||||
\n • Спампоўванне GPX-слядоў у OSM проста з праграмы
|
||||
\n • Даданне цікавых пунктаў (POI) і запампоўка іх у OSM (ці пазней, па-за сецівам)
|
||||
\n</string>
|
||||
<string name="osmand_plus_extended_description_part2">Навігацыя
|
||||
|
@ -2426,8 +2426,8 @@
|
|||
\n • Антарктыда:
|
||||
\n Большасць краін свету даступная да спампоўвання!
|
||||
\n Атрымайце надзейны навігатар у вашай краіне — будзь то Беларусь, Францыя, Германія, Мексіка, Вялікабрытанія, Іспанія, Нідэрланды, ЗША, Расія, Бразілія ці якая іншая.</string>
|
||||
<string name="osmand_plus_extended_description_part1">OsmAnd+ (OSM Automated Navigation Directions) — мапа і навігацыйны дадатак з доступам да бясплатных, сусветных і высокаякасных даных OpenStreetMap (OSM).
|
||||
\n Атрымлівайце асалоду ад галасавой і візуальная навігацыі, праглядайце пукты цікавасцяў (POI), запісвайце GPX-сляды, выкарыстоўвайце візуалізацыю контурных ліній ды даных вышыні, пераключайцеся паміж рэжымамі кіравання, яздой на ровары ды шпацырамі, рэдагуйце OSM-даныя і шмат іншага.
|
||||
<string name="osmand_plus_extended_description_part1">OsmAnd+ (OSM Automated Navigation Directions) — мапа і навігацыйная праграма з доступам да бясплатных, сусветных і высокаякасных даных OpenStreetMap (OSM).
|
||||
\n Атрымлівайце асалоду ад галасавой і візуальная навігацыі, праглядайце цікавыя пукты (POI), запісвайце GPX-сляды, выкарыстоўвайце візуалізацыю контурных ліній ды даных вышыні, пераключайцеся паміж рэжымамі кіравання, яздой на ровары ды шпацырамі, рэдагуйце OSM-даныя і шмат іншага.
|
||||
\n
|
||||
\n OsmAnd+ — платная версія. Пры набыцці вы падтрымліваеце праект, фінансуеце распрацоўку новых магчымасцяў ды атрымліваеце апошнія абнаўленні.
|
||||
\n
|
||||
|
@ -2440,7 +2440,7 @@
|
|||
\n
|
||||
\n • Захавае вашыя найважнейшыя месцы ва ўлюблёных
|
||||
\n
|
||||
\n • Адлюстроўвае пункты цікавасцяў вакол вас
|
||||
\n • Адлюстроўвае цікавыя пункты вакол вас
|
||||
\n
|
||||
\n • Паказвае адмысловыя сеціўныя мапы, спадарожнікавыя здымкі (Bing), розныя накладкі накшталт турыстычных/навігацыйных GPX-слядоў і дадатковыя пласты з наладжвальнай празрыстасцю
|
||||
\n
|
||||
|
@ -2452,9 +2452,9 @@
|
|||
\n
|
||||
\n • OSM-даныя даступныя па краіне ці рэгіёну
|
||||
\n
|
||||
\n • Пункты цікавасцяў з Вікіпедыі, выдатна падыходзіць для агляду выбітнасцяў
|
||||
\n • Цікавыя пункты з Вікіпедыі, выдатна падыходзіць для агляду выбітнасцяў
|
||||
\n
|
||||
\n • Неабмежаваная колькасць бясплатных спампоўванняў непасрэдна з дадатку
|
||||
\n • Неабмежаваная колькасць бясплатных спампоўванняў непасрэдна з праграмы
|
||||
\n
|
||||
\n • Кампактныя пазасеціўныя вектарныя мапы абнаўляюцца не радзей за раз на месяц
|
||||
\n
|
||||
|
@ -2471,17 +2471,17 @@
|
|||
\n • Прыпынкі грамадскага транспарту (аўтобус, трамвай, цягнік), уключаючы назвы маршрутаў
|
||||
\n • Магчымасць запісу падарожжа ў лакальны GPX-файл ці інтэрнэт-сэрвіс
|
||||
\n • Магчымасць адлюстравання хуткасці ды вышыні
|
||||
\n • Адлюстраванне контурных ліній ды зацянення вышынь (праз дадатак)</string>
|
||||
\n • Адлюстраванне контурных ліній ды зацянення вышынь (праз праграму)</string>
|
||||
<string name="osmand_plus_extended_description_part7">Непасрэдны ўнёсак у OSM
|
||||
\n • Заявы аб памылках у даных
|
||||
\n • Запампоўванне GPX-слядоў у OSM проста з дадатку
|
||||
\n • Даданне пунктаў цікавасцяў (POI) і непасрэдная запампоўка іх у OSM (ці пазней, па-за сецівам)
|
||||
\n • Запампоўванне GPX-слядоў у OSM проста з праграмы
|
||||
\n • Даданне цікавых пунктаў (POI) і непасрэдная запампоўка іх у OSM (ці пазней, па-за сецівам)
|
||||
\n • Магчымасць запісу падарожжа ў фонавым рэжыме (у той час, як прылада знаходзіцца ў рэжыме сну)
|
||||
\n OsmAnd — адкрытае праграмнае забяспячэнне ў актыўнай распрацоўцы. Кожны можа ўнесці ўклад паведамляючы аб памылках, паляпшаючы пераклад ці распрацоўваючы новыя магчымасці. Ход праекта залежыць таксама ад фінансавых унёскаў для забяспячэння кадавання і тэставання новай функцыянальнасці.
|
||||
\n</string>
|
||||
<string name="shared_string_install">Усталяваць</string>
|
||||
<string name="improve_coverage_mapillary">Палепшыць фотапакрыццё Mapillary</string>
|
||||
<string name="improve_coverage_install_mapillary_desc">Усталяваць Mapillary, каб дадаць адзін альбо некалькі фотаздымкаў да гэтага месца на мапе.</string>
|
||||
<string name="improve_coverage_install_mapillary_desc">Усталюйце Mapillary, каб дадаць фотаздымкі гэтага месца.</string>
|
||||
<string name="open_mapillary">Адкрыць Mapillary</string>
|
||||
<string name="mapillary_image">Выява Mapillary</string>
|
||||
<string name="distance_moving">Дыстанцыя выпраўленая</string>
|
||||
|
@ -2590,7 +2590,7 @@
|
|||
<string name="marker_save_as_track_descr">Экспартаваць вашыя адзнакі ў наступны GPX-файл:</string>
|
||||
<string name="marker_save_as_track">Захаваць як GPX-файл</string>
|
||||
<string name="move_to_history">Перамясціць у гісторыю</string>
|
||||
<string name="group_will_be_removed_after_restart">Групы ўжо не будзе пасля наступнага перазапуску дадатку.</string>
|
||||
<string name="group_will_be_removed_after_restart">Групы ўжо не будзе пасля наступнага перазапуску праграмы.</string>
|
||||
<string name="shared_string_markers">Адзнакі</string>
|
||||
<string name="coordinates_format">Фармат каардынат</string>
|
||||
<string name="use_system_keyboard">Выкарыстоўваць сістэмную клавіятуру</string>
|
||||
|
@ -2642,7 +2642,7 @@
|
|||
<string name="show_guide_line_descr">Паказвае лініі накірунку ад вашага становішча да актыўнай адзнакі.</string>
|
||||
<string name="show_arrows_descr">Паказвае адну ці дзьве стрэлкі, якія паказваюць накірунак да актыўных адзнак.</string>
|
||||
<string name="distance_indication_descr">Абярыце, як адлюстроўваць адлегласць да актыўных адзнак.</string>
|
||||
<string name="active_markers_descr">Вызначце колькасць указальнікаў кірунку:</string>
|
||||
<string name="active_markers_descr">Вызначце колькасць указальнікаў кірунку.</string>
|
||||
<string name="appearance_on_the_map">Выгляд на мапе</string>
|
||||
<string name="add_track_to_markers_descr">Абраць след, каб дадаць яго пункты ў адзнакі.</string>
|
||||
<string name="shared_string_right">Направа</string>
|
||||
|
@ -2754,7 +2754,7 @@
|
|||
<string name="delete_search_history">Выдаліць гісторыю пошукаў</string>
|
||||
<string name="show_images">Паказаць выявы</string>
|
||||
<string name="popular_destinations">Папулярныя напрамкі</string>
|
||||
<string name="paid_app">Платны дадатак</string>
|
||||
<string name="paid_app">Платная праграма</string>
|
||||
<string name="paid_plugin">Платная ўбудова</string>
|
||||
<string name="travel_card_update_descr">Дастуны новыя даныя Wikivoyage, абнавіце іх.</string>
|
||||
<string name="travel_card_download_descr">Спампуйце даведнікі Wikivoyage для прагляду артыкулаў аб мясцінах па ўсім свеце без Інтэрнэту.</string>
|
||||
|
@ -2771,7 +2771,7 @@
|
|||
<string name="wikivoyage_travel_guide_descr">Дапаможнік па самым цікавым месцам на планеце ўнутры OsmAnd без злучэння з Інтэрнэтам.</string>
|
||||
<string name="monthly_map_updates">Штомесячныя абнаўленні мапаў</string>
|
||||
<string name="daily_map_updates">Штогадзінныя абнаўленні мапаў</string>
|
||||
<string name="in_app_purchase">Пакупка ў дадатку</string>
|
||||
<string name="in_app_purchase">Пакупка ў праграме</string>
|
||||
<string name="in_app_purchase_desc">Разавы плацёж</string>
|
||||
<string name="in_app_purchase_desc_ex">Аднойчы набыты, будзе заўсёды даступны для вас.</string>
|
||||
<string name="purchase_unlim_title">Купіць - %1$s</string>
|
||||
|
@ -2800,7 +2800,7 @@
|
|||
<string name="wiki_article_search_text">Пошук адпаведнага артыкула вікіпедыі</string>
|
||||
<string name="wiki_article_not_found">Артыкул не знойдзены</string>
|
||||
<string name="how_to_open_wiki_title">Як адкрыць артыкулы Вікіпедыі?</string>
|
||||
<string name="shared_string_restart">Перазапуск дадатку</string>
|
||||
<string name="shared_string_restart">Перазапуск праграмы</string>
|
||||
<string name="purchase_cancelled_dialog_title">Вы анулявалі падпіску OsmAnd Live</string>
|
||||
<string name="purchase_cancelled_dialog_descr">Прадоўжыць падпіску, каб і далей карыстацца ўсімі функцыямі:</string>
|
||||
<string name="maps_you_need_descr">На падставе закладзеных вамі артыкулаў рэкамендуецца спампаваць наступныя мапы:</string>
|
||||
|
@ -2877,7 +2877,7 @@
|
|||
\n</string>
|
||||
<string name="markers_remove_dialog_msg">Выдаліць адзнаку мапы «%s»\?</string>
|
||||
<string name="edit_map_marker">Рэдагаваць адзнаку мапы</string>
|
||||
<string name="third_party_application">Асобны дадатак</string>
|
||||
<string name="third_party_application">Асобная праграма</string>
|
||||
<string name="search_street">Пошук вуліцы</string>
|
||||
<string name="start_search_from_city">Спачатку вызначце горад/мясцовасць</string>
|
||||
<string name="shared_string_restore">Аднавіць</string>
|
||||
|
@ -2934,7 +2934,7 @@
|
|||
<string name="transfers">трансферы</string>
|
||||
<string name="on_foot">пешшу</string>
|
||||
<string name="route_way">Шлях</string>
|
||||
<string name="points_of_interests">Пункты цікавасцяў (POI)</string>
|
||||
<string name="points_of_interests">Цікавыя пункты (POI)</string>
|
||||
<string name="waiting_for_route_calculation">Падлік маршруту…</string>
|
||||
<string name="app_mode_public_transport">Грамадскі транспарт</string>
|
||||
<string name="avoid_roads_descr">Абярыце дарогу, якой хочаце пазбягаць падчас навігацыі, або на мапе, або са спіса ніжэй:</string>
|
||||
|
@ -3093,7 +3093,7 @@
|
|||
<string name="edit_profile_setup_subtitle">У кожнага профілю свае налады</string>
|
||||
<string name="turn_screen_on_time_descr">Вызначце час, цягам якога экран не будзе выключацца.</string>
|
||||
<string name="turn_screen_on_sensor">Выкарыстоўваць датчык адлегласці</string>
|
||||
<string name="turn_screen_on_sensor_descr">Правядзіце рукой па верхняй частцы экрана, каб уключыць яго падчас навігацыі.</string>
|
||||
<string name="turn_screen_on_sensor_descr">Уключаць экран правёўшы па яму рукой.</string>
|
||||
<string name="rendering_attr_winter_road_name">Зімовая дарога</string>
|
||||
<string name="rendering_attr_ice_road_name">Ледзяная дарога</string>
|
||||
<string name="routeInfo_winter_ice_road_name">Зімовыя і ледзяныя дарогі</string>
|
||||
|
@ -3133,11 +3133,11 @@
|
|||
<string name="minmax_speed_dialog_title">Вызначыць мінімальную / максімальную хуткасць</string>
|
||||
<string name="new_profile">Новы профіль</string>
|
||||
<string name="shared_string_crash">Крушэнне</string>
|
||||
<string name="last_launch_crashed">Апошні запуск OsmAnd завяршыўся хібай. Калі ласка, адпраўце паведамленне памылкі, каб палепшыць дадатак.</string>
|
||||
<string name="last_launch_crashed">Апошні запуск OsmAnd завяршыўся хібай. Калі ласка, адпраўце паведамленне памылкі, каб палепшыць праграму.</string>
|
||||
<string name="app_mode_personal_transporter">Асабісты транспарт</string>
|
||||
<string name="app_mode_monowheel">Монакола</string>
|
||||
<string name="app_mode_scooter">Скутар</string>
|
||||
<string name="make_osmand_better_descr">Дазвольце OsmAnd збіраць і апрацоўваць ананімныя даныя пра выкарыстанне дадатку. Мы не збіраем і не захоўваем даныя вашай пазіцыі ці месцаў, якія вы бачыце на мапе.
|
||||
<string name="make_osmand_better_descr">Дазвольце OsmAnd збіраць і апрацоўваць ананімныя даныя пра выкарыстанне праграмы. Мы не збіраем і не захоўваем даныя вашай пазіцыі ці месцаў, якія вы бачыце на мапе.
|
||||
\n
|
||||
\nВы можаце змяніць свой выбар у любы час у \"Налады\" > \"Прыватнасць і бяспека\".</string>
|
||||
<string name="downloaded_maps_collect_descr">Дапамагае нам даведацца пра папулярнасць мапаў рэгіёнаў і краін.</string>
|
||||
|
@ -3166,7 +3166,7 @@
|
|||
<string name="profile_type_descr_string">Тып: %s</string>
|
||||
<string name="profile_type_base_string">Базавы профіль</string>
|
||||
<string name="profile_alert_need_routing_type_title">Абярыце тып навігацыі</string>
|
||||
<string name="profile_alert_need_routing_type_msg">Калі ласка, абярыце тып навігацыі для новага профілю дадатку</string>
|
||||
<string name="profile_alert_need_routing_type_msg">Калі ласка, абярыце тып навігацыі для новага профілю праграмы</string>
|
||||
<string name="profile_alert_need_profile_name_title">Увядзіце назву профілю</string>
|
||||
<string name="profile_alert_need_profile_name_msg">Спачатку неабходна даць профілю назву.</string>
|
||||
<string name="profile_alert_duplicate_name_title">Дублікат назвы</string>
|
||||
|
@ -3186,8 +3186,8 @@
|
|||
<string name="routing_profile_broutrer">BRouter (па-за сецівам)</string>
|
||||
<string name="custom_routing">Адвольны профіль маршрутызацыі</string>
|
||||
<string name="special_routing_type">Адмысловая маршрутызацыя</string>
|
||||
<string name="application_profiles_descr">Абярыце профілі, што будуць бачныя ў дадатку.</string>
|
||||
<string name="application_profiles">Профілі дадатку</string>
|
||||
<string name="application_profiles_descr">Абярыце профілі, што будуць бачныя ў праграме.</string>
|
||||
<string name="application_profiles">Профілі праграмы</string>
|
||||
<string name="routing_attr_piste_type_skitour_name">Лыжныя туры</string>
|
||||
<string name="routing_attr_piste_type_skitour_description">Трасы для гарналыжных тураў.</string>
|
||||
<string name="routing_attr_piste_type_sled_name">Санкі</string>
|
||||
|
@ -3206,7 +3206,7 @@
|
|||
<string name="sett_generic_ext_input">Клавіятура</string>
|
||||
<string name="sett_wunderlinq_ext_input">WunderLINQ</string>
|
||||
<string name="sett_parrot_ext_input">Parrot</string>
|
||||
<string name="turn_on_profile_desc">Калі ласка, ўключыце па меншай меры адзін профіль дадатку, каб выкарыстоўваць гэты параметр.</string>
|
||||
<string name="turn_on_profile_desc">Калі ласка, ўключыце па меншай меры адзін профіль праграмы, каб выкарыстоўваць гэты параметр.</string>
|
||||
<string name="gpx_join_gaps">Абраць gaps</string>
|
||||
<string name="app_mode_camper">Прычэп</string>
|
||||
<string name="rendering_attr_showLez_description">Паказваць на мапе зоны з нізкім узроўнем выкідаў. Не ўплывае на маршрутызацыю.</string>
|
||||
|
@ -3242,7 +3242,7 @@
|
|||
<string name="logcat_buffer">Буфер logcat</string>
|
||||
<string name="navigate_point_format_utm">UTM Standard</string>
|
||||
<string name="navigate_point_format_olc">Адкрыты код месцазнаходжання (OLC)</string>
|
||||
<string name="coordinates_format_info">Абраны фармат будзе ужыты да ўсяго дадатку.</string>
|
||||
<string name="coordinates_format_info">Абраны фармат будзе ужыты да ўсёй праграмы.</string>
|
||||
<string name="pref_selected_by_default_for_profiles">Параметр прадвызначана абраны для профіляў: %s</string>
|
||||
<string name="change_default_settings">Змяніць налады</string>
|
||||
<string name="discard_changes">Адкінуць змены</string>
|
||||
|
@ -3250,7 +3250,7 @@
|
|||
<string name="apply_to_all_profiles">Ужыць да ўсіх профіляў</string>
|
||||
<string name="start_up_message_pref">Паведамленне падчас запуску</string>
|
||||
<string name="analytics_pref_title">Аналітыка</string>
|
||||
<string name="application_profile_changed">Профіль дадатку зменены на \"%s\"</string>
|
||||
<string name="application_profile_changed">Профіль праграмы зменены на \"%s\"</string>
|
||||
<string name="plugins_settings">Налады ўбудоў</string>
|
||||
<string name="base_profile_descr_pedestrian">Шпацыры, паходы, бег</string>
|
||||
<string name="base_profile_descr_boat">Карабель, веславанне, парусны спорт</string>
|
||||
|
@ -3272,7 +3272,7 @@
|
|||
<string name="routing_attr_difficulty_preference_description">Аддаваць перавагу трасам гэтай складанаці, але не выключаць прастейшыя, калі шлях будзе карацейшым.</string>
|
||||
<string name="routing_attr_freeride_policy_name">Па-за трасай</string>
|
||||
<string name="routing_attr_freeride_policy_description">Freerides і offpiste - неафіцыйныя маршруты і праходы. Як правіла, недагледжаныя, неразмечаныя, не асвятляюцца ўвечары. Будзьце вельмі ўважлівымі.</string>
|
||||
<string name="release_3_4">• Профілі дадатку: стварыце ўласны профіль адпаведна вашых патрэб, выкарыстаўшы адмысловыя значок і колер.
|
||||
<string name="release_3_4">• Профілі праграмы: стварыце ўласны профіль адпаведна вашых патрэб, выкарыстаўшы адмысловыя значок і колер.
|
||||
\n
|
||||
\n
|
||||
\n • Для профіляў дададзеныя прадвызначаныя налады і мінімальная / максімальная хуткасць
|
||||
|
@ -3307,27 +3307,27 @@
|
|||
<string name="app_mode_pickup_truck">Пікап</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="units_and_formats">Адзінкі вымярэння і фарматы</string>
|
||||
<string name="appearance">Выгляд</string>
|
||||
<string name="map_look_descr">Выгляд мапы</string>
|
||||
<string name="map_look">Выгляд мапы</string>
|
||||
<string name="list_of_installed_plugins">Усталяваныя убудовы</string>
|
||||
<string name="configure_navigation">Наладзіць навігацыю</string>
|
||||
<string name="general_settings_profile_descr">Тэма дадатку, адзінкі вымярэння, рэгіён</string>
|
||||
<string name="general_settings_profile_descr">Тэма праграмы, адзінкі вымярэння, рэгіён</string>
|
||||
<string name="screen_alerts_descr">Апавяшчэнні будуць паказвацца падчас навігацыі ў левым ніжнім куце экрана.</string>
|
||||
<string name="language_and_output">Мова і вывад</string>
|
||||
<string name="reset_to_default">Скінуць да прадвызначаных</string>
|
||||
<string name="manage_profiles_descr">Стварэнне, імпарт, рэдагаванне профіляў</string>
|
||||
<string name="manage_profiles">Кіраванне профілямі дадатку…</string>
|
||||
<string name="osmand_settings_descr">Уплывае на ўвесь дадатак</string>
|
||||
<string name="manage_profiles">Кіраванне профілямі праграмы…</string>
|
||||
<string name="osmand_settings_descr">Уплывае на ўсю праграму</string>
|
||||
<string name="osmand_settings">Налады OsmAnd</string>
|
||||
<string name="copy_from_other_profile">Скапіяваць з іншага профілю</string>
|
||||
<string name="turn_screen_on">Уключыць экран</string>
|
||||
<string name="map_during_navigation_info">Мапа падчас навігацыі</string>
|
||||
<string name="map_during_navigation">Мапа падчас навігацыі</string>
|
||||
<string name="shared_string_other">Іншае</string>
|
||||
<string name="vehicle_parameters_descr">Вага, вышыня, хуткасць</string>
|
||||
<string name="vehicle_parameters_descr">Вага, вышыня, даўжыня, хуткасць</string>
|
||||
<string name="vehicle_parameters">Параметры аўтамабіля</string>
|
||||
<string name="voice_announces_info">Галасавыя апавяшчэнні прайграюцца толькі падчас навігацыі.</string>
|
||||
<string name="voice_announces_descr">Навігацыйныя інструкцыі і апавяшчэнні</string>
|
||||
|
@ -3439,10 +3439,10 @@
|
|||
<string name="move_maps_to_new_destination">Перамясціць у новы пункт прызначэння</string>
|
||||
<string name="store_tracks_in_daily_directories_descrp">Запісваць сляды кожны дзень у новы падкаталог (напрыклад, 2018-01-01).</string>
|
||||
<string name="update_all_maps_q">Сапраўды хочаце абнавіць усе мапы (%1$d)\?</string>
|
||||
<string name="select_base_profile_dialog_message">Стварыце свой профіль на аснове аднаго з базавых профіляў - гэта будзе вызначаць асноўныя параметры, такія як віджэты, адзінкі вымярэння хуткасці і адлегласці. Гэта тыповыя профілі дадатку, якія разам з прыкладамі профіляў карыстальніка можна пашырыць да:</string>
|
||||
<string name="select_base_profile_dialog_message">Стварыце свой профіль на аснове аднаго з базавых профіляў - гэта будзе вызначаць асноўныя параметры, такія як віджэты, адзінкі вымярэння хуткасці і адлегласці. Гэта тыповыя профілі праграмы, якія разам з прыкладамі профіляў карыстальніка можна пашырыць да:</string>
|
||||
<string name="routing_attr_allow_classic_only_description">Маршруты, падрыхтаваныя толькі для класічнага стылю без канькабежных трас. Сюды ўваходзяць маршруты, падрыхтаваныя невялікім снегаходам з больш свабоднай лыжнёй і трасамі, падрыхтаваныя непасрэдна лыжнікамі.</string>
|
||||
<string name="download_detailed_map">Спампаваць падрабязную мапу %s, каб праглядзець гэтую вобласць.</string>
|
||||
<string name="internal_app_storage_description">Унутранае сховішча OsmAnd, схаванае ад карыстальніка і іншых дадаткаў.</string>
|
||||
<string name="internal_app_storage_description">Унутранае сховішча OsmAnd, схаванае ад карыстальніка і іншых праграм.</string>
|
||||
<string name="change_data_storage_folder">Змена каталога сховішча</string>
|
||||
<string name="rendering_attr_piste_type_snow_park_name">Ландшафтны парк</string>
|
||||
<string name="rendering_attr_piste_type_sleigh_name">Самаходныя і несамаходныя сані (запрэжкі)</string>
|
||||
|
@ -3464,7 +3464,7 @@
|
|||
<string name="routeInfo_piste_difficulty_name">Складанасць гарналыжнай трасы</string>
|
||||
<string name="routing_attr_width_name">Абмежаванне па шырыні</string>
|
||||
<string name="routing_attr_width_description">Увядзіце шырыню транспартнага сродку для ўліку пры разліку маршруту.</string>
|
||||
<string name="release_3_5">• Абноўлены налады дадатку і профілю. Цяпер налады размешчаныя па тыпу. Кожны профіль можна наладзіць асобна.
|
||||
<string name="release_3_5">• Абноўлены налады праграмы і профілю. Цяпер налады размешчаныя па тыпу. Кожны профіль можна наладзіць асобна.
|
||||
\n
|
||||
\n • Новы дыялог загрузкі мапы, які прапануе загрузіць мапу падчас прагляду
|
||||
\n
|
||||
|
@ -3502,7 +3502,7 @@
|
|||
<string name="osm_editing">Рэдагаванне OSM</string>
|
||||
<string name="app_mode_osm">OSM</string>
|
||||
<string name="select_nav_icon_descr">Значок будзе паказвацца падчас навігацыі або руху.</string>
|
||||
<string name="shared_string_app_default_w_val">Прадвызначаны дадатак (%s)</string>
|
||||
<string name="shared_string_app_default_w_val">Прадвызначаная праграма (%s)</string>
|
||||
<string name="profile_type_custom_string">Адвольны профіль</string>
|
||||
<string name="shared_string_angle_param">Вугал: %s°</string>
|
||||
<string name="shared_string_angle">Вугал</string>
|
||||
|
@ -3527,7 +3527,7 @@
|
|||
<string name="favorites_item">Улюбёнае</string>
|
||||
<string name="subscription_osmandlive_item">Падпіска - OsmAnd Live</string>
|
||||
<string name="osmand_purchases_item">Пакупкі OsmAnd</string>
|
||||
<string name="legend_item_description">Даведка па знаках мапы</string>
|
||||
<string name="legend_item_description">Даведка па знаках мапы.</string>
|
||||
<string name="navigation_profiles_item">Профілі навігацыі</string>
|
||||
<string name="create_edit_poi">Стварыць/Рэдагаваць POI</string>
|
||||
<string name="parking_positions">Месца паркоўкі</string>
|
||||
|
@ -3535,7 +3535,7 @@
|
|||
<string name="reset_deafult_order">Аднавіць прадвызначаны парадак элементаў</string>
|
||||
<string name="back_to_editing">Вярнуцца да рэдагавання</string>
|
||||
<string name="quick_action_transport_show">Паказаць грамадскі транспарт</string>
|
||||
<string name="quick_action_transport_descr">Кнопка, каб паказаць ці схаваць грамадскі транспарт на мапе.</string>
|
||||
<string name="quick_action_transport_descr">Кнопка для паказу ці хавання грамадскага транспарту на мапе.</string>
|
||||
<string name="shared_string_add_profile">Дадаць профіль</string>
|
||||
<string name="n_items_of_z">%1$s з %2$s</string>
|
||||
<string name="download_slope_maps">Схілы</string>
|
||||
|
@ -3564,10 +3564,10 @@
|
|||
<string name="shared_string_divider">Падзяляльнік</string>
|
||||
<string name="shared_string_hidden">Схавана</string>
|
||||
<string name="reset_items_descr">Калі схаваць налады, то яны скінуцца да зыходнага стану.</string>
|
||||
<string name="main_actions_descr">\"Асноўныя дзеянні\" змяшчаюць толькі 4 кнопкі.</string>
|
||||
<string name="main_actions_descr">Толькі 4 кнопкі.</string>
|
||||
<string name="main_actions">Асноўныя дзеянні</string>
|
||||
<string name="developer_plugin">Убудова для распрацоўшчыкаў</string>
|
||||
<string name="replace_point_descr">Замяніць іншы пункт на гэты</string>
|
||||
<string name="replace_point_descr">Замяніць іншы пункт на гэты.</string>
|
||||
<string name="app_mode_ski_touring">Лыжныя туры</string>
|
||||
<string name="app_mode_ski_snowmobile">Снегаход</string>
|
||||
<string name="custom_osmand_plugin">Адвольная ўбудова OsmAnd</string>
|
||||
|
@ -3596,8 +3596,8 @@
|
|||
<string name="lang_an">Арагонская</string>
|
||||
<string name="custom_color">Адвольны колер</string>
|
||||
<string name="search_poi_types">Пошук тыпаў POI</string>
|
||||
<string name="quick_action_switch_profile_descr">Абраныя профілі пераключаюцца націскам на кнопку \"Дзеянне\".</string>
|
||||
<string name="profiles_for_action_not_found">Профіляў, абраных для гэтага дзеяння, не знойдзена.</string>
|
||||
<string name="quick_action_switch_profile_descr">Пры націсканні на кнопку \"Дзеянні\" пераключаюцца абраныя профілі.</string>
|
||||
<string name="profiles_for_action_not_found">Адпаведных профіляў не знойдзена.</string>
|
||||
<string name="lang_zhyue">Кантонская</string>
|
||||
<string name="lang_yo">Ёруба</string>
|
||||
<string name="lang_uz">Узбекская</string>
|
||||
|
@ -3614,9 +3614,34 @@
|
|||
<string name="lang_lmo">Ламбардская</string>
|
||||
<string name="ltr_or_rtl_combine_via_slash_with_space">%1$s / %2$s</string>
|
||||
<string name="search_poi_types_descr">Можна спалучаць тыпы POI з розных катэгорый. Націсніце \"Пераключыць\", каб абраць усе ці націсніце злева, каб абраць катэгорыю.</string>
|
||||
<string name="change_application_profile">Змяніць профіль дадатку</string>
|
||||
<string name="change_application_profile">Змяніць профіль праграмы</string>
|
||||
<string name="index_item_world_basemap_detailed">Аглядная мапа свету (падрабязная)</string>
|
||||
<string name="quick_action_transport_hide">Схаваць грамадскі транспарт</string>
|
||||
<string name="quick_action_show_hide_transport">Паказаць/схаваць грамадскі транспарт</string>
|
||||
<string name="recalculate_route_in_deviation">Пералічыць маршрут у выпадку адхілення</string>
|
||||
<string name="shared_string_uninstall">Выдаліць</string>
|
||||
<string name="vessel_width_limit_description">Вызначце шырыню судна, каб пазбягаць вузкіх мастоў</string>
|
||||
<string name="quick_action_showhide_mapillary_title">Паказаць/схаваць Mapillary</string>
|
||||
<string name="quick_action_mapillary_hide">Схаваць Mapillary</string>
|
||||
<string name="quick_action_mapillary_show">Паказаць Mapillary</string>
|
||||
<string name="quick_action_showhide_mapillary_descr">Пераключальнік для паказу альбо хавання пласта Mapillary.</string>
|
||||
<string name="routing_attr_length_description">Пазначце даўжыню транспартнага сродку, дазволеную для руху па маршрутах.</string>
|
||||
<string name="routing_attr_length_name">Ліміт даўжыні</string>
|
||||
<string name="shared_string_bearing">Арыентацыя</string>
|
||||
<string name="item_deleted">Выдалена: %1$s</string>
|
||||
<string name="speed_cameras_restart_descr">Перазапуск патрабуецца для поўнага выдалення даных камер кантролю хуткасці.</string>
|
||||
<string name="use_volume_buttons_as_zoom_descr">Кіраванне ўзроўнем маштабавання мапы пры дапамозе кнопак рэгулявання гучнасці.</string>
|
||||
<string name="plugin_wikipedia_description">Інфармацыя пра славутасці з Вікіпедыі. Гэта ваш кішэнны даведнік - уключыце ўбудову вікіпедыі і чытайце артыкулы пра аб’екты вакол вас.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Матацыкл Эндура</string>
|
||||
<string name="app_mode_motor_scooter">Мотаролер</string>
|
||||
<string name="shared_string_uninstall_and_restart">Выдаліць і перазапусціць</string>
|
||||
<string name="speed_cameras_removed_descr">На гэтай прыладзе няма камер кантролю хуткасці.</string>
|
||||
<string name="app_mode_inline_skates">Ролікі</string>
|
||||
<string name="quick_action_remove_next_destination">Выдаліць наступны пункт прызначэння</string>
|
||||
<string name="use_volume_buttons_as_zoom">Маштабаванне кнопкамі гучнасці</string>
|
||||
<string name="please_provide_point_name_error">Калі ласка, дайце пункту назву</string>
|
||||
<string name="quick_action_remove_next_destination_descr">Бягучы пункт прызначэння маршруту будзе выдалены. Калі гэта канцавы пункт прызначэння, то навігацыя спыніцца.</string>
|
||||
<string name="search_download_wikipedia_maps">Спампаваць мапы Вікіпедыі</string>
|
||||
<string name="app_mode_wheelchair">Інвалідны вазок</string>
|
||||
<string name="osm_edit_closed_note">Закрытая нататка OSM</string>
|
||||
</resources>
|
|
@ -3709,4 +3709,13 @@ Repræsenterer område: %1$s x %2$s</string>
|
|||
<string name="quick_action_showhide_mapillary_title">Vis/skjul Mapillary</string>
|
||||
<string name="quick_action_mapillary_hide">Skjul Mapillary</string>
|
||||
<string name="quick_action_mapillary_show">Vis Mapillary</string>
|
||||
<string name="quick_action_remove_next_destination">Slet næste destinationspunkt</string>
|
||||
<string name="use_volume_buttons_as_zoom">Lydstyrkeknapper som zoom</string>
|
||||
<string name="please_provide_point_name_error">Angiv et navn til punktet</string>
|
||||
<string name="search_download_wikipedia_maps">Hent Wikipedia-kort</string>
|
||||
<string name="app_mode_enduro_motorcycle">Enduro motorcykel</string>
|
||||
<string name="app_mode_motor_scooter">Scooter</string>
|
||||
<string name="app_mode_wheelchair">Kørestol</string>
|
||||
<string name="app_mode_go_cart">Go cart</string>
|
||||
<string name="osm_edit_closed_note">Lukket OSM-note</string>
|
||||
</resources>
|
|
@ -3603,7 +3603,7 @@
|
|||
<string name="poi_changing_table_count">Anzahl der Wickeltische</string>
|
||||
<string name="poi_changing_table_fee_yes">Wickeltischgebühr: ja</string>
|
||||
<string name="poi_changing_table_fee_no">Wickeltischgebühr: nein</string>
|
||||
<string name="poi_charcoal_pile">Holzkohlestoß</string>
|
||||
<string name="poi_charcoal_pile">Kohlenmeiler</string>
|
||||
<string name="poi_historic_tank">Historischer Panzer</string>
|
||||
<string name="poi_hookah_lounge">Wasserpfeifen-Lounge</string>
|
||||
<string name="poi_source_biomass">Energiequelle: Biomasse</string>
|
||||
|
|
|
@ -3823,4 +3823,8 @@
|
|||
<string name="plugin_wikipedia_description">Informationen über Sehenswürdigkeiten erhalten Sie bei Wikipedia. Es ist Ihr Offline-Wegweiser für die Hosentasche - aktivieren Sie einfach das Wikipedia-Modul und genießen Sie Artikel über Objekte in Ihrer Umgebung.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Enduro</string>
|
||||
<string name="app_mode_motor_scooter">Motorroller</string>
|
||||
<string name="app_mode_wheelchair">Rollstuhl</string>
|
||||
<string name="app_mode_go_cart">Go-Kart</string>
|
||||
<string name="osm_edit_closed_note">Geschlossene OSM-Notiz</string>
|
||||
<string name="app_mode_wheelchair_forward">Rollstuhl vorwärts</string>
|
||||
</resources>
|
|
@ -3611,7 +3611,7 @@
|
|||
<string name="replace_point_descr">Anstataŭigi alian punkton per tiu ĉi.</string>
|
||||
<string name="changes_applied_to_profile">Aplikis ŝanĝojn al la profilo “%1$s”.</string>
|
||||
<string name="settings_item_read_error">Ne povas legi el “%1$s”.</string>
|
||||
<string name="settings_item_write_error">Ne povas skribi al “%1%s”.</string>
|
||||
<string name="settings_item_write_error">Ne povas skribi al “%1$s”.</string>
|
||||
<string name="settings_item_import_error">Ne povas enporti el “%1$s”.</string>
|
||||
<string name="select_track_file">Elekti dosieron de spuro</string>
|
||||
<string name="shared_string_languages">Lingvoj</string>
|
||||
|
@ -3814,4 +3814,10 @@
|
|||
<string name="quick_action_remove_next_destination_descr">La markita celo de la kurso estos forigita. Se tio ĉi estos la fina celo, la navigado ĉesos.</string>
|
||||
<string name="search_download_wikipedia_maps">Elŝuti vikipediajn mapojn</string>
|
||||
<string name="plugin_wikipedia_description">Akiru informojn pri interesaj punktoj el Vikipedio. Gvidilo en via poŝo – aktivigu la kromprogramon Vikipedio por ricevi artikolojn pri proksimaj objektoj.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Motorciklo (enduro)</string>
|
||||
<string name="app_mode_motor_scooter">Motorciklo (skotero)</string>
|
||||
<string name="app_mode_wheelchair">Rulseĝo</string>
|
||||
<string name="app_mode_wheelchair_forward">Rulseĝo (klinita)</string>
|
||||
<string name="app_mode_go_cart">Gokarto</string>
|
||||
<string name="osm_edit_closed_note">Fermita OSM‑rimarko</string>
|
||||
</resources>
|
|
@ -1852,7 +1852,7 @@
|
|||
<string name="poi_technical_monument">Monumento técnico</string>
|
||||
<string name="poi_memorial_prasat">Templo piramidal</string>
|
||||
<string name="poi_office_camping">Oficina del campamento</string>
|
||||
<string name="poi_model_aerodrome">Aeródromo a escala</string>
|
||||
<string name="poi_model_aerodrome">Pista de aeromodelismo</string>
|
||||
<string name="poi_guide">Oficina del guía</string>
|
||||
<string name="poi_quango">ONG casi autónoma</string>
|
||||
<string name="poi_consulting">Oficina de consultoría</string>
|
||||
|
|
|
@ -3819,4 +3819,10 @@
|
|||
<string name="quick_action_remove_next_destination_descr">El punto de destino actual de la ruta será borrado. Si será el destino, la navegación se detendrá.</string>
|
||||
<string name="search_download_wikipedia_maps">Descargar datos de Wikipedia</string>
|
||||
<string name="plugin_wikipedia_description">Obtén información sobre los puntos de interés de Wikipedia. Es tu guía de bolsillo sin conexión - sólo activa el complemento de Wikipedia y disfruta los artículos sobre los objetos de alrededor.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Motocicleta de enduro</string>
|
||||
<string name="app_mode_motor_scooter">Motoneta (motor)</string>
|
||||
<string name="app_mode_wheelchair">Silla de ruedas</string>
|
||||
<string name="app_mode_go_cart">Go-kart</string>
|
||||
<string name="osm_edit_closed_note">Nota de OSM cerrada</string>
|
||||
<string name="app_mode_wheelchair_forward">Silla de ruedas (hacia adelante)</string>
|
||||
</resources>
|
|
@ -1852,7 +1852,7 @@
|
|||
<string name="poi_technical_monument">Monumento técnico</string>
|
||||
<string name="poi_memorial_prasat">Templo piramidal</string>
|
||||
<string name="poi_office_camping">Oficina del campamento</string>
|
||||
<string name="poi_model_aerodrome">Aeródromo a escala</string>
|
||||
<string name="poi_model_aerodrome">Pista de aeromodelismo</string>
|
||||
<string name="poi_guide">Oficina del guía</string>
|
||||
<string name="poi_quango">ONG casi autónoma</string>
|
||||
<string name="poi_consulting">Oficina de consultoría</string>
|
||||
|
@ -3837,4 +3837,6 @@
|
|||
<string name="poi_traffic_signals_arrow">Flecha</string>
|
||||
<string name="poi_traffic_signals_vibration">Vibración</string>
|
||||
<string name="poi_give_box">Caja de regalo</string>
|
||||
<string name="poi_city_block">Manzana (cuadra)</string>
|
||||
<string name="poi_borough">Municipio</string>
|
||||
</resources>
|
|
@ -3802,7 +3802,7 @@
|
|||
<string name="quick_action_showhide_mapillary_descr">Un botón que alterna la capa de Mapillary en el mapa.</string>
|
||||
<string name="shared_string_bearing">Rumbo</string>
|
||||
<string name="item_deleted">%1$s borrado</string>
|
||||
<string name="speed_cameras_restart_descr">Debes reiniciar para borrar completamente los datos de los radares de velocidad.</string>
|
||||
<string name="speed_cameras_restart_descr">Se debe reiniciar para borrar completamente los datos de los radares de velocidad.</string>
|
||||
<string name="shared_string_uninstall_and_restart">Desinstalar y reiniciar</string>
|
||||
<string name="routing_attr_length_description">Indica la longitud permitida del vehículo en rutas.</string>
|
||||
<string name="routing_attr_length_name">Límite de longitud</string>
|
||||
|
@ -3810,4 +3810,12 @@
|
|||
<string name="app_mode_inline_skates">Patines en línea</string>
|
||||
<string name="use_volume_buttons_as_zoom_descr">Permite controlar el nivel de zoom del mapa con los botones de volumen del dispositivo.</string>
|
||||
<string name="use_volume_buttons_as_zoom">Botones de volumen como zoom</string>
|
||||
<string name="search_download_wikipedia_maps">Descargar datos de Wikipedia</string>
|
||||
<string name="quick_action_remove_next_destination_descr">El punto de destino actual de la ruta será borrado. Si será el destino, la navegación se detendrá.</string>
|
||||
<string name="quick_action_remove_next_destination">Borrar el siguiente punto de destino</string>
|
||||
<string name="plugin_wikipedia_description">Obtén información sobre los puntos de interés de Wikipedia. Es tu guía de bolsillo sin conexión - sólo activa el complemento de Wikipedia y disfruta los artículos sobre los objetos de alrededor.</string>
|
||||
<string name="please_provide_point_name_error">Proporciona un nombre para el punto</string>
|
||||
<string name="lenght_limit_description">Proporciona la longitud del vehículo, se pueden aplicar algunas restricciones de rutas para vehículos largos.</string>
|
||||
<string name="app_mode_motor_scooter">Motoneta (motor)</string>
|
||||
<string name="app_mode_enduro_motorcycle">Motocicleta de enduro</string>
|
||||
</resources>
|
|
@ -3600,7 +3600,7 @@
|
|||
<string name="poi_changing_table_count">Nombre de tables à langer</string>
|
||||
<string name="poi_changing_table_fee_yes">Table à langer payante</string>
|
||||
<string name="poi_changing_table_fee_no">Table à langer gratuite</string>
|
||||
<string name="poi_charcoal_pile">Pile de charbon</string>
|
||||
<string name="poi_charcoal_pile">Meule</string>
|
||||
<string name="poi_hookah_lounge">Bar à chicha</string>
|
||||
<string name="poi_valley_balka">Balkanique</string>
|
||||
<string name="poi_glacier_type_outlet">Point de vente</string>
|
||||
|
|
|
@ -3798,4 +3798,8 @@
|
|||
<string name="search_download_wikipedia_maps">Télécharger les cartes Wikipédia</string>
|
||||
<string name="app_mode_motor_scooter">Scooter</string>
|
||||
<string name="app_mode_enduro_motorcycle">Moto enduro</string>
|
||||
<string name="app_mode_go_cart">Kart</string>
|
||||
<string name="osm_edit_closed_note">Note OSM fermée</string>
|
||||
<string name="app_mode_wheelchair">Fauteuil roulant</string>
|
||||
<string name="app_mode_wheelchair_forward">Fauteuil roulant vers l\'avant</string>
|
||||
</resources>
|
|
@ -3841,4 +3841,10 @@ Lon %2$s</string>
|
|||
<string name="quick_action_remove_next_destination_descr">O punto de destino actual na ruta será eliminado. Se fora o destino, a navegación sería interrompida.</string>
|
||||
<string name="search_download_wikipedia_maps">Baixar mapas da Wikipedia</string>
|
||||
<string name="plugin_wikipedia_description">Obter información sobre os puntos de interesse da Wikipédia. É o teu guía de peto sen conexión - só activar o complemento da Wikipédia e desfrutar dos artigos sobre os elementos ó teu redor.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Enduro</string>
|
||||
<string name="app_mode_motor_scooter">Scooter</string>
|
||||
<string name="app_mode_wheelchair">Cadeira de rodas</string>
|
||||
<string name="app_mode_wheelchair_forward">Cadeira de rodas só cara adiante</string>
|
||||
<string name="app_mode_go_cart">Kart</string>
|
||||
<string name="osm_edit_closed_note">Nota do OSM pechada</string>
|
||||
</resources>
|
|
@ -1116,7 +1116,7 @@
|
|||
<string name="poi_tactile_paving_yes">van</string>
|
||||
<string name="poi_tactile_paving_no">Vakvezető burkolat nincs</string>
|
||||
<string name="poi_traffic_signals_sound_yes">van</string>
|
||||
<string name="poi_traffic_signals_sound_no">nincs</string>
|
||||
<string name="poi_traffic_signals_sound_no">Hang nincs</string>
|
||||
<string name="poi_traffic_signals_sound_walk">Csak amikor zöld</string>
|
||||
<string name="poi_services">Pihenőhely</string>
|
||||
<string name="poi_mini_roundabout">Mini körforgalom</string>
|
||||
|
@ -1198,13 +1198,13 @@
|
|||
<string name="poi_service_electrical">Elektromosautó-szerelés</string>
|
||||
<string name="poi_motorcycle_repair">Motorkerékpár-szerelés</string>
|
||||
<string name="poi_self_service_yes">igen</string>
|
||||
<string name="poi_self_service_no">Nem önkiszolgáló</string>
|
||||
<string name="poi_self_service_no">Nem</string>
|
||||
<string name="poi_automated_yes">igen</string>
|
||||
<string name="poi_automated_no">Nem automatizált</string>
|
||||
<string name="poi_full_service_yes">Teljes kiszolgálás</string>
|
||||
<string name="poi_brushless_yes">igen</string>
|
||||
<string name="poi_brushless_no">Kefés</string>
|
||||
<string name="poi_car_wash_no">Autómosó nincs</string>
|
||||
<string name="poi_car_wash_no">Nincs</string>
|
||||
<string name="poi_aeroway_fuel">Repülőgépüzemanyag-töltő állomás</string>
|
||||
<string name="poi_public_bath">Közfürdő</string>
|
||||
<string name="poi_male_yes">Férfi</string>
|
||||
|
@ -3792,4 +3792,15 @@
|
|||
<string name="poi_traffic_signals_arrow">Nyíl</string>
|
||||
<string name="poi_traffic_signals_vibration">Rezgés</string>
|
||||
<string name="poi_fire_hydrant_pressure_filter">Nyomás</string>
|
||||
<string name="poi_seamark_obstruction">Akadály</string>
|
||||
<string name="poi_piste_ref">Pálya azonosítószám</string>
|
||||
<string name="poi_bowling_alley">Bowling központ</string>
|
||||
<string name="poi_shop_security">Biztonsági szaküzlet</string>
|
||||
<string name="poi_mountain_rescue">Hegyimentő</string>
|
||||
<string name="poi_traffic_signals_arrow_yes">Igen</string>
|
||||
<string name="poi_traffic_signals_vibration_yes">Igen</string>
|
||||
<string name="poi_traffic_signals_vibration_no">Rezgés nincs</string>
|
||||
<string name="poi_give_box">Adomány doboz</string>
|
||||
<string name="poi_borough">Kerület</string>
|
||||
<string name="poi_city_block">Háztömb</string>
|
||||
</resources>
|
|
@ -3767,4 +3767,10 @@
|
|||
\nAz előfizetéseit a Google Play beállításainál tudja kezelni és lemondani.</string>
|
||||
<string name="quick_action_remove_next_destination_descr">Törli az útvonal soron következő célpontját. Amennyiben ez a végző célpont, a navigáció megáll.</string>
|
||||
<string name="plugin_wikipedia_description">Szerezzen információt az érdekes helyekkel kapcsolatban a Wikipédiáról. Ez az ön offline zseb útikönyve - egyszerűen engedélyezze a Wikipédia bővítményt és élvezze az ön körül lévő objektumokról szóló cikkeket.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Salakmotor</string>
|
||||
<string name="app_mode_motor_scooter">Robogó</string>
|
||||
<string name="app_mode_wheelchair">Kerekesszék</string>
|
||||
<string name="app_mode_go_cart">Gokart</string>
|
||||
<string name="osm_edit_closed_note">Lezárt OSM-jegyzet</string>
|
||||
<string name="app_mode_wheelchair_forward">Előre döntött kerekesszék</string>
|
||||
</resources>
|
|
@ -3787,4 +3787,39 @@
|
|||
<string name="quick_action_mapillary_hide">Nascondi Mapilly</string>
|
||||
<string name="quick_action_mapillary_show">Mostra Mapillary</string>
|
||||
<string name="quick_action_showhide_mapillary_descr">Un pulsante per visualizzare nella mappa o nascondere il livello Mapillary .</string>
|
||||
<string name="lenght_limit_description">Fornisci la lunghezza del tuo veicolo, alcune restrizioni di percorso potrebbero essere applicate per veicoli.</string>
|
||||
<string name="uninstall_speed_cameras">Disinstalla autovelox</string>
|
||||
<string name="shared_string_legal">Legale</string>
|
||||
<string name="speed_camera_pois">PDI autovelox</string>
|
||||
<string name="speed_cameras_legal_descr">In alcuni paesi o regioni, gli avvisi di presenza di autovelox sono proibiti dalla legge.
|
||||
\n
|
||||
\nDevi scegliere in base alle leggi del tuo paese.
|
||||
\n
|
||||
\nScegliendo %1$s e riceverai gli avvisi della presenza di autovelox.
|
||||
\n
|
||||
\nScegliendo %2$s. Tutti i dati relativi agli autovelox: avvisi, notifiche, PDI saranno cancellati fino a che OsmAnd non sarà completamente reinstallato.</string>
|
||||
<string name="keep_active">Mantieni attivo</string>
|
||||
<string name="shared_string_uninstall">Disinstalla</string>
|
||||
<string name="speed_cameras_alert">Gli avvisi sulla presenza di autovelox in alcuni paesi è proibita dalla legge.</string>
|
||||
<string name="routing_attr_length_description">Specifica la lunghezza del veicolo permessa nei percorsi.</string>
|
||||
<string name="routing_attr_length_name">Lunghezza massima</string>
|
||||
<string name="shared_string_bearing">Bussola</string>
|
||||
<string name="item_deleted">%1$s cancellato</string>
|
||||
<string name="speed_cameras_restart_descr">Il riavvio è necessario per cancellare completamente i dati degli autovelox.</string>
|
||||
<string name="shared_string_uninstall_and_restart">Disinstalla e Riavvia</string>
|
||||
<string name="speed_cameras_removed_descr">Questo dispositivo non ha autovelox.</string>
|
||||
<string name="app_mode_inline_skates">Pattini in linea</string>
|
||||
<string name="quick_action_remove_next_destination">Cancella il prossimo punto di destinazione</string>
|
||||
<string name="use_volume_buttons_as_zoom_descr">Abilita per controllare il livello di zoom della mappa con i pulsanti del volume del dispositivo.</string>
|
||||
<string name="use_volume_buttons_as_zoom">Pulsanti volume come zoom</string>
|
||||
<string name="please_provide_point_name_error">Per favore indica un nome per il punto</string>
|
||||
<string name="quick_action_remove_next_destination_descr">Il punto di destinazione corrente sul percorso verrà eliminato. Se sarà la Destinazione, la navigazione verrà interrotta.</string>
|
||||
<string name="search_download_wikipedia_maps">Scarica mappe Wikipedia</string>
|
||||
<string name="plugin_wikipedia_description">Ottieni informazioni sui punti di interesse da Wikipedia. È la tua guida tascabile offline - basta abilitare il plugin Wikipedia e goderti gli articoli sugli oggetti intorno a te.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Moto da enduro</string>
|
||||
<string name="app_mode_motor_scooter">Moto scooter</string>
|
||||
<string name="app_mode_wheelchair">Sedia a rotelle</string>
|
||||
<string name="app_mode_go_cart">Go-kart</string>
|
||||
<string name="osm_edit_closed_note">Chiudi la nota OSM</string>
|
||||
<string name="app_mode_wheelchair_forward">Sedia a rotelle</string>
|
||||
</resources>
|
|
@ -3824,4 +3824,8 @@
|
|||
<string name="plugin_wikipedia_description">קבלת מידע על נקודות עניין מוויקיפדיה. מדריך הכיס הפרטי שלך - עליך פשוט להפעיל את התוסף של ויקיפדיה וליהנות מערכים על מה שסביבך.</string>
|
||||
<string name="app_mode_enduro_motorcycle">אופנוע שטח</string>
|
||||
<string name="app_mode_motor_scooter">טוסטוס</string>
|
||||
<string name="app_mode_wheelchair">כסא גלגלים</string>
|
||||
<string name="app_mode_wheelchair_forward">כסא גלגלים ספורטיבי</string>
|
||||
<string name="app_mode_go_cart">קארטינג</string>
|
||||
<string name="osm_edit_closed_note">הערת OSM סגורה</string>
|
||||
</resources>
|
|
@ -3612,4 +3612,141 @@
|
|||
<string name="poi_childcare">Kinderopvang</string>
|
||||
<string name="poi_toll_gantry">Tolportaal</string>
|
||||
<string name="poi_atoll">Atol</string>
|
||||
<string name="poi_disabled_designated">Aangegeven</string>
|
||||
<string name="poi_goods_designated">Aangegeven</string>
|
||||
<string name="poi_hgv_delivery">Bestemmingsverkeer</string>
|
||||
<string name="poi_hgv_designated">Aangegeven</string>
|
||||
<string name="poi_hgv_permissive">Toegestaan</string>
|
||||
<string name="poi_hgv_destination">Bestemmingsverkeer</string>
|
||||
<string name="poi_mofa_designated">Aangegeven</string>
|
||||
<string name="poi_moped_designated">Aangegeven</string>
|
||||
<string name="poi_motorcycle_designated">Aangegeven</string>
|
||||
<string name="poi_motorcycle_destination">Bestemmingsverkeer</string>
|
||||
<string name="poi_motorcycle_permissive">Toegestaan</string>
|
||||
<string name="poi_trailer_designated">Aangegeven</string>
|
||||
<string name="poi_motorhome_designated">Aangegeven</string>
|
||||
<string name="poi_caravan_designated">Aangegeven</string>
|
||||
<string name="poi_bus_designated">Aangegeven</string>
|
||||
<string name="poi_snowmobile_permissive">Toegestaan</string>
|
||||
<string name="poi_snowmobile_designated">Aangegeven</string>
|
||||
<string name="poi_disabled_no">Toegang voor gehandicapten: nee</string>
|
||||
<string name="poi_taxi_no">Toegang voor taxi’s: nee</string>
|
||||
<string name="poi_taxi_designated">Toegang voor taxi’s: aangegeven</string>
|
||||
<string name="poi_taxi_yes">Toegang voor taxi’s: ja</string>
|
||||
<string name="poi_agricultural_no">Toegang voor landbouwvoertuigen: nee</string>
|
||||
<string name="poi_agricultural_yes">Toegang voor landbouwvoertuigen: ja</string>
|
||||
<string name="poi_snowmobile_no">Toegang voor sneeuwscooters: nee</string>
|
||||
<string name="poi_snowmobile_private">Toegang voor sneeuwscooters: privé</string>
|
||||
<string name="poi_ski_no">Toegang voor skiërs: nee</string>
|
||||
<string name="poi_ski_yes">Toegang voor skiërs: ja</string>
|
||||
<string name="poi_tourist_bus_no">Toegang voor touringcars: nee</string>
|
||||
<string name="poi_tourist_bus_designated">Toegang voor touringcars: aangegeven</string>
|
||||
<string name="poi_bus_no">Toegang voor lijnbussen: nee</string>
|
||||
<string name="poi_tourist_bus_yes">Toegang voor touringcars: ja</string>
|
||||
<string name="poi_coach_yes">Toegang voor touringcars: ja</string>
|
||||
<string name="poi_coach_no">Toegang voor touringcars: nee</string>
|
||||
<string name="poi_psv_no">Toegang voor publiek transport of taxi’s: nee</string>
|
||||
<string name="poi_psv_designated">Toegang voor publiek transport of taxi’s: aangegeven</string>
|
||||
<string name="poi_psv_yes">Toegang voor publiek transport of taxi’s: ja</string>
|
||||
<string name="poi_trailer_no">Toegang voor aanhangers: nee</string>
|
||||
<string name="poi_motorhome_no">Toegang voor campers: nee</string>
|
||||
<string name="poi_caravan_no">Toegang voor caravans: nee</string>
|
||||
<string name="poi_bicycle_customers">Toegang voor fietsers: klanten</string>
|
||||
<string name="poi_bicycle_permissive">Toegang voor fietsers: toegestaan</string>
|
||||
<string name="poi_bicycle_destination">Toegang voor fietsers: bestemmingsverkeer</string>
|
||||
<string name="poi_bicycle_dismount">Toegang voor fietsers: afstappen</string>
|
||||
<string name="poi_bicycle_private">Toegang voor fietsers: privé</string>
|
||||
<string name="poi_mofa_no">Toegang voor snorfietsers: nee</string>
|
||||
<string name="poi_moped_no">Toegang voor bromfietsers: nee</string>
|
||||
<string name="poi_motorcycle_no">Toegang voor motorbestuurders: nee</string>
|
||||
<string name="poi_motorcycle_private">Toegang voor motorbestuurders: privé</string>
|
||||
<string name="poi_foot_customers">Toegang voor voetgangers: klanten</string>
|
||||
<string name="poi_foot_permissive">Toegang voor voetgangers: toegestaan</string>
|
||||
<string name="poi_foot_destination">Toegang voor voetgangers: bestemmingsverkeer</string>
|
||||
<string name="poi_foot_no">Toegang voor voetgangers: nee</string>
|
||||
<string name="poi_foot_private">Toegang voor voetgangers: privé</string>
|
||||
<string name="poi_foot_yes">Toegang voor voetgangers: ja</string>
|
||||
<string name="poi_horse_forestry">Toegang voor ruiters: boswachterij</string>
|
||||
<string name="poi_horse_permissive">Toegang voor ruiters: toegestaan</string>
|
||||
<string name="poi_horse_destination">Toegang voor ruiters: bestemmingsverkeer</string>
|
||||
<string name="poi_horse_private">Toegang voor ruiters: privé</string>
|
||||
<string name="poi_goods_no">Toegang voor bestelwagens: nee</string>
|
||||
<string name="poi_hgv_unsuitable">Toegang voor vrachtwagens: ongeschikt</string>
|
||||
<string name="poi_hgv_discouraged">Toegang voor vrachtwagens: ontraden</string>
|
||||
<string name="poi_hgv_agricultural">Toegang voor vrachtwagens: landbouw</string>
|
||||
<string name="poi_hgv_no">Toegang voor vrachtwagens: nee</string>
|
||||
<string name="poi_hgv_private">Toegang voor vrachtwagens: privé</string>
|
||||
<string name="poi_motor_vehicle_agricultural">Toegang voor motorvoertuigen: landbouw</string>
|
||||
<string name="poi_motor_vehicle_forestry">Toegang voor motorvoertuigen: boswachterij</string>
|
||||
<string name="poi_motor_vehicle_delivery">Toegang voor motorvoertuigen: bezorging</string>
|
||||
<string name="poi_motor_vehicle_military">Toegang voor motorvoertuigen: militair</string>
|
||||
<string name="poi_motor_vehicle_customers">Toegang voor motorvoertuigen: klanten</string>
|
||||
<string name="poi_motor_vehicle_permissive">Toegang voor motorvoertuigen: toegestaan</string>
|
||||
<string name="poi_motor_vehicle_destination">Toegang voor motorvoertuigen: bestemmingsverkeer</string>
|
||||
<string name="poi_motor_vehicle_no">Toegang voor motorvoertuigen: nee</string>
|
||||
<string name="poi_motor_vehicle_private">Toegang voor motorvoertuigen: privé</string>
|
||||
<string name="poi_motorcar_permissive">Toegang voor auto’s: toegestaan</string>
|
||||
<string name="poi_motorcar_destination">Toegang voor auto’s: bestemmingsverkeer</string>
|
||||
<string name="poi_motorcar_no">Toegang voor auto’s: nee</string>
|
||||
<string name="poi_motorcar_private">Toegang voor auto’s: privé</string>
|
||||
<string name="poi_motorcar_yes">Toegang voor auto’s: ja</string>
|
||||
<string name="poi_motorcar_customers">Toegang voor auto’s: klanten</string>
|
||||
<string name="poi_motorcar_forestry">Toegang voor auto’s: boswachterij</string>
|
||||
<string name="poi_motor_vehicle_yes">Toegang voor motorvoertuigen: ja</string>
|
||||
<string name="poi_vehicle_forestry">Toegang voor voertuigen: boswachterij</string>
|
||||
<string name="poi_vehicle_delivery">Toegang voor voertuigen: bezorging</string>
|
||||
<string name="poi_vehicle_military">Toegang voor voertuigen: militair</string>
|
||||
<string name="poi_vehicle_customers">Toegang voor voertuigen: klanten</string>
|
||||
<string name="poi_vehicle_permissive">Toegang voor voertuigen: toegestaan</string>
|
||||
<string name="poi_vehicle_destination">Toegang voor voertuigen: bestemmingsverkeer</string>
|
||||
<string name="poi_vehicle_no">Toegang voor voertuigen: nee</string>
|
||||
<string name="poi_vehicle_private">Toegang voor voertuigen: privé</string>
|
||||
<string name="poi_vehicle_yes">Toegang voor voertuigen: ja</string>
|
||||
<string name="poi_hookah_lounge">Hookah lounge</string>
|
||||
<string name="poi_charcoal_pile">Meiler</string>
|
||||
<string name="poi_rescue_box">Noodhulpkist</string>
|
||||
<string name="poi_pipeline_substation">Faciliteiten voor pijpleidingen</string>
|
||||
<string name="poi_parking_space">Parkeerplaats</string>
|
||||
<string name="poi_grave">Graf</string>
|
||||
<string name="poi_monastery_type_clerks_regular">Soort klooster: reguliere orde</string>
|
||||
<string name="poi_monastery_type_hermitage">Soort klooster: kluizenaars</string>
|
||||
<string name="poi_monastery_type_canonry">Soort klooster: kanunniken</string>
|
||||
<string name="poi_monastery_type_convent">Soort klooster: convent</string>
|
||||
<string name="poi_monastery_type_monastics">Soort klooster: monniken</string>
|
||||
<string name="poi_bath_open_air_no">Nee</string>
|
||||
<string name="poi_bath_open_air_yes">Ja</string>
|
||||
<string name="poi_bath_type_foot_bath">Voetenbad</string>
|
||||
<string name="poi_bath_type_lake">Meer</string>
|
||||
<string name="poi_bath_type_river">Rivier</string>
|
||||
<string name="poi_bath_type_thermal">Thermisch</string>
|
||||
<string name="poi_bath_type_hammam">Hamam</string>
|
||||
<string name="poi_bath_type_onsen">Onsen</string>
|
||||
<string name="poi_bath_type_hot_spring">Warmwaterbron</string>
|
||||
<string name="poi_cash_withdrawal_postbank">Postbank</string>
|
||||
<string name="poi_cash_withdrawal_girocard">Girokaart</string>
|
||||
<string name="poi_cash_withdrawal_migros_bank">Migros bank</string>
|
||||
<string name="poi_cash_withdrawal_postfinance_card">Postfinance card</string>
|
||||
<string name="poi_cash_withdrawal_foreign_cards">Geldopname: internationaal</string>
|
||||
<string name="poi_cash_withdrawal_purchase_minimum">Geldopname: minimum aankoopbedrag</string>
|
||||
<string name="poi_cash_withdrawal_fee_no">Kostenloze geldopname: ja</string>
|
||||
<string name="poi_cash_withdrawal_fee_yes">Kostenloze geldopname: nee</string>
|
||||
<string name="poi_cash_withdrawal_purchase_required_no">Geldopname: zonder aankoop</string>
|
||||
<string name="poi_cash_withdrawal_purchase_required_yes">Geldopname: bij aankoop</string>
|
||||
<string name="poi_cash_withdrawal_currency">Munteenheid</string>
|
||||
<string name="poi_cash_withdrawal_limit">Opnamelimiet</string>
|
||||
<string name="poi_cash_withdrawal_type_self_checkout">Geldopname via: zelfbedieningskassa</string>
|
||||
<string name="poi_cash_withdrawal_type_checkout">Geldopname via: kassa</string>
|
||||
<string name="poi_cash_withdrawal_operator">Uitbatende organisatie van geldopname</string>
|
||||
<string name="poi_cash_withdrawal">Geldopname</string>
|
||||
<string name="poi_cash_withdrawal_yes">Geldopname: ja</string>
|
||||
<string name="poi_pet_grooming">Huisdierverzorging</string>
|
||||
<string name="poi_charge">Tarief</string>
|
||||
<string name="poi_craft_cabinet_maker">Meubelmaker</string>
|
||||
<string name="poi_craft_bakery">Bakkerij</string>
|
||||
<string name="poi_craft_floorer">Vloerenlegger</string>
|
||||
<string name="poi_craft_joiner">Schrijnwerker</string>
|
||||
<string name="poi_craft_distillery">Destilleerderij</string>
|
||||
<string name="poi_craft_builder">Aannemer</string>
|
||||
<string name="poi_health_food">Health food</string>
|
||||
<string name="poi_cellar_entrance">Kelderingang</string>
|
||||
</resources>
|
|
@ -3431,7 +3431,7 @@
|
|||
<string name="routing_profile_direct_to">Recht-naar-punt</string>
|
||||
<string name="please_provide_profile_name_message">Kies een naam voor het profiel</string>
|
||||
<string name="open_settings">Open instellingen</string>
|
||||
<string name="plugin_disabled">Plugin uitgeschakeld</string>
|
||||
<string name="plugin_disabled">Plug-in uit</string>
|
||||
<string name="plugin_disabled_descr">Deze plug-in is een afzonderlijke app, die afzonderlijk verwijderd moet worden als je deze niet meer nodig denkt te hebben.
|
||||
\n
|
||||
\nDe plug-in blijft op het apparaat aanwezig na het verwijderen van OsmAnd.</string>
|
||||
|
@ -3442,7 +3442,7 @@
|
|||
<string name="import_profile_dialog_description">Het geïmporteerde profiel bevat bijkomende gegevens. Klik \'importeer\' om enkel de profielgegevens te importeren of kies bijkomende gegevens om te importeren.</string>
|
||||
<string name="export_profile_dialog_description">Je kan bijkomende gegevens om mee met het profiel te exporteren.</string>
|
||||
<string name="shared_string_app_default_w_val">App Standaardwaarde (%s)</string>
|
||||
<string name="no_recalculation_setting">Herberekening uitschakelen</string>
|
||||
<string name="no_recalculation_setting">Niet herberekenen</string>
|
||||
<string name="route_recalculation_dist_title">Minimale afstand om route te herbereken</string>
|
||||
<string name="route_recalculation_dist_descr">De route wordt herberekend wanneer de afstand tot die route groter is dan de opgegeven parameter</string>
|
||||
<string name="profile_type_custom_string">Eigen profiel</string>
|
||||
|
@ -3471,17 +3471,17 @@
|
|||
<string name="restore_all_profile_settings">Alle profielinstellingen herstellen\?</string>
|
||||
<string name="saving_new_profile">Slaat nieuw profiel op</string>
|
||||
<string name="profile_backup_failed">Kan profiel niet back-uppen.</string>
|
||||
<string name="n_items_of_z">%1$s of %2$s</string>
|
||||
<string name="n_items_of_z">%1$s van %2$s</string>
|
||||
<string name="download_slope_maps">Hellingen</string>
|
||||
<string name="quick_action_show_hide_terrain">Terrein tonen / verbergen</string>
|
||||
<string name="quick_action_terrain_hide">Terrein verbergen</string>
|
||||
<string name="quick_action_terrain_show">Terrein tonen</string>
|
||||
<string name="quick_action_terrain_descr">Een knop om de terreinlaag al dan niet te tonen op de kaart.</string>
|
||||
<string name="delete_description">Verwijder een beschrijving</string>
|
||||
<string name="add_description">Voeg een beschrijving toe</string>
|
||||
<string name="select_group">Selecteer groep</string>
|
||||
<string name="select_shape">Selecteer vorm</string>
|
||||
<string name="shared_string_circle">cirkel</string>
|
||||
<string name="delete_description">Beschrijving verwijderen</string>
|
||||
<string name="add_description">Beschrijving toevoegen</string>
|
||||
<string name="select_group">Groep kiezen</string>
|
||||
<string name="select_shape">Vorm kiezen</string>
|
||||
<string name="shared_string_circle">Cirkel</string>
|
||||
<string name="shared_string_rhomb">Ruit</string>
|
||||
<string name="shared_string_min">Min</string>
|
||||
<string name="search_poi_types_descr">Combineer POI-types uit verschillende categorieën. Tik op \"Schakelen\" om alles te selecteren, tik op de linkerkant voor de categoriekeuze.</string>
|
||||
|
@ -3707,4 +3707,10 @@
|
|||
<string name="quick_action_remove_next_destination">Verwijder het volgende routepunt</string>
|
||||
<string name="please_provide_point_name_error">Kies een naam voor het punt</string>
|
||||
<string name="search_download_wikipedia_maps">Wikipedia-kaarten downloaden</string>
|
||||
<string name="app_mode_motor_scooter">Motorscooter</string>
|
||||
<string name="app_mode_enduro_motorcycle">Enduromotor</string>
|
||||
<string name="app_mode_wheelchair">Rolstoel</string>
|
||||
<string name="app_mode_wheelchair_forward">Rolstoel vooraanzicht</string>
|
||||
<string name="osm_edit_closed_note">Opgeloste OSM-notitie</string>
|
||||
<string name="app_mode_go_cart">Kart</string>
|
||||
</resources>
|
|
@ -3825,4 +3825,7 @@
|
|||
<string name="poi_fire_hydrant_pressure_filter">Ciśnienie</string>
|
||||
<string name="poi_traffic_signals_arrow">Strzałka</string>
|
||||
<string name="poi_traffic_signals_vibration">Wibracja</string>
|
||||
<string name="poi_traffic_signals_arrow_yes">Tak</string>
|
||||
<string name="poi_traffic_signals_vibration_yes">Tak</string>
|
||||
<string name="poi_traffic_signals_vibration_no">Wibracja: nie</string>
|
||||
</resources>
|
|
@ -61,7 +61,7 @@
|
|||
<string name="vector_data_missing">Pobierz dane (\"offline\") by używać map offline.</string>
|
||||
<string name="local_index_gpx_info_show">"
|
||||
\n
|
||||
\nPrzytrzymaj dłużej, aby uzyskać opcje"</string>
|
||||
\nPrzytrzymaj dłużej, aby wyświetlić opcje"</string>
|
||||
<string name="local_index_installed">Wersja lokalna</string>
|
||||
<string name="local_index_items_backuped">Zarchiwizowano %1$d z %2$d.</string>
|
||||
<string name="local_index_items_deleted">Usunięto %1$d z %2$d.</string>
|
||||
|
@ -97,7 +97,9 @@
|
|||
<string name="gpx_option_reverse_route">Odwróć kierunek GPX</string>
|
||||
<string name="gpx_option_destination_point">Użyj bieżącego celu</string>
|
||||
<string name="switch_to_raster_map_to_see">Pobierz mapę wektorową offline tego położenia w „Ustawieniach” (\"Zarządzaj mapami\") lub przełącz na wtyczkę \"Mapy online\".</string>
|
||||
<string name="switch_to_vector_map_to_see">Dla bieżącego położenia dostępna jest wektorowa mapa offline. Aby jej użyć, proszę wybrać „Menu” → „Skonfiguruj mapę” → „Zasób mapy…” → „Wektorowe mapy offline”.</string>
|
||||
<string name="switch_to_vector_map_to_see">Dla bieżącego położenia dostępna jest wektorowa mapa offline.
|
||||
\n
|
||||
\nAby jej użyć wybierz „Menu” → „Skonfiguruj mapę” → „Źródło mapy…” → „Wektorowe mapy offline”.</string>
|
||||
<string name="choose_audio_stream">Wyjście dźwięku nawigacji głosowej</string>
|
||||
<string name="choose_audio_stream_descr">Wybiera kanał do odtwarzania komunikatów głosowych.</string>
|
||||
<string name="voice_stream_voice_call">Kanał telefoniczny (przerywa odtwarzanie muzyki z głośników)</string>
|
||||
|
@ -1053,7 +1055,7 @@
|
|||
<string name="driving_region_canada">Kanada</string>
|
||||
<string name="map_widget_fps_info">Diagnozowanie błędów FPS</string>
|
||||
<string name="local_index_tile_data_zooms">Pobrane stopnie przybliżenia: %1$s</string>
|
||||
<string name="local_index_tile_data_expire">Wygaśnięcie (minuty): %1$s</string>
|
||||
<string name="local_index_tile_data_expire">Czas wygaśnięcia (minuty): %1$s</string>
|
||||
<string name="local_index_tile_data_downloadable">Do pobrania: %1$s</string>
|
||||
<string name="local_index_tile_data_maxzoom">Maksymalne przybliżenie: %1$s</string>
|
||||
<string name="local_index_tile_data_minzoom">Minimalne przybliżenie: %1$s</string>
|
||||
|
@ -1228,7 +1230,7 @@
|
|||
<string name="gpx_selection_track">%1$s \nTrasa %2$s</string>
|
||||
<string name="selected_gpx_info_show">"
|
||||
\n
|
||||
\nPrzytrzymaj nacisk, aby zobaczyć na mapie"</string>
|
||||
\nPrzytrzymaj dłużej, aby wyświetlić na mapie"</string>
|
||||
<string name="delay_navigation_start">Rozpocznij nawigację automatycznie</string>
|
||||
<string name="shared_string_selected_lowercase">wybrano</string>
|
||||
<string name="gpx_split_interval">Interwał podziału</string>
|
||||
|
@ -2033,7 +2035,7 @@
|
|||
<string name="no_update_info">Pomijanie aktualizacji</string>
|
||||
<string name="update_all_maps_now">Uaktualnić wszystkie mapy?</string>
|
||||
<string name="clear_tile_data">Wyczyść wszystkie kafelki</string>
|
||||
<string name="osm_live_payment_desc">Opłata za subskrypcję na miesiąc. Anuluj ją w Google Play w dowolnym momencie.</string>
|
||||
<string name="osm_live_payment_desc">Subskrypcja naliczona za wybrany okres. Anuluj go w Google Play w dowolnym momencie.</string>
|
||||
<string name="donation_to_osm">Darowizna na rzecz społeczności OSM</string>
|
||||
<string name="donation_to_osm_desc">Część z dotacji jest przekazywana darczyńcom OSM. Koszt subskrypcji pozostaje taki sam.</string>
|
||||
<string name="osm_live_subscription_desc">Subskrypcje pozwalają na cogodzinne, codzienne i cotygodniowe uaktualnienia i nieograniczone liczbą pobieranie map całego świata.</string>
|
||||
|
@ -2340,7 +2342,7 @@
|
|||
<string name="plugin_mapillary_descr">Udostępnia zdjęcia w widoku ulicznym. Pozwala na odkrywanie miejsc, współpracę nad uchwyceniem świata.</string>
|
||||
<string name="shared_string_install">Zainstaluj</string>
|
||||
<string name="improve_coverage_mapillary">Zwiększ pokrycie zdjęć Mapillary</string>
|
||||
<string name="improve_coverage_install_mapillary_desc">Proszę zainstalować Mapillary, aby dodać zdjęcia tego położenia na mapie.</string>
|
||||
<string name="improve_coverage_install_mapillary_desc">Zainstaluj Mapillary, aby dodać zdjęcia do tej lokalizacji na mapie.</string>
|
||||
<string name="open_mapillary">Otwórz Mapillary</string>
|
||||
<string name="mapillary_image">Obraz Mapillary</string>
|
||||
<string name="distance_moving">Poprawiona odległość</string>
|
||||
|
@ -2409,7 +2411,7 @@
|
|||
<string name="empty_state_my_tracks">Dodaj pliki GPX</string>
|
||||
<string name="empty_state_my_tracks_desc">Importowanie plików GPX lub nagranych tras.</string>
|
||||
<string name="empty_state_favourites">Dodaj do ulubionych</string>
|
||||
<string name="empty_state_favourites_desc">Importuje ulubione lub dodaje poprzez zaznaczenie punktów na mapie.</string>
|
||||
<string name="empty_state_favourites_desc">Zaimportuj Ulubione lub dodaj je poprzez zaznaczenie punktów na mapie.</string>
|
||||
<string name="import_track">Importuj plik GPX</string>
|
||||
<string name="import_track_desc">Plik %1$s nie zawiera punktów trasy, czy zaimportować go jako ślad?</string>
|
||||
<string name="move_point">Przesuń punkt</string>
|
||||
|
@ -2522,7 +2524,7 @@
|
|||
<string name="context_menu_read_full_article">Czytaj cały artykuł</string>
|
||||
<string name="context_menu_read_article">Czytaj artykuł</string>
|
||||
<string name="empty_state_av_notes">Notuj!</string>
|
||||
<string name="empty_state_av_notes_desc">Dodaj notatkę audio, video lub zdjęciową do każdego punktu na mapie, za pomocą widgetu lub menu kontekstowego.</string>
|
||||
<string name="empty_state_av_notes_desc">Dodaj notatki audio, wideo lub zdjęcia do dowolnego punktu na mapie za pomocą widżetów lub menu kontekstowego.</string>
|
||||
<string name="notes_by_date">Notatki A/V według daty</string>
|
||||
<string name="empty_state_markers_groups">Importuj grupy</string>
|
||||
<string name="add_favourites_group_to_markers_descr">Wybierz kategorię Ulubione, aby dodać znaczniki.</string>
|
||||
|
@ -3152,7 +3154,7 @@
|
|||
<string name="turn_screen_on_router">Przebudzaj przed zakrętem</string>
|
||||
<string name="turn_screen_on_time_descr">Ustaw jak długo ekran będzie włączony.</string>
|
||||
<string name="turn_screen_on_sensor">Używanie czujnika zbliżeniowego</string>
|
||||
<string name="turn_screen_on_sensor_descr">Włącza ekran podczas nawigacji machaniem ręką nad ekranem.</string>
|
||||
<string name="turn_screen_on_sensor_descr">Włącza ekran machaniem ręką nad ekranem.</string>
|
||||
<string name="external_input_device">Zewnętrzne urządzenia wejściowe</string>
|
||||
<string name="external_input_device_descr">Wybierz urządzenie takie jak zwykła klawiatura lub WundeRLINQ do sterowania zewnętrznego.</string>
|
||||
<string name="sett_no_ext_input">Brak</string>
|
||||
|
@ -3418,12 +3420,12 @@
|
|||
<string name="select_color">Wybór koloru</string>
|
||||
<string name="edit_profiles_descr">Nie można usunąć domyślnych profili OsmAnd, ale można je wyłączyć (na poprzednim ekranie) lub przenieść na dół.</string>
|
||||
<string name="edit_profiles">Edytuj profile</string>
|
||||
<string name="select_nav_profile_dialog_message">Określa w jaki sposób wyznaczane są trasy.</string>
|
||||
<string name="select_nav_profile_dialog_message">„Typ nawigacji” określa sposób obliczania tras.</string>
|
||||
<string name="profile_appearance">Wygląd profilu</string>
|
||||
<string name="choose_icon_color_name">Ikona, kolor i nazwa</string>
|
||||
<string name="reorder_profiles">Edytuj listę profili</string>
|
||||
<string name="selected_profile">Wybrany profil</string>
|
||||
<string name="reset_confirmation_descr">Stuknięcie %1$s spowoduje utratę wszystkich zmian.</string>
|
||||
<string name="reset_confirmation_descr">Naciśnięcie przycisku %1$s powoduje odrzucenie wszystkich zmian.</string>
|
||||
<string name="reset_all_profile_settings_descr">Wszystkie ustawienia profilu zostaną przywrócone do stanu po instalacji.</string>
|
||||
<string name="reset_all_profile_settings">Zresetować wszystkie ustawienia profilu\?</string>
|
||||
<string name="ltr_or_rtl_combine_via_colon">%1$s: %2$s</string>
|
||||
|
@ -3461,7 +3463,7 @@
|
|||
<string name="osm_authorization_success">Uwierzytelniono</string>
|
||||
<string name="monitoring_min_speed_descr_side_effect">Efekt uboczny: trasa nie będzie zawierała sekcji, w których nie zostało spełnione kryterium minimalnej prędkości (np. podczas pchania roweru pod strome wzgórze). Nie będzie również zawierała informacji o czasach odpoczynku, np. przerwach. Ma to wpływ na analizę i przetwarzanie końcowe, np. przy próbie określenia całkowitej długości trasy, czasu w ruchu lub średniej prędkości.</string>
|
||||
<string name="rearrange_categories">Zmień układ kategorii</string>
|
||||
<string name="create_custom_categories_list_promo">Zmień kolejność sortowania listy, ukryj niepotrzebne kategorie. Wszystkie zmiany można importować lub eksportować za pomocą profili.</string>
|
||||
<string name="create_custom_categories_list_promo">Zmień kolejność sortowania listy, ukryj kategorie. Wszystkie zmiany można importować lub eksportować za pomocą profili.</string>
|
||||
<string name="add_new_custom_category_button_promo">Można dodać nową, niestandardową kategorię wybierając jedną lub kilka kategorii.</string>
|
||||
<string name="shared_string_available">Dostępne</string>
|
||||
<string name="add_custom_category">Dodaj niestandardową kategorię</string>
|
||||
|
@ -3478,7 +3480,7 @@
|
|||
<string name="reset_plugin_to_default">Przywrócenie ustawień wtyczki do wartości domyślnych</string>
|
||||
<string name="multimedia_use_system_camera">Użyj aplikacji systemowej</string>
|
||||
<string name="multimedia_photo_play_sound">Dźwięk migawki aparatu</string>
|
||||
<string name="reset_to_default_category_button_promo">Przywrócenie domyślnej kolejności sortowania spowoduje przywrócenie porządku sortowania do stanu domyślnego po instalacji.</string>
|
||||
<string name="reset_to_default_category_button_promo">Opcja \'Przywróć ustawienia domyślne\' spowoduje przywrócenie porządku sortowania do stanu domyślnego po instalacji.</string>
|
||||
<string name="accessibility_mode_disabled">Tryb ułatwień jest dostępu wyłączony w twoim systemie.</string>
|
||||
<string name="use_system_screen_timeout">Wygaś ekran zgodnie z ustawieniami systemu</string>
|
||||
<string name="clear_recorded_data">Wyczyść zarejestrowane dane</string>
|
||||
|
@ -3678,7 +3680,7 @@
|
|||
\nMożesz wyłączyć nieużywane wtyczki, aby ukryć ich elementy w aplikacji. %1$s.</string>
|
||||
<string name="ltr_or_rtl_combine_via_slash_with_space">%1$s / %2$s</string>
|
||||
<string name="search_poi_types">Szukaj typów użytecznych miejsc</string>
|
||||
<string name="search_poi_types_descr">Łącz typy użytecznych zmian z różnych kategorii. Stuknij \"Zmień\", aby zaznaczyć wszystko, stuknij lewą stronę, aby wybrać kategorię.</string>
|
||||
<string name="search_poi_types_descr">Łącz typy użytecznych zmian z różnych kategorii. Stuknij przełącznik, aby zaznaczyć wszystko, stuknij lewą stronę, aby wybrać kategorię.</string>
|
||||
<string name="legend_item_description">Przewodnik po symbolach mapy.</string>
|
||||
<string name="navigation_profiles_item">Profile nawigacji</string>
|
||||
<string name="mapillary_item">OsmAnd + Mapillary</string>
|
||||
|
@ -3699,11 +3701,11 @@
|
|||
\n
|
||||
\n • Pełna personalizacja Ulubionych i Punktów GPX - niestandardowe kolory, ikony, kształty
|
||||
\n
|
||||
\n • Dostosowywanie kolejności elementów w menu kontekstowym, konfiguracji mapy, menu podręcznym
|
||||
\n • Dostosowywanie kolejności elementów w menu kontekstowym, konfiguracji mapy i menu podręcznym
|
||||
\n
|
||||
\n • Wikipedia jako osobna warstwa w konfiguracji mapy, wybierz tylko potrzebne języki
|
||||
\n
|
||||
\n • Tworzenie własnego filtru użytecznych miejsc/mapy z pełną elastycznością
|
||||
\n • Tworzenie własnego filtru użytecznych miejsc/map z pełną elastycznością
|
||||
\n
|
||||
\n • Dodano opcje przywracania ustawień profili niestandardowych
|
||||
\n
|
||||
|
@ -3720,7 +3722,7 @@
|
|||
<string name="quick_action_show_hide_transport">Pokaż/ukryj transport publiczny</string>
|
||||
<string name="create_edit_poi">Utwórz / Edytuj użyteczne miejsce</string>
|
||||
<string name="add_edit_favorite">Dodaj / Edytuj Ulubione</string>
|
||||
<string name="quick_action_switch_profile_descr">Naciśnięcie przycisku akcji powoduje przełączanie między wybranymi profilami.</string>
|
||||
<string name="quick_action_switch_profile_descr">Przycisk akcji przełącza między wybranymi profilami.</string>
|
||||
<string name="shared_string_add_profile">Dodaj profil</string>
|
||||
<string name="change_application_profile">Zmiana profilu aplikacji</string>
|
||||
<string name="additional_actions_descr">Możesz uzyskać dostęp do tych czynności, naciskając przycisk „%1$s”.</string>
|
||||
|
@ -3802,4 +3804,15 @@
|
|||
<string name="item_deleted">Usunięto %1$s</string>
|
||||
<string name="speed_cameras_restart_descr">Ponowne uruchomienie jest wymagane, żeby całkowicie usunąć dane fotoradarów.</string>
|
||||
<string name="shared_string_uninstall_and_restart">Odinstaluj i zrestartuj</string>
|
||||
<string name="tracker_item">Tracker OsmAnd</string>
|
||||
<string name="lenght_limit_description">Podaj długość pojazdu, niektóre ograniczenia tras mogą być stosowane dla długich pojazdów.</string>
|
||||
<string name="speed_cameras_removed_descr">To urządzenie nie ma fotoradarów.</string>
|
||||
<string name="quick_action_remove_next_destination">Usuń następny punkt docelowy</string>
|
||||
<string name="use_volume_buttons_as_zoom_descr">Włącz sterowanie poziomem powiększenia mapy za pomocą przycisków głośności urządzenia.</string>
|
||||
<string name="please_provide_point_name_error">Podaj nazwę punktu</string>
|
||||
<string name="quick_action_remove_next_destination_descr">Bieżący punkt docelowy na trasie zostanie usunięty. Jeśli będzie to miejsce docelowe, nawigacja zostanie zatrzymana.</string>
|
||||
<string name="search_download_wikipedia_maps">Pobierz mapy Wikipedii</string>
|
||||
<string name="plugin_wikipedia_description">Uzyskaj informacje o interesujących miejscach z Wikipedii. Jest to kieszonkowy przewodnik offline - wystarczy włączyć wtyczkę Wikipedii i cieszyć się artykułami o obiektach wokół ciebie.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Motocykl Enduro</string>
|
||||
<string name="app_mode_motor_scooter">Skuter</string>
|
||||
</resources>
|
|
@ -3801,4 +3801,10 @@ Pôr do Sol: %2$s</string>
|
|||
<string name="quick_action_remove_next_destination_descr">O ponto de destino atual na rota será excluído. Se for o destino, a navegação será interrompida.</string>
|
||||
<string name="search_download_wikipedia_maps">Baixar mapas da Wikipédia</string>
|
||||
<string name="plugin_wikipedia_description">Obter informações sobre pontos de interesse da Wikipédia. É o seu guia de bolso off-line - só ativar o complemento Wikipédia e desfrutar de artigos sobre os elementos ao seu redor.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Motocicleta enduro</string>
|
||||
<string name="app_mode_motor_scooter">Motoneta</string>
|
||||
<string name="app_mode_wheelchair">Cadeira de rodas</string>
|
||||
<string name="app_mode_wheelchair_forward">Cadeira de rodas para a frente</string>
|
||||
<string name="app_mode_go_cart">Carrinho de compras</string>
|
||||
<string name="osm_edit_closed_note">Nota OSM fechada</string>
|
||||
</resources>
|
|
@ -3813,4 +3813,8 @@
|
|||
<string name="quick_action_remove_next_destination_descr">Текущий пункт назначения на маршруте будет удалён. Если это пункт назначения, навигация остановится.</string>
|
||||
<string name="plugin_wikipedia_description">Информация о достопримечательностях из Википедии. Это ваш карманный автономный гид — просто включите плагин Википедии и наслаждайтесь статьями об объектах вокруг вас.</string>
|
||||
<string name="search_download_wikipedia_maps">Скачать карты Википедии</string>
|
||||
<string name="app_mode_enduro_motorcycle">Эндуро мотоцикл</string>
|
||||
<string name="app_mode_motor_scooter">Мотороллер</string>
|
||||
<string name="osm_edit_closed_note">Закрытая заметка OSM</string>
|
||||
<string name="app_mode_wheelchair">Инвалидная коляска</string>
|
||||
</resources>
|
|
@ -3816,4 +3816,10 @@
|
|||
<string name="quick_action_remove_next_destination_descr">Su puntu de destinatzione atuale in s\'àndala at a èssere iscantzelladu. Si at a èssere sa destinatzione, sa navigatzione s\'at a firmare.</string>
|
||||
<string name="search_download_wikipedia_maps">Iscàrriga sas mapas de Wikipedia</string>
|
||||
<string name="plugin_wikipedia_description">Otene informatziones a pitzu de puntos de interesse dae Wikipedia. Est sa ghia non in lìnia tua de mantènnere in butzaca - abìlita s\'estensione Wikipedia e ispassia·ti cun sos artìculos a pitzu de sos ogetos a fùrriu de tie.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Moto enduro</string>
|
||||
<string name="app_mode_motor_scooter">Motorinu</string>
|
||||
<string name="app_mode_wheelchair_forward">Cadira a rodas cara a in antis</string>
|
||||
<string name="app_mode_wheelchair">Cadira a rodas</string>
|
||||
<string name="app_mode_go_cart">Go-kart</string>
|
||||
<string name="osm_edit_closed_note">Nota de OSM serrada</string>
|
||||
</resources>
|
|
@ -3812,4 +3812,10 @@
|
|||
<string name="quick_action_remove_next_destination_descr">Aktuálny cieľový bod na trase bude vymazaný. Ak je to posledný cieľ, navigácia sa zastaví.</string>
|
||||
<string name="search_download_wikipedia_maps">Stiahnuť mapy Wikipédia</string>
|
||||
<string name="plugin_wikipedia_description">Získajte informácie o bodoch záujmu z Wikipédie. Je to váš vreckový sprievodca - zapnite modul Wikipédia a užívajte si články o objektoch okolo vás.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Enduro motorka</string>
|
||||
<string name="app_mode_motor_scooter">Skúter</string>
|
||||
<string name="app_mode_wheelchair">Invalidný vozík</string>
|
||||
<string name="app_mode_wheelchair_forward">Invalidný vozík dopredu</string>
|
||||
<string name="app_mode_go_cart">Motokára</string>
|
||||
<string name="osm_edit_closed_note">Zatvorená OSM poznámka</string>
|
||||
</resources>
|
|
@ -2933,4 +2933,702 @@
|
|||
<string name="poi_nuclear_explosion_salvo_first_detonation">Плотун експлозија: прва детонација плотун теста</string>
|
||||
<string name="poi_shuffleboard">Куглање</string>
|
||||
<string name="poi_netball">Мрежа</string>
|
||||
<string name="poi_motorcycle_sales_used">Продаја: половна</string>
|
||||
<string name="poi_motorcycle_sales_yes_used">Продаја: да, половна</string>
|
||||
<string name="poi_motorcycle_sales_no">Продаја: не</string>
|
||||
<string name="poi_motorcycle_sales_yes">Продаја</string>
|
||||
<string name="poi_stands">Штандови</string>
|
||||
<string name="poi_zoo_reptile">Рептили</string>
|
||||
<string name="poi_zoo_falconry">Соколарник</string>
|
||||
<string name="poi_zoo_aviary">Птичник</string>
|
||||
<string name="poi_zoo_birds">Птице</string>
|
||||
<string name="poi_zoo_safari_park">Сафари парк</string>
|
||||
<string name="poi_zoo_enclosure">Кућиште</string>
|
||||
<string name="poi_zoo_wildlife_park">Парк дивљих животиња</string>
|
||||
<string name="poi_zoo_petting_zoo">Зоолошки врт са мажењем животиња</string>
|
||||
<string name="poi_life_ring">Животни прстен</string>
|
||||
<string name="poi_language_school">Школа страних језика</string>
|
||||
<string name="poi_music_school">Музичка школа</string>
|
||||
<string name="poi_resort_kids_camp">Дечији камп</string>
|
||||
<string name="poi_electronics_repair_tv">Поправка електронике: ТВ</string>
|
||||
<string name="poi_electronics_repair_phone">Поправка електронике: телефон</string>
|
||||
<string name="poi_electronics_repair_appliance">Поправка електронике: апарати</string>
|
||||
<string name="poi_electronics_repair_computer">Поправка електронике: рачунари</string>
|
||||
<string name="poi_energy_supplier">Канцеларија снабдевача енергије</string>
|
||||
<string name="poi_drink_wine_served">Вино: сервирано</string>
|
||||
<string name="poi_drink_wine_retail">Вино: малопродаја</string>
|
||||
<string name="poi_drink_wine_yes">Вино: да</string>
|
||||
<string name="poi_fast_food_cafeteria">Да</string>
|
||||
<string name="poi_coworking_space">Заједнички радни простор</string>
|
||||
<string name="poi_railway_yard">Теретна станица</string>
|
||||
<string name="poi_tower_construction_concealed">Конструкција: скривена</string>
|
||||
<string name="poi_tower_construction_dome">Конструкција: купола</string>
|
||||
<string name="poi_tower_construction_dish">Конструкција: тањир</string>
|
||||
<string name="poi_tower_construction_freestanding">Конструкција: самостојећа</string>
|
||||
<string name="poi_tower_construction_lattice">Конструкција: решетка</string>
|
||||
<string name="poi_animal_keeping_type_open_stable">Тип: отворена штала</string>
|
||||
<string name="poi_cuisine_buschenschank">Бушеншанк</string>
|
||||
<string name="poi_operational_status_closed">Затворено</string>
|
||||
<string name="poi_operational_status_open">Отворено</string>
|
||||
<string name="poi_visibility_area">Видљивост: подручје</string>
|
||||
<string name="poi_visibility_street">Видљивост: улица</string>
|
||||
<string name="poi_visibility_house">Видљивост: кућа</string>
|
||||
<string name="poi_location_entrance">Локација: улаз</string>
|
||||
<string name="poi_location_wall">Локација: зид</string>
|
||||
<string name="poi_location_bridge">Локација: мост</string>
|
||||
<string name="poi_location_platform">Локација: платформа</string>
|
||||
<string name="poi_location_indoor">Локација: унутар</string>
|
||||
<string name="poi_location_outdoor">Локација: напољу</string>
|
||||
<string name="poi_location_rooftop">Локација: врх крова</string>
|
||||
<string name="poi_location_roof">Локација: кров</string>
|
||||
<string name="poi_location_overhead">Локација: изнад главе</string>
|
||||
<string name="poi_location_overground">Локација: надземље</string>
|
||||
<string name="poi_location_underwater">Локација: подводна</string>
|
||||
<string name="poi_location_underground">Локација: подземна</string>
|
||||
<string name="poi_surface_metal_grid">Метална мрежа</string>
|
||||
<string name="poi_surface_decoturf">Декотрава</string>
|
||||
<string name="poi_surface_artificial_turf">Вештачка трава</string>
|
||||
<string name="poi_surface_tartan">Тартан</string>
|
||||
<string name="poi_surface_clay">Глина</string>
|
||||
<string name="poi_mountain_area">Планинско подручје</string>
|
||||
<string name="poi_couloir">Кулуар</string>
|
||||
<string name="poi_gorge">Клисура</string>
|
||||
<string name="poi_vhf">ВХФ канал</string>
|
||||
<string name="poi_government_legislative">Законодавна институција</string>
|
||||
<string name="poi_government_transportation">Транспортна институција</string>
|
||||
<string name="poi_government_treasury">Благајна</string>
|
||||
<string name="poi_government_social_services">Социјалне услуге</string>
|
||||
<string name="poi_government_social_security">Социјално осигурање</string>
|
||||
<string name="poi_government_public_service">Јавни сервис</string>
|
||||
<string name="poi_government_ministry">Министарство</string>
|
||||
<string name="poi_government_archive">Архива</string>
|
||||
<string name="poi_network">Мрежа</string>
|
||||
<string name="poi_boat_canoe_rental_rental_no">Кану: не</string>
|
||||
<string name="poi_boat_canoe_rental_rental_yes">Кану: да</string>
|
||||
<string name="poi_boat_kayak_rental_rental_no">Кајаци: не</string>
|
||||
<string name="poi_boat_kayak_rental_rental_yes">Кајаци: да</string>
|
||||
<string name="poi_boat_dinghy_rental_rental_no">Гумењак: не</string>
|
||||
<string name="poi_boat_dinghy_rental_rental_yes">Гумењак: да</string>
|
||||
<string name="poi_boat_sailboat_rental_no">Једрењаци: не</string>
|
||||
<string name="poi_boat_sailboat_rental_yes">Једрењаци: да</string>
|
||||
<string name="poi_boat_jetski_rental_no">Џетски: не</string>
|
||||
<string name="poi_boat_jetski_rental_yes">Џетски: да</string>
|
||||
<string name="poi_boat_pedalboat_rental_no">Бродови на веслање: не</string>
|
||||
<string name="poi_boat_pedalboat_rental_yes">Бродови на веслање: да</string>
|
||||
<string name="poi_boat_houseboat_rental_no">Кућни бродови: не</string>
|
||||
<string name="poi_boat_houseboat_rental_yes">Кућни бродови: да</string>
|
||||
<string name="poi_boat_motorboat_rental_no">Моторни бродови: не</string>
|
||||
<string name="poi_boat_motorboat_rental_yes">Моторни бродови: да</string>
|
||||
<string name="poi_animal_keeping_type_paddock">Тип: ограђен део</string>
|
||||
<string name="poi_animal_keeping_sheep">Чување животиња: овца</string>
|
||||
<string name="poi_animal_keeping_horse">Чување животиња: коњ</string>
|
||||
<string name="poi_animal_keeping">Чување животиња</string>
|
||||
<string name="poi_cliff">Литица</string>
|
||||
<string name="poi_photo_studio">Фото студио</string>
|
||||
<string name="poi_nutrition_supplements">Додаци исхрани</string>
|
||||
<string name="poi_locomotive">Локомотива</string>
|
||||
<string name="poi_e_cigarette">Продавница електронских цигарета</string>
|
||||
<string name="poi_gambling_bingo">Бинго</string>
|
||||
<string name="poi_gambling_betting">Клађење</string>
|
||||
<string name="poi_gambling_slot_machines">Слот машине</string>
|
||||
<string name="poi_gambling_pachinko">Пацинко</string>
|
||||
<string name="poi_gambling_lottery">Лутрија</string>
|
||||
<string name="poi_gambling_type">Врста</string>
|
||||
<string name="poi_gambling">Место коцкања</string>
|
||||
<string name="poi_lottery">Лото срећке</string>
|
||||
<string name="poi_lighting">Опрема за расвету</string>
|
||||
<string name="poi_locksmith">Браварска продавница</string>
|
||||
<string name="poi_electrical">Електро продавница</string>
|
||||
<string name="poi_party">Намирнице за забаву</string>
|
||||
<string name="poi_feeding_place">Место за исхрану животиња</string>
|
||||
<string name="poi_cuisine_cantonese">Кантонска</string>
|
||||
<string name="poi_cuisine_pastel">Пастел</string>
|
||||
<string name="poi_cuisine_sub">Суб</string>
|
||||
<string name="poi_cuisine_sagardotegia">Сагардотегиа</string>
|
||||
<string name="poi_cuisine_bubble_tea">Чај са мехурићима</string>
|
||||
<string name="poi_cuisine_brasserie">Брасери</string>
|
||||
<string name="poi_cuisine_empanada">Емпанада</string>
|
||||
<string name="poi_cuisine_snack">Предјело</string>
|
||||
<string name="poi_cuisine_piadina">Пиадина</string>
|
||||
<string name="poi_cuisine_canteen">Кантина</string>
|
||||
<string name="poi_cuisine_savory_pancakes">Слане палачинке</string>
|
||||
<string name="poi_cuisine_frozen_yogurt">Замрзнути јогурт</string>
|
||||
<string name="poi_cuisine_deli">Деликатеси</string>
|
||||
<string name="poi_cuisine_fine_dining">Фина јела</string>
|
||||
<string name="poi_cuisine_soba">Соба</string>
|
||||
<string name="poi_cuisine_bagel">Багел</string>
|
||||
<string name="poi_cuisine_heuriger">Хеуригер</string>
|
||||
<string name="poi_cuisine_gastropub">Гастропуб</string>
|
||||
<string name="poi_cuisine_beef_bowl">Гиудон</string>
|
||||
<string name="poi_cuisine_fish_and_chips">Риба и помфрит</string>
|
||||
<string name="poi_public_bookcase_type_metal_cabinet">Тип: метални орман</string>
|
||||
<string name="poi_public_bookcase_type_wooden_cabinet">Тип: дрвени ормар</string>
|
||||
<string name="poi_public_bookcase_type_reading_box">Тип: кутија за читање</string>
|
||||
<string name="poi_public_bookcase_type_phone_box">Тип: телефонска кутија</string>
|
||||
<string name="poi_public_bookcase">Јавна полица за књиге</string>
|
||||
<string name="poi_xmas_url">Божић: вебсајт</string>
|
||||
<string name="poi_xmas_location">Божић: локација</string>
|
||||
<string name="poi_xmas_opening_hours">Божић: радно време</string>
|
||||
<string name="poi_xmas_note">Божић: белешка</string>
|
||||
<string name="poi_xmas_day_date">Божић: период догађаја</string>
|
||||
<string name="poi_xmas_tree">Јелка</string>
|
||||
<string name="poi_xmas_shop_christmas_tree">Продавница дрвећа</string>
|
||||
<string name="poi_xmas_shop">Божићна радња</string>
|
||||
<string name="poi_xmas_pyramid">Божићна пирамида</string>
|
||||
<string name="poi_xmas_market">Божићно тржиште</string>
|
||||
<string name="poi_xmas_event">Божићни догађај</string>
|
||||
<string name="poi_xmas">Божић</string>
|
||||
<string name="poi_wiki_link">Википедија</string>
|
||||
<string name="poi_length">Дужина</string>
|
||||
<string name="poi_toilets_disposal_bucket">Одлагање тоалета: кантом</string>
|
||||
<string name="poi_toilets_disposal_chemical">Одлагање тоалета: хемијско</string>
|
||||
<string name="poi_toilets_disposal_pitlatrine">Одлагање тоалета: питлатрине</string>
|
||||
<string name="poi_toilets_disposal_flush">Одлагање тоалета: испирање</string>
|
||||
<string name="poi_water_tank">Резервоар за воду</string>
|
||||
<string name="poi_fire_operator">Противпожарни оператор</string>
|
||||
<string name="poi_diplomatic_high_commission">Висока комисија</string>
|
||||
<string name="poi_diplomatic_ambassadors_residence">Резиденција амбасадора</string>
|
||||
<string name="poi_diplomatic_delegation">Делегација</string>
|
||||
<string name="poi_diplomatic_permanent_mission">Стална мисија</string>
|
||||
<string name="poi_diplomatic_honorary_consulate">Почасни конзулат</string>
|
||||
<string name="poi_diplomatic_consulate_general">Генерални конзулат</string>
|
||||
<string name="poi_diplomatic_consulate">Конзулат</string>
|
||||
<string name="poi_traffic_mirror">Саобраћајно огледало</string>
|
||||
<string name="poi_organic_only">Једино</string>
|
||||
<string name="poi_organic_no">Не</string>
|
||||
<string name="poi_organic_yes">Да</string>
|
||||
<string name="poi_min_age">Минимална старост</string>
|
||||
<string name="poi_mdf">Главни дистрибуциони оквир</string>
|
||||
<string name="poi_aquaculture_mussels">Аквакултура: дагње</string>
|
||||
<string name="poi_aquaculture_fish">Аквакултура: риба</string>
|
||||
<string name="poi_aquaculture_shrimp">Аквакултура: шкампи</string>
|
||||
<string name="poi_aquaculture">Аквакултура</string>
|
||||
<string name="poi_passenger_information_display_no">Приказ информација путницима: не</string>
|
||||
<string name="poi_passenger_information_display_yes">Приказ информација путницима: да</string>
|
||||
<string name="poi_support_tower">Подршка: кула</string>
|
||||
<string name="poi_support_roof">Подршка: кров</string>
|
||||
<string name="poi_support_suspended">Подршка: носеће</string>
|
||||
<string name="poi_support_ceiling">Подршка: плафон</string>
|
||||
<string name="poi_support_billboard">Подршка: билбord</string>
|
||||
<string name="poi_support_ground">Подршка: земља</string>
|
||||
<string name="poi_support_pedestal">Подршка: постоље</string>
|
||||
<string name="poi_support_tree">Подршка: дрво</string>
|
||||
<string name="poi_support_wall_mounted">Подршка: зид</string>
|
||||
<string name="poi_support_pole">Подршка: стуб</string>
|
||||
<string name="poi_date_no">Приказ датума: не</string>
|
||||
<string name="poi_date_yes">Приказ датума</string>
|
||||
<string name="poi_hygrometer_no">Хигрометар: не</string>
|
||||
<string name="poi_capacity_beds">Капацитет (кревета)</string>
|
||||
<string name="poi_hygrometer_yes">ХигрометарHygrometer</string>
|
||||
<string name="poi_thermometer_no">Термометар: не</string>
|
||||
<string name="poi_thermometer_yes">Термометар</string>
|
||||
<string name="poi_display_sundial_yes">Сунчани сат</string>
|
||||
<string name="poi_display_digital_yes">Дигитални екран</string>
|
||||
<string name="poi_display_analog_yes">Аналогни екран</string>
|
||||
<string name="poi_pumping_station">Пумпна станица</string>
|
||||
<string name="poi_display_no">Екран: не</string>
|
||||
<string name="poi_display_yes">Екран: да</string>
|
||||
<string name="poi_generator_output_biogas_yes">Излаз: биогас</string>
|
||||
<string name="poi_generator_output_biogas">Излазна снага биогаса</string>
|
||||
<string name="poi_generator_output_vacuum_yes">Излаз: вакуум</string>
|
||||
<string name="poi_generator_output_compressed_air_yes">Излаз: компримовани ваздух</string>
|
||||
<string name="poi_generator_output_cold_water_yes">Излаз: хладна вода</string>
|
||||
<string name="poi_generator_output_hot_air_yes">Излаз: врућ ваздух</string>
|
||||
<string name="poi_generator_output_steam_yes">Излаз: пара</string>
|
||||
<string name="poi_generator_output_hot_water_yes">Излаз: топла вода</string>
|
||||
<string name="poi_generator_output_electricity_no">Излаз (струја): не</string>
|
||||
<string name="poi_generator_output_electricity_yes">Излаз: струја</string>
|
||||
<string name="poi_voltage">Напон</string>
|
||||
<string name="poi_greenhouse_horticulture">Стакленичка хортикултура</string>
|
||||
<string name="poi_observatory_type_gravitational">Гравитациона</string>
|
||||
<string name="poi_observatory_type_meteorological">Метеоролошка</string>
|
||||
<string name="poi_observatory_type_espionage">Употреба: шпијунажа</string>
|
||||
<string name="poi_telescope_usage_research">Употреба: истраживање</string>
|
||||
<string name="poi_telescope_usage_espionage">Употреба: шпијунажа</string>
|
||||
<string name="poi_telescope_usage_education">Употреба: образовање</string>
|
||||
<string name="poi_telescope_spectrum">Спектар</string>
|
||||
<string name="poi_telescope_diameter">Пречник</string>
|
||||
<string name="poi_telescope_type_gamma">Гама</string>
|
||||
<string name="poi_telescope_type_radio">Радио</string>
|
||||
<string name="poi_telescope_type_optical">Оптички</string>
|
||||
<string name="poi_telescope">Телескоп</string>
|
||||
<string name="poi_payment_troika_no">Картица \"Тројка\" се не прихвата</string>
|
||||
<string name="poi_payment_troika_yes">Тројка</string>
|
||||
<string name="poi_pump_status_locked">Статус пумпе: закључана</string>
|
||||
<string name="poi_pump_status_broken">Статус пумпе: поломљена</string>
|
||||
<string name="poi_pump_status_ok">Статус пумпе: у реду</string>
|
||||
<string name="poi_pump_style_historic">Стил пумпе: историјски</string>
|
||||
<string name="poi_pump_style_modern">Стил пумпе: модеран</string>
|
||||
<string name="poi_pump_type_gravity">Тип пумпе: гравитациона</string>
|
||||
<string name="poi_pump_type_india_mk_2_3">Тип пумпе: Индија Мк II или III></string>
|
||||
<string name="poi_pump_type_beam_pump">Тип пумпе: пумпа снопа</string>
|
||||
<string name="poi_ventilation_shaft">Вентилациони отвор</string>
|
||||
<string name="poi_valley_balka">Балка</string>
|
||||
<string name="poi_aerodrome_type_private">Приватни</string>
|
||||
<string name="poi_aerodrome_type_public">Јавни</string>
|
||||
<string name="poi_aerodrome_type_regional">Регионални</string>
|
||||
<string name="poi_aerodrome_type_international">Међународни</string>
|
||||
<string name="poi_dispensing_no">Испорука: не</string>
|
||||
<string name="poi_dispensing_yes">Да</string>
|
||||
<string name="poi_crossing_supervision_camera">Надзор прелаза: камера</string>
|
||||
<string name="poi_crossing_supervision_attendant">Надзор прелаза: полазник</string>
|
||||
<string name="poi_crossing_supervision_no">Надзор прелаза: не</string>
|
||||
<string name="poi_crossing_supervision_yes">Надзор прелаза</string>
|
||||
<string name="poi_crossing_saltire_no">Прелазни салтир: не</string>
|
||||
<string name="poi_crossing_saltire_yes">Прелазни салтир</string>
|
||||
<string name="poi_crossing_on_demand_no">Прелаз на захтев: не</string>
|
||||
<string name="poi_crossing_on_demand_yes">Прелаз на захтев</string>
|
||||
<string name="poi_crossing_light_no">Прелазно светло: не</string>
|
||||
<string name="poi_crossing_light_yes">Прелазно светло</string>
|
||||
<string name="poi_crossing_bell_no">Прелазно звоно: не</string>
|
||||
<string name="poi_crossing_bell_yes">Прелазно звоно</string>
|
||||
<string name="poi_crossing_barrier_double_half">Прелазна баријера: дупло половична</string>
|
||||
<string name="poi_crossing_barrier_half">Прелазна баријера: половична</string>
|
||||
<string name="poi_crossing_barrier_full">Прелазна баријера: пуна</string>
|
||||
<string name="poi_crossing_barrier_yes">Прелазна баријера</string>
|
||||
<string name="poi_crossing_barrier_no">Прелазна баријера: не</string>
|
||||
<string name="poi_crossing_activation_remote">Активирање прелаза: даљинско</string>
|
||||
<string name="poi_crossing_activation_local">Активирање прелаза: локално</string>
|
||||
<string name="poi_crossing_activation_automatic">Активирање прелаза: аутоматско</string>
|
||||
<string name="poi_recreation_center">Рекреациони центар</string>
|
||||
<string name="poi_summer_camp">Летњи камп</string>
|
||||
<string name="poi_spoil_heap">Покварена гомила</string>
|
||||
<string name="poi_wheelchair_designated">Одређено</string>
|
||||
<string name="poi_salt_no">Со: не</string>
|
||||
<string name="poi_salt_yes">Со</string>
|
||||
<string name="poi_depth">Дубина</string>
|
||||
<string name="poi_bicycle_parking_streetpod">Улично постоље</string>
|
||||
<string name="poi_bicycle_parking_tree">Бицикл дрво</string>
|
||||
<string name="poi_bicycle_parking_lockers">Ормарићи</string>
|
||||
<string name="poi_military_checkpoint">Војни контролни пункт</string>
|
||||
<string name="poi_street_cabinet_street_lighting">Тип кабинета: улична расвета</string>
|
||||
<string name="poi_street_cabinet_water_management">Тип кабинета: водоводни</string>
|
||||
<string name="poi_street_cabinet_waste">Тип кабинета: отпади</string>
|
||||
<string name="poi_street_cabinet_postal_service">Тип кабинета: поштански</string>
|
||||
<string name="poi_street_cabinet_gas">Тип кабинета: гасни</string>
|
||||
<string name="poi_street_cabinet_cable_tv">Тип кабинета: кабловска телевизија</string>
|
||||
<string name="poi_street_cabinet_telecom">Тип кабинета: телекомски</string>
|
||||
<string name="poi_street_cabinet_power">Тип кабинета: енергетски</string>
|
||||
<string name="poi_in_service_yes">У употреби: да</string>
|
||||
<string name="poi_fire_hydrant_style_water_source_cistern">Цистерна</string>
|
||||
<string name="poi_fire_hydrant_style_water_source_stream">Ток</string>
|
||||
<string name="poi_fire_hydrant_style_water_source_pond">Понд</string>
|
||||
<string name="poi_fire_hydrant_style_water_source_main">Главни</string>
|
||||
<string name="poi_fire_hydrant_style_wsh">Стил хидранта: wsh</string>
|
||||
<string name="poi_fire_hydrant_position_underground">Подземни</string>
|
||||
<string name="poi_fire_hydrant_position_street">Улица</string>
|
||||
<string name="poi_fire_hydrant_position_parking_lot">Паркинг</string>
|
||||
<string name="poi_fire_hydrant_position_lane">Трака</string>
|
||||
<string name="poi_fire_hydrant_position_green">Зелена</string>
|
||||
<string name="poi_fire_hydrant_position_sidewalk">Тротоар</string>
|
||||
<string name="poi_fire_hydrant_flow_capacity">Капацитет протока хидранта</string>
|
||||
<string name="poi_fire_hydrant_count">Број хидранта</string>
|
||||
<string name="poi_fire_hydrant_pressure">Притисак хидранта</string>
|
||||
<string name="poi_fire_hydrant_diameter">Пречник хидранта</string>
|
||||
<string name="poi_office_midwife">Канцеларија бабице</string>
|
||||
<string name="poi_office_nursing_service">Услуга неге</string>
|
||||
<string name="poi_office_psychologist">Канцеларија психолога</string>
|
||||
<string name="poi_office_healer">Канцеларија исцелитеља</string>
|
||||
<string name="poi_office_podologist">Канцеларија подолога</string>
|
||||
<string name="poi_office_therapist">Канцеларија терапеута</string>
|
||||
<string name="poi_office_physician">Лекарска ординација</string>
|
||||
<string name="poi_disease_aids_no">СИДА: не</string>
|
||||
<string name="poi_disease_aids_yes">СИДА: да</string>
|
||||
<string name="poi_disease_autism_no">Аутизам: не</string>
|
||||
<string name="poi_disease_autism_yes">Аутизам: да</string>
|
||||
<string name="poi_disease_ebola_no">Ебола: не</string>
|
||||
<string name="poi_disease_ebola_yes">Ебола: да</string>
|
||||
<string name="poi_disease_malaria_no">Маларија: не</string>
|
||||
<string name="poi_disease_malaria_yes">Маларија: да</string>
|
||||
<string name="poi_home_visit_no">Кућна посета: не</string>
|
||||
<string name="poi_home_visit_yes">Да</string>
|
||||
<string name="poi_emergency_no">Хитна: не</string>
|
||||
<string name="poi_emergency_yes">Хитна: да</string>
|
||||
<string name="poi_counselling_no">Саветовање: не</string>
|
||||
<string name="poi_counselling_yes">Саветовање: да</string>
|
||||
<string name="poi_treat_inpatient_only">Болничке услуге: само</string>
|
||||
<string name="poi_treat_inpatient_no">Болничке услуге: не</string>
|
||||
<string name="poi_treat_inpatient_yes">Болничке услуге: да</string>
|
||||
<string name="poi_provided_for_boy_no">Предвиђено за дечаке: не</string>
|
||||
<string name="poi_provided_for_boy_yes">Предвиђено за дечаке: да</string>
|
||||
<string name="poi_provided_for_man_no">Предвиђено за мушкарце: не</string>
|
||||
<string name="poi_provided_for_man_yes">Предвиђено за мушкарце: да</string>
|
||||
<string name="poi_provided_for_girl_no">Предвиђено за девојке: не</string>
|
||||
<string name="poi_provided_for_girl_yes">Предвиђено за девојке: да</string>
|
||||
<string name="poi_provided_for_senior_no">Предвиђено за старије особе: не</string>
|
||||
<string name="poi_provided_for_senior_yes">Предвиђено за старије особе: да</string>
|
||||
<string name="poi_provided_for_woman_no">Предвиђено за жене: не</string>
|
||||
<string name="poi_provided_for_woman_yes">Предвиђено за жене: да</string>
|
||||
<string name="poi_provided_for_adult_no">Предвиђено за одрасле: не</string>
|
||||
<string name="poi_provided_for_adult_yes">Предвиђено за одрасле: да</string>
|
||||
<string name="poi_provided_for_child_no">Предвиђено за децу: не</string>
|
||||
<string name="poi_provided_for_child_yes">Предвиђено за децу: да</string>
|
||||
<string name="poi_provided_for_toddler_no">Предвиђено за малишане: не</string>
|
||||
<string name="poi_provided_for_toddler_yes">Предвиђено за малишане: да</string>
|
||||
<string name="poi_provided_for_infant_no">Предвиђено за новорођенчад: не</string>
|
||||
<string name="poi_provided_for_infant_yes">Предвиђено за новорођенчад: да</string>
|
||||
<string name="poi_counselling_type_violence_no">Саветовање (насиље): не</string>
|
||||
<string name="poi_counselling_type_violence_yes">Саветовање (насиље): да</string>
|
||||
<string name="poi_counselling_type_victim_no">Саветовање (жртве): не</string>
|
||||
<string name="poi_counselling_type_victim_yes">Саветовање (жртве): да</string>
|
||||
<string name="poi_counselling_type_sexual_abuse_no">Саветовање (сексуално злостављање): не</string>
|
||||
<string name="poi_counselling_type_sexual_abuse_yes">Саветовање (сексуално злостављање): да</string>
|
||||
<string name="poi_counselling_type_sexual_no">Саветовање (сексуално): не</string>
|
||||
<string name="poi_counselling_type_sexual_yes">Саветовање (сексуално): да</string>
|
||||
<string name="poi_counselling_type_rehabilitation_no">Саветовање (рехабилитација): не</string>
|
||||
<string name="poi_counselling_type_rehabilitation_yes">Саветовање (рехабилитација): да</string>
|
||||
<string name="poi_counselling_type_nutrition_nfire_hydo">Саветовање (исхрана): не</string>
|
||||
<string name="poi_counselling_type_nutrition_yes">Саветовање (исхрана): да</string>
|
||||
<string name="poi_atoll">Атол</string>
|
||||
<string name="poi_blood_donation">Донација крви</string>
|
||||
<string name="poi_laboratory">Медицинска лабораторија</string>
|
||||
<string name="poi_shop_wholesale">Велепродаја</string>
|
||||
<string name="poi_craft_confectionery">Производња кондиторских производа</string>
|
||||
<string name="poi_substation_field_gathering">Теренско прикупљање</string>
|
||||
<string name="poi_substation_inspection_gauge">Уређај инспекције</string>
|
||||
<string name="poi_substation_valve_group">Вентилски групна</string>
|
||||
<string name="poi_substation_valve">Вентилска</string>
|
||||
<string name="poi_substation_measurement">Мерна</string>
|
||||
<string name="poi_substation_compression">Компресиона</string>
|
||||
<string name="poi_substation_compensation">Компензациона</string>
|
||||
<string name="poi_substation_converter">Претварачка</string>
|
||||
<string name="poi_substation_traction">Вучна</string>
|
||||
<string name="poi_substation_transition">Прелазна</string>
|
||||
<string name="poi_substation_industrial">Индустријска</string>
|
||||
<string name="poi_substation_minor_distribution">Мања дистрибуциона</string>
|
||||
<string name="poi_substation_distribution">Дистрибуциона</string>
|
||||
<string name="poi_substation_transmission">Преносна</string>
|
||||
<string name="poi_pipeline_substation">Цевоводна подстаница</string>
|
||||
<string name="poi_bulk_purchase_only">Једино</string>
|
||||
<string name="poi_bulk_purchase_yes">Да</string>
|
||||
<string name="poi_shoe_repair">Поправка обуће</string>
|
||||
<string name="poi_hill">Брдо</string>
|
||||
<string name="poi_license_classes">Лиценцни часови</string>
|
||||
<string name="poi_ruins">Рушевине</string>
|
||||
<string name="poi_hazard_minefield">Минско поље</string>
|
||||
<string name="poi_hazard_flood">Опасност од поплаве</string>
|
||||
<string name="poi_hazard_slippery_road">Клизав пут</string>
|
||||
<string name="poi_hazard_avalanche">Опасност од лавине</string>
|
||||
<string name="poi_hazard_erosion">Опасност од ерозије</string>
|
||||
<string name="poi_hazard_nuclear">Нуклеарна опасност</string>
|
||||
<string name="poi_hazard">Опасност</string>
|
||||
<string name="poi_payment_contactless_no">Бесконтактно не прихвата се</string>
|
||||
<string name="poi_payment_contactless_yes">Бесконтактно</string>
|
||||
<string name="poi_outcrop">Нагла појава</string>
|
||||
<string name="poi_appliance">Продавница апарата</string>
|
||||
<string name="poi_end_date">Крајњи датум</string>
|
||||
<string name="poi_rock">Стена</string>
|
||||
<string name="poi_course">Курс</string>
|
||||
<string name="poi_checkpoint_type_electronic">Електронски</string>
|
||||
<string name="poi_checkpoint_type_needler">Инјектор</string>
|
||||
<string name="poi_checkpoint_type_code">Код</string>
|
||||
<string name="poi_checkpoint_type_stamp">Тачка уреза</string>
|
||||
<string name="poi_checkpoint_hiking">Пешачка контролна тачка</string>
|
||||
<string name="poi_glacier_slope">Просечан нагиб</string>
|
||||
<string name="poi_glacier_ele_bottom">Најнижа тачка</string>
|
||||
<string name="poi_glacier_ele_top">Највиша тачка</string>
|
||||
<string name="poi_glacier_type_ice_tongue">Ледени језик</string>
|
||||
<string name="poi_glacier_type_remnant">Остатак</string>
|
||||
<string name="poi_glacier_type_shelf">Полица</string>
|
||||
<string name="poi_glacier_type_rock">Стена</string>
|
||||
<string name="poi_glacier_type_icefall">Ледопад</string>
|
||||
<string name="poi_glacier_type_hanging">Висећи</string>
|
||||
<string name="poi_glacier_type_mountain">Планински</string>
|
||||
<string name="poi_glacier_type_tidewater">Плимски</string>
|
||||
<string name="poi_glacier_type_outlet">Излазни</string>
|
||||
<string name="poi_glacier_type_valley">Долина</string>
|
||||
<string name="poi_glacier_type_plateau">Плато</string>
|
||||
<string name="poi_glacier_type_icefield">Ледено поље</string>
|
||||
<string name="poi_glacier_type_icecap">Ледена капа</string>
|
||||
<string name="poi_via_ferrata_scale">Тежина</string>
|
||||
<string name="poi_cable_number">Број кабла</string>
|
||||
<string name="poi_via_ferrata">Виа ферата</string>
|
||||
<string name="poi_climbing_adventure">Авантура пењања</string>
|
||||
<string name="poi_aerialway_zip_line">Зип линија</string>
|
||||
<string name="poi_service_vehicle_tyres_yes">Гуме</string>
|
||||
<string name="poi_service_vehicle_insurance_yes">Осигурање</string>
|
||||
<string name="poi_service_vehicle_motor_yes">Мотор</string>
|
||||
<string name="poi_service_vehicle_transmission_repair_yes">Поправка трансмисије</string>
|
||||
<string name="poi_service_vehicle_alignment_yes">Реглажа</string>
|
||||
<string name="poi_service_vehicle_muffler_yes">Пригушивач</string>
|
||||
<string name="poi_service_vehicle_truck_repair_yes">Поправка камиона</string>
|
||||
<string name="poi_service_vehicle_glass_yes">Стакло</string>
|
||||
<string name="poi_service_vehicle_wheels_yes">Точкови</string>
|
||||
<string name="poi_service_vehicle_electrical_yes">Електрика</string>
|
||||
<string name="poi_service_vehicle_body_repair_yes">Поправка каросерије</string>
|
||||
<string name="poi_service_vehicle_air_conditioning_yes">Клима уређај</string>
|
||||
<string name="poi_service_vehicle_batteries_yes">Батерије</string>
|
||||
<string name="poi_service_vehicle_car_parts_yes">Ауто делови</string>
|
||||
<string name="poi_service_vehicle_diagnostics_yes">Дијагностика</string>
|
||||
<string name="poi_service_vehicle_new_car_sales_yes">Продаја нових аутомобила</string>
|
||||
<string name="poi_service_vehicle_brakes_yes">Кочнице</string>
|
||||
<string name="poi_service_vehicle_used_car_sales_yes">Продаја половних аутомобила</string>
|
||||
<string name="poi_service_vehicle_oil_change_yes">Промена уља</string>
|
||||
<string name="poi_service_vehicle_car_repair_yes">Ауто сервис</string>
|
||||
<string name="poi_adult_gaming_centre">Играчки центар за одрасле</string>
|
||||
<string name="poi_amusement_arcade">Забавна аркадна игра</string>
|
||||
<string name="poi_water_utility">Канцеларија за водоснабдевање</string>
|
||||
<string name="poi_outpost">Место испоруке продавнице</string>
|
||||
<string name="poi_whitewater_rapid_name">Име речних брзака</string>
|
||||
<string name="poi_pottery">Керамика</string>
|
||||
<string name="poi_flooring">Продавница подова</string>
|
||||
<string name="poi_socket_schuko_output_low">Низак</string>
|
||||
<string name="poi_socket_schuko_output_medium">Средњи</string>
|
||||
<string name="poi_socket_schuko_output_high">Висок</string>
|
||||
<string name="poi_socket_cee_blue_output_low">Низак</string>
|
||||
<string name="poi_socket_cee_blue_output_medium">Средњи</string>
|
||||
<string name="poi_socket_cee_blue_output_high">Висок</string>
|
||||
<string name="poi_socket_type3_output_low">Низак</string>
|
||||
<string name="poi_socket_type3_output_medium">Средњи</string>
|
||||
<string name="poi_socket_type3_output_high">Висок</string>
|
||||
<string name="poi_socket_type2_combo_output_low">Низак</string>
|
||||
<string name="poi_socket_type2_combo_output_medium">Средњи</string>
|
||||
<string name="poi_socket_type2_combo_output_high">Висок</string>
|
||||
<string name="poi_socket_type2_output_low">Низак</string>
|
||||
<string name="poi_socket_type2_output_medium">Средњи</string>
|
||||
<string name="poi_socket_type2_output_high">Висок</string>
|
||||
<string name="poi_socket_chademo_output_low">Низак</string>
|
||||
<string name="poi_socket_chademo_output_medium">Средњи</string>
|
||||
<string name="poi_socket_chademo_output_high">Висок</string>
|
||||
<string name="poi_socket_as3112_yes">АС / НЗС 3112</string>
|
||||
<string name="poi_socket_bs1363_yes">БС 1363</string>
|
||||
<string name="poi_socket_schuko_yes">Шуко</string>
|
||||
<string name="poi_socket_nema_14_50_yes">НЕМА 14-30</string>
|
||||
<string name="poi_socket_nema_14_30_yes">НЕМА 14-30</string>
|
||||
<string name="poi_socket_nema_5_20_yes">НЕМА 5-20</string>
|
||||
<string name="poi_socket_nema_5_15_yes">НЕМА 5-15Р</string>
|
||||
<string name="poi_socket_tesla_roadster_yes">Тесла Роудстер</string>
|
||||
<string name="poi_socket_tesla_supercharger_yes">Тесла Суперпуњач</string>
|
||||
<string name="poi_socket_tesla_standard_yes">Тесла стандард</string>
|
||||
<string name="poi_socket_chademo_yes">CHAdeMO</string>
|
||||
<string name="poi_socket_type3_yes">Тип 3</string>
|
||||
<string name="poi_socket_type2_combo_yes">Тип 2 комбо</string>
|
||||
<string name="poi_socket_type2_yes">Тип 2</string>
|
||||
<string name="poi_socket_type1_combo_yes">Тип 1 комбо</string>
|
||||
<string name="poi_socket_type1_yes">Тип 1</string>
|
||||
<string name="poi_socket_cee_red_125a_yes">ЦЕЕ црвена 125А</string>
|
||||
<string name="poi_socket_cee_red_64a_yes">ЦЕЕ црвена 64А</string>
|
||||
<string name="poi_socket_cee_red_32a_yes">ЦЕЕ црвена 32А</string>
|
||||
<string name="poi_socket_cee_red_16a_yes">ЦЕЕ црвена 16А</string>
|
||||
<string name="poi_socket_cee_blue_yes">ЦЕЕ плава</string>
|
||||
<string name="poi_cannabis">Продавница канабиса</string>
|
||||
<string name="poi_shop_boat">Продавница чамаца</string>
|
||||
<string name="poi_shop_fireplace">Продавница камина</string>
|
||||
<string name="poi_frozen_food">Замрзнута храна</string>
|
||||
<string name="poi_meadow_pasture">Тип: пашњак</string>
|
||||
<string name="poi_meadow_perpetual">Тип: трајна</string>
|
||||
<string name="poi_meadow_transitional">Тип: прелазна</string>
|
||||
<string name="poi_diameter_crown">Пречник круне</string>
|
||||
<string name="poi_circumference">Обим</string>
|
||||
<string name="poi_climbing_routes">Пењачке руте</string>
|
||||
<string name="poi_climbing_summit_log_no">Дневник врха пењања: не</string>
|
||||
<string name="poi_climbing_summit_log_yes">Дневник врха пењања: да</string>
|
||||
<string name="poi_climbing_orientation_nw">Оријентација зида: СЗ</string>
|
||||
<string name="poi_climbing_orientation_w">Оријентација зида: З</string>
|
||||
<string name="poi_climbing_orientation_sw">Оријентација зида: ЈЗ</string>
|
||||
<string name="poi_climbing_orientation_s">Оријентација зида: Ј</string>
|
||||
<string name="poi_climbing_orientation_se">Оријентација зида: ЈИ</string>
|
||||
<string name="poi_climbing_orientation_e">Оријентација зида: И</string>
|
||||
<string name="poi_climbing_orientation_ne">Оријентација зида: СИ</string>
|
||||
<string name="poi_climbing_orientation_n">Оријентација зида: С</string>
|
||||
<string name="poi_climbing_bolted_no">Фиксна сидра: не</string>
|
||||
<string name="poi_climbing_bolted_yes">Фиксна сидра: да</string>
|
||||
<string name="poi_climbing_quality_fragile">Квалитет пењања: крх</string>
|
||||
<string name="poi_climbing_quality_solid">Квалитет пењања: чврст</string>
|
||||
<string name="poi_climbing_rock_porphyry">Стена за пењање: порфир</string>
|
||||
<string name="poi_climbing_rock_gneiss">Стена за пењање: гнеисс</string>
|
||||
<string name="poi_climbing_rock_quartzite">Стена за пењање: кварцит</string>
|
||||
<string name="poi_climbing_rock_sandstone">Стена за пењање: пешчењак</string>
|
||||
<string name="poi_climbing_rock_granite">Пењање на камен: гранит</string>
|
||||
<string name="poi_climbing_rock_limestone">Стена за пењање: кречњак</string>
|
||||
<string name="poi_climbing_length_max">Максимална дужина пењања</string>
|
||||
<string name="poi_climbing_length_min">Минимална дужина пењања</string>
|
||||
<string name="poi_climbing_length">Дужина пењања</string>
|
||||
<string name="poi_climbing_deepwater_no">Соло у дубљим водама: не</string>
|
||||
<string name="poi_climbing_deepwater_yes">Соло у дубљим водама: да</string>
|
||||
<string name="poi_climbing_mixed_no">Мешовито: не</string>
|
||||
<string name="poi_climbing_mixed_yes">Мешовито: да</string>
|
||||
<string name="poi_climbing_ice_no">Лед: не</string>
|
||||
<string name="poi_climbing_ice_yes">Лед: да</string>
|
||||
<string name="poi_climbing_multipitch_no">Руте на више тачака: не</string>
|
||||
<string name="poi_climbing_multipitch_yes">Руте са више тачака: да</string>
|
||||
<string name="poi_climbing_trad_no">Традиционално: не</string>
|
||||
<string name="poi_climbing_trad_yes">Традиционално: да</string>
|
||||
<string name="poi_climbing_toprope_no">Горње уже: не</string>
|
||||
<string name="poi_climbing_toprope_yes">Горње уже: да</string>
|
||||
<string name="poi_climbing_boulder_no">Балванирање: не</string>
|
||||
<string name="poi_climbing_boulder_yes">Балванирање: да</string>
|
||||
<string name="poi_climbing_sport_no">Спорт: не</string>
|
||||
<string name="poi_climbing_sport_yes">Спорт: да</string>
|
||||
<string name="poi_ref_post">Поштански број</string>
|
||||
<string name="poi_money_transfer">Трансфер новца</string>
|
||||
<string name="poi_payment_centre">Центар плаћања</string>
|
||||
<string name="poi_post_flats">Стан</string>
|
||||
<string name="poi_post_housenumber">Кућни број</string>
|
||||
<string name="poi_post_street">Улица</string>
|
||||
<string name="poi_letter_box">Кутија писма</string>
|
||||
<string name="poi_depot">Депо</string>
|
||||
<string name="poi_charging_station">Станица пуњење</string>
|
||||
<string name="poi_map_size_region">Величина мапе: регија</string>
|
||||
<string name="poi_map_size_city">Величина мапе: град</string>
|
||||
<string name="poi_map_size_site">Величина мапе: сајт</string>
|
||||
<string name="poi_map_type_toposcope">Тип мапе: топоскопска</string>
|
||||
<string name="poi_map_type_scheme">Тип мапе: шема</string>
|
||||
<string name="poi_map_type_street">Врста мапе: улична</string>
|
||||
<string name="poi_map_type_topo">Врста мапе: топо</string>
|
||||
<string name="poi_charging_station_output">Излаз станице пуњења</string>
|
||||
<string name="poi_amperage">Ампеража</string>
|
||||
<string name="poi_parking_fee">Цена паркирања</string>
|
||||
<string name="poi_parking_fee_no">Цена паркирања: не</string>
|
||||
<string name="poi_parking_fee_yes">Цена паркирања: да</string>
|
||||
<string name="poi_truck_no">Камион: не</string>
|
||||
<string name="poi_truck_yes">Камион: да</string>
|
||||
<string name="poi_scooter_no">Скутер: не</string>
|
||||
<string name="poi_scooter_yes">Скутер: да</string>
|
||||
<string name="poi_bicycle_no">Бицикл: не</string>
|
||||
<string name="poi_bicycle_yes">Бицикл: да</string>
|
||||
<string name="poi_car_no">Аутомобил: не</string>
|
||||
<string name="poi_car_yes">Аутомобил: да</string>
|
||||
<string name="poi_socket_as3112_output">Утичница: АС / НЗС 3112: излаз</string>
|
||||
<string name="poi_socket_as3112_current">Утичница: АС / НЗС 3112: струја</string>
|
||||
<string name="poi_socket_as3112">Утичница: АС / НЗС 3112</string>
|
||||
<string name="poi_socket_bs1363_output">Утичница: БС 1363: излаз</string>
|
||||
<string name="poi_socket_bs1363_current">Утичница: БС 1363: струја</string>
|
||||
<string name="poi_socket_bs1363">Утичница: БС 1363</string>
|
||||
<string name="poi_socket_schuko_output">Утичница: Шуко: излаз</string>
|
||||
<string name="poi_socket_schuko_current">Утичница: Шуко: струја</string>
|
||||
<string name="poi_socket_schuko">Утичница: Шуко</string>
|
||||
<string name="poi_socket_nema_14_50_output">Утичница: НЕМА 14-50: излаз</string>
|
||||
<string name="poi_socket_nema_14_50_current">Утичница: НЕМА 14-50: струја</string>
|
||||
<string name="poi_socket_nema_14_50">Утичница: НЕМА 14-50</string>
|
||||
<string name="poi_socket_nema_14_30_output">Утичница: НЕМА 14-30: излаз</string>
|
||||
<string name="poi_socket_nema_14_30_current">Утичница: НЕМА 14-30: струја</string>
|
||||
<string name="poi_socket_nema_14_30">Утичница: НЕМА 14-30</string>
|
||||
<string name="poi_socket_nema_5_20_output">Утичница: НЕМА 5-20: излаз</string>
|
||||
<string name="poi_socket_nema_5_20_current">Утичница: НЕМА 5-20: струја</string>
|
||||
<string name="poi_socket_nema_5_20">Утичница: НЕМА 5-20</string>
|
||||
<string name="poi_socket_nema_5_15_output">Утичница: НЕМА 5-15Р: излаз</string>
|
||||
<string name="poi_socket_nema_5_15_current">Утичница: НЕМА 5-15Р: струја</string>
|
||||
<string name="poi_socket_nema_5_15">Утичница: НЕМА 5-15Р</string>
|
||||
<string name="poi_socket_tesla_roadster_output">Утичница: Тесла Роудстер: излаз</string>
|
||||
<string name="poi_socket_tesla_roadster_current">Утичница: Тесла Роудстер: струја</string>
|
||||
<string name="poi_socket_tesla_roadster">Утичница: Тесла Роудстер</string>
|
||||
<string name="poi_socket_tesla_supercharger_output">Утичница: Тесла суперпуњач: излаз</string>
|
||||
<string name="poi_socket_tesla_supercharger_current">Утичница: Тесла суперпуњач: струја</string>
|
||||
<string name="poi_socket_tesla_supercharger">Утичница: Тесла суперпуњач</string>
|
||||
<string name="poi_socket_tesla_standard_output">Утичница: Тесла стандард: излаз</string>
|
||||
<string name="poi_socket_tesla_standard_current">Утичница: Тесла стандард: струја</string>
|
||||
<string name="poi_socket_tesla_standard">Утичница: Тесла стандард</string>
|
||||
<string name="poi_socket_chademo_output">Утичница: CHAdeMO: излаз</string>
|
||||
<string name="poi_socket_chademo_current">Утичница: CHAdeMO: струја</string>
|
||||
<string name="poi_socket_chademo">Утичница: CHAdeMO</string>
|
||||
<string name="poi_socket_type3_output">Утичница: Тип 3: излаз</string>
|
||||
<string name="poi_socket_type3_current">Утичница: Тип 3: струја</string>
|
||||
<string name="poi_socket_type3">Утичница: Тип 3</string>
|
||||
<string name="poi_socket_type2_combo_output">Утичница: Тип 2 комбо: излаз</string>
|
||||
<string name="poi_socket_type2_combo_current">Утичница: Тип 2 комбо: струја</string>
|
||||
<string name="poi_socket_type2_combo">Утичница: Тип 2 комбо</string>
|
||||
<string name="poi_socket_type2_output">Утичница: Тип 2: излаз</string>
|
||||
<string name="poi_socket_type2_current">Утичница: Тип 2: струја</string>
|
||||
<string name="poi_socket_type2">Утичница: Тип 2</string>
|
||||
<string name="poi_socket_type1_combo_output">Утичница: Тип 1 комбо: излаз</string>
|
||||
<string name="poi_socket_type1_combo_current">Утичница: Тип 1 комбо: струја</string>
|
||||
<string name="poi_socket_type1_combo">Утичница: Тип 1 комбо</string>
|
||||
<string name="poi_socket_type1_output">Соцкет: Тип 1: излаз</string>
|
||||
<string name="poi_socket_type1_current">Утичница: Тип 1: струја</string>
|
||||
<string name="poi_socket_type1">Утичница: Тип 1</string>
|
||||
<string name="poi_socket_cee_red_125a_output">Утичница: ЦЕЕ црвена 125А: излаз</string>
|
||||
<string name="poi_socket_cee_red_125a_current">Утичница: ЦЕЕ црвена 125А: струја</string>
|
||||
<string name="poi_socket_cee_red_125a">Утичница: ЦЕЕ црвена 125А</string>
|
||||
<string name="poi_socket_cee_red_64a_output">Утичница: ЦЕЕ црвена 64А: излаз</string>
|
||||
<string name="poi_socket_cee_red_64a_current">Утичница: ЦЕЕ црвена 64А: струја</string>
|
||||
<string name="poi_socket_cee_red_64a">Утичница: ЦЕЕ црвена 64А</string>
|
||||
<string name="poi_socket_cee_red_32a_output">Утичница: ЦЕЕ црвена 32А: излаз</string>
|
||||
<string name="poi_socket_cee_red_32a_current">Утичница: ЦЕЕ црвена 32А: струја</string>
|
||||
<string name="poi_socket_cee_red_32a">Утичница: ЦЕЕ црвена 32А</string>
|
||||
<string name="poi_socket_cee_red_16a_output">Утичница: ЦЕЕ црвена 16А: излаз</string>
|
||||
<string name="poi_socket_cee_red_16a_current">Утичница: ЦЕЕ црвена 16А: струја</string>
|
||||
<string name="poi_socket_cee_red_16a">Утичница: ЦЕЕ црвена 16А</string>
|
||||
<string name="poi_socket_cee_blue_output">Утичница: ЦЕЕ плава: излаз</string>
|
||||
<string name="poi_socket_cee_blue_current">Утичница: ЦЕЕ плава: струја</string>
|
||||
<string name="poi_socket_cee_blue">Утичница: ЦЕЕ плава</string>
|
||||
<string name="poi_water_supply_bottled_water">Флаширана вода</string>
|
||||
<string name="poi_water_supply_water_tank">Резервоар за воду</string>
|
||||
<string name="poi_water_supply_water_trucking">Превоз воде</string>
|
||||
<string name="poi_water_supply_borehole">Бушотина</string>
|
||||
<string name="poi_water_supply_pump">Пумпа</string>
|
||||
<string name="poi_water_supply_running_water">Текућа вода</string>
|
||||
<string name="poi_water_supply_pipeline">Цевовод</string>
|
||||
<string name="poi_water_supply_water_well">Бунар</string>
|
||||
<string name="poi_water_purification_aquatabs">Акватаблете</string>
|
||||
<string name="poi_water_purification_reverse_osmosis">Обрнута осмоза</string>
|
||||
<string name="poi_water_purification_chlorine">Хлор</string>
|
||||
<string name="poi_water_purification_none">Нема</string>
|
||||
<string name="poi_water_place_durability_emergency">Трајност воденог места: хитно</string>
|
||||
<string name="poi_water_place_durability_durable">Трајност воденог места: издржљива</string>
|
||||
<string name="poi_operational_status_needs_maintenance">Потребно одржавање</string>
|
||||
<string name="poi_operational_status_broken">Прекинуто</string>
|
||||
<string name="poi_operational_status_restricted">Ограничен</string>
|
||||
<string name="poi_location_kiosk">Локација: киоск</string>
|
||||
<string name="poi_boat_rental">Изнајмљивање чамаца</string>
|
||||
<string name="poi_beds">Кревети</string>
|
||||
<string name="poi_reservation_members_only">Резервација: само чланови</string>
|
||||
<string name="poi_reservation_no">Резервација: не</string>
|
||||
<string name="poi_reservation_yes">Резервација: да</string>
|
||||
<string name="poi_reservation_recommended">Резервације: препоручује се</string>
|
||||
<string name="poi_reservation_required">Резервација: обавезна</string>
|
||||
<string name="poi_winter_room_no">Зимска соба: не</string>
|
||||
<string name="poi_winter_room_yes">Зимска соба: да</string>
|
||||
<string name="poi_direction_all">Правац: сви</string>
|
||||
<string name="poi_direction_exit">Правац: излаз</string>
|
||||
<string name="poi_direction_entrance">Правац: улаз</string>
|
||||
<string name="poi_direction_down">Правац: надоле</string>
|
||||
<string name="poi_direction_up">Правац: нагоре</string>
|
||||
<string name="poi_direction_anticlockwise">Правац: супротно од казаљке на сату</string>
|
||||
<string name="poi_direction_clockwise">Правац: у смеру казаљке на сату</string>
|
||||
<string name="poi_direction_backward">Правац: уназад</string>
|
||||
<string name="poi_direction_forward">Правац: напред</string>
|
||||
<string name="poi_direction_nnw">Правац: север-северозапад</string>
|
||||
<string name="poi_direction_nw">Правац: северозапад</string>
|
||||
<string name="poi_direction_wnw">Правац: запад-северозапад</string>
|
||||
<string name="poi_direction_w">Правац: запад</string>
|
||||
<string name="poi_direction_wsw">Правац: запад-југозапад</string>
|
||||
<string name="poi_direction_sw">Правац: југозапад</string>
|
||||
<string name="poi_direction_ssw">Правац: југ-југозапад</string>
|
||||
<string name="poi_direction_s">Правац: југ</string>
|
||||
<string name="poi_direction_sse">Правац: југ-југоисток</string>
|
||||
<string name="poi_direction_se">Правац: југоисток</string>
|
||||
<string name="poi_direction_ese">Правац: исток-југоисток</string>
|
||||
<string name="poi_direction_e">Правац: исток</string>
|
||||
<string name="poi_direction_ene">Правац: исток-североисток</string>
|
||||
<string name="poi_direction_ne">Правац: североисток</string>
|
||||
<string name="poi_direction_nne">Правац: север-североисток</string>
|
||||
<string name="poi_direction_n">Правац: север</string>
|
||||
<string name="poi_spaceport">Свемирска лука</string>
|
||||
<string name="poi_animal_shelter_purpose_release_no">Пуштање: не</string>
|
||||
<string name="poi_animal_shelter_purpose_release_yes">Пуштање: да</string>
|
||||
<string name="poi_animal_shelter_purpose_adoption_no">Усвајање: не</string>
|
||||
<string name="poi_animal_shelter_purpose_adoption_yes">Усвајање: да</string>
|
||||
<string name="poi_owner">Власник</string>
|
||||
<string name="poi_motorcycle_type_standard">Стандардни</string>
|
||||
<string name="poi_motorcycle_type_dualsport">Дуалспорт</string>
|
||||
<string name="poi_motorcycle_type_offroad">Ван пута</string>
|
||||
<string name="poi_motorcycle_type_chopper">Чопер</string>
|
||||
<string name="poi_motorcycle_type_sportbike">Спортски моторцикл</string>
|
||||
<string name="poi_motorcycle_type_scooter">Скутер</string>
|
||||
<string name="poi_motorcycle_clothes_no">Мото одећа: не</string>
|
||||
<string name="poi_motorcycle_clothes_yes">Мото одећа</string>
|
||||
<string name="poi_motorcycle_tyres_no">Гуме: не</string>
|
||||
<string name="poi_motorcycle_tyres_yes">Гуме</string>
|
||||
<string name="poi_motorcycle_parts_no">Делови: не</string>
|
||||
<string name="poi_motorcycle_parts_yes">Делови</string>
|
||||
<string name="poi_motorcycle_repair_no">Поправака: не</string>
|
||||
<string name="poi_motorcycle_repair_yes">Поправка</string>
|
||||
<string name="poi_motorcycle_rental_no">Изнајмљивање: не</string>
|
||||
<string name="poi_motorcycle_rental_yes">Изнајмљивање</string>
|
||||
<string name="poi_park_ride_yes">Да</string>
|
||||
<string name="poi_denotation_landmark">Ознака земље</string>
|
||||
<string name="poi_denotation_natural_monument">Природни споменик</string>
|
||||
<string name="poi_childcare">Брига о деци</string>
|
||||
<string name="poi_toll_gantry">Путарина</string>
|
||||
</resources>
|
|
@ -3813,4 +3813,8 @@
|
|||
<string name="plugin_wikipedia_description">Информације о тачкама од интереса потражите од Википедије. То је ваш џепни ванмрежни водич - само омогућите додатак Википедиа и уживајте у чланцима о објектима око вас.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Ендуро скутер</string>
|
||||
<string name="app_mode_motor_scooter">Скутер</string>
|
||||
<string name="app_mode_wheelchair">Инвалидска колица</string>
|
||||
<string name="app_mode_wheelchair_forward">Инвалидска колица напред</string>
|
||||
<string name="app_mode_go_cart">Корпа</string>
|
||||
<string name="osm_edit_closed_note">Затворена ОСМ белешка</string>
|
||||
</resources>
|
|
@ -1640,7 +1640,7 @@
|
|||
<string name="poi_drive_in_yes">Ja</string>
|
||||
<string name="poi_drive_in_no">Drive-in: nej</string>
|
||||
<string name="poi_drive_through_yes">Ja</string>
|
||||
<string name="poi_drive_through_no">Drive-through: ja</string>
|
||||
<string name="poi_drive_through_no">Drive-through: nej</string>
|
||||
<string name="poi_brewery_additional">Bryggerinamn</string>
|
||||
<string name="poi_microbrewery_yes">Ja</string>
|
||||
<string name="poi_microbrewery_no">Inget mikrobryggeri</string>
|
||||
|
|
|
@ -2500,7 +2500,7 @@
|
|||
<string name="coord_input_add_point">Nokta ekle</string>
|
||||
<string name="hide_full_description">Açıklamayı gizle</string>
|
||||
<string name="show_full_description">Açıklamayı göster</string>
|
||||
<string name="move_maps">Haritaları taşı</string>
|
||||
<string name="move_maps">Haritaları hareket ettir</string>
|
||||
<string name="public_transport_try_ped">Yürüme navigasyonunu dene.</string>
|
||||
<string name="public_transport_try_change_settings">Ayarları değiştirmeyi deneyin.</string>
|
||||
<string name="shared_string_restore">Restore et</string>
|
||||
|
@ -3771,4 +3771,8 @@
|
|||
<string name="plugin_wikipedia_description">Wikipedia\'dan ilgi çekici yerler hakkında bilgi alın. Bu sizin çevrim dışı cep rehberinizdir - sadece Wikipedia eklentisini etkinleştirin ve etrafınızdaki nesneler hakkında makalelerin tadını çıkarın.</string>
|
||||
<string name="app_mode_enduro_motorcycle">Enduro motosiklet</string>
|
||||
<string name="app_mode_motor_scooter">Küçük motosiklet</string>
|
||||
<string name="app_mode_wheelchair">Tekerlekli sandalye</string>
|
||||
<string name="app_mode_wheelchair_forward">İleri tekerlekli sandalye</string>
|
||||
<string name="app_mode_go_cart">Go-kart</string>
|
||||
<string name="osm_edit_closed_note">Kapatılmış OSM Notu</string>
|
||||
</resources>
|
|
@ -3817,4 +3817,7 @@
|
|||
<string name="poi_traffic_signals_vibration_no">Вібрація: вимкнено</string>
|
||||
<string name="poi_traffic_signals_arrow">Стрілка</string>
|
||||
<string name="poi_traffic_signals_vibration">Вібрація</string>
|
||||
<string name="poi_city_block">Міський квартал</string>
|
||||
<string name="poi_borough">Район</string>
|
||||
<string name="poi_give_box">Подарункова коробка</string>
|
||||
</resources>
|
|
@ -1127,7 +1127,7 @@
|
|||
<string name="shared_string_waypoint">Маршрутна точка</string>
|
||||
<string name="selected_gpx_info_show">"
|
||||
\n
|
||||
\nДовго утримуйте, щоб побачити на мапі"</string>
|
||||
\nУтримуйте, щоб побачити на мапі"</string>
|
||||
<string name="delay_navigation_start">Запускати навігацію автоматично</string>
|
||||
<string name="shared_string_selected_lowercase">виділені</string>
|
||||
<string name="gpx_info_subtracks">Під-треки: %1$s</string>
|
||||
|
@ -3124,7 +3124,7 @@
|
|||
<string name="base_profile_descr_pedestrian">Прогулянки, походи, біг</string>
|
||||
<string name="base_profile_descr_public_transport">Види громадського транспорту</string>
|
||||
<string name="base_profile_descr_boat">Корабель, веслування, вітрильний спорт</string>
|
||||
<string name="base_profile_descr_aircraft">Літак, аероглайдинг</string>
|
||||
<string name="base_profile_descr_aircraft">Літак, планер</string>
|
||||
<string name="routing_profile_geocoding">Геокодування</string>
|
||||
<string name="routing_profile_straightline">Пряма лінія</string>
|
||||
<string name="routing_profile_broutrer">BRouter (автономний)</string>
|
||||
|
@ -3407,10 +3407,10 @@
|
|||
<string name="select_map_icon">Позиція значка в спокої</string>
|
||||
<string name="delete_profiles_descr">Натиснення \"Застосувати\" видалить профілі назавжди.</string>
|
||||
<string name="master_profile">Основний профіль</string>
|
||||
<string name="select_color">Оберіть колір</string>
|
||||
<string name="select_color">Виберіть колір</string>
|
||||
<string name="edit_profiles_descr">Усталені профілі OsmAnd не видалено, проте вимкнуто (на попередньому екрані) чи відпорядковано донизу.</string>
|
||||
<string name="edit_profiles">Редагувати профілі</string>
|
||||
<string name="select_nav_profile_dialog_message">\"Вид навігації\" визначає спосіб обчислення маршрутів.</string>
|
||||
<string name="select_nav_profile_dialog_message">\'Тип навігації\' визначає спосіб обчислення маршрутів.</string>
|
||||
<string name="profile_appearance">Зовнішній вигляд профілю</string>
|
||||
<string name="choose_icon_color_name">Значок, колір та назва</string>
|
||||
<string name="reorder_profiles">Редагувати список профілів</string>
|
||||
|
@ -3805,8 +3805,14 @@
|
|||
<string name="use_volume_buttons_as_zoom">Масштабування кнопками гучності</string>
|
||||
<string name="lenght_limit_description">Вкажіть довжину вашого автомобіля, для довгих транспортних засобів можуть застосовуватися деякі обмеження на маршрутах.</string>
|
||||
<string name="quick_action_remove_next_destination">Видалити наступну точку призначення</string>
|
||||
<string name="please_provide_point_name_error">Укажіть назву пункту</string>
|
||||
<string name="please_provide_point_name_error">Вкажіть назву пункту</string>
|
||||
<string name="quick_action_remove_next_destination_descr">Поточну точку призначення на маршруті буде видалено. Якщо це буде місце призначення, навігація припиниться.</string>
|
||||
<string name="search_download_wikipedia_maps">Завантажити мапи Вікіпедії</string>
|
||||
<string name="plugin_wikipedia_description">Отримайте відомості про визначні місця у Вікіпедії. Це ваш кишеньковий посібник без мережі - просто ввімкніть втулок \"Вікіпедія\" і насолоджуйтесь статтями про об\'єкти навколо вас.</string>
|
||||
<string name="app_mode_motor_scooter">Моторолер</string>
|
||||
<string name="app_mode_enduro_motorcycle">легкий мотоцикл</string>
|
||||
<string name="app_mode_wheelchair">Інвалідне крісло</string>
|
||||
<string name="app_mode_wheelchair_forward">Інвалідне крісло попереду</string>
|
||||
<string name="app_mode_go_cart">у мапу</string>
|
||||
<string name="osm_edit_closed_note">Закрита нотатка OSM</string>
|
||||
</resources>
|
|
@ -3811,4 +3811,8 @@
|
|||
<string name="plugin_wikipedia_description">從維基百科取得關於興趣點的資訊。這是您的離線口袋指南 ── 只要啟用維基百科外掛程式並享受有關於您周圍景點的文章。</string>
|
||||
<string name="app_mode_enduro_motorcycle">耐力賽摩托車</string>
|
||||
<string name="app_mode_motor_scooter">小型摩托車</string>
|
||||
<string name="app_mode_wheelchair">輪椅</string>
|
||||
<string name="app_mode_wheelchair_forward">輪椅向前</string>
|
||||
<string name="app_mode_go_cart">卡丁車</string>
|
||||
<string name="osm_edit_closed_note">已關閉的 OSM 註記</string>
|
||||
</resources>
|
|
@ -43,6 +43,7 @@ import net.osmand.data.PointDescription;
|
|||
import net.osmand.plus.AppInitializer;
|
||||
import net.osmand.plus.AppInitializer.AppInitializeListener;
|
||||
import net.osmand.plus.AppInitializer.InitEvents;
|
||||
import net.osmand.plus.dialogs.GpxAppearanceAdapter;
|
||||
import net.osmand.plus.settings.backend.ApplicationMode;
|
||||
import net.osmand.plus.ContextMenuAdapter;
|
||||
import net.osmand.plus.ContextMenuItem;
|
||||
|
@ -60,7 +61,6 @@ import net.osmand.plus.SQLiteTileSource;
|
|||
import net.osmand.plus.settings.backend.SettingsHelper;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.audionotes.AudioVideoNotesPlugin;
|
||||
import net.osmand.plus.dialogs.ConfigureMapMenu;
|
||||
import net.osmand.plus.helpers.ColorDialogs;
|
||||
import net.osmand.plus.helpers.ExternalApiHelper;
|
||||
import net.osmand.plus.mapcontextmenu.MapContextMenu;
|
||||
|
@ -1146,7 +1146,7 @@ public class OsmandAidlApi {
|
|||
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private void finishGpxImport(boolean destinationExists, File destination, String color, boolean show) {
|
||||
final int col = ConfigureMapMenu.GpxAppearanceAdapter.parseTrackColor(
|
||||
final int col = GpxAppearanceAdapter.parseTrackColor(
|
||||
app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
||||
if (!destinationExists) {
|
||||
GpxDataItem gpxDataItem = new GpxDataItem(destination, col);
|
||||
|
@ -1390,7 +1390,7 @@ public class OsmandAidlApi {
|
|||
int color = dataItem.getColor();
|
||||
String colorName = "";
|
||||
if (color != 0) {
|
||||
colorName = ConfigureMapMenu.GpxAppearanceAdapter.parseTrackColorName(app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
||||
colorName = GpxAppearanceAdapter.parseTrackColorName(app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
||||
}
|
||||
net.osmand.aidlapi.gpx.AGpxFileDetails details = null;
|
||||
GPXTrackAnalysis analysis = dataItem.getAnalysis();
|
||||
|
@ -1431,7 +1431,7 @@ public class OsmandAidlApi {
|
|||
if (file.getName().equals(gpxFileName)) {
|
||||
int color = dataItem.getColor();
|
||||
if (color != 0) {
|
||||
return ConfigureMapMenu.GpxAppearanceAdapter.parseTrackColorName(app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
||||
return GpxAppearanceAdapter.parseTrackColorName(app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -237,6 +237,7 @@ public class CurrentPositionHelper {
|
|||
List<GeocodingResult> complete = new ArrayList<>();
|
||||
double minBuildingDistance = 0;
|
||||
if (res != null) {
|
||||
GeocodingUtilities gu = new GeocodingUtilities();
|
||||
for (GeocodingResult r : res) {
|
||||
BinaryMapIndexReader foundRepo = null;
|
||||
List<BinaryMapReaderResource> rts = usedReaders;
|
||||
|
@ -259,7 +260,7 @@ public class CurrentPositionHelper {
|
|||
} else if (foundRepo != null) {
|
||||
List<GeocodingResult> justified = null;
|
||||
try {
|
||||
justified = new GeocodingUtilities().justifyReverseGeocodingSearch(r, foundRepo,
|
||||
justified = gu.justifyReverseGeocodingSearch(r, foundRepo,
|
||||
minBuildingDistance, result);
|
||||
} catch (IOException e) {
|
||||
log.error("Exception happened during reverse geocoding", e);
|
||||
|
@ -277,6 +278,7 @@ public class CurrentPositionHelper {
|
|||
complete.add(r);
|
||||
}
|
||||
}
|
||||
gu.filterDuplicateRegionResults(complete);
|
||||
}
|
||||
|
||||
if (result.isCancelled()) {
|
||||
|
@ -287,7 +289,7 @@ public class CurrentPositionHelper {
|
|||
});
|
||||
return;
|
||||
}
|
||||
Collections.sort(complete, GeocodingUtilities.DISTANCE_COMPARATOR);
|
||||
// Collections.sort(complete, GeocodingUtilities.DISTANCE_COMPARATOR);
|
||||
// for(GeocodingResult rt : complete) {
|
||||
// System.out.println(rt.toString());
|
||||
// }
|
||||
|
|
|
@ -22,7 +22,7 @@ import net.osmand.plus.settings.backend.SettingsHelper;
|
|||
import net.osmand.plus.settings.backend.SettingsHelper.AvoidRoadsSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.MapSourcesSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.PluginSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.PoiUiFilterSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.PoiUiFiltersSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.ProfileSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.QuickActionsSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.SettingsCollectListener;
|
||||
|
@ -305,9 +305,9 @@ public class CustomOsmandPlugin extends OsmandPlugin {
|
|||
Algorithms.removeAllFiles(dir);
|
||||
}
|
||||
}
|
||||
} else if (item instanceof PoiUiFilterSettingsItem) {
|
||||
PoiUiFilterSettingsItem poiUiFilterSettingsItem = (PoiUiFilterSettingsItem) item;
|
||||
List<PoiUIFilter> poiUIFilters = poiUiFilterSettingsItem.getItems();
|
||||
} else if (item instanceof PoiUiFiltersSettingsItem) {
|
||||
PoiUiFiltersSettingsItem poiUiFiltersSettingsItem = (PoiUiFiltersSettingsItem) item;
|
||||
List<PoiUIFilter> poiUIFilters = poiUiFiltersSettingsItem.getItems();
|
||||
for (PoiUIFilter filter : poiUIFilters) {
|
||||
app.getPoiFilters().removePoiFilter(filter);
|
||||
}
|
||||
|
|
|
@ -679,6 +679,16 @@ public class FavouritesDbHelper {
|
|||
return favoriteGroups;
|
||||
}
|
||||
|
||||
public boolean isGroupVisible(String name) {
|
||||
String nameLowercase = name.toLowerCase();
|
||||
for (String groupName : flatGroups.keySet()) {
|
||||
if (groupName.toLowerCase().equals(nameLowercase) || FavoriteGroup.getDisplayName(context, groupName).equals(name)) {
|
||||
return flatGroups.get(groupName).isVisible();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean groupExists(String name) {
|
||||
String nameLowercase = name.toLowerCase();
|
||||
for (String groupName : flatGroups.keySet()) {
|
||||
|
@ -800,10 +810,12 @@ public class FavouritesDbHelper {
|
|||
public void editFavouriteGroup(FavoriteGroup group, String newName, int color, boolean visible) {
|
||||
if (color != 0 && group.color != color) {
|
||||
FavoriteGroup gr = flatGroups.get(group.name);
|
||||
group.color = color;
|
||||
for (FavouritePoint p : gr.points) {
|
||||
if (p.getColor() == group.color) {
|
||||
p.setColor(color);
|
||||
}
|
||||
}
|
||||
group.color = color;
|
||||
runSyncWithMarkers(gr);
|
||||
}
|
||||
if (group.visible != visible) {
|
||||
|
|
|
@ -3,6 +3,8 @@ package net.osmand.plus;
|
|||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.GPXUtilities.GPXFile.GradientScaleType;
|
||||
import net.osmand.GPXUtilities.GPXTrackAnalysis;
|
||||
import net.osmand.IndexConstants;
|
||||
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
|
||||
|
@ -15,8 +17,9 @@ import java.util.List;
|
|||
|
||||
public class GPXDatabase {
|
||||
|
||||
private static final int DB_VERSION = 11;
|
||||
private static final String DB_NAME = "gpx_database";
|
||||
private static final int DB_VERSION = 10;
|
||||
|
||||
private static final String GPX_TABLE_NAME = "gpxTable";
|
||||
private static final String GPX_COL_NAME = "fileName";
|
||||
private static final String GPX_COL_DIR = "fileDir";
|
||||
|
@ -56,9 +59,19 @@ public class GPXDatabase {
|
|||
|
||||
private static final String GPX_COL_JOIN_SEGMENTS = "joinSegments";
|
||||
|
||||
public static final int GPX_SPLIT_TYPE_NO_SPLIT = -1;
|
||||
public static final int GPX_SPLIT_TYPE_DISTANCE = 1;
|
||||
public static final int GPX_SPLIT_TYPE_TIME = 2;
|
||||
private static final String GPX_COL_SHOW_ARROWS = "showArrows";
|
||||
|
||||
private static final String GPX_COL_SHOW_START_FINISH = "showStartFinish";
|
||||
|
||||
private static final String GPX_COL_WIDTH = "width";
|
||||
|
||||
private static final String GPX_COL_GRADIENT_SPEED_COLOR = "gradientSpeedColor";
|
||||
|
||||
private static final String GPX_COL_GRADIENT_ALTITUDE_COLOR = "gradientAltitudeColor";
|
||||
|
||||
private static final String GPX_COL_GRADIENT_SLOPE_COLOR = "gradientSlopeColor";
|
||||
|
||||
private static final String GPX_COL_GRADIENT_SCALE_TYPE = "gradientScaleType";
|
||||
|
||||
private static final String GPX_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " + GPX_TABLE_NAME + " (" +
|
||||
GPX_COL_NAME + " TEXT, " +
|
||||
|
@ -89,7 +102,14 @@ public class GPXDatabase {
|
|||
GPX_COL_API_IMPORTED + " int, " + // 1 = true, 0 = false
|
||||
GPX_COL_WPT_CATEGORY_NAMES + " TEXT, " +
|
||||
GPX_COL_SHOW_AS_MARKERS + " int, " + // 1 = true, 0 = false
|
||||
GPX_COL_JOIN_SEGMENTS + " int);"; // 1 = true, 0 = false
|
||||
GPX_COL_JOIN_SEGMENTS + " int, " + // 1 = true, 0 = false
|
||||
GPX_COL_SHOW_ARROWS + " int, " + // 1 = true, 0 = false
|
||||
GPX_COL_SHOW_START_FINISH + " int, " + // 1 = true, 0 = false
|
||||
GPX_COL_WIDTH + " TEXT, " +
|
||||
GPX_COL_GRADIENT_SPEED_COLOR + " TEXT, " +
|
||||
GPX_COL_GRADIENT_ALTITUDE_COLOR + " TEXT, " +
|
||||
GPX_COL_GRADIENT_SLOPE_COLOR + " TEXT, " +
|
||||
GPX_COL_GRADIENT_SCALE_TYPE+ " TEXT);";
|
||||
|
||||
private static final String GPX_TABLE_SELECT = "SELECT " +
|
||||
GPX_COL_NAME + ", " +
|
||||
|
@ -117,7 +137,14 @@ public class GPXDatabase {
|
|||
GPX_COL_API_IMPORTED + ", " +
|
||||
GPX_COL_WPT_CATEGORY_NAMES + ", " +
|
||||
GPX_COL_SHOW_AS_MARKERS + ", " +
|
||||
GPX_COL_JOIN_SEGMENTS +
|
||||
GPX_COL_JOIN_SEGMENTS + ", " +
|
||||
GPX_COL_SHOW_ARROWS + ", " +
|
||||
GPX_COL_SHOW_START_FINISH + ", " +
|
||||
GPX_COL_WIDTH + ", " +
|
||||
GPX_COL_GRADIENT_SPEED_COLOR + ", " +
|
||||
GPX_COL_GRADIENT_ALTITUDE_COLOR + ", " +
|
||||
GPX_COL_GRADIENT_SLOPE_COLOR + ", " +
|
||||
GPX_COL_GRADIENT_SCALE_TYPE +
|
||||
" FROM " + GPX_TABLE_NAME;
|
||||
|
||||
private static final String GPX_TABLE_UPDATE_ANALYSIS = "UPDATE " +
|
||||
|
@ -144,15 +171,23 @@ public class GPXDatabase {
|
|||
private OsmandApplication context;
|
||||
|
||||
public static class GpxDataItem {
|
||||
|
||||
private File file;
|
||||
private GPXTrackAnalysis analysis;
|
||||
private String width;
|
||||
private GradientScaleType gradientScaleType;
|
||||
private int color;
|
||||
private long fileLastModifiedTime;
|
||||
private int gradientSpeedColor;
|
||||
private int gradientAltitudeColor;
|
||||
private int gradientSlopeColor;
|
||||
private int splitType;
|
||||
private double splitInterval;
|
||||
private long fileLastModifiedTime;
|
||||
private boolean apiImported;
|
||||
private boolean showAsMarkers;
|
||||
private boolean joinSegments;
|
||||
private boolean showArrows;
|
||||
private boolean showStartFinish;
|
||||
|
||||
public GpxDataItem(File file, GPXTrackAnalysis analysis) {
|
||||
this.file = file;
|
||||
|
@ -164,6 +199,22 @@ public class GPXDatabase {
|
|||
this.color = color;
|
||||
}
|
||||
|
||||
public GpxDataItem(File file, @NonNull GPXFile gpxFile) {
|
||||
this.file = file;
|
||||
color = gpxFile.getColor(0);
|
||||
width = gpxFile.getWidth(null);
|
||||
showArrows = gpxFile.isShowArrows();
|
||||
showStartFinish = gpxFile.isShowStartFinish();
|
||||
gradientScaleType = gpxFile.getGradientScaleType();
|
||||
gradientSpeedColor = gpxFile.getGradientScaleColor(GradientScaleType.SPEED, 0);
|
||||
gradientSlopeColor = gpxFile.getGradientScaleColor(GradientScaleType.SLOPE, 0);
|
||||
gradientAltitudeColor = gpxFile.getGradientScaleColor(GradientScaleType.ALTITUDE, 0);
|
||||
if (gpxFile.getSplitType() != null && gpxFile.getSplitInterval() != 0) {
|
||||
splitType = gpxFile.getSplitType().getType();
|
||||
splitInterval = gpxFile.getSplitInterval();
|
||||
}
|
||||
}
|
||||
|
||||
public File getFile() {
|
||||
return file;
|
||||
}
|
||||
|
@ -177,6 +228,27 @@ public class GPXDatabase {
|
|||
return color;
|
||||
}
|
||||
|
||||
public GradientScaleType getGradientScaleType() {
|
||||
return gradientScaleType;
|
||||
}
|
||||
|
||||
public int getGradientSpeedColor() {
|
||||
return gradientSpeedColor;
|
||||
}
|
||||
|
||||
public int getGradientAltitudeColor() {
|
||||
return gradientAltitudeColor;
|
||||
}
|
||||
|
||||
public int getGradientSlopeColor() {
|
||||
return gradientSlopeColor;
|
||||
}
|
||||
|
||||
public String getWidth() {
|
||||
return width;
|
||||
}
|
||||
|
||||
|
||||
public long getFileLastModifiedTime() {
|
||||
return fileLastModifiedTime;
|
||||
}
|
||||
|
@ -209,8 +281,12 @@ public class GPXDatabase {
|
|||
return joinSegments;
|
||||
}
|
||||
|
||||
public void setJoinSegments(boolean joinSegments) {
|
||||
this.joinSegments = joinSegments;
|
||||
public boolean isShowArrows() {
|
||||
return showArrows;
|
||||
}
|
||||
|
||||
public boolean isShowStartFinish() {
|
||||
return showStartFinish;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -341,6 +417,20 @@ public class GPXDatabase {
|
|||
" SET " + GPX_COL_JOIN_SEGMENTS + " = ? " +
|
||||
"WHERE " + GPX_COL_JOIN_SEGMENTS + " IS NULL", new Object[]{0});
|
||||
}
|
||||
if (oldVersion < 11) {
|
||||
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_SHOW_ARROWS + " int");
|
||||
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_SHOW_START_FINISH + " int");
|
||||
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_WIDTH + " TEXT");
|
||||
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_GRADIENT_SPEED_COLOR + " TEXT");
|
||||
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_GRADIENT_ALTITUDE_COLOR + " TEXT");
|
||||
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_GRADIENT_SLOPE_COLOR + " TEXT");
|
||||
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_GRADIENT_SCALE_TYPE + " TEXT");
|
||||
|
||||
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + GPX_COL_SHOW_ARROWS + " = ? " +
|
||||
"WHERE " + GPX_COL_SHOW_ARROWS + " IS NULL", new Object[]{0});
|
||||
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + GPX_COL_SHOW_START_FINISH + " = ? " +
|
||||
"WHERE " + GPX_COL_SHOW_START_FINISH + " IS NULL", new Object[]{1});
|
||||
}
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS " + GPX_INDEX_NAME_DIR + " ON " + GPX_TABLE_NAME + " (" + GPX_COL_NAME + ", " + GPX_COL_DIR + ");");
|
||||
}
|
||||
|
||||
|
@ -391,8 +481,7 @@ public class GPXDatabase {
|
|||
try {
|
||||
String fileName = getFileName(item.file);
|
||||
String fileDir = getFileDir(item.file);
|
||||
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " +
|
||||
GPX_COL_COLOR + " = ? " +
|
||||
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + GPX_COL_COLOR + " = ? " +
|
||||
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
||||
new Object[] { (color == 0 ? "" : Algorithms.colorToString(color)), fileName, fileDir });
|
||||
item.color = color;
|
||||
|
@ -404,6 +493,106 @@ public class GPXDatabase {
|
|||
return false;
|
||||
}
|
||||
|
||||
public boolean updateGradientScaleColor(@NonNull GpxDataItem item, @NonNull GradientScaleType gradientScaleType, int gradientScaleColor) {
|
||||
SQLiteConnection db = openConnection(false);
|
||||
if (db != null) {
|
||||
try {
|
||||
String fileName = getFileName(item.file);
|
||||
String fileDir = getFileDir(item.file);
|
||||
String columnName = null;
|
||||
if (GradientScaleType.SPEED == gradientScaleType) {
|
||||
columnName = GPX_COL_GRADIENT_SPEED_COLOR;
|
||||
item.gradientSpeedColor = gradientScaleColor;
|
||||
} else if (GradientScaleType.ALTITUDE == gradientScaleType) {
|
||||
columnName = GPX_COL_GRADIENT_ALTITUDE_COLOR;
|
||||
item.gradientAltitudeColor = gradientScaleColor;
|
||||
} else if (GradientScaleType.SLOPE == gradientScaleType) {
|
||||
columnName = GPX_COL_GRADIENT_SLOPE_COLOR;
|
||||
item.gradientSlopeColor = gradientScaleColor;
|
||||
}
|
||||
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + columnName + " = ? " +
|
||||
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
||||
new Object[] {(gradientScaleColor == 0 ? "" : Algorithms.colorToString(gradientScaleColor)), fileName, fileDir});
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean updateGradientScaleType(@NonNull GpxDataItem item, GradientScaleType gradientScaleType) {
|
||||
SQLiteConnection db = openConnection(false);
|
||||
if (db != null) {
|
||||
try {
|
||||
String fileName = getFileName(item.file);
|
||||
String fileDir = getFileDir(item.file);
|
||||
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + GPX_COL_GRADIENT_SCALE_TYPE + " = ? " +
|
||||
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
||||
new Object[] {(gradientScaleType == null ? "" : gradientScaleType.name()), fileName, fileDir});
|
||||
item.gradientScaleType = gradientScaleType;
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean updateShowArrows(GpxDataItem item, boolean showArrows) {
|
||||
SQLiteConnection db = openConnection(false);
|
||||
if (db != null) {
|
||||
try {
|
||||
String fileName = getFileName(item.file);
|
||||
String fileDir = getFileDir(item.file);
|
||||
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + GPX_COL_SHOW_ARROWS + " = ? " +
|
||||
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
||||
new Object[] {showArrows ? 1 : 0, fileName, fileDir});
|
||||
item.showArrows = showArrows;
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean updateShowStartFinish(GpxDataItem item, boolean showStartFinish) {
|
||||
SQLiteConnection db = openConnection(false);
|
||||
if (db != null) {
|
||||
try {
|
||||
String fileName = getFileName(item.file);
|
||||
String fileDir = getFileDir(item.file);
|
||||
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + GPX_COL_SHOW_START_FINISH + " = ? " +
|
||||
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
||||
new Object[] {showStartFinish ? 1 : 0, fileName, fileDir});
|
||||
item.showStartFinish = showStartFinish;
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean updateWidth(GpxDataItem item, String width) {
|
||||
SQLiteConnection db = openConnection(false);
|
||||
if (db != null) {
|
||||
try {
|
||||
String fileName = getFileName(item.file);
|
||||
String fileDir = getFileDir(item.file);
|
||||
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + GPX_COL_WIDTH + " = ? " +
|
||||
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
||||
new Object[] {width, fileName, fileDir});
|
||||
item.width = width;
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean updateShowAsMarkers(GpxDataItem item, boolean showAsMarkers) {
|
||||
SQLiteConnection db = openConnection(false);
|
||||
if (db != null) {
|
||||
|
@ -433,7 +622,7 @@ public class GPXDatabase {
|
|||
GPX_COL_JOIN_SEGMENTS + " = ? " +
|
||||
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
||||
new Object[]{joinSegments ? 1 : 0, fileName, fileDir});
|
||||
item.setJoinSegments(joinSegments);
|
||||
item.joinSegments = joinSegments;
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
|
@ -516,14 +705,17 @@ public class GPXDatabase {
|
|||
} else {
|
||||
color = Algorithms.colorToString(item.color);
|
||||
}
|
||||
String gradientScaleType = item.gradientScaleType != null ? item.gradientScaleType.name() : null;
|
||||
if (a != null) {
|
||||
db.execSQL(
|
||||
"INSERT INTO " + GPX_TABLE_NAME + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
||||
"INSERT INTO " + GPX_TABLE_NAME + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
||||
new Object[] {fileName, fileDir, a.totalDistance, a.totalTracks, a.startTime, a.endTime,
|
||||
a.timeSpan, a.timeMoving, a.totalDistanceMoving, a.diffElevationUp, a.diffElevationDown,
|
||||
a.avgElevation, a.minElevation, a.maxElevation, a.maxSpeed, a.avgSpeed, a.points, a.wptPoints,
|
||||
color, item.file.lastModified(), item.splitType, item.splitInterval, item.apiImported ? 1 : 0,
|
||||
Algorithms.encodeStringSet(item.analysis.wptCategoryNames), item.showAsMarkers ? 1 : 0, item.joinSegments ? 1 : 0});
|
||||
Algorithms.encodeStringSet(item.analysis.wptCategoryNames), item.showAsMarkers ? 1 : 0,
|
||||
item.joinSegments ? 1 : 0, item.showArrows ? 1 : 0, item.showStartFinish ? 1 : 0, item.width,
|
||||
item.gradientSpeedColor, item.gradientAltitudeColor, item.gradientSlopeColor, gradientScaleType});
|
||||
} else {
|
||||
db.execSQL("INSERT INTO " + GPX_TABLE_NAME + "(" +
|
||||
GPX_COL_NAME + ", " +
|
||||
|
@ -534,9 +726,19 @@ public class GPXDatabase {
|
|||
GPX_COL_SPLIT_INTERVAL + ", " +
|
||||
GPX_COL_API_IMPORTED + ", " +
|
||||
GPX_COL_SHOW_AS_MARKERS + ", " +
|
||||
GPX_COL_JOIN_SEGMENTS +
|
||||
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
||||
new Object[] {fileName, fileDir, color, 0, item.splitType, item.splitInterval, item.apiImported ? 1 : 0, item.showAsMarkers ? 1 : 0, item.joinSegments ? 1 : 0});
|
||||
GPX_COL_JOIN_SEGMENTS + ", " +
|
||||
GPX_COL_SHOW_ARROWS + ", " +
|
||||
GPX_COL_SHOW_START_FINISH + ", " +
|
||||
GPX_COL_WIDTH + ", " +
|
||||
GPX_COL_GRADIENT_SPEED_COLOR + ", " +
|
||||
GPX_COL_GRADIENT_ALTITUDE_COLOR + ", " +
|
||||
GPX_COL_GRADIENT_SLOPE_COLOR + ", " +
|
||||
GPX_COL_GRADIENT_SCALE_TYPE +
|
||||
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
||||
new Object[] {fileName, fileDir, color, 0, item.splitType, item.splitInterval,
|
||||
item.apiImported ? 1 : 0, item.showAsMarkers ? 1 : 0, item.joinSegments ? 1 : 0,
|
||||
item.showArrows ? 1 : 0, item.showStartFinish ? 1 : 0, item.width,
|
||||
item.gradientSpeedColor, item.gradientAltitudeColor, item.gradientSlopeColor, gradientScaleType});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -617,6 +819,13 @@ public class GPXDatabase {
|
|||
String wptCategoryNames = query.getString(23);
|
||||
boolean showAsMarkers = query.getInt(24) == 1;
|
||||
boolean joinSegments = query.getInt(25) == 1;
|
||||
boolean showArrows = query.getInt(26) == 1;
|
||||
boolean showStartFinish = query.getInt(27) == 1;
|
||||
String width = query.getString(28);
|
||||
String gradientSpeedColor = query.getString(29);
|
||||
String gradientAltitudeColor = query.getString(30);
|
||||
String gradientSlopeColor = query.getString(31);
|
||||
String gradientScaleType = query.getString(32);
|
||||
|
||||
GPXTrackAnalysis a = new GPXTrackAnalysis();
|
||||
a.totalDistance = totalDistance;
|
||||
|
@ -647,20 +856,37 @@ public class GPXDatabase {
|
|||
dir = context.getAppPath(IndexConstants.GPX_INDEX_DIR);
|
||||
}
|
||||
GpxDataItem item = new GpxDataItem(new File(dir, fileName), a);
|
||||
try {
|
||||
item.color = Algorithms.isEmpty(color) ? 0 : Algorithms.parseColor(color);
|
||||
} catch (IllegalArgumentException e) {
|
||||
item.color = 0;
|
||||
}
|
||||
item.color = parseColor(color);
|
||||
item.fileLastModifiedTime = fileLastModifiedTime;
|
||||
item.splitType = splitType;
|
||||
item.splitInterval = splitInterval;
|
||||
item.apiImported = apiImported;
|
||||
item.showAsMarkers = showAsMarkers;
|
||||
item.joinSegments = joinSegments;
|
||||
item.showArrows = showArrows;
|
||||
item.showStartFinish = showStartFinish;
|
||||
item.width = width;
|
||||
item.gradientSpeedColor = parseColor(gradientSpeedColor);
|
||||
item.gradientAltitudeColor = parseColor(gradientAltitudeColor);
|
||||
item.gradientSlopeColor = parseColor(gradientSlopeColor);
|
||||
|
||||
try {
|
||||
item.gradientScaleType = Algorithms.isEmpty(gradientScaleType) ? null : GradientScaleType.valueOf(gradientScaleType);
|
||||
} catch (IllegalArgumentException e) {
|
||||
item.gradientScaleType = null;
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
private int parseColor(String color) {
|
||||
try {
|
||||
return Algorithms.isEmpty(color) ? 0 : Algorithms.parseColor(color);
|
||||
} catch (IllegalArgumentException e) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public List<GpxDataItem> getItems() {
|
||||
List<GpxDataItem> items = new ArrayList<>();
|
||||
|
|
|
@ -8,6 +8,8 @@ import androidx.annotation.Nullable;
|
|||
|
||||
import net.osmand.GPXUtilities;
|
||||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.GPXUtilities.GPXFile.GpxSplitType;
|
||||
import net.osmand.GPXUtilities.GPXFile.GradientScaleType;
|
||||
import net.osmand.GPXUtilities.GPXTrackAnalysis;
|
||||
import net.osmand.plus.GPXDatabase.GpxDataItem;
|
||||
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
|
||||
|
@ -77,14 +79,44 @@ public class GpxDbHelper {
|
|||
return res;
|
||||
}
|
||||
|
||||
public boolean updateGradientScaleColor(@NonNull GpxDataItem item, @NonNull GradientScaleType gradientScaleType, int color) {
|
||||
boolean res = db.updateGradientScaleColor(item, gradientScaleType, color);
|
||||
putToCache(item);
|
||||
return res;
|
||||
}
|
||||
|
||||
public boolean updateGradientScaleType(@NonNull GpxDataItem item, @Nullable GradientScaleType gradientScaleType) {
|
||||
boolean res = db.updateGradientScaleType(item, gradientScaleType);
|
||||
putToCache(item);
|
||||
return res;
|
||||
}
|
||||
|
||||
public boolean updateShowAsMarkers(GpxDataItem item, boolean showAsMarkers) {
|
||||
boolean res = db.updateShowAsMarkers(item, showAsMarkers);
|
||||
putToCache(item);
|
||||
return res;
|
||||
}
|
||||
|
||||
public boolean updateSplit(@NonNull GpxDataItem item, int splitType, double splitInterval) {
|
||||
boolean res = db.updateSplit(item, splitType, splitInterval);
|
||||
public boolean updateShowArrows(GpxDataItem item, boolean showArrows) {
|
||||
boolean res = db.updateShowArrows(item, showArrows);
|
||||
putToCache(item);
|
||||
return res;
|
||||
}
|
||||
|
||||
public boolean updateShowStartFinish(GpxDataItem item, boolean showStartFinish) {
|
||||
boolean res = db.updateShowStartFinish(item, showStartFinish);
|
||||
putToCache(item);
|
||||
return res;
|
||||
}
|
||||
|
||||
public boolean updateWidth(GpxDataItem item, String width) {
|
||||
boolean res = db.updateWidth(item, width);
|
||||
putToCache(item);
|
||||
return res;
|
||||
}
|
||||
|
||||
public boolean updateSplit(@NonNull GpxDataItem item, @NonNull GpxSplitType splitType, double splitInterval) {
|
||||
boolean res = db.updateSplit(item, splitType.getType(), splitInterval);
|
||||
putToCache(item);
|
||||
return res;
|
||||
}
|
||||
|
@ -157,7 +189,7 @@ public class GpxDbHelper {
|
|||
}
|
||||
|
||||
private void readGpxItem(@NonNull File gpxFile, @Nullable GpxDataItem item, @Nullable GpxDataItemCallback callback) {
|
||||
readingItemsMap.put(gpxFile, item != null ? item : new GpxDataItem(null, null));
|
||||
readingItemsMap.put(gpxFile, item != null ? item : new GpxDataItem(null, (GPXTrackAnalysis) null));
|
||||
if (callback != null) {
|
||||
readingItemsCallbacks.put(gpxFile, callback);
|
||||
}
|
||||
|
|
|
@ -11,6 +11,8 @@ import androidx.core.content.ContextCompat;
|
|||
|
||||
import net.osmand.GPXUtilities;
|
||||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.GPXUtilities.GPXFile.GpxSplitType;
|
||||
import net.osmand.GPXUtilities.GPXFile.GradientScaleType;
|
||||
import net.osmand.GPXUtilities.GPXTrackAnalysis;
|
||||
import net.osmand.GPXUtilities.Route;
|
||||
import net.osmand.GPXUtilities.Track;
|
||||
|
@ -51,7 +53,11 @@ public class GpxSelectionHelper {
|
|||
private static final String BACKUP = "backup";
|
||||
private static final String BACKUPMODIFIEDTIME = "backupTime";
|
||||
private static final String COLOR = "color";
|
||||
private static final String WIDTH = "width";
|
||||
private static final String SELECTED_BY_USER = "selected_by_user";
|
||||
private static final String SHOW_ARROWS = "show_arrows";
|
||||
private static final String GRADIENT_SCALE_TYPE = "gradient_scale_type";
|
||||
private static final String SHOW_START_FINISH = "show_start_finish";
|
||||
|
||||
private OsmandApplication app;
|
||||
@NonNull
|
||||
|
@ -167,17 +173,17 @@ public class GpxSelectionHelper {
|
|||
if (selectedGpxFile != null && selectedGpxFile.getGpxFile() != null) {
|
||||
GPXFile gpxFile = selectedGpxFile.getGpxFile();
|
||||
List<GpxDisplayGroup> groups = app.getSelectedGpxHelper().collectDisplayGroups(gpxFile);
|
||||
if (dataItem.getSplitType() == GPXDatabase.GPX_SPLIT_TYPE_NO_SPLIT) {
|
||||
if (dataItem.getSplitType() == GpxSplitType.NO_SPLIT.getType()) {
|
||||
for (GpxDisplayGroup model : groups) {
|
||||
model.noSplit(app);
|
||||
}
|
||||
selectedGpxFile.setDisplayGroups(groups, app);
|
||||
} else if (dataItem.getSplitType() == GPXDatabase.GPX_SPLIT_TYPE_DISTANCE) {
|
||||
} else if (dataItem.getSplitType() == GpxSplitType.DISTANCE.getType()) {
|
||||
for (GpxDisplayGroup model : groups) {
|
||||
model.splitByDistance(app, dataItem.getSplitInterval(), dataItem.isJoinSegments());
|
||||
}
|
||||
selectedGpxFile.setDisplayGroups(groups, app);
|
||||
} else if (dataItem.getSplitType() == GPXDatabase.GPX_SPLIT_TYPE_TIME) {
|
||||
} else if (dataItem.getSplitType() == GpxSplitType.TIME.getType()) {
|
||||
for (GpxDisplayGroup model : groups) {
|
||||
model.splitByTime(app, (int) dataItem.getSplitInterval(), dataItem.isJoinSegments());
|
||||
}
|
||||
|
@ -515,6 +521,29 @@ public class GpxSelectionHelper {
|
|||
int clr = Algorithms.parseColor(obj.getString(COLOR));
|
||||
gpx.setColor(clr);
|
||||
}
|
||||
for (GradientScaleType scaleType : GradientScaleType.values()) {
|
||||
if (obj.has(scaleType.getTypeName())) {
|
||||
int clr = Algorithms.parseColor(obj.getString(scaleType.getTypeName()));
|
||||
gpx.setGradientScaleColor(scaleType, clr);
|
||||
}
|
||||
}
|
||||
if (obj.has(SHOW_ARROWS)) {
|
||||
boolean showArrows = obj.optBoolean(SHOW_ARROWS, false);
|
||||
gpx.setShowArrows(showArrows);
|
||||
}
|
||||
if (obj.has(GRADIENT_SCALE_TYPE)) {
|
||||
String gradientScaleTypeName = obj.optString(GRADIENT_SCALE_TYPE);
|
||||
if (!Algorithms.isEmpty(gradientScaleTypeName)) {
|
||||
gpx.setGradientScaleType(GradientScaleType.valueOf(gradientScaleTypeName));
|
||||
}
|
||||
}
|
||||
if (obj.has(SHOW_START_FINISH)) {
|
||||
boolean showStartFinish = obj.optBoolean(SHOW_START_FINISH, false);
|
||||
gpx.setShowStartFinish(showStartFinish);
|
||||
}
|
||||
if (obj.has(WIDTH)) {
|
||||
gpx.setWidth(obj.getString(WIDTH));
|
||||
}
|
||||
if (gpx.error != null) {
|
||||
save = true;
|
||||
} else if (obj.has(BACKUP)) {
|
||||
|
@ -554,6 +583,20 @@ public class GpxSelectionHelper {
|
|||
if (s.gpxFile.getColor(0) != 0) {
|
||||
obj.put(COLOR, Algorithms.colorToString(s.gpxFile.getColor(0)));
|
||||
}
|
||||
if (s.gpxFile.getWidth(null) != null) {
|
||||
obj.put(WIDTH, s.gpxFile.getWidth(null));
|
||||
}
|
||||
if (s.gpxFile.getGradientScaleType() != null) {
|
||||
obj.put(GRADIENT_SCALE_TYPE, s.gpxFile.getGradientScaleType());
|
||||
}
|
||||
obj.put(SHOW_ARROWS, s.gpxFile.isShowArrows());
|
||||
obj.put(SHOW_START_FINISH, s.gpxFile.isShowStartFinish());
|
||||
for (GradientScaleType scaleType : GradientScaleType.values()) {
|
||||
int gradientScaleColor = s.gpxFile.getGradientScaleColor(scaleType, 0);
|
||||
if (gradientScaleColor != 0) {
|
||||
obj.put(scaleType.getTypeName(), Algorithms.colorToString(gradientScaleColor));
|
||||
}
|
||||
}
|
||||
}
|
||||
obj.put(SELECTED_BY_USER, s.selectedByUser);
|
||||
} catch (JSONException e) {
|
||||
|
@ -606,6 +649,23 @@ public class GpxSelectionHelper {
|
|||
if (dataItem.getColor() != 0) {
|
||||
gpx.setColor(dataItem.getColor());
|
||||
}
|
||||
if (dataItem.getGradientSpeedColor() != 0) {
|
||||
gpx.setGradientScaleColor(GradientScaleType.SPEED, dataItem.getGradientSpeedColor());
|
||||
}
|
||||
if (dataItem.getGradientAltitudeColor() != 0) {
|
||||
gpx.setGradientScaleColor(GradientScaleType.ALTITUDE, dataItem.getGradientAltitudeColor());
|
||||
}
|
||||
if (dataItem.getGradientSlopeColor() != 0) {
|
||||
gpx.setGradientScaleColor(GradientScaleType.SLOPE, dataItem.getGradientSlopeColor());
|
||||
}
|
||||
if (dataItem.getGradientScaleType() != null) {
|
||||
gpx.setGradientScaleType(dataItem.getGradientScaleType());
|
||||
}
|
||||
if (dataItem.getWidth() != null) {
|
||||
gpx.setWidth(dataItem.getWidth());
|
||||
}
|
||||
gpx.setShowArrows(dataItem.isShowArrows());
|
||||
gpx.setShowStartFinish(dataItem.isShowStartFinish());
|
||||
sf.setJoinSegments(dataItem.isJoinSegments());
|
||||
}
|
||||
sf.setGpxFile(gpx, app);
|
||||
|
|
|
@ -2,9 +2,7 @@ package net.osmand.plus.dialogs;
|
|||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
|
@ -25,8 +23,6 @@ import androidx.appcompat.widget.SwitchCompat;
|
|||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.CallbackWithObject;
|
||||
import net.osmand.GPXUtilities;
|
||||
import net.osmand.IndexConstants;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.core.android.MapRendererContext;
|
||||
|
@ -35,20 +31,14 @@ import net.osmand.plus.ContextMenuAdapter.ItemClickListener;
|
|||
import net.osmand.plus.ContextMenuAdapter.OnRowItemClick;
|
||||
import net.osmand.plus.ContextMenuItem;
|
||||
import net.osmand.plus.DialogListItemAdapter;
|
||||
import net.osmand.plus.GpxSelectionHelper;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandPlugin;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.activities.MapActivityLayers;
|
||||
import net.osmand.plus.activities.PluginActivity;
|
||||
import net.osmand.plus.activities.SettingsActivity;
|
||||
import net.osmand.plus.dashboard.DashboardOnMap;
|
||||
import net.osmand.plus.inapp.InAppPurchaseHelper;
|
||||
import net.osmand.plus.poi.PoiFiltersHelper;
|
||||
import net.osmand.plus.poi.PoiUIFilter;
|
||||
import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin;
|
||||
import net.osmand.plus.render.RendererRegistry;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
|
||||
|
@ -57,8 +47,6 @@ import net.osmand.plus.srtmplugin.SRTMPlugin;
|
|||
import net.osmand.plus.transport.TransportLinesMenu;
|
||||
import net.osmand.plus.views.OsmandMapTileView;
|
||||
import net.osmand.plus.views.corenative.NativeCoreContext;
|
||||
import net.osmand.plus.wikipedia.WikipediaPoiMenu;
|
||||
import net.osmand.render.RenderingRule;
|
||||
import net.osmand.render.RenderingRuleProperty;
|
||||
import net.osmand.render.RenderingRuleStorageProperties;
|
||||
import net.osmand.render.RenderingRulesStorage;
|
||||
|
@ -67,7 +55,6 @@ import net.osmand.util.SunriseSunset;
|
|||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import java.io.File;
|
||||
import java.text.DateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
@ -101,7 +88,6 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.ROUTES_ID;
|
|||
import static net.osmand.aidlapi.OsmAndCustomizationConstants.SHOW_CATEGORY_ID;
|
||||
import static net.osmand.aidlapi.OsmAndCustomizationConstants.TEXT_SIZE_ID;
|
||||
import static net.osmand.aidlapi.OsmAndCustomizationConstants.TRANSPORT_ID;
|
||||
import static net.osmand.aidlapi.OsmAndCustomizationConstants.WIKIPEDIA_ID;
|
||||
import static net.osmand.plus.ContextMenuAdapter.makeDeleteAction;
|
||||
import static net.osmand.plus.srtmplugin.SRTMPlugin.CONTOUR_DENSITY_ATTR;
|
||||
import static net.osmand.plus.srtmplugin.SRTMPlugin.CONTOUR_LINES_ATTR;
|
||||
|
@ -181,188 +167,12 @@ public class ConfigureMapMenu {
|
|||
return customRules;
|
||||
}
|
||||
|
||||
private final class LayerMenuListener extends OnRowItemClick {
|
||||
private MapActivity ma;
|
||||
private ContextMenuAdapter cm;
|
||||
|
||||
private LayerMenuListener(MapActivity ma, ContextMenuAdapter cm) {
|
||||
this.ma = ma;
|
||||
this.cm = cm;
|
||||
}
|
||||
|
||||
private List<String> getAlreadySelectedGpx() {
|
||||
GpxSelectionHelper selectedGpxHelper = ma.getMyApplication().getSelectedGpxHelper();
|
||||
List<GpxSelectionHelper.SelectedGpxFile> selectedGpxFiles = selectedGpxHelper.getSelectedGPXFiles();
|
||||
|
||||
List<String> files = new ArrayList<>();
|
||||
for (GpxSelectionHelper.SelectedGpxFile file : selectedGpxFiles) {
|
||||
files.add(file.getGpxFile().path);
|
||||
}
|
||||
if (selectedGpxFiles.isEmpty()) {
|
||||
Map<GPXUtilities.GPXFile, Long> fls = selectedGpxHelper.getSelectedGpxFilesBackUp();
|
||||
for(Map.Entry<GPXUtilities.GPXFile, Long> f : fls.entrySet()) {
|
||||
if(!Algorithms.isEmpty(f.getKey().path)) {
|
||||
File file = new File(f.getKey().path);
|
||||
if(file.exists() && !file.isDirectory()) {
|
||||
files.add(f.getKey().path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return files;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onRowItemClick(final ArrayAdapter<ContextMenuItem> adapter, View view, int itemId, int pos) {
|
||||
if (itemId == R.string.layer_poi) {
|
||||
showPoiFilterDialog(adapter, adapter.getItem(pos));
|
||||
return false;
|
||||
} else if (itemId == R.string.layer_gpx_layer && cm.getItem(pos).getSelected()) {
|
||||
showGpxSelectionDialog(adapter, adapter.getItem(pos));
|
||||
return false;
|
||||
} else if (itemId == R.string.rendering_category_transport) {
|
||||
final ContextMenuItem item = adapter.getItem(pos);
|
||||
TransportLinesMenu.showTransportsDialog(ma, new CallbackWithObject<Boolean>() {
|
||||
@Override
|
||||
public boolean processResult(Boolean result) {
|
||||
if (item != null) {
|
||||
item.setSelected(result);
|
||||
item.setColorRes(result ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
boolean selected = TransportLinesMenu.isShowLines(ma.getMyApplication());
|
||||
if (!selected && item != null) {
|
||||
item.setSelected(true);
|
||||
item.setColorRes(R.color.osmand_orange);
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
CompoundButton btn = (CompoundButton) view.findViewById(R.id.toggle_item);
|
||||
if (btn != null && btn.getVisibility() == View.VISIBLE) {
|
||||
btn.setChecked(!btn.isChecked());
|
||||
cm.getItem(pos).setColorRes(btn.isChecked() ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||
adapter.notifyDataSetChanged();
|
||||
return false;
|
||||
} else {
|
||||
return onContextMenuClick(adapter, itemId, pos, false, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onContextMenuClick(final ArrayAdapter<ContextMenuItem> adapter, int itemId,
|
||||
final int pos, boolean isChecked, int[] viewCoordinates) {
|
||||
final OsmandSettings settings = ma.getMyApplication().getSettings();
|
||||
final PoiFiltersHelper poiFiltersHelper = ma.getMyApplication().getPoiFilters();
|
||||
final ContextMenuItem item = cm.getItem(pos);
|
||||
if (item.getSelected() != null) {
|
||||
item.setColorRes(isChecked ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||
}
|
||||
if (itemId == R.string.layer_poi) {
|
||||
PoiUIFilter wiki = poiFiltersHelper.getTopWikiPoiFilter();
|
||||
poiFiltersHelper.clearSelectedPoiFilters(wiki);
|
||||
if (isChecked) {
|
||||
showPoiFilterDialog(adapter, adapter.getItem(pos));
|
||||
} else {
|
||||
adapter.getItem(pos).setDescription(
|
||||
poiFiltersHelper.getSelectedPoiFiltersName(wiki));
|
||||
}
|
||||
} else if (itemId == R.string.layer_amenity_label) {
|
||||
settings.SHOW_POI_LABEL.set(isChecked);
|
||||
} else if (itemId == R.string.shared_string_favorites) {
|
||||
settings.SHOW_FAVORITES.set(isChecked);
|
||||
} else if (itemId == R.string.layer_gpx_layer) {
|
||||
final GpxSelectionHelper selectedGpxHelper = ma.getMyApplication().getSelectedGpxHelper();
|
||||
if (selectedGpxHelper.isShowingAnyGpxFiles()) {
|
||||
selectedGpxHelper.clearAllGpxFilesToShow(true);
|
||||
adapter.getItem(pos).setDescription(selectedGpxHelper.getGpxDescription());
|
||||
} else {
|
||||
showGpxSelectionDialog(adapter, adapter.getItem(pos));
|
||||
}
|
||||
} else if (itemId == R.string.rendering_category_transport) {
|
||||
boolean selected = TransportLinesMenu.isShowLines(ma.getMyApplication());
|
||||
TransportLinesMenu.toggleTransportLines(ma, !selected, new CallbackWithObject<Boolean>() {
|
||||
@Override
|
||||
public boolean processResult(Boolean result) {
|
||||
item.setSelected(result);
|
||||
item.setColorRes(result ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||
adapter.notifyDataSetChanged();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
} else if (itemId == R.string.map_markers) {
|
||||
settings.SHOW_MAP_MARKERS.set(isChecked);
|
||||
} else if (itemId == R.string.layer_map) {
|
||||
if (OsmandPlugin.getEnabledPlugin(OsmandRasterMapsPlugin.class) == null) {
|
||||
Intent intent = new Intent(ma, PluginActivity.class);
|
||||
intent.putExtra(PluginActivity.EXTRA_PLUGIN_ID, OsmandRasterMapsPlugin.ID);
|
||||
ma.startActivity(intent);
|
||||
} else {
|
||||
ContextMenuItem it = adapter.getItem(pos);
|
||||
ma.getMapLayers().selectMapLayer(ma.getMapView(), it, adapter);
|
||||
}
|
||||
}
|
||||
adapter.notifyDataSetChanged();
|
||||
ma.getMapLayers().updateLayers(ma.getMapView());
|
||||
ma.getMapView().refreshMap();
|
||||
return false;
|
||||
}
|
||||
|
||||
private void showGpxSelectionDialog(final ArrayAdapter<ContextMenuItem> adapter,
|
||||
final ContextMenuItem item) {
|
||||
AlertDialog dialog = ma.getMapLayers().showGPXFileLayer(getAlreadySelectedGpx(),
|
||||
ma.getMapView());
|
||||
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
|
||||
@Override
|
||||
public void onDismiss(DialogInterface dialog) {
|
||||
OsmandApplication app = ma.getMyApplication();
|
||||
boolean selected = app.getSelectedGpxHelper().isShowingAnyGpxFiles();
|
||||
item.setSelected(selected);
|
||||
item.setDescription(app.getSelectedGpxHelper().getGpxDescription());
|
||||
item.setColorRes(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected void showPoiFilterDialog(final ArrayAdapter<ContextMenuItem> adapter,
|
||||
final ContextMenuItem item) {
|
||||
final PoiFiltersHelper poiFiltersHelper = ma.getMyApplication().getPoiFilters();
|
||||
final PoiUIFilter wiki = poiFiltersHelper.getTopWikiPoiFilter();
|
||||
MapActivityLayers.DismissListener dismissListener =
|
||||
new MapActivityLayers.DismissListener() {
|
||||
@Override
|
||||
public void dismiss() {
|
||||
PoiFiltersHelper pf = ma.getMyApplication().getPoiFilters();
|
||||
boolean selected = pf.isShowingAnyPoi(wiki);
|
||||
item.setSelected(selected);
|
||||
item.setDescription(pf.getSelectedPoiFiltersName(wiki));
|
||||
item.setColorRes(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
};
|
||||
if (poiFiltersHelper.isShowingAnyPoi(wiki)) {
|
||||
ma.getMapLayers().showMultichoicePoiFilterDialog(ma.getMapView(),
|
||||
dismissListener);
|
||||
} else {
|
||||
ma.getMapLayers().showSingleChoicePoiFilterDialog(ma.getMapView(),
|
||||
dismissListener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void createLayersItems(List<RenderingRuleProperty> customRules, ContextMenuAdapter adapter,
|
||||
final MapActivity activity, final int themeRes, final boolean nightMode) {
|
||||
final OsmandApplication app = activity.getMyApplication();
|
||||
final OsmandSettings settings = app.getSettings();
|
||||
final int selectedProfileColorRes = settings.getApplicationMode().getIconColorInfo().getColor(nightMode);
|
||||
final int selectedProfileColor = ContextCompat.getColor(app, selectedProfileColorRes);
|
||||
LayerMenuListener l = new LayerMenuListener(activity, adapter);
|
||||
MapLayerMenuListener l = new MapLayerMenuListener(activity, adapter);
|
||||
adapter.addItem(new ContextMenuItem.ItemBuilder()
|
||||
.setId(SHOW_CATEGORY_ID)
|
||||
.setTitleId(R.string.shared_string_show, activity)
|
||||
|
@ -1299,230 +1109,35 @@ public class ConfigureMapMenu {
|
|||
}
|
||||
}
|
||||
|
||||
private class StringSpinnerArrayAdapter extends ArrayAdapter<String> {
|
||||
private static class StringSpinnerArrayAdapter extends ArrayAdapter<String> {
|
||||
|
||||
private boolean nightMode;
|
||||
|
||||
public StringSpinnerArrayAdapter(Context context, boolean nightMode) {
|
||||
super(context, android.R.layout.simple_spinner_item);
|
||||
setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
OsmandApplication app = (OsmandApplication )getContext().getApplicationContext();
|
||||
this.nightMode = nightMode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
TextView label = (TextView) super.getView(position, convertView, parent);
|
||||
|
||||
String text = getItem(position);
|
||||
label.setText(text);
|
||||
label.setTextColor(nightMode ?
|
||||
ContextCompat.getColorStateList(getContext(), R.color.text_color_primary_dark) : ContextCompat.getColorStateList(getContext(), R.color.text_color_primary_light));
|
||||
return label;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getDropDownView(int position, View convertView, ViewGroup parent) {
|
||||
TextView label = (TextView) super.getDropDownView(position, convertView, parent);
|
||||
|
||||
String text = getItem(position);
|
||||
label.setText(text);
|
||||
label.setTextColor(nightMode ?
|
||||
ContextCompat.getColorStateList(getContext(), R.color.text_color_primary_dark) : ContextCompat.getColorStateList(getContext(), R.color.text_color_primary_light));
|
||||
|
||||
return label;
|
||||
}
|
||||
}
|
||||
|
||||
public static class GpxAppearanceAdapter extends ArrayAdapter<AppearanceListItem> {
|
||||
|
||||
private OsmandApplication app;
|
||||
private int currentColor;
|
||||
private GpxAppearanceAdapterType adapterType = GpxAppearanceAdapterType.TRACK_WIDTH_COLOR;
|
||||
|
||||
public enum GpxAppearanceAdapterType {
|
||||
TRACK_WIDTH,
|
||||
TRACK_COLOR,
|
||||
TRACK_WIDTH_COLOR
|
||||
}
|
||||
|
||||
public GpxAppearanceAdapter(Context context, String currentColorValue, GpxAppearanceAdapterType adapterType) {
|
||||
super(context, R.layout.rendering_prop_menu_item);
|
||||
this.app = (OsmandApplication) getContext().getApplicationContext();
|
||||
this.adapterType = adapterType;
|
||||
RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer();
|
||||
this.currentColor = parseTrackColor(renderer, currentColorValue);
|
||||
init();
|
||||
}
|
||||
|
||||
public GpxAppearanceAdapter(Context context, int currentColor, GpxAppearanceAdapterType adapterType) {
|
||||
super(context, R.layout.rendering_prop_menu_item);
|
||||
this.app = (OsmandApplication) getContext().getApplicationContext();
|
||||
this.adapterType = adapterType;
|
||||
this.currentColor = currentColor;
|
||||
init();
|
||||
}
|
||||
|
||||
public void init() {
|
||||
RenderingRuleProperty trackWidthProp = null;
|
||||
RenderingRuleProperty trackColorProp = null;
|
||||
RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer();
|
||||
if (renderer != null) {
|
||||
if (adapterType == GpxAppearanceAdapterType.TRACK_WIDTH || adapterType == GpxAppearanceAdapterType.TRACK_WIDTH_COLOR) {
|
||||
trackWidthProp = renderer.PROPS.getCustomRule(CURRENT_TRACK_WIDTH_ATTR);
|
||||
}
|
||||
if (adapterType == GpxAppearanceAdapterType.TRACK_COLOR || adapterType == GpxAppearanceAdapterType.TRACK_WIDTH_COLOR) {
|
||||
trackColorProp = renderer.PROPS.getCustomRule(CURRENT_TRACK_COLOR_ATTR);
|
||||
}
|
||||
}
|
||||
|
||||
if (trackWidthProp != null) {
|
||||
AppearanceListItem item = new AppearanceListItem(CURRENT_TRACK_WIDTH_ATTR, "",
|
||||
SettingsActivity.getStringPropertyValue(getContext(), trackWidthProp.getDefaultValueDescription()));
|
||||
add(item);
|
||||
for (int j = 0; j < trackWidthProp.getPossibleValues().length; j++) {
|
||||
item = new AppearanceListItem(CURRENT_TRACK_WIDTH_ATTR,
|
||||
trackWidthProp.getPossibleValues()[j],
|
||||
SettingsActivity.getStringPropertyValue(getContext(), trackWidthProp.getPossibleValues()[j]));
|
||||
add(item);
|
||||
}
|
||||
item.setLastItem(true);
|
||||
}
|
||||
if (trackColorProp != null) {
|
||||
AppearanceListItem item = new AppearanceListItem(CURRENT_TRACK_COLOR_ATTR, "",
|
||||
SettingsActivity.getStringPropertyValue(getContext(), trackColorProp.getDefaultValueDescription()),
|
||||
parseTrackColor(renderer, ""));
|
||||
add(item);
|
||||
for (int j = 0; j < trackColorProp.getPossibleValues().length; j++) {
|
||||
item = new AppearanceListItem(CURRENT_TRACK_COLOR_ATTR,
|
||||
trackColorProp.getPossibleValues()[j],
|
||||
SettingsActivity.getStringPropertyValue(getContext(), trackColorProp.getPossibleValues()[j]),
|
||||
parseTrackColor(renderer, trackColorProp.getPossibleValues()[j]));
|
||||
add(item);
|
||||
}
|
||||
item.setLastItem(true);
|
||||
}
|
||||
}
|
||||
|
||||
public static int parseTrackColor(RenderingRulesStorage renderer, String colorName) {
|
||||
int defaultColor = -1;
|
||||
RenderingRule gpxRule = null;
|
||||
if (renderer != null) {
|
||||
gpxRule = renderer.getRenderingAttributeRule("gpx");
|
||||
}
|
||||
if (gpxRule != null && gpxRule.getIfElseChildren().size() > 0) {
|
||||
List<RenderingRule> rules = gpxRule.getIfElseChildren().get(0).getIfElseChildren();
|
||||
for (RenderingRule r : rules) {
|
||||
String cName = r.getStringPropertyValue(CURRENT_TRACK_COLOR_ATTR);
|
||||
if (!Algorithms.isEmpty(cName) && cName.equals(colorName)) {
|
||||
return r.getIntPropertyValue(COLOR_ATTR);
|
||||
}
|
||||
if (cName == null && defaultColor == -1) {
|
||||
defaultColor = r.getIntPropertyValue(COLOR_ATTR);
|
||||
}
|
||||
}
|
||||
}
|
||||
return defaultColor;
|
||||
}
|
||||
|
||||
public static String parseTrackColorName(RenderingRulesStorage renderer, int color) {
|
||||
RenderingRule gpxRule = null;
|
||||
if (renderer != null) {
|
||||
gpxRule = renderer.getRenderingAttributeRule("gpx");
|
||||
}
|
||||
if (gpxRule != null && gpxRule.getIfElseChildren().size() > 0) {
|
||||
List<RenderingRule> rules = gpxRule.getIfElseChildren().get(0).getIfElseChildren();
|
||||
for (RenderingRule r : rules) {
|
||||
String cName = r.getStringPropertyValue(CURRENT_TRACK_COLOR_ATTR);
|
||||
if (!Algorithms.isEmpty(cName) && color == r.getIntPropertyValue(COLOR_ATTR)) {
|
||||
return cName;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Algorithms.colorToString(color);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
|
||||
AppearanceListItem item = getItem(position);
|
||||
View v = convertView;
|
||||
if (v == null) {
|
||||
v = LayoutInflater.from(getContext()).inflate(R.layout.rendering_prop_menu_item, null);
|
||||
}
|
||||
if (item != null) {
|
||||
TextView textView = (TextView) v.findViewById(R.id.text1);
|
||||
textView.setText(item.localizedValue);
|
||||
if (item.attrName == CURRENT_TRACK_WIDTH_ATTR) {
|
||||
int iconId;
|
||||
if (item.value.equals("bold")) {
|
||||
iconId = R.drawable.ic_action_gpx_width_bold;
|
||||
} else if (item.value.equals("medium")) {
|
||||
iconId = R.drawable.ic_action_gpx_width_medium;
|
||||
} else {
|
||||
iconId = R.drawable.ic_action_gpx_width_thin;
|
||||
}
|
||||
textView.setCompoundDrawablesWithIntrinsicBounds(null, null,
|
||||
app.getUIUtilities().getPaintedIcon(iconId, currentColor), null);
|
||||
} else {
|
||||
if (item.color == -1) {
|
||||
textView.setCompoundDrawablesWithIntrinsicBounds(null, null,
|
||||
app.getUIUtilities().getThemedIcon(R.drawable.ic_action_circle), null);
|
||||
} else {
|
||||
textView.setCompoundDrawablesWithIntrinsicBounds(null, null,
|
||||
app.getUIUtilities().getPaintedIcon(R.drawable.ic_action_circle, item.color), null);
|
||||
}
|
||||
}
|
||||
textView.setCompoundDrawablePadding(AndroidUtils.dpToPx(getContext(), 10f));
|
||||
v.findViewById(R.id.divider).setVisibility(item.lastItem
|
||||
&& position < getCount() - 1 ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
TextView label = (TextView) super.getView(position, convertView, parent);
|
||||
setupLabel(label, getItem(position));
|
||||
return label;
|
||||
}
|
||||
|
||||
public static class AppearanceListItem {
|
||||
private String attrName;
|
||||
private String value;
|
||||
private String localizedValue;
|
||||
private int color;
|
||||
private boolean lastItem;
|
||||
|
||||
public AppearanceListItem(String attrName, String value, String localizedValue) {
|
||||
this.attrName = attrName;
|
||||
this.value = value;
|
||||
this.localizedValue = localizedValue;
|
||||
@Override
|
||||
public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) {
|
||||
TextView label = (TextView) super.getDropDownView(position, convertView, parent);
|
||||
setupLabel(label, getItem(position));
|
||||
return label;
|
||||
}
|
||||
|
||||
public AppearanceListItem(String attrName, String value, String localizedValue, int color) {
|
||||
this.attrName = attrName;
|
||||
this.value = value;
|
||||
this.localizedValue = localizedValue;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public String getAttrName() {
|
||||
return attrName;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public String getLocalizedValue() {
|
||||
return localizedValue;
|
||||
}
|
||||
|
||||
public int getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
public boolean isLastItem() {
|
||||
return lastItem;
|
||||
}
|
||||
|
||||
public void setLastItem(boolean lastItem) {
|
||||
this.lastItem = lastItem;
|
||||
private void setupLabel(TextView label, String text) {
|
||||
int colorId = nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light;
|
||||
label.setText(text);
|
||||
label.setTextColor(ContextCompat.getColorStateList(getContext(), colorId));
|
||||
}
|
||||
}
|
||||
}
|
214
OsmAnd/src/net/osmand/plus/dialogs/GpxAppearanceAdapter.java
Normal file
214
OsmAnd/src/net/osmand/plus/dialogs/GpxAppearanceAdapter.java
Normal file
|
@ -0,0 +1,214 @@
|
|||
package net.osmand.plus.dialogs;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.activities.SettingsActivity;
|
||||
import net.osmand.render.RenderingRule;
|
||||
import net.osmand.render.RenderingRuleProperty;
|
||||
import net.osmand.render.RenderingRulesStorage;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class GpxAppearanceAdapter extends ArrayAdapter<GpxAppearanceAdapter.AppearanceListItem> {
|
||||
|
||||
private OsmandApplication app;
|
||||
private GpxAppearanceAdapterType adapterType;
|
||||
private int currentColor;
|
||||
|
||||
public enum GpxAppearanceAdapterType {
|
||||
TRACK_WIDTH,
|
||||
TRACK_COLOR,
|
||||
TRACK_WIDTH_COLOR
|
||||
}
|
||||
|
||||
public GpxAppearanceAdapter(Context context, String currentColorValue, GpxAppearanceAdapterType adapterType) {
|
||||
super(context, R.layout.rendering_prop_menu_item);
|
||||
this.app = (OsmandApplication) context.getApplicationContext();
|
||||
this.adapterType = adapterType;
|
||||
RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer();
|
||||
this.currentColor = parseTrackColor(renderer, currentColorValue);
|
||||
init();
|
||||
}
|
||||
|
||||
public GpxAppearanceAdapter(Context context, int currentColor, GpxAppearanceAdapterType adapterType) {
|
||||
super(context, R.layout.rendering_prop_menu_item);
|
||||
this.app = (OsmandApplication) context.getApplicationContext();
|
||||
this.adapterType = adapterType;
|
||||
this.currentColor = currentColor;
|
||||
init();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
|
||||
AppearanceListItem item = getItem(position);
|
||||
View v = convertView;
|
||||
if (v == null) {
|
||||
v = LayoutInflater.from(getContext()).inflate(R.layout.rendering_prop_menu_item, null);
|
||||
}
|
||||
if (item != null) {
|
||||
TextView textView = (TextView) v.findViewById(R.id.text1);
|
||||
textView.setText(item.localizedValue);
|
||||
if (ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR.equals(item.attrName)) {
|
||||
int iconId;
|
||||
if ("bold".equals(item.value)) {
|
||||
iconId = R.drawable.ic_action_gpx_width_bold;
|
||||
} else if ("medium".equals(item.value)) {
|
||||
iconId = R.drawable.ic_action_gpx_width_medium;
|
||||
} else {
|
||||
iconId = R.drawable.ic_action_gpx_width_thin;
|
||||
}
|
||||
textView.setCompoundDrawablesWithIntrinsicBounds(null, null,
|
||||
app.getUIUtilities().getPaintedIcon(iconId, currentColor), null);
|
||||
} else {
|
||||
if (item.color == -1) {
|
||||
textView.setCompoundDrawablesWithIntrinsicBounds(null, null,
|
||||
app.getUIUtilities().getThemedIcon(R.drawable.ic_action_circle), null);
|
||||
} else {
|
||||
textView.setCompoundDrawablesWithIntrinsicBounds(null, null,
|
||||
app.getUIUtilities().getPaintedIcon(R.drawable.ic_action_circle, item.color), null);
|
||||
}
|
||||
}
|
||||
textView.setCompoundDrawablePadding(AndroidUtils.dpToPx(getContext(), 10f));
|
||||
v.findViewById(R.id.divider).setVisibility(item.lastItem
|
||||
&& position < getCount() - 1 ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
public void init() {
|
||||
RenderingRuleProperty trackWidthProp = null;
|
||||
RenderingRuleProperty trackColorProp = null;
|
||||
RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer();
|
||||
if (renderer != null) {
|
||||
if (adapterType == GpxAppearanceAdapterType.TRACK_WIDTH || adapterType == GpxAppearanceAdapterType.TRACK_WIDTH_COLOR) {
|
||||
trackWidthProp = renderer.PROPS.getCustomRule(ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR);
|
||||
}
|
||||
if (adapterType == GpxAppearanceAdapterType.TRACK_COLOR || adapterType == GpxAppearanceAdapterType.TRACK_WIDTH_COLOR) {
|
||||
trackColorProp = renderer.PROPS.getCustomRule(ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR);
|
||||
}
|
||||
}
|
||||
|
||||
if (trackWidthProp != null) {
|
||||
AppearanceListItem item = new AppearanceListItem(ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR, "",
|
||||
SettingsActivity.getStringPropertyValue(getContext(), trackWidthProp.getDefaultValueDescription()));
|
||||
add(item);
|
||||
for (int j = 0; j < trackWidthProp.getPossibleValues().length; j++) {
|
||||
item = new AppearanceListItem(ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR,
|
||||
trackWidthProp.getPossibleValues()[j],
|
||||
SettingsActivity.getStringPropertyValue(getContext(), trackWidthProp.getPossibleValues()[j]));
|
||||
add(item);
|
||||
}
|
||||
item.setLastItem(true);
|
||||
}
|
||||
if (trackColorProp != null) {
|
||||
AppearanceListItem item = new AppearanceListItem(ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR, "",
|
||||
SettingsActivity.getStringPropertyValue(getContext(), trackColorProp.getDefaultValueDescription()),
|
||||
parseTrackColor(renderer, ""));
|
||||
add(item);
|
||||
for (int j = 0; j < trackColorProp.getPossibleValues().length; j++) {
|
||||
item = new AppearanceListItem(ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR,
|
||||
trackColorProp.getPossibleValues()[j],
|
||||
SettingsActivity.getStringPropertyValue(getContext(), trackColorProp.getPossibleValues()[j]),
|
||||
parseTrackColor(renderer, trackColorProp.getPossibleValues()[j]));
|
||||
add(item);
|
||||
}
|
||||
item.setLastItem(true);
|
||||
}
|
||||
}
|
||||
|
||||
public static int parseTrackColor(RenderingRulesStorage renderer, String colorName) {
|
||||
int defaultColor = -1;
|
||||
RenderingRule gpxRule = null;
|
||||
if (renderer != null) {
|
||||
gpxRule = renderer.getRenderingAttributeRule("gpx");
|
||||
}
|
||||
if (gpxRule != null && gpxRule.getIfElseChildren().size() > 0) {
|
||||
List<RenderingRule> rules = gpxRule.getIfElseChildren().get(0).getIfElseChildren();
|
||||
for (RenderingRule r : rules) {
|
||||
String cName = r.getStringPropertyValue(ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR);
|
||||
if (!Algorithms.isEmpty(cName) && cName.equals(colorName)) {
|
||||
return r.getIntPropertyValue(ConfigureMapMenu.COLOR_ATTR);
|
||||
}
|
||||
if (cName == null && defaultColor == -1) {
|
||||
defaultColor = r.getIntPropertyValue(ConfigureMapMenu.COLOR_ATTR);
|
||||
}
|
||||
}
|
||||
}
|
||||
return defaultColor;
|
||||
}
|
||||
|
||||
public static String parseTrackColorName(RenderingRulesStorage renderer, int color) {
|
||||
RenderingRule gpxRule = null;
|
||||
if (renderer != null) {
|
||||
gpxRule = renderer.getRenderingAttributeRule("gpx");
|
||||
}
|
||||
if (gpxRule != null && gpxRule.getIfElseChildren().size() > 0) {
|
||||
List<RenderingRule> rules = gpxRule.getIfElseChildren().get(0).getIfElseChildren();
|
||||
for (RenderingRule r : rules) {
|
||||
String cName = r.getStringPropertyValue(ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR);
|
||||
if (!Algorithms.isEmpty(cName) && color == r.getIntPropertyValue(ConfigureMapMenu.COLOR_ATTR)) {
|
||||
return cName;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Algorithms.colorToString(color);
|
||||
}
|
||||
|
||||
public static class AppearanceListItem {
|
||||
|
||||
private String attrName;
|
||||
private String value;
|
||||
private String localizedValue;
|
||||
private int color;
|
||||
private boolean lastItem;
|
||||
|
||||
public AppearanceListItem(String attrName, String value, String localizedValue) {
|
||||
this.attrName = attrName;
|
||||
this.value = value;
|
||||
this.localizedValue = localizedValue;
|
||||
}
|
||||
|
||||
public AppearanceListItem(String attrName, String value, String localizedValue, int color) {
|
||||
this.attrName = attrName;
|
||||
this.value = value;
|
||||
this.localizedValue = localizedValue;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public String getAttrName() {
|
||||
return attrName;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public String getLocalizedValue() {
|
||||
return localizedValue;
|
||||
}
|
||||
|
||||
public int getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
public boolean isLastItem() {
|
||||
return lastItem;
|
||||
}
|
||||
|
||||
public void setLastItem(boolean lastItem) {
|
||||
this.lastItem = lastItem;
|
||||
}
|
||||
}
|
||||
}
|
210
OsmAnd/src/net/osmand/plus/dialogs/MapLayerMenuListener.java
Normal file
210
OsmAnd/src/net/osmand/plus/dialogs/MapLayerMenuListener.java
Normal file
|
@ -0,0 +1,210 @@
|
|||
package net.osmand.plus.dialogs;
|
||||
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.view.View;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.CompoundButton;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import net.osmand.CallbackWithObject;
|
||||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.plus.ContextMenuAdapter;
|
||||
import net.osmand.plus.ContextMenuAdapter.OnRowItemClick;
|
||||
import net.osmand.plus.ContextMenuItem;
|
||||
import net.osmand.plus.GpxSelectionHelper;
|
||||
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandPlugin;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.activities.MapActivityLayers;
|
||||
import net.osmand.plus.activities.PluginActivity;
|
||||
import net.osmand.plus.poi.PoiFiltersHelper;
|
||||
import net.osmand.plus.poi.PoiUIFilter;
|
||||
import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||
import net.osmand.plus.transport.TransportLinesMenu;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
final class MapLayerMenuListener extends OnRowItemClick {
|
||||
|
||||
private MapActivity mapActivity;
|
||||
private ContextMenuAdapter menuAdapter;
|
||||
|
||||
MapLayerMenuListener(MapActivity mapActivity, ContextMenuAdapter menuAdapter) {
|
||||
this.mapActivity = mapActivity;
|
||||
this.menuAdapter = menuAdapter;
|
||||
}
|
||||
|
||||
private List<String> getAlreadySelectedGpx() {
|
||||
GpxSelectionHelper selectedGpxHelper = mapActivity.getMyApplication().getSelectedGpxHelper();
|
||||
List<SelectedGpxFile> selectedGpxFiles = selectedGpxHelper.getSelectedGPXFiles();
|
||||
|
||||
List<String> files = new ArrayList<>();
|
||||
for (SelectedGpxFile file : selectedGpxFiles) {
|
||||
files.add(file.getGpxFile().path);
|
||||
}
|
||||
if (selectedGpxFiles.isEmpty()) {
|
||||
Map<GPXFile, Long> fls = selectedGpxHelper.getSelectedGpxFilesBackUp();
|
||||
for (Map.Entry<GPXFile, Long> f : fls.entrySet()) {
|
||||
if (!Algorithms.isEmpty(f.getKey().path)) {
|
||||
File file = new File(f.getKey().path);
|
||||
if (file.exists() && !file.isDirectory()) {
|
||||
files.add(f.getKey().path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return files;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onRowItemClick(final ArrayAdapter<ContextMenuItem> adapter, View view, int itemId, int pos) {
|
||||
if (itemId == R.string.layer_poi) {
|
||||
showPoiFilterDialog(adapter, adapter.getItem(pos));
|
||||
return false;
|
||||
} else if (itemId == R.string.layer_gpx_layer && menuAdapter.getItem(pos).getSelected()) {
|
||||
showGpxSelectionDialog(adapter, adapter.getItem(pos));
|
||||
return false;
|
||||
} else if (itemId == R.string.rendering_category_transport) {
|
||||
final ContextMenuItem item = adapter.getItem(pos);
|
||||
TransportLinesMenu.showTransportsDialog(mapActivity, new CallbackWithObject<Boolean>() {
|
||||
@Override
|
||||
public boolean processResult(Boolean result) {
|
||||
if (item != null) {
|
||||
item.setSelected(result);
|
||||
item.setColorRes(result ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
boolean selected = TransportLinesMenu.isShowLines(mapActivity.getMyApplication());
|
||||
if (!selected && item != null) {
|
||||
item.setSelected(true);
|
||||
item.setColorRes(R.color.osmand_orange);
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
CompoundButton btn = (CompoundButton) view.findViewById(R.id.toggle_item);
|
||||
if (btn != null && btn.getVisibility() == View.VISIBLE) {
|
||||
btn.setChecked(!btn.isChecked());
|
||||
menuAdapter.getItem(pos).setColorRes(btn.isChecked() ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||
adapter.notifyDataSetChanged();
|
||||
return false;
|
||||
} else {
|
||||
return onContextMenuClick(adapter, itemId, pos, false, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onContextMenuClick(final ArrayAdapter<ContextMenuItem> adapter, int itemId,
|
||||
final int pos, boolean isChecked, int[] viewCoordinates) {
|
||||
final OsmandSettings settings = mapActivity.getMyApplication().getSettings();
|
||||
final PoiFiltersHelper poiFiltersHelper = mapActivity.getMyApplication().getPoiFilters();
|
||||
final ContextMenuItem item = menuAdapter.getItem(pos);
|
||||
if (item.getSelected() != null) {
|
||||
item.setColorRes(isChecked ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||
}
|
||||
if (itemId == R.string.layer_poi) {
|
||||
PoiUIFilter wiki = poiFiltersHelper.getTopWikiPoiFilter();
|
||||
poiFiltersHelper.clearSelectedPoiFilters(wiki);
|
||||
if (isChecked) {
|
||||
showPoiFilterDialog(adapter, adapter.getItem(pos));
|
||||
} else {
|
||||
adapter.getItem(pos).setDescription(
|
||||
poiFiltersHelper.getSelectedPoiFiltersName(wiki));
|
||||
}
|
||||
} else if (itemId == R.string.layer_amenity_label) {
|
||||
settings.SHOW_POI_LABEL.set(isChecked);
|
||||
} else if (itemId == R.string.shared_string_favorites) {
|
||||
settings.SHOW_FAVORITES.set(isChecked);
|
||||
} else if (itemId == R.string.layer_gpx_layer) {
|
||||
final GpxSelectionHelper selectedGpxHelper = mapActivity.getMyApplication().getSelectedGpxHelper();
|
||||
if (selectedGpxHelper.isShowingAnyGpxFiles()) {
|
||||
selectedGpxHelper.clearAllGpxFilesToShow(true);
|
||||
adapter.getItem(pos).setDescription(selectedGpxHelper.getGpxDescription());
|
||||
} else {
|
||||
showGpxSelectionDialog(adapter, adapter.getItem(pos));
|
||||
}
|
||||
} else if (itemId == R.string.rendering_category_transport) {
|
||||
boolean selected = TransportLinesMenu.isShowLines(mapActivity.getMyApplication());
|
||||
TransportLinesMenu.toggleTransportLines(mapActivity, !selected, new CallbackWithObject<Boolean>() {
|
||||
@Override
|
||||
public boolean processResult(Boolean result) {
|
||||
item.setSelected(result);
|
||||
item.setColorRes(result ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||
adapter.notifyDataSetChanged();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
} else if (itemId == R.string.map_markers) {
|
||||
settings.SHOW_MAP_MARKERS.set(isChecked);
|
||||
} else if (itemId == R.string.layer_map) {
|
||||
if (OsmandPlugin.getEnabledPlugin(OsmandRasterMapsPlugin.class) == null) {
|
||||
Intent intent = new Intent(mapActivity, PluginActivity.class);
|
||||
intent.putExtra(PluginActivity.EXTRA_PLUGIN_ID, OsmandRasterMapsPlugin.ID);
|
||||
mapActivity.startActivity(intent);
|
||||
} else {
|
||||
ContextMenuItem it = adapter.getItem(pos);
|
||||
mapActivity.getMapLayers().selectMapLayer(mapActivity.getMapView(), it, adapter);
|
||||
}
|
||||
}
|
||||
adapter.notifyDataSetChanged();
|
||||
mapActivity.getMapLayers().updateLayers(mapActivity.getMapView());
|
||||
mapActivity.getMapView().refreshMap();
|
||||
return false;
|
||||
}
|
||||
|
||||
private void showGpxSelectionDialog(final ArrayAdapter<ContextMenuItem> adapter,
|
||||
final ContextMenuItem item) {
|
||||
AlertDialog dialog = mapActivity.getMapLayers().showGPXFileLayer(getAlreadySelectedGpx(),
|
||||
mapActivity.getMapView());
|
||||
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
|
||||
@Override
|
||||
public void onDismiss(DialogInterface dialog) {
|
||||
OsmandApplication app = mapActivity.getMyApplication();
|
||||
boolean selected = app.getSelectedGpxHelper().isShowingAnyGpxFiles();
|
||||
item.setSelected(selected);
|
||||
item.setDescription(app.getSelectedGpxHelper().getGpxDescription());
|
||||
item.setColorRes(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected void showPoiFilterDialog(final ArrayAdapter<ContextMenuItem> adapter,
|
||||
final ContextMenuItem item) {
|
||||
final PoiFiltersHelper poiFiltersHelper = mapActivity.getMyApplication().getPoiFilters();
|
||||
final PoiUIFilter wiki = poiFiltersHelper.getTopWikiPoiFilter();
|
||||
MapActivityLayers.DismissListener dismissListener =
|
||||
new MapActivityLayers.DismissListener() {
|
||||
@Override
|
||||
public void dismiss() {
|
||||
PoiFiltersHelper pf = mapActivity.getMyApplication().getPoiFilters();
|
||||
boolean selected = pf.isShowingAnyPoi(wiki);
|
||||
item.setSelected(selected);
|
||||
item.setDescription(pf.getSelectedPoiFiltersName(wiki));
|
||||
item.setColorRes(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
};
|
||||
if (poiFiltersHelper.isShowingAnyPoi(wiki)) {
|
||||
mapActivity.getMapLayers().showMultichoicePoiFilterDialog(mapActivity.getMapView(),
|
||||
dismissListener);
|
||||
} else {
|
||||
mapActivity.getMapLayers().showSingleChoicePoiFilterDialog(mapActivity.getMapView(),
|
||||
dismissListener);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -80,7 +80,6 @@ import net.osmand.plus.OsmAndConstants;
|
|||
import net.osmand.plus.OsmAndFormatter;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandPlugin;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
import net.osmand.plus.Version;
|
||||
|
@ -90,10 +89,11 @@ import net.osmand.plus.activities.MapActivity;
|
|||
import net.osmand.plus.activities.PluginActivity;
|
||||
import net.osmand.plus.activities.SettingsActivity;
|
||||
import net.osmand.plus.dialogs.ConfigureMapMenu;
|
||||
import net.osmand.plus.dialogs.ConfigureMapMenu.AppearanceListItem;
|
||||
import net.osmand.plus.dialogs.ConfigureMapMenu.GpxAppearanceAdapter;
|
||||
import net.osmand.plus.dialogs.GpxAppearanceAdapter;
|
||||
import net.osmand.plus.dialogs.GpxAppearanceAdapter.AppearanceListItem;
|
||||
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
||||
import net.osmand.plus.routing.RouteCalculationResult;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||
import net.osmand.render.RenderingRuleProperty;
|
||||
import net.osmand.render.RenderingRulesStorage;
|
||||
import net.osmand.router.RouteStatisticsHelper;
|
||||
|
@ -540,9 +540,9 @@ public class GpxUiHelper {
|
|||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
AppearanceListItem item = gpxApprAdapter.getItem(position);
|
||||
if (item != null) {
|
||||
if (item.getAttrName() == CURRENT_TRACK_WIDTH_ATTR) {
|
||||
if (CURRENT_TRACK_WIDTH_ATTR.equals(item.getAttrName())) {
|
||||
gpxAppearanceParams.put(CURRENT_TRACK_WIDTH_ATTR, item.getValue());
|
||||
} else if (item.getAttrName() == CURRENT_TRACK_COLOR_ATTR) {
|
||||
} else if (CURRENT_TRACK_COLOR_ATTR.equals(item.getAttrName())) {
|
||||
gpxAppearanceParams.put(CURRENT_TRACK_COLOR_ATTR, item.getValue());
|
||||
}
|
||||
}
|
||||
|
@ -592,7 +592,7 @@ public class GpxUiHelper {
|
|||
}
|
||||
dialog.dismiss();
|
||||
loadGPXFileInDifferentThread(activity, callbackWithObject, dir, currentGPX,
|
||||
s.toArray(new String[s.size()]));
|
||||
s.toArray(new String[0]));
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(R.string.shared_string_cancel, null);
|
||||
|
|
|
@ -32,7 +32,7 @@ import net.osmand.data.FavouritePoint.BackgroundType;
|
|||
import net.osmand.plus.AppInitializer;
|
||||
import net.osmand.plus.CustomOsmandPlugin;
|
||||
import net.osmand.plus.FavouritesDbHelper;
|
||||
import net.osmand.plus.GPXDatabase;
|
||||
import net.osmand.plus.GPXDatabase.GpxDataItem;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.OsmandPlugin;
|
||||
import net.osmand.plus.R;
|
||||
|
@ -1017,10 +1017,10 @@ public class ImportHelper {
|
|||
gpxFile.path = toWrite.getAbsolutePath();
|
||||
File file = new File(gpxFile.path);
|
||||
if (!destinationExists) {
|
||||
GPXDatabase.GpxDataItem item = new GPXDatabase.GpxDataItem(file, gpxFile.getColor(0));
|
||||
GpxDataItem item = new GpxDataItem(file, gpxFile);
|
||||
app.getGpxDbHelper().add(item);
|
||||
} else {
|
||||
GPXDatabase.GpxDataItem item = app.getGpxDbHelper().getItem(file);
|
||||
GpxDataItem item = app.getGpxDbHelper().getItem(file);
|
||||
if (item != null) {
|
||||
app.getGpxDbHelper().clearAnalysis(item);
|
||||
}
|
||||
|
|
|
@ -97,7 +97,7 @@ public class FavoritePointEditorFragmentNew extends PointEditorFragmentNew {
|
|||
}
|
||||
});
|
||||
if (editor != null && editor.isNew()) {
|
||||
ImageView toolbarAction = (ImageView) view.findViewById(R.id.toolbar_action);
|
||||
ImageView toolbarAction = view.findViewById(R.id.toolbar_action);
|
||||
toolbarAction.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
|
@ -460,30 +460,36 @@ public class FavoritePointEditorFragmentNew extends PointEditorFragmentNew {
|
|||
@Override
|
||||
public Set<String> getCategories() {
|
||||
Set<String> categories = new LinkedHashSet<>();
|
||||
Set<String> categoriesHidden = new LinkedHashSet<>();
|
||||
FavouritesDbHelper helper = getHelper();
|
||||
if (helper != null && editor != null) {
|
||||
OsmandApplication app = getMyApplication();
|
||||
if (editor.isNew()) {
|
||||
FavoriteGroup lastUsedGroup = helper.getGroup(getLastUsedGroup());
|
||||
if (lastUsedGroup != null && lastUsedGroup.isVisible()) {
|
||||
if (lastUsedGroup != null) {
|
||||
categories.add(lastUsedGroup.getDisplayName(app));
|
||||
}
|
||||
for (FavouritesDbHelper.FavoriteGroup fg : getHelper().getFavoriteGroups()) {
|
||||
if (!fg.equals(lastUsedGroup) && fg.isVisible()) {
|
||||
categories.add(fg.getDisplayName(app));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (FavoriteGroup fg : helper.getFavoriteGroups()) {
|
||||
for (FavouritesDbHelper.FavoriteGroup fg : helper.getFavoriteGroups()) {
|
||||
if (!fg.equals(lastUsedGroup)) {
|
||||
if (fg.isVisible()) {
|
||||
categories.add(fg.getDisplayName(app));
|
||||
} else {
|
||||
categoriesHidden.add(fg.getDisplayName(app));
|
||||
}
|
||||
}
|
||||
}
|
||||
categories.addAll(categoriesHidden);
|
||||
}
|
||||
return categories;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCategoryVisible(String name) {
|
||||
if (getHelper() != null) {
|
||||
return getHelper().isGroupVisible(name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCategoryPointsCount(String category) {
|
||||
FavouritesDbHelper helper = getHelper();
|
||||
|
@ -498,6 +504,7 @@ public class FavoritePointEditorFragmentNew extends PointEditorFragmentNew {
|
|||
}
|
||||
|
||||
@Override
|
||||
@ColorInt
|
||||
public int getCategoryColor(String category) {
|
||||
FavouritesDbHelper helper = getHelper();
|
||||
if (helper != null) {
|
||||
|
|
|
@ -5,6 +5,7 @@ import android.app.Activity;
|
|||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.Typeface;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.GradientDrawable;
|
||||
import android.os.Build;
|
||||
|
@ -675,6 +676,7 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
|
|||
|
||||
public void setCategory(String name, int color) {
|
||||
setSelectedItemWithScroll(name);
|
||||
updateColorSelector(color, groupRecyclerView.getRootView());
|
||||
}
|
||||
|
||||
private void setSelectedItemWithScroll(String name) {
|
||||
|
@ -732,6 +734,7 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
|
|||
|
||||
public abstract String getToolbarTitle();
|
||||
|
||||
@ColorInt
|
||||
public abstract int getCategoryColor(String category);
|
||||
|
||||
public abstract int getCategoryPointsCount(String category);
|
||||
|
@ -762,6 +765,12 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
|
|||
|
||||
public abstract Set<String> getCategories();
|
||||
|
||||
protected boolean isCategoryVisible(String name) {
|
||||
return true;
|
||||
}
|
||||
|
||||
;
|
||||
|
||||
String getNameTextValue() {
|
||||
EditText nameEdit = view.findViewById(R.id.name_edit);
|
||||
return nameEdit.getText().toString().trim();
|
||||
|
@ -885,16 +894,13 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
|
|||
public void onClick(View view) {
|
||||
int previousSelectedPosition = getItemPosition(selectedItemName);
|
||||
selectedItemName = items.get(holder.getAdapterPosition());
|
||||
updateColorSelector(getCategoryColor(selectedItemName), groupRecyclerView.getRootView());
|
||||
notifyItemChanged(holder.getAdapterPosition());
|
||||
notifyItemChanged(previousSelectedPosition);
|
||||
}
|
||||
});
|
||||
final String group = items.get(position);
|
||||
holder.groupName.setText(group);
|
||||
int categoryColor = getCategoryColor(group);
|
||||
int color = categoryColor == 0 ? getDefaultColor() : categoryColor;
|
||||
holder.groupIcon.setImageDrawable(UiUtilities.tintDrawable(
|
||||
AppCompatResources.getDrawable(app, R.drawable.ic_action_folder), color));
|
||||
holder.pointsCounter.setText(String.valueOf(getCategoryPointsCount(group)));
|
||||
int strokeColor;
|
||||
int strokeWidth;
|
||||
|
@ -913,6 +919,20 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
|
|||
rectContourDrawable.setStroke(AndroidUtils.dpToPx(app, strokeWidth), strokeColor);
|
||||
holder.groupButton.setImageDrawable(rectContourDrawable);
|
||||
}
|
||||
int color;
|
||||
int iconID;
|
||||
if (!isCategoryVisible(group)) {
|
||||
color = ContextCompat.getColor(app, R.color.text_color_secondary_light);
|
||||
iconID = R.drawable.ic_action_hide;
|
||||
holder.groupName.setTypeface(null, Typeface.ITALIC);
|
||||
} else {
|
||||
int categoryColor = getCategoryColor(group);
|
||||
color = categoryColor == 0 ? getDefaultColor() : categoryColor;
|
||||
iconID = R.drawable.ic_action_folder;
|
||||
holder.groupName.setTypeface(null, Typeface.NORMAL);
|
||||
}
|
||||
holder.groupIcon.setImageDrawable(UiUtilities.tintDrawable(
|
||||
AppCompatResources.getDrawable(app, iconID), color));
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
AndroidUtils.setBackground(app, holder.groupButton, nightMode, R.drawable.ripple_solid_light_6dp,
|
||||
|
|
|
@ -8,6 +8,7 @@ import android.os.AsyncTask;
|
|||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
|
@ -454,6 +455,7 @@ public class WptPtEditorFragmentNew extends PointEditorFragmentNew {
|
|||
}
|
||||
|
||||
@Override
|
||||
@ColorInt
|
||||
public int getCategoryColor(String category) {
|
||||
if (categoriesMap != null) {
|
||||
Integer color = categoriesMap.get(category);
|
||||
|
|
|
@ -46,6 +46,7 @@ import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet;
|
|||
import net.osmand.plus.views.GPXLayer;
|
||||
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory;
|
||||
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
|
@ -312,18 +313,15 @@ public class TrackDetailsMenu {
|
|||
}
|
||||
} else {
|
||||
float distance = pos * dataSet.getDivX();
|
||||
double previousSplitDistance = 0;
|
||||
double totalDistance = 0;
|
||||
WptPt previousPoint = null;
|
||||
for (int i = 0; i < segment.points.size(); i++) {
|
||||
WptPt currentPoint = segment.points.get(i);
|
||||
if (previousPoint != null) {
|
||||
if (currentPoint.distance < previousPoint.distance) {
|
||||
previousSplitDistance += previousPoint.distance;
|
||||
totalDistance += MapUtils.getDistance(previousPoint.lat, previousPoint.lon, currentPoint.lat, currentPoint.lon);
|
||||
}
|
||||
}
|
||||
double totalDistance = previousSplitDistance + currentPoint.distance;
|
||||
if (totalDistance >= distance) {
|
||||
if (previousPoint != null) {
|
||||
if (currentPoint.distance >= distance || Math.abs(totalDistance - distance) < 0.1) {
|
||||
if (previousPoint != null && currentPoint.distance >= distance) {
|
||||
double percent = 1 - (totalDistance - distance) / (currentPoint.distance - previousPoint.distance);
|
||||
double dLat = (currentPoint.lat - previousPoint.lat) * percent;
|
||||
double dLon = (currentPoint.lon - previousPoint.lon) * percent;
|
||||
|
@ -500,6 +498,9 @@ public class TrackDetailsMenu {
|
|||
} else {
|
||||
mapActivity.getMapLayers().getGpxLayer().setTrackChartPoints(trackChartPoints);
|
||||
}
|
||||
if (location != null) {
|
||||
mapActivity.refreshMap();
|
||||
}
|
||||
fitTrackOnMap(chart, location, forceFit);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package net.osmand.plus.myplaces;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Bitmap;
|
||||
|
@ -14,8 +15,10 @@ import android.view.LayoutInflater;
|
|||
import android.view.View;
|
||||
import android.widget.AbsListView;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.AdapterView.OnItemClickListener;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.ListAdapter;
|
||||
import android.widget.ListView;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
@ -36,12 +39,12 @@ import com.squareup.picasso.RequestCreator;
|
|||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.GPXUtilities;
|
||||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.GPXUtilities.GPXFile.GpxSplitType;
|
||||
import net.osmand.GPXUtilities.WptPt;
|
||||
import net.osmand.PicassoUtils;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.data.PointDescription;
|
||||
import net.osmand.data.QuadRect;
|
||||
import net.osmand.plus.GPXDatabase;
|
||||
import net.osmand.plus.GPXDatabase.GpxDataItem;
|
||||
import net.osmand.plus.GpxSelectionHelper;
|
||||
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
|
||||
|
@ -49,13 +52,16 @@ import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
|
|||
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
||||
import net.osmand.plus.OsmAndFormatter;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.activities.TrackActivity;
|
||||
import net.osmand.plus.dialogs.ConfigureMapMenu;
|
||||
import net.osmand.plus.dialogs.GpxAppearanceAdapter;
|
||||
import net.osmand.plus.dialogs.GpxAppearanceAdapter.AppearanceListItem;
|
||||
import net.osmand.plus.dialogs.GpxAppearanceAdapter.GpxAppearanceAdapterType;
|
||||
import net.osmand.plus.measurementtool.NewGpxData;
|
||||
import net.osmand.plus.myplaces.TrackBitmapDrawer.TrackBitmapDrawerListener;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
|
||||
import net.osmand.plus.widgets.tools.CropCircleTransformation;
|
||||
import net.osmand.plus.wikipedia.WikiArticleHelper;
|
||||
import net.osmand.plus.wikivoyage.WikivoyageUtils;
|
||||
|
@ -71,6 +77,7 @@ import java.util.Map;
|
|||
import gnu.trove.list.array.TIntArrayList;
|
||||
|
||||
import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR;
|
||||
import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR;
|
||||
|
||||
public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
||||
|
||||
|
@ -356,50 +363,27 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
|||
@Override
|
||||
public void onClick(View v) {
|
||||
TrackActivity activity = getTrackActivity();
|
||||
if (activity != null) {
|
||||
colorListPopupWindow = new ListPopupWindow(activity);
|
||||
colorListPopupWindow.setAnchorView(colorView);
|
||||
colorListPopupWindow.setContentWidth(AndroidUtils.dpToPx(app, 200f));
|
||||
colorListPopupWindow.setModal(true);
|
||||
colorListPopupWindow.setDropDownGravity(Gravity.RIGHT | Gravity.TOP);
|
||||
colorListPopupWindow.setVerticalOffset(AndroidUtils.dpToPx(app, -48f));
|
||||
colorListPopupWindow.setHorizontalOffset(AndroidUtils.dpToPx(app, -6f));
|
||||
GPXFile gpxFile = getGpx();
|
||||
final ConfigureMapMenu.GpxAppearanceAdapter gpxApprAdapter = new ConfigureMapMenu.GpxAppearanceAdapter(activity,
|
||||
gpxFile.getColor(0), ConfigureMapMenu.GpxAppearanceAdapter.GpxAppearanceAdapterType.TRACK_COLOR);
|
||||
colorListPopupWindow.setAdapter(gpxApprAdapter);
|
||||
colorListPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||
final GPXFile gpxFile = getGpx();
|
||||
if (activity != null && gpxFile != null) {
|
||||
final GpxAppearanceAdapter appearanceAdapter = new GpxAppearanceAdapter(activity,
|
||||
gpxFile.getColor(0), GpxAppearanceAdapterType.TRACK_WIDTH_COLOR);
|
||||
OnItemClickListener itemClickListener = new OnItemClickListener() {
|
||||
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
ConfigureMapMenu.AppearanceListItem item = gpxApprAdapter.getItem(position);
|
||||
AppearanceListItem item = appearanceAdapter.getItem(position);
|
||||
if (item != null) {
|
||||
if (CURRENT_TRACK_COLOR_ATTR.equals(item.getAttrName())) {
|
||||
GPXFile gpx = getGpx();
|
||||
int clr = item.getColor();
|
||||
if (vis.isChecked()) {
|
||||
if (gpx != null) {
|
||||
SelectedGpxFile sf = app.getSelectedGpxHelper().selectGpxFile(gpx, vis.isChecked(), false);
|
||||
if (clr != 0 && sf.getModifiableGpxFile() != null) {
|
||||
sf.getModifiableGpxFile().setColor(clr);
|
||||
if (getGpxDataItem() != null) {
|
||||
app.getGpxDbHelper().updateColor(getGpxDataItem(), clr);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (getGpxDataItem() != null) {
|
||||
app.getGpxDbHelper().updateColor(getGpxDataItem(), clr);
|
||||
}
|
||||
if (gpx != null && gpx.showCurrentTrack) {
|
||||
app.getSettings().CURRENT_TRACK_COLOR.set(clr);
|
||||
}
|
||||
refreshTrackBitmap();
|
||||
setGpxColor(item, gpxFile);
|
||||
} else if (CURRENT_TRACK_WIDTH_ATTR.equals(item.getAttrName())) {
|
||||
setGpxWidth(item, gpxFile);
|
||||
}
|
||||
}
|
||||
colorListPopupWindow.dismiss();
|
||||
updateColorView(colorView);
|
||||
}
|
||||
});
|
||||
};
|
||||
colorListPopupWindow = createPopupWindow(activity, splitIntervalView, appearanceAdapter, itemClickListener);
|
||||
colorListPopupWindow.show();
|
||||
}
|
||||
}
|
||||
|
@ -415,16 +399,8 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
|||
public void onClick(View v) {
|
||||
TrackActivity activity = getTrackActivity();
|
||||
if (activity != null) {
|
||||
splitListPopupWindow = new ListPopupWindow(activity);
|
||||
splitListPopupWindow.setAnchorView(splitIntervalView);
|
||||
splitListPopupWindow.setContentWidth(AndroidUtils.dpToPx(app, 200f));
|
||||
splitListPopupWindow.setModal(true);
|
||||
splitListPopupWindow.setDropDownGravity(Gravity.RIGHT | Gravity.TOP);
|
||||
splitListPopupWindow.setVerticalOffset(AndroidUtils.dpToPx(app, -48f));
|
||||
splitListPopupWindow.setHorizontalOffset(AndroidUtils.dpToPx(app, -6f));
|
||||
splitListPopupWindow.setAdapter(new ArrayAdapter<>(activity,
|
||||
R.layout.popup_list_text_item, options));
|
||||
splitListPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||
ListAdapter adapter = new ArrayAdapter<>(activity, R.layout.popup_list_text_item, options);
|
||||
OnItemClickListener itemClickListener = new OnItemClickListener() {
|
||||
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
|
@ -433,7 +409,8 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
|||
splitListPopupWindow.dismiss();
|
||||
updateSplitIntervalView(splitIntervalView);
|
||||
}
|
||||
});
|
||||
};
|
||||
splitListPopupWindow = createPopupWindow(activity, splitIntervalView, adapter, itemClickListener);
|
||||
splitListPopupWindow.show();
|
||||
}
|
||||
}
|
||||
|
@ -451,6 +428,55 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
|||
}
|
||||
}
|
||||
|
||||
private void setGpxColor(AppearanceListItem item, GPXFile gpxFile) {
|
||||
int color = item.getColor();
|
||||
if (vis.isChecked()) {
|
||||
SelectedGpxFile sf = app.getSelectedGpxHelper().selectGpxFile(gpxFile, vis.isChecked(), false);
|
||||
if (color != 0 && sf.getModifiableGpxFile() != null) {
|
||||
sf.getModifiableGpxFile().setColor(color);
|
||||
if (getGpxDataItem() != null) {
|
||||
app.getGpxDbHelper().updateColor(getGpxDataItem(), color);
|
||||
}
|
||||
}
|
||||
} else if (getGpxDataItem() != null) {
|
||||
app.getGpxDbHelper().updateColor(getGpxDataItem(), color);
|
||||
}
|
||||
if (gpxFile.showCurrentTrack) {
|
||||
app.getSettings().CURRENT_TRACK_COLOR.set(color);
|
||||
}
|
||||
refreshTrackBitmap();
|
||||
}
|
||||
|
||||
private void setGpxWidth(AppearanceListItem item, GPXFile gpxFile) {
|
||||
String width = item.getValue();
|
||||
if (vis.isChecked()) {
|
||||
SelectedGpxFile sf = app.getSelectedGpxHelper().selectGpxFile(gpxFile, vis.isChecked(), false);
|
||||
if (width != null && sf.getModifiableGpxFile() != null) {
|
||||
sf.getModifiableGpxFile().setWidth(width);
|
||||
if (getGpxDataItem() != null) {
|
||||
app.getGpxDbHelper().updateWidth(getGpxDataItem(), width);
|
||||
}
|
||||
}
|
||||
} else if (getGpxDataItem() != null) {
|
||||
app.getGpxDbHelper().updateWidth(getGpxDataItem(), width);
|
||||
}
|
||||
refreshTrackBitmap();
|
||||
}
|
||||
|
||||
private ListPopupWindow createPopupWindow(Activity activity, View anchorView, ListAdapter adapter, OnItemClickListener itemClickListener) {
|
||||
ListPopupWindow popupWindow = new ListPopupWindow(activity);
|
||||
popupWindow.setAnchorView(anchorView);
|
||||
popupWindow.setContentWidth(AndroidUtils.dpToPx(app, 200f));
|
||||
popupWindow.setModal(true);
|
||||
popupWindow.setDropDownGravity(Gravity.RIGHT | Gravity.TOP);
|
||||
popupWindow.setVerticalOffset(AndroidUtils.dpToPx(app, -48f));
|
||||
popupWindow.setHorizontalOffset(AndroidUtils.dpToPx(app, -6f));
|
||||
popupWindow.setAdapter(adapter);
|
||||
popupWindow.setOnItemClickListener(itemClickListener);
|
||||
|
||||
return popupWindow;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private View getDescriptionCardView(Context context) {
|
||||
GPXFile gpx = getGpx();
|
||||
|
@ -738,13 +764,13 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
|||
double splitInterval = getGpxDataItem().getSplitInterval();
|
||||
int position = 0;
|
||||
|
||||
if (splitType == GPXDatabase.GPX_SPLIT_TYPE_DISTANCE) {
|
||||
if (splitType == GpxSplitType.DISTANCE.getType()) {
|
||||
position = distanceSplit.indexOf(splitInterval);
|
||||
} else if (splitType == GPXDatabase.GPX_SPLIT_TYPE_TIME) {
|
||||
} else if (splitType == GpxSplitType.TIME.getType()) {
|
||||
position = timeSplit.indexOf((int) splitInterval);
|
||||
}
|
||||
|
||||
return position > 0 ? position : 0;
|
||||
return Math.max(position, 0);
|
||||
}
|
||||
|
||||
private void updateColorView(View colorView) {
|
||||
|
@ -759,10 +785,9 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
|||
}
|
||||
}
|
||||
if (color == 0) {
|
||||
final RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer();
|
||||
final OsmandSettings.CommonPreference<String> prefColor
|
||||
= app.getSettings().getCustomRenderProperty(CURRENT_TRACK_COLOR_ATTR);
|
||||
color = ConfigureMapMenu.GpxAppearanceAdapter.parseTrackColor(renderer, prefColor.get());
|
||||
RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer();
|
||||
CommonPreference<String> prefColor = app.getSettings().getCustomRenderProperty(CURRENT_TRACK_COLOR_ATTR);
|
||||
color = GpxAppearanceAdapter.parseTrackColor(renderer, prefColor.get());
|
||||
}
|
||||
if (color == 0) {
|
||||
colorImageView.setImageDrawable(app.getUIUtilities().getThemedIcon(R.drawable.ic_action_circle));
|
||||
|
@ -852,20 +877,20 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
|||
}
|
||||
|
||||
private void updateSplitInDatabase() {
|
||||
int splitType = 0;
|
||||
double splitInterval = 0;
|
||||
GpxSplitType splitType = null;
|
||||
if (selectedSplitInterval == 0) {
|
||||
splitType = GPXDatabase.GPX_SPLIT_TYPE_NO_SPLIT;
|
||||
splitType = GpxSplitType.NO_SPLIT;
|
||||
splitInterval = 0;
|
||||
} else if (distanceSplit.get(selectedSplitInterval) > 0) {
|
||||
splitType = GPXDatabase.GPX_SPLIT_TYPE_DISTANCE;
|
||||
splitType = GpxSplitType.DISTANCE;
|
||||
splitInterval = distanceSplit.get(selectedSplitInterval);
|
||||
} else if (timeSplit.get(selectedSplitInterval) > 0) {
|
||||
splitType = GPXDatabase.GPX_SPLIT_TYPE_TIME;
|
||||
splitType = GpxSplitType.TIME;
|
||||
splitInterval = timeSplit.get(selectedSplitInterval);
|
||||
}
|
||||
GpxDataItem item = getGpxDataItem();
|
||||
if (item != null) {
|
||||
if (item != null && splitType != null) {
|
||||
app.getGpxDbHelper().updateSplit(item, splitType, splitInterval);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,7 +57,6 @@ import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
|
|||
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
||||
import net.osmand.plus.OsmAndFormatter;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
|
@ -70,12 +69,14 @@ import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
|
|||
import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet;
|
||||
import net.osmand.plus.measurementtool.NewGpxData;
|
||||
import net.osmand.plus.myplaces.TrackBitmapDrawer.TrackBitmapDrawerListener;
|
||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||
import net.osmand.plus.views.controls.PagerSlidingTabStrip;
|
||||
import net.osmand.plus.views.controls.PagerSlidingTabStrip.CustomTabProvider;
|
||||
import net.osmand.plus.views.controls.WrapContentHeightViewPager;
|
||||
import net.osmand.plus.views.controls.WrapContentHeightViewPager.ViewAtPositionInterface;
|
||||
import net.osmand.plus.widgets.IconPopupMenu;
|
||||
import net.osmand.util.Algorithms;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.ref.WeakReference;
|
||||
|
@ -525,16 +526,14 @@ public class TrackSegmentFragment extends OsmAndListFragment implements TrackBit
|
|||
}
|
||||
} else {
|
||||
float distance = pos * dataSet.getDivX();
|
||||
double previousSplitDistance = 0;
|
||||
double totalDistance = 0;
|
||||
for (int i = 0; i < segment.points.size(); i++) {
|
||||
WptPt currentPoint = segment.points.get(i);
|
||||
if (i != 0) {
|
||||
WptPt previousPoint = segment.points.get(i - 1);
|
||||
if (currentPoint.distance < previousPoint.distance) {
|
||||
previousSplitDistance += previousPoint.distance;
|
||||
totalDistance += MapUtils.getDistance(previousPoint.lat, previousPoint.lon, currentPoint.lat, currentPoint.lon);
|
||||
}
|
||||
}
|
||||
if (previousSplitDistance + currentPoint.distance >= distance) {
|
||||
if (currentPoint.distance >= distance || Math.abs(totalDistance - distance) < 0.1) {
|
||||
wpt = currentPoint;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -682,7 +682,8 @@ public class PoiUIFilter implements SearchPoiTypeFilter, Comparable<PoiUIFilter>
|
|||
if (subtype != null) {
|
||||
PoiCategory c = subtype.getCategory();
|
||||
String typeName = subtype.getKeyName();
|
||||
if (!getAcceptedSubtypes(c).contains(typeName)) {
|
||||
Set<String> acceptedSubtypes = getAcceptedSubtypes(c);
|
||||
if (acceptedSubtypes != null && !acceptedSubtypes.contains(typeName)) {
|
||||
LinkedHashSet<String> typeNames = acceptedTypesOrigin.get(c);
|
||||
if (typeNames == null) {
|
||||
typeNames = new LinkedHashSet<>();
|
||||
|
|
|
@ -140,9 +140,13 @@ public class RouteCalculationResult {
|
|||
OsmandApplication ctx, boolean leftSide, RoutingContext rctx, List<LocationPoint> waypoints, ApplicationMode mode) {
|
||||
if (rctx != null) {
|
||||
this.routingTime = rctx.routingTime;
|
||||
this.visitedSegments = rctx.visitedSegments;
|
||||
this.loadedTiles = rctx.loadedTiles;
|
||||
this.calculateTime = (float) (((System.nanoTime() - rctx.timeToCalculate) / 1e6) / 1000f);
|
||||
this.visitedSegments = rctx.getVisitedSegments();
|
||||
this.loadedTiles = rctx.getLoadedTiles();
|
||||
if (rctx.calculationProgress != null) {
|
||||
this.calculateTime = (float) (rctx.calculationProgress.timeToCalculate / 1.0e9);
|
||||
} else {
|
||||
this.calculateTime = 0;
|
||||
}
|
||||
} else {
|
||||
this.routingTime = 0;
|
||||
this.visitedSegments = 0;
|
||||
|
|
|
@ -126,7 +126,7 @@ public class SettingsHelper {
|
|||
void onSettingsExportFinished(@NonNull File file, boolean succeed);
|
||||
}
|
||||
|
||||
public SettingsHelper(OsmandApplication app) {
|
||||
public SettingsHelper(@NonNull OsmandApplication app) {
|
||||
this.app = app;
|
||||
}
|
||||
|
||||
|
@ -149,18 +149,27 @@ public class SettingsHelper {
|
|||
|
||||
protected OsmandApplication app;
|
||||
|
||||
private String pluginId;
|
||||
private String fileName;
|
||||
protected String pluginId;
|
||||
protected String fileName;
|
||||
|
||||
boolean shouldReplace = false;
|
||||
|
||||
protected List<String> warnings;
|
||||
|
||||
SettingsItem(OsmandApplication app) {
|
||||
SettingsItem(@NonNull OsmandApplication app) {
|
||||
this.app = app;
|
||||
init();
|
||||
}
|
||||
|
||||
SettingsItem(@NonNull OsmandApplication app, @Nullable SettingsItem baseItem) {
|
||||
this.app = app;
|
||||
if (baseItem != null) {
|
||||
this.pluginId = baseItem.pluginId;
|
||||
this.fileName = baseItem.fileName;
|
||||
}
|
||||
init();
|
||||
}
|
||||
|
||||
SettingsItem(OsmandApplication app, @NonNull JSONObject json) throws JSONException {
|
||||
this.app = app;
|
||||
init();
|
||||
|
@ -203,10 +212,6 @@ public class SettingsHelper {
|
|||
return fileName;
|
||||
}
|
||||
|
||||
public void setFileName(String fileName) {
|
||||
this.fileName = fileName;
|
||||
}
|
||||
|
||||
public boolean applyFileName(@NonNull String fileName) {
|
||||
String n = getFileName();
|
||||
return n != null && n.endsWith(fileName);
|
||||
|
@ -281,13 +286,13 @@ public class SettingsHelper {
|
|||
}
|
||||
|
||||
@Nullable
|
||||
abstract SettingsItemReader getReader();
|
||||
abstract SettingsItemReader<? extends SettingsItem> getReader();
|
||||
|
||||
@Nullable
|
||||
abstract SettingsItemWriter getWriter();
|
||||
abstract SettingsItemWriter<? extends SettingsItem> getWriter();
|
||||
|
||||
@NonNull
|
||||
SettingsItemReader getJsonReader() {
|
||||
SettingsItemReader<? extends SettingsItem> getJsonReader() {
|
||||
return new SettingsItemReader<SettingsItem>(this) {
|
||||
@Override
|
||||
public void readFromStream(@NonNull InputStream inputStream) throws IOException, IllegalArgumentException {
|
||||
|
@ -315,7 +320,7 @@ public class SettingsHelper {
|
|||
}
|
||||
|
||||
@NonNull
|
||||
SettingsItemWriter getJsonWriter() {
|
||||
SettingsItemWriter<? extends SettingsItem> getJsonWriter() {
|
||||
return new SettingsItemWriter<SettingsItem>(this) {
|
||||
@Override
|
||||
public boolean writeToStream(@NonNull OutputStream outputStream) throws IOException {
|
||||
|
@ -445,13 +450,13 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemReader getReader() {
|
||||
SettingsItemReader<? extends SettingsItem> getReader() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemWriter getWriter() {
|
||||
SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -555,13 +560,13 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemReader getReader() {
|
||||
SettingsItemReader<? extends SettingsItem> getReader() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemWriter getWriter() {
|
||||
SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -638,13 +643,13 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemReader getReader() {
|
||||
SettingsItemReader<? extends SettingsItem> getReader() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemWriter getWriter() {
|
||||
SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -664,12 +669,12 @@ public class SettingsHelper {
|
|||
duplicateItems = new ArrayList<>();
|
||||
}
|
||||
|
||||
CollectionSettingsItem(OsmandApplication app, @NonNull List<T> items) {
|
||||
super(app);
|
||||
CollectionSettingsItem(@NonNull OsmandApplication app, @Nullable CollectionSettingsItem<T> baseItem, @NonNull List<T> items) {
|
||||
super(app, baseItem);
|
||||
this.items = items;
|
||||
}
|
||||
|
||||
CollectionSettingsItem(OsmandApplication app, @NonNull JSONObject json) throws JSONException {
|
||||
CollectionSettingsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
|
||||
super(app, json);
|
||||
}
|
||||
|
||||
|
@ -747,6 +752,11 @@ public class SettingsHelper {
|
|||
this.settings = settings;
|
||||
}
|
||||
|
||||
protected OsmandSettingsItem(@NonNull OsmandSettings settings, @Nullable OsmandSettingsItem baseItem) {
|
||||
super(settings.getContext(), baseItem);
|
||||
this.settings = settings;
|
||||
}
|
||||
|
||||
protected OsmandSettingsItem(@NonNull SettingsItemType type, @NonNull OsmandSettings settings, @NonNull JSONObject json) throws JSONException {
|
||||
super(settings.getContext(), json);
|
||||
this.settings = settings;
|
||||
|
@ -885,7 +895,7 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemReader getReader() {
|
||||
SettingsItemReader<? extends SettingsItem> getReader() {
|
||||
return new OsmandSettingsItemReader(this, getSettings()) {
|
||||
@Override
|
||||
protected void readPreferenceFromJson(@NonNull OsmandPreference<?> preference, @NonNull JSONObject json) throws JSONException {
|
||||
|
@ -896,7 +906,7 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemWriter getWriter() {
|
||||
SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
return new OsmandSettingsItemWriter(this, getSettings()) {
|
||||
@Override
|
||||
protected void writePreferenceToJson(@NonNull OsmandPreference<?> preference, @NonNull JSONObject json) throws JSONException {
|
||||
|
@ -920,8 +930,8 @@ public class SettingsHelper {
|
|||
this.appMode = appMode;
|
||||
}
|
||||
|
||||
public ProfileSettingsItem(@NonNull OsmandApplication app, @NonNull ApplicationModeBean modeBean) {
|
||||
super(app.getSettings());
|
||||
public ProfileSettingsItem(@NonNull OsmandApplication app, @Nullable ProfileSettingsItem baseItem, @NonNull ApplicationModeBean modeBean) {
|
||||
super(app.getSettings(), baseItem);
|
||||
this.modeBean = modeBean;
|
||||
builder = ApplicationMode.fromModeBean(app, modeBean);
|
||||
appMode = builder.getApplicationMode();
|
||||
|
@ -1059,7 +1069,7 @@ public class SettingsHelper {
|
|||
if (additionalPrefsJson != null) {
|
||||
updatePluginResPrefs();
|
||||
|
||||
SettingsItemReader reader = getReader();
|
||||
SettingsItemReader<? extends SettingsItem> reader = getReader();
|
||||
if (reader instanceof OsmandSettingsItemReader) {
|
||||
((OsmandSettingsItemReader) reader).readPreferencesFromJson(additionalPrefsJson);
|
||||
}
|
||||
|
@ -1116,7 +1126,7 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemReader getReader() {
|
||||
SettingsItemReader<? extends SettingsItem> getReader() {
|
||||
return new OsmandSettingsItemReader(this, getSettings()) {
|
||||
@Override
|
||||
protected void readPreferenceFromJson(@NonNull OsmandPreference<?> preference, @NonNull JSONObject json) throws JSONException {
|
||||
|
@ -1129,7 +1139,7 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemWriter getWriter() {
|
||||
SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
return new OsmandSettingsItemWriter(this, getSettings()) {
|
||||
@Override
|
||||
protected void writePreferenceToJson(@NonNull OsmandPreference<?> preference, @NonNull JSONObject json) throws JSONException {
|
||||
|
@ -1182,7 +1192,7 @@ public class SettingsHelper {
|
|||
public StreamSettingsItem(@NonNull OsmandApplication app, @NonNull String name) {
|
||||
super(app);
|
||||
this.name = name;
|
||||
setFileName(name);
|
||||
this.fileName = name;
|
||||
}
|
||||
|
||||
StreamSettingsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
|
||||
|
@ -1193,7 +1203,7 @@ public class SettingsHelper {
|
|||
super(app);
|
||||
this.inputStream = inputStream;
|
||||
this.name = name;
|
||||
setFileName(name);
|
||||
this.fileName = name;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
@ -1231,7 +1241,7 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
public SettingsItemWriter getWriter() {
|
||||
public SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
return new StreamSettingsItemWriter(this);
|
||||
}
|
||||
}
|
||||
|
@ -1282,7 +1292,7 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemReader getReader() {
|
||||
SettingsItemReader<? extends SettingsItem> getReader() {
|
||||
return new StreamSettingsItemReader(this) {
|
||||
@Override
|
||||
public void readFromStream(@NonNull InputStream inputStream) throws IOException, IllegalArgumentException {
|
||||
|
@ -1301,7 +1311,7 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
public SettingsItemWriter getWriter() {
|
||||
public SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
setInputStream(new ByteArrayInputStream(data));
|
||||
return super.getWriter();
|
||||
}
|
||||
|
@ -1370,6 +1380,7 @@ public class SettingsHelper {
|
|||
return UNKNOWN;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return subtypeName;
|
||||
|
@ -1480,7 +1491,7 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemReader getReader() {
|
||||
SettingsItemReader<? extends SettingsItem> getReader() {
|
||||
return new StreamSettingsItemReader(this) {
|
||||
@Override
|
||||
public void readFromStream(@NonNull InputStream inputStream) throws IOException, IllegalArgumentException {
|
||||
|
@ -1509,7 +1520,7 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
public SettingsItemWriter getWriter() {
|
||||
public SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
try {
|
||||
setInputStream(new FileInputStream(file));
|
||||
} catch (FileNotFoundException e) {
|
||||
|
@ -1527,7 +1538,7 @@ public class SettingsHelper {
|
|||
shouldReplace = true;
|
||||
String fileName = getFileName();
|
||||
if (!Algorithms.isEmpty(fileName) && !fileName.endsWith(File.separator)) {
|
||||
setFileName(fileName + File.separator);
|
||||
this.fileName = fileName + File.separator;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1575,7 +1586,7 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
public SettingsItemWriter getWriter() {
|
||||
public SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -1585,7 +1596,11 @@ public class SettingsHelper {
|
|||
private QuickActionRegistry actionRegistry;
|
||||
|
||||
public QuickActionsSettingsItem(@NonNull OsmandApplication app, @NonNull List<QuickAction> items) {
|
||||
super(app, items);
|
||||
super(app, null, items);
|
||||
}
|
||||
|
||||
public QuickActionsSettingsItem(@NonNull OsmandApplication app, @Nullable QuickActionsSettingsItem baseItem, @NonNull List<QuickAction> items) {
|
||||
super(app, baseItem, items);
|
||||
}
|
||||
|
||||
QuickActionsSettingsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
|
||||
|
@ -1725,24 +1740,28 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemReader getReader() {
|
||||
SettingsItemReader<? extends SettingsItem> getReader() {
|
||||
return getJsonReader();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemWriter getWriter() {
|
||||
SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static class PoiUiFilterSettingsItem extends CollectionSettingsItem<PoiUIFilter> {
|
||||
public static class PoiUiFiltersSettingsItem extends CollectionSettingsItem<PoiUIFilter> {
|
||||
|
||||
public PoiUiFilterSettingsItem(@NonNull OsmandApplication app, @NonNull List<PoiUIFilter> items) {
|
||||
super(app, items);
|
||||
public PoiUiFiltersSettingsItem(@NonNull OsmandApplication app, @NonNull List<PoiUIFilter> items) {
|
||||
super(app, null, items);
|
||||
}
|
||||
|
||||
PoiUiFilterSettingsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
|
||||
public PoiUiFiltersSettingsItem(@NonNull OsmandApplication app, @Nullable PoiUiFiltersSettingsItem baseItem, @NonNull List<PoiUIFilter> items) {
|
||||
super(app, baseItem, items);
|
||||
}
|
||||
|
||||
PoiUiFiltersSettingsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
|
||||
super(app, json);
|
||||
}
|
||||
|
||||
|
@ -1873,13 +1892,13 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemReader getReader() {
|
||||
SettingsItemReader<? extends SettingsItem> getReader() {
|
||||
return getJsonReader();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemWriter getWriter() {
|
||||
SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -1889,7 +1908,11 @@ public class SettingsHelper {
|
|||
private List<String> existingItemsNames;
|
||||
|
||||
public MapSourcesSettingsItem(@NonNull OsmandApplication app, @NonNull List<ITileSource> items) {
|
||||
super(app, items);
|
||||
super(app, null, items);
|
||||
}
|
||||
|
||||
public MapSourcesSettingsItem(@NonNull OsmandApplication app, @Nullable MapSourcesSettingsItem baseItem, @NonNull List<ITileSource> items) {
|
||||
super(app, baseItem, items);
|
||||
}
|
||||
|
||||
MapSourcesSettingsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
|
||||
|
@ -2085,13 +2108,13 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemReader getReader() {
|
||||
SettingsItemReader<? extends SettingsItem> getReader() {
|
||||
return getJsonReader();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemWriter getWriter() {
|
||||
SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -2102,7 +2125,11 @@ public class SettingsHelper {
|
|||
private AvoidSpecificRoads specificRoads;
|
||||
|
||||
public AvoidRoadsSettingsItem(@NonNull OsmandApplication app, @NonNull List<AvoidRoadInfo> items) {
|
||||
super(app, items);
|
||||
super(app, null, items);
|
||||
}
|
||||
|
||||
public AvoidRoadsSettingsItem(@NonNull OsmandApplication app, @Nullable AvoidRoadsSettingsItem baseItem, @NonNull List<AvoidRoadInfo> items) {
|
||||
super(app, baseItem, items);
|
||||
}
|
||||
|
||||
AvoidRoadsSettingsItem(@NonNull OsmandApplication app, @NonNull JSONObject json) throws JSONException {
|
||||
|
@ -2240,13 +2267,13 @@ public class SettingsHelper {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemReader getReader() {
|
||||
SettingsItemReader<? extends SettingsItem> getReader() {
|
||||
return getJsonReader();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
SettingsItemWriter getWriter() {
|
||||
SettingsItemWriter<? extends SettingsItem> getWriter() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -2256,7 +2283,7 @@ public class SettingsHelper {
|
|||
private OsmandApplication app;
|
||||
private List<SettingsItem> items = new ArrayList<>();
|
||||
|
||||
SettingsItemsFactory(OsmandApplication app, String jsonStr) throws IllegalArgumentException, JSONException {
|
||||
SettingsItemsFactory(@NonNull OsmandApplication app, String jsonStr) throws IllegalArgumentException, JSONException {
|
||||
this.app = app;
|
||||
collectItems(new JSONObject(jsonStr));
|
||||
}
|
||||
|
@ -2346,7 +2373,7 @@ public class SettingsHelper {
|
|||
item = new QuickActionsSettingsItem(app, json);
|
||||
break;
|
||||
case POI_UI_FILTERS:
|
||||
item = new PoiUiFilterSettingsItem(app, json);
|
||||
item = new PoiUiFiltersSettingsItem(app, json);
|
||||
break;
|
||||
case MAP_SOURCES:
|
||||
item = new MapSourcesSettingsItem(app, json);
|
||||
|
@ -2410,7 +2437,7 @@ public class SettingsHelper {
|
|||
|
||||
private void writeItemFiles(ZipOutputStream zos) throws IOException {
|
||||
for (SettingsItem item : items.values()) {
|
||||
SettingsItemWriter writer = item.getWriter();
|
||||
SettingsItemWriter<? extends SettingsItem> writer = item.getWriter();
|
||||
if (writer != null) {
|
||||
String fileName = item.getFileName();
|
||||
if (Algorithms.isEmpty(fileName)) {
|
||||
|
@ -2520,7 +2547,7 @@ public class SettingsHelper {
|
|||
if (item != null && collecting && item.shouldReadOnCollecting()
|
||||
|| item != null && !collecting && !item.shouldReadOnCollecting()) {
|
||||
try {
|
||||
SettingsItemReader reader = item.getReader();
|
||||
SettingsItemReader<? extends SettingsItem> reader = item.getReader();
|
||||
if (reader != null) {
|
||||
reader.readFromStream(ois);
|
||||
}
|
||||
|
@ -2699,8 +2726,8 @@ public class SettingsHelper {
|
|||
if (item.exists()) {
|
||||
duplicateItems.add(((ProfileSettingsItem) item).getModeBean());
|
||||
}
|
||||
} else if (item instanceof CollectionSettingsItem) {
|
||||
List duplicates = ((CollectionSettingsItem) item).processDuplicateItems();
|
||||
} else if (item instanceof CollectionSettingsItem<?>) {
|
||||
List<?> duplicates = ((CollectionSettingsItem<?>) item).processDuplicateItems();
|
||||
if (!duplicates.isEmpty()) {
|
||||
duplicateItems.addAll(duplicates);
|
||||
}
|
||||
|
|
|
@ -49,7 +49,7 @@ class ExportImportSettingsAdapter extends OsmandBaseExpandableListAdapter {
|
|||
private static final Log LOG = PlatformUtil.getLog(ExportImportSettingsAdapter.class.getName());
|
||||
private OsmandApplication app;
|
||||
private UiUtilities uiUtilities;
|
||||
private List<? super Object> dataToOperate;
|
||||
private List<? super Object> data;
|
||||
private Map<Type, List<?>> itemsMap;
|
||||
private List<Type> itemsTypes;
|
||||
private boolean nightMode;
|
||||
|
@ -63,8 +63,7 @@ class ExportImportSettingsAdapter extends OsmandBaseExpandableListAdapter {
|
|||
this.importState = importState;
|
||||
this.itemsMap = new HashMap<>();
|
||||
this.itemsTypes = new ArrayList<>();
|
||||
this.dataToOperate = new ArrayList<>();
|
||||
dataToOperate = new ArrayList<>();
|
||||
this.data = new ArrayList<>();
|
||||
uiUtilities = app.getUIUtilities();
|
||||
activeColorRes = nightMode
|
||||
? R.color.icon_color_active_dark
|
||||
|
@ -102,12 +101,12 @@ class ExportImportSettingsAdapter extends OsmandBaseExpandableListAdapter {
|
|||
final List<?> listItems = itemsMap.get(type);
|
||||
subTextTv.setText(getSelectedItemsAmount(listItems));
|
||||
|
||||
if (dataToOperate.containsAll(listItems)) {
|
||||
if (data.containsAll(listItems)) {
|
||||
checkBox.setState(CHECKED);
|
||||
} else {
|
||||
boolean contains = false;
|
||||
for (Object object : listItems) {
|
||||
if (dataToOperate.contains(object)) {
|
||||
if (data.contains(object)) {
|
||||
contains = true;
|
||||
break;
|
||||
}
|
||||
|
@ -122,12 +121,12 @@ class ExportImportSettingsAdapter extends OsmandBaseExpandableListAdapter {
|
|||
checkBox.performClick();
|
||||
if (checkBox.getState() == CHECKED) {
|
||||
for (Object object : listItems) {
|
||||
if (!dataToOperate.contains(object)) {
|
||||
dataToOperate.add(object);
|
||||
if (!data.contains(object)) {
|
||||
data.add(object);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dataToOperate.removeAll(listItems);
|
||||
data.removeAll(listItems);
|
||||
}
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
@ -146,7 +145,7 @@ class ExportImportSettingsAdapter extends OsmandBaseExpandableListAdapter {
|
|||
final Object currentItem = itemsMap.get(itemsTypes.get(groupPosition)).get(childPosition);
|
||||
|
||||
boolean isLastGroup = groupPosition == getGroupCount() - 1;
|
||||
boolean itemSelected = dataToOperate.contains(currentItem);
|
||||
boolean itemSelected = data.contains(currentItem);
|
||||
final Type type = itemsTypes.get(groupPosition);
|
||||
|
||||
TextView title = child.findViewById(R.id.title_tv);
|
||||
|
@ -166,10 +165,10 @@ class ExportImportSettingsAdapter extends OsmandBaseExpandableListAdapter {
|
|||
child.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (dataToOperate.contains(currentItem)) {
|
||||
dataToOperate.remove(currentItem);
|
||||
if (data.contains(currentItem)) {
|
||||
data.remove(currentItem);
|
||||
} else {
|
||||
dataToOperate.add(currentItem);
|
||||
data.add(currentItem);
|
||||
}
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
@ -293,7 +292,7 @@ class ExportImportSettingsAdapter extends OsmandBaseExpandableListAdapter {
|
|||
private String getSelectedItemsAmount(List<?> listItems) {
|
||||
int amount = 0;
|
||||
for (Object item : listItems) {
|
||||
if (dataToOperate.contains(item)) {
|
||||
if (data.contains(item)) {
|
||||
amount++;
|
||||
}
|
||||
}
|
||||
|
@ -343,17 +342,17 @@ class ExportImportSettingsAdapter extends OsmandBaseExpandableListAdapter {
|
|||
}
|
||||
|
||||
public void selectAll(boolean selectAll) {
|
||||
dataToOperate.clear();
|
||||
data.clear();
|
||||
if (selectAll) {
|
||||
for (List<?> values : itemsMap.values()) {
|
||||
dataToOperate.addAll(values);
|
||||
data.addAll(values);
|
||||
}
|
||||
}
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
List<? super Object> getDataToOperate() {
|
||||
return this.dataToOperate;
|
||||
List<? super Object> getData() {
|
||||
return this.data;
|
||||
}
|
||||
|
||||
public enum Type {
|
||||
|
|
|
@ -26,6 +26,7 @@ import net.osmand.PlatformUtil;
|
|||
import net.osmand.data.LatLon;
|
||||
import net.osmand.map.ITileSource;
|
||||
import net.osmand.map.TileSourceManager;
|
||||
import net.osmand.map.TileSourceManager.TileSourceTemplate;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.SQLiteTileSource;
|
||||
|
@ -40,7 +41,12 @@ import net.osmand.plus.quickaction.QuickAction;
|
|||
import net.osmand.plus.quickaction.QuickActionRegistry;
|
||||
import net.osmand.plus.settings.backend.ApplicationMode;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.AvoidRoadsSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.FileSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.MapSourcesSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.PoiUiFiltersSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.ProfileSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.QuickActionsSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.SettingsItem;
|
||||
import net.osmand.plus.settings.bottomsheets.BasePreferenceBottomSheet;
|
||||
import net.osmand.plus.settings.fragments.ExportImportSettingsAdapter.Type;
|
||||
|
@ -274,7 +280,7 @@ public class ExportProfileBottomSheet extends BasePreferenceBottomSheet {
|
|||
|
||||
private List<SettingsItem> prepareSettingsItemsForExport() {
|
||||
List<SettingsItem> settingsItems = new ArrayList<>();
|
||||
settingsItems.add(new SettingsHelper.ProfileSettingsItem(app, profile));
|
||||
settingsItems.add(new ProfileSettingsItem(app, profile));
|
||||
if (includeAdditionalData) {
|
||||
settingsItems.addAll(prepareAdditionalSettingsItems());
|
||||
}
|
||||
|
@ -287,13 +293,12 @@ public class ExportProfileBottomSheet extends BasePreferenceBottomSheet {
|
|||
List<PoiUIFilter> poiUIFilters = new ArrayList<>();
|
||||
List<ITileSource> tileSourceTemplates = new ArrayList<>();
|
||||
List<AvoidRoadInfo> avoidRoads = new ArrayList<>();
|
||||
for (Object object : adapter.getDataToOperate()) {
|
||||
for (Object object : adapter.getData()) {
|
||||
if (object instanceof QuickAction) {
|
||||
quickActions.add((QuickAction) object);
|
||||
} else if (object instanceof PoiUIFilter) {
|
||||
poiUIFilters.add((PoiUIFilter) object);
|
||||
} else if (object instanceof TileSourceManager.TileSourceTemplate
|
||||
|| object instanceof SQLiteTileSource) {
|
||||
} else if (object instanceof TileSourceTemplate || object instanceof SQLiteTileSource) {
|
||||
tileSourceTemplates.add((ITileSource) object);
|
||||
} else if (object instanceof File) {
|
||||
try {
|
||||
|
@ -306,16 +311,16 @@ public class ExportProfileBottomSheet extends BasePreferenceBottomSheet {
|
|||
}
|
||||
}
|
||||
if (!quickActions.isEmpty()) {
|
||||
settingsItems.add(new SettingsHelper.QuickActionsSettingsItem(app, quickActions));
|
||||
settingsItems.add(new QuickActionsSettingsItem(app, quickActions));
|
||||
}
|
||||
if (!poiUIFilters.isEmpty()) {
|
||||
settingsItems.add(new SettingsHelper.PoiUiFilterSettingsItem(app, poiUIFilters));
|
||||
settingsItems.add(new PoiUiFiltersSettingsItem(app, poiUIFilters));
|
||||
}
|
||||
if (!tileSourceTemplates.isEmpty()) {
|
||||
settingsItems.add(new SettingsHelper.MapSourcesSettingsItem(app, tileSourceTemplates));
|
||||
settingsItems.add(new MapSourcesSettingsItem(app, tileSourceTemplates));
|
||||
}
|
||||
if (!avoidRoads.isEmpty()) {
|
||||
settingsItems.add(new SettingsHelper.AvoidRoadsSettingsItem(app, avoidRoads));
|
||||
settingsItems.add(new AvoidRoadsSettingsItem(app, avoidRoads));
|
||||
}
|
||||
return settingsItems;
|
||||
}
|
||||
|
|
|
@ -36,7 +36,6 @@ import java.util.List;
|
|||
|
||||
import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_SETTINGS_ID;
|
||||
import static net.osmand.plus.settings.fragments.ImportSettingsFragment.IMPORT_SETTINGS_TAG;
|
||||
import static net.osmand.plus.settings.fragments.ImportSettingsFragment.getSettingsToOperate;
|
||||
|
||||
public class ImportCompleteFragment extends BaseOsmAndFragment {
|
||||
public static final String TAG = ImportCompleteFragment.class.getSimpleName();
|
||||
|
@ -111,7 +110,7 @@ public class ImportCompleteFragment extends BaseOsmAndFragment {
|
|||
if (settingsItems != null) {
|
||||
ImportedSettingsItemsAdapter adapter = new ImportedSettingsItemsAdapter(
|
||||
app,
|
||||
getSettingsToOperate(settingsItems, true),
|
||||
ImportSettingsFragment.getSettingsToOperate(settingsItems, true),
|
||||
nightMode,
|
||||
new ImportedSettingsItemsAdapter.OnItemClickListener() {
|
||||
@Override
|
||||
|
|
|
@ -28,12 +28,12 @@ import com.google.android.material.appbar.CollapsingToolbarLayout;
|
|||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.map.ITileSource;
|
||||
import net.osmand.map.TileSourceManager;
|
||||
import net.osmand.map.TileSourceManager.TileSourceTemplate;
|
||||
import net.osmand.plus.AppInitializer;
|
||||
import net.osmand.plus.settings.backend.ApplicationMode;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.SQLiteTileSource;
|
||||
import net.osmand.plus.settings.backend.ApplicationMode.ApplicationModeBean;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.AvoidRoadsSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.FileSettingsItem;
|
||||
|
@ -41,7 +41,7 @@ import net.osmand.plus.settings.backend.SettingsHelper.FileSettingsItem.FileSubt
|
|||
import net.osmand.plus.settings.backend.SettingsHelper.ImportAsyncTask;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.ImportType;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.MapSourcesSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.PoiUiFilterSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.PoiUiFiltersSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.ProfileSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.QuickActionsSettingsItem;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.SettingsItem;
|
||||
|
@ -54,6 +54,7 @@ import net.osmand.plus.poi.PoiUIFilter;
|
|||
import net.osmand.plus.quickaction.QuickAction;
|
||||
import net.osmand.plus.settings.fragments.ExportImportSettingsAdapter.Type;
|
||||
import net.osmand.plus.widgets.TextViewEx;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
|
@ -218,7 +219,7 @@ public class ImportSettingsFragment extends BaseOsmAndFragment
|
|||
break;
|
||||
}
|
||||
case R.id.continue_button: {
|
||||
if (adapter.getDataToOperate().isEmpty()) {
|
||||
if (adapter.getData().isEmpty()) {
|
||||
app.showShortToastMessage(getString(R.string.shared_string_nothing_selected));
|
||||
} else {
|
||||
importItems();
|
||||
|
@ -244,7 +245,7 @@ public class ImportSettingsFragment extends BaseOsmAndFragment
|
|||
|
||||
private void importItems() {
|
||||
updateUi(R.string.shared_string_preparing, R.string.checking_for_duplicate_description);
|
||||
List<SettingsItem> selectedItems = getSettingsItemsFromData(adapter.getDataToOperate());
|
||||
List<SettingsItem> selectedItems = getSettingsItemsFromData(adapter.getData());
|
||||
if (file != null && settingsItems != null) {
|
||||
duplicateStartTime = System.currentTimeMillis();
|
||||
settingsHelper.checkDuplicates(file, settingsItems, selectedItems, getDuplicatesListener());
|
||||
|
@ -316,22 +317,75 @@ public class ImportSettingsFragment extends BaseOsmAndFragment
|
|||
this.settingsItems = settingsItems;
|
||||
}
|
||||
|
||||
private List<SettingsItem> getSettingsItemsFromData(List<Object> dataToOperate) {
|
||||
@Nullable
|
||||
private ProfileSettingsItem getBaseProfileSettingsItem(ApplicationModeBean modeBean) {
|
||||
for (SettingsItem settingsItem : settingsItems) {
|
||||
if (settingsItem.getType() == SettingsItemType.PROFILE) {
|
||||
ProfileSettingsItem profileItem = (ProfileSettingsItem) settingsItem;
|
||||
ApplicationModeBean bean = profileItem.getModeBean();
|
||||
if (Algorithms.objectEquals(bean.stringKey, modeBean.stringKey) && Algorithms.objectEquals(bean.userProfileName, modeBean.userProfileName)) {
|
||||
return profileItem;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private QuickActionsSettingsItem getBaseQuickActionsSettingsItem() {
|
||||
for (SettingsItem settingsItem : settingsItems) {
|
||||
if (settingsItem.getType() == SettingsItemType.QUICK_ACTIONS) {
|
||||
return (QuickActionsSettingsItem) settingsItem;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private PoiUiFiltersSettingsItem getBasePoiUiFiltersSettingsItem() {
|
||||
for (SettingsItem settingsItem : settingsItems) {
|
||||
if (settingsItem.getType() == SettingsItemType.POI_UI_FILTERS) {
|
||||
return (PoiUiFiltersSettingsItem) settingsItem;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private MapSourcesSettingsItem getBaseMapSourcesSettingsItem() {
|
||||
for (SettingsItem settingsItem : settingsItems) {
|
||||
if (settingsItem.getType() == SettingsItemType.MAP_SOURCES) {
|
||||
return (MapSourcesSettingsItem) settingsItem;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private AvoidRoadsSettingsItem getBaseAvoidRoadsSettingsItem() {
|
||||
for (SettingsItem settingsItem : settingsItems) {
|
||||
if (settingsItem.getType() == SettingsItemType.AVOID_ROADS) {
|
||||
return (AvoidRoadsSettingsItem) settingsItem;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<SettingsItem> getSettingsItemsFromData(List<?> data) {
|
||||
List<SettingsItem> settingsItems = new ArrayList<>();
|
||||
List<ApplicationModeBean> appModeBeans = new ArrayList<>();
|
||||
List<QuickAction> quickActions = new ArrayList<>();
|
||||
List<PoiUIFilter> poiUIFilters = new ArrayList<>();
|
||||
List<ITileSource> tileSourceTemplates = new ArrayList<>();
|
||||
List<AvoidRoadInfo> avoidRoads = new ArrayList<>();
|
||||
for (Object object : dataToOperate) {
|
||||
if (object instanceof ApplicationMode.ApplicationModeBean) {
|
||||
settingsItems.add(new SettingsHelper.ProfileSettingsItem(app, (ApplicationMode.ApplicationModeBean) object));
|
||||
}
|
||||
if (object instanceof QuickAction) {
|
||||
for (Object object : data) {
|
||||
if (object instanceof ApplicationModeBean) {
|
||||
appModeBeans.add((ApplicationModeBean) object);
|
||||
} else if (object instanceof QuickAction) {
|
||||
quickActions.add((QuickAction) object);
|
||||
} else if (object instanceof PoiUIFilter) {
|
||||
poiUIFilters.add((PoiUIFilter) object);
|
||||
} else if (object instanceof TileSourceManager.TileSourceTemplate
|
||||
|| object instanceof SQLiteTileSource) {
|
||||
} else if (object instanceof TileSourceTemplate || object instanceof SQLiteTileSource) {
|
||||
tileSourceTemplates.add((ITileSource) object);
|
||||
} else if (object instanceof File) {
|
||||
settingsItems.add(new FileSettingsItem(app, (File) object));
|
||||
|
@ -339,69 +393,82 @@ public class ImportSettingsFragment extends BaseOsmAndFragment
|
|||
avoidRoads.add((AvoidRoadInfo) object);
|
||||
}
|
||||
}
|
||||
if (!appModeBeans.isEmpty()) {
|
||||
for (ApplicationModeBean modeBean : appModeBeans) {
|
||||
settingsItems.add(new ProfileSettingsItem(app, getBaseProfileSettingsItem(modeBean), modeBean));
|
||||
}
|
||||
}
|
||||
if (!quickActions.isEmpty()) {
|
||||
settingsItems.add(new QuickActionsSettingsItem(app, quickActions));
|
||||
settingsItems.add(new QuickActionsSettingsItem(app, getBaseQuickActionsSettingsItem(), quickActions));
|
||||
}
|
||||
if (!poiUIFilters.isEmpty()) {
|
||||
settingsItems.add(new SettingsHelper.PoiUiFilterSettingsItem(app, poiUIFilters));
|
||||
settingsItems.add(new PoiUiFiltersSettingsItem(app, getBasePoiUiFiltersSettingsItem(), poiUIFilters));
|
||||
}
|
||||
if (!tileSourceTemplates.isEmpty()) {
|
||||
settingsItems.add(new SettingsHelper.MapSourcesSettingsItem(app, tileSourceTemplates));
|
||||
settingsItems.add(new MapSourcesSettingsItem(app, getBaseMapSourcesSettingsItem(), tileSourceTemplates));
|
||||
}
|
||||
if (!avoidRoads.isEmpty()) {
|
||||
settingsItems.add(new SettingsHelper.AvoidRoadsSettingsItem(app, avoidRoads));
|
||||
settingsItems.add(new AvoidRoadsSettingsItem(app, getBaseAvoidRoadsSettingsItem(), avoidRoads));
|
||||
}
|
||||
return settingsItems;
|
||||
}
|
||||
|
||||
public static Map<Type, List<?>> getSettingsToOperate(List<SettingsItem> settingsItems, boolean importComplete) {
|
||||
Map<Type, List<?>> settingsToOperate = new HashMap<>();
|
||||
List<ApplicationMode.ApplicationModeBean> profiles = new ArrayList<>();
|
||||
List<ApplicationModeBean> profiles = new ArrayList<>();
|
||||
List<QuickAction> quickActions = new ArrayList<>();
|
||||
List<PoiUIFilter> poiUIFilters = new ArrayList<>();
|
||||
List<ITileSource> tileSourceTemplates = new ArrayList<>();
|
||||
List<File> routingFilesList = new ArrayList<>();
|
||||
List<File> renderFilesList = new ArrayList<>();
|
||||
List<AvoidRoadInfo> avoidRoads = new ArrayList<>();
|
||||
|
||||
for (SettingsItem item : settingsItems) {
|
||||
if (item.getType().equals(SettingsItemType.PROFILE)) {
|
||||
switch (item.getType()) {
|
||||
case PROFILE:
|
||||
profiles.add(((ProfileSettingsItem) item).getModeBean());
|
||||
} else if (item.getType().equals(SettingsItemType.QUICK_ACTIONS)) {
|
||||
QuickActionsSettingsItem quickActionsItem = (QuickActionsSettingsItem) item;
|
||||
if (importComplete) {
|
||||
quickActions.addAll(quickActionsItem.getAppliedItems());
|
||||
} else {
|
||||
quickActions.addAll(quickActionsItem.getItems());
|
||||
}
|
||||
} else if (item.getType().equals(SettingsItemType.POI_UI_FILTERS)) {
|
||||
PoiUiFilterSettingsItem poiUiFilterItem = (PoiUiFilterSettingsItem) item;
|
||||
if (importComplete) {
|
||||
poiUIFilters.addAll(poiUiFilterItem.getAppliedItems());
|
||||
} else {
|
||||
poiUIFilters.addAll(poiUiFilterItem.getItems());
|
||||
}
|
||||
} else if (item.getType().equals(SettingsItemType.MAP_SOURCES)) {
|
||||
MapSourcesSettingsItem mapSourcesItem = (MapSourcesSettingsItem) item;
|
||||
if (importComplete) {
|
||||
tileSourceTemplates.addAll(mapSourcesItem.getAppliedItems());
|
||||
} else {
|
||||
tileSourceTemplates.addAll(mapSourcesItem.getItems());
|
||||
}
|
||||
} else if (item.getType().equals(SettingsItemType.FILE)) {
|
||||
break;
|
||||
case FILE:
|
||||
FileSettingsItem fileItem = (FileSettingsItem) item;
|
||||
if (fileItem.getSubtype() == FileSubtype.RENDERING_STYLE) {
|
||||
renderFilesList.add(fileItem.getFile());
|
||||
} else if (fileItem.getSubtype() == FileSubtype.ROUTING_CONFIG) {
|
||||
routingFilesList.add(fileItem.getFile());
|
||||
}
|
||||
} else if (item.getType().equals(SettingsItemType.AVOID_ROADS)) {
|
||||
break;
|
||||
case QUICK_ACTIONS:
|
||||
QuickActionsSettingsItem quickActionsItem = (QuickActionsSettingsItem) item;
|
||||
if (importComplete) {
|
||||
quickActions.addAll(quickActionsItem.getAppliedItems());
|
||||
} else {
|
||||
quickActions.addAll(quickActionsItem.getItems());
|
||||
}
|
||||
break;
|
||||
case POI_UI_FILTERS:
|
||||
PoiUiFiltersSettingsItem poiUiFilterItem = (PoiUiFiltersSettingsItem) item;
|
||||
if (importComplete) {
|
||||
poiUIFilters.addAll(poiUiFilterItem.getAppliedItems());
|
||||
} else {
|
||||
poiUIFilters.addAll(poiUiFilterItem.getItems());
|
||||
}
|
||||
break;
|
||||
case MAP_SOURCES:
|
||||
MapSourcesSettingsItem mapSourcesItem = (MapSourcesSettingsItem) item;
|
||||
if (importComplete) {
|
||||
tileSourceTemplates.addAll(mapSourcesItem.getAppliedItems());
|
||||
} else {
|
||||
tileSourceTemplates.addAll(mapSourcesItem.getItems());
|
||||
}
|
||||
break;
|
||||
case AVOID_ROADS:
|
||||
AvoidRoadsSettingsItem avoidRoadsItem = (AvoidRoadsSettingsItem) item;
|
||||
if (importComplete) {
|
||||
avoidRoads.addAll(avoidRoadsItem.getAppliedItems());
|
||||
} else {
|
||||
avoidRoads.addAll(avoidRoadsItem.getItems());
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@ package net.osmand.plus.views;
|
|||
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.ColorFilter;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Paint.Align;
|
||||
import android.graphics.Paint.Style;
|
||||
|
@ -11,6 +10,7 @@ import android.graphics.PorterDuff.Mode;
|
|||
import android.graphics.PorterDuffColorFilter;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.LayerDrawable;
|
||||
import android.os.AsyncTask;
|
||||
import android.util.Pair;
|
||||
|
@ -21,11 +21,13 @@ import androidx.annotation.Nullable;
|
|||
import androidx.appcompat.content.res.AppCompatResources;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import net.osmand.AndroidUtils;
|
||||
import net.osmand.GPXUtilities;
|
||||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.GPXUtilities.TrkSegment;
|
||||
import net.osmand.GPXUtilities.WptPt;
|
||||
import net.osmand.Location;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.data.PointDescription;
|
||||
import net.osmand.data.QuadRect;
|
||||
|
@ -40,6 +42,7 @@ import net.osmand.plus.MapMarkersHelper.MapMarker;
|
|||
import net.osmand.plus.MapMarkersHelper.MapMarkersGroup;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.UiUtilities;
|
||||
import net.osmand.plus.base.PointImageDrawable;
|
||||
import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.SelectedGpxPoint;
|
||||
import net.osmand.plus.mapcontextmenu.other.TrackChartPoints;
|
||||
|
@ -55,6 +58,8 @@ import net.osmand.render.RenderingRulesStorage;
|
|||
import net.osmand.util.Algorithms;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
@ -67,29 +72,30 @@ import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR;
|
|||
|
||||
public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IMoveObjectProvider, MapTextProvider<WptPt> {
|
||||
|
||||
private static final Log log = PlatformUtil.getLog(GPXLayer.class);
|
||||
|
||||
private static final double TOUCH_RADIUS_MULTIPLIER = 1.5;
|
||||
private static final int DEFAULT_WIDTH_MULTIPLIER = 7;
|
||||
private static final int START_ZOOM = 7;
|
||||
|
||||
private OsmandMapTileView view;
|
||||
|
||||
private Paint paint;
|
||||
private Paint paint2;
|
||||
private boolean isPaint2;
|
||||
private Paint shadowPaint;
|
||||
private boolean isShadowPaint;
|
||||
private Paint paint_1;
|
||||
private boolean isPaint_1;
|
||||
private Paint paintIcon;
|
||||
private int cachedHash;
|
||||
private int cachedColor;
|
||||
private Paint paintIcon;
|
||||
private int currentTrackColor;
|
||||
private float defaultTrackWidth;
|
||||
private Map<String, Float> cachedTrackWidth = new HashMap<>();
|
||||
|
||||
private Drawable startPointIcon;
|
||||
private Drawable finishPointIcon;
|
||||
private LayerDrawable selectedPoint;
|
||||
private TrackChartPoints trackChartPoints;
|
||||
|
||||
private GpxSelectionHelper selectedGpxHelper;
|
||||
private MapMarkersHelper mapMarkersHelper;
|
||||
private Paint paintBmp;
|
||||
private List<WptPt> cache = new ArrayList<>();
|
||||
private Map<WptPt, SelectedGpxFile> pointFileMap = new HashMap<>();
|
||||
private MapTextLayer textLayer;
|
||||
|
@ -134,26 +140,14 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
|||
paint = new Paint();
|
||||
paint.setStyle(Style.STROKE);
|
||||
paint.setAntiAlias(true);
|
||||
paint2 = new Paint();
|
||||
paint2.setStyle(Style.STROKE);
|
||||
paint2.setAntiAlias(true);
|
||||
shadowPaint = new Paint();
|
||||
shadowPaint.setStyle(Style.STROKE);
|
||||
shadowPaint.setAntiAlias(true);
|
||||
paint_1 = new Paint();
|
||||
paint_1.setStyle(Style.STROKE);
|
||||
paint_1.setAntiAlias(true);
|
||||
|
||||
paintBmp = new Paint();
|
||||
paintBmp.setAntiAlias(true);
|
||||
paintBmp.setFilterBitmap(true);
|
||||
paintBmp.setDither(true);
|
||||
|
||||
paintTextIcon = new Paint();
|
||||
paintTextIcon.setTextSize(10 * view.getDensity());
|
||||
paintTextIcon.setTextAlign(Align.CENTER);
|
||||
paintTextIcon.setFakeBoldText(true);
|
||||
// paintTextIcon.setColor(Color.WHITE);
|
||||
paintTextIcon.setAntiAlias(true);
|
||||
|
||||
textLayer = view.getLayerByClass(MapTextLayer.class);
|
||||
|
@ -164,7 +158,6 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
|||
paintOuterRect = new Paint();
|
||||
paintOuterRect.setStyle(Style.STROKE);
|
||||
paintOuterRect.setAntiAlias(true);
|
||||
// paintOuterRect.setColor(Color.WHITE);
|
||||
paintOuterRect.setStrokeWidth(3);
|
||||
paintOuterRect.setAlpha(255);
|
||||
paintGridCircle = new Paint();
|
||||
|
@ -179,6 +172,10 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
|||
paintIcon = new Paint();
|
||||
selectedPoint = (LayerDrawable) AppCompatResources.getDrawable(view.getContext(), R.drawable.map_location_default);
|
||||
|
||||
UiUtilities iconsCache = view.getApplication().getUIUtilities();
|
||||
startPointIcon = iconsCache.getIcon(R.drawable.map_track_point_start);
|
||||
finishPointIcon = iconsCache.getIcon(R.drawable.map_track_point_finish);
|
||||
|
||||
contextMenuLayer = view.getLayerByClass(ContextMenuLayer.class);
|
||||
|
||||
visitedColor = ContextCompat.getColor(view.getApplication(), R.color.color_ok);
|
||||
|
@ -213,6 +210,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
|||
}
|
||||
drawSelectedFilesSplits(canvas, tileBox, selectedGPXFiles, settings);
|
||||
drawSelectedFilesPoints(canvas, tileBox, selectedGPXFiles);
|
||||
drawSelectedFilesStartEndPoints(canvas, tileBox, selectedGPXFiles);
|
||||
}
|
||||
if (textLayer != null && isTextVisible()) {
|
||||
textLayer.putData(this, cache);
|
||||
|
@ -220,29 +218,28 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
|||
|
||||
}
|
||||
|
||||
private int updatePaints(int color, boolean routePoints, boolean currentTrack, DrawSettings nightMode, RotatedTileBox tileBox) {
|
||||
private int updatePaints(int color, String width, boolean routePoints, boolean currentTrack, DrawSettings drawSettings, RotatedTileBox tileBox) {
|
||||
RenderingRulesStorage rrs = view.getApplication().getRendererRegistry().getCurrentSelectedRenderer();
|
||||
final boolean isNight = nightMode != null && nightMode.isNightMode();
|
||||
int hsh = calculateHash(rrs, routePoints, isNight, tileBox.getMapDensity(), tileBox.getZoom(),
|
||||
boolean nightMode = drawSettings != null && drawSettings.isNightMode();
|
||||
int hash = calculateHash(rrs, cachedTrackWidth, routePoints, nightMode, tileBox.getMapDensity(), tileBox.getZoom(),
|
||||
currentTrackColorPref.get(), currentTrackWidthPref.get());
|
||||
if (hsh != cachedHash) {
|
||||
cachedHash = hsh;
|
||||
if (hash != cachedHash) {
|
||||
cachedHash = hash;
|
||||
cachedColor = ContextCompat.getColor(view.getApplication(), R.color.gpx_track);
|
||||
defaultTrackWidth = DEFAULT_WIDTH_MULTIPLIER * view.getDensity();
|
||||
if (rrs != null) {
|
||||
RenderingRuleSearchRequest req = new RenderingRuleSearchRequest(rrs);
|
||||
req.setBooleanFilter(rrs.PROPS.R_NIGHT_MODE, isNight);
|
||||
CommonPreference<String> p = view.getSettings().getCustomRenderProperty(CURRENT_TRACK_COLOR_ATTR);
|
||||
if (p != null && p.isSet()) {
|
||||
req.setBooleanFilter(rrs.PROPS.R_NIGHT_MODE, nightMode);
|
||||
if (currentTrackColorPref != null && currentTrackColorPref.isSet()) {
|
||||
RenderingRuleProperty ctColor = rrs.PROPS.get(CURRENT_TRACK_COLOR_ATTR);
|
||||
if (ctColor != null) {
|
||||
req.setStringFilter(ctColor, p.get());
|
||||
req.setStringFilter(ctColor, currentTrackColorPref.get());
|
||||
}
|
||||
}
|
||||
CommonPreference<String> p2 = view.getSettings().getCustomRenderProperty(CURRENT_TRACK_WIDTH_ATTR);
|
||||
if (p2 != null && p2.isSet()) {
|
||||
if (currentTrackWidthPref != null && currentTrackWidthPref.isSet()) {
|
||||
RenderingRuleProperty ctWidth = rrs.PROPS.get(CURRENT_TRACK_WIDTH_ATTR);
|
||||
if (ctWidth != null) {
|
||||
req.setStringFilter(ctWidth, p2.get());
|
||||
req.setStringFilter(ctWidth, currentTrackWidthPref.get());
|
||||
}
|
||||
}
|
||||
String additional = "";
|
||||
|
@ -262,26 +259,54 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
|||
rc.setDensityValue((float) tileBox.getMapDensity());
|
||||
cachedColor = req.getIntPropertyValue(rrs.PROPS.R_COLOR);
|
||||
osmandRenderer.updatePaint(req, paint, 0, false, rc);
|
||||
isPaint2 = osmandRenderer.updatePaint(req, paint2, 1, false, rc);
|
||||
isPaint_1 = osmandRenderer.updatePaint(req, paint_1, -1, false, rc);
|
||||
isShadowPaint = req.isSpecified(rrs.PROPS.R_SHADOW_RADIUS);
|
||||
if (isShadowPaint) {
|
||||
ColorFilter cf = new PorterDuffColorFilter(req.getIntPropertyValue(rrs.PROPS.R_SHADOW_COLOR),
|
||||
Mode.SRC_IN);
|
||||
shadowPaint.setColorFilter(cf);
|
||||
shadowPaint.setStrokeWidth(paint.getStrokeWidth() + 2
|
||||
* rc.getComplexValue(req, rrs.PROPS.R_SHADOW_RADIUS));
|
||||
|
||||
if (req.isSpecified(rrs.PROPS.R_SHADOW_RADIUS)) {
|
||||
int shadowColor = req.getIntPropertyValue(rrs.PROPS.R_SHADOW_COLOR);
|
||||
float shadowRadius = rc.getComplexValue(req, rrs.PROPS.R_SHADOW_RADIUS);
|
||||
shadowPaint.setColorFilter(new PorterDuffColorFilter(shadowColor, Mode.SRC_IN));
|
||||
shadowPaint.setStrokeWidth(paint.getStrokeWidth() + 2 * shadowRadius);
|
||||
}
|
||||
for (String key : cachedTrackWidth.keySet()) {
|
||||
acquireTrackWidth(key, rrs, req, rc);
|
||||
}
|
||||
} else {
|
||||
System.err.println("Rendering attribute gpx is not found !");
|
||||
paint.setStrokeWidth(7 * view.getDensity());
|
||||
log.error("Rendering attribute gpx is not found !");
|
||||
for (String key : cachedTrackWidth.keySet()) {
|
||||
cachedTrackWidth.put(key, defaultTrackWidth);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
paint.setColor(color == 0 ? cachedColor : color);
|
||||
Float strikeWidth = cachedTrackWidth.get(width);
|
||||
if (strikeWidth != null) {
|
||||
paint.setStrokeWidth(strikeWidth);
|
||||
}
|
||||
return cachedColor;
|
||||
}
|
||||
|
||||
private void acquireTrackWidth(String widthKey, RenderingRulesStorage rrs, RenderingRuleSearchRequest req, RenderingContext rc) {
|
||||
if (!Algorithms.isEmpty(widthKey) && Algorithms.isInt(widthKey)) {
|
||||
try {
|
||||
int widthDp = Integer.parseInt(widthKey);
|
||||
float widthF = AndroidUtils.dpToPx(view.getApplication(), widthDp);
|
||||
cachedTrackWidth.put(widthKey, widthF);
|
||||
} catch (NumberFormatException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
cachedTrackWidth.put(widthKey, defaultTrackWidth);
|
||||
}
|
||||
} else {
|
||||
RenderingRuleProperty ctWidth = rrs.PROPS.get(CURRENT_TRACK_WIDTH_ATTR);
|
||||
if (ctWidth != null) {
|
||||
req.setStringFilter(ctWidth, widthKey);
|
||||
}
|
||||
if (req.searchRenderingAttribute("gpx")) {
|
||||
float widthF = rc.getComplexValue(req, req.ALL.R_STROKE_WIDTH);
|
||||
cachedTrackWidth.put(widthKey, widthF);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int calculateHash(Object... o) {
|
||||
return Arrays.hashCode(o);
|
||||
}
|
||||
|
@ -368,6 +393,34 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
|||
}
|
||||
}
|
||||
|
||||
private void drawSelectedFilesStartEndPoints(Canvas canvas, RotatedTileBox tileBox, List<SelectedGpxFile> selectedGPXFiles) {
|
||||
if (tileBox.getZoom() >= START_ZOOM) {
|
||||
for (SelectedGpxFile selectedGpxFile : selectedGPXFiles) {
|
||||
if (selectedGpxFile.getGpxFile().isShowStartFinish()) {
|
||||
List<TrkSegment> segments = selectedGpxFile.getPointsToDisplay();
|
||||
TrkSegment endSegment = segments.get(segments.size() - 1);
|
||||
|
||||
WptPt start = segments.get(0).points.get(0);
|
||||
WptPt end = endSegment.points.get(endSegment.points.size() - 1);
|
||||
|
||||
drawPoint(canvas, tileBox, start, startPointIcon);
|
||||
drawPoint(canvas, tileBox, end, finishPointIcon);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void drawPoint(Canvas canvas, RotatedTileBox tileBox, WptPt wptPt, Drawable icon) {
|
||||
int pointX = (int) tileBox.getPixXFromLatLon(wptPt.lat, wptPt.lon);
|
||||
int pointY = (int) tileBox.getPixYFromLatLon(wptPt.lat, wptPt.lon);
|
||||
|
||||
icon.setBounds(pointX - icon.getIntrinsicWidth() / 2,
|
||||
pointY - icon.getIntrinsicHeight() / 2,
|
||||
pointX + icon.getIntrinsicWidth() / 2,
|
||||
pointY + icon.getIntrinsicHeight() / 2);
|
||||
icon.draw(canvas);
|
||||
}
|
||||
|
||||
private void drawSelectedFilesPoints(Canvas canvas, RotatedTileBox tileBox, List<SelectedGpxFile> selectedGPXFiles) {
|
||||
if (tileBox.getZoom() >= START_ZOOM) {
|
||||
float textScale = view.getSettings().TEXT_SCALE.get();
|
||||
|
@ -518,7 +571,12 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
|||
|
||||
private void drawSelectedFilesSegments(Canvas canvas, RotatedTileBox tileBox,
|
||||
List<SelectedGpxFile> selectedGPXFiles, DrawSettings settings) {
|
||||
|
||||
for (SelectedGpxFile selectedGpxFile : selectedGPXFiles) {
|
||||
String width = selectedGpxFile.getGpxFile().getWidth(currentTrackWidthPref.get());
|
||||
if (!cachedTrackWidth.containsKey(width)) {
|
||||
cachedTrackWidth.put(width, null);
|
||||
}
|
||||
}
|
||||
SelectedGpxFile currentTrack = null;
|
||||
for (SelectedGpxFile g : selectedGPXFiles) {
|
||||
if (g.isShowCurrentTrack()) {
|
||||
|
@ -536,6 +594,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
|||
RotatedTileBox tileBox, DrawSettings settings) {
|
||||
List<TrkSegment> segments = selectedGpxFile.getPointsToDisplay();
|
||||
for (TrkSegment ts : segments) {
|
||||
String width = selectedGpxFile.getGpxFile().getWidth(currentTrackWidthPref.get());
|
||||
int color = selectedGpxFile.getGpxFile().getColor(0);
|
||||
if (currentTrack) {
|
||||
color = currentTrackColor;
|
||||
|
@ -550,8 +609,8 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
|||
ts.renderer = new Renderable.StandardTrack(ts.points, 17.2);
|
||||
}
|
||||
}
|
||||
updatePaints(color, selectedGpxFile.isRoutePoints(), currentTrack, settings, tileBox);
|
||||
if(ts.renderer instanceof Renderable.RenderableSegment) {
|
||||
updatePaints(color, width, selectedGpxFile.isRoutePoints(), currentTrack, settings, tileBox);
|
||||
if (ts.renderer instanceof Renderable.RenderableSegment) {
|
||||
((Renderable.RenderableSegment) ts.renderer).drawSegment(view.getZoom(), paint, canvas, tileBox);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -92,9 +92,8 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements
|
|||
|
||||
private void drawPoint(Canvas canvas, float x, float y, boolean active) {
|
||||
float textScale = activity.getMyApplication().getSettings().TEXT_SCALE.get();
|
||||
float left = x - roadWorkIcon.getWidth() / 2f * textScale;
|
||||
float top = y - roadWorkIcon.getHeight() * textScale;
|
||||
Rect destRect = getIconDestinationRect(left, top, roadWorkIcon.getWidth(), roadWorkIcon.getHeight(), textScale);
|
||||
y -= roadWorkIcon.getHeight() / 2f * textScale;
|
||||
Rect destRect = getIconDestinationRect(x, y, roadWorkIcon.getWidth(), roadWorkIcon.getHeight(), textScale);
|
||||
canvas.drawBitmap(roadWorkIcon, null, destRect, active ? activePaint : paint);
|
||||
}
|
||||
|
||||
|
|
|
@ -191,6 +191,7 @@ public class CurrentPositionHelper {
|
|||
private void justifyResult(List<GeocodingResult> res, final ResultMatcher<GeocodingResult> result) {
|
||||
List<GeocodingResult> complete = new ArrayList<>();
|
||||
double minBuildingDistance = 0;
|
||||
GeocodingUtilities gu = new GeocodingUtilities();
|
||||
if (res != null) {
|
||||
for (GeocodingResult r : res) {
|
||||
BinaryMapIndexReader foundRepo = null;
|
||||
|
@ -208,7 +209,7 @@ public class CurrentPositionHelper {
|
|||
} else if (foundRepo != null) {
|
||||
List<GeocodingResult> justified = null;
|
||||
try {
|
||||
justified = new GeocodingUtilities().justifyReverseGeocodingSearch(r, foundRepo,
|
||||
justified = gu.justifyReverseGeocodingSearch(r, foundRepo,
|
||||
minBuildingDistance, result);
|
||||
} catch (IOException e) {
|
||||
log.error("Exception happened during reverse geocoding", e);
|
||||
|
@ -227,6 +228,7 @@ public class CurrentPositionHelper {
|
|||
complete.add(r);
|
||||
}
|
||||
}
|
||||
gu.filterDuplicateRegionResults(complete);
|
||||
}
|
||||
|
||||
if (result.isCancelled()) {
|
||||
|
@ -237,7 +239,7 @@ public class CurrentPositionHelper {
|
|||
});
|
||||
return;
|
||||
}
|
||||
Collections.sort(complete, GeocodingUtilities.DISTANCE_COMPARATOR);
|
||||
// Collections.sort(complete, GeocodingUtilities.DISTANCE_COMPARATOR);
|
||||
// for(GeocodingResult rt : complete) {
|
||||
// System.out.println(rt.toString());
|
||||
// }
|
||||
|
|
Loading…
Reference in a new issue