Merge branch 'sasha_pasha_branch' of ssh://github.com/osmandapp/Osmand into sasha_pasha_branch

This commit is contained in:
PavelRatushny 2017-09-06 11:14:20 +03:00
commit e972b44e6a
102 changed files with 3855 additions and 609 deletions

View file

@ -15,7 +15,6 @@ import java.io.RandomAccessFile;
import java.text.DecimalFormat;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
@ -72,19 +71,19 @@ public class BinaryInspector {
// test cases show info
if ("test".equals(args[0])) {
in.inspector(new String[] {
// "-vpoi",
"-vmap", "-vmapobjects", // "-vmapcoordinates",
"-vpoi",
// "-vmap", "-vmapobjects",
// "-vmapcoordinates",
// "-vrouting",
// "-vtransport",
// "-vaddress", "-vcities","-vstreetgroups",
// "-vstreets", "-vbuildings", "-vintersections",
// "-lang=ru",
// "-bbox=30.4981,50.4424,30.5195,50.4351",
"-osm="+System.getProperty("maps.dir")+"/map_full.obf.osm",
System.getProperty("maps.dir")+"/2017_08_24_15_00.obf"
// System.getProperty("maps.dir")+"../temp/kiev/Ukraine_kiev-city_europe_17_06_05.obf",
// System.getProperty("maps.dir")+"Ukraine_kiev-city_europe_2.obf",
// "-osm="+System.getProperty("maps.dir")+"/map_full_1.obf.osm",
System.getProperty("maps.dir")+"/diff/Bulgaria_europe_01_00.obf"
// System.getProperty("maps.dir")+"/diff/Diff.obf"
// System.getProperty("maps.dir")+"/Ukraine_kiev-city_europe_2.obf"
});
} else {
in.inspector(args);
@ -895,7 +894,6 @@ public class BinaryInspector {
} catch (IOException e) {
throw new RuntimeException(e);
}
// } else if(obj.getId() >> 1 == 205743436l) {
} else {
printMapDetails(obj, b, vInfo.vmapCoordinates);
println(b.toString());
@ -923,7 +921,7 @@ public class BinaryInspector {
}
private static void printMapDetails(BinaryMapDataObject obj, StringBuilder b, boolean vmapCoordinates) {
public static void printMapDetails(BinaryMapDataObject obj, StringBuilder b, boolean vmapCoordinates) {
boolean multipolygon = obj.getPolygonInnerCoordinates() != null && obj.getPolygonInnerCoordinates().length > 0;
if (multipolygon) {
b.append("Multipolygon");
@ -1242,7 +1240,7 @@ public class BinaryInspector {
}
}
println(object.getType().getKeyName() + " : " + object.getSubType() + " " + object.getName() + " " + object.getLocation() + " id=" + (object.getId() >> 1) + " " + s);
println(object.getType().getKeyName() + ": " + object.getSubType() + " " + object.getName() + " " + object.getLocation() + " osmid=" + (object.getId() >> 1) + " " + s);
return false;
}

View file

@ -196,13 +196,37 @@ public class BinaryMapDataObject {
}
public boolean compareBinary(BinaryMapDataObject thatObj) {
public boolean compareBinary(BinaryMapDataObject thatObj, int coordinatesPrecision) {
if(this.objectType == thatObj.objectType
&& this.id == thatObj.id
&& this.area == thatObj.area
&& Arrays.equals(this.polygonInnerCoordinates, thatObj.polygonInnerCoordinates)
&& Arrays.equals(this.coordinates, thatObj.coordinates) ) {
&& compareCoordinates(this.coordinates, thatObj.coordinates, coordinatesPrecision) ) {
if(mapIndex == null) {
throw new IllegalStateException("Illegal binary object: " + id);
}
if(thatObj.mapIndex == null) {
throw new IllegalStateException("Illegal binary object: " + thatObj.id);
}
boolean equals = true;
if(equals) {
if(polygonInnerCoordinates == null || thatObj.polygonInnerCoordinates == null) {
equals = polygonInnerCoordinates == thatObj.polygonInnerCoordinates;
} else if(polygonInnerCoordinates.length != thatObj.polygonInnerCoordinates.length){
equals = false;
} else {
for(int i = 0; i < polygonInnerCoordinates.length && equals; i++) {
if(polygonInnerCoordinates[i] == null || thatObj.polygonInnerCoordinates[i] == null) {
equals = polygonInnerCoordinates[i] == thatObj.polygonInnerCoordinates[i];
} else if(polygonInnerCoordinates[i].length != thatObj.polygonInnerCoordinates[i].length){
equals = false;
} else {
equals = compareCoordinates(polygonInnerCoordinates[i], thatObj.polygonInnerCoordinates[i], coordinatesPrecision);
}
}
}
}
if(equals) {
if(types == null || thatObj.types == null) {
equals = types == thatObj.types;
@ -212,7 +236,7 @@ public class BinaryMapDataObject {
for(int i = 0; i < types.length && equals; i++) {
TagValuePair o = mapIndex.decodeType(types[i]);
TagValuePair s = thatObj.mapIndex.decodeType(thatObj.types[i]);
equals = o.equals(s);
equals = o.equals(s) && equals;
}
}
}
@ -259,11 +283,81 @@ public class BinaryMapDataObject {
return equals;
}
// thatObj.mapIndex.decodeType(thatObj.types[0])
// mapIndex.decodeType(types[0]) id >>7
return false;
}
private static boolean compareCoordinates(int[] coordinates, int[] coordinates2, int precision) {
if(precision == 0) {
return Arrays.equals(coordinates, coordinates2);
}
TIntArrayList cd = simplify(coordinates, precision);
TIntArrayList cd2 = simplify(coordinates2, precision);
return cd.equals(cd2);
}
private static TIntArrayList simplify(int[] c, int precision) {
int len = c.length / 2;
TIntArrayList lt = new TIntArrayList(len * 3);
for (int i = 0; i < len; i++) {
lt.add(0);
lt.add(c[i * 2]);
lt.add(c[i * 2 + 1]);
}
lt.set(0, 1);
lt.set((len - 1) * 3, 1);
simplifyLine(lt, precision, 0, len - 1);
TIntArrayList res = new TIntArrayList(len * 2);
for (int i = 0; i < len; i++) {
if (lt.get(i * 3) == 1) {
res.add(lt.get(i * 3 + 1));
res.add(lt.get(i * 3 + 2));
}
}
return res;
}
private static double orthogonalDistance(int x, int y, int x1, int y1, int x2, int y2) {
long A = (x - x1);
long B = (y - y1);
long C = (x2 - x1);
long D = (y2 - y1);
return Math.abs(A * D - C * B) / Math.sqrt(C * C + D * D);
}
private static void simplifyLine(TIntArrayList lt, int precision, int start, int end) {
if(start == end - 1) {
return;
}
int x = lt.get(start*3 + 1);
int y = lt.get(start*3 + 2);
int ex = lt.get(end*3 + 1);
int ey = lt.get(end*3 + 2);
double max = 0;
int maxK = -1;
for(int k = start + 1; k < end ; k++) {
double ld = orthogonalDistance(lt.get(k*3 + 1), lt.get(k*3 + 2), x, y, ex, ey);
if(maxK == -1 || max < ld) {
maxK = k;
max = ld;
}
}
if(max < precision) {
return;
}
lt.set(maxK*3, 1); // keep point
simplifyLine(lt, precision, start, maxK);
simplifyLine(lt, precision, maxK, end);
}
public int[] getCoordinates() {
return coordinates;
}

View file

@ -1735,6 +1735,9 @@ public class BinaryMapIndexReader {
public TIntHashSet positiveLayers = new TIntHashSet(2);
public TIntHashSet negativeLayers = new TIntHashSet(2);
// to speed up comparision
private MapIndex referenceMapIndex;
public Integer getRule(String t, String v) {
Map<String, Integer> m = encodingRules.get(t);
if (m != null) {
@ -1835,12 +1838,13 @@ public class BinaryMapIndexReader {
}
public BinaryMapDataObject adoptMapObject(BinaryMapDataObject o) {
if(o.mapIndex == this) {
if(o.mapIndex == this || o.mapIndex == referenceMapIndex) {
return o;
}
if(encodingRules.isEmpty()) {
encodingRules.putAll(o.mapIndex.encodingRules);
decodingRules.putAll(o.mapIndex.decodingRules);
referenceMapIndex = o.mapIndex;
return o;
}
TIntArrayList types = new TIntArrayList();
@ -1852,8 +1856,8 @@ public class BinaryMapIndexReader {
if(r != null) {
types.add(r);
} else {
int nid = decodingRules.size();
initMapEncodingRule(tp.additionalAttribute, decodingRules.size(), tp.tag, tp.value);
int nid = decodingRules.size() + 1;
initMapEncodingRule(tp.additionalAttribute, nid, tp.tag, tp.value);
types.add(nid);
}
}
@ -1865,8 +1869,8 @@ public class BinaryMapIndexReader {
if(r != null) {
additionalTypes.add(r);
} else {
int nid = decodingRules.size();
initMapEncodingRule(tp.additionalAttribute, decodingRules.size(), tp.tag, tp.value);
int nid = decodingRules.size() + 1;
initMapEncodingRule(tp.additionalAttribute, nid, tp.tag, tp.value);
additionalTypes.add(nid);
}
}
@ -1887,8 +1891,8 @@ public class BinaryMapIndexReader {
bm.namesOrder.add(r);
bm.objectNames.put(r, name);
} else {
int nid = decodingRules.size();
initMapEncodingRule(tp.additionalAttribute, decodingRules.size(), tp.tag, tp.value);
int nid = decodingRules.size() + 1;
initMapEncodingRule(tp.additionalAttribute, nid, tp.tag, tp.value);
additionalTypes.add(nid);
bm.objectNames.put(nid, name);
}

View file

@ -11,7 +11,9 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import net.osmand.PlatformUtil;
import net.osmand.ResultMatcher;
@ -205,14 +207,16 @@ public class BinaryMapRouteReaderAdapter {
public static class RouteRegion extends BinaryIndexPart {
public int regionsRead;
public List<RouteTypeRule> routeEncodingRules = new ArrayList<BinaryMapRouteReaderAdapter.RouteTypeRule>();
public Map<String, Integer> decodingRules = null;
List<RouteSubregion> subregions = new ArrayList<RouteSubregion>();
List<RouteSubregion> basesubregions = new ArrayList<RouteSubregion>();
List<RouteTypeRule> routeEncodingRules = new ArrayList<BinaryMapRouteReaderAdapter.RouteTypeRule>();
int nameTypeRule = -1;
int refTypeRule = -1;
int destinationTypeRule = -1;
int destinationRefTypeRule = -1;
private RouteRegion referenceRouteRegion;
public String getPartName() {
return "Routing";
@ -223,11 +227,28 @@ public class BinaryMapRouteReaderAdapter {
return OsmandOdb.OsmAndStructure.ROUTINGINDEX_FIELD_NUMBER;
}
public int searchRouteEncodingRule(String tag, String value) {
if(decodingRules == null) {
decodingRules = new LinkedHashMap<String, Integer>();
for(int i = 1; i < routeEncodingRules.size(); i++) {
RouteTypeRule rt = routeEncodingRules.get(i);
String ks = rt.getTag() +"#" + (rt.getValue() == null ? "" : rt.getValue());
decodingRules.put(ks, i);
}
}
String k = tag +"#" + (value == null ? "" : value);
if(decodingRules.containsKey(k)) {
return decodingRules.get(k).intValue();
}
return -1;
}
public RouteTypeRule quickGetEncodingRule(int id) {
return routeEncodingRules.get(id);
}
private void initRouteEncodingRule(int id, String tags, String val) {
public void initRouteEncodingRule(int id, String tags, String val) {
decodingRules = null;
while (routeEncodingRules.size() <= id) {
routeEncodingRules.add(null);
}
@ -291,6 +312,101 @@ public class BinaryMapRouteReaderAdapter {
}
return false;
}
public RouteDataObject adopt(RouteDataObject o) {
if(o.region == this || o.region == referenceRouteRegion) {
return o;
}
if(routeEncodingRules.isEmpty()) {
routeEncodingRules.addAll(o.region.routeEncodingRules);
referenceRouteRegion= o.region;
return o;
}
RouteDataObject rdo = new RouteDataObject(this);
rdo.pointsX = o.pointsX;
rdo.pointsY = o.pointsY;
rdo.id = o.id;
rdo.restrictions = o.restrictions;
if (o.types != null) {
rdo.types = new int[o.types.length];
for (int i = 0; i < o.types.length; i++) {
RouteTypeRule tp = o.region.routeEncodingRules.get(o.types[i]);
int ruleId = searchRouteEncodingRule(tp.getTag(), tp.getValue());
if(ruleId != -1) {
rdo.types[i] = ruleId;
} else {
ruleId = routeEncodingRules.size() ;
initRouteEncodingRule(ruleId, tp.getTag(), tp.getValue());
rdo.types[i] = ruleId;
}
}
}
if (o.pointTypes != null) {
rdo.pointTypes = new int[o.pointTypes.length][];
for (int i = 0; i < o.pointTypes.length; i++) {
if (o.pointTypes[i] != null) {
rdo.pointTypes[i] = new int[o.pointTypes[i].length];
for (int j = 0; j < o.pointTypes[i].length; j++) {
RouteTypeRule tp = o.region.routeEncodingRules.get(o.pointTypes[i][j]);
int ruleId = searchRouteEncodingRule(tp.getTag(), tp.getValue());
if(ruleId != -1) {
rdo.pointTypes[i][j] = ruleId;
} else {
ruleId = routeEncodingRules.size() ;
initRouteEncodingRule(ruleId, tp.getTag(), tp.getValue());
rdo.pointTypes[i][j] = ruleId;
}
}
}
}
}
if (o.nameIds != null) {
rdo.nameIds = new int[o.nameIds.length];
rdo.names = new TIntObjectHashMap<>();
for (int i = 0; i < o.nameIds.length; i++) {
RouteTypeRule tp = o.region.routeEncodingRules.get(o.nameIds[i]);
int ruleId = searchRouteEncodingRule(tp.getTag(), null);
if(ruleId != -1) {
rdo.nameIds[i] = ruleId;
} else {
ruleId = routeEncodingRules.size() ;
initRouteEncodingRule(ruleId, tp.getTag(), null);
rdo.nameIds[i] = ruleId;
}
rdo.names.put(ruleId, o.names.get(o.nameIds[i]));
}
}
rdo.pointNames = o.pointNames;
if (o.pointNameTypes != null) {
rdo.pointNameTypes = new int[o.pointNameTypes.length][];
// rdo.pointNames = new String[o.pointNameTypes.length][];
for (int i = 0; i < o.pointNameTypes.length; i++) {
if (o.pointNameTypes[i] != null) {
rdo.pointNameTypes[i] = new int[o.pointNameTypes[i].length];
// rdo.pointNames[i] = new String[o.pointNameTypes[i].length];
for (int j = 0; j < o.pointNameTypes[i].length; j++) {
RouteTypeRule tp = o.region.routeEncodingRules.get(o.pointNameTypes[i][j]);
int ruleId = searchRouteEncodingRule(tp.getTag(), null);
if(ruleId != -1) {
rdo.pointNameTypes[i][j] = ruleId;
} else {
ruleId = routeEncodingRules.size() ;
initRouteEncodingRule(ruleId, tp.getTag(), tp.getValue());
rdo.pointNameTypes[i][j] = ruleId;
}
// rdo.pointNames[i][j] = o.pointNames[i][j];
}
}
}
}
return rdo;
}
}
// Used in C++
@ -360,7 +476,7 @@ public class BinaryMapRouteReaderAdapter {
protected void readRouteIndex(RouteRegion region) throws IOException {
int routeEncodingRule =1;
int routeEncodingRule = 1;
while(true){
int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t);

View file

@ -4,6 +4,7 @@ package net.osmand.binary;
import gnu.trove.map.hash.TIntObjectHashMap;
import java.text.MessageFormat;
import java.util.Arrays;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
@ -63,6 +64,101 @@ public class RouteDataObject {
this.id = copy.id;
}
public boolean compareRoute(RouteDataObject thatObj) {
if (this.id == thatObj.id
&& Arrays.equals(this.pointsX, thatObj.pointsX)
&& Arrays.equals(this.pointsY, thatObj.pointsY)) {
if (this.region == null) {
throw new IllegalStateException("Illegal routing object: " + id);
}
if (thatObj.region == null) {
throw new IllegalStateException("Illegal routing object: " + thatObj.id);
}
boolean equals = true;
equals = equals && Arrays.equals(this.restrictions, thatObj.restrictions);
if (equals) {
if (this.types == null || thatObj.types == null) {
equals = this.types == thatObj.types;
} else if (types.length != thatObj.types.length) {
equals = false;
} else {
for (int i = 0; i < this.types.length && equals; i++) {
String thisTag = region.routeEncodingRules.get(types[i]).getTag();
String thisValue = region.routeEncodingRules.get(types[i]).getValue();
String thatTag = thatObj.region.routeEncodingRules.get(thatObj.types[i]).getTag();
String thatValue = thatObj.region.routeEncodingRules.get(thatObj.types[i]).getValue();
equals = (thisTag.equals(thatTag) && thisValue.equals(thatValue));
}
}
}
if (equals) {
if (this.nameIds == null || thatObj.nameIds == null) {
equals = this.nameIds == thatObj.nameIds;
} else if (nameIds.length != thatObj.nameIds.length) {
equals = false;
} else {
for (int i = 0; i < this.nameIds.length && equals; i++) {
String thisTag = region.routeEncodingRules.get(nameIds[i]).getTag();
String thisValue = names.get(nameIds[i]);
String thatTag = thatObj.region.routeEncodingRules.get(thatObj.nameIds[i]).getTag();
String thatValue = thatObj.names.get(thatObj.nameIds[i]);
equals = (Algorithms.objectEquals(thisTag, thatTag) && Algorithms.objectEquals(thisValue, thatValue));
}
}
}
if (equals) {
if (this.pointTypes == null || thatObj.pointTypes == null) {
equals = this.pointTypes == thatObj.pointTypes;
} else if (pointTypes.length != thatObj.pointTypes.length) {
equals = false;
} else {
for (int i = 0; i < this.pointTypes.length && equals; i++) {
if (this.pointTypes[i] == null || thatObj.pointTypes[i] == null) {
equals = this.pointTypes[i] == thatObj.pointTypes[i];
} else if (pointTypes[i].length != thatObj.pointTypes[i].length) {
equals = false;
} else {
for (int j = 0; j < this.pointTypes[i].length && equals; j++) {
String thisTag = region.routeEncodingRules.get(pointTypes[i][j]).getTag();
String thisValue = region.routeEncodingRules.get(pointTypes[i][j]).getValue();
String thatTag = thatObj.region.routeEncodingRules.get(thatObj.pointTypes[i][j]).getTag();
String thatValue = thatObj.region.routeEncodingRules.get(thatObj.pointTypes[i][j]).getValue();
equals = (Algorithms.objectEquals(thisTag, thatTag) && Algorithms.objectEquals(thisValue, thatValue));
}
}
}
}
}
if (equals) {
if (this.pointNameTypes == null || thatObj.pointNameTypes == null) {
equals = this.pointNameTypes == thatObj.pointNameTypes;
} else if (pointNameTypes.length != thatObj.pointNameTypes.length) {
equals = false;
} else {
for (int i = 0; i < this.pointNameTypes.length && equals; i++) {
if (this.pointNameTypes[i] == null || thatObj.pointNameTypes[i] == null) {
equals = this.pointNameTypes[i] == thatObj.pointNameTypes[i];
} else if (pointNameTypes[i].length != thatObj.pointNameTypes[i].length) {
equals = false;
} else {
for (int j = 0; j < this.pointNameTypes[i].length && equals; j++) {
String thisTag = region.routeEncodingRules.get(pointNameTypes[i][j]).getTag();
String thisValue = pointNames[i][j];
String thatTag = thatObj.region.routeEncodingRules.get(thatObj.pointNameTypes[i][j]).getTag();
String thatValue = thatObj.pointNames[i][j];
equals = (Algorithms.objectEquals(thisTag, thatTag) && Algorithms.objectEquals(thisValue, thatValue));
}
}
}
}
}
return equals;
}
return false;
}
public float[] calculateHeightArray() {
if(heightDistanceArray != null) {
return heightDistanceArray;
@ -297,6 +393,10 @@ public class RouteDataObject {
public int getRestrictionType(int i) {
return (int) (restrictions[i] & RESTRICTION_MASK);
}
public long getRawRestriction(int i) {
return restrictions[i];
}
public long getRestrictionId(int i) {
return restrictions[i] >> RESTRICTION_SHIFT;

View file

@ -36,8 +36,9 @@ public class Amenity extends MapObject {
private String openingHours;
private Map<String, String> additionalInfo;
private AmenityRoutePoint routePoint; // for search on path
private TIntArrayList x;
// context menu geometry;
private TIntArrayList y;
private TIntArrayList x;
public Amenity() {
}
@ -65,20 +66,6 @@ public class Amenity extends MapObject {
this.subType = subType;
}
public TIntArrayList getX() {
if (x == null) {
x = new TIntArrayList();
}
return x;
}
public TIntArrayList getY() {
if (y == null) {
y = new TIntArrayList();
}
return y;
}
public String getOpeningHours() {
// getAdditionalInfo("opening_hours");
return openingHours;
@ -166,12 +153,12 @@ public class Amenity extends MapObject {
@Override
public String toStringEn() {
return super.toStringEn() + ":" + type.getKeyName() + ":" + subType;
return super.toStringEn() + ": " + type.getKeyName() + ":" + subType;
}
@Override
public String toString() {
return type.getKeyName() + " : " + subType + " " + getName();
return type.getKeyName() + ": " + subType + " " + getName();
}
public String getSite() {
@ -271,6 +258,19 @@ public class Amenity extends MapObject {
setAdditionalInfo(OPENING_HOURS, openingHours);
}
public boolean comparePoi(Amenity thatObj) {
if (this.id.longValue() == thatObj.id.longValue() &&
Algorithms.objectEquals(this.type.getKeyName(), thatObj.type.getKeyName()) &&
Algorithms.objectEquals(getLocation(), thatObj.getLocation()) &&
Algorithms.objectEquals(this.subType, thatObj.subType) &&
Algorithms.objectEquals(this.additionalInfo, thatObj.additionalInfo) &&
Algorithms.objectEquals(this.getNamesMap(true), thatObj.getNamesMap(true))) {
return true;
}
return false;
}
@Override
public int compareTo(MapObject o) {
int cmp = super.compareTo(o);
@ -293,4 +293,18 @@ public class Amenity extends MapObject {
}
return res;
}
public TIntArrayList getY() {
if(y == null) {
y = new TIntArrayList();
}
return y;
}
public TIntArrayList getX() {
if (x == null) {
x = new TIntArrayList();
}
return x;
}
}

View file

@ -101,7 +101,7 @@
android:layout_toLeftOf="@id/up_down_button"
android:layout_toRightOf="@id/measurement_points_text_view"
android:layout_toStartOf="@id/up_down_button"
android:textColor="?android:textColorSecondary"
android:textColor="@color/color_distance"
android:textSize="@dimen/default_list_text_size"
tools:text=" 700 m"/>

View file

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/map_markers_toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/dashboard_map_toolbar"
android:layout_alignParentTop="true"
android:background="@color/osmand_orange"
android:minHeight="@dimen/dashboard_map_toolbar"
android:theme="?attr/toolbar_theme"
@ -44,14 +44,19 @@
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/map_markers_bottom_navigation"
android:layout_below="@+id/map_markers_toolbar">
android:layout_height="0dp"
android:layout_weight="1">
<net.osmand.plus.LockableViewPager
android:id="@+id/map_markers_view_pager"
<!-- Coordinator layout is needed in order to display the snackbar above the bottom navigation -->
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="wrap_content">
<net.osmand.plus.LockableViewPager
android:id="@+id/map_markers_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.design.widget.CoordinatorLayout>
<ImageView
android:layout_width="match_parent"
@ -66,10 +71,9 @@
android:id="@+id/map_markers_bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="?attr/bg_color"
app:itemBackground="?attr/bg_color"
app:itemIconTint="@color/bottom_navigation_color_selector"
app:itemTextColor="@color/bottom_navigation_color_selector"
app:menu="@menu/map_markers_bottom_navigation"/>
</RelativeLayout>
</LinearLayout>

View file

@ -0,0 +1,236 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/bg_color"
android:orientation="vertical">
<ScrollView
android:id="@+id/marker_options_scroll_view"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="8dp">
<net.osmand.plus.widgets.TextViewEx
android:layout_width="match_parent"
android:layout_height="@dimen/measurement_tool_bottom_title_height"
android:gravity="center_vertical"
android:paddingEnd="@dimen/measurement_tool_content_padding"
android:paddingLeft="@dimen/measurement_tool_content_padding"
android:paddingRight="@dimen/measurement_tool_content_padding"
android:paddingStart="@dimen/measurement_tool_content_padding"
android:text="@string/marker_options"
android:textAppearance="@style/TextAppearance.ListItemTitle"
osmand:typeface="@string/font_roboto_medium"/>
<LinearLayout
android:id="@+id/sort_by_row"
android:layout_width="match_parent"
android:layout_height="@dimen/measurement_tool_bottom_list_item_height"
android:background="?attr/selectableItemBackground"
android:minHeight="@dimen/measurement_tool_bottom_list_item_height"
android:paddingEnd="@dimen/measurement_tool_content_padding"
android:paddingLeft="@dimen/measurement_tool_content_padding"
android:paddingRight="@dimen/measurement_tool_content_padding"
android:paddingStart="@dimen/measurement_tool_content_padding">
<ImageView
android:id="@+id/sort_by_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/measurement_tool_bottom_icon_margin"
android:layout_marginRight="@dimen/measurement_tool_bottom_icon_margin"
tools:src="@drawable/ic_sort_waypoint_dark"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:maxLines="1"
android:text="@string/sort_by"
android:textAppearance="@style/TextAppearance.ListItemTitle"/>
</LinearLayout>
<LinearLayout
android:id="@+id/show_direction_row"
android:layout_width="match_parent"
android:layout_height="@dimen/measurement_tool_bottom_list_item_height"
android:background="?attr/selectableItemBackground"
android:minHeight="@dimen/measurement_tool_bottom_list_item_height"
android:paddingEnd="@dimen/measurement_tool_content_padding"
android:paddingLeft="@dimen/measurement_tool_content_padding"
android:paddingRight="@dimen/measurement_tool_content_padding"
android:paddingStart="@dimen/measurement_tool_content_padding">
<ImageView
android:id="@+id/show_direction_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/measurement_tool_bottom_icon_margin"
android:layout_marginRight="@dimen/measurement_tool_bottom_icon_margin"
tools:src="@drawable/ic_sort_waypoint_dark"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/show_direction"
android:textAppearance="@style/TextAppearance.ListItemTitle"/>
<TextView
android:id="@+id/show_direction_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:maxLines="1"
android:textAppearance="@style/TextAppearance.ListItemTitle"
android:textColor="@color/map_widget_blue_pressed"
tools:text="Top bar"/>
</LinearLayout>
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_marginBottom="@dimen/measurement_tool_bottom_divider_margin_bottom"
android:layout_marginLeft="@dimen/measurement_tool_bottom_divider_margin_start"
android:layout_marginStart="@dimen/measurement_tool_bottom_divider_margin_start"
android:layout_marginTop="@dimen/measurement_tool_bottom_divider_margin_top"
android:background="?attr/dashboard_divider"/>
<LinearLayout
android:id="@+id/build_route_row"
android:layout_width="match_parent"
android:layout_height="@dimen/measurement_tool_bottom_list_item_height"
android:background="?attr/selectableItemBackground"
android:minHeight="@dimen/measurement_tool_bottom_list_item_height"
android:paddingEnd="@dimen/measurement_tool_content_padding"
android:paddingLeft="@dimen/measurement_tool_content_padding"
android:paddingRight="@dimen/measurement_tool_content_padding"
android:paddingStart="@dimen/measurement_tool_content_padding">
<ImageView
android:id="@+id/build_route_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/measurement_tool_bottom_icon_margin"
android:layout_marginRight="@dimen/measurement_tool_bottom_icon_margin"
tools:src="@drawable/map_directions"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:maxLines="1"
android:text="@string/build_route"
android:textAppearance="@style/TextAppearance.ListItemTitle"/>
</LinearLayout>
<LinearLayout
android:id="@+id/save_as_new_track_row"
android:layout_width="match_parent"
android:layout_height="@dimen/measurement_tool_bottom_list_item_height"
android:background="?attr/selectableItemBackground"
android:minHeight="@dimen/measurement_tool_bottom_list_item_height"
android:paddingEnd="@dimen/measurement_tool_content_padding"
android:paddingLeft="@dimen/measurement_tool_content_padding"
android:paddingRight="@dimen/measurement_tool_content_padding"
android:paddingStart="@dimen/measurement_tool_content_padding">
<ImageView
android:id="@+id/save_as_new_track_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/measurement_tool_bottom_icon_margin"
android:layout_marginRight="@dimen/measurement_tool_bottom_icon_margin"
tools:src="@drawable/ic_action_polygom_dark"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:maxLines="1"
android:text="@string/shared_string_save_as_gpx"
android:textAppearance="@style/TextAppearance.ListItemTitle"/>
</LinearLayout>
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_marginBottom="@dimen/measurement_tool_bottom_divider_margin_bottom"
android:layout_marginLeft="@dimen/measurement_tool_bottom_divider_margin_start"
android:layout_marginStart="@dimen/measurement_tool_bottom_divider_margin_start"
android:layout_marginTop="@dimen/measurement_tool_bottom_divider_margin_top"
android:background="?attr/dashboard_divider"/>
<LinearLayout
android:id="@+id/move_all_to_history_row"
android:layout_width="match_parent"
android:layout_height="@dimen/measurement_tool_bottom_list_item_height"
android:background="?attr/selectableItemBackground"
android:minHeight="@dimen/measurement_tool_bottom_list_item_height"
android:paddingEnd="@dimen/measurement_tool_content_padding"
android:paddingLeft="@dimen/measurement_tool_content_padding"
android:paddingRight="@dimen/measurement_tool_content_padding"
android:paddingStart="@dimen/measurement_tool_content_padding">
<ImageView
android:id="@+id/move_all_to_history_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/measurement_tool_bottom_icon_margin"
android:layout_marginRight="@dimen/measurement_tool_bottom_icon_margin"
tools:src="@drawable/ic_action_history2"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:maxLines="1"
android:text="@string/move_all_to_history"
android:textAppearance="@style/TextAppearance.ListItemTitle"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/dashboard_divider"/>
<FrameLayout
android:id="@+id/cancel_row"
android:layout_width="match_parent"
android:layout_height="@dimen/measure_distance_bottom_sheet_cancel_button_height"
android:background="?attr/selectableItemBackground">
<TextView
android:id="@+id/cancel_row_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/shared_string_close"
android:textAllCaps="true"
android:textColor="?attr/color_dialog_buttons"
android:textSize="@dimen/default_desc_text_size"
android:textStyle="bold"/>
</FrameLayout>
</LinearLayout>

View file

@ -96,7 +96,7 @@
android:layout_toLeftOf="@id/up_down_button"
android:layout_toRightOf="@id/measurement_points_text_view"
android:layout_toStartOf="@id/up_down_button"
android:textColor="?android:textColorSecondary"
android:textColor="@color/color_distance"
android:textSize="@dimen/default_list_text_size"
tools:text=" 700 m"/>

View file

@ -4,62 +4,44 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="?attr/bg_color"
android:descendantFocusability="blocksDescendants">
<RelativeLayout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/bg_color">
android:background="?attr/selectableItemBackground">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/marker_reorder_icon"
android:id="@+id/map_marker_reorder_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:padding="16dp"
android:layout_gravity="center_vertical"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingStart="16dp"
android:paddingTop="16dp"
android:tint="?attr/secondary_icon_color"
tools:src="@drawable/ic_action_reorder"/>
<android.support.v7.widget.AppCompatImageView
android:id="@+id/marker_icon"
android:id="@+id/map_marker_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_toEndOf="@id/marker_reorder_icon"
android:layout_toRightOf="@id/marker_reorder_icon"
tools:src="@drawable/ic_action_flag_dark"/>
<ImageButton
android:id="@+id/marker_options_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginBottom="16dp"
android:layout_marginLeft="14dp"
android:layout_marginRight="14dp"
android:layout_marginTop="16dp"
android:background="?attr/selectableItemBackground"
android:focusableInTouchMode="true"
tools:src="@drawable/ic_overflow_menu_white"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toEndOf="@+id/marker_icon"
android:layout_toLeftOf="@id/marker_options_button"
android:layout_toRightOf="@+id/marker_icon"
android:layout_toStartOf="@id/marker_options_button"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="vertical">
<android.support.v7.widget.AppCompatTextView
android:id="@+id/measure_point_title"
android:id="@+id/map_marker_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?android:textColorPrimary"
@ -71,36 +53,42 @@
android:layout_height="wrap_content">
<ImageView
android:id="@+id/direction_icon"
android:id="@+id/map_marker_direction_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
tools:src="@drawable/ic_direction_arrow"/>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/marker_distance"
android:id="@+id/map_marker_distance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:maxLines="1"
android:textColor="@color/marker_blue"
android:textSize="@dimen/default_sub_text_size"
tools:text="213 m"/>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/point_icon_text_view"
android:id="@+id/map_marker_point_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="•"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_sub_text_size"/>
android:textSize="@dimen/default_sub_text_size"
android:visibility="gone"
tools:visibility="visible"/>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/marker_description"
android:id="@+id/map_marker_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_sub_text_size"
@ -109,14 +97,27 @@
</LinearLayout>
<View
android:id="@+id/points_divider"
<ImageButton
android:id="@+id/map_marker_options_button"
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_alignParentBottom="true"
android:layout_toEndOf="@+id/marker_reorder_icon"
android:layout_toRightOf="@+id/marker_reorder_icon"
android:background="?attr/dashboard_divider"/>
</RelativeLayout>
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:background="?attr/selectableItemBackground"
android:focusableInTouchMode="true"
android:paddingBottom="16dp"
android:paddingLeft="14dp"
android:paddingRight="14dp"
android:paddingTop="16dp"
tools:src="@drawable/ic_overflow_menu_white"/>
</FrameLayout>
</LinearLayout>
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:layout_marginLeft="56dp"
android:layout_marginStart="56dp"
android:background="?attr/dashboard_divider"/>
</FrameLayout>

View file

@ -336,7 +336,7 @@
<string name="map_widget_plain_time">Hazırki vaxt</string>
<string name="selected_gpx_info_show">"
\n
\nXəritədə görmək üçün basıb saxlayın"</string>
\nXəritədə görmək üçün uzun basın"</string>
<string name="local_index_gpx_info_show">"
\n
\nSeçimlər üçün basıb saxlayın"</string>
@ -472,7 +472,7 @@
<string name="map_widget_renderer">Xəritə stili</string>
<string name="map_widget_show_ruler">Xətkeş</string>
<string name="map_widget_transparent">Şəffaf widget-lər</string>
<string name="screen_is_locked">Ekran kilidini açmaq üçün kilid ikonuna basın</string>
<string name="screen_is_locked">Ekran kilidini açmaq üçün kilid ikonuna toxunun</string>
<string name="map_widget_top_text">Küçə adı</string>
<string name="map_widget_back_to_loc">Haradayam</string>
<string name="map_widget_compass">Kompas</string>
@ -842,7 +842,7 @@
<string name="osm_live_subscription_desc">Abunəlik bütün qlobal xəritələr üçün saatlıq, günlük, həftəlik yenilənmələri və limitsiz endirmələri təmin edir.</string>
<string name="get_for">%1$s ödəyib al</string>
<string name="get_for_month">Aylıq %1$s ödəyib al</string>
<string name="osmand_plus_banner_desc">Limitsiz xəritə endirmələri və aylıq xəritə yenilənmələri ilə OsmAnd-ın tam versiyası.</string>
<string name="osmand_plus_banner_desc">Limitsiz xəritə endirmələri, yenilənmələri və Vikipediya qoşması.</string>
<string name="skip_map_downloading">Endirilən xəritələri keç</string>
<string name="skip_map_downloading_desc">Quraşdırılmış offlayn xəritəniz yoxdur. Siyahıdan bir xəritə seçə və ya xəritələri daha sonra Menyudan endirə bilərsiniz - %1$s.</string>
<string name="search_another_country">Başqa region seçin</string>
@ -1348,7 +1348,7 @@
<string name="av_use_external_recorder_descr">Video çəkmək üçün sistem proqramını istifadə et</string>
<string name="av_use_external_recorder">Sistem proqramını istifadə et</string>
<string name="recording_error">Qeydetmə zamanı səhv baş verdi</string>
<string name="recording_is_recorded">Səs/video qeyd edilir. Dayandırmaq üçün AV widget-inə basın.</string>
<string name="recording_is_recorded">Səs/video qeyd edilir. Dayandırmaq üçün AV widget-inə toxunun.</string>
<string name="building_number">Bina nömrəsi</string>
<string name="shared_string_permissions">İcazələr</string>
<string name="import_gpx_failed_descr">OsmAnd faylı idxal edə bilmir. OsmAnd-ın həmin yerdən fayl oxumaq icazəsi olub-olmadığını yoxlayın.</string>
@ -1365,7 +1365,7 @@
<string name="gpx_no_tracks_title_folder">Qovluğa izlər əlavə edə də bilərsiniz</string>
<string name="gpx_add_track">İz əlavə et</string>
<string name="storage_place_description">OsmAnd-ın məlumat saxlama yeri (xəritələr, izlər və s.): %1$s.</string>
<string name="shared_string_save_as_gpx">GPX izi olaraq saxla</string>
<string name="shared_string_save_as_gpx">Yeni GPX izi olaraq saxla</string>
<string name="shared_string_my_tracks">İzlərim</string>
<string name="shared_string_currently_recording_track">Hazırki qeyd edilən iz</string>
<string name="track_segments">İz seqmentləri</string>
@ -1513,7 +1513,7 @@
<string name="routing_attr_allow_motorway_name">Avtomagistrallara icazə ver</string>
<string name="routing_attr_allow_motorway_description">Avtomagistrallara icazə ver</string>
<string name="trip_rec_notification_settings">Səyahət qeydetmə (məlumat yoxdur)</string>
<string name="trip_rec_notification_settings_desc">“Qeyd et” düyməsinə basaraq səyahət qeydetməni başlatmağa icazə verən bildirişi göstər</string>
<string name="trip_rec_notification_settings_desc">Səyahət qeydinə başlamağa imkan verən sistem bildirişi göstər</string>
<string name="save_track_min_speed">Minimum qeydiyyat sürəti</string>
<string name="new_filter_desc">Yeni filtr üçün ad daxil edin. Bu, sizin Kateqoriyalar bölmənizə əlavə olunur.</string>
<string name="donation_to_osm">OpenStreetMap cəmiyyəti üçün ianə</string>
@ -1642,10 +1642,10 @@
<string name="favorite_delete_multiple">%1$d favoriti və %2$d favorit qrupu silmək üzrəsiniz. Əminsiniz?</string>
<string name="downloads_left_template">%1$s endirmə qalıb</string>
<string name="quick_action_resume_pause_navigation">Naviqasiyaya davam/fasilə</string>
<string name="quick_action_resume_pause_navigation_descr">Naviqasiyaya fasilə vermək üçün və ya fasilə verilibsə, davam etmək üçün bu düyməni basın.</string>
<string name="quick_action_resume_pause_navigation_descr">Naviqasiyaya fasilə və ya davam etmək üçün bu düyməyə toxunun.</string>
<string name="quick_action_show_navigation_finish_dialog">Naviqasiyanın bitmə dialoqunu göstər</string>
<string name="quick_action_start_stop_navigation">Naviqasiyanı başlat/bitir</string>
<string name="quick_action_start_stop_navigation_descr">Naviqasiyanı başlatmaq üçün və ya artıq başladılıbsa, dayandırmaq üçün bu düyməni basın.</string>
<string name="quick_action_start_stop_navigation">Naviqasiyanı başlat/dayandır</string>
<string name="quick_action_start_stop_navigation_descr">Naviqasiyanı başlatmaq və ya bitirmək üçün bu düyməyə toxunun.</string>
<string name="mappilary_no_internet_desc">Mapillary-dən şəkillərə baxmaq üçün internetiniz olmalıdır</string>
<string name="retry">Təkrar cəhd</string>
<string name="osm_edit_modified_poi">Dəyişdirilmiş OSM POI</string>
@ -1699,7 +1699,21 @@
<string name="pref_vector_map">Vektor xəritə parametrləri</string>
<string name="file_with_name_already_exists">Bu adda fayl artıq mövcuddur.</string>
<string name="gpx_navigation">GPX marşrut</string>
<string name="measurement_tool">Ölçmə aləti</string>
<string name="measurement_tool">Məsafəni ölç</string>
<string name="add_gpx_waypoint_bottom_sheet_title">GPX yol nöqtəsi əlavə et</string>
<string name="shared_string_create">Yarat</string>
</resources>
<string name="shared_string_options">Seçimlər</string>
<string name="enter_gpx_name">GPX fayl adı:</string>
<string name="move_all_to_history">Hamısını tarixçəyə daşı</string>
<string name="show_direction">İstiqaməti göstər</string>
<string name="sort_by">Sırala</string>
<string name="marker_options">İşarə seçimləri</string>
<string name="exit_without_saving">Yadda saxlamadan çıxılsın?</string>
<string name="save_as_route_point">Marşrut nöqtələri kimi saxla</string>
<string name="route_point">Marşrut nöqtəsi</string>
<string name="show_on_map_after_saving">Saxladıqdan sonra xəritədə göstər</string>
<string name="measurement_tool_action_bar">Xəritəyə baxın və nöqtələr əlavə edin</string>
<string name="add_route_points">Marşrut nöqtələri əlavə et</string>
<string name="add_waypoint">Yol nöqtəsi əlavə et</string>
<string name="empty_state_favourites">Favoritlər əlavə et</string>
</resources>

View file

@ -1131,7 +1131,7 @@ Miesca parkoŭkі і čas vіdać na paneli kіravańnia OsmAnd і na vіdžecie
<string name="select_search_position">Pačatak:</string>
<string name="context_menu_item_search">Šukać navokał</string>
<string name="shared_string_save_as_gpx">Zachavać jak novy GPX-slied</string>
<string name="shared_string_save_as_gpx">Zachavać jak novy GPX-sled</string>
<string name="route_successfully_saved_at">Maršrut paśpiachova zachavany jak \'%1$s\'.</string>
<string name="filename_input">Imia fajla:</string>
<string name="file_with_name_already_exist">Fajł z takoj nazvaj užo іsnuje.</string>
@ -2568,7 +2568,7 @@ U vypadku, kali vy lubіcie OsmAnd і OSM і chočacie padtrymać jaho, heta іd
<string name="analyze_on_map">Analizuj na mapie</string>
<string name="do_not_send_anonymous_app_usage">Na adsylać ananimnaj statystyki vykarystannia</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd zbiraje infarmacyju ab tym, jaki častki prahramy vykarystoŭvajucca vami. Vaša miescaznachodžannie nikoli nie adpraŭliajecca, jak i ŭsio, što vy ŭvodzicie, jakija voblasci prahliadajecie, što šukajecie ci spampoŭvajecie.</string>
<string name="do_not_show_startup_messages_desc">Pakazvaje paviedamlienni pra znižki i spiecyjaĺnyja lakaĺnyja padziei</string>
<string name="do_not_show_startup_messages_desc">Zahlušaje adlustravańnie paviedamleńniaŭ pra znižki i spiecyjalnuju łakalnuju padzieju</string>
<string name="routing_attr_relief_smoothness_factor_plains_name">Pahorysty</string>
<string name="route_points_category_name">Pavaroty na maršrucie</string>
<string name="track_points_category_name">Značnyja kropki maršruta</string>
@ -2776,7 +2776,7 @@ U vypadku, kali vy lubіcie OsmAnd і OSM і chočacie padtrymać jaho, heta іd
<string name="live_monitoring_max_interval_to_send_desrc">Zadaje čas bufieryzacyi dlia zbieražeńnia miescaŭ dlia adpraŭki biez zlučeńnia</string>
<string name="none_point_error">Kali laska, dadajcie pa mienšaj miery adnu kropku.</string>
<string name="enter_gpx_name">Imia fajla GPX:</string>
<string name="show_on_map_after_saving">Pakazać mapu paslia zachavannia</string>
<string name="show_on_map_after_saving">Pakazać na mapie pasla zachavańnia</string>
<string name="add_route_point">Dadać kropku maršrutu</string>
<string name="add_waypoint">Dadać kropku šliachu</string>
<string name="save_gpx_waypoint">Zachavać GPX-kropku šliachu</string>
@ -2805,7 +2805,14 @@ U vypadku, kali vy lubіcie OsmAnd і OSM і chočacie padtrymać jaho, heta іd
<string name="import_track">Impartavać slied</string>
<string name="import_track_desc">Fajl %1$s nie zmiaščaje kropki šliachu, impartavać jak slied?</string>
<string name="move_point">Pieramiascić kropku</string>
<string name="add_segment_to_the_track">Dadać u GPX-slied</string>
<string name="add_segment_to_the_track">Dadać u GPX-sled</string>
<string name="keep_showing_on_map">Praciahvać pakazvać na mapie</string>
<string name="exit_without_saving">Vyjsci biez zachavannia?</string>
<string name="exit_without_saving">Vyjsci biez zachavańnia?</string>
<string name="do_not_use_animations">Nie ŭžyvać animacyju</string>
<string name="do_not_use_animations_descr">Adklučeńnie animacyi ŭ prahramie</string>
<string name="move_all_to_history">Pieramiascić usio ŭ historyju</string>
<string name="build_route">Pabudavać maršrut</string>
<string name="show_direction">Pakazać napramak</string>
<string name="sort_by">Sartavać pa</string>
<string name="marker_options">Nalady markiera</string>
</resources>

View file

@ -3520,4 +3520,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Каноэ: так</string>
<string name="poi_boat_canoe_rental_rental_no">Каноэ: не</string>
<string name="poi_network">Сетка</string>
</resources>

View file

@ -1791,7 +1791,7 @@
<string name="general_settings_2">Агульныя налады</string>
<string name="shared_string_clear_all">Ачысьціць ўсё</string>
<string name="shared_string_collapse">Згарнуць</string>
<string name="shared_string_my_location">Маё месцазнаходжаньне</string>
<string name="shared_string_my_location">Маё месцазнаходжанне</string>
<string name="shared_string_my_tracks">Мае сьляды</string>
<string name="shared_string_currently_recording_track">Сьлед, які цяпер запісваецца</string>
<string name="plugin_touringview_name">Турыстычная мапа</string>
@ -2386,7 +2386,7 @@
<string name="no_update_info_desc">Не правяраць абнаўленні версій і зніжкі ад OsmAnd</string>
<string name="no_update_info">Не паказваць абнаўленні</string>
<string name="skip_map_downloading">Прапусьціць сьцягванне мапаў</string>
<string name="skip_map_downloading_desc">У вас няма загружаных мапаў. Вы можаце выбраць мапу са сьпісу або сьцягнуць яе пазьней праз мэню - %1$s.</string>
<string name="skip_map_downloading_desc">У вас няма загружаных мапаў. Вы можаце выбраць мапу са спісу або сцягнуць яе пазней праз меню - %1$s.</string>
<string name="search_another_country">Абраць іншы рэгіён</string>
<string name="search_map">Пошук мапаў…</string>
<string name="first_usage_wizard_desc">OsmAnd вызначыць ваша месцазнаходжанне і прапануе спампаваць мапы для гэтага рэгіёну.</string>
@ -2644,7 +2644,7 @@
<string name="do_not_send_anonymous_app_usage">На адсылаць ананімнай статыстыкі выкарыстання</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="do_not_show_startup_messages_desc">Заглушае адлюстраваньне паведамленьняў пра зніжкі і спецыяльную лакальную падзею</string>
<string name="parking_options">Опцыі паркоўкі</string>
<string name="full_version_thanks">Дякуй вам за набыццё поўнай версіі OsmAnd!</string>
<string name="routing_attr_relief_smoothness_factor_name">Абраць перасечанасць мясцовасці</string>
@ -2825,7 +2825,7 @@
<string name="shared_string_create">Стварыць</string>
<string name="none_point_error">Калі ласка, дадайце па меншай меры адну кропку.</string>
<string name="enter_gpx_name">Імя файла GPX:</string>
<string name="show_on_map_after_saving">Паказаць мапу пасля захавання</string>
<string name="show_on_map_after_saving">Паказаць на мапе пасля захавання</string>
<string name="add_route_point">Дадаць кропку маршруту</string>
<string name="add_waypoint">Дадаць кропку шляху</string>
<string name="save_gpx_waypoint">Захаваць GPX-кропку шляху</string>
@ -2857,4 +2857,11 @@
<string name="add_segment_to_the_track">Дадаць у GPX-след</string>
<string name="keep_showing_on_map">Працягваць паказваць на мапе</string>
<string name="exit_without_saving">Выйсці без захавання?</string>
<string name="do_not_use_animations">Не ўжываць анімацыю</string>
<string name="do_not_use_animations_descr">Адключэньне анімацыі ў праграме</string>
<string name="move_all_to_history">Перамясціць усё ў гісторыю</string>
<string name="build_route">Пабудаваць маршрут</string>
<string name="show_direction">Паказаць напрамак</string>
<string name="sort_by">Сартаваць па</string>
<string name="marker_options">Налады маркера</string>
</resources>

View file

@ -3118,4 +3118,6 @@
<string name="poi_historic_stone">Roca històrica</string>
<string name="poi_stone_type_coat_of_arms">Tipus: Escut d\'armes</string>
</resources>
<string name="poi_boat_rental_type">Lloguer d\'embarcacions</string>
</resources>

View file

@ -890,14 +890,14 @@ Memòria proporcional %4$s MB (límit de l\'Android %5$s MB, Dalvik %6$s MB).</s
<string name="background_service_wait_int_descr">Estableix el temps màxim d\'espera per a cada correcció de la posició en segon pla</string>
<string name="background_service_wait_int">Espera màxima per corregir</string>
<string name="local_indexes_cat_av">Dades d\'àudio/vídeo</string>
<string name="stop_routing_confirm">Esteu segurs de què voleu parar la navegació?</string>
<string name="clear_dest_confirm">"N\'esteu segurs que voleu eliminar la vostra destinació (i les vostres fites)?"</string>
<string name="stop_routing_confirm">Esteu segur què voleu aturar la navegació?</string>
<string name="clear_dest_confirm">"N\'esteu segur que voleu eliminar la vostra destinació (i les vostres fites)?"</string>
<string name="recording_context_menu_show">Mostra</string>
<string name="recording_photo_description">Fotografia %1$s %2$s</string>
<string name="av_def_action_picture">Fes una fotografia</string>
<string name="recording_context_menu_precord">Fes una fotografia</string>
<string name="download_hillshade_maps">Ombres de relleu</string>
<string name="precise_routing_mode_descr">Activeu per calcular itineraris precisos sense errades. Encara és lent i de distància limitada.</string>
<string name="precise_routing_mode_descr">Activeu per calcular itineraris precisos sense discontinuïtats. De moment és lent i de distància limitada.</string>
<string name="precise_routing_mode">Encaminament precís (alfa)</string>
<string name="intermediate_point">Punt de pas %1$s</string>
<string name="support_new_features_descr">Feu un donatiu per veure noves funcionalitats implementades a l\'aplicació</string>
@ -2424,7 +2424,7 @@ Abasta l\'àrea: %1$s x %2$s</string>
<string name="do_not_send_anonymous_app_usage">No enviïs anònimament les estadístiques d\'us de l\'aplicació</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd recull informació respecte com utilitzeu l\'aplicació. No s\'envia mai la vostra localització, tampoc les entrades que feu ni els detalls de les zones que consulteu, cerqueu o baixeu.</string>
<string name="do_not_show_startup_messages">No mostris missatges en engegar</string>
<string name="do_not_show_startup_messages_desc">Mostra descomptes de l\'aplicació i missatges de fets locals destacats</string>
<string name="do_not_show_startup_messages_desc">No mostris descomptes d\'aplicacions ni missatges d\'esdeveniments locals destacats</string>
<string name="parking_options">Opcions d\'aparcament</string>
<string name="right_side_navigation">Conducció per la dreta</string>
<string name="driving_region_automatic">Automàtic</string>
@ -2595,9 +2595,9 @@ Abasta l\'àrea: %1$s x %2$s</string>
<string name="add_point_before">Afegeix un punt abans de</string>
<string name="add_point_after">Afegeix un punt després de</string>
<string name="shared_string_options">Opcions</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd afegirà punts addicionals, en funció del tipus de navegació.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd enllaçarà els punts amb rutes segons el perfil seleccionat.</string>
<string name="measurement_tool_save_as_new_track_descr">Podeu desar els punts, ja sigui com a punts de la ruta o com una línia.</string>
<string name="choose_navigation_type">Escolliu el tipus de navegació</string>
<string name="choose_navigation_type">Escolliu el perfil de navegació</string>
<string name="add_route_points">Afegeix punts de la ruta</string>
<string name="add_line">Afegeix una línia</string>
<string name="empty_state_my_tracks">Afegeix i enregistra traces</string>
@ -2610,4 +2610,11 @@ Abasta l\'àrea: %1$s x %2$s</string>
<string name="add_segment_to_the_track">Afegeix a una traça GPX</string>
<string name="keep_showing_on_map">Continua mostrant al mapa</string>
<string name="exit_without_saving">Voleu sortir sense desar?</string>
<string name="do_not_use_animations">Sense ús d\'animacions</string>
<string name="do_not_use_animations_descr">Desactiva les animacions a l\'aplicació</string>
<string name="move_all_to_history">Mou tot a l\'històric</string>
<string name="build_route">Calcula la ruta</string>
<string name="show_direction">Mostra la direcció</string>
<string name="sort_by">Ordena per</string>
<string name="marker_options">Opcions de marcador</string>
</resources>

View file

@ -3565,4 +3565,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Kano: ja</string>
<string name="poi_boat_canoe_rental_rental_no">Kano: nej</string>
<string name="poi_network">Netværk</string>
</resources>

View file

@ -2666,9 +2666,9 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="full_version_thanks">Tak for købet af den fulde version af OsmAnd!</string>
<string name="parking_options">Parkeringsmuligheder</string>
<string name="do_not_send_anonymous_app_usage">Send ikke anonyme brugsstatistikker</string>
<string name="do_not_send_anonymous_app_usage_desc">Osmand indsamler oplysninger om hvilke dele der åbnes. Placering bliver aldrig sendt, heller ikke noget der indtastes eller oplysninger om områder der søges eller hentes.</string>
<string name="do_not_send_anonymous_app_usage_desc">Der indsamles oplysninger om hvilke dele der åbnes. Placering bliver aldrig sendt, heller ikke noget der indtastes eller oplysninger om områder der søges eller hentes.</string>
<string name="do_not_show_startup_messages">Vis ikke meddelelser ved opstart</string>
<string name="do_not_show_startup_messages_desc">Viser meddelelser om rabatter &amp; særlige lokale arrangementer</string>
<string name="do_not_show_startup_messages_desc">Undertrykker visning af rabatter &amp; særlige lokale hændelsesmeddelelser</string>
<string name="right_side_navigation">Højrekørsel</string>
<string name="driving_region_automatic">Automatisk</string>
<string name="osmand_extended_description_part1">OsmAnd (OSM Automated Navigation Directions) er et kort- og navigationsprogram med adgang til gratis, verdensomspændende og af høj kvalitet OpenStreetMap (OSM) data.
@ -2705,7 +2705,7 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="nautical_maps">Søkort</string>
<string name="depth_contour_descr">Kortsæt der indeholder dybdekonturlinjer og -punkter.</string>
<string name="subscribe_email_error">Fejl</string>
<string name="subscribe_email_desc">Abonner på e-mail listen om OsmAnd rabatter og hent yderligere 3 kort!</string>
<string name="subscribe_email_desc">Abonner på e-mail listen om rabatter og hent yderligere 3 kort!</string>
<string name="no_overlay">Ingen overleejring</string>
<string name="no_underlay">Ingen underlejring</string>
<string name="quick_action_add_destination">Tilføj destination</string>
@ -2776,7 +2776,7 @@ Tidligere destination bliver sidste mellemliggende punkt.</string>
<string name="mapillary_image">Mapillary foto</string>
<string name="distance_moving">Korrigeret afstand</string>
<string name="shared_string_permissions">Tilladelser</string>
<string name="import_gpx_failed_descr">OsmAnd kan ikke importere filen. Kontroller om OsmAnd har læsetilladelse på filplaceringen.</string>
<string name="import_gpx_failed_descr">Kan ikke importere filen. Kontroller om der er læsetilladelse på filplaceringen.</string>
<string name="map_widget_ruler_control">Cirkel lineal</string>
<string name="wrong_user_name">Forkert brugernavn!</string>
@ -2844,9 +2844,9 @@ Tidligere destination bliver sidste mellemliggende punkt.</string>
<string name="add_point_before">Tilføj punkt før</string>
<string name="add_point_after">Tilføj punkt efter</string>
<string name="shared_string_options">Indstillinger</string>
<string name="measurement_tool_snap_to_road_descr">Tilføjer yderligere punkter, tilpasset typen af navigation.</string>
<string name="measurement_tool_snap_to_road_descr">Forbinder punkterne med ruter for den valgte profil.</string>
<string name="measurement_tool_save_as_new_track_descr">Gem punkterne enten som rutepunkter eller som en linje.</string>
<string name="choose_navigation_type">Vælg navigationstype</string>
<string name="choose_navigation_type">Vælg navigationsprofil</string>
<string name="add_route_points">Tilføj rutepunkter</string>
<string name="add_line">Tilføj linje</string>
<string name="empty_state_my_tracks">Tilføj og optag spor</string>
@ -2857,4 +2857,13 @@ Tidligere destination bliver sidste mellemliggende punkt.</string>
<string name="import_track_desc">Filen %1$s indeholder ingen rutepunkter, importer den som et spor?</string>
<string name="move_point">Flyt punkt</string>
<string name="add_segment_to_the_track">Tilføj til et GPX-spor</string>
</resources>
<string name="keep_showing_on_map">Fortsæt med at vise på kortet</string>
<string name="exit_without_saving">Afslut uden at gemme?</string>
<string name="do_not_use_animations">Brug ikke animationer</string>
<string name="do_not_use_animations_descr">Deaktiverer animationer i programmet</string>
<string name="move_all_to_history">Flyt alle til historik</string>
<string name="build_route">Beregn rute</string>
<string name="show_direction">Vis retning</string>
<string name="sort_by">Sorter efter</string>
<string name="marker_options">Markør indstillinger</string>
</resources>

View file

@ -2657,10 +2657,10 @@
<string name="poi_free_flying_hanggliding_yes">Drachenfliegen</string>
<string name="poi_free_flying_hanggliding_no">Drachenfliegen: nein</string>
<string name="poi_free_flying_rigid_yes">Strikt</string>
<string name="poi_free_flying_rigid_no">Freies Fliegen strikt: nein</string>
<string name="poi_free_flying_rigid_no">Freeflying starr: nein</string>
<string name="poi_free_flying_site_orientation_n">Freeflying Ausrichtung: N</string>
<string name="poi_free_flying_site_orientation_ne">Freeflying Ausrichtung: NO</string>
<string name="poi_free_flying_site_orientation_e">Freier Flugplatz Ausrichtung: O</string>
<string name="poi_free_flying_site_orientation_e">Freeflying Standort Ausrichtung: O</string>
<string name="poi_free_flying_site_orientation_se">Freeflying Ausrichtung: SO</string>
<string name="poi_free_flying_site_orientation_s">Freeflying Ausrichtung: S</string>
<string name="poi_free_flying_site_orientation_sw">Freeflying Ausrichtung: SW</string>
@ -3481,4 +3481,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Kanus: ja</string>
<string name="poi_boat_canoe_rental_rental_no">Kanus: nein</string>
<string name="poi_network">Netzwerk</string>
</resources>

View file

@ -115,32 +115,29 @@
<string name="snap_to_road">Auf Straße einrasten</string>
<string name="osmand_play_title_30_chars">OsmAnd Karten &amp; Navigation</string>
<string name="osmand_short_description_80_chars">Globale Landkarten- und Navigationsanwendung für Offline- und Online-OSM-Karten</string>
<string name="osmand_long_description_1000_chars">"
OsmAnd (OSM Automated Navigation Directions)
OsmAnd ist eine Open-Source-Navigationsanwendung mit Zugriff auf eine große Vielfalt öffentlich zugänglicher OpenStreetMap-(OSM)-Karten weltweit. Alle Karten (Vektor- oder Kachelformate) können lokal auf der Speicherkarte abgelegt und offline verwendet werden. OsmAnd bietet ferner eine Offline- und Online-Routing-Funktion inklusive Sprachnavigation.
Einige der Kernfunktionen:
- Komplette Offline-Funktionalität (Kartenmaterial kann auf dem Gerät abgelegt werden)
- Kompakte Vektorkarten für die ganze Welt verfügbar
- Direktes Herunterladen von Länder- oder Regionenkarten aus der App heraus
- Darstellung mehrerer überlagerter Kartenschichten wie GPX oder Navigations-Tracks, POIs (Points of Interest), Favoriten, Höhenlinien, ÖPNV-Haltestellen, zusätzliche Karten mit wählbarer Transparenz
- Offline Adress- und POI-Suche
- Offlinenavigation für mittelstrecken Distanzen
- Auto-, Fahrrad- und Fußgänger-Modus mit
- optionaler automatischer Tag-Nacht-Umschaltung der Anzeige
- optionalem geschwindigkeitsabhängigem Kartenmaßstab
- optionaler Kartenausrichtung nach Kompass oder Bewegungsrichtung
- optionaler Fahrspuranzeige, Geschwindigkeitswarnung, aufgenommene oder TTS-Sprachansagen
Einschränkungen dieser kostenlosen Version von OsmAnd:
- Anzahl der Kartendownloads -
Kein Zugriff auf Wikipedia Offline-POIs
OsmAnd wird aktiv weiterentwickelt und das Projekt benötigt Mittel für die Entwicklung, die Komplettierung und den Test (Fahrten) neuer Funktionen.
Bitte erwägen Sie den Kauf von OsmAnd+, die Förderung spezieller Funktionen oder eine allgemeine Spende auf osmand.net.
"</string>
<string name="osmand_long_description_1000_chars">OsmAnd (OSM Automated Navigation Directions)
\n
\nOsmAnd ist eine Open-Source-Navigationsanwendung mit Zugriff auf eine große Vielfalt öffentlich zugänglicher OpenStreetMap-(OSM)-Karten weltweit. Alle Karten (Vektor- oder Kachelformate) können lokal auf der Speicherkarte abgelegt und offline verwendet werden. OsmAnd bietet ferner eine Offline- und Online-Routing-Funktion inklusive Sprachnavigation.
\n
\nEinige der Kernfunktionen:
\n- Komplette Offline-Funktionalität (Kartenmaterial kann auf dem Gerät abgelegt werden)
\n- Kompakte Vektorkarten für die ganze Welt verfügbar
\n- Direktes Herunterladen von Länder- oder Regionenkarten aus der App heraus
\n- Darstellung mehrerer überlagerter Kartenschichten wie GPX oder Navigations-Tracks, POIs (Points of Interest), Favoriten, Höhenlinien, ÖPNV-Haltestellen, zusätzliche Karten mit wählbarer Transparenz
\n- Offline Adress- und POI-Suche
\n- Offlinenavigation für mittelstrecken Distanzen
\n
\n- Auto-, Fahrrad- und Fußgänger-Modus mit
\n- optionaler automatischer Tag-Nacht-Umschaltung der Anzeige
\n- optionalem geschwindigkeitsabhängigem Kartenmaßstab - optionaler Kartenausrichtung nach Kompass oder Bewegungsrichtung
\n- optionaler Fahrspuranzeige, Geschwindigkeitswarnung, aufgenommene oder TTS-Sprachansagen
\n
\nEinschränkungen dieser kostenlosen Version von OsmAnd:
\n- Anzahl der Kartendownloads -
\nKein Zugriff auf Wikipedia Offline-POIs
\n
\nOsmAnd wird aktiv weiterentwickelt und das Projekt benötigt Mittel für die Entwicklung, die Komplettierung und den Test (Fahrten) neuer Funktionen.
\nBitte erwägen Sie den Kauf von OsmAnd+, die Förderung spezieller Funktionen oder eine allgemeine Spende auf osmand.net.</string>
<string name="osmand_plus_play_title_30_chars">OsmAnd+ Karten &amp; Navigation</string>
<string name="osmand_plus_short_description_80_chars">Globale Landkarten- und Navigationsanwendung für Offline- und Online-OSM-Karten</string>
@ -1102,7 +1099,7 @@ Proportionaler Speicher %4$s MB (Android Limit %5$s MB, Dalvik %6$s MB).</string
<string name="osmand_srtm_long_description_1000_chars">Diese Erweiterung beinhaltet Höhenlinien und Relief-Schattierungen, die als Ergänzung zu den Standard-Offline-Karten von OsmAnd angezeigt werden können. Diese Funktionalität ist vor allem für Sportler, Wanderer, Radfahrer, Trekker und jeden interessant, der sich für das Geländerelief einer Landschaft interessiert.
\n
\nDie globalen Daten (zwischen 70° Nord und 70° Süd) basieren auf Messungen von SRTM (Shuttle Radar Topography Mission) und ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), einem bildgebenden System an Bord des Satelliten Terra, dem Flaggschiff des NASA-Erd-Beobachtungsprogramms. ASTER beruht auf der erfolgreichen Zusammenarbeit zwischen der NASA, dem japanischen Ministerium für Wirtschaft, Handel und Industrie und dem japanischen Raumfahrtprogramm (J-spacesystems).</string>
<string name="stop_routing_confirm">Wollen Sie die Navigation wirklich beenden?</string>
<string name="stop_routing_confirm">Sind Sie sicher, dass Sie die Navigation stoppen möchten?</string>
<string name="clear_dest_confirm">Sind Sie sicher, dass Sie Ihr Ziel (und die Zwischenziele) löschen möchten?</string>
<string name="precise_routing_mode_descr">Aktivieren, um Routen fehlerfrei zu berechnen. Diese Funktion ist weiterhin auf kurze Entfernung begrenzt und langsam.</string>
<string name="precise_routing_mode">Präzises Routing (experimentell)</string>
@ -1134,7 +1131,7 @@ Proportionaler Speicher %4$s MB (Android Limit %5$s MB, Dalvik %6$s MB).</string
<string name="available_downloads_left">Es können noch %1$d Dateien herunter geladen werden.</string>
<string name="install_paid">Vollversion</string>
<string name="cancel_navigation">Navigation stoppen</string>
<string name="cancel_route">Route verwerfen</string>
<string name="cancel_route">Route ablehnen</string>
<string name="use_kalman_filter_compass_descr">Kompass-Rauschreduzierung (erhöht die Kompassträgheit etwas)</string>
<string name="use_kalman_filter_compass">Kalman-Filter verwenden</string>
<string name="use_magnetic_sensor_descr">Für den Kompass Magnetsensor statt Lagesensor verwenden</string>
@ -1186,9 +1183,9 @@ Proportionaler Speicher %4$s MB (Android Limit %5$s MB, Dalvik %6$s MB).</string
<string name="new_directions_point_dialog">Es sind bereits Zwischenziele gesetzt.</string>
<string name="context_menu_item_directions_to">Navigiere zu</string>
<string name="route_descr_map_location">Karte:</string>
<string name="route_to">nach:</string>
<string name="route_via">über:</string>
<string name="route_from">von:</string>
<string name="route_to">Nach:</string>
<string name="route_via">Über:</string>
<string name="route_from">Von:</string>
<string name="osb_author_dialog_password">OSM-Passwort (optional)</string>
<string name="context_menu_item_directions_from">Navigiere von</string>
<string name="av_camera_focus_hiperfocal">Hyperfokaler Fokus</string>
@ -1276,10 +1273,10 @@ Proportionaler Speicher %4$s MB (Android Limit %5$s MB, Dalvik %6$s MB).</string
<string name="route_preferences">Routing-Einstellungen</string>
<string name="route_info">Routen-Informationen</string>
<string name="calculate_osmand_route_without_internet">OsmAnd-Route ohne Internetverbindung berechnen</string>
<string name="use_displayed_track_for_navigation">Soll der angezeigte Track zum Navigieren genutzt werden?</string>
<string name="use_displayed_track_for_navigation">Möchten Sie die angezeigte Strecke zur Navigation verwenden?</string>
<string name="keep_and_add_destination_point">Als letztes Ziel hinzufügen</string>
<string name="select_gpx">GPX-Datei auswählen…</string>
<string name="route_descr_select_destination">Ziel wählen</string>
<string name="route_descr_select_destination">Ziel auswählen</string>
<string name="interrupt_music_descr">Sprachansagen pausieren (nicht nur dämpfen) Musikwiedergabe</string>
<string name="always_center_position_on_map">Standort immer in Bildschirmmitte anzeigen</string>
<string name="voice_pref_title">Stimme</string>
@ -1287,7 +1284,7 @@ Proportionaler Speicher %4$s MB (Android Limit %5$s MB, Dalvik %6$s MB).</string
<string name="share_route_as_gpx">Route als GPX-Datei teilen</string>
<string name="share_route_subject">Route über OsmAnd teilen</string>
<string name="localization_pref_title">Ländereinstellungen</string>
<string name="interrupt_music">Musikwiedergabe pausieren</string>
<string name="interrupt_music">Musik pausieren</string>
<string name="navigation_intent_invalid">Ungültiges Format: %s</string>
<string name="shared_string_share">Teilen</string>
<string name="share_fav_subject">Über OsmAnd geteilte Favoriten</string>
@ -1311,7 +1308,7 @@ Proportionaler Speicher %4$s MB (Android Limit %5$s MB, Dalvik %6$s MB).</string
<string name="save_as_favorites_points">als Favoritengruppe speichern</string>
<string name="select_destination_and_intermediate_points">Ziele auswählen</string>
<string name="sort_by_distance">Nach Entfernung sortieren</string>
<string name="sort_by_name">Nach Namen sortieren</string>
<string name="sort_by_name">Nach Name sortieren</string>
<string name="show_zoom_buttons_navigation_descr">Zoomtasten bei Navigation anzeigen</string>
<string name="show_zoom_buttons_navigation">Zoomtasten anzeigen</string>
@ -1720,9 +1717,9 @@ Mit Neuanmeldung fortfahren?</string>
<string name="settings_privacy">Privatsphäre</string>
<string name="points">Punkte</string>
<string name="shared_string_my_location">Mein Standort</string>
<string name="shared_string_my_location">Meine Position</string>
<string name="navigation_over_track">Navigation der Strecke entlang starten?</string>
<string name="navigation_over_track">Navigation entlang der Strecke starten?</string>
<string name="avoid_roads_msg">Sie können die Route ändern, indem Sie Straßen auswählen, die vermieden werden sollen</string>
<string name="enable_proxy_title">HTTP-Proxy aktivieren</string>
<string name="enable_proxy_descr">HTTP-Proxy für alle Netzwerkanfragen einrichten</string>
@ -2620,7 +2617,7 @@ Abgedeckte Fläche: %1$s x %2$s</string>
<string name="do_not_send_anonymous_app_usage">Keine anonymen App-Nutzungsdaten versenden</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd sammelt Informationen über durch Sie geöffnete App-Teile. Es wird niemals Ihre Position noch irgendeine Ihrer App-Eingaben oder Einzelheiten zu den von Ihnen betrachteten, gesuchten oder heruntergeladenen Gebieten versandt.</string>
<string name="do_not_show_startup_messages">Keine Meldungen beim App-Start einblenden</string>
<string name="do_not_show_startup_messages_desc">Es werden Meldungen zu App-Angeboten und besonderen lokalen Ereignissen angezeigt</string>
<string name="do_not_show_startup_messages_desc">Unterdrückt Meldungen zu App-Sonderangeboten und besonderen lokalen Ereignissen</string>
<string name="parking_options">Parkmöglichkeiten</string>
<string name="full_version_thanks">Vielen Dank, dass Sie die Vollversion von OsmAnd erworben haben!</string>
<string name="routing_attr_relief_smoothness_factor_hills_name">Bergig</string>
@ -2690,7 +2687,7 @@ Abgedeckte Fläche: %1$s x %2$s</string>
<string name="edit_name">Namen ändern</string>
<string name="animate_my_location">Meine Position animieren</string>
<string name="animate_my_location_desc">Animation meiner Position während der Navigation aktivieren</string>
<string name="route_is_too_long_v2">Die Route ist für eine Berechnung unter Umständen zu lang. Fügen Sie bitte Zwischenstopps ein, wenn nach 10 Minuten kein Routenvorschlag erscheint.</string>
<string name="route_is_too_long_v2">Diese Route könnte zu lang sein, um berechnet zu werden. Bitte fügen Sie Zwischenziele hinzu, wenn innerhalb von 10 Minuten kein Ergebnis gefunden wird.</string>
<string name="save_poi_too_many_uppercase">Der Name enthält zu viele Großbuchstaben. Möchten Sie den Vorgang fortsetzen?</string>
<string name="display_zoom_level">Darstellung ab Zoomstufe: %1$s</string>
<string name="routing_attr_allow_private_name">Privatwege erlauben</string>
@ -2797,9 +2794,9 @@ Abgedeckte Fläche: %1$s x %2$s</string>
<string name="add_point_before">Punkt davor hinzufügen</string>
<string name="add_point_after">Punkt dahinter hinzufügen</string>
<string name="shared_string_options">Optionen</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd wird, abhängig von der Navigationsart, zusätzliche Punkte hinzufügen.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd wird die Punkte mit Routen für das gewählte Profil verbinden.</string>
<string name="measurement_tool_save_as_new_track_descr">Die Punkte können entweder als Routenpunkte oder als Strecke gespeichert werden.</string>
<string name="choose_navigation_type">Navigationsart auswählen</string>
<string name="choose_navigation_type">Navigationsprofil wählen</string>
<string name="add_route_points">Routenpunkte hinzufügen</string>
<string name="add_line">Strecke hinzufügen</string>
<string name="empty_state_my_tracks">Tracks hinzufügen und aufzeichnen</string>
@ -2810,4 +2807,13 @@ Abgedeckte Fläche: %1$s x %2$s</string>
<string name="import_track_desc">Die Datei %1$s enthält keine Wegpunkte, soll sie als Track importiert werden?</string>
<string name="move_point">Punkt verschieben</string>
<string name="add_segment_to_the_track">Zu einem GPX-Track hinzufügen</string>
</resources>
<string name="do_not_use_animations">Verwenden Sie keine Animationen</string>
<string name="do_not_use_animations_descr">Deaktiviert Animationen in der App</string>
<string name="keep_showing_on_map">Weiterhin auf der Karte anzeigen</string>
<string name="exit_without_saving">Beenden ohne zu speichern?</string>
<string name="move_all_to_history">Alles zu Historie verschieben</string>
<string name="build_route">Route erstellen</string>
<string name="show_direction">Richtung anzeigen</string>
<string name="sort_by">Sortieren nach</string>
<string name="marker_options">Marker-Optionen</string>
</resources>

View file

@ -107,9 +107,9 @@
<string name="osmand_parking_warning_text">Ειδοποίηση για παραλαβή το αυτοκινήτου σας είχε προστεθεί προηγουμένως στο Ημερολόγιό σας. Θα παραμείνει εκεί μέχρι να το διαγράψετε χειροκίνητα.</string>
<string name="osmand_parking_time_limit_title">Ορισμός χρονικού ορίου στάθμευσης</string>
<string name="osmand_parking_delete_confirm">Θέλετε να αφαιρέσετε την τοποθεσία του παρκαρισμένου αυτοκινήτου;</string>
<string name="osmand_parking_delete">Διαγράψτε ένα δείκτη στάθμευσης</string>
<string name="osmand_parking_choose_type">Επιλέξτε τον τύπο της στάθμευσης</string>
<string name="osmand_parking_lim_text">Ορισμένου χρόνου</string>
<string name="osmand_parking_delete">Διαγράψτε ένα δείκτη στάθμευσης</string>
<string name="osmand_parking_choose_type">Επιλέξτε τον τύπο της στάθμευσης</string>
<string name="osmand_parking_lim_text">Ορισμένου χρόνου</string>
<string name="osmand_parking_no_lim_text">Απεριορίστου χρόνου</string>
<string name="osmand_parking_add_event">Προσθέστε μια ειδοποίηση στην εφαρμογή Ημερολόγιο</string>
<string name="osmand_parking_time_limit">Στάθμευση περιορισμένου χρόνου</string>
@ -118,19 +118,19 @@
<string name="osmand_parking_position_description_add">Παραλαβή αυτοκινήτου στις:</string>
<string name="osmand_parking_pm">ΜΜ</string>
<string name="osmand_parking_am">ΠΜ</string>
<string name="osmand_parking_position_name">Σημείο στάθμευσης</string>
<string name="osmand_parking_plugin_description">Αυτό το πρόσθετο σας επιτρέπει να αποθηκεύσετε τη θέση του σταθμευμένου αυτοκινήτου σας.</string>
<string name="osmand_parking_position_name">Σημείο στάθμευσης</string>
<string name="osmand_parking_plugin_description">Αυτό το πρόσθετο σας επιτρέπει να αποθηκεύσετε τη θέση του σταθμευμένου αυτοκινήτου σας.</string>
<string name="osmand_parking_plugin_name">Θέση Στάθμευσης</string>
<string name="context_menu_item_add_parking_point">Σήμανση ως μια θέση στάθμευσης</string>
<string name="context_menu_item_delete_parking_point">Διαγραφή ενός δείκτη στάθμευσης</string>
<string name="context_menu_item_add_parking_point">Σήμανση ως μια θέση στάθμευσης</string>
<string name="context_menu_item_delete_parking_point">Διαγραφή ενός δείκτη στάθμευσης</string>
<string name="gpxup_public">Δημόσιο</string>
<string name="gpxup_identifiable">Αναγνωρίσιμες</string>
<string name="gpxup_trackable">Ιχνηλάσιμο</string>
<string name="gpxup_identifiable">Αναγνωρίσιμες</string>
<string name="gpxup_trackable">Ιχνηλάσιμο</string>
<string name="gpxup_private">Ιδιωτικό</string>
<string name="asap">ASAP</string>
<string name="route_roundabout">Κυκλικός κόμβος: βγείτε στην %1$d έξοδο και προχωρήστε</string>
<string name="route_kl">Μείνετε αριστερά και προχωρήστε</string>
<string name="route_kl">Μείνετε αριστερά και προχωρήστε</string>
<string name="route_kr">Μείνετε δεξιά και προχωρήστε</string>
<string name="rendering_attr_noPolygons_description">Κάντε όλα τα επιφανειακά χαρακτηριστικά εδάφους στο χάρτη διάφανα</string>
<string name="rendering_attr_noPolygons_name">Απόκρυψη πολυγώνων</string>
@ -139,23 +139,23 @@
<string name="rendering_attr_contourLines_description">Εμφάνιση από το επίπεδο εστίασης (χρειάζεται αρχείο ισοϋψών):</string>
<string name="rendering_attr_contourLines_name">Εμφάνιση ισοϋψών γραμμών</string>
<string name="rendering_attr_hmRendered_description">Αύξηση ποσότητας των λεπτομερειών του χάρτη</string>
<string name="rendering_attr_hmRendered_name">Εμφάνιση περισσότερων λεπτομερειών χάρτη</string>
<string name="rendering_attr_hmRendered_name">Εμφάνιση περισσότερων λεπτομερειών χάρτη</string>
<string name="local_index_routing_data">Δεδομένα δρομολόγησης</string>
<string name="navigate_point_format">Μορφή</string>
<string name="poi_search_desc">Αναζήτηση ΣΕ (σημείο ενδιαφέροντος)</string>
<string name="address_search_desc">Αναζήτηση διεύθυνσης</string>
<string name="poi_search_desc">Αναζήτηση ΣΕ (σημείο ενδιαφέροντος)</string>
<string name="address_search_desc">Αναζήτηση διεύθυνσης</string>
<string name="navpoint_search_desc">Συντεταγμένες</string>
<string name="transport_search_desc">Αναζήτηση ΜΜΜ</string>
<string name="favourites_search_desc">Αναζήτηση αγαπημένων</string>
<string name="favourites_search_desc">Αναζήτηση αγαπημένων</string>
<string name="offline_navigation_not_available">Η εκτός σύνδεσης πλοήγηση του OsmAnd δεν είναι διαθέσιμη προσωρινά.</string>
<string name="left_side_navigation">Οδήγηση αριστερά</string>
<string name="left_side_navigation_descr">Επιλέξτε για χώρες με κυκλοφορία αριστερά</string>
<string name="left_side_navigation">Οδήγηση αριστερά</string>
<string name="left_side_navigation_descr">Επιλέξτε για χώρες με κυκλοφορία αριστερά</string>
<string name="unknown_from_location">Το αφετηρία δεν έχει ακόμη καθοριστεί</string>
<string name="unknown_from_location">Το αφετηρία δεν έχει ακόμη καθοριστεί</string>
<string name="unknown_location">Η Θέση σας δεν είναι ακόμα γνωστή</string>
<string name="modify_transparency">Τροποποίηση διαφάνειας (0 - διάφανο, 255 - αδιαφανές)</string>
<string name="confirm_interrupt_download">Θέλετε να διακόψετε τη λήψη αρχείων;</string>
<string name="modify_transparency">Τροποποίηση διαφάνειας (0 - διάφανο, 255 - αδιαφανές)</string>
<string name="confirm_interrupt_download">Θέλετε να διακόψετε τη λήψη αρχείων;</string>
<string name="first_time_msg">Ευχαριστούμε που χρησιμοποιείτε το OsmAnd. Για πολλά χαρακτηριστικά αυτής της εφαρμογής χρειάζεστε μερικά τοπικά offline δεδομένα τα οποία μπορείτε να κατεβάσετε μέσω του \'Ρυθμίσεις\' → \'Διαχείριση αρχείων χάρτη\'. Μετά από αυτό θα μπορείτε να δείτε χάρτες, να εντοπίσετε διευθύνσεις, να ψάξετε Σημ. Ενδ. και να βρείτε δημόσιες μεταφορές.</string>
<string name="basemap_was_selected_to_download">Ο βασικός χάρτης είναι απαραίτητος για τη σωστή λειτουργία της εφαρμογής και επιλέχθηκε προς λήψη.</string>
<string name="select_index_file_to_download">Δεν βρέθηκε τίποτα. Εάν δεν μπορείτε να βρείτε την περιοχή σας, μπορείτε να τη φτιάξετε μόνοι σας (βλέπε http://osmand.net).</string>
@ -197,33 +197,33 @@
<string name="validate_gpx_upload_name_pwd">Παρακαλώ καθορίστε το όνομα χρήστη OSM και τον κωδικό πρόσβασης για να ανεβάσετε τα αρχεία GPX.</string>
<string name="default_buttons_support">Υποστήριξη</string>
<string name="support_new_features">Υποστηρίξτε νέα χαρακτηριστικά</string>
<string name="show_ruler_level">Εμφάνιση χάρακα</string>
<string name="show_ruler_level">Εμφάνιση χάρακα</string>
<string name="info_button">Πληροφορίες</string>
<string name="back_to_location">Επιστροφή στη θέση</string>
<string name="back_to_location">Επιστροφή στη θέση</string>
<string name="accessibility_mode">Λειτουργία προσβασιμότητας</string>
<string name="accessibility_mode_descr">Ενεργοποιεί τις δυνατότητες προσβασιμότητας</string>
<string name="accessibility_mode">Λειτουργία προσβασιμότητας</string>
<string name="accessibility_mode_descr">Ενεργοποιεί τις δυνατότητες προσβασιμότητας</string>
<string name="shared_string_on">Ενεργό</string>
<string name="shared_string_off">Ανενεργό</string>
<string name="accessibility_default">Σύμφωνα με την καθολική ρύθμιση του συστήματος</string>
<string name="backToMenu">Πίσω Στο Μενού</string>
<string name="backToMenu">Πίσω Στο Μενού</string>
<string name="zoomOut">Σμίκρυνση</string>
<string name="zoomIn">Μεγέθυνση</string>
<string name="zoomIs">Η κλίμακα εστίασης είναι</string>
<string name="north">βόρεια</string>
<string name="north_north_east">βόρεια-βορειοανατολικά</string>
<string name="north_east">βορειοανατολικά</string>
<string name="east_north_east">ανατολικά-βορειοανατολικά</string>
<string name="north_north_east">βόρεια-βορειοανατολικά</string>
<string name="north_east">βορειοανατολικά</string>
<string name="east_north_east">ανατολικά-βορειοανατολικά</string>
<string name="east">ανατολικά</string>
<string name="east_south_east">ανατολικά-νοτιοανατολικά</string>
<string name="south_east">νοτιοανατολικά</string>
<string name="south_south_east">νότια-νοτιοανατολικά</string>
<string name="south_south_east">νότια-νοτιοανατολικά</string>
<string name="south">νότια</string>
<string name="south_south_west">νότια-νοτιοδυτικά</string>
<string name="south_west">νοτιοδυτικά</string>
<string name="west_south_west">δυτικά-νοτιοδυτικά</string>
<string name="south_south_west">νότια-νοτιοδυτικά</string>
<string name="south_west">νοτιοδυτικά</string>
<string name="west_south_west">δυτικά-νοτιοδυτικά</string>
<string name="west">δυτικά</string>
<string name="west_north_west">δυτικά-βορειοδυτικά</string>
<string name="west_north_west">δυτικά-βορειοδυτικά</string>
<string name="north_west">βορειοδυτικά</string>
<string name="north_north_west">βόρεια-βορειοδυτικά</string>
<string name="front">εμπρός</string>
@ -1719,4 +1719,4 @@
<string name="rendering_value_medium_name">Μέτριο</string>
<string name="rendering_value_bold_name">Παχύ</string>
<string name="report">Αναφορά</string>
</resources>
</resources>

View file

@ -3483,4 +3483,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Kanuoj: jes</string>
<string name="poi_boat_canoe_rental_rental_no">Kanuoj: ne</string>
<string name="poi_network">Reto</string>
</resources>

View file

@ -1351,7 +1351,7 @@ Proporcia memoro %4$s MB (limito de Android %5$s MB, Dalvik %6$s MB).</string>
<string name="basemap_was_selected_to_download">Bazmapo endas por ĝusta agado de aplikaĵo kaj ĝi estas elektita por elŝuto.</string>
<string name="plugins_screen">Kromprogramoj</string>
<string name="local_indexes_cat_tile">Enretaj mapoj kaj kaŝmemorigitaj kaheloj</string>
<string name="local_indexes_cat_map">Normalaj mapoj (vektoraj)</string>
<string name="local_indexes_cat_map">Normaj mapoj (vektoraj)</string>
<string name="index_settings_descr">Elŝuti kaj administri eksterretajn mapojn konservitajn en via aparato</string>
<string name="i_am_here">Mi estas tie ĉi</string>
<string name="free_version_title">Senpaga versio</string>
@ -2771,4 +2771,11 @@ Indikas lokon: %1$s x %2$s"</string>
<string name="add_segment_to_the_track">Aldoni al GPX-spuro</string>
<string name="keep_showing_on_map">Daŭre montri sur mapo</string>
<string name="exit_without_saving">Ĉu eliri sen konservi?</string>
<string name="do_not_use_animations">Ne uzi movbildojn</string>
<string name="do_not_use_animations_descr">Malaktivigi animaciojn en la aplikaĵo</string>
<string name="move_all_to_history">Movi ĉiujn al historio</string>
<string name="build_route">Kalkuli kurson</string>
<string name="show_direction">Montri direkton</string>
<string name="sort_by">Ordigi laŭ</string>
<string name="marker_options">Agordo de marko</string>
</resources>

View file

@ -3531,4 +3531,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Canoas: Sí</string>
<string name="poi_boat_canoe_rental_rental_no">Canoas: No</string>
<string name="poi_network">Red</string>
</resources>

View file

@ -603,7 +603,7 @@ Se aprecia la participación activa, y las contribuciones pueden hacerse directa
<string name="index_item_nation_addresses">direcciones nacionales</string>
<string name="calculate_osmand_route_without_internet">Calcular el segmento de la ruta OsmAnd sin Internet</string>
<string name="gpx_option_calculate_first_last_segment">Calcular la ruta OsmAnd para el primer y último segmento de ruta</string>
<string name="use_displayed_track_for_navigation">¿Deseas usar la ruta mostrada para la navegación?</string>
<string name="use_displayed_track_for_navigation">¿Quieres usar la ruta mostrada para la navegación?</string>
<string name="routing_attr_avoid_ferries_name">Evitar ferris/transbordadores</string>
<string name="routing_attr_avoid_ferries_description">Evita usar ferris/transbordadores</string>
<string name="android_19_location_disabled">Desde la versión Android 4.4 (KitKat), no puedes descargar ni actualizar los mapas en la carpeta de almacenamiento anterior (%s). ¿Quieres cambiar a la ubicación de almacenamiento permitida y copiar todos los archivos de OsmAnd allí?
@ -863,7 +863,7 @@ Se aprecia la participación activa, y las contribuciones pueden hacerse directa
<string name="avoid_motorway">Evitar autopistas</string>
<string name="auto_zoom_map_descr">Ampliación automática del mapa, según la velocidad (mientras el mapa se sincroniza con la ubicación actual)</string>
<string name="auto_zoom_map">Ampliación automática del mapa</string>
<string name="snap_to_road_descr">Ajusta la ubicación al camino durante la navegación</string>
<string name="snap_to_road_descr">Ajusta la ubicación al camino durante la navegación</string>
<string name="snap_to_road">Ajustar al camino</string>
<string name="interrupt_music_descr">El aviso por voz, pausa la reproducción de música (no sólo reduce el volumen)</string>
<string name="interrupt_music">Pausar música</string>
@ -1409,7 +1409,7 @@ Se aprecia la participación activa, y las contribuciones pueden hacerse directa
<string name="rotate_map_to_bearing">Orientación del mapa</string>
<string name="show_route">Detalle de la ruta</string>
<string name="fav_imported_sucessfully">Favoritos importados correctamente</string>
<string name="import_file_favourites">¿Guardar datos en un archivo GPX o importar puntos a Favoritos?</string>
<string name="import_file_favourites">¿Guardar datos en un archivo GPX o importar puntos de referencia a Favoritos?</string>
<string name="fav_file_to_load_not_found">El archivo GPX de favoritos no se encontró en {0}</string>
<string name="fav_saved_sucessfully">Los puntos favoritos se guardaron correctamente en {0}</string>
<string name="no_fav_to_save">Sin puntos favoritos que guardar</string>
@ -2470,7 +2470,7 @@ Proporciona un código completo</string>
<string name="do_not_send_anonymous_app_usage">No enviar estadísticas de uso anónimas de la aplicación</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd recopila información acerca de las secciones que abres en la aplicación. No recopilamos datos de ubicación, ingresos en la aplicación o datos relacionados con las áreas que visualizas, buscas o descargas.</string>
<string name="do_not_show_startup_messages">Ocultar mensajes al inicio</string>
<string name="do_not_show_startup_messages_desc">Muestra descuentos de la aplicación y mensajes especiales de eventos locales</string>
<string name="do_not_show_startup_messages_desc">Oculta los descuentos de la aplicación y los mensajes especiales de eventos locales</string>
<string name="parking_options">Opciones de estacionamiento</string>
<string name="full_version_thanks">¡Gracias por comprar la versión completa de OsmAnd!</string>
<string name="routing_attr_relief_smoothness_factor_name">Elegir la fluctuación de elevación</string>
@ -2720,9 +2720,9 @@ Proporciona un código completo</string>
<string name="add_point_before">Añadir punto anterior</string>
<string name="add_point_after">Añadir punto posterior</string>
<string name="shared_string_options">Opciones</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd añadirá puntos adicionales, según el tipo de navegación utilizado.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd conectará los puntos con las rutas del perfil elegido.</string>
<string name="measurement_tool_save_as_new_track_descr">Puedes guardar los puntos, ya sea como puntos de ruta o como una línea.</string>
<string name="choose_navigation_type">Elegir tipo de navegación</string>
<string name="choose_navigation_type">Elegir perfil de navegación</string>
<string name="add_route_points">Añadir puntos de ruta</string>
<string name="add_line">Añadir línea</string>
<string name="empty_state_my_tracks">Añadir y grabar trazas</string>
@ -2734,5 +2734,12 @@ Proporciona un código completo</string>
<string name="move_point">Mover punto</string>
<string name="add_segment_to_the_track">Añadir a una traza GPX</string>
<string name="keep_showing_on_map">Mantener en el mapa</string>
<string name="exit_without_saving">Salir sin guardar?</string>
<string name="exit_without_saving">¿Salir sin guardar?</string>
<string name="do_not_use_animations">No usar animaciones</string>
<string name="do_not_use_animations_descr">Desactiva las animaciones en la aplicación</string>
<string name="move_all_to_history">Mover todo al historial</string>
<string name="build_route">Crear ruta</string>
<string name="show_direction">Mostrar dirección</string>
<string name="sort_by">Ordenar por</string>
<string name="marker_options">Opciones del marcador</string>
</resources>

View file

@ -3276,8 +3276,8 @@
<string name="poi_boat_rental_type">Barcos de alquiler</string>
<string name="poi_boat_rental">Alquiler de barcos</string>
<string name="poi_boat_motorboat_rental_yes">Barcos a motor: Sí</string>
<string name="poi_boat_motorboat_rental_no">Barcos a motor: No</string>
<string name="poi_boat_motorboat_rental_yes">Lanchas de motor: Sí</string>
<string name="poi_boat_motorboat_rental_no">Lanchas de motor: No</string>
<string name="poi_boat_houseboat_rental_yes">Casas flotantes: Sí</string>
<string name="poi_boat_houseboat_rental_no">Casas flotantes: No</string>
<string name="poi_boat_pedalboat_rental_yes">Barcos a pedal: Sí</string>
@ -3293,4 +3293,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Canoas: Sí</string>
<string name="poi_boat_canoe_rental_rental_no">Canoas: No</string>
<string name="poi_network">Red</string>
</resources>

View file

@ -603,7 +603,7 @@ Se aprecia la participación activa, y las contribuciones pueden hacerse directa
<string name="index_item_nation_addresses">direcciones nacionales</string>
<string name="calculate_osmand_route_without_internet">Calcular el segmento de la ruta OsmAnd sin Internet</string>
<string name="gpx_option_calculate_first_last_segment">Calcular la ruta OsmAnd para el primer y último segmento de ruta</string>
<string name="use_displayed_track_for_navigation">¿Deseas usar la ruta mostrada para la navegación?</string>
<string name="use_displayed_track_for_navigation">¿Quieres usar la ruta mostrada para la navegación?</string>
<string name="routing_attr_avoid_ferries_name">Evitar ferris/transbordadores</string>
<string name="routing_attr_avoid_ferries_description">Evita usar ferris/transbordadores</string>
<string name="android_19_location_disabled">Desde la versión Android 4.4 (KitKat), no puedes descargar ni actualizar los mapas en la carpeta de almacenamiento anterior (%s). ¿Quieres cambiar a la ubicación de almacenamiento permitida y copiar todos los archivos de OsmAnd allí?
@ -863,7 +863,7 @@ Se aprecia la participación activa, y las contribuciones pueden hacerse directa
<string name="avoid_motorway">Evitar autopistas</string>
<string name="auto_zoom_map_descr">Ampliación automática del mapa, según la velocidad (mientras el mapa se sincroniza con la ubicación actual)</string>
<string name="auto_zoom_map">Ampliación automática del mapa</string>
<string name="snap_to_road_descr">Ajusta la ubicación al camino durante la navegación</string>
<string name="snap_to_road_descr">Ajusta la ubicación al camino durante la navegación</string>
<string name="snap_to_road">Ajustar al camino</string>
<string name="interrupt_music_descr">El aviso por voz, pausa la reproducción de música (no sólo reduce el volumen)</string>
<string name="interrupt_music">Pausar música</string>
@ -1409,7 +1409,7 @@ Se aprecia la participación activa, y las contribuciones pueden hacerse directa
<string name="rotate_map_to_bearing">Orientación del mapa</string>
<string name="show_route">Detalle de la ruta</string>
<string name="fav_imported_sucessfully">Favoritos importados correctamente</string>
<string name="import_file_favourites">¿Guardar datos en un archivo GPX o importar puntos a Favoritos?</string>
<string name="import_file_favourites">¿Guardar datos en un archivo GPX o importar puntos de referencia a Favoritos?</string>
<string name="fav_file_to_load_not_found">El archivo GPX de favoritos no se encontró en {0}</string>
<string name="fav_saved_sucessfully">Los puntos favoritos se guardaron correctamente en {0}</string>
<string name="no_fav_to_save">Sin puntos favoritos que guardar</string>
@ -2470,7 +2470,7 @@ Proporciona un código completo</string>
<string name="do_not_send_anonymous_app_usage">No enviar estadísticas de uso anónimas de la aplicación</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd recopila información acerca de las secciones que abres en la aplicación. No recopilamos datos de ubicación, ingresos en la aplicación o datos relacionados con las áreas que visualizas, buscas o descargas.</string>
<string name="do_not_show_startup_messages">Ocultar mensajes al inicio</string>
<string name="do_not_show_startup_messages_desc">Muestra descuentos de la aplicación y mensajes especiales de eventos locales</string>
<string name="do_not_show_startup_messages_desc">Oculta los descuentos de la aplicación y los mensajes especiales de eventos locales</string>
<string name="parking_options">Opciones de estacionamiento</string>
<string name="full_version_thanks">¡Gracias por comprar la versión completa de OsmAnd!</string>
<string name="routing_attr_relief_smoothness_factor_name">Elegir la fluctuación de elevación</string>
@ -2721,9 +2721,9 @@ Proporciona un código completo</string>
<string name="add_point_before">Añadir punto anterior</string>
<string name="add_point_after">Añadir punto posterior</string>
<string name="shared_string_options">Opciones</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd añadirá puntos adicionales, según el tipo de navegación utilizado.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd conectará los puntos con las rutas del perfil elegido.</string>
<string name="measurement_tool_save_as_new_track_descr">Puedes guardar los puntos, ya sea como puntos de ruta o como una línea.</string>
<string name="choose_navigation_type">Elegir tipo de navegación</string>
<string name="choose_navigation_type">Elegir perfil de navegación</string>
<string name="add_route_points">Añadir puntos de ruta</string>
<string name="add_line">Añadir línea</string>
<string name="empty_state_my_tracks">Añadir y grabar trazas</string>
@ -2735,5 +2735,12 @@ Proporciona un código completo</string>
<string name="move_point">Mover punto</string>
<string name="add_segment_to_the_track">Añadir a una traza GPX</string>
<string name="keep_showing_on_map">Mantener en el mapa</string>
<string name="exit_without_saving">Salir sin guardar?</string>
<string name="exit_without_saving">¿Salir sin guardar?</string>
<string name="do_not_use_animations">No usar animaciones</string>
<string name="do_not_use_animations_descr">Desactiva las animaciones en la aplicación</string>
<string name="move_all_to_history">Mover todo al historial</string>
<string name="build_route">Crear ruta</string>
<string name="show_direction">Mostrar dirección</string>
<string name="sort_by">Ordenar por</string>
<string name="marker_options">Opciones del marcador</string>
</resources>

View file

@ -3500,4 +3500,26 @@
<string name="poi_beds">Camas</string>
<string name="poi_boat_rental_type">Barcos de alquiler</string>
<string name="poi_boat_rental">Alquiler de barcos</string>
<string name="poi_boat_motorboat_rental_yes">Lanchas de motor: sí</string>
<string name="poi_boat_motorboat_rental_no">Lanchas de motor: no</string>
<string name="poi_boat_houseboat_rental_yes">Casas flotantes: sí</string>
<string name="poi_boat_houseboat_rental_no">Casas flotantes: no</string>
<string name="poi_boat_pedalboat_rental_yes">Barcos a pedal: sí</string>
<string name="poi_boat_pedalboat_rental_no">Barcos a pedal: no</string>
<string name="poi_boat_jetski_rental_yes">Motos de agua: sí</string>
<string name="poi_boat_jetski_rental_no">Motos de agua: no</string>
<string name="poi_boat_sailboat_rental_yes">Veleros: sí</string>
<string name="poi_boat_sailboat_rental_no">Veleros: no</string>
<string name="poi_boat_dinghy_rental_rental_yes">Botes: sí</string>
<string name="poi_boat_dinghy_rental_rental_no">Botes: no</string>
<string name="poi_boat_kayak_rental_rental_yes">Kayaks: sí</string>
<string name="poi_boat_kayak_rental_rental_no">Kayaks: no</string>
<string name="poi_boat_canoe_rental_rental_yes">Canoas: sí</string>
<string name="poi_boat_canoe_rental_rental_no">Canoas: no</string>
<string name="poi_network">Red</string>
</resources>

View file

@ -94,7 +94,7 @@ El espacio de almacenamiento usado es {1} MB.
<string name="city_type_village">Pueblo</string>
<string name="city_type_town">Ciudad pequeña</string>
<string name="city_type_city">Ciudad</string>
<string name="animate_route_off">Detener simulación</string>
<string name="animate_route_off">Parar simulación</string>
<string name="animate_route">Iniciar simulación</string>
<string name="file_can_not_be_renamed">El archivo no se puede renombrar.</string>
<string name="file_with_name_already_exists">Ya existe un archivo con ese nombre.</string>
@ -117,7 +117,7 @@ El espacio de almacenamiento usado es {1} MB.
<string name="search_position_map_view">Centro del mapa actual</string>
<string name="select_search_position">Origen:</string>
<string name="context_menu_item_search">Buscar cerca</string>
<string name="shared_string_save_as_gpx">Guardar como traza GPX</string>
<string name="shared_string_save_as_gpx">Guardar como nueva traza GPX</string>
<string name="route_successfully_saved_at">Ruta guardada correctamente como «%1$s».</string>
<string name="filename_input">Nombre de archivo: </string>
<string name="file_with_name_already_exist">Ya existe un archivo con el mismo nombre.</string>
@ -225,9 +225,9 @@ El espacio de almacenamiento usado es {1} MB.
<string name="send_location_email_pattern">Para ver la ubicación sigue el enlace del navegador %1$s o el enlace interno de Android %2$s</string>
<string name="send_location">Enviar ubicación</string>
<string name="context_menu_item_share_location">Compartir ubicación</string>
<string name="add_waypoint_dialog_added">El punto de ruta GPX «{0}» fue añadido correctamente</string>
<string name="add_waypoint_dialog_title">Añadir el punto de ruta a la traza GPX grabada</string>
<string name="context_menu_item_add_waypoint">Añadir punto de ruta GPX</string>
<string name="add_waypoint_dialog_added">El punto GPX «{0}» fue añadido correctamente</string>
<string name="add_waypoint_dialog_title">Añadir el punto de referencia a la traza GPX grabada</string>
<string name="context_menu_item_add_waypoint">Añadir punto GPX</string>
<string name="amenity_type_administrative">Administrativo</string>
<string name="amenity_type_barrier">Barrera</string>
<string name="amenity_type_education">Educación</string>
@ -237,8 +237,8 @@ El espacio de almacenamiento usado es {1} MB.
<string name="amenity_type_geocache">Geo-caché</string>
<string name="amenity_type_healthcare">Salud</string>
<string name="amenity_type_historic">Histórico</string>
<string name="amenity_type_landuse">Uso de Suelo</string>
<string name="amenity_type_leisure">Placer</string>
<string name="amenity_type_landuse">Uso del suelo</string>
<string name="amenity_type_leisure">Ocio</string>
<string name="amenity_type_man_made">Artificial</string>
<string name="amenity_type_military">Militar</string>
<string name="amenity_type_natural">Naturaleza</string>
@ -835,7 +835,7 @@ Tanto la ubicación como el tiempo de estacionamiento se muestran en el panel de
\n - Orientación del mapa opcional a la brújula o a la dirección de movimiento
\n - Indicación de carriles, mostrar límites de velocidad, voces grabadas y generadas opcionales</string>
<string name="avoid_motorway">Evitar autopistas</string>
<string name="snap_to_road_descr">Ajusta la posición a las carreteras durante la navegación</string>
<string name="snap_to_road_descr">Ajusta la posición a las carreteras durante la navegación</string>
<string name="snap_to_road">Ajustar a carreteras</string>
<string name="context_menu_item_first_intermediate_point">Añadir como primer destino intermedio</string>
<string name="context_menu_item_last_intermediate_point">Añadir como último destino intermedio</string>
@ -1040,7 +1040,7 @@ Tanto la ubicación como el tiempo de estacionamiento se muestran en el panel de
<string name="speak_cameras">Radares</string>
<string name="speak_traffic_warnings">Avisos de tráfico</string>
<string name="osb_author_dialog_password">Contraseña OSM (opcional)</string>
<string name="announce_gpx_waypoints">Puntos de ruta GPX</string>
<string name="announce_gpx_waypoints">Puntos GPX</string>
<string name="speak_title">Anunciar…</string>
<string name="speak_descr">Configura el anuncio de nombres de calles, advertencias de tráfico (paradas, badenes), advertencias de radares de velocidad, límites de velocidad</string>
<string name="speak_street_names">Nombres de calles (TTS)</string>
@ -1091,7 +1091,7 @@ Tanto la ubicación como el tiempo de estacionamiento se muestran en el panel de
<string name="animate_routing_route">Simular, utilizando la ruta calculada</string>
<string name="animate_routing_gpx">Simular, utilizando la traza GPX</string>
<string name="app_mode_hiking">Senderismo</string>
<string name="app_mode_motorcycle">Moto</string>
<string name="app_mode_motorcycle">Motocicleta</string>
<string name="app_mode_boat">Barco</string>
<string name="app_mode_aircraft">Avión</string>
<string name="local_osm_changes_delete_all_confirm">Borrará %1$d cambio(s) de OSM. ¿Está seguro?</string>
@ -1271,7 +1271,7 @@ Tanto la ubicación como el tiempo de estacionamiento se muestran en el panel de
<string name="osmo_session_token">Token de sesión: %1$s</string>
<string name="osmo_mode_restart">Reiniciar sesión OsMo</string>
<string name="osmo_settings_debug">Información de depuración</string>
<string name="import_file_favourites">"¿Guardar datos como archivo GPX o importar los puntos de ruta a Favoritos?"</string>
<string name="import_file_favourites">¿Guardar datos como archivo GPX o importar los puntos de referencia a Favoritos?</string>
<string name="osmo_follow">Seguir</string>
<string name="osmo_sign_in">Ingresar</string>
<string name="osmo_create_groups_confirm">Con el fin de crear grupos es necesario ser usuario registrado de OsMo.</string>
@ -1308,7 +1308,7 @@ Tanto la ubicación como el tiempo de estacionamiento se muestran en el panel de
<string name="shared_string_selected_lowercase">seleccionado</string>
<string name="gpx_split_interval">Intervalo de división</string>
<string name="gpx_info_subtracks">Subtrazas: %1$s</string>
<string name="gpx_info_waypoints">Puntos de ruta: %1$s</string>
<string name="gpx_info_waypoints">Puntos de referencia: %1$s</string>
<string name="gpx_info_distance">Distancia: %1$s (%2$s puntos) </string>
<string name="gpx_info_start_time">Hora inicio: %1$tF, %1$tT</string>
<string name="gpx_info_end_time">Hora fin: %1$tF, %1$tT</string>
@ -1318,7 +1318,7 @@ Tanto la ubicación como el tiempo de estacionamiento se muestran en el panel de
<string name="gpx_info_diff_altitude">Rango de altitud: %1$s</string>
<string name="gpx_info_asc_altitude">Descenso/ascenso: %1$s</string>
<string name="map_widget_plain_time">Tiempo actual</string>
<string name="gpx_wpt">Punto de ruta</string>
<string name="gpx_wpt">Punto de referencia</string>
<string name="select_destination_and_intermediate_points">Marque los destinos</string>
<string name="layer_amenity_label">Etiquetas de los puntos</string>
<string name="save_as_favorites_points">Guardar como grupo de favoritos</string>
@ -1412,7 +1412,7 @@ Tanto la ubicación como el tiempo de estacionamiento se muestran en el panel de
<string name="rendering_value_pedestrian_name">Peatón</string>
<string name="shared_string_more">Más…</string>
<string name="download_additional_maps">¿Descargar los mapas que faltan %1$s (%2$d MB)?</string>
<string name="waypoints">Puntos de ruta</string>
<string name="waypoints">Puntos de referencia</string>
<string name="targets">Destinos</string>
<string name="way_alarms">Advertencias de tráfico</string>
<string name="speak_favorites">Favoritos cercanos</string>
@ -1880,8 +1880,8 @@ Lon %2$s</string>
<string name="save_poi_without_poi_type_message">¿Realmente quieres guardar el PDI sin especificar el tipo?</string>
<string name="shared_string_location">Ubicación</string>
<string name="poi_context_menu_modify_osm_change">Modificar cambio OSM</string>
<string name="context_menu_item_delete_waypoint">¿Borrar punto de ruta GPX?</string>
<string name="context_menu_item_edit_waypoint">Editar punto de ruta GPX</string>
<string name="context_menu_item_delete_waypoint">¿Borrar punto GPX?</string>
<string name="context_menu_item_edit_waypoint">Editar punto GPX</string>
<string name="context_menu_item_open_note">Abrir nota OSM</string>
<string name="osm_edit_reopened_note">Nota OSM reabierta</string>
@ -2086,7 +2086,7 @@ El espacio de almacenamiento usado es {3} MB temporalmente y {1} MB permanenteme
<string name="open_street_map_login_and_pass">Usuario y contraseña de OpenStreetMap</string>
<string name="report">Informe</string>
<string name="no_map_markers_found">Por favor, añade marcadores a través del mapa</string>
<string name="no_waypoints_found">No se han encontrado puntos de ruta</string>
<string name="no_waypoints_found">No se han encontrado puntos de referencia</string>
<string name="file_name_containes_illegal_char">El nombre de archivo contiene caracteres ilegales</string>
<string name="map_mode">Modo del mapa</string>
<string name="number_of_gpx_files_selected_pattern">%s archivos GPX seleccionados</string>
@ -2101,7 +2101,7 @@ El espacio de almacenamiento usado es {3} MB temporalmente y {1} MB permanenteme
<string name="access_smart_autoannounce_descr">Sólo notifica cuando se cambia la dirección al punto de destino</string>
<string name="access_autoannounce_period">"Período de autoanuncio"</string>
<string name="access_autoannounce_period_descr">Intervalo mínimo de tiempo entre anuncios</string>
<string name="access_default_color">Color por defecto</string>
<string name="access_default_color">Color predefinido</string>
<string name="access_category_choice">Elegir categoría</string>
<string name="access_hint_enter_name">Introducir nombre</string>
<string name="access_hint_enter_category">Introducir categoría</string>
@ -2302,7 +2302,7 @@ El espacio de almacenamiento usado es {3} MB temporalmente y {1} MB permanenteme
<string name="quick_action_navigation_voice">Voz sí/no</string>
<string name="quick_action_navigation_voice_off">La voz está apagada</string>
<string name="quick_action_navigation_voice_on">La voz está encendida</string>
<string name="quick_action_add_gpx">Añadir punto de ruta GPX</string>
<string name="quick_action_add_gpx">Añadir punto GPX</string>
<string name="quick_action_add_parking">Añadir lugar de estacionamiento</string>
<string name="quick_action_new_action">Añadir acción</string>
<string name="quick_action_edit_action">Editar acción</string>
@ -2440,7 +2440,7 @@ Por favor proporciona un código completo</string>
<string name="do_not_send_anonymous_app_usage">No enviar estadísticas de uso anónimas de la aplicación</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd recopila información acerca de las secciones que abres en la aplicación. No recopilamos datos de ubicación, ingresos en la aplicación o datos relacionados con las áreas que visualizas, buscas o descargas.</string>
<string name="do_not_show_startup_messages">No mostrar los mensajes en el inicio</string>
<string name="do_not_show_startup_messages_desc">Muestra descuentos de la aplicación y mensajes de eventos locales</string>
<string name="do_not_show_startup_messages_desc">Oculta los descuentos de la aplicación y los mensajes especiales de eventos locales</string>
<string name="parking_options">Opciones de aparcamiento</string>
<string name="full_version_thanks">¡Gracias por comprar la versión completa de OsmAnd!</string>
<string name="routing_attr_relief_smoothness_factor_name">Seleccionar la fluctuación de elevación</string>
@ -2506,7 +2506,7 @@ Por favor proporciona un código completo</string>
<string name="change_color">Cambiar color</string>
<string name="edit_name">Editar nombre</string>
<string name="animate_my_location">Animar mi ubicación</string>
<string name="animate_my_location_desc">Activa la animación de mi ubicación durante la navegación</string>
<string name="animate_my_location_desc">Activa la ubicación panorámica animada del mapa durante la navegación</string>
<string name="shared_string_overview">Resumen</string>
<string name="osmand_plus_extended_description_part2">"Navegación GPS
\n • Funciona en línea (rápido) o sin conexión (sin cargos de roaming al viajar al extranjero)
@ -2644,9 +2644,39 @@ Por favor proporciona un código completo</string>
<string name="mappilary_no_internet_desc">Debes tener conexión a Internet para ver fotos de Mapillary</string>
<string name="retry">Reintentar</string>
<string name="add_route_point">Añadir punto de ruta</string>
<string name="add_waypoint">Añadir punto de ruta</string>
<string name="save_gpx_waypoint">Guardar punto de ruta GPX</string>
<string name="add_waypoint">Añadir punto de referencia</string>
<string name="save_gpx_waypoint">Guardar punto GPX</string>
<string name="save_route_point">Guardar punto de ruta</string>
<string name="route_point_one">Punto de ruta 1</string>
<string name="waypoint_one">Punto de ruta 1</string>
<string name="waypoint_one">Punto de referencia 1</string>
<string name="do_not_use_animations">No usar animaciones</string>
<string name="do_not_use_animations_descr">Desactiva las animaciones en la aplicación</string>
<string name="keep_showing_on_map">Mantener en el mapa</string>
<string name="exit_without_saving">¿Salir sin guardar?</string>
<string name="line">Línea</string>
<string name="save_as_route_point">Guardar como puntos de ruta</string>
<string name="save_as_line">Guardar como línea</string>
<string name="route_point">Punto de ruta</string>
<string name="edit_line">Editar línea</string>
<string name="add_point_before">Añadir punto anterior</string>
<string name="add_point_after">Añadir punto posterior</string>
<string name="shared_string_options">Opciones</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd añadirá puntos adicionales, según el tipo de navegación utilizado.</string>
<string name="measurement_tool_save_as_new_track_descr">Puede guardar los puntos, ya sea como puntos de ruta o como una línea.</string>
<string name="choose_navigation_type">Elegir tipo de navegación</string>
<string name="add_route_points">Añadir puntos de ruta</string>
<string name="add_line">Añadir línea</string>
<string name="empty_state_my_tracks">Añadir y grabar trazas</string>
<string name="empty_state_my_tracks_desc">Graba o importa trazas para visualizar</string>
<string name="empty_state_favourites">Añadir favoritos</string>
<string name="empty_state_favourites_desc">Añade favoritos al mapa o importa luego desde el sistema de archivos</string>
<string name="import_track">Importar traza</string>
<string name="import_track_desc">El archivo «%1$s» no contiene puntos de referencia, ¿Quiere importarlo como una traza?</string>
<string name="move_point">Mover punto</string>
<string name="add_segment_to_the_track">Añadir a una traza GPX</string>
<string name="move_all_to_history">Mover todo al historial</string>
<string name="build_route">Crear ruta</string>
<string name="show_direction">Mostrar dirección</string>
<string name="sort_by">Ordenar por</string>
<string name="marker_options">Opciones del marcador</string>
</resources>

View file

@ -1603,7 +1603,7 @@
<string name="poi_tents_no">Tentes interdites</string>
<string name="poi_openfire_yes">Feu autorisé</string>
<string name="poi_openfire_no">Feu interdit</string>
<string name="poi_scout_yes">Camp scout : oui</string>
<string name="poi_scout_yes">Oui</string>
<string name="poi_scout_no">Camp scout : non</string>
<string name="poi_group_only_yes">Groupe seulement : oui</string>
<string name="poi_group_only_no">Groupe seulement : non</string>
@ -2432,8 +2432,8 @@
<string name="poi_outdoor_seating_filter_yes">Oui</string>
<string name="poi_brushless_yes">Oui</string>
<string name="poi_architecture_stalinist_neoclassicism">"Architecture : néoclassicisme stalinien"</string>
<string name="poi_service_bicycle_charging_yes">Recharge de vélos : oui</string>
<string name="poi_service_bicycle_charging_no">Recharge de vélos : non</string>
<string name="poi_service_bicycle_charging_yes">Recharge: oui</string>
<string name="poi_service_bicycle_charging_no">Recharge: non</string>
<string name="poi_clothes_schoolwear">École</string>
<string name="poi_shower_filter_yes">Oui</string>
<string name="poi_social_facility_shelter">Abri</string>
@ -2964,7 +2964,7 @@
<string name="poi_lit_no">Éclairé : non</string>
<string name="poi_route_light_rail_ref">Métro léger</string>
<string name="poi_industrial_wellsite"/>
<string name="poi_industrial_wellsite">Type: puits</string>
<string name="poi_step_condition_rough">État des marches : rugueuses</string>
<string name="poi_step_condition_even">État des marches : régulières</string>
@ -3034,4 +3034,42 @@
<string name="poi_payment_ep_monedero4b_yes">Monedero 4B</string>
<string name="poi_payment_ep_monedero_yes">Monedero</string>
<string name="poi_brushless_no">Sans brosse : non</string>
<string name="poi_boat_rental_type">Location bateaux</string>
<string name="poi_toilets_access_community">Accès toilettes : communauté</string>
<string name="poi_vending_toll">Péage par automate</string>
<string name="poi_memorial_fassade_decoration">Décoration de façade</string>
<string name="poi_bridge_structure_simple_wooden">Structure de pont : Bois simple</string>
<string name="poi_bridge_structure_log">Structure du pont : rondin</string>
<string name="poi_surface_pebblestone">Surface : cailloux</string>
<string name="poi_surface_compacted">Surface : sol compacté</string>
<string name="poi_surface_grass_paver">Surface : pavés d\'herbes</string>
<string name="poi_surface_ground">Surface: terre</string>
<string name="poi_route_railway_ref">Voie de chemin de fer</string>
<string name="poi_animal_boarding_dog">Type d\'hébergement: chien</string>
<string name="poi_animal_boarding_cat">Type d\'hébergement: chat</string>
<string name="poi_animal_boarding_dog_cat">Type d\'hébergement: chien, chat</string>
<string name="poi_animal_boarding_horse">Type d\'hébergement: cheval</string>
<string name="poi_publisher">Bureau d\'édition</string>
<string name="poi_fuel_91ul">Carburant 91UL</string>
<string name="poi_fuel_100ll">Carburant 100LL</string>
<string name="poi_fuel_jeta1">Carburant Jet A-1</string>
<string name="poi_fuel_adblue">Carburant AdBlue</string>
<string name="poi_power_supply_cee_17_blue">Alimentation (prise): CEE 17 bleu</string>
<string name="poi_power_supply_cee_7_4">Alimentation (prise): CEE 7/4</string>
<string name="poi_power_supply_cee_7_5">Alimentation (prise): CEE 7/5</string>
<string name="poi_power_supply_nema_5_15">Alimentation (prise): NEMA 5-15</string>
<string name="poi_refugee_yes">Équipement pour les réfugiés</string>
<string name="poi_social_facility_group_home">Foyer de groupe</string>
<string name="poi_social_facility_assisted_living">Vie assistée</string>
<string name="poi_social_facility_outreach">Sensibilisation</string>
<string name="poi_social_facility_for_diseased">Malade</string>
<string name="poi_tomb_rock_cut">Type: coupe de roche</string>
<string name="poi_historic_civilization_ancient_roman">Civilisation: ancien romain \'753 av. JC. - 284 ap. JC.)</string>
</resources>

View file

@ -683,12 +683,11 @@ Au-delà la navigation bascule automatiquement sur le service en ligne CloudMade
<string name="online_map_settings_descr">Configurer la source de la carte en ligne ou en cache</string>
<string name="osmand_rastermaps_plugin_description">"Ce greffon permet d\'accéder à une grand nombre de cartes en ligne (aussi appelées tuiles ou cartes raster) qui vont de cartes OpenStreetMap (comme Mapnik) jusqu\'aux images satellites en passant par des cartes spécialisées comme des cartes météo, des cartes de climat, des cartes géologiques, des couches de relief, etc.
Chacune de ces cartes est utilisable soit comme carte principale soit comme sur ou sous couche d\'une autre carte. Afin de gérer au mieux la superposition des cartes, vous pouvez masquer certains éléments des cartes vectorielles hors ligne depuis le menu \"Configurer la carte\".
Les cartes tuiles peuvent être obtenues directement en ligne ou peuvent être préparées pour un usage hors ligne grâce à des outils tiers puis copiées dans le dossier de données d\'OsmAnd sous forme de base de données SQLite.
"</string>
<string name="osmand_rastermaps_plugin_description">Ce greffon permet d\'accéder à une grand nombre de cartes en ligne (aussi appelées tuiles ou cartes raster) qui vont de cartes OpenStreetMap (comme Mapnik) jusqu\'aux images satellites en passant par des cartes spécialisées comme des cartes météo, des cartes de climat, des cartes géologiques, des couches de relief, etc.
\n
\nChacune de ces cartes est utilisable, comme carte principale, sur-couche ou sous-couche d\'une autre carte. Afin de gérer au mieux la superposition des cartes, vous pouvez masquer certains éléments des cartes vectorielles hors ligne depuis le menu \"Configurer la carte\".
\n
\nLes cartes tuiles peuvent être obtenues directement en ligne ou peuvent être préparées pour un usage hors ligne grâce à des outils tiers puis copiées dans le dossier de données d\'OsmAnd sous forme de base de données SQLite.</string>
<string name="osmand_background_plugin_description">Affiche les préférences afin d\'activer le suivi et la navigation en tâche de fond (écran éteint) en réveillant périodiquement le GPS.</string>
<string name="osmand_accessibility_description">Ce greffon active dans OsmAnd les options d\'accessibilité de votre appareil (réglage de la vitesse des voix TTS, utilisation du trackball pour zoomer ou annonces vocales de votre position).</string>
@ -910,9 +909,7 @@ Mémoire proportionnelle %4$s Mo (limite Android %5$s Mo, Dalvik %6$s Mo).</stri
<string name="snap_to_road_descr">Déplacer la position sur la route pendant la navigation</string>
<string name="snap_to_road">Déplacer sur la route</string>
<string name="osmand_long_description_1000_chars">"
OsmAnd (OSM Automated Navigation Directions) OsmAnd est un logiciel libre de navigation exploitant une grande variété de données issues OpenStreetMap (OSM). Toutes les données (cartes vectorielles ou à base de tuiles) peuvent être stockées dans la mémoire du téléphone pour un usage hors-ligne. OsmAnd permet également le routage en ligne et hors-ligne avec des instructions vocales pas à pas. Fonctionnalités principales : - Fonctionne complètement hors-ligne (stockage des cartes téléchargées au format vectoriel ou tuile dans le périphérique de stockage) - Cartes hors-lignes compactes disponibles pour le monde entier - Téléchargement des cartes pour un pays ou une région directement depuis l\'application - Possibilité de superposer plusieurs couches, telles que des traces GPX ou de navigation, des points d\'intérêt (PI), des favoris, des courbes de niveau, les arrêts de transport public, et bien d\'autres cartes avec une transparence personnalisable - Recherche hors-ligne d\'adresses et de lieux (PI) - Navigation hors-ligne pour distances moyennes - Mode voiture, vélo et piéton avec : - Option de vue jour/nuit automatique - Option de zoom automatique lors des déplacements - Orientation automatique de la carte (fixe, boussole, cap) Limitations de la version gratuite de OsmAnd : - Nombre de téléchargement de cartes limité - Pas d\'accès aux points d\'intérêt Wikipédia hors-ligne. OsmAnd est activement développé et notre projet et ses progrès futurs dépendent des contributions financières pour financer le développement et le test de nouvelles fonctionnalités. Veuillez considérer l\'achat d\'OsmAnd+, le financement d\'une fonctionnalité spécifique ou une donation sur osmand.net.
"</string>
<string name="osmand_long_description_1000_chars">OsmAnd (OSM Automated Navigation Directions) OsmAnd est un logiciel libre de navigation exploitant une grande variété de données issues OpenStreetMap (OSM). Toutes les données (cartes vectorielles ou à base de tuiles) peuvent être stockées dans la mémoire du téléphone pour un usage hors-ligne. OsmAnd permet également le routage en ligne et hors-ligne avec des instructions vocales pas à pas. Fonctionnalités principales : - Fonctionne complètement hors-ligne (stockage des cartes téléchargées au format vectoriel ou tuile dans le périphérique de stockage) - Cartes hors-lignes compactes disponibles pour le monde entier - Téléchargement des cartes pour un pays ou une région directement depuis l\'application - Possibilité de superposer plusieurs couches, telles que des traces GPX ou de navigation, des points d\'intérêt (PI), des favoris, des courbes de niveau, les arrêts de transport public, et bien d\'autres cartes avec une transparence personnalisable - Recherche hors-ligne d\'adresses et de lieux (PI) - Navigation hors-ligne pour distances moyennes - Mode voiture, vélo et piéton avec : - Option de vue jour/nuit automatique - Option de zoom automatique lors des déplacements - Orientation automatique de la carte (fixe, boussole, cap) Limitations de la version gratuite de OsmAnd : - Nombre de téléchargement de cartes limité - Pas d\'accès aux points d\'intérêt Wikipédia hors-ligne. OsmAnd est activement développé et notre projet et ses progrès futurs dépendent des contributions financières pour financer le développement et le test de nouvelles fonctionnalités. Veuillez considérer l\'achat d\'OsmAnd+, le financement d\'une fonctionnalité spécifique ou une donation sur osmand.net.</string>
<string name="osmand_plus_long_description_1000_chars">"
OsmAnd+ (OSM Automated Navigation Directions)
@ -994,10 +991,9 @@ Fonctionnalités principales :
<string name="index_srtm_ele">Courbes de niveau</string>
<string name="srtm_plugin_description">"Ce greffon permet l\'affichage de courbes de niveau ainsi que du relief (ombres) qui s\'ajoutent au-dessus des cartes standards d\'OsmAnd. Ces informations sont particulièrement utiles pour les sportifs, les randonneurs, les cyclistes et d\'une manière générale par toutes les personnes qui souhaitent connaitre le relief. Les données pour les courbes de niveau et le relief sont des données supplémentaires que vous devez télécharger après avoir activé ce greffon.↵
Les données globales (entre 70 degrés Nord et 70 degrés Sud) sont basées sur des mesures de SRTM (Shuttle Radar Topography Mission) et ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), un instrument d\'imagerie embarqué à bord de Terra, le satellite phare du système d\'observation de la terre de la NASA. ASTER est un effort de coopération entre la NASA, le ministère japonais de l\'économie, du commerce et de l\'industrie (METI) et \"Japan Space Systems\" (J-Spacesystems).
"</string>
<string name="srtm_plugin_description">Ce greffon permet l\'affichage de courbes de niveau ainsi que du relief (ombres) qui s\'ajoutent au-dessus des cartes standards d\'OsmAnd. Ces informations sont particulièrement utiles pour les sportifs, les randonneurs, les cyclistes et d\'une manière générale par toutes les personnes qui souhaitent connaitre le relief. Les données pour les courbes de niveau et le relief sont des données supplémentaires que vous devez télécharger après avoir activé ce greffon.
\n
\nLes données globales (entre 70 degrés Nord et 70 degrés Sud) sont basées sur des mesures de SRTM (Shuttle Radar Topography Mission) et ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), un instrument d\'imagerie embarqué à bord de Terra, le satellite phare du système d\'observation de la terre de la NASA. ASTER est un effort de coopération entre la NASA, le ministère japonais de l\'économie, du commerce et de l\'industrie (METI) et \"Japan Space Systems\" (J-Spacesystems).</string>
<string name="srtm_plugin_name">Courbes de niveau</string>
<string name="download_select_map_types">Autres cartes</string>
<string name="download_srtm_maps">Courbes de niveau</string>
@ -1011,10 +1007,9 @@ Les données globales (entre 70 degrés Nord et 70 degrés Sud) sont basées sur
<string name="audionotes_plugin_name">Notes audio/vidéo</string>
<string name="osmand_srtm_short_description_80_chars">Greffon OsmAnd pour les courbes de niveau hors-ligne</string>
<string name="osmand_srtm_long_description_1000_chars">"Ce greffon permet l\'affichage de courbes de niveau ainsi que du relief (ombres) qui s\'ajoutent au-dessus des cartes standard d\'OsmAnd. Ces informations sont particulièrement utiles pour les sportifs, les randonneurs, les cyclistes et d\'une manière générale par toutes les personnes qui souhaitent connaitre le relief.
Les données globales (entre 70 degrés Nord et 70 degrés Sud) sont basées sur des mesures SRTM (Shuttle Radar Topography Mission) et ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), des instruments d\'imagerie embarqués à bord de Terra, le satellite phare du système d\'observation de la terre de la NASA. ASTER est un effort de coopération entre la NASA, le ministère japonais de l\'économie, du commerce et de l\'industrie (METI) et \"Japan Space Systems\" (J-Spacesystems).
"</string>
<string name="osmand_srtm_long_description_1000_chars">Ce greffon permet l\'affichage de courbes de niveau ainsi que du relief (ombres) qui s\'ajoutent au-dessus des cartes standard d\'OsmAnd. Ces informations sont particulièrement utiles pour les sportifs, les randonneurs, les cyclistes et d\'une manière générale par toutes les personnes qui souhaitent connaitre le relief.
\n
\nLes données globales (entre 70 degrés Nord et 70 degrés Sud) sont basées sur des mesures SRTM (Shuttle Radar Topography Mission) et ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), des instruments d\'imagerie embarqués à bord de Terra, le satellite phare du système d\'observation de la terre de la NASA. ASTER est un effort de coopération entre la NASA, le ministère japonais de l\'économie, du commerce et de l\'industrie (METI) et \"Japan Space Systems\" (J-Spacesystems).</string>
<string name="map_widget_distancemeasurement">Mesure de distance</string>
@ -1134,12 +1129,9 @@ Les données globales (entre 70 degrés Nord et 70 degrés Sud) sont basées sur
<string name="delete_point">Supprimer le point de mesure</string>
<string name="plugin_distance_point">Point</string>
<string name="use_distance_measurement_help">* Ajouter un point : appui bref sur la carte
* Supprimer le dernier point : appui long sur la carte
* Ajouter ou modifier une description : appui long sur le point
* Autres actions : appui sur le gadget de mesure.</string>
\n* Supprimer le dernier point : appui long sur la carte
\n* Ajouter ou modifier la description d\'un point : appui long sur le point
\n* Autres actions : utilisez le gadget de mesure.</string>
<string name="distance_measurement_finish_subtrack">Ajouter une nouvelle mesure</string>
<string name="distance_measurement_clear_route">Supprimer la mesure</string>
<string name="shared_string_downloading">Téléchargement en cours</string>
@ -1487,7 +1479,7 @@ Les données globales (entre 70 degrés Nord et 70 degrés Sud) sont basées sur
<string name="sort_by_distance">Trier par distance</string>
<string name="sort_by_name">Trier par nom</string>
<string name="no_index_file_to_download">Aucun téléchargement trouvé, veuillez vérifier votre connexion Internet.</string>
<string name="none_selected_gpx">Aucun fichier GPX sélectionné. Pour sélectionner, presser longuement sur une trace disponible.</string>
<string name="none_selected_gpx">Aucun fichier GPX sélectionné. Pour sélectionner un fichier, pressez longuement sur une trace disponible.</string>
<string name="local_index_select_gpx_file">Sélectionnez pour afficher</string>
<string name="osmo_group_information_desc">- Créez un groupe : donnez-lui un nom et indiquez une description
@ -1590,10 +1582,9 @@ Voulez-vous effectuer à une nouvelle inscription ?</string>
<string name="speak_poi">Points d\'intérêt proches</string>
<string name="shared_string_all">Tout</string>
<string name="index_tours">Tours</string>
<string name="record_plugin_description">"Ce greffon permet d\'enregistrer vos itinéraires dans un fichier au format GPX : soit automatiquement soit manuellement grâce à un bouton supplémentaire affiché sur la carte.
Les traces ainsi enregistrées peuvent être partagées avec vos amis ou utilisées pour contribuer à OSM. Les sportifs peuvent utiliser ces enregistrements pour leurs entraînements. Certaines analyses des traces peuvent être réalisées directement dans OmsAnd (comme la vitesse moyenne, la durée de l\'itinéraire, etc.). Enfin les fichiers GPX locaux peuvent être exportés pour être utilisés par d\'autres applications.
"</string>
<string name="record_plugin_description">Ce greffon permet d\'enregistrer vos itinéraires dans un fichier au format GPX : soit automatiquement soit manuellement grâce à un bouton supplémentaire affiché sur la carte.
\n
\nLes traces ainsi enregistrées peuvent être partagées avec vos amis ou utilisées pour contribuer à OSM. Les sportifs peuvent utiliser ces enregistrements pour leurs entraînements. Certaines analyses des traces peuvent être réalisées directement dans OmsAnd (comme la vitesse moyenne, la durée de l\'itinéraire, etc.). Enfin les fichiers GPX locaux peuvent être exportés pour être utilisés par d\'autres applications.</string>
<string name="record_plugin_name">Enregistrement d\'itinéraire</string>
<string name="int_hour">h</string>
<string name="duration">Durée</string>
@ -1698,7 +1689,7 @@ Les traces ainsi enregistrées peuvent être partagées avec vos amis ou utilis
<string name="speak_pedestrian">Passages piétons</string>
<string name="avoid_roads_msg">Vous pouvez générer un itinéraire alternatif en sélectionnant les routes à éviter.</string>
<string name="navigation_over_track">Démarrer la navigation sur cette trace ?</string>
<string name="navigation_over_track">Démarrer la navigation en suivant cette trace ?</string>
<string name="save_track_to_gpx_globally_headline">Enregistrement de traces à la demande</string>
<string name="proxy_pref_title">Proxy</string>
@ -1734,7 +1725,7 @@ Les traces ainsi enregistrées peuvent être partagées avec vos amis ou utilis
<string name="world_ski_missing">Pour afficher les pistes de ski, une carte hors ligne doit être téléchargée.</string>
<string name="nautical_maps_missing">Pour afficher les cartes marines, une carte hors ligne doit être téléchargée.</string>
<string name="rendering_attr_pisteGrooming_name">Damage des pistes</string>
<string name="free">"%1$s libre "</string>
<string name="free">%1$s libre</string>
<string name="device_memory">Mémoire de l\'appareil</string>
<string name="notes">Notes</string>
<string name="online_map">Carte en ligne</string>
@ -1747,27 +1738,26 @@ Les traces ainsi enregistrées peuvent être partagées avec vos amis ou utilis
<string name="share_note">Partager la note</string>
<string name="shared_string_export">Exporter</string>
<string name="plugin_ski_descr">"Ce greffon affiche le relief en conditions hivernales, ainsi que les pistes de ski (dont la difficulté est représentée par un code couleurs) et les remontées mécaniques.
Cet affichage peut être annulé soit en le désactivant ici, soit en modifiant le Style de la carte dans \"Configurer la carte\".
"</string>
<string name="plugin_touringview_descr">"Activer cette vue bascule vers le style d\'affichage \"Grand tourisme\", affichant une carte très détaillée adaptée aux voyageurs et chauffeurs routiers.
Cet affichage, quel que soit le niveau de zoom, fournit le maximum de détails disponibles. Chaque type de voie (routes, pistes, chemins …) est distingué de manière explicite grâce à des codes couleurs, ce qui est particulièrement utile en cas de conduite de grands véhicules. Il existe aussi des options pour l\'affichage des itinéraires cyclables ou des chemins de randonnée.
Il n\'est pas nécessaire de télécharger une carte supplémentaire, cet affichage s\'appuyant sur les cartes standards.
Cet affichage peut être annulé soit en le désactivant ici, soit en modifiant le Style de la carte dans \"Configurer la carte\".
"</string>
<string name="plugin_ski_descr">Ce greffon pour OsmAnd affiche le relief en conditions hivernales, ainsi que les pistes de ski (dont la difficulté est représentée par un code couleurs) et les remontées mécaniques.
\n
\nL\'activation de cette vue change le style de carte en \"Hiver et ski\", en affichant toutes les caractéristiques du paysage en condition neigeuse. Cet affichage peut être annulé soit en le désactivant ici, soit en modifiant le Style de la carte dans \"Configurer la carte\".</string>
<string name="plugin_touringview_descr">Activer cette vue bascule vers le style d\'affichage \"Grand tourisme\", affichant une carte très détaillée adaptée aux voyageurs et chauffeurs routiers.
\n
\nCet affichage, quel que soit le niveau de zoom, fournit le maximum de détails disponibles.
\n
\nChaque type de voie (routes, pistes, chemins …) est distingué de manière explicite grâce à des codes couleurs, ce qui est particulièrement utile en cas de conduite de grands véhicules.
\n
\nIl existe aussi des options pour l\'affichage des itinéraires cyclables ou des chemins de randonnée.
\n
\nIl n\'est pas nécessaire de télécharger une carte supplémentaire, cet affichage s\'appuyant sur les cartes standards.
\n
\nCet affichage peut être annulé soit en le désactivant ici, soit en modifiant le Style de la carte dans \"Configurer la carte\".</string>
<string name="plugin_touringview_name">Grand tourisme</string>
<string name="plugin_nautical_descr">"Ce greffon enrichit la carte OsmAnd ainsi que l\'application de navigation afin d\'afficher des cartes marines pour la navigation de plaisance, la voile et tous les sports nautiques.
Ce greffon OsmAnd affichera les marques nautiques et symboles graphiques utiles à la navigation aussi bien sur terre que le long des côtes. Chaque marque de navigation est détaillée afin de permettre son identification et de connaître sa signification (catégorie, forme, couleur, fréquence, référence, etc.).
Pour revenir à lun des styles de carte classique de OsmAnd, désactivez simplement ce greffon ou modifiez le « Style de carte » dans le menu « Configurer la carte ».
"</string>
<string name="plugin_nautical_descr">Ce greffon enrichit la carte OsmAnd ainsi que l\'application de navigation afin d\'afficher des cartes marines pour la navigation de plaisance, la voile et tous les sports nautiques.
\n
\nCe greffon OsmAnd affichera les marques nautiques et symboles graphiques utiles à la navigation aussi bien sur terre que le long des côtes. Chaque marque de navigation est détaillée afin de permettre son identification et de connaître sa signification (catégorie, forme, couleur, fréquence, référence, etc.).
\n
\nPour revenir à lun des styles de carte classique de OsmAnd, désactivez simplement ce greffon ou modifiez le « Style de carte » dans le menu « Configurer la carte ».</string>
<string name="location_on_map">Position :\n Lat. %1$s\n Lon. %2$s</string>
<string name="days_behind">jours passés</string>
<string name="rename_failed">Échec du renommage.</string>
@ -2651,42 +2641,34 @@ représentant la zone : %1$s x %2$s</string>
<string name="parking_options">Choix de stationnement</string>
<string name="do_not_send_anonymous_app_usage">N\'envoyer aucune information d\'usage sur les applications (même anonymes)</string>
<string name="do_not_show_startup_messages">N\'afficher aucun message au démarrage</string>
<string name="do_not_show_startup_messages_desc">Ces messages concernent les offres spéciales d\'achat d\'applications</string>
<string name="do_not_show_startup_messages_desc">Retire les messages promotionnels et les annonces locales</string>
<string name="right_side_navigation">Conduite à droite</string>
<string name="driving_region_automatic">Automatique</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd collecte des informations sur les écrans affichés lors de l\'utilisation de l\'application. Votre position n\'est jamais collectée, ni aucune des données saisies par l\'utilisateur dans l\'application comme les zones affichées, les recherches ou les téléchargements réalisés.</string>
<string name="osmand_extended_description_part1">"
OsmAnd (OSM Automated Navigation Directions) est une application de visualisation de cartes et de navigation utilisant les données gratuites couvrant le monde entier du projet OpenStreetMap (OSM).
Profitez d\'un guidage vocal comme visuel; Découvrez des points d\'intérêt; Créez et gérez des traces GPX; Installez des greffons pour visualiser l\'altitude et les courbes de niveaux; Utilisez les modes Conduite, Piéton, Cycliste; Contribuez à l\'amélioration des cartes OSM et bien plus encore !
"</string>
<string name="osmand_extended_description_part1">OsmAnd (OSM Automated Navigation Directions) est une application de visualisation de cartes et de navigation utilisant les données gratuites couvrant le monde entier du projet OpenStreetMap (OSM). Profitez d\'un guidage vocal comme visuel; Découvrez des points d\'intérêt; Créez et gérez des traces GPX; Installez des greffons pour visualiser l\'altitude et les courbes de niveaux; Utilisez les modes Conduite, Piéton, Cycliste; Contribuez à l\'amélioration des cartes OSM et bien plus encore !</string>
<string name="osmand_extended_description_part4">Le greffon OsmAnd ski maps permet de visualiser les pistes de ski avec leur niveau de difficulté et d\'autres informations utiles comme l\'emplacement et le type des remontées mécaniques.</string>
<string name="osmand_extended_description_part7">"
Contribuez à OpenStreetMap (OSM)
• Signalez des anomalies
• Envoyez des traces GPX vers OSM directement depuis l\'application
• Ajoutez des Points d\'Intérêt et envoyez-les vers OSM (immédiatement ou plus tard si vous êtes hors-ligne)
"</string>
<string name="osmand_plus_extended_description_part8">" Couverture et qualité des cartes (de 1 à 4 étoiles)
\n • Europe de l\'Ouest : **** (4)
\n • Europe de l\'Est : *** (3)
\n • Russie : *** (3)
\n • Amérique du Nord : *** (3)
\n • Amérique du Sud : ** (2)
\n • Asie : ** (2)
\n • Japon et Corée : *** (3)
\n • Moyen-Orient : ** (2)
\n • Afrique : ** (2)
\n • Antarctique : * (1)
\n La grande majorité des pays sont couverts de l\'Afghanistan au Zimbabwe, téléchargez les cartes dont vous avez besoin ! "</string>
<string name="osmand_extended_description_part7">Contribuez à OpenStreetMap (OSM)
\n • Signalez des anomalies
\n • Envoyez des traces GPX vers OSM directement depuis l\'application
\n • Ajoutez des Points d\'Intérêt et envoyez-les vers OSM (immédiatement ou plus tard si vous êtes hors-ligne)</string>
<string name="osmand_plus_extended_description_part8">Couverture et qualité des cartes (de 1 à 4 étoiles)
\n • Europe de l\'Ouest : **** (4)
\n • Europe de l\'Est : *** (3)
\n • Russie : *** (3)
\n • Amérique du Nord : *** (3)
\n • Amérique du Sud : ** (2)
\n • Asie : ** (2)
\n • Japon et Corée : *** (3)
\n • Moyen-Orient : ** (2)
\n • Afrique : ** (2)
\n • Antarctique : * (1)
\n La grande majorité des pays sont couverts de l\'Afghanistan au Zimbabwe, téléchargez les cartes dont vous avez besoin !</string>
<string name="fonts_header">Polices pour les textes de la carte</string>
<string name="osmand_plus_extended_description_part5">"
Fonctionnalités liées à la sécurité
• Bascule automatique en mode jour / nuit (option)
• Affichage des limitations de vitesse avec rappels en cas de dépassement (option)
• Zoom adapté à la vitesse (option)
• Partage de votre position pour que n\'importe qui puisse vous rejoindre rapidement
"</string>
<string name="osmand_plus_extended_description_part5">Fonctions liées à la sécurité
\n • Bascule automatique en mode jour / nuit (option)
\n • Affichage des limitations de vitesse avec rappels en cas de dépassement (option)
\n • Zoom adapté à la vitesse (option)
\n • Partage de votre position afin qu\'on puisse vous rejoindre rapidement</string>
<string name="restore_purchases">Restaurer vos achats</string>
<string name="shared_string_visible">Visible</string>
<string name="osmand_plus_extended_description_part7">"
@ -2738,15 +2720,13 @@ Fonctionnalités principales :
<string name="shared_string_overview">Vue d\'ensemble</string>
<string name="animate_my_location_desc">Activer l\'animation de votre position pendant la navigation</string>
<string name="animate_my_location">Animer ma position</string>
<string name="osmand_plus_extended_description_part6">"
Fonctionnalités adaptées aux cyclistes et piétons
• Affichage des itinéraires piétons et des circuits de randonnée ou encore des pistes cyclables; idéal pour les activités de plein air
• Modes de guidage adaptés aux cyclistes et piétons
• Affichage des arrêts de transports publics (bus, tram, train) avec identification des lignes (option)
• Enregistrement GPX du trajet en local ou en ligne (option)
• Affichage de la vitesse et de l\'altitude (option)
• Affichage des courbes de niveaux et ombrage du relief (nécessite un greffon additionnel)
"</string>
<string name="osmand_plus_extended_description_part6">Fonctions adaptées aux cyclistes et piétons
\n • Affichage des itinéraires piétons et des circuits de randonnée ou encore des pistes cyclables; idéal pour les activités de plein air
\n • Modes de guidage adaptés aux cyclistes et piétons
\n • Affichage des arrêts de transports publics (bus, tram, train) avec identification des lignes (option)
\n • Enregistrement GPX du trajet en local ou en ligne (option)
\n • Affichage de la vitesse et de l\'altitude (option)
\n • Affichage des courbes de niveaux et ombrage du relief (nécessite un greffon additionnel)</string>
<string name="favorite_group_name">Nom du groupe</string>
<string name="change_color">Modifier la couleur</string>
<string name="edit_name">Modifier le nom</string>
@ -2774,37 +2754,31 @@ Fonctionnalités principales :
<string name="increase_search_radius">Augmenter le rayon de recherche</string>
<string name="nothing_found_descr">Modifiez la requête ou augmentez le rayon de recherche</string>
<string name="private_access_routing_req">Votre destination se situe dans une zone privée. Souhaitez-vous autoriser l\'accès aux zones privées pour cet itinéraire ?</string>
<string name="osmand_extended_description_part2">"
Navigation GPS
• Vous pouvez naviguer en mode hors connexion (sans aucun frais de communication) ou en mode connecté
• Guidage vocal pas-à-pas (voix enregistrées ou de synthèse)
• L\'itinéraire est recalculé si vous vous en écartez
• Indication des voies, des noms de rues et estimation de l\'horaire d\'arrivée faciliteront votre trajet
• Pour rendre votre voyage plus sûr, le mode jour/nuit s\'active automatiquement
• Vous pouvez choisir d\'afficher les limitations de vitesse et d\'être averti en cas de dépassement
• Le niveau de zoom de la carte s\'adapte à votre vitesse
• Vous pouvez rechercher des destination par adresse, type (par exemple : parking, restaurant, hôtel, station service, musée) ou par coordonnées géographiques
• Possibilité d\'ajouter des points de passage à votre itinéraire
• Vous pouvez enregistrer votre itinéraire au format GPX ou suivre une trace GPX existante
"</string>
<string name="osmand_extended_description_part3">"
Carte
• Affichage des points dintérêt autour de vous
• Orientation de la carte selon votre direction de déplacement (ou selon la boussole)
• Indication de votre position et de votre orientation
• Partagez votre position pour que vos proches puissent vous trouver
• Enregistrez vos endroits préférés comme Favoris
• Sélectionnez les noms affichés sur la carte : en anglais, noms locaux ou phonétique
• Affichez des tuiles en lignes spécialisées, la vue satellite (source Bing), un itinéraires GPX et bien d\'autres couches avec transparence personnalisée
"</string>
<string name="osmand_extended_description_part5">"
Cyclisme
• Trouvez les pistes cyclables sur la carte
• Le guidage GPS en mode vélo calcule votre itinéraire en empruntant les pistes cyclables
• Affichage de votre vitesse et de votre altitude
• Enregistrement GPX optionnel pour enregistrer et partager votre itinéraire
• Un greffon additionnel permet d\'afficher les courbes de niveaux et les ombres du relief
"</string>
<string name="osmand_extended_description_part2">Navigation GPS
\n • Vous pouvez naviguer en mode hors connexion (sans aucun frais de communication) ou en mode connecté
\n • Guidage vocal pas-à-pas (voix enregistrées ou de synthèse)
\n • L\'itinéraire est recalculé si vous vous en écartez
\n • Indication des voies, des noms de rues et estimation de l\'horaire d\'arrivée faciliteront votre trajet
\n • Pour rendre votre voyage plus sûr, le mode jour/nuit s\'active automatiquement
\n • Vous pouvez choisir d\'afficher les limitations de vitesse et d\'être averti en cas de dépassement
\n • Le niveau de zoom de la carte s\'adapte à votre vitesse
\n • Vous pouvez rechercher des destination par adresse, type (par exemple : parking, restaurant, hôtel, station service, musée) ou par coordonnées géographiques
\n • Possibilité d\'ajouter des points de passage à votre itinéraire
\n • Vous pouvez enregistrer votre itinéraire au format GPX ou suivre une trace GPX existante</string>
<string name="osmand_extended_description_part3">Carte
\n • Affichage des points dintérêt autour de vous
\n • Orientation de la carte selon votre direction de déplacement (ou selon la boussole)
\n • Indication de votre position et de votre orientation
\n • Partagez votre position pour que vos proches puissent vous trouver
\n • Enregistrez vos endroits préférés comme Favoris
\n • Sélectionnez les noms affichés sur la carte : en anglais, noms locaux ou phonétique
\n • Affichez des tuiles en lignes spécialisées, la vue satellite (source Bing), un itinéraires GPX et bien d\'autres couches avec transparence personnalisée</string>
<string name="osmand_extended_description_part5">Cyclisme
\n • Trouvez les pistes cyclables sur la carte
\n • Le guidage GPS en mode vélo calcule votre itinéraire en empruntant les pistes cyclables
\n • Affichage de votre vitesse et de votre altitude
\n • Enregistrement GPX optionnel pour enregistrer et partager votre itinéraire
\n • Un greffon additionnel permet d\'afficher les courbes de niveaux et les ombres du relief</string>
<string name="shared_string_add_photos">Ajouter des photos</string>
<string name="online_photos">Photos en ligne</string>
<string name="no_photos_descr">Aucune photo pour ce lieu</string>
@ -2902,4 +2876,19 @@ Fonctionnalités principales :
<string name="import_track_desc">Le fichier %1$s ne contient aucune étape, l\'importer comme trace ?</string>
<string name="move_point">Déplacer le point</string>
<string name="add_segment_to_the_track">Ajouter à une trace GPX</string>
</resources>
<string name="keep_showing_on_map">Toujours afficher sur la carte</string>
<string name="exit_without_saving">Quitter sans enregistrer ?</string>
<string name="do_not_use_animations">Ne pas utiliser les animations</string>
<string name="do_not_use_animations_descr">Désactive les animations dans l\'application</string>
<string name="osmand_extended_description_part6">Marche, randonnée, visite guidée
\n• Carte des sentiers pédestres et de randonnée
\n• Articles Wikipedia dans la langue de votre choix pour découvrir les lieux visités
\n• Arrêts de transports publics (bus, tram, train), incluant les noms de lignes, pour vous aider dans vos déplacements en ville
\n• Guidage de navigation piéton en suivant les itinéraires piétons
\n• Vous pouvez charger et suivre une trace GPX existante; enregistrer et partager un nouvel itinéraire GPX</string>
<string name="move_all_to_history">Déplacer tout dans l\'historique</string>
<string name="build_route">Calculer l\'itinéraire</string>
<string name="show_direction">Afficher les indications de direction</string>
<string name="sort_by">Trier par</string>
<string name="marker_options">Options de la marque</string>
</resources>

View file

@ -71,7 +71,7 @@ La memoria utilizzata è {1} MB.
<string name="auto_follow_route_navigation_descr">Centra automaticamente la visione della mappa solo durante la navigazione.</string>
<string name="auto_follow_location_enabled">Visualizzazione mappa centrata automaticamente.</string>
<string name="pref_vector_rendering">Opzioni specifiche per la rappresentazione vettoriale</string>
<string name="pref_overlay">Sovrapposizione / sfondo</string>
<string name="pref_overlay">Sovrapposizione / sfondo</string>
<string name="pref_raster_map">Impostazioni della fonte mappa</string>
<string name="pref_vector_map">Impostazioni della mappa vettoriale</string>
<string name="delete_confirmation_msg">Eliminare %1$s?</string>
@ -856,18 +856,18 @@ Memoria in proporzione %4$s MB (limite di Android %5$s MB, Dalvik %6$s MB).</str
<string name="show_lanes">Corsie</string>
<string name="avoid_unpaved">Evita le strade non asfaltate</string>
<string name="avoid_ferries">Evita i traghetti</string>
<string name="avoid_in_routing_title">Evita…</string>
<string name="avoid_in_routing_title">Evita…</string>
<string name="avoid_in_routing_descr">Evita strade a pagamento, sterrate, traghetti</string>
<string name="show_warnings_title">Mostra avvisi…</string>
<string name="show_warnings_descr">Configura gli avvisi sul traffico (limiti velocità, fermate forzate, dossi rallentatori), avvisi autovelox e indicazioni di corsia</string>
<string name="map_widget_fluorescent">Itinerari fluorescenti</string>
<string name="map_widget_show_ruler">Righello</string>
<string name="map_widget_view_direction">Direzione della visuale</string>
<string name="map_widget_view_direction">Direzione della visuale</string>
<string name="map_widget_transparent">Widget trasparenti</string>
<string name="gps_wakeup_interval">Intervallo di risveglio GPS: %s</string>
<string name="gps_wakeup_interval">Intervallo di risveglio GPS: %s</string>
<string name="int_continuosly">Continuo</string>
<string name="email">e-mail</string>
@ -2689,7 +2689,7 @@ Rappresenta l\'area: %1$s x %2$s</string>
<string name="do_not_send_anonymous_app_usage">Non inviare statistiche anonime sull\'utilizzo dell\'app</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd raccoglie informazioni su quale parti dell\'applicazione tu utilizzi. La tua geolocalizzazione non viene mai inviata, nemmeno qualsiasi dato che tu immetti nell\'app o dettagli sulle aree che visualizzi cerchi o scarichi.</string>
<string name="do_not_show_startup_messages">Non mostrare alcun messaggio all\'avvio</string>
<string name="do_not_show_startup_messages_desc">Mostra messaggi riguardo app in sconto ed eventi locali speciali</string>
<string name="do_not_show_startup_messages_desc">Elimina messaggi riguardo sconti dell\'app ed eventi speciali locali</string>
<string name="parking_options">Opzioni parcheggio</string>
<string name="full_version_thanks">Grazie per avere acquistato la versione completa di OsmAnd!</string>
<string name="fonts_header">Caratteri della mappa</string>
@ -2885,4 +2885,16 @@ Copertura e qualità approssimativamente:
<string name="measurement_tool_snap_to_road_descr">OsmAnd aggiungerà dei punti, in base al tipo di navigazione.</string>
<string name="measurement_tool_save_as_new_track_descr">Puoi salvare i punti sia come punti di un percorso che come linea.</string>
<string name="choose_navigation_type">Scegli la modalità di navigazione</string>
<string name="exit_without_saving">Uscire senza salvare?</string>
<string name="do_not_use_animations">Non utilizzare le animazioni</string>
<string name="do_not_use_animations_descr">Disabilita le animazioni nell\'app</string>
<string name="keep_showing_on_map">Mantieni visualizzato nella mappa</string>
<string name="live_monitoring_max_interval_to_send">Tempo tampone per il tracciamento online</string>
<string name="live_monitoring_max_interval_to_send_desrc">Specifica un tempo della memoria tampone per memorizzare le localizzazioni quando non c\'è connessione</string>
<string name="retry">Riprova</string>
<string name="add_route_points">Aggiungi nuovi punti al percorso</string>
<string name="add_line">Aggiungi una linea</string>
<string name="save_route_point">Salva il Punto Percorso</string>
<string name="route_point_one">Punto Percorso 1</string>
<string name="empty_state_my_tracks">Aggiungi e registra Tracce</string>
</resources>

View file

@ -1872,7 +1872,7 @@
<string name="gpx_no_tracks_title_folder">Legg til spor i mappen</string>
<string name="gpx_add_track">Legg til spor</string>
<string name="trip_rec_notification_settings">Turopptak (ingen data)</string>
<string name="trip_rec_notification_settings_desc">Vis merknader som lar deg starte en tur ved å trykke opptaksknappen</string>
<string name="trip_rec_notification_settings_desc">Vis et systemvarsel slik at du kan starte turopptak</string>
<string name="save_track_min_speed">Minimumshastighet for logging</string>
<string name="save_track_min_speed_descr">Filter: Still inn minimumshastighet for at et punkt skal logges</string>
<string name="save_track_min_distance">Logging ved bevegelsesoppdagelse</string>
@ -2322,9 +2322,9 @@ Representerer området: %1$s x %2$s</string>
<string name="add_point_before">Legg til punkt før</string>
<string name="add_point_after">Legg til punkt etter</string>
<string name="shared_string_options">Alternativer</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd vil legge til flere punkter, avhengig av navigeringstypen.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd vil forbinde punktene med ruter for den valgte profilen.</string>
<string name="measurement_tool_save_as_new_track_descr">Lagre punktene enten som rutepunkter eller som en linje.</string>
<string name="choose_navigation_type">Velg navigeringstype</string>
<string name="choose_navigation_type">Velg navigeringsprofil</string>
<string name="empty_state_my_tracks">Legg til og ta opp spor</string>
<string name="empty_state_my_tracks_desc">Ta opp eller importer spor som skal vises</string>
<string name="empty_state_favourites">Legg til favoritter</string>
@ -2335,4 +2335,38 @@ Representerer området: %1$s x %2$s</string>
<string name="add_segment_to_the_track">Legg til i et GPX-spor</string>
<string name="add_route_points">Legg til rutepunkter</string>
<string name="add_line">Legg til linje</string>
<string name="do_not_use_animations">Ikke bruk animasjoner</string>
<string name="do_not_use_animations_descr">Slår av animasjoner i programmet</string>
<string name="keep_showing_on_map">Fortsett å vise på kartet</string>
<string name="exit_without_saving">Avslutte uten å lagre?</string>
<string name="mapillary_menu_descr_username">Vis bilder lagt til av en gitt bruker.</string>
<string name="mapillary_image">Mapillary-bilde</string>
<string name="open_mapillary">Åpne Mapillary</string>
<string name="shared_string_install">Installer</string>
<string name="improve_coverage_mapillary">Forbedre billeddekningen med Mapillary</string>
<string name="online_photos">Nettbaserte bilder</string>
<string name="shared_string_add_photos">Legg til bilder</string>
<string name="no_photos_descr">Vi har ingen bilder fra dette stedet</string>
<string name="mapillary_action_descr">Bidra med dine egne visninger på gatenivå fra denne plasseringen via Mapillary.</string>
<string name="mapillary_widget">Mapillary-miniprogram</string>
<string name="mapillary_widget_descr">Lar deg bidra raskt til Mapillary</string>
<string name="mapillary_descr">Nettbaserte bilder på gatenivå for alle. Oppdag steder, samarbeid, fang inn verden.</string>
<string name="mapillary">Mapillary</string>
<string name="nautical_maps">Sjøkart</string>
<string name="restore_purchases">Gjenopprett kjøp</string>
<string name="do_not_send_anonymous_app_usage">Ikke send anonym bruksstatistikk</string>
<string name="parking_options">Parkeringsalternativer</string>
<string name="full_version_thanks">Takk for at du kjøpte fullversjonen av OsmAnd!</string>
<string name="routing_attr_driving_style_speed_name">Kortere ruter</string>
<string name="routing_attr_driving_style_balance_name">Balansert</string>
<string name="track_points_category_name">Fremtredende punkter på denne ruten</string>
<string name="shared_string_time_moving">Tid i bevegelse</string>
<string name="shared_string_time_span">Varighet</string>
<string name="shared_string_max">Maks.</string>
<string name="routing_attr_relief_smoothness_factor_name">Velg høydesvingninger</string>
<string name="move_all_to_history">Flytt alle til historikk</string>
<string name="build_route">Lag rute</string>
<string name="show_direction">Vis retning</string>
<string name="sort_by">Sorter etter</string>
<string name="marker_options">Markøralternativer</string>
</resources>

View file

@ -3504,4 +3504,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Kanadyjki: tak</string>
<string name="poi_boat_canoe_rental_rental_no">Kanadyjki: nie</string>
<string name="poi_network">Sieć</string>
</resources>

View file

@ -2644,7 +2644,7 @@ Reprezentuje obszar: %1$s x %2$s</string>
<string name="do_not_send_anonymous_app_usage">Nie wysyłaj anonimowych statystyk użytkowania</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd zbiera informacje o tym, z których części aplikacji korzysta użytkownik. Twoja lokalizacja nie jest nigdy wysyłana, tak jak teksty wpisywane w aplikacji i szczegóły dotyczące przeglądanych, wyszukiwanych i pobieranych obszarów.</string>
<string name="do_not_show_startup_messages">Nie pokazuj wiadomości przy starcie</string>
<string name="do_not_show_startup_messages_desc">Wyświetla wiadomości dotyczące rabatów i specjalnych wydarzeń lokalnych</string>
<string name="do_not_show_startup_messages_desc">Wyłączenie wyświetlania rabatów na program i wiadomości specjalnych o wydarzeniach lokalnych</string>
<string name="parking_options">Opcje parkowania</string>
<string name="full_version_thanks">Dziękujemy za zakup pełnej wersji OsmAnd!</string>
<string name="right_side_navigation">Ruch prawostronny</string>
@ -2816,11 +2816,11 @@ Reprezentuje obszar: %1$s x %2$s</string>
<string name="route_point">Punkt trasy</string>
<string name="shared_string_options">Opcje</string>
<string name="measurement_tool_save_as_new_track_descr">Można zapisać punkty jako punkty trasy lub linię.</string>
<string name="choose_navigation_type">Proszę wybrać rodzaj nawigacji</string>
<string name="choose_navigation_type">Wybierz profil nawigacji</string>
<string name="edit_line">Zmodyfikuj linię</string>
<string name="add_point_before">Dodaj punkt wcześniej</string>
<string name="add_point_after">Dodaj punkt dalej</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd doda dalsze punkty w zależności od rodzaju nawigacji.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd połączy punkty z drogami w zaznaczonym profilu.</string>
<string name="add_route_points">Dodaj punkty trasy</string>
<string name="add_line">Dodaj linię</string>
<string name="empty_state_my_tracks">Dodaj i nagraj ślady</string>
@ -2831,4 +2831,13 @@ Reprezentuje obszar: %1$s x %2$s</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>
<string name="add_segment_to_the_track">Dodaj do śladu GPX</string>
</resources>
<string name="keep_showing_on_map">Wciąż wyświetlaj na mapie</string>
<string name="exit_without_saving">Czy wyjść bez zapisywania?</string>
<string name="do_not_use_animations">Wyłącz animacje</string>
<string name="do_not_use_animations_descr">Wyłącza animacje w programie</string>
<string name="move_all_to_history">Przenieś wszystkie do historii</string>
<string name="build_route">Oblicz trasę</string>
<string name="show_direction">Pokaż kierunek</string>
<string name="sort_by">Sortuj według</string>
<string name="marker_options">Opcje znacznika</string>
</resources>

View file

@ -5,7 +5,7 @@
<string name="restart_search">Искать снова</string>
<string name="increase_search_radius">Увеличить радиус поиска</string>
<string name="nothing_found">Ничего не найдено :(</string>
<string name="nothing_found_descr">Попробуйте изменить запрос или увеличить радиус поиска</string>
<string name="nothing_found_descr">Изменить запрос или увеличить радиус поиска</string>
<string name="quick_action_showhide_osmbugs_title">Показать/скрыть заметки OSM</string>
<string name="quick_action_osmbugs_show">Показать заметки OSM</string>
<string name="quick_action_osmbugs_hide">Скрыть заметки OSM</string>
@ -2401,10 +2401,10 @@
<string name="mapillary">Mapillary</string>
<string name="plugin_mapillary_descr">Уличные фотографии для всех. Исследуйте места, сотрудничайте, снимайте мир.</string>
<string name="save_poi_too_many_uppercase">Название содержит слишком много заглавных букв. Вы действительно хотите продолжить?</string>
<string name="quick_action_resume_pause_navigation_descr">Нажмите эту кнопку, чтобы приостановить навигацию или возобновить ее, если она уже приостановлена.</string>
<string name="quick_action_resume_pause_navigation_descr">Нажмите эту кнопку, чтобы приостановить навигацию или возобновить ее.</string>
<string name="quick_action_show_navigation_finish_dialog">Показывать диалог завершения навигации</string>
<string name="quick_action_start_stop_navigation">Старт/финиш навигации</string>
<string name="quick_action_start_stop_navigation_descr">Нажмите эту кнопку, чтобы начать навигацию, или остановить ее, если она уже была запущена.</string>
<string name="quick_action_start_stop_navigation">Запуск/остановка навигации</string>
<string name="quick_action_start_stop_navigation_descr">Нажмите эту кнопку, чтобы начать навигацию, или остановить ее.</string>
<string name="store_tracks_in_monthly_directories">Сохранять записанные треки в папках помесячно</string>
<string name="store_tracks_in_monthly_directories_descrp">Сохранять записанные треки в подпапках с записью месяца (например, 2017-01).</string>
<string name="mapillary_menu_title_tile_cache">Кэш тайлов</string>
@ -2432,7 +2432,7 @@
<string name="moving_time">Время в движении</string>
<string name="max_min">Макс/Мин</string>
<string name="min_max">Мин/Макс</string>
<string name="quick_action_resume_pause_navigation">Возобновить/Приостановить навигацию</string>
<string name="quick_action_resume_pause_navigation">Возобновить/приостановить навигацию</string>
<string name="mapillary_menu_descr_tile_cache">Перезагрузка тайлов для отображения актуальных данных.</string>
<string name="mapillary_menu_edit_text_hint">Введите имя пользователя</string>
<string name="shared_string_reset">Сбросить</string>
@ -2471,4 +2471,5 @@
\nи прочее…"</string>
<string name="rendering_value_translucent_pink_name">Прозрачно-розовый</string>
<string name="lang_ber">Берберский язык</string>
<string name="move_all_to_history">Переместить все в историю</string>
</resources>

View file

@ -2670,4 +2670,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Canoas: eja</string>
<string name="poi_boat_canoe_rental_rental_no">Canoas: nono</string>
<string name="poi_network">Retza</string>
</resources>

View file

@ -2575,7 +2575,7 @@ Pro praghere iscrie su còdighe intreu</string>
<string name="do_not_send_anonymous_app_usage">No imbies informatziones anònimas a pitzu de s\'impreu de s\'aplicatzione</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd imbiat informatziones generales a pitzu de sas partes de s\'aplicatzione impreadas. Non retzimus perunu datu de geolocalizatzione, chi pertochet datos insertados dae s\'impreadore o a pitzu de sas àreas chi bides, chircas o iscàrrigas.</string>
<string name="do_not_show_startup_messages">No ammustres messàgios a s\'alluìngiu</string>
<string name="do_not_show_startup_messages_desc">Ammustra sos iscontos pro sas aplicatziones e messàgios a pitzu de sos eventos locales</string>
<string name="do_not_show_startup_messages_desc">Istudat s\'ammustradura de sos iscontos pro sas aplicatziones e sos messàgios a pitzu de sos eventos locales</string>
<string name="parking_options">Issèberos pro sos parchègios</string>
<string name="right_side_navigation">Ghia a destra</string>
<string name="driving_region_automatic">Automàtica</string>
@ -2758,4 +2758,11 @@ Pro praghere iscrie su còdighe intreu</string>
<string name="add_segment_to_the_track">Annanghe a una rasta GPX</string>
<string name="keep_showing_on_map">Sighi a l\'ammustrare in sa mapa</string>
<string name="exit_without_saving">Essire chene sarvare?</string>
<string name="do_not_use_animations">No imprees sas animatziones</string>
<string name="do_not_use_animations_descr">Disabilitat sas animatziones in s\'aplicatzione</string>
<string name="move_all_to_history">Pone totu in s\'istòria</string>
<string name="build_route">Càlcula s\'àndala</string>
<string name="show_direction">Ammustra sas indicatziones de diretzione</string>
<string name="sort_by">Òrdina pro</string>
<string name="marker_options">Optziones de sos marcadores</string>
</resources>

View file

@ -2537,7 +2537,7 @@ Zodpovedá oblasti: %1$s x %2$s</string>
<string name="do_not_send_anonymous_app_usage">Neodosielať anonymné štatistiky o používaní aplikácie</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd zbiera informácie o tom, ktoré časti aplikácie otvárate. Nikdy sa neodosiela vaša poloha ani nič čo zapíšete do aplikácie ani detaily o oblastiach, ktoré si prezeráte, hľadáte alebo sťahujete.</string>
<string name="do_not_show_startup_messages">Nezobrazovať oznamy pri štarte</string>
<string name="do_not_show_startup_messages_desc">Zobrazuje zľavy a oznamy o miestnych udalostiach</string>
<string name="do_not_show_startup_messages_desc">Zakáže zobrazovanie zľav aplikácie a oznamov o miestnych udalostiach</string>
<string name="parking_options">Možnosti parkovania</string>
<string name="full_version_thanks">Ďakujeme za zakúpenie plnej verzie OsmAnd!</string>
<string name="routing_attr_relief_smoothness_factor_name">Zvoľte fluktuáciu nadmorskej výšky</string>
@ -2852,5 +2852,9 @@ Zodpovedá oblasti: %1$s x %2$s</string>
<string name="import_track">Importovať stopu</string>
<string name="import_track_desc">Súbor %1$s neobsahuje body trasy, naimportovať ako stopu?</string>
<string name="move_point">Presunúť bod</string>
<string name="add_segment_to_the_track">Pridať do stopy</string>
</resources>
<string name="add_segment_to_the_track">Pridať do stopy GPX</string>
<string name="do_not_use_animations">Nepoužívať animácie</string>
<string name="do_not_use_animations_descr">Vypne animácie v aplikácii</string>
<string name="keep_showing_on_map">Zobrazovať ďalej na mape</string>
<string name="exit_without_saving">Ukončiť bez uloženia?</string>
</resources>

View file

@ -3474,4 +3474,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Каное: так</string>
<string name="poi_boat_canoe_rental_rental_no">Каное: немає</string>
<string name="poi_network">Мережа</string>
</resources>

View file

@ -232,7 +232,7 @@
<string name="file_can_not_be_renamed">Файл не можна перейменувати.</string>
<string name="file_with_name_already_exists">Файл з таким ім’ям вже існує.</string>
<string name="gpx_navigation">GPX маршрут</string>
<string name="gpx_navigation">Маршрут GPX</string>
<string name="poi_query_by_name_matches_categories">Деякі категорії POI відповідають запиту, можете використовувати їх для створення фільтра:</string>
<string name="data_to_search_poi_not_available">Локальні дані для пошуку POI за іменем не знайдено.</string>
<string name="poi_filter_by_name">Пошук за назвою</string>
@ -319,9 +319,9 @@
<string name="tts_language_not_supported">Вибрана мова не підтримується встановленим рушієм Android TTS (перетворення тексту в мову). Ви бажаєте пошукати інший рушій TTS? Якщо ні, буде використовуватись інша встановлена мова рушія TTS.</string>
<string name="tts_missing_language_data_title">Дані відсутні</string>
<string name="tts_missing_language_data">Для даної мови відсутні дані TTS. Завантажити дані з Маркету?</string>
<string name="gpx_option_reverse_route">Виберіть зворотній напрямок</string>
<string name="gpx_option_reverse_route">Зворотній напрямок GPX</string>
<string name="gpx_option_destination_point">Використовувати поточний пункт призначення</string>
<string name="gpx_option_from_start_point">Пройти увесь шлях спочатку</string>
<string name="gpx_option_from_start_point">Пройдіть по усьому треку</string>
<string name="switch_to_vector_map_to_see">Для цього регіону доступні оффлайн векторні мапи\n\t\n\tДля їх використання виберіть пункт меню \'Налаштування Мапи\' → \'Джерело мапи…\' → \'Локальні векторні мапи\'.</string>
<string name="choose_audio_stream">Голосові інструкції</string>
<string name="choose_audio_stream_descr">Виберіть канал для голосових інструкцій</string>
@ -1522,8 +1522,8 @@
<string name="index_name_canada">Північна Америка - Канада</string>
<string name="index_name_italy">Європа - Італія</string>
<string name="index_name_gb">Європа - Великобританія</string>
<string name="calculate_osmand_route_without_internet">Розрахувати відрізок маршруту OsmAnd без Інтернету</string>
<string name="gpx_option_calculate_first_last_segment">Розрахувати маршрут OsmAnd для першого і останнього відрізку маршруту</string>
<string name="calculate_osmand_route_without_internet">Розрахувати ділянку маршруту OsmAnd без Інтернету</string>
<string name="gpx_option_calculate_first_last_segment">Обчислити маршрут OsmAnd для першого та останнього сегментів маршруту</string>
<string name="use_displayed_track_for_navigation">Бажаєте використовувати показаний трек для навігації?</string>
<string name="keep_and_add_destination_point">Додати як наступний пункт призначення</string>
<string name="select_gpx">Обрати GPX…</string>
@ -1669,7 +1669,7 @@
<string name="wake_on_voice_descr">Вмикати екран телефону (якщо він вимкнутий) під час наближення до повороту</string>
<string name="shared_string_never">Ніколи</string>
<string name="impassable_road">Уникати дороги</string>
<string name="impassable_road">Уникати доріг</string>
<string name="rendering_attr_trainLightrailRoutes_name">Маршрути поїздів</string>
<string name="rendering_attr_tramRoutes_name">Маршрути трамваїв</string>
@ -1814,7 +1814,7 @@
<string name="short_location_on_map">Шир %1$s↵
Дов %2$s</string>
<string name="tips_and_tricks_descr">Запитання та відповіді, останні зміни та інше</string>
<string name="routing_settings_2">Параметри навігації</string>
<string name="routing_settings_2">Налаштування навігації</string>
<string name="general_settings_2">Загальні налаштування</string>
<string name="shared_string_ellipsis"></string>
<string name="shared_string_selected">Вибрані</string>
@ -2172,7 +2172,7 @@
<string name="available_maps">Доступні мапи</string>
<string name="select_voice_provider">Виберіть голосові вказівки</string>
<string name="select_voice_provider_descr">Виберіть або завантажте голосові вказівки для вашої мови</string>
<string name="impassable_road_desc">Виберіть дороги, яких ви бажаєте уникати під час навігації</string>
<string name="impassable_road_desc">Виберіть дороги, які потрібно уникнути під час навігації</string>
<string name="shared_string_sound">Звук</string>
<string name="poi_deleted_localy">POI буде вилучено після того, як ви вивантажите ваші зміни</string>
<string name="confirm_download_roadmaps">Ви впевнені, що бажаєте завантажити мапу з дорогами, хоча ви вже маєете стандартну (повну) мапу?</string>
@ -2674,7 +2674,7 @@
<string name="animate_my_location_desc">Задіяти анімацію мого місця розташування під час навігації</string>
<string name="do_not_show_startup_messages">Не показувати повідомлення при запуску</string>
<string name="subscribe_email_desc">Підпишіться на наше email-розсилання про знижки на OsmAnd та отримаєте 3 додаткові завантаження мап!</string>
<string name="do_not_show_startup_messages_desc">Відображаються знижки та спеціальні повідомлення про місцеві події</string>
<string name="do_not_show_startup_messages_desc">Пригнічує відображення знижок на застосунок та спеціальні повідомлення про місцеві події</string>
<string name="restart_search">Шукати знову</string>
<string name="increase_search_radius">Збільшити радіус пошуку</string>
<string name="nothing_found">Нічого не знайдено :(</string>
@ -2977,9 +2977,9 @@
<string name="add_point_before">Додати точку раніше</string>
<string name="add_point_after">Додати точку опісля</string>
<string name="shared_string_options">Параметри</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd додасть додаткові точки в залежності від типу навігації.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd з’єднає точки з маршрутами для обраного профілю.</string>
<string name="measurement_tool_save_as_new_track_descr">Ви може зберегти точки, як точки маршруту або як лінію.</string>
<string name="choose_navigation_type">Вибрати тип навігації</string>
<string name="choose_navigation_type">Виберіть профіль навігації</string>
<string name="add_route_points">Додати точки маршруту</string>
<string name="add_line">Додати лінію</string>
<string name="empty_state_my_tracks">Додавати і записувати треки</string>
@ -2990,4 +2990,13 @@
<string name="import_track_desc">Файл %1$s не містить шляхових точок, імпортувати його в якості треку?</string>
<string name="move_point">Перемістити точку</string>
<string name="add_segment_to_the_track">Додати до GPX-треку</string>
</resources>
<string name="keep_showing_on_map">Продовжувати показувати на мапі</string>
<string name="exit_without_saving">Вийти без збереження?</string>
<string name="move_all_to_history">Перемістити усе в історію</string>
<string name="build_route">Побудувати маршрут</string>
<string name="show_direction">Показати напрямок</string>
<string name="sort_by">Сортувати за</string>
<string name="marker_options">Параметри маркера</string>
<string name="do_not_use_animations">Не застосовувати анімацію</string>
<string name="do_not_use_animations_descr">Відключення анімації в програмі</string>
</resources>

View file

@ -3509,4 +3509,6 @@
<string name="poi_boat_canoe_rental_rental_yes">獨木舟:有</string>
<string name="poi_boat_canoe_rental_rental_no">獨木舟:無</string>
<string name="poi_network">網路</string>
</resources>

View file

@ -2649,7 +2649,7 @@ OsmAnd (Automated Navigation Directions) 是一個地圖和導航的應用程式
<string name="parking_options">停車選項</string>
<string name="do_not_send_anonymous_app_usage">不要傳送匿名應用程式使用方式統計</string>
<string name="do_not_show_startup_messages">不要在啟動時顯示訊息</string>
<string name="do_not_show_startup_messages_desc">顯示應用程式折扣和專用的在地事件訊息</string>
<string name="do_not_show_startup_messages_desc">封鎖顯示應用程式折扣和專用的在地事件訊息</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd 收集您開了應用程式哪些部件的資訊。絕不會傳送您所在的位置,也沒有您向應用程式輸入的任何內容或您所查看區域的詳細資料、搜尋或下載。</string>
<string name="select_street">選擇街道</string>
<string name="shared_string_in_name">在 %1$s</string>
@ -2717,7 +2717,7 @@ OsmAnd (Automated Navigation Directions) 是一個地圖和導航的應用程式
<string name="change_color">更改顏色</string>
<string name="edit_name">編輯名稱</string>
<string name="save_poi_too_many_uppercase">名稱中包含太多的大寫字母。您想要繼續嗎?</string>
<string name="route_is_too_long_v2">這條路線可能太長,無法算。如果在10分鐘內沒有結果請增加中轉節點。</string>
<string name="route_is_too_long_v2">這條路線可能太長,無法算。如果在10分鐘內沒有結果請增加中轉節點。</string>
<string name="display_zoom_level">顯示縮放級別:%1$s</string>
<string name="srtm_color_scheme">色調配置</string>
<string name="show_from_zoom_level">由縮放級別來顯示</string>
@ -2826,9 +2826,9 @@ OsmAnd (Automated Navigation Directions) 是一個地圖和導航的應用程式
<string name="add_point_before">增加標點之前</string>
<string name="add_point_after">增加標點之後</string>
<string name="shared_string_options">選項</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd 將依據導航類型,增加輔助的標點</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd 將連接標點與已選取設定檔的路線</string>
<string name="measurement_tool_save_as_new_track_descr">您可以將標點儲存為路線標點或是一條線路。</string>
<string name="choose_navigation_type">選擇導航類型</string>
<string name="choose_navigation_type">選擇導航設定檔</string>
<string name="add_route_points">增加路線標點</string>
<string name="add_line">增加線路</string>
<string name="empty_state_my_tracks">增加並錄製軌跡</string>
@ -2841,4 +2841,11 @@ OsmAnd (Automated Navigation Directions) 是一個地圖和導航的應用程式
<string name="add_segment_to_the_track">增加到 GPX 軌跡</string>
<string name="keep_showing_on_map">在地圖上維持著顯示</string>
<string name="exit_without_saving">離開而不儲存嗎?</string>
<string name="do_not_use_animations">不使用動畫</string>
<string name="do_not_use_animations_descr">停用在應用程式中的動畫</string>
<string name="move_all_to_history">全部移動到歷程</string>
<string name="build_route">建立路線</string>
<string name="show_direction">顯示方向</string>
<string name="sort_by">排序方式</string>
<string name="marker_options">標記選項</string>
</resources>

View file

@ -3467,4 +3467,6 @@
<string name="poi_boat_canoe_rental_rental_yes">Canoe: yes</string>
<string name="poi_boat_canoe_rental_rental_no">Canoe: no</string>
<string name="poi_network">Network</string>
</resources>

View file

@ -9,8 +9,13 @@
3. All your modified/created strings are in the top of the file (to make easier find what\'s translated).
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
-->
<string name="move_all_to_history">Move all to history</string>
<string name="build_route">Build route</string>
<string name="show_direction">Show direction</string>
<string name="sort_by">Sort by</string>
<string name="marker_options">Marker options</string>
<string name="do_not_use_animations">Do not use animations</string>
<string name="do_not_use_animations_descr">It disables animations in app</string>
<string name="do_not_use_animations_descr">Disables animations in the app</string>
<string name="keep_showing_on_map">Keep showing on map</string>
<string name="exit_without_saving">Exit without saving?</string>
<string name="line">Line</string>
@ -21,9 +26,9 @@
<string name="add_point_before">Add point before</string>
<string name="add_point_after">Add point after</string>
<string name="shared_string_options">Options</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd will add additional points, depending on the navigation type.</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd will connect the points with routes for the selected profile.</string>
<string name="measurement_tool_save_as_new_track_descr">You can save the points either as route points or as a line.</string>
<string name="choose_navigation_type">Choose navigation type</string>
<string name="choose_navigation_type">Select navigation profile</string>
<string name="none_point_error">Please add at least one point.</string>
<string name="enter_gpx_name">GPX file name:</string>
<string name="show_on_map_after_saving">Show on map after saving</string>
@ -133,7 +138,7 @@
<string name="do_not_send_anonymous_app_usage">Do not send anonymous app usage statistics</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd collects information about which parts of the app you open. Your location is never sent, nor is anything you enter into the app or details of areas you view, search, or download.</string>
<string name="do_not_show_startup_messages">Do not show messages at startup</string>
<string name="do_not_show_startup_messages_desc">It displays app discounts &amp; special local events messages</string>
<string name="do_not_show_startup_messages_desc">Suppresses displaying app discounts &amp; special local event messages</string>
<string name="parking_options">Parking options</string>
<string name="full_version_thanks">Thank you for purchasing the full version of OsmAnd!</string>
<string name="routing_attr_relief_smoothness_factor_hills_name">Hilly</string>

View file

@ -392,53 +392,53 @@
<style name="Animations"/>
<style name="Animations.NoAnimation">
<item name="@android:windowEnterAnimation">@null</item>
<item name="@android:windowExitAnimation">@null</item>
<item name="android:windowEnterAnimation">@null</item>
<item name="android:windowExitAnimation">@null</item>
</style>
<!-- PopDownMenu -->
<style name="Animations.PopDownMenu"/>
<style name="Animations.PopDownMenu.Left">
<item name="@android:windowEnterAnimation">@anim/grow_from_topleft_to_bottomright</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_bottomright_to_topleft</item>
<item name="android:windowEnterAnimation">@anim/grow_from_topleft_to_bottomright</item>
<item name="android:windowExitAnimation">@anim/shrink_from_bottomright_to_topleft</item>
</style>
<style name="Animations.PopDownMenu.Right">
<item name="@android:windowEnterAnimation">@anim/grow_from_topright_to_bottomleft</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_bottomleft_to_topright</item>
<item name="android:windowEnterAnimation">@anim/grow_from_topright_to_bottomleft</item>
<item name="android:windowExitAnimation">@anim/shrink_from_bottomleft_to_topright</item>
</style>
<style name="Animations.PopDownMenu.Center">
<item name="@android:windowEnterAnimation">@anim/grow_from_top</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_bottom</item>
<item name="android:windowEnterAnimation">@anim/grow_from_top</item>
<item name="android:windowExitAnimation">@anim/shrink_from_bottom</item>
</style>
<!-- PopUpMenu -->
<style name="Animations.PopUpMenu"/>
<style name="Animations.PopUpMenu.Fade">
<item name="@android:windowEnterAnimation">@anim/popup_show</item>
<item name="@android:windowExitAnimation">@anim/popup_hide</item>
<item name="android:windowEnterAnimation">@anim/popup_show</item>
<item name="android:windowExitAnimation">@anim/popup_hide</item>
</style>
<style name="Animations.PopUpMenu.Left">
<item name="@android:windowEnterAnimation">@anim/grow_from_bottomleft_to_topright</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_topright_to_bottomleft</item>
<item name="android:windowEnterAnimation">@anim/grow_from_bottomleft_to_topright</item>
<item name="android:windowExitAnimation">@anim/shrink_from_topright_to_bottomleft</item>
</style>
<style name="Animations.PopUpMenu.Right">
<item name="@android:windowEnterAnimation">@anim/grow_from_bottomright_to_topleft</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_topleft_to_bottomright</item>
<item name="android:windowEnterAnimation">@anim/grow_from_bottomright_to_topleft</item>
<item name="android:windowExitAnimation">@anim/shrink_from_topleft_to_bottomright</item>
</style>
<style name="Animations.PopUpMenu.Center">
<item name="@android:windowEnterAnimation">@anim/grow_from_bottom</item>
<item name="@android:windowExitAnimation">@anim/shrink_from_top</item>
<item name="android:windowEnterAnimation">@anim/grow_from_bottom</item>
<item name="android:windowExitAnimation">@anim/shrink_from_top</item>
</style>
<style name="Animations.PopUpMenu.Bottom">
<item name="@android:windowEnterAnimation">@anim/slide_in_bottom</item>
<item name="@android:windowExitAnimation">@anim/slide_out_bottom</item>
<item name="android:windowEnterAnimation">@anim/slide_in_bottom</item>
<item name="android:windowExitAnimation">@anim/slide_out_bottom</item>
</style>
<style name="create_poi_text_field">

View file

@ -22,6 +22,8 @@ import net.osmand.aidl.calculateroute.CalculateRouteParams;
import net.osmand.aidl.gpx.ImportGpxParams;
import net.osmand.aidl.gpx.ShowGpxParams;
import net.osmand.aidl.gpx.StartGpxRecordingParams;
import net.osmand.aidl.gpx.StopGpxRecordingParams;
import net.osmand.aidl.gpx.HideGpxParams;
import net.osmand.aidl.gpx.ASelectedGpxFile;
@ -39,6 +41,14 @@ import net.osmand.aidl.maplayer.AddMapLayerParams;
import net.osmand.aidl.maplayer.RemoveMapLayerParams;
import net.osmand.aidl.maplayer.UpdateMapLayerParams;
import net.osmand.aidl.navigation.NavigateParams;
import net.osmand.aidl.navigation.NavigateGpxParams;
import net.osmand.aidl.note.TakePhotoNoteParams;
import net.osmand.aidl.note.StartVideoRecordingParams;
import net.osmand.aidl.note.StartAudioRecordingParams;
import net.osmand.aidl.note.StopRecordingParams;
// NOTE: Add new methods at the end of file!!!
interface IOsmAndAidlInterface {
@ -77,4 +87,15 @@ interface IOsmAndAidlInterface {
boolean removeFavorite(in RemoveFavoriteParams params);
boolean updateFavorite(in UpdateFavoriteParams params);
boolean startGpxRecording(in StartGpxRecordingParams params);
boolean stopGpxRecording(in StopGpxRecordingParams params);
boolean takePhotoNote(in TakePhotoNoteParams params);
boolean startVideoRecording(in StartVideoRecordingParams params);
boolean startAudioRecording(in StartAudioRecordingParams params);
boolean stopRecording(in StopRecordingParams params);
boolean navigate(in NavigateParams params);
boolean navigateGpx(in NavigateGpxParams params);
}

View file

@ -2,17 +2,22 @@ package net.osmand.aidl;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.support.v7.app.AlertDialog;
import android.view.View;
import net.osmand.IndexConstants;
import net.osmand.aidl.favorite.AFavorite;
import net.osmand.aidl.favorite.group.AFavoriteGroup;
import net.osmand.aidl.gpx.ASelectedGpxFile;
import net.osmand.aidl.gpx.StartGpxRecordingParams;
import net.osmand.aidl.gpx.StopGpxRecordingParams;
import net.osmand.aidl.maplayer.AMapLayer;
import net.osmand.aidl.maplayer.point.AMapPoint;
import net.osmand.aidl.mapmarker.AMapMarker;
@ -20,6 +25,7 @@ import net.osmand.aidl.mapwidget.AMapWidget;
import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.GPXDatabase.GpxDataItem;
import net.osmand.plus.GPXUtilities;
@ -29,9 +35,14 @@ import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.TargetPointsHelper;
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.monitoring.OsmandMonitoringPlugin;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.views.AidlMapLayer;
import net.osmand.plus.views.MapInfoLayer;
import net.osmand.plus.views.OsmandMapLayer;
@ -45,6 +56,7 @@ import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@ -61,6 +73,17 @@ public class OsmandAidlApi {
private static final String AIDL_ZOOM = "aidl_zoom";
private static final String AIDL_ANIMATED = "aidl_animated";
private static final String AIDL_START_NAME = "aidl_start_name";
private static final String AIDL_START_LAT = "aidl_start_lat";
private static final String AIDL_START_LON = "aidl_start_lon";
private static final String AIDL_DEST_NAME = "aidl_dest_name";
private static final String AIDL_DEST_LAT = "aidl_dest_lat";
private static final String AIDL_DEST_LON = "aidl_dest_lon";
private static final String AIDL_PROFILE = "aidl_profile";
private static final String AIDL_DATA = "aidl_data";
private static final String AIDL_URI = "aidl_uri";
private static final String AIDL_FORCE = "aidl_force";
private static final String AIDL_OBJECT_ID = "aidl_object_id";
private static final String AIDL_ADD_MAP_WIDGET = "aidl_add_map_widget";
@ -69,6 +92,22 @@ public class OsmandAidlApi {
private static final String AIDL_ADD_MAP_LAYER = "aidl_add_map_layer";
private static final String AIDL_REMOVE_MAP_LAYER = "aidl_remove_map_layer";
private static final String AIDL_TAKE_PHOTO_NOTE = "aidl_take_photo_note";
private static final String AIDL_START_VIDEO_RECORDING = "aidl_start_video_recording";
private static final String AIDL_START_AUDIO_RECORDING = "aidl_start_audio_recording";
private static final String AIDL_STOP_RECORDING = "aidl_stop_recording";
private static final String AIDL_NAVIGATE = "aidl_navigate";
private static final String AIDL_NAVIGATE_GPX = "aidl_navigate_gpx";
private static final ApplicationMode DEFAULT_PROFILE = ApplicationMode.CAR;
private static final ApplicationMode[] VALID_PROFILES = new ApplicationMode[]{
ApplicationMode.CAR,
ApplicationMode.BICYCLE,
ApplicationMode.PEDESTRIAN
};
private OsmandApplication app;
private Map<String, AMapWidget> widgets = new ConcurrentHashMap<>();
private Map<String, TextInfoWidget> widgetControls = new ConcurrentHashMap<>();
@ -81,6 +120,12 @@ public class OsmandAidlApi {
private BroadcastReceiver removeMapWidgetReceiver;
private BroadcastReceiver addMapLayerReceiver;
private BroadcastReceiver removeMapLayerReceiver;
private BroadcastReceiver takePhotoNoteReceiver;
private BroadcastReceiver startVideoRecordingReceiver;
private BroadcastReceiver startAudioRecordingReceiver;
private BroadcastReceiver stopRecordingReceiver;
private BroadcastReceiver navigateReceiver;
private BroadcastReceiver navigateGpxReceiver;
public OsmandAidlApi(OsmandApplication app) {
this.app = app;
@ -93,6 +138,12 @@ public class OsmandAidlApi {
registerRemoveMapWidgetReceiver(mapActivity);
registerAddMapLayerReceiver(mapActivity);
registerRemoveMapLayerReceiver(mapActivity);
registerTakePhotoNoteReceiver(mapActivity);
registerStartVideoRecordingReceiver(mapActivity);
registerStartAudioRecordingReceiver(mapActivity);
registerStopRecordingReceiver(mapActivity);
registerNavigateReceiver(mapActivity);
registerNavigateGpxReceiver(mapActivity);
}
public void onDestroyMapActivity(final MapActivity mapActivity) {
@ -147,6 +198,54 @@ public class OsmandAidlApi {
}
removeMapLayerReceiver = null;
}
if (takePhotoNoteReceiver != null) {
try {
mapActivity.unregisterReceiver(takePhotoNoteReceiver);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
takePhotoNoteReceiver = null;
}
if (startVideoRecordingReceiver != null) {
try {
mapActivity.unregisterReceiver(startVideoRecordingReceiver);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
startVideoRecordingReceiver = null;
}
if (startAudioRecordingReceiver != null) {
try {
mapActivity.unregisterReceiver(startAudioRecordingReceiver);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
startAudioRecordingReceiver = null;
}
if (stopRecordingReceiver != null) {
try {
mapActivity.unregisterReceiver(stopRecordingReceiver);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
stopRecordingReceiver = null;
}
if (navigateReceiver != null) {
try {
mapActivity.unregisterReceiver(navigateReceiver);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
navigateReceiver = null;
}
if (navigateGpxReceiver != null) {
try {
mapActivity.unregisterReceiver(navigateGpxReceiver);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
navigateGpxReceiver = null;
}
}
private void registerRefreshMapReceiver(final MapActivity mapActivity) {
@ -299,6 +398,208 @@ public class OsmandAidlApi {
mapActivity.registerReceiver(removeMapLayerReceiver, new IntentFilter(AIDL_REMOVE_MAP_LAYER));
}
private void registerTakePhotoNoteReceiver(final MapActivity mapActivity) {
takePhotoNoteReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final AudioVideoNotesPlugin plugin = OsmandPlugin.getEnabledPlugin(AudioVideoNotesPlugin.class);
if (plugin != null) {
double lat = intent.getDoubleExtra(AIDL_LATITUDE, Double.NaN);
double lon = intent.getDoubleExtra(AIDL_LONGITUDE, Double.NaN);
plugin.takePhoto(lat, lon, mapActivity, false, true);
}
}
};
mapActivity.registerReceiver(takePhotoNoteReceiver, new IntentFilter(AIDL_TAKE_PHOTO_NOTE));
}
private void registerStartVideoRecordingReceiver(final MapActivity mapActivity) {
startVideoRecordingReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final AudioVideoNotesPlugin plugin = OsmandPlugin.getEnabledPlugin(AudioVideoNotesPlugin.class);
if (plugin != null) {
double lat = intent.getDoubleExtra(AIDL_LATITUDE, Double.NaN);
double lon = intent.getDoubleExtra(AIDL_LONGITUDE, Double.NaN);
plugin.recordVideo(lat, lon, mapActivity, true);
}
}
};
mapActivity.registerReceiver(startVideoRecordingReceiver, new IntentFilter(AIDL_START_VIDEO_RECORDING));
}
private void registerStartAudioRecordingReceiver(final MapActivity mapActivity) {
startVideoRecordingReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final AudioVideoNotesPlugin plugin = OsmandPlugin.getEnabledPlugin(AudioVideoNotesPlugin.class);
if (plugin != null) {
double lat = intent.getDoubleExtra(AIDL_LATITUDE, Double.NaN);
double lon = intent.getDoubleExtra(AIDL_LONGITUDE, Double.NaN);
plugin.recordAudio(lat, lon, mapActivity);
}
}
};
mapActivity.registerReceiver(startVideoRecordingReceiver, new IntentFilter(AIDL_START_AUDIO_RECORDING));
}
private void registerStopRecordingReceiver(final MapActivity mapActivity) {
stopRecordingReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final AudioVideoNotesPlugin plugin = OsmandPlugin.getEnabledPlugin(AudioVideoNotesPlugin.class);
if (plugin != null) {
plugin.stopRecording(mapActivity, false);
}
}
};
mapActivity.registerReceiver(stopRecordingReceiver, new IntentFilter(AIDL_STOP_RECORDING));
}
private void registerNavigateReceiver(final MapActivity mapActivity) {
navigateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String profileStr = intent.getStringExtra(AIDL_PROFILE);
final ApplicationMode profile = ApplicationMode.valueOfStringKey(profileStr, DEFAULT_PROFILE);
boolean validProfile = false;
for (ApplicationMode mode : VALID_PROFILES) {
if (mode == profile) {
validProfile = true;
break;
}
}
if (validProfile) {
String startName = intent.getStringExtra(AIDL_START_NAME);
if (Algorithms.isEmpty(startName)) {
startName = "";
}
String destName = intent.getStringExtra(AIDL_DEST_NAME);
if (Algorithms.isEmpty(destName)) {
destName = "";
}
final LatLon start;
final PointDescription startDesc;
double startLat = intent.getDoubleExtra(AIDL_START_LAT, 0);
double startLon = intent.getDoubleExtra(AIDL_START_LON, 0);
if (startLat != 0 && startLon != 0) {
start = new LatLon(startLat, startLon);
startDesc = new PointDescription(PointDescription.POINT_TYPE_LOCATION, startName);
} else {
start = null;
startDesc = null;
}
double destLat = intent.getDoubleExtra(AIDL_DEST_LAT, 0);
double destLon = intent.getDoubleExtra(AIDL_DEST_LON, 0);
final LatLon dest = new LatLon(destLat, destLon);
final PointDescription destDesc = new PointDescription(PointDescription.POINT_TYPE_LOCATION, destName);
final RoutingHelper routingHelper = app.getRoutingHelper();
boolean force = intent.getBooleanExtra(AIDL_FORCE, true);
if (routingHelper.isFollowingMode() && !force) {
AlertDialog dlg = mapActivity.getMapActions().stopNavigationActionConfirm();
dlg.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (!routingHelper.isFollowingMode()) {
startNavigation(mapActivity, null, start, startDesc, dest, destDesc, profile);
}
}
});
} else {
startNavigation(mapActivity, null, start, startDesc, dest, destDesc, profile);
}
}
}
};
mapActivity.registerReceiver(navigateReceiver, new IntentFilter(AIDL_NAVIGATE));
}
private void registerNavigateGpxReceiver(final MapActivity mapActivity) {
navigateGpxReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
boolean force = intent.getBooleanExtra(AIDL_FORCE, false);
GPXFile gpx = null;
if (intent.getStringExtra(AIDL_DATA) != null) {
String gpxStr = intent.getStringExtra(AIDL_DATA);
if (!Algorithms.isEmpty(gpxStr)) {
gpx = GPXUtilities.loadGPXFile(mapActivity, new ByteArrayInputStream(gpxStr.getBytes()));
}
} else if (intent.getParcelableExtra(AIDL_URI) != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
Uri gpxUri = intent.getParcelableExtra(AIDL_URI);
ParcelFileDescriptor gpxParcelDescriptor = null;
try {
gpxParcelDescriptor = mapActivity.getContentResolver().openFileDescriptor(gpxUri, "r");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if (gpxParcelDescriptor != null) {
FileDescriptor fileDescriptor = gpxParcelDescriptor.getFileDescriptor();
gpx = GPXUtilities.loadGPXFile(mapActivity, new FileInputStream(fileDescriptor));
}
}
}
if (gpx != null) {
final RoutingHelper routingHelper = app.getRoutingHelper();
if (routingHelper.isFollowingMode() && !force) {
final GPXFile gpxFile = gpx;
AlertDialog dlg = mapActivity.getMapActions().stopNavigationActionConfirm();
dlg.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (!routingHelper.isFollowingMode()) {
startNavigation(mapActivity, gpxFile, null, null, null, null, null);
}
}
});
} else {
startNavigation(mapActivity, gpx, null, null, null, null, null);
}
}
}
};
mapActivity.registerReceiver(navigateGpxReceiver, new IntentFilter(AIDL_NAVIGATE_GPX));
}
private void startNavigation(MapActivity mapActivity,
GPXFile gpx,
LatLon from, PointDescription fromDesc,
LatLon to, PointDescription toDesc,
ApplicationMode mode) {
OsmandApplication app = mapActivity.getMyApplication();
RoutingHelper routingHelper = app.getRoutingHelper();
if (gpx == null) {
app.getSettings().APPLICATION_MODE.set(mode);
final TargetPointsHelper targets = mapActivity.getMyApplication().getTargetPointsHelper();
targets.removeAllWayPoints(false, true);
targets.navigateToPoint(to, true, -1, toDesc);
}
mapActivity.getMapActions().enterRoutePlanningModeGivenGpx(gpx, from, fromDesc, true, false);
if (!app.getTargetPointsHelper().checkPointToNavigateShort()) {
mapActivity.getMapLayers().getMapControlsLayer().getMapRouteInfoMenu().show();
} else {
if (app.getSettings().APPLICATION_MODE.get() != routingHelper.getAppMode()) {
app.getSettings().APPLICATION_MODE.set(routingHelper.getAppMode());
}
mapActivity.getMapViewTrackingUtilities().backToLocationImpl();
app.getSettings().FOLLOW_THE_ROUTE.set(true);
routingHelper.setFollowingMode(true);
routingHelper.setRoutePlanningMode(false);
mapActivity.getMapViewTrackingUtilities().switchToRoutePlanningMode();
app.getRoutingHelper().notifyIfRouteIsCalculated();
routingHelper.setCurrentLocation(app.getLocationProvider().getLastKnownLocation(), false);
}
}
public void registerMapLayers(MapActivity mapActivity) {
for (AMapLayer layer : layers.values()) {
OsmandMapLayer mapLayer = mapLayers.get(layer.getId());
@ -518,6 +819,8 @@ public class OsmandAidlApi {
PointDescription pd = new PointDescription(
PointDescription.POINT_TYPE_MAP_MARKER, markerNew.getName() != null ? markerNew.getName() : "");
MapMarker marker = new MapMarker(m.point, pd, m.colorIndex, m.selected, m.index);
marker.creationDate = m.creationDate;
marker.visitedDate = m.visitedDate;
markersHelper.moveMapMarker(marker, latLonNew);
refreshMap();
return true;
@ -841,4 +1144,83 @@ public class OsmandAidlApi {
app.sendBroadcast(intent);
return true;
}
boolean startGpxRecording(StartGpxRecordingParams params) {
final OsmandMonitoringPlugin plugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class);
if (plugin != null) {
plugin.startGPXMonitoring(null);
plugin.updateControl();
return true;
}
return false;
}
boolean stopGpxRecording(StopGpxRecordingParams params) {
final OsmandMonitoringPlugin plugin = OsmandPlugin.getEnabledPlugin(OsmandMonitoringPlugin.class);
if (plugin != null) {
plugin.stopRecording();
plugin.updateControl();
return true;
}
return false;
}
boolean takePhotoNote(double latitude, double longitude) {
Intent intent = new Intent();
intent.setAction(AIDL_TAKE_PHOTO_NOTE);
intent.putExtra(AIDL_LATITUDE, latitude);
intent.putExtra(AIDL_LONGITUDE, longitude);
app.sendBroadcast(intent);
return true;
}
boolean startVideoRecording(double latitude, double longitude) {
Intent intent = new Intent();
intent.setAction(AIDL_START_VIDEO_RECORDING);
intent.putExtra(AIDL_LATITUDE, latitude);
intent.putExtra(AIDL_LONGITUDE, longitude);
app.sendBroadcast(intent);
return true;
}
boolean startAudioRecording(double latitude, double longitude) {
Intent intent = new Intent();
intent.setAction(AIDL_START_AUDIO_RECORDING);
intent.putExtra(AIDL_LATITUDE, latitude);
intent.putExtra(AIDL_LONGITUDE, longitude);
app.sendBroadcast(intent);
return true;
}
boolean stopRecording() {
Intent intent = new Intent();
intent.setAction(AIDL_STOP_RECORDING);
app.sendBroadcast(intent);
return true;
}
boolean navigate(String startName, double startLat, double startLon, String destName, double destLat, double destLon, String profile, boolean force) {
Intent intent = new Intent();
intent.setAction(AIDL_NAVIGATE);
intent.putExtra(AIDL_START_NAME, startName);
intent.putExtra(AIDL_START_LAT, startLat);
intent.putExtra(AIDL_START_LON, startLon);
intent.putExtra(AIDL_DEST_NAME, destName);
intent.putExtra(AIDL_DEST_LAT, destLat);
intent.putExtra(AIDL_DEST_LON, destLon);
intent.putExtra(AIDL_PROFILE, profile);
intent.putExtra(AIDL_FORCE, force);
app.sendBroadcast(intent);
return true;
}
boolean navigateGpx(String data, Uri uri, boolean force) {
Intent intent = new Intent();
intent.setAction(AIDL_NAVIGATE_GPX);
intent.putExtra(AIDL_DATA, data);
intent.putExtra(AIDL_URI, uri);
intent.putExtra(AIDL_FORCE, force);
app.sendBroadcast(intent);
return true;
}
}

View file

@ -16,6 +16,8 @@ import net.osmand.aidl.gpx.ASelectedGpxFile;
import net.osmand.aidl.gpx.HideGpxParams;
import net.osmand.aidl.gpx.ImportGpxParams;
import net.osmand.aidl.gpx.ShowGpxParams;
import net.osmand.aidl.gpx.StartGpxRecordingParams;
import net.osmand.aidl.gpx.StopGpxRecordingParams;
import net.osmand.aidl.map.SetMapLocationParams;
import net.osmand.aidl.maplayer.AddMapLayerParams;
import net.osmand.aidl.maplayer.RemoveMapLayerParams;
@ -29,6 +31,12 @@ import net.osmand.aidl.mapmarker.UpdateMapMarkerParams;
import net.osmand.aidl.mapwidget.AddMapWidgetParams;
import net.osmand.aidl.mapwidget.RemoveMapWidgetParams;
import net.osmand.aidl.mapwidget.UpdateMapWidgetParams;
import net.osmand.aidl.navigation.NavigateGpxParams;
import net.osmand.aidl.navigation.NavigateParams;
import net.osmand.aidl.note.StartAudioRecordingParams;
import net.osmand.aidl.note.StopRecordingParams;
import net.osmand.aidl.note.TakePhotoNoteParams;
import net.osmand.aidl.note.StartVideoRecordingParams;
import net.osmand.plus.OsmandApplication;
import net.osmand.util.Algorithms;
@ -320,5 +328,77 @@ public class OsmandAidlService extends Service {
return true;
}
}
@Override
public boolean startGpxRecording(StartGpxRecordingParams params) throws RemoteException {
try {
return getApi().startGpxRecording(params);
} catch (Exception e) {
return false;
}
}
@Override
public boolean stopGpxRecording(StopGpxRecordingParams params) throws RemoteException {
try {
return getApi().stopGpxRecording(params);
} catch (Exception e) {
return false;
}
}
@Override
public boolean takePhotoNote(TakePhotoNoteParams params) throws RemoteException {
try {
return params != null && getApi().takePhotoNote(params.getLatitude(), params.getLongitude());
} catch (Exception e) {
return false;
}
}
@Override
public boolean startVideoRecording(StartVideoRecordingParams params) throws RemoteException {
try {
return params != null && getApi().startVideoRecording(params.getLatitude(), params.getLongitude());
} catch (Exception e) {
return false;
}
}
@Override
public boolean startAudioRecording(StartAudioRecordingParams params) throws RemoteException {
try {
return params != null && getApi().startAudioRecording(params.getLatitude(), params.getLongitude());
} catch (Exception e) {
return false;
}
}
@Override
public boolean stopRecording(StopRecordingParams params) throws RemoteException {
try {
return getApi().stopRecording();
} catch (Exception e) {
return false;
}
}
@Override
public boolean navigate(NavigateParams params) throws RemoteException {
try {
return params != null && getApi().navigate(params.getStartName(), params.getStartLat(), params.getStartLon(), params.getDestName(), params.getDestLat(), params.getDestLon(), params.getProfile(), params.isForce());
} catch (Exception e) {
return false;
}
}
@Override
public boolean navigateGpx(NavigateGpxParams params) throws RemoteException {
try {
return params != null && getApi().navigateGpx(params.getData(), params.getUri(), params.isForce());
} catch (Exception e) {
return false;
}
}
};
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.gpx;
parcelable StartGpxRecordingParams;

View file

@ -0,0 +1,40 @@
package net.osmand.aidl.gpx;
import android.os.Parcel;
import android.os.Parcelable;
public class StartGpxRecordingParams implements Parcelable {
public StartGpxRecordingParams() {
}
public StartGpxRecordingParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<StartGpxRecordingParams> CREATOR = new Creator<StartGpxRecordingParams>() {
@Override
public StartGpxRecordingParams createFromParcel(Parcel in) {
return new StartGpxRecordingParams(in);
}
@Override
public StartGpxRecordingParams[] newArray(int size) {
return new StartGpxRecordingParams[size];
}
};
@Override
public void writeToParcel(Parcel out, int flags) {
}
private void readFromParcel(Parcel in) {
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.gpx;
parcelable StopGpxRecordingParams;

View file

@ -0,0 +1,40 @@
package net.osmand.aidl.gpx;
import android.os.Parcel;
import android.os.Parcelable;
public class StopGpxRecordingParams implements Parcelable {
public StopGpxRecordingParams() {
}
public StopGpxRecordingParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<StopGpxRecordingParams> CREATOR = new Creator<StopGpxRecordingParams>() {
@Override
public StopGpxRecordingParams createFromParcel(Parcel in) {
return new StopGpxRecordingParams(in);
}
@Override
public StopGpxRecordingParams[] newArray(int size) {
return new StopGpxRecordingParams[size];
}
};
@Override
public void writeToParcel(Parcel out, int flags) {
}
private void readFromParcel(Parcel in) {
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.navigation;
parcelable NavigateGpxParams;

View file

@ -0,0 +1,69 @@
package net.osmand.aidl.navigation;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
public class NavigateGpxParams implements Parcelable {
private String data;
private Uri uri;
private boolean force;
public NavigateGpxParams(String data, boolean force) {
this.data = data;
this.force = force;
}
public NavigateGpxParams(Uri uri, boolean force) {
this.uri = uri;
this.force = force;
}
public NavigateGpxParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<NavigateGpxParams> CREATOR = new Creator<NavigateGpxParams>() {
@Override
public NavigateGpxParams createFromParcel(Parcel in) {
return new NavigateGpxParams(in);
}
@Override
public NavigateGpxParams[] newArray(int size) {
return new NavigateGpxParams[size];
}
};
public String getData() {
return data;
}
public Uri getUri() {
return uri;
}
public boolean isForce() {
return force;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(data);
out.writeParcelable(uri, flags);
out.writeByte((byte) (force ? 1 : 0));
}
private void readFromParcel(Parcel in) {
data = in.readString();
uri = in.readParcelable(Uri.class.getClassLoader());
force = in.readByte() != 0;
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.navigation;
parcelable NavigateParams;

View file

@ -0,0 +1,104 @@
package net.osmand.aidl.navigation;
import android.os.Parcel;
import android.os.Parcelable;
public class NavigateParams implements Parcelable {
private String startName;
private double startLat;
private double startLon;
private String destName;
private double destLat;
private double destLon;
private String profile;
private boolean force;
public NavigateParams(String startName, double startLat, double startLon, String destName, double destLat, double destLon, String profile, boolean force) {
this.startName = startName;
this.startLat = startLat;
this.startLon = startLon;
this.destName = destName;
this.destLat = destLat;
this.destLon = destLon;
this.profile = profile;
this.force = force;
}
public NavigateParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<NavigateParams> CREATOR = new Creator<NavigateParams>() {
@Override
public NavigateParams createFromParcel(Parcel in) {
return new NavigateParams(in);
}
@Override
public NavigateParams[] newArray(int size) {
return new NavigateParams[size];
}
};
public String getStartName() {
return startName;
}
public double getStartLat() {
return startLat;
}
public double getStartLon() {
return startLon;
}
public String getDestName() {
return destName;
}
public double getDestLat() {
return destLat;
}
public double getDestLon() {
return destLon;
}
public String getProfile() {
return profile;
}
public boolean isForce() {
return force;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(startName);
out.writeDouble(startLat);
out.writeDouble(startLon);
out.writeString(destName);
out.writeDouble(destLat);
out.writeDouble(destLon);
out.writeString(profile);
out.writeByte((byte) (force ? 1 : 0));
}
private void readFromParcel(Parcel in) {
startName = in.readString();
startLat = in.readDouble();
startLon = in.readDouble();
destName = in.readString();
destLat = in.readDouble();
destLon = in.readDouble();
profile = in.readString();
force = in.readByte() != 0;
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.note;
parcelable StartAudioRecordingParams;

View file

@ -0,0 +1,56 @@
package net.osmand.aidl.note;
import android.os.Parcel;
import android.os.Parcelable;
public class StartAudioRecordingParams implements Parcelable {
private double latitude;
private double longitude;
public StartAudioRecordingParams(double latitude, double longitude) {
this.latitude = latitude;
this.longitude = longitude;
}
public StartAudioRecordingParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<StartAudioRecordingParams> CREATOR = new Creator<StartAudioRecordingParams>() {
@Override
public StartAudioRecordingParams createFromParcel(Parcel in) {
return new StartAudioRecordingParams(in);
}
@Override
public StartAudioRecordingParams[] newArray(int size) {
return new StartAudioRecordingParams[size];
}
};
public double getLatitude() {
return latitude;
}
public double getLongitude() {
return longitude;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeDouble(latitude);
out.writeDouble(longitude);
}
private void readFromParcel(Parcel in) {
latitude = in.readDouble();
longitude = in.readDouble();
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.note;
parcelable StartVideoRecordingParams;

View file

@ -0,0 +1,56 @@
package net.osmand.aidl.note;
import android.os.Parcel;
import android.os.Parcelable;
public class StartVideoRecordingParams implements Parcelable {
private double latitude;
private double longitude;
public StartVideoRecordingParams(double latitude, double longitude) {
this.latitude = latitude;
this.longitude = longitude;
}
public StartVideoRecordingParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<StartVideoRecordingParams> CREATOR = new Creator<StartVideoRecordingParams>() {
@Override
public StartVideoRecordingParams createFromParcel(Parcel in) {
return new StartVideoRecordingParams(in);
}
@Override
public StartVideoRecordingParams[] newArray(int size) {
return new StartVideoRecordingParams[size];
}
};
public double getLatitude() {
return latitude;
}
public double getLongitude() {
return longitude;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeDouble(latitude);
out.writeDouble(longitude);
}
private void readFromParcel(Parcel in) {
latitude = in.readDouble();
longitude = in.readDouble();
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.note;
parcelable StopRecordingParams;

View file

@ -0,0 +1,42 @@
package net.osmand.aidl.note;
import android.os.Parcel;
import android.os.Parcelable;
public class StopRecordingParams implements Parcelable {
public StopRecordingParams() {
}
public StopRecordingParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<StopRecordingParams> CREATOR = new Creator<StopRecordingParams>() {
@Override
public StopRecordingParams createFromParcel(Parcel in) {
return new StopRecordingParams(in);
}
@Override
public StopRecordingParams[] newArray(int size) {
return new StopRecordingParams[size];
}
};
@Override
public void writeToParcel(Parcel out, int flags) {
}
private void readFromParcel(Parcel in) {
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.note;
parcelable TakePhotoNoteParams;

View file

@ -0,0 +1,56 @@
package net.osmand.aidl.note;
import android.os.Parcel;
import android.os.Parcelable;
public class TakePhotoNoteParams implements Parcelable {
private double latitude;
private double longitude;
public TakePhotoNoteParams(double latitude, double longitude) {
this.latitude = latitude;
this.longitude = longitude;
}
public TakePhotoNoteParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<TakePhotoNoteParams> CREATOR = new Creator<TakePhotoNoteParams>() {
@Override
public TakePhotoNoteParams createFromParcel(Parcel in) {
return new TakePhotoNoteParams(in);
}
@Override
public TakePhotoNoteParams[] newArray(int size) {
return new TakePhotoNoteParams[size];
}
};
public double getLatitude() {
return latitude;
}
public double getLongitude() {
return longitude;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeDouble(latitude);
out.writeDouble(longitude);
}
private void readFromParcel(Parcel in) {
latitude = in.readDouble();
longitude = in.readDouble();
}
@Override
public int describeContents() {
return 0;
}
}

View file

@ -29,6 +29,7 @@ import net.osmand.plus.download.ui.AbstractLoadLocalIndexTask;
import net.osmand.plus.helpers.AvoidSpecificRoads;
import net.osmand.plus.helpers.WaypointHelper;
import net.osmand.plus.liveupdates.LiveUpdatesHelper;
import net.osmand.plus.mapmarkers.MapMarkersDbHelper;
import net.osmand.plus.monitoring.LiveMonitoringHelper;
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
import net.osmand.plus.poi.PoiFiltersHelper;
@ -373,6 +374,7 @@ public class AppInitializer implements IProgress {
app.rendererRegistry = startupInit(new RendererRegistry(app), RendererRegistry.class);
app.geocodingLookupService = startupInit(new GeocodingLookupService(app), GeocodingLookupService.class);
app.targetPointsHelper = startupInit(new TargetPointsHelper(app), TargetPointsHelper.class);
app.mapMarkersDbHelper = startupInit(new MapMarkersDbHelper(app), MapMarkersDbHelper.class);
app.mapMarkersHelper = startupInit(new MapMarkersHelper(app), MapMarkersHelper.class);
app.searchUICore = startupInit(new QuickSearchHelper(app), QuickSearchHelper.class);
}

View file

@ -28,6 +28,7 @@ public class MapMarkersHelper {
}
public static class MapMarker implements LocationPoint {
public long id;
public LatLon point;
private PointDescription pointDescription;
public int colorIndex;
@ -35,6 +36,9 @@ public class MapMarkersHelper {
public boolean history;
public boolean selected;
public int dist;
public long creationDate;
public long visitedDate;
public long nextKey;
public MapMarker(LatLon point, PointDescription name, int colorIndex,
boolean selected, int index) {
@ -105,6 +109,36 @@ public class MapMarkersHelper {
result = 31 * result + colorIndex;
return result;
}
public static int getColorId(int colorIndex) {
int colorId;
switch (colorIndex) {
case 0:
colorId = R.color.marker_blue;
break;
case 1:
colorId = R.color.marker_green;
break;
case 2:
colorId = R.color.marker_orange;
break;
case 3:
colorId = R.color.marker_red;
break;
case 4:
colorId = R.color.marker_yellow;
break;
case 5:
colorId = R.color.marker_teal;
break;
case 6:
colorId = R.color.marker_purple;
break;
default:
colorId = R.color.marker_blue;
}
return colorId;
}
}
public MapMarkersHelper(OsmandApplication ctx) {
@ -139,6 +173,7 @@ public class MapMarkersHelper {
List<String> desc = settings.getMapMarkersPointDescriptions(ips.size());
List<Integer> colors = settings.getMapMarkersColors(ips.size());
List<Boolean> selections = settings.getMapMarkersSelections(ips.size());
List<Long> creationDates = settings.getMapMarkersCreationDates(ips.size());
int colorIndex = 0;
for (int i = 0; i < ips.size(); i++) {
if (colors.size() > i) {
@ -147,15 +182,23 @@ public class MapMarkersHelper {
MapMarker mapMarker = new MapMarker(ips.get(i),
PointDescription.deserializeFromString(desc.get(i), ips.get(i)), colorIndex,
selections.get(i), i);
mapMarker.creationDate = creationDates.get(i);
mapMarkers.add(mapMarker);
}
ips = settings.getMapMarkersHistoryPoints();
desc = settings.getMapMarkersHistoryPointDescriptions(ips.size());
colors = settings.getMapMarkersHistoryColors(ips.size());
creationDates = settings.getMapMarkersHistoryCreationDates(ips.size());
for (int i = 0; i < ips.size(); i++) {
if (colors.size() > i) {
colorIndex = colors.get(i);
}
MapMarker mapMarker = new MapMarker(ips.get(i),
PointDescription.deserializeFromString(desc.get(i), ips.get(i)), 0, false, i);
PointDescription.deserializeFromString(desc.get(i), ips.get(i)),
colorIndex, false, i);
mapMarker.history = true;
mapMarker.creationDate = creationDates.get(i);
mapMarkersHistory.add(mapMarker);
}
@ -177,10 +220,10 @@ public class MapMarkersHelper {
}
if (history) {
settings.updateMapMarkerHistory(mapMarker.point.getLatitude(), mapMarker.point.getLongitude(),
mapMarker.pointDescription, mapMarker.colorIndex);
mapMarker.pointDescription, mapMarker.colorIndex, mapMarker.creationDate);
} else {
settings.updateMapMarker(mapMarker.point.getLatitude(), mapMarker.point.getLongitude(),
mapMarker.pointDescription, mapMarker.colorIndex, mapMarker.selected);
mapMarker.pointDescription, mapMarker.colorIndex, mapMarker.selected, mapMarker.creationDate);
}
updateMarker(mapMarker);
}
@ -266,7 +309,7 @@ public class MapMarkersHelper {
public void removeActiveMarkers() {
cancelAddressRequests();
for (int i = mapMarkers.size() - 1; i>= 0; i--) {
for (int i = mapMarkers.size() - 1; i >= 0; i--) {
MapMarker marker = mapMarkers.get(i);
addMapMarkerHistory(marker);
}
@ -282,6 +325,12 @@ public class MapMarkersHelper {
refresh();
}
public void addMapMarker(MapMarker marker, int index) {
settings.insertMapMarker(marker.getLatitude(), marker.getLongitude(), marker.pointDescription,
marker.colorIndex, marker.selected, marker.creationDate, index);
readFromSettings();
}
public void addMapMarker(LatLon point, PointDescription historyName) {
List<LatLon> points = new ArrayList<>(1);
List<PointDescription> historyNames = new ArrayList<>(1);
@ -346,7 +395,7 @@ public class MapMarkersHelper {
public void updateMapMarker(MapMarker marker, boolean refresh) {
if (marker != null) {
settings.updateMapMarker(marker.getLatitude(), marker.getLongitude(),
marker.pointDescription, marker.colorIndex, marker.selected);
marker.pointDescription, marker.colorIndex, marker.selected, marker.creationDate);
if (refresh) {
readFromSettings();
refresh();
@ -357,7 +406,7 @@ public class MapMarkersHelper {
public void moveMapMarker(@Nullable MapMarker marker, LatLon latLon) {
if (marker != null) {
settings.moveMapMarker(new LatLon(marker.getLatitude(), marker.getLongitude()), latLon,
marker.pointDescription, marker.colorIndex, marker.selected);
marker.pointDescription, marker.colorIndex, marker.selected, marker.creationDate);
marker.point = new LatLon(latLon.getLatitude(), latLon.getLongitude());
readFromSettings();
refresh();
@ -374,7 +423,8 @@ public class MapMarkersHelper {
public void addMapMarkerHistory(MapMarker marker) {
if (marker != null) {
settings.insertMapMarkerHistory(marker.getLatitude(), marker.getLongitude(), marker.pointDescription, marker.colorIndex, 0);
settings.insertMapMarkerHistory(marker.getLatitude(), marker.getLongitude(),
marker.pointDescription, marker.colorIndex, marker.creationDate, 0);
readFromSettings();
refresh();
}
@ -394,25 +444,29 @@ public class MapMarkersHelper {
List<String> names = new ArrayList<>(markers.size());
List<Integer> colors = new ArrayList<>(markers.size());
List<Boolean> selections = new ArrayList<>(markers.size());
List<Long> creationDates = new ArrayList<>(markers.size());
for (MapMarker marker : markers) {
ls.add(marker.point);
names.add(PointDescription.serializeToString(marker.pointDescription));
colors.add(marker.colorIndex);
selections.add(marker.selected);
creationDates.add(marker.creationDate);
}
settings.saveMapMarkers(ls, names, colors, selections);
settings.saveMapMarkers(ls, names, colors, selections, creationDates);
}
if (markersHistory != null) {
List<LatLon> ls = new ArrayList<>(markersHistory.size());
List<String> names = new ArrayList<>(markersHistory.size());
List<Integer> colors = new ArrayList<>(markersHistory.size());
List<Long> creationDates = new ArrayList<>(markersHistory.size());
for (MapMarker marker : markersHistory) {
ls.add(marker.point);
names.add(PointDescription.serializeToString(marker.pointDescription));
colors.add(marker.colorIndex);
creationDates.add(marker.creationDate);
}
settings.saveMapMarkersHistory(ls, names, colors);
settings.saveMapMarkersHistory(ls, names, colors, creationDates);
}
if (markers != null || markersHistory != null) {

View file

@ -47,6 +47,7 @@ import net.osmand.plus.helpers.AvoidSpecificRoads;
import net.osmand.plus.helpers.WaypointHelper;
import net.osmand.plus.inapp.InAppHelper;
import net.osmand.plus.mapcontextmenu.other.RoutePreferencesMenu;
import net.osmand.plus.mapmarkers.MapMarkersDbHelper;
import net.osmand.plus.monitoring.LiveMonitoringHelper;
import net.osmand.plus.poi.PoiFiltersHelper;
import net.osmand.plus.render.RendererRegistry;
@ -107,6 +108,7 @@ public class OsmandApplication extends MultiDexApplication {
LiveMonitoringHelper liveMonitoringHelper;
TargetPointsHelper targetPointsHelper;
MapMarkersHelper mapMarkersHelper;
MapMarkersDbHelper mapMarkersDbHelper;
WaypointHelper waypointHelper;
DownloadIndexesThread downloadIndexesThread;
AvoidSpecificRoads avoidSpecificRoads;
@ -615,6 +617,10 @@ public class OsmandApplication extends MultiDexApplication {
return mapMarkersHelper;
}
public MapMarkersDbHelper getMapMarkersDbHelper() {
return mapMarkersDbHelper;
}
public void showShortToastMessage(final int msgId, final Object... args) {
uiHandler.post(new Runnable() {
@Override

View file

@ -256,19 +256,27 @@ public class OsmandSettings {
}
public boolean isWifiConnected() {
ConnectivityManager mgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = mgr.getActiveNetworkInfo();
return ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI;
try {
ConnectivityManager mgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = mgr.getActiveNetworkInfo();
return ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI;
} catch (Exception e) {
return false;
}
}
private boolean isInternetConnected() {
ConnectivityManager mgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo active = mgr.getActiveNetworkInfo();
if (active == null) {
try {
ConnectivityManager mgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo active = mgr.getActiveNetworkInfo();
if (active == null) {
return false;
} else {
NetworkInfo.State state = active.getState();
return state != NetworkInfo.State.DISCONNECTED && state != NetworkInfo.State.DISCONNECTING;
}
} catch (Exception e) {
return false;
} else {
NetworkInfo.State state = active.getState();
return state != NetworkInfo.State.DISCONNECTED && state != NetworkInfo.State.DISCONNECTING;
}
}
@ -1775,8 +1783,11 @@ public class OsmandSettings {
public final static String MAP_MARKERS_COLOR = "map_markers_color"; //$NON-NLS-1$
public final static String MAP_MARKERS_DESCRIPTION = "map_markers_description"; //$NON-NLS-1$
public final static String MAP_MARKERS_SELECTION = "map_markers_selection"; //$NON-NLS-1$
public final static String MAP_MARKERS_CREATION_DATE = "map_markers_creation_date"; //$NON-NLS-1$
public final static String MAP_MARKERS_HISTORY_POINT = "map_markers_history_point"; //$NON-NLS-1$
public final static String MAP_MARKERS_HISTORY_COLOR = "map_markers_history_color"; //$NON-NLS-1$
public final static String MAP_MARKERS_HISTORY_DESCRIPTION = "map_markers_history_description"; //$NON-NLS-1$
public final static String MAP_MARKERS_HISTORY_CREATION_DATE = "map_markers_history_creation_date"; //$NON-NLS-1$
public final static int MAP_MARKERS_HISTORY_LIMIT = 30;
private MapMarkersStorage mapMarkersStorage = new MapMarkersStorage();
private MapMarkersHistoryStorage mapMarkersHistoryStorage = new MapMarkersHistoryStorage();
@ -1888,6 +1899,7 @@ public class OsmandSettings {
.remove(MAP_MARKERS_DESCRIPTION)
.remove(MAP_MARKERS_COLOR)
.remove(MAP_MARKERS_SELECTION)
.remove(MAP_MARKERS_CREATION_DATE)
.commit();
}
@ -1895,6 +1907,8 @@ public class OsmandSettings {
return settingsAPI.edit(globalPreferences)
.remove(MAP_MARKERS_HISTORY_POINT)
.remove(MAP_MARKERS_HISTORY_DESCRIPTION)
.remove(MAP_MARKERS_HISTORY_COLOR)
.remove(MAP_MARKERS_HISTORY_CREATION_DATE)
.commit();
}
@ -1919,18 +1933,175 @@ public class OsmandSettings {
private class MapMarkersHistoryStorage extends MapPointsStorage {
protected String colorsKey;
protected String creationDatesKey;
public MapMarkersHistoryStorage() {
pointsKey = MAP_MARKERS_HISTORY_POINT;
descriptionsKey = MAP_MARKERS_HISTORY_DESCRIPTION;
colorsKey = MAP_MARKERS_HISTORY_COLOR;
creationDatesKey = MAP_MARKERS_HISTORY_CREATION_DATE;
}
public List<Integer> getColors(int sz) {
List<Integer> list = new ArrayList<>();
String ip = settingsAPI.getString(globalPreferences, colorsKey, "");
if (ip.trim().length() > 0) {
StringTokenizer tok = new StringTokenizer(ip, ",");
while (tok.hasMoreTokens()) {
String colorStr = tok.nextToken();
list.add(Integer.parseInt(colorStr));
}
}
while (list.size() > sz) {
list.remove(list.size() - 1);
}
int i = 0;
while (list.size() < sz) {
list.add(i % MapMarkersHelper.MAP_MARKERS_COLORS_COUNT);
i++;
}
return list;
}
public List<Long> getCreationDates(int sz) {
List<Long> list = new ArrayList<>();
String ip = settingsAPI.getString(globalPreferences, creationDatesKey, "");
if (ip.trim().length() > 0) {
StringTokenizer tok = new StringTokenizer(ip, ",");
while (tok.hasMoreTokens()) {
String creationDateStr = tok.nextToken();
list.add(Long.parseLong(creationDateStr));
}
}
while (list.size() > sz) {
list.remove(list.size() - 1);
}
while (list.size() < sz) {
list.add(0L);
}
return list;
}
public boolean savePoints(List<LatLon> ps, List<String> ds, List<Integer> cs, List<Long> cds) {
while (ps.size() > MAP_MARKERS_HISTORY_LIMIT) {
ps.remove(ps.size() - 1);
ds.remove(ds.size() - 1);
cs.remove(cs.size() - 1);
cds.remove(cds.size() - 1);
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ps.size(); i++) {
if (i > 0) {
sb.append(",");
}
sb.append(((float) ps.get(i).getLatitude() + "")).append(",").append(((float) ps.get(i).getLongitude() + ""));
}
StringBuilder tb = new StringBuilder();
for (int i = 0; i < ds.size(); i++) {
if (i > 0) {
tb.append("--");
}
if (ds.get(i) == null) {
tb.append("");
} else {
tb.append(ds.get(i));
}
}
StringBuilder cb = new StringBuilder();
for (int i = 0; i < cs.size(); i++) {
if (i > 0) {
cb.append(",");
}
cb.append(Integer.toString(cs.get(i)));
}
StringBuilder cdb = new StringBuilder();
if (cds != null) {
for (int i = 0; i < cds.size(); i++) {
if (i > 0) {
cdb.append(",");
}
cdb.append(Long.toString(cds.get(i)));
}
}
return settingsAPI.edit(globalPreferences)
.putString(pointsKey, sb.toString())
.putString(descriptionsKey, tb.toString())
.putString(colorsKey, cb.toString())
.putString(creationDatesKey, cdb.toString())
.commit();
}
public boolean insertPoint(double latitude, double longitude,
PointDescription historyDescription, int colorIndex,
long creationDate, int index) {
List<LatLon> ps = getPoints();
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Long> cds = getCreationDates(ps.size());
ps.add(index, new LatLon(latitude, longitude));
ds.add(index, PointDescription.serializeToString(historyDescription));
cs.add(index, colorIndex);
cds.add(index, creationDate);
if (historyDescription != null && !historyDescription.isSearchingAddress(ctx)) {
SearchHistoryHelper.getInstance(ctx).addNewItemToHistory(latitude, longitude, historyDescription);
}
return savePoints(ps, ds, cs, cds);
}
public boolean updatePoint(double latitude, double longitude,
PointDescription historyDescription, int colorIndex,
long creationDate) {
List<LatLon> ps = getPoints();
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Long> cds = getCreationDates(ps.size());
int index = ps.indexOf(new LatLon(latitude, longitude));
if (index != -1) {
ds.set(index, PointDescription.serializeToString(historyDescription));
if (cs.size() > index) {
cs.set(index, colorIndex);
}
if (cds.size() > index) {
cds.set(index, creationDate);
}
if (historyDescription != null && !historyDescription.isSearchingAddress(ctx)) {
SearchHistoryHelper.getInstance(ctx).addNewItemToHistory(latitude, longitude, historyDescription);
}
return savePoints(ps, ds, cs, cds);
} else {
return false;
}
}
@Override
public boolean deletePoint(int index) {
List<LatLon> ps = getPoints();
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Long> cds = getCreationDates(ps.size());
ps.remove(index);
ds.remove(index);
cds.remove(index);
if (cs.size() > index) {
cs.remove(index);
}
return savePoints(ps, ds, cs, cds);
}
@Override
public boolean savePoints(List<LatLon> ps, List<String> ds) {
while (ps.size() > MAP_MARKERS_HISTORY_LIMIT) {
ps.remove(ps.size() - 1);
ds.remove(ds.size() - 1);
}
return super.savePoints(ps, ds);
return false;
}
@Override
public boolean insertPoint(double latitude, double longitude, PointDescription historyDescription, int index) {
return false;
}
@Override
public boolean updatePoint(double latitude, double longitude, PointDescription historyDescription) {
return false;
}
}
@ -1938,12 +2109,14 @@ public class OsmandSettings {
protected String colorsKey;
protected String selectionKey;
protected String creationDatesKey;
public MapMarkersStorage() {
pointsKey = MAP_MARKERS_POINT;
descriptionsKey = MAP_MARKERS_DESCRIPTION;
colorsKey = MAP_MARKERS_COLOR;
selectionKey = MAP_MARKERS_SELECTION;
creationDatesKey = MAP_MARKERS_CREATION_DATE;
}
public List<Integer> getColors(int sz) {
@ -1986,21 +2159,42 @@ public class OsmandSettings {
return list;
}
public List<Long> getCreationDates(int sz) {
List<Long> list = new ArrayList<>();
String ip = settingsAPI.getString(globalPreferences, creationDatesKey, "");
if (ip.trim().length() > 0) {
StringTokenizer tok = new StringTokenizer(ip, ",");
while (tok.hasMoreTokens()) {
String creationDateStr = tok.nextToken();
list.add(Long.parseLong(creationDateStr));
}
}
while (list.size() > sz) {
list.remove(list.size() - 1);
}
while (list.size() < sz) {
list.add(0L);
}
return list;
}
public boolean insertPoint(double latitude, double longitude,
PointDescription historyDescription, int colorIndex, int pos,
boolean selected, int index) {
PointDescription historyDescription, int colorIndex,
boolean selected, long creationDate, int index) {
List<LatLon> ps = getPoints();
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Boolean> bs = getSelections(ps.size());
List<Long> cds = getCreationDates(ps.size());
ps.add(index, new LatLon(latitude, longitude));
ds.add(index, PointDescription.serializeToString(historyDescription));
cs.add(index, colorIndex);
bs.add(index, selected);
cds.add(index, creationDate == 0 ? System.currentTimeMillis() : creationDate);
if (historyDescription != null && !historyDescription.isSearchingAddress(ctx)) {
SearchHistoryHelper.getInstance(ctx).addNewItemToHistory(latitude, longitude, historyDescription);
}
return savePoints(ps, ds, cs, bs);
return savePoints(ps, ds, cs, bs, cds);
}
public boolean insertPoints(double[] latitudes, double[] longitudes,
@ -2010,6 +2204,7 @@ public class OsmandSettings {
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Boolean> bs = getSelections(ps.size());
List<Long> cds = getCreationDates(ps.size());
for (int i = 0; i < latitudes.length; i++) {
double latitude = latitudes[i];
double longitude = longitudes[i];
@ -2021,20 +2216,22 @@ public class OsmandSettings {
ds.add(index, PointDescription.serializeToString(historyDescription));
cs.add(index, colorIndex);
bs.add(index, selected);
cds.add(index, System.currentTimeMillis());
if (historyDescription != null && !historyDescription.isSearchingAddress(ctx)) {
SearchHistoryHelper.getInstance(ctx).addNewItemToHistory(latitude, longitude, historyDescription);
}
}
return savePoints(ps, ds, cs, bs);
return savePoints(ps, ds, cs, bs, cds);
}
public boolean updatePoint(double latitude, double longitude,
PointDescription historyDescription, int colorIndex,
boolean selected) {
boolean selected, long creationDate) {
List<LatLon> ps = getPoints();
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Boolean> bs = getSelections(ps.size());
List<Long> cds = getCreationDates(ps.size());
int index = ps.indexOf(new LatLon(latitude, longitude));
if (index != -1) {
ds.set(index, PointDescription.serializeToString(historyDescription));
@ -2044,10 +2241,13 @@ public class OsmandSettings {
if (bs.size() > index) {
bs.set(index, selected);
}
if (cds.size() > index) {
cds.set(index, creationDate);
}
if (historyDescription != null && !historyDescription.isSearchingAddress(ctx)) {
SearchHistoryHelper.getInstance(ctx).addNewItemToHistory(latitude, longitude, historyDescription);
}
return savePoints(ps, ds, cs, bs);
return savePoints(ps, ds, cs, bs, cds);
} else {
return false;
}
@ -2057,11 +2257,13 @@ public class OsmandSettings {
LatLon latLonNew,
PointDescription historyDescription,
int colorIndex,
boolean selected) {
boolean selected,
long creationDate) {
List<LatLon> ps = getPoints();
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Boolean> bs = getSelections(ps.size());
List<Long> cds = getCreationDates(ps.size());
int index = ps.indexOf(latLonEx);
if (index != -1) {
if (ps.size() > index) {
@ -2074,12 +2276,15 @@ public class OsmandSettings {
if (bs.size() > index) {
bs.set(index, selected);
}
if (cds.size() > index) {
cds.set(index, creationDate);
}
if (historyDescription != null && !historyDescription.isSearchingAddress(ctx)) {
double lat = latLonNew.getLatitude();
double lon = latLonNew.getLongitude();
SearchHistoryHelper.getInstance(ctx).addNewItemToHistory(lat, lon, historyDescription);
}
return savePoints(ps, ds, cs, bs);
return savePoints(ps, ds, cs, bs, cds);
} else {
return false;
}
@ -2091,19 +2296,21 @@ public class OsmandSettings {
List<String> ds = getPointDescriptions(ps.size());
List<Integer> cs = getColors(ps.size());
List<Boolean> bs = getSelections(ps.size());
List<Long> cds = getCreationDates(ps.size());
ps.remove(index);
ds.remove(index);
cds.remove(index);
if (cs.size() > index) {
cs.remove(index);
}
if (bs.size() > index) {
bs.remove(index);
}
return savePoints(ps, ds, cs, bs);
return savePoints(ps, ds, cs, bs, cds);
}
public boolean savePoints(List<LatLon> ps, List<String> ds, List<Integer> cs,
List<Boolean> bs) {
List<Boolean> bs, List<Long> cds) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ps.size(); i++) {
if (i > 0) {
@ -2138,11 +2345,21 @@ public class OsmandSettings {
bb.append(Boolean.toString(bs.get(i)));
}
}
StringBuilder cdb = new StringBuilder();
if (cds != null) {
for (int i = 0; i < cds.size(); i++) {
if (i > 0) {
cdb.append(",");
}
cdb.append(Long.toString(cds.get(i)));
}
}
return settingsAPI.edit(globalPreferences)
.putString(pointsKey, sb.toString())
.putString(descriptionsKey, tb.toString())
.putString(colorsKey, cb.toString())
.putString(selectionKey, bb.toString())
.putString(creationDatesKey, cdb.toString())
.commit();
}
@ -2336,15 +2553,19 @@ public class OsmandSettings {
return mapMarkersStorage.getSelections(sz);
}
public List<Long> getMapMarkersCreationDates(int sz) {
return mapMarkersStorage.getCreationDates(sz);
}
public List<LatLon> getMapMarkersPoints() {
return mapMarkersStorage.getPoints();
}
public boolean insertMapMarker(double latitude, double longitude,
PointDescription historyDescription, int colorIndex, int pos,
boolean selected, int index) {
PointDescription historyDescription, int colorIndex,
boolean selected, long creationDate, int index) {
return mapMarkersStorage.insertPoint(latitude, longitude, historyDescription, colorIndex,
index, selected, pos);
selected, creationDate, index);
}
public boolean insertMapMarkers(double[] latitudes, double[] longitudes,
@ -2355,24 +2576,27 @@ public class OsmandSettings {
}
public boolean updateMapMarker(double latitude, double longitude,
PointDescription historyDescription, int colorIndex, boolean selected) {
return mapMarkersStorage.updatePoint(latitude, longitude, historyDescription, colorIndex, selected);
PointDescription historyDescription, int colorIndex, boolean selected,
long creationDate) {
return mapMarkersStorage.updatePoint(latitude, longitude, historyDescription, colorIndex, selected, creationDate);
}
public boolean moveMapMarker(LatLon latLonEx,
LatLon latLonNew,
PointDescription historyDescription,
int colorIndex,
boolean selected) {
return mapMarkersStorage.movePoint(latLonEx, latLonNew, historyDescription, colorIndex, selected);
boolean selected,
long creationDate) {
return mapMarkersStorage.movePoint(latLonEx, latLonNew, historyDescription, colorIndex, selected, creationDate);
}
public boolean deleteMapMarker(int index) {
return mapMarkersStorage.deletePoint(index);
}
public boolean saveMapMarkers(List<LatLon> ps, List<String> ds, List<Integer> cs, List<Boolean> bs) {
return mapMarkersStorage.savePoints(ps, ds, cs, bs);
public boolean saveMapMarkers(List<LatLon> ps, List<String> ds, List<Integer> cs, List<Boolean> bs,
List<Long> cds) {
return mapMarkersStorage.savePoints(ps, ds, cs, bs, cds);
}
@ -2384,22 +2608,31 @@ public class OsmandSettings {
return mapMarkersHistoryStorage.getPoints();
}
public List<Long> getMapMarkersHistoryCreationDates(int sz) {
return mapMarkersHistoryStorage.getCreationDates(sz);
}
public List<Integer> getMapMarkersHistoryColors(int sz) {
return mapMarkersHistoryStorage.getColors(sz);
}
public boolean insertMapMarkerHistory(double latitude, double longitude,
PointDescription historyDescription, int colorIndex, int index) {
return mapMarkersHistoryStorage.insertPoint(latitude, longitude, historyDescription, index);
PointDescription historyDescription, int colorIndex,
long creationDate, int index) {
return mapMarkersHistoryStorage.insertPoint(latitude, longitude, historyDescription, colorIndex, creationDate, index);
}
public boolean updateMapMarkerHistory(double latitude, double longitude,
PointDescription historyDescription, int colorIndex) {
return mapMarkersHistoryStorage.updatePoint(latitude, longitude, historyDescription);
PointDescription historyDescription, int colorIndex, long creationDate) {
return mapMarkersHistoryStorage.updatePoint(latitude, longitude, historyDescription, colorIndex, creationDate);
}
public boolean deleteMapMarkerHistory(int index) {
return mapMarkersHistoryStorage.deletePoint(index);
}
public boolean saveMapMarkersHistory(List<LatLon> ps, List<String> ds, List<Integer> cs) {
return mapMarkersHistoryStorage.savePoints(ps, ds);
public boolean saveMapMarkersHistory(List<LatLon> ps, List<String> ds, List<Integer> cs, List<Long> cds) {
return mapMarkersHistoryStorage.savePoints(ps, ds, cs, cds);
}

View file

@ -1312,7 +1312,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
Intent intent = getIntent();
if (intent != null && intent.getData() != null) {
Uri data = intent.getData();
if ("http".equalsIgnoreCase(data.getScheme()) && data.getHost() != null && data.getHost().contains("osmand.net") &&
if (("http".equalsIgnoreCase(data.getScheme()) || "https".equalsIgnoreCase(data.getScheme()))&& data.getHost() != null && data.getHost().contains("osmand.net") &&
data.getPath() != null && data.getPath().startsWith("/go")) {
String lat = data.getQueryParameter("lat");
String lon = data.getQueryParameter("lon");

View file

@ -48,6 +48,7 @@ import net.osmand.plus.dashboard.DashboardOnMap.DashboardType;
import net.osmand.plus.dialogs.FavoriteDialogs;
import net.osmand.plus.download.IndexItem;
import net.osmand.plus.liveupdates.OsmLiveActivity;
import net.osmand.plus.mapmarkers.MapMarkersDialogFragment;
import net.osmand.plus.measurementtool.MeasurementToolFragment;
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
@ -623,6 +624,18 @@ public class MapActivityActions implements DialogProvider {
return false;
}
}).createItem());
optionsMenuHelper.addItem(new ItemBuilder().setTitle("New map markers")
.setIcon(R.drawable.ic_action_flag_dark)
.setListener(new ContextMenuAdapter.ItemClickListener() {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int pos, boolean isChecked) {
app.logEvent(mapActivity, "drawer_markers_open");
MapActivity.clearPrevActivityIntent();
MapMarkersDialogFragment.showInstance(mapActivity);
return true;
}
}).createItem());
} else {
optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.waypoints, mapActivity)
.setIcon(R.drawable.ic_action_intermediate)

View file

@ -6,6 +6,7 @@ import android.database.sqlite.SQLiteOpenHelper;
import android.text.format.DateFormat;
import net.osmand.PlatformUtil;
import net.osmand.data.LatLon;
import net.osmand.plus.GPXDatabase.GpxDataItem;
import net.osmand.plus.GPXUtilities;
import net.osmand.plus.GPXUtilities.GPXFile;
import net.osmand.plus.GPXUtilities.GPXTrackAnalysis;
@ -226,6 +227,11 @@ public class SavingTrackHelper extends SQLiteOpenHelper {
warnings.add(warn);
return warnings;
}
GPXFile gpx = data.get(f);
GPXTrackAnalysis analysis = gpx.getAnalysis(fout.lastModified());
GpxDataItem item = new GpxDataItem(fout, analysis);
ctx.getGpxDatabase().add(item);
}
}
}

View file

@ -479,6 +479,7 @@ public class SettingsGeneralActivity extends SettingsBaseActivity implements OnR
}
misc.addPreference(createCheckBoxPreference(settings.DO_NOT_SHOW_STARTUP_MESSAGES, R.string.do_not_show_startup_messages, R.string.do_not_show_startup_messages_desc));
misc.addPreference(createCheckBoxPreference(settings.DO_NOT_USE_ANIMATIONS, R.string.do_not_use_animations, R.string.do_not_use_animations_descr));
misc.addPreference(createCheckBoxPreference(settings.USE_MAGNETIC_FIELD_SENSOR_COMPASS, R.string.use_magnetic_sensor, R.string.use_magnetic_sensor_descr));
}

View file

@ -641,7 +641,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int pos, boolean isChecked) {
recordVideo(latitude, longitude, mapActivity);
recordVideo(latitude, longitude, mapActivity, false);
return true;
}
})
@ -651,7 +651,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
.setListener(new ItemClickListener() {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int pos, boolean isChecked) {
takePhoto(latitude, longitude, mapActivity, false);
takePhoto(latitude, longitude, mapActivity, false, false);
return true;
}
@ -769,9 +769,9 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
private void takeAction(final MapActivity mapActivity, double lon, double lat, int action) {
if (action == AV_DEFAULT_ACTION_VIDEO) {
recordVideo(lat, lon, mapActivity);
recordVideo(lat, lon, mapActivity, false);
} else if (action == AV_DEFAULT_ACTION_TAKEPICTURE) {
takePhoto(lat, lon, mapActivity, false);
takePhoto(lat, lon, mapActivity, false, false);
} else if (action == AV_DEFAULT_ACTION_AUDIO) {
recordAudio(lat, lon, mapActivity);
}
@ -874,8 +874,8 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
}
public void recordVideo(final double lat, final double lon, final MapActivity mapActivity) {
if (AV_EXTERNAL_RECORDER.get()) {
public void recordVideo(final double lat, final double lon, final MapActivity mapActivity, final boolean forceExternal) {
if (AV_EXTERNAL_RECORDER.get() || forceExternal) {
captureVideoExternal(lat, lon, mapActivity);
} else {
if (ActivityCompat.checkSelfPermission(mapActivity, Manifest.permission.CAMERA)
@ -1192,10 +1192,10 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
public void takePhoto(final double lat, final double lon, final MapActivity mapActivity,
final boolean forceInternal) {
final boolean forceInternal, final boolean forceExternal) {
if (ActivityCompat.checkSelfPermission(mapActivity, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
if (!AV_EXTERNAL_PHOTO_CAM.get() || forceInternal) {
if ((!AV_EXTERNAL_PHOTO_CAM.get() || forceInternal) && !forceExternal) {
takePhotoInternalOrExternal(lat, lon, mapActivity);
} else {
takePhotoExternal(lat, lon, mapActivity);

View file

@ -31,7 +31,7 @@ public class TakePhotoNoteAction extends QuickAction {
AudioVideoNotesPlugin plugin = OsmandPlugin.getPlugin(AudioVideoNotesPlugin.class);
if (plugin != null)
plugin.takePhoto(latLon.getLatitude(), latLon.getLongitude(), activity, false);
plugin.takePhoto(latLon.getLatitude(), latLon.getLongitude(), activity, false, false);
}
@Override

View file

@ -31,7 +31,7 @@ public class TakeVideoNoteAction extends QuickAction {
AudioVideoNotesPlugin plugin = OsmandPlugin.getPlugin(AudioVideoNotesPlugin.class);
if (plugin != null)
plugin.recordVideo(latLon.getLatitude(), latLon.getLongitude(), activity);
plugin.recordVideo(latLon.getLatitude(), latLon.getLongitude(), activity, false);
}
@Override

View file

@ -51,11 +51,6 @@ public class SettingsDevelopmentActivity extends SettingsBaseActivity {
cat.addPreference(createCheckBoxPreference(settings.USE_FAST_RECALCULATION,
R.string.use_fast_recalculation, R.string.use_fast_recalculation_desc));
cat.addPreference(createCheckBoxPreference(settings.USE_MAGNETIC_FIELD_SENSOR_COMPASS,
R.string.use_magnetic_sensor,
R.string.use_magnetic_sensor_descr));
final CheckBoxPreference openGlRender = createCheckBoxPreference(settings.USE_OPENGL_RENDER, R.string.use_opengl_render,R.string.use_opengl_render_descr);
cat.addPreference(openGlRender);

View file

@ -285,9 +285,9 @@ public class ExternalApiHelper {
if (API_CMD_RECORD_AUDIO.equals(cmd)) {
plugin.recordAudio(lat, lon, mapActivity);
} else if (API_CMD_RECORD_VIDEO.equals(cmd)) {
plugin.recordVideo(lat, lon, mapActivity);
plugin.recordVideo(lat, lon, mapActivity, false);
} else if (API_CMD_RECORD_PHOTO.equals(cmd)) {
plugin.takePhoto(lat, lon, mapActivity, true);
plugin.takePhoto(lat, lon, mapActivity, true, false);
}
}

View file

@ -467,7 +467,7 @@ public class GpxUiHelper {
final ContextMenuItem item = adapter.getItem(position);
GPXInfo info = list.get(position);
udpateGpxInfoView(v, item, info, getDataItem(info), showCurrentGpx && position == 0, app);
updateGpxInfoView(v, item, info, getDataItem(info), showCurrentGpx && position == 0, app);
if (item.getSelected() == null) {
v.findViewById(R.id.check_item).setVisibility(View.GONE);
@ -704,7 +704,7 @@ public class GpxUiHelper {
return dlg;
}
public static void udpateGpxInfoView(View v, ContextMenuItem item, GPXInfo info, GpxDataItem dataItem, boolean currentlyRecordingTrack, OsmandApplication app) {
public static void updateGpxInfoView(View v, ContextMenuItem item, GPXInfo info, GpxDataItem dataItem, boolean currentlyRecordingTrack, OsmandApplication app) {
TextView viewName = ((TextView) v.findViewById(R.id.name));
viewName.setText(item.getTitle().replace("/", "").trim());
ImageView icon = (ImageView) v.findViewById(R.id.icon);

View file

@ -43,7 +43,6 @@ import net.osmand.plus.views.DirectionDrawable;
import net.osmand.plus.views.controls.DynamicListView;
import net.osmand.plus.views.controls.ListDividerShape;
import net.osmand.plus.views.controls.StableArrayAdapter;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
import java.io.File;
@ -784,37 +783,7 @@ public class MapMarkerDialogHelper {
}
public static Drawable getMapMarkerIcon(OsmandApplication app, int colorIndex) {
return app.getIconsCache().getIcon(R.drawable.ic_action_flag_dark, getMapMarkerColorId(colorIndex));
}
public static int getMapMarkerColorId(int colorIndex) {
int colorId;
switch (colorIndex) {
case 0:
colorId = R.color.marker_blue;
break;
case 1:
colorId = R.color.marker_green;
break;
case 2:
colorId = R.color.marker_orange;
break;
case 3:
colorId = R.color.marker_red;
break;
case 4:
colorId = R.color.marker_yellow;
break;
case 5:
colorId = R.color.marker_teal;
break;
case 6:
colorId = R.color.marker_purple;
break;
default:
colorId = R.color.marker_blue;
}
return colorId;
return app.getIconsCache().getIcon(R.drawable.ic_action_flag_dark, MapMarker.getColorId(colorIndex));
}
public void updateLocation(ListView listView, boolean compassChanged) {
@ -896,7 +865,7 @@ public class MapMarkerDialogHelper {
WptPt wpt = new WptPt();
wpt.lat = marker.getLatitude();
wpt.lon = marker.getLongitude();
wpt.setColor(mapActivity.getResources().getColor(getMapMarkerColorId(marker.colorIndex)));
wpt.setColor(mapActivity.getResources().getColor(MapMarker.getColorId(marker.colorIndex)));
wpt.name = marker.getOnlyName();
//wpt.link = r.getFileName();
//wpt.time = r.getFile().lastModified();

View file

@ -761,6 +761,13 @@ public class WaypointDialogHelper {
public void dismiss() {
if (app.getPoiFilters().isShowingAnyPoi()) {
enableType(running, listAdapter, type, enable);
} else {
running[0] = -1;
if (helperCallbacks != null) {
helperCallbacks.reloadAdapter();
} else {
reloadListAdapter(listAdapter);
}
}
}
});

View file

@ -1251,12 +1251,16 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents {
return false;
}
int slideInAnim = R.anim.slide_in_bottom;
int slideOutAnim = R.anim.slide_out_bottom;
int slideInAnim = 0;
int slideOutAnim = 0;
if (!mapActivity.getMyApplication().getSettings().DO_NOT_USE_ANIMATIONS.get()) {
slideInAnim = R.anim.slide_in_bottom;
slideOutAnim = R.anim.slide_out_bottom;
if (menu.isExtended()) {
slideInAnim = menu.getSlideInAnimation();
slideOutAnim = menu.getSlideOutAnimation();
if (menu.isExtended()) {
slideInAnim = menu.getSlideInAnimation();
slideOutAnim = menu.getSlideOutAnimation();
}
}
MapContextMenuFragment fragment = new MapContextMenuFragment();

View file

@ -13,9 +13,11 @@ import android.webkit.WebView;
import android.widget.LinearLayout;
import android.widget.TextView;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dialogs.DirectionsDialogs;
import net.osmand.plus.mapillary.MapillaryPlugin;
import net.osmand.util.Algorithms;
public class ContextMenuCardDialogFragment extends Fragment {
@ -115,6 +117,14 @@ public class ContextMenuCardDialogFragment extends Fragment {
public void dismiss() {
MapActivity activity = dialog.getMapActivity();
if (activity != null) {
if (dialog.getType() == ContextMenuCardDialog.CardDialogType.MAPILLARY) {
if (!activity.getMyApplication().getSettings().SHOW_MAPILLARY.get()) {
MapillaryPlugin mapillaryPlugin = OsmandPlugin.getPlugin(MapillaryPlugin.class);
if (mapillaryPlugin != null) {
mapillaryPlugin.updateLayers(activity.getMapView(), activity);
}
}
}
try {
activity.getSupportFragmentManager().popBackStack(TAG,
FragmentManager.POP_BACK_STACK_INCLUSIVE);

View file

@ -114,8 +114,13 @@ public class MapMultiSelectionMenuFragment extends Fragment implements AdapterVi
MapMultiSelectionMenu menu = mapActivity.getContextMenu().getMultiSelectionMenu();
int slideInAnim = menu.getSlideInAnimation();
int slideOutAnim = menu.getSlideOutAnimation();
int slideInAnim = 0;
int slideOutAnim = 0;
if (!mapActivity.getMyApplication().getSettings().DO_NOT_USE_ANIMATIONS.get()) {
slideInAnim = menu.getSlideInAnimation();
slideOutAnim = menu.getSlideOutAnimation();
}
MapMultiSelectionMenuFragment fragment = new MapMultiSelectionMenuFragment();
menu.getMapActivity().getSupportFragmentManager().beginTransaction()

View file

@ -3,6 +3,7 @@ package net.osmand.plus.mapillary;
import android.view.View;
import android.view.View.OnClickListener;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard;
@ -21,9 +22,15 @@ public class MapillaryImageCard extends ImageCard {
OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (!getMyApplication().getSettings().SHOW_MAPILLARY.get()) {
MapillaryPlugin mapillaryPlugin = OsmandPlugin.getPlugin(MapillaryPlugin.class);
if (mapillaryPlugin != null) {
mapillaryPlugin.updateLayers(getMapActivity().getMapView(), getMapActivity(), true);
}
}
getMapActivity().getContextMenu().hideMenues();
MapillaryImageDialog.show(getMapActivity(), getKey(), getImageHiresUrl(), getUrl(), getLocation(),
getCa(), getMyApplication().getString(R.string.mapillary), null);
getCa(), getMyApplication().getString(R.string.mapillary), null, true);
}
};
if (!Algorithms.isEmpty(buttonText)) {

View file

@ -80,6 +80,7 @@ public class MapillaryImageDialog extends ContextMenuCardDialog {
private String viewerUrl;
private LatLon latLon;
private double ca = Double.NaN;
private boolean sync;
private View staticImageView;
private View noInternetView;
@ -97,7 +98,7 @@ public class MapillaryImageDialog extends ContextMenuCardDialog {
}
public MapillaryImageDialog(MapActivity mapActivity, String key, String sKey, String imageUrl,
String viewerUrl, LatLon latLon, double ca, String title, String description) {
String viewerUrl, LatLon latLon, double ca, String title, String description, boolean sync) {
super(mapActivity, CardDialogType.MAPILLARY);
this.title = title;
this.description = description;
@ -108,6 +109,7 @@ public class MapillaryImageDialog extends ContextMenuCardDialog {
this.latLon = latLon;
this.ca = ca;
this.ic = mapActivity.getMyApplication().getIconsCache();
this.sync = sync;
}
public String getKey() {
@ -475,7 +477,12 @@ public class MapillaryImageDialog extends ContextMenuCardDialog {
// asking tile image async
boolean imgExist = mgr.tileExistOnFileSystem(tileId, map, tileX, tileY, TILE_ZOOM);
if (imgExist) {
tile = mgr.getGeometryTilesCache().getTileForMapAsync(tileId, map, tileX, tileY, TILE_ZOOM, false);
if (sync) {
tile = mgr.getGeometryTilesCache().getTileForMapSync(tileId, map, tileX, tileY, TILE_ZOOM, false);
sync = false;
} else {
tile = mgr.getGeometryTilesCache().getTileForMapAsync(tileId, map, tileX, tileY, TILE_ZOOM, false);
}
}
if (tile != null) {
tiles.put(tileId, new Pair<>(new QuadPointDouble(tileX, tileY), tile));
@ -492,7 +499,16 @@ public class MapillaryImageDialog extends ContextMenuCardDialog {
String viewerUrl, LatLon latLon, double ca,
String title, String description) {
MapillaryImageDialog dialog = new MapillaryImageDialog(mapActivity, key, null, imageUrl,
viewerUrl, latLon, ca, title, description);
viewerUrl, latLon, ca, title, description, false);
ContextMenuCardDialogFragment.showInstance(dialog);
return dialog;
}
public static MapillaryImageDialog show(MapActivity mapActivity, String key, String imageUrl,
String viewerUrl, LatLon latLon, double ca,
String title, String description, boolean sync) {
MapillaryImageDialog dialog = new MapillaryImageDialog(mapActivity, key, null, imageUrl,
viewerUrl, latLon, ca, title, description, sync);
ContextMenuCardDialogFragment.showInstance(dialog);
return dialog;
}
@ -503,7 +519,7 @@ public class MapillaryImageDialog extends ContextMenuCardDialog {
String viewerUrl = MAPILLARY_VIEWER_URL_TEMPLATE + key;
LatLon latLon = new LatLon(latitude, longitude);
MapillaryImageDialog dialog = new MapillaryImageDialog(mapActivity, key, sKey, imageUrl, viewerUrl,
latLon, ca, title, description);
latLon, ca, title, description, false);
ContextMenuCardDialogFragment.showInstance(dialog);
return dialog;
}

View file

@ -2,7 +2,6 @@ package net.osmand.plus.mapillary;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
@ -36,7 +35,6 @@ import net.osmand.plus.views.mapwidgets.MapWidgetRegistry.MapWidgetRegInfo;
import net.osmand.plus.views.mapwidgets.TextInfoWidget;
import net.osmand.util.Algorithms;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.List;
@ -96,17 +94,21 @@ public class MapillaryPlugin extends OsmandPlugin {
@Override
public void updateLayers(OsmandMapTileView mapView, MapActivity activity) {
updateMapLayers(mapView, activity.getMapLayers());
updateMapLayers(mapView, activity.getMapLayers(), false);
}
private void updateMapLayers(OsmandMapTileView mapView, final MapActivityLayers layers) {
public void updateLayers(OsmandMapTileView mapView, MapActivity activity, boolean force) {
updateMapLayers(mapView, activity.getMapLayers(), force);
}
private void updateMapLayers(OsmandMapTileView mapView, final MapActivityLayers layers, boolean force) {
if (rasterLayer == null || vectorLayer == null) {
createLayers();
}
if (isActive()) {
ITileSource rasterSource = null;
ITileSource vectorSource = null;
if (settings.SHOW_MAPILLARY.get()) {
if (settings.SHOW_MAPILLARY.get() || force) {
rasterSource = settings.getTileSourceByName(TileSourceManager.getMapillaryRasterSource().getName(), false);
vectorSource = settings.getTileSourceByName(TileSourceManager.getMapillaryVectorSource().getName(), false);
}
@ -156,7 +158,7 @@ public class MapillaryPlugin extends OsmandPlugin {
OsmandMapTileView mapView = mapActivity.getMapView();
MapActivityLayers mapLayers = mapActivity.getMapLayers();
settings.SHOW_MAPILLARY.set(!settings.SHOW_MAPILLARY.get());
updateMapLayers(mapView, mapLayers);
updateMapLayers(mapView, mapLayers, false);
ContextMenuItem item = adapter.getItem(pos);
if (item != null) {
item.setSelected(settings.SHOW_MAPILLARY.get());

View file

@ -2,19 +2,170 @@ package net.osmand.plus.mapmarkers;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MapMarkersActiveFragment extends Fragment {
import net.osmand.Location;
import net.osmand.data.LatLon;
import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.OsmAndLocationProvider.OsmAndCompassListener;
import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.MapViewTrackingUtilities;
import net.osmand.plus.dashboard.DashLocationFragment;
import net.osmand.plus.mapmarkers.adapters.MapMarkersActiveAdapter;
import net.osmand.plus.mapmarkers.adapters.MapMarkersActiveAdapter.MapMarkersActiveAdapterListener;
import net.osmand.plus.mapmarkers.adapters.MapMarkersItemTouchHelperCallback;
import net.osmand.util.MapUtils;
public class MapMarkersActiveFragment extends Fragment implements OsmAndCompassListener, OsmAndLocationListener {
private MapMarkersActiveAdapter adapter;
private Location location;
private Float heading;
private boolean locationUpdateStarted;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
TextView textView = new TextView(getContext());
textView.setText("active fragment");
return textView;
final RecyclerView recyclerView = new RecyclerView(getContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
final MapActivity mapActivity = (MapActivity) getActivity();
adapter = new MapMarkersActiveAdapter(mapActivity);
final ItemTouchHelper touchHelper = new ItemTouchHelper(new MapMarkersItemTouchHelperCallback(adapter));
touchHelper.attachToRecyclerView(recyclerView);
adapter.setAdapterListener(new MapMarkersActiveAdapterListener() {
private int fromPosition;
private int toPosition;
@Override
public void onItemClick(View view) {
int pos = recyclerView.indexOfChild(view);
MapMarker marker = adapter.getItem(pos);
mapActivity.getMyApplication().getSettings().setMapLocationToShow(marker.getLatitude(), marker.getLongitude(),
15, marker.getPointDescription(mapActivity), true, marker);
MapActivity.launchMapActivityMoveToTop(mapActivity);
((DialogFragment) getParentFragment()).dismiss();
}
@Override
public void onDragStarted(RecyclerView.ViewHolder holder) {
fromPosition = holder.getAdapterPosition();
touchHelper.startDrag(holder);
}
@Override
public void onDragEnded(RecyclerView.ViewHolder holder) {
toPosition = holder.getAdapterPosition();
if (toPosition >= 0 && fromPosition >= 0 && toPosition != fromPosition) {
mapActivity.getMyApplication().getMapMarkersHelper().saveMapMarkers(adapter.getItems(), null);
}
}
});
recyclerView.setAdapter(adapter);
return recyclerView;
}
@Override
public void onResume() {
super.onResume();
adapter.setScreenOrientation(DashLocationFragment.getScreenOrientation(getActivity()));
startLocationUpdate();
}
@Override
public void onPause() {
super.onPause();
stopLocationUpdate();
}
@Override
public void updateLocation(Location location) {
boolean newLocation = this.location == null && location != null;
boolean locationChanged = this.location != null && location != null
&& this.location.getLatitude() != location.getLatitude()
&& this.location.getLongitude() != location.getLongitude();
if (newLocation || locationChanged) {
this.location = location;
updateLocationUi();
}
}
@Override
public void updateCompassValue(float value) {
// 99 in next line used to one-time initialize arrows (with reference vs. fixed-north direction)
// on non-compass devices
float lastHeading = heading != null ? heading : 99;
heading = value;
if (Math.abs(MapUtils.degreesDiff(lastHeading, heading)) > 5) {
updateLocationUi();
} else {
heading = lastHeading;
}
}
private OsmandApplication getMyApplication() {
if (getActivity() != null) {
return ((MapActivity) getActivity()).getMyApplication();
}
return null;
}
void updateAdapter() {
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
private void updateLocationUi() {
final MapActivity mapActivity = (MapActivity) getActivity();
if (mapActivity != null) {
mapActivity.getMyApplication().runInUIThread(new Runnable() {
@Override
public void run() {
if (location == null) {
location = mapActivity.getMyApplication().getLocationProvider().getLastKnownLocation();
}
MapViewTrackingUtilities utilities = mapActivity.getMapViewTrackingUtilities();
boolean useCenter = !(utilities.isMapLinkedToLocation() && location != null);
adapter.setUseCenter(useCenter);
adapter.setLocation(useCenter ? mapActivity.getMapLocation() : new LatLon(location.getLatitude(), location.getLongitude()));
adapter.setHeading(useCenter ? -mapActivity.getMapRotate() : heading);
adapter.notifyDataSetChanged();
}
});
}
}
void startLocationUpdate() {
OsmandApplication app = getMyApplication();
if (app != null && !locationUpdateStarted) {
locationUpdateStarted = true;
app.getLocationProvider().removeCompassListener(app.getLocationProvider().getNavigationInfo());
app.getLocationProvider().addCompassListener(this);
app.getLocationProvider().addLocationListener(this);
updateLocationUi();
}
}
void stopLocationUpdate() {
OsmandApplication app = getMyApplication();
if (app != null && locationUpdateStarted) {
locationUpdateStarted = false;
app.getLocationProvider().removeLocationListener(this);
app.getLocationProvider().removeCompassListener(this);
app.getLocationProvider().addCompassListener(app.getLocationProvider().getNavigationInfo());
}
}
}

View file

@ -0,0 +1,369 @@
package net.osmand.plus.mapmarkers;
import android.support.annotation.Nullable;
import android.support.v4.util.LongSparseArray;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
import net.osmand.plus.api.SQLiteAPI.SQLiteCursor;
import net.osmand.plus.helpers.SearchHistoryHelper;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
public class MapMarkersDbHelper {
private static final int DB_VERSION = 1;
private static final String DB_NAME = "map_markers_db";
private static final String MARKERS_TABLE_NAME = "map_markers";
private static final String MARKERS_COL_ID = "marker_id";
private static final String MARKERS_COL_LAT = "marker_latitude";
private static final String MARKERS_COL_LON = "marker_longitude";
private static final String MARKERS_COL_DESCRIPTION = "marker_description";
private static final String MARKERS_COL_ACTIVE = "marker_active";
private static final String MARKERS_COL_ADDED = "marker_added";
private static final String MARKERS_COL_VISITED = "marker_visited";
private static final String MARKERS_COL_GROUP_KEY = "group_key";
private static final String MARKERS_COL_COLOR = "marker_color";
private static final String MARKERS_COL_NEXT_KEY = "marker_next_key";
private static final String MARKERS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " +
MARKERS_TABLE_NAME + " (" +
MARKERS_COL_ID + " long PRIMARY KEY, " +
MARKERS_COL_LAT + " double, " +
MARKERS_COL_LON + " double, " +
MARKERS_COL_DESCRIPTION + " TEXT, " +
MARKERS_COL_ACTIVE + " int, " + // 1 = true, 0 = false
MARKERS_COL_ADDED + " long, " +
MARKERS_COL_VISITED + " long, " +
MARKERS_COL_GROUP_KEY + " int, " +
MARKERS_COL_COLOR + " int, " +
MARKERS_COL_NEXT_KEY + " long);";
private static final String MARKERS_TABLE_SELECT = "SELECT " +
MARKERS_COL_ID + ", " +
MARKERS_COL_LAT + ", " +
MARKERS_COL_LON + ", " +
MARKERS_COL_DESCRIPTION + ", " +
MARKERS_COL_ACTIVE + ", " +
MARKERS_COL_ADDED + ", " +
MARKERS_COL_VISITED + ", " +
MARKERS_COL_GROUP_KEY + ", " +
MARKERS_COL_COLOR + ", " +
MARKERS_COL_NEXT_KEY +
" FROM " + MARKERS_TABLE_NAME;
private static final String GROUPS_TABLE_NAME = "map_markers_groups";
private static final String GROUPS_COL_NAME = "group_name";
private static final String GROUPS_COL_TYPE = "group_type";
private static final String GROUPS_COL_ADDED = "group_added";
private static final String GROUPS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " +
GROUPS_TABLE_NAME + " (" +
GROUPS_COL_NAME + " TEXT, " +
GROUPS_COL_TYPE + " TEXT, " +
GROUPS_COL_ADDED + " long);";
private static final int TAIL_NEXT_VALUE = 0;
private static final int HISTORY_NEXT_VALUE = -1;
private final OsmandApplication context;
public MapMarkersDbHelper(OsmandApplication context) {
this.context = context;
}
private SQLiteConnection openConnection(boolean readonly) {
SQLiteConnection conn = context.getSQLiteAPI().getOrCreateDatabase(DB_NAME, readonly);
int version = conn.getVersion();
if (version == 0 || DB_VERSION != version) {
if (readonly) {
conn.close();
conn = context.getSQLiteAPI().getOrCreateDatabase(DB_NAME, false);
}
version = conn.getVersion();
conn.setVersion(DB_VERSION);
if (version == 0) {
onCreate(conn);
} else {
onUpgrade(conn, version, DB_VERSION);
}
}
return conn;
}
private void onCreate(SQLiteConnection db) {
db.execSQL(MARKERS_TABLE_CREATE);
db.execSQL(GROUPS_TABLE_CREATE);
saveExistingMarkersToDb();
}
private void onUpgrade(SQLiteConnection db, int oldVersion, int newVersion) {
}
private void saveExistingMarkersToDb() {
OsmandSettings settings = context.getSettings();
List<LatLon> ips = settings.getMapMarkersPoints();
List<String> desc = settings.getMapMarkersPointDescriptions(ips.size());
List<Integer> colors = settings.getMapMarkersColors(ips.size());
int colorIndex = 0;
for (int i = 0; i < ips.size(); i++) {
if (colors.size() > i) {
colorIndex = colors.get(i);
}
MapMarker marker = new MapMarker(ips.get(i), PointDescription.deserializeFromString(desc.get(i), ips.get(i)),
colorIndex, false, i);
marker.history = false;
addMapMarker(marker);
}
ips = settings.getMapMarkersHistoryPoints();
desc = settings.getMapMarkersHistoryPointDescriptions(ips.size());
colors = settings.getMapMarkersHistoryColors(ips.size());
for (int i = 0; i < ips.size(); i++) {
if (colors.size() > i) {
colorIndex = colors.get(i);
}
MapMarker marker = new MapMarker(ips.get(i), PointDescription.deserializeFromString(desc.get(i), ips.get(i)),
colorIndex, false, i);
marker.history = true;
addMapMarker(marker);
}
}
public void addMapMarker(MapMarker marker) {
SQLiteConnection db = openConnection(false);
if (db != null) {
try {
insertLast(db, marker);
} finally {
db.close();
}
}
}
private void insertLast(SQLiteConnection db, MapMarker marker) {
long currentTime = System.currentTimeMillis();
marker.id = Long.parseLong(String.valueOf(currentTime) + String.valueOf(new Random().nextInt(900) + 100));
marker.creationDate = currentTime;
double lat = marker.getLatitude();
double lon = marker.getLongitude();
String descr = PointDescription.serializeToString(marker.getOriginalPointDescription());
int active = marker.history ? 0 : 1;
long visited = 0;
int groupKey = 0;
int colorIndex = marker.colorIndex;
PointDescription pointDescription = marker.getOriginalPointDescription();
if (pointDescription != null && !pointDescription.isSearchingAddress(context)) {
SearchHistoryHelper.getInstance(context)
.addNewItemToHistory(marker.getLatitude(), marker.getLongitude(), pointDescription);
}
if (!marker.history) {
db.execSQL("UPDATE " + MARKERS_TABLE_NAME + " SET " + MARKERS_COL_NEXT_KEY + " = ? " +
"WHERE " + MARKERS_COL_NEXT_KEY + " = ?", new Object[]{marker.id, TAIL_NEXT_VALUE});
}
db.execSQL("INSERT INTO " + MARKERS_TABLE_NAME + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
new Object[]{marker.id, lat, lon, descr, active, currentTime, visited, groupKey, colorIndex,
marker.history ? HISTORY_NEXT_VALUE : TAIL_NEXT_VALUE});
}
public List<MapMarker> getMapMarkers() {
List<MapMarker> res = new LinkedList<>();
LongSparseArray<MapMarker> markers = new LongSparseArray<>();
SQLiteConnection db = openConnection(true);
if (db != null) {
try {
SQLiteCursor query = db.rawQuery(MARKERS_TABLE_SELECT + " WHERE " + MARKERS_COL_ACTIVE + " = ?",
new String[]{String.valueOf(1)});
if (query.moveToFirst()) {
do {
MapMarker marker = readItem(query);
markers.put(marker.nextKey, marker);
} while (query.moveToNext());
}
query.close();
} finally {
db.close();
}
buildLinkedList(markers, res, markers.get(TAIL_NEXT_VALUE));
}
return res;
}
private MapMarker readItem(SQLiteCursor query) {
long id = query.getLong(0);
double lat = query.getDouble(1);
double lon = query.getDouble(2);
String desc = query.getString(3);
boolean active = query.getInt(4) == 1;
long added = query.getLong(5);
long visited = query.getLong(6);
int groupKey = query.getInt(7);
int colorIndex = query.getInt(8);
long nextKey = query.getLong(9);
LatLon latLon = new LatLon(lat, lon);
MapMarker marker = new MapMarker(latLon, PointDescription.deserializeFromString(desc, latLon),
colorIndex, false, 0);
marker.creationDate = added;
marker.visitedDate = visited;
marker.history = !active;
marker.nextKey = nextKey;
marker.id = id;
return marker;
}
private void buildLinkedList(LongSparseArray<MapMarker> markers, List<MapMarker> res, MapMarker marker) {
if (marker != null) {
res.add(0, marker);
MapMarker prev = markers.get(marker.id);
if (prev != null) {
buildLinkedList(markers, res, prev);
}
}
}
public void updateMapMarker(MapMarker marker) {
SQLiteConnection db = openConnection(false);
if (db != null) {
try {
String descr = PointDescription.serializeToString(marker.getOriginalPointDescription());
db.execSQL("UPDATE " + MARKERS_TABLE_NAME + " SET " +
MARKERS_COL_LAT + " = ?, " +
MARKERS_COL_LON + " = ?, " +
MARKERS_COL_DESCRIPTION + " = ?, " +
MARKERS_COL_COLOR + " = ? " +
"WHERE " + MARKERS_COL_ID + " = ?",
new Object[]{marker.getLatitude(), marker.getLongitude(), descr, marker.colorIndex, marker.id});
} finally {
db.close();
}
}
}
public void moveMapMarker(MapMarker moved, @Nullable MapMarker next) {
SQLiteConnection db = openConnection(false);
if (db != null) {
try {
db.execSQL("UPDATE " + MARKERS_TABLE_NAME + " SET " + MARKERS_COL_NEXT_KEY + " = ? " +
"WHERE " + MARKERS_COL_NEXT_KEY + " = ?", new Object[]{moved.nextKey, moved.id});
db.execSQL("UPDATE " + MARKERS_TABLE_NAME + " SET " + MARKERS_COL_NEXT_KEY + " = ? " +
"WHERE " + MARKERS_COL_NEXT_KEY + " = ?", new Object[]{moved.id, next == null ? TAIL_NEXT_VALUE : next.id});
db.execSQL("UPDATE " + MARKERS_TABLE_NAME + " SET " + MARKERS_COL_NEXT_KEY + " = ? " +
"WHERE " + MARKERS_COL_ID + " = ?", new Object[]{next == null ? TAIL_NEXT_VALUE : next.id, moved.id});
} finally {
db.close();
}
}
}
public void removeMapMarker(MapMarker marker) {
SQLiteConnection db = openConnection(false);
if (db != null) {
try {
marker.visitedDate = System.currentTimeMillis();
db.execSQL("UPDATE " + MARKERS_TABLE_NAME + " SET " + MARKERS_COL_NEXT_KEY + " = ? " +
"WHERE " + MARKERS_COL_NEXT_KEY + " = ?", new Object[]{marker.nextKey, marker.id});
db.execSQL("UPDATE " + MARKERS_TABLE_NAME + " SET " +
MARKERS_COL_ACTIVE + " = ? " +
MARKERS_COL_VISITED + " = ? " +
"WHERE " + MARKERS_COL_ID + " = ?", new Object[]{0, marker.visitedDate, marker.id});
} finally {
db.close();
}
}
}
public void removeAllActiveMapMarkers() {
SQLiteConnection db = openConnection(false);
if (db != null) {
try {
db.execSQL("UPDATE " + MARKERS_TABLE_NAME + " SET " + MARKERS_COL_ACTIVE + " = ? " +
"WHERE " + MARKERS_COL_ACTIVE + " = ?", new Object[]{0, 1});
} finally {
db.close();
}
}
}
public void restoreMapMarkerFromHistory(MapMarker marker) {
if (!marker.history) {
return;
}
SQLiteConnection db = openConnection(false);
if (db != null) {
try {
db.execSQL("UPDATE " + MARKERS_TABLE_NAME + " SET " +
MARKERS_COL_ACTIVE + " = ?, " +
MARKERS_COL_NEXT_KEY + " = ? " +
"WHERE " + MARKERS_COL_ID + " = ?",
new Object[]{1, getMapMarkers().get(0).id, marker.id});
} finally {
db.close();
}
}
}
public List<MapMarker> getMapMarkersHistory() {
List<MapMarker> markers = new LinkedList<>();
SQLiteConnection db = openConnection(true);
if (db != null) {
try {
SQLiteCursor query = db.rawQuery(MARKERS_TABLE_SELECT + " WHERE " + MARKERS_COL_ACTIVE + " = ?",
new String[]{String.valueOf(0)});
if (query.moveToFirst()) {
do {
markers.add(readItem(query));
} while (query.moveToNext());
}
query.close();
} finally {
db.close();
}
}
return markers;
}
public void removeMapMarkerHistory(MapMarker marker) {
if (!marker.history) {
return;
}
SQLiteConnection db = openConnection(true);
if (db != null) {
try {
db.execSQL("DELETE FROM " + MARKERS_TABLE_NAME + " WHERE " + MARKERS_COL_ID + " = ?",
new Object[]{marker.id});
} finally {
db.close();
}
}
}
public void removeAllMapMarkersHistory() {
SQLiteConnection db = openConnection(true);
if (db != null) {
try {
db.execSQL("DELETE FROM " + MARKERS_TABLE_NAME + " WHERE " + MARKERS_COL_ACTIVE + " = ?",
new Object[]{0});
} finally {
db.close();
}
}
}
}

View file

@ -19,6 +19,7 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapmarkers.MarkerOptionsBottomSheetDialogFragment.MarkerOptionsFragmentListener;
import java.util.Arrays;
import java.util.List;
@ -39,6 +40,12 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
FragmentManager fragmentManager = getChildFragmentManager();
Fragment markerOptionsFragment = fragmentManager.findFragmentByTag(MarkerOptionsBottomSheetDialogFragment.TAG);
if (markerOptionsFragment != null) {
((MarkerOptionsBottomSheetDialogFragment) markerOptionsFragment).setListener(createMarkerOptionsFragmentListener());
}
View mainView = inflater.inflate(R.layout.fragment_map_markers_dialog, container);
Toolbar toolbar = (Toolbar) mainView.findViewById(R.id.map_markers_toolbar);
@ -49,16 +56,20 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm
dismiss();
}
});
mainView.findViewById(R.id.options_button).setOnClickListener(new View.OnClickListener() {
final View optionsButton = mainView.findViewById(R.id.options_button);
optionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getContext(), "Options", Toast.LENGTH_SHORT).show();
MarkerOptionsBottomSheetDialogFragment fragment = new MarkerOptionsBottomSheetDialogFragment();
fragment.setListener(createMarkerOptionsFragmentListener());
fragment.show(getChildFragmentManager(), MarkerOptionsBottomSheetDialogFragment.TAG);
}
});
final LockableViewPager viewPager = mainView.findViewById(R.id.map_markers_view_pager);
viewPager.setSwipeLocked(true);
viewPager.setAdapter(new MapMarkersViewPagerAdapter(getChildFragmentManager()));
final MapMarkersViewPagerAdapter adapter = new MapMarkersViewPagerAdapter(getChildFragmentManager());
viewPager.setAdapter(adapter);
BottomNavigationView bottomNav = mainView.findViewById(R.id.map_markers_bottom_navigation);
bottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@ -66,10 +77,20 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.action_active:
((MapMarkersActiveFragment) adapter.getItem(0)).startLocationUpdate();
if (viewPager.getCurrentItem() != 0) {
((MapMarkersActiveFragment) adapter.getItem(0)).updateAdapter();
}
viewPager.setCurrentItem(0);
optionsButton.setVisibility(View.VISIBLE);
return true;
case R.id.action_history:
((MapMarkersActiveFragment) adapter.getItem(0)).stopLocationUpdate();
if (viewPager.getCurrentItem() != 1) {
((MapMarkersHistoryFragment) adapter.getItem(1)).updateAdapter();
}
viewPager.setCurrentItem(1);
optionsButton.setVisibility(View.GONE);
return true;
}
return false;
@ -83,6 +104,36 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm
return (OsmandApplication) getActivity().getApplication();
}
private MarkerOptionsFragmentListener createMarkerOptionsFragmentListener() {
return new MarkerOptionsFragmentListener() {
@Override
public void sortByOnClick() {
Toast.makeText(getContext(), "Sort by", Toast.LENGTH_SHORT).show();
}
@Override
public void showDirectionOnClick() {
Toast.makeText(getContext(), "Show direction", Toast.LENGTH_SHORT).show();
}
@Override
public void buildRouteOnClick() {
Toast.makeText(getContext(), "Build route", Toast.LENGTH_SHORT).show();
}
@Override
public void saveAsNewTrackOnClick() {
Toast.makeText(getContext(), "Save as new track", Toast.LENGTH_SHORT).show();
}
@Override
public void moveAllToHistoryOnClick() {
Toast.makeText(getContext(), "Move all to history", Toast.LENGTH_SHORT).show();
}
};
}
public static boolean showInstance(@NonNull MapActivity mapActivity) {
try {
if (mapActivity.isActivityDestroyed()) {

View file

@ -2,19 +2,51 @@ package net.osmand.plus.mapmarkers;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import net.osmand.data.PointDescription;
import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapmarkers.adapters.MapMarkersHistoryAdapter;
public class MapMarkersHistoryFragment extends Fragment {
MapMarkersHistoryAdapter adapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
TextView textView = new TextView(getContext());
textView.setText("history fragment");
return textView;
final RecyclerView recyclerView = new RecyclerView(getContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
final MapActivity mapActivity = (MapActivity) getActivity();
adapter = new MapMarkersHistoryAdapter(mapActivity.getMyApplication());
adapter.setAdapterListener(new MapMarkersHistoryAdapter.MapMarkersHistoryAdapterListener() {
@Override
public void onItemClick(View view) {
int pos = recyclerView.indexOfChild(view);
MapMarker marker = adapter.getItem(pos);
mapActivity.getMyApplication().getSettings().setMapLocationToShow(marker.getLatitude(), marker.getLongitude(),
15, new PointDescription(PointDescription.POINT_TYPE_LOCATION, marker.getPointDescription(mapActivity).getName()),
false, null);
MapActivity.launchMapActivityMoveToTop(mapActivity);
((DialogFragment) getParentFragment()).dismiss();
}
});
recyclerView.setAdapter(adapter);
return recyclerView;
}
void updateAdapter() {
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
}

View file

@ -0,0 +1,169 @@
package net.osmand.plus.mapmarkers;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import net.osmand.AndroidUtils;
import net.osmand.plus.R;
import net.osmand.plus.base.BottomSheetDialogFragment;
import net.osmand.plus.helpers.AndroidUiHelper;
public class MarkerOptionsBottomSheetDialogFragment extends BottomSheetDialogFragment {
public final static String TAG = "MarkerOptionsBottomSheetDialogFragment";
private MarkerOptionsFragmentListener listener;
private boolean portrait;
public void setListener(MarkerOptionsFragmentListener listener) {
this.listener = listener;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
portrait = AndroidUiHelper.isOrientationPortrait(getActivity());
final View mainView = inflater.inflate(R.layout.fragment_marker_options_bottom_sheet_dialog, container);
if (portrait) {
AndroidUtils.setBackground(getActivity(), mainView, false, R.drawable.bg_bottom_menu_light, R.drawable.bg_bottom_menu_dark);
}
((ImageView) mainView.findViewById(R.id.sort_by_icon))
.setImageDrawable(getIcon(R.drawable.ic_sort_waypoint_dark, R.color.on_map_icon_color));
((ImageView) mainView.findViewById(R.id.show_direction_icon))
.setImageDrawable(getIcon(R.drawable.ic_sort_waypoint_dark, R.color.on_map_icon_color));
((ImageView) mainView.findViewById(R.id.build_route_icon))
.setImageDrawable(getIcon(R.drawable.map_directions, R.color.on_map_icon_color));
((ImageView) mainView.findViewById(R.id.save_as_new_track_icon))
.setImageDrawable(getIcon(R.drawable.ic_action_polygom_dark, R.color.on_map_icon_color));
((ImageView) mainView.findViewById(R.id.move_all_to_history_icon))
.setImageDrawable(getIcon(R.drawable.ic_action_history2, R.color.on_map_icon_color));
((TextView) mainView.findViewById(R.id.show_direction_text_view)).setText("Top bar");
mainView.findViewById(R.id.sort_by_row).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
listener.sortByOnClick();
}
dismiss();
}
});
mainView.findViewById(R.id.show_direction_row).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
listener.showDirectionOnClick();
}
dismiss();
}
});
mainView.findViewById(R.id.build_route_row).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
listener.buildRouteOnClick();
}
dismiss();
}
});
mainView.findViewById(R.id.save_as_new_track_row).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
listener.saveAsNewTrackOnClick();
}
dismiss();
}
});
mainView.findViewById(R.id.move_all_to_history_row).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
listener.moveAllToHistoryOnClick();
}
dismiss();
}
});
mainView.findViewById(R.id.cancel_row).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dismiss();
}
});
final int screenHeight = AndroidUtils.getScreenHeight(getActivity());
final int statusBarHeight = AndroidUtils.getStatusBarHeight(getActivity());
final int navBarHeight = AndroidUtils.getNavBarHeight(getActivity());
mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
final View scrollView = mainView.findViewById(R.id.marker_options_scroll_view);
int scrollViewHeight = scrollView.getHeight();
int dividerHeight = AndroidUtils.dpToPx(getContext(), 1);
int cancelButtonHeight = getContext().getResources().getDimensionPixelSize(R.dimen.measure_distance_bottom_sheet_cancel_button_height);
int spaceForScrollView = screenHeight - statusBarHeight - navBarHeight - dividerHeight - cancelButtonHeight;
if (scrollViewHeight > spaceForScrollView) {
scrollView.getLayoutParams().height = spaceForScrollView;
scrollView.requestLayout();
}
if (!portrait) {
if (screenHeight - statusBarHeight - mainView.getHeight()
>= AndroidUtils.dpToPx(getActivity(), 8)) {
AndroidUtils.setBackground(getActivity(), mainView, false,
R.drawable.bg_bottom_sheet_topsides_landscape_light, R.drawable.bg_bottom_sheet_topsides_landscape_dark);
} else {
AndroidUtils.setBackground(getActivity(), mainView, false,
R.drawable.bg_bottom_sheet_sides_landscape_light, R.drawable.bg_bottom_sheet_sides_landscape_dark);
}
}
ViewTreeObserver obs = mainView.getViewTreeObserver();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
obs.removeOnGlobalLayoutListener(this);
} else {
obs.removeGlobalOnLayoutListener(this);
}
}
});
return mainView;
}
@Override
public void onStart() {
super.onStart();
if (!portrait) {
final Window window = getDialog().getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.width = getActivity().getResources().getDimensionPixelSize(R.dimen.landscape_bottom_sheet_dialog_fragment_width);
window.setAttributes(params);
}
}
interface MarkerOptionsFragmentListener {
void sortByOnClick();
void showDirectionOnClick();
void buildRouteOnClick();
void saveAsNewTrackOnClick();
void moveAllToHistoryOnClick();
}
}

View file

@ -0,0 +1,33 @@
package net.osmand.plus.mapmarkers.adapters;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import net.osmand.plus.R;
public class MapMarkerItemViewHolder extends RecyclerView.ViewHolder {
final ImageView iconDirection;
final ImageView iconReorder;
final ImageView icon;
final TextView title;
final TextView distance;
final TextView point;
final TextView description;
final ImageButton optionsBtn;
public MapMarkerItemViewHolder(View view) {
super(view);
iconDirection = (ImageView) view.findViewById(R.id.map_marker_direction_icon);
iconReorder = (ImageView) view.findViewById(R.id.map_marker_reorder_icon);
icon = (ImageView) view.findViewById(R.id.map_marker_icon);
title = (TextView) view.findViewById(R.id.map_marker_title);
distance = (TextView) view.findViewById(R.id.map_marker_distance);
point = (TextView) view.findViewById(R.id.map_marker_point_text_view);
description = (TextView) view.findViewById(R.id.map_marker_description);
optionsBtn = (ImageButton) view.findViewById(R.id.map_marker_options_button);
}
}

View file

@ -0,0 +1,166 @@
package net.osmand.plus.mapmarkers.adapters;
import android.support.design.widget.Snackbar;
import android.support.v4.view.MotionEventCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import net.osmand.data.LatLon;
import net.osmand.plus.IconsCache;
import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dashboard.DashLocationFragment;
import java.util.Collections;
import java.util.List;
public class MapMarkersActiveAdapter extends RecyclerView.Adapter<MapMarkerItemViewHolder>
implements MapMarkersItemTouchHelperCallback.ItemTouchHelperAdapter {
private MapActivity mapActivity;
private List<MapMarker> markers;
private MapMarkersActiveAdapterListener listener;
private LatLon location;
private Float heading;
private boolean useCenter;
private int screenOrientation;
public MapMarkersActiveAdapter(MapActivity mapActivity) {
this.mapActivity = mapActivity;
markers = mapActivity.getMyApplication().getMapMarkersHelper().getMapMarkers();
}
public void setAdapterListener(MapMarkersActiveAdapterListener listener) {
this.listener = listener;
}
public void setLocation(LatLon location) {
this.location = location;
}
public void setHeading(Float heading) {
this.heading = heading;
}
public void setUseCenter(boolean useCenter) {
this.useCenter = useCenter;
}
public void setScreenOrientation(int screenOrientation) {
this.screenOrientation = screenOrientation;
}
@Override
public MapMarkerItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.map_marker_item_new, viewGroup, false);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClick(view);
}
});
return new MapMarkerItemViewHolder(view);
}
@Override
public void onBindViewHolder(final MapMarkerItemViewHolder holder, int pos) {
IconsCache iconsCache = mapActivity.getMyApplication().getIconsCache();
MapMarker marker = markers.get(pos);
holder.iconReorder.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_reorder));
holder.iconReorder.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
listener.onDragStarted(holder);
}
return false;
}
});
int color = MapMarker.getColorId(marker.colorIndex);
holder.icon.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_flag_dark, color));
holder.title.setText(marker.getName(mapActivity));
holder.description.setText(marker.creationDate + "");
holder.optionsBtn.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_remove_dark));
holder.optionsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final int position = holder.getAdapterPosition();
if (position < 0) {
return;
}
final MapMarker marker = markers.get(position);
final boolean[] undone = new boolean[1];
mapActivity.getMyApplication().getMapMarkersHelper().removeMapMarker(marker.index);
notifyItemRemoved(position);
Snackbar.make(holder.itemView, R.string.item_removed, Snackbar.LENGTH_LONG)
.setAction(R.string.shared_string_undo, new View.OnClickListener() {
@Override
public void onClick(View view) {
undone[0] = true;
mapActivity.getMyApplication().getMapMarkersHelper().addMapMarker(marker, position);
notifyItemInserted(position);
}
})
.addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
if (!undone[0]) {
mapActivity.getMyApplication().getMapMarkersHelper().addMapMarkerHistory(marker);
}
}
}).show();
}
});
DashLocationFragment.updateLocationView(useCenter, location,
heading, holder.iconDirection, holder.distance,
marker.getLatitude(), marker.getLongitude(),
screenOrientation, mapActivity.getMyApplication(), mapActivity);
}
@Override
public int getItemCount() {
return markers.size();
}
public MapMarker getItem(int position) {
return markers.get(position);
}
public List<MapMarker> getItems() {
return markers;
}
@Override
public boolean onItemMove(int from, int to) {
Collections.swap(markers, from, to);
notifyItemMoved(from, to);
return true;
}
@Override
public void onItemDismiss(RecyclerView.ViewHolder holder) {
listener.onDragEnded(holder);
}
public interface MapMarkersActiveAdapterListener {
void onItemClick(View view);
void onDragStarted(RecyclerView.ViewHolder holder);
void onDragEnded(RecyclerView.ViewHolder holder);
}
}

View file

@ -0,0 +1,83 @@
package net.osmand.plus.mapmarkers.adapters;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import net.osmand.plus.IconsCache;
import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import java.util.List;
public class MapMarkersHistoryAdapter extends RecyclerView.Adapter<MapMarkerItemViewHolder> {
private OsmandApplication app;
private List<MapMarker> markers;
private MapMarkersHistoryAdapterListener listener;
public MapMarkersHistoryAdapter(OsmandApplication app) {
this.app = app;
markers = app.getMapMarkersHelper().getMapMarkersHistory();
}
public void setAdapterListener(MapMarkersHistoryAdapterListener listener) {
this.listener = listener;
}
@Override
public MapMarkerItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.map_marker_item_new, viewGroup, false);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClick(view);
}
});
return new MapMarkerItemViewHolder(view);
}
@Override
public void onBindViewHolder(final MapMarkerItemViewHolder holder, int pos) {
IconsCache iconsCache = app.getIconsCache();
MapMarker marker = markers.get(pos);
holder.iconReorder.setVisibility(View.GONE);
int color = MapMarker.getColorId(marker.colorIndex);
holder.icon.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_flag_dark, color));
holder.title.setText(marker.getName(app));
holder.optionsBtn.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_refresh_dark));
holder.optionsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = holder.getAdapterPosition();
if (position < 0) {
return;
}
MapMarker marker = markers.get(position);
app.getMapMarkersHelper().removeMapMarkerHistory(marker);
app.getMapMarkersHelper().addMapMarker(marker, 0);
notifyItemRemoved(position);
}
});
}
@Override
public int getItemCount() {
return markers.size();
}
public MapMarker getItem(int position) {
return markers.get(position);
}
public interface MapMarkersHistoryAdapterListener {
void onItemClick(View view);
}
}

View file

@ -0,0 +1,52 @@
package net.osmand.plus.mapmarkers.adapters;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
public class MapMarkersItemTouchHelperCallback extends ItemTouchHelper.Callback {
private final ItemTouchHelperAdapter adapter;
public MapMarkersItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
this.adapter = adapter;
}
@Override
public boolean isLongPressDragEnabled() {
return false;
}
@Override
public boolean isItemViewSwipeEnabled() {
return false;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
return makeMovementFlags(dragFlags, 0);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
return adapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition());
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int i) {
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
adapter.onItemDismiss(viewHolder);
}
interface ItemTouchHelperAdapter {
boolean onItemMove(int from, int to);
void onItemDismiss(RecyclerView.ViewHolder holder);
}
}

View file

@ -180,8 +180,10 @@ public class MeasurementEditingContext {
before.points.clear();
after.points.clear();
if (inSnapToRoadMode) {
beforeCacheForSnap.points.clear();
afterCacheForSnap.points.clear();
if (beforeCacheForSnap != null && afterCacheForSnap != null) {
beforeCacheForSnap.points.clear();
afterCacheForSnap.points.clear();
}
needUpdateCacheForSnap = true;
} else {
beforeCacheForSnap = null;

View file

@ -1395,7 +1395,7 @@ public class MeasurementToolFragment extends Fragment {
hidePointsList();
return;
}
if (editingCtx.getPointsCount() < 1 || saved) {
if (editingCtx.getPointsCount() == 0 || saved) {
dismiss(mapActivity);
return;
}
@ -1410,21 +1410,25 @@ public class MeasurementToolFragment extends Fragment {
builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final String name = new SimpleDateFormat("yyyy-MM-dd_HH-mm_EEE", Locale.US).format(new Date());
String fileName = name + GPX_SUFFIX;
File fout = new File(dir, fileName);
int ind = 1;
while (fout.exists()) {
fileName = name + "_" + (++ind) + GPX_SUFFIX;
fout = new File(dir, fileName);
}
SaveType saveType;
if (editingCtx.isInSnapToRoadMode()) {
saveType = SaveType.SNAP_TO_ROAD;
if (showOnMapToggle.isChecked()) {
final String name = new SimpleDateFormat("yyyy-MM-dd_HH-mm_EEE", Locale.US).format(new Date());
String fileName = name + GPX_SUFFIX;
File fout = new File(dir, fileName);
int ind = 1;
while (fout.exists()) {
fileName = name + "_" + (++ind) + GPX_SUFFIX;
fout = new File(dir, fileName);
}
SaveType saveType;
if (editingCtx.isInSnapToRoadMode()) {
saveType = SaveType.SNAP_TO_ROAD;
} else {
saveType = SaveType.LINE;
}
saveNewGpx(dir, fileName, true, saveType, true);
} else {
saveType = SaveType.LINE;
dismiss(mapActivity);
}
saveNewGpx(dir, fileName, showOnMapToggle.isChecked(), saveType, true);
}
});
} else {
@ -1441,12 +1445,7 @@ public class MeasurementToolFragment extends Fragment {
}
builder.setTitle(getString(R.string.exit_without_saving))
.setMessage(getString(R.string.unsaved_changes_will_be_lost))
.setNegativeButton(R.string.shared_string_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dismiss(mapActivity);
}
});
.setNegativeButton(R.string.shared_string_cancel, null);
builder.show();
}
}

View file

@ -212,8 +212,9 @@ public class AnimateDraggingMapThread {
}
final float mMoveX = rb.getPixXFromLatLon(startLat, startLon) - rb.getPixXFromLatLon(finalLat, finalLon);
final float mMoveY = rb.getPixYFromLatLon(startLat, startLon) - rb.getPixYFromLatLon(finalLat, finalLon);
final float animationTime = Math.max(450, (Math.abs(mStX) + Math.abs(mStY)) / 1200f * MOVE_MOVE_ANIMATION_TIME);
final boolean doNotUseAnimations = tileView.getSettings().DO_NOT_USE_ANIMATIONS.get();
final float animationTime = doNotUseAnimations ? 0 : Math.max(450, (Math.abs(mStX) + Math.abs(mStY)) / 1200f * MOVE_MOVE_ANIMATION_TIME);
startThreadAnimating(new Runnable() {
@ -221,7 +222,7 @@ public class AnimateDraggingMapThread {
public void run() {
setTargetValues(endZoom, finalLat, finalLon);
if(moveZoom != startZoom){
animatingZoomInThread(startZoom, startZoomFP, moveZoom, startZoomFP,ZOOM_MOVE_ANIMATION_TIME, notifyListener);
animatingZoomInThread(startZoom, startZoomFP, moveZoom, startZoomFP, doNotUseAnimations ? 0 : ZOOM_MOVE_ANIMATION_TIME, notifyListener);
}
if(!stopped){
@ -232,7 +233,7 @@ public class AnimateDraggingMapThread {
}
if (!stopped && (moveZoom != endZoom || startZoomFP != 0)) {
animatingZoomInThread(moveZoom, startZoomFP, endZoom, 0, ZOOM_MOVE_ANIMATION_TIME, notifyListener);
animatingZoomInThread(moveZoom, startZoomFP, endZoom, 0, doNotUseAnimations ? 0 : ZOOM_MOVE_ANIMATION_TIME, notifyListener);
}
tileView.setFractionalZoom(endZoom, 0, notifyListener);
@ -345,7 +346,8 @@ public class AnimateDraggingMapThread {
}
public void startZooming(final int zoomEnd, final double zoomPart, final boolean notifyListener){
final float animationTime = ZOOM_ANIMATION_TIME;
boolean doNotUseAnimations = tileView.getSettings().DO_NOT_USE_ANIMATIONS.get();
final float animationTime = doNotUseAnimations ? 0 : ZOOM_ANIMATION_TIME;
startThreadAnimating(new Runnable(){
@Override
public void run() {

Some files were not shown because too many files have changed in this diff Show more