Merge branch 'master' into FIx_8032_Customize_fav_icons_tmp
# Conflicts: # OsmAnd/res/layout/favorites_list_item.xml
|
@ -42,7 +42,7 @@ public class IndexConstants {
|
|||
|
||||
public static final String OSMAND_SETTINGS_FILE_EXT = ".osf";
|
||||
|
||||
public static final String ROUTING_FILE_EXT = ".xml";
|
||||
public static final String ROUTING_AND_RENDERING_FILE_EXT = ".xml";
|
||||
|
||||
public static final String RENDERER_INDEX_EXT = ".render.xml"; //$NON-NLS-1$
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@ public class Amenity extends MapObject {
|
|||
public static final String CONTENT = "content";
|
||||
public static final String CUISINE = "cuisine";
|
||||
public static final String DISH = "dish";
|
||||
public static final String REF = "ref";
|
||||
public static final String OSM_DELETE_VALUE = "delete";
|
||||
public static final String OSM_DELETE_TAG = "osmand_change";
|
||||
|
||||
|
|
242
OsmAnd-java/src/main/java/net/osmand/data/Multipolygon.java
Normal file
|
@ -0,0 +1,242 @@
|
|||
package net.osmand.data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.vividsolutions.jts.geom.GeometryFactory;
|
||||
import com.vividsolutions.jts.geom.LinearRing;
|
||||
import com.vividsolutions.jts.geom.MultiPolygon;
|
||||
import com.vividsolutions.jts.geom.Polygon;
|
||||
import net.osmand.osm.edit.Node;
|
||||
import net.osmand.osm.edit.OsmMapUtils;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
public class Multipolygon {
|
||||
private List<Ring> innerRings, outerRings;
|
||||
private Map<Ring, Set<Ring>> containedInnerInOuter = new LinkedHashMap<Ring, Set<Ring>>();
|
||||
|
||||
private float maxLat = -90;
|
||||
private float minLat = 90;
|
||||
private float maxLon = -180;
|
||||
private float minLon = 180;
|
||||
private long id;
|
||||
|
||||
|
||||
public Multipolygon(List<Ring> outer, List<Ring> inner, long id) {
|
||||
outerRings = outer;
|
||||
innerRings = inner;
|
||||
this.id = id;
|
||||
updateRings();
|
||||
}
|
||||
|
||||
public Multipolygon(Ring outer, List<Ring> inner, long id, boolean checkedIsIn) {
|
||||
outerRings = new ArrayList<Ring>();
|
||||
outerRings.add(outer);
|
||||
innerRings = inner;
|
||||
this.id = id;
|
||||
updateRings(checkedIsIn);
|
||||
}
|
||||
|
||||
public MultiPolygon toMultiPolygon() {
|
||||
GeometryFactory geometryFactory = new GeometryFactory();
|
||||
MultiPolygon emptyMultiPolygon = geometryFactory.createMultiPolygon(new Polygon[0]);
|
||||
List<Polygon> polygons = new ArrayList<>();
|
||||
for (Ring outerRing : outerRings) {
|
||||
if (!outerRing.isClosed()) {
|
||||
return emptyMultiPolygon;
|
||||
}
|
||||
List<LinearRing> innerLinearRings = new ArrayList<>();
|
||||
Set<Ring> innerRings = containedInnerInOuter.get(outerRing);
|
||||
if (!Algorithms.isEmpty(innerRings)) {
|
||||
for (Ring innerRing : innerRings) {
|
||||
if (!innerRing.isClosed()) {
|
||||
return emptyMultiPolygon;
|
||||
}
|
||||
innerLinearRings.add(innerRing.toLinearRing());
|
||||
}
|
||||
}
|
||||
polygons.add(geometryFactory.createPolygon(outerRing.toLinearRing(), innerLinearRings.toArray(new LinearRing[innerLinearRings.size()])));
|
||||
}
|
||||
return geometryFactory.createMultiPolygon(polygons.toArray(new Polygon[polygons.size()]));
|
||||
}
|
||||
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
private void updateRings() {
|
||||
updateRings(false);
|
||||
}
|
||||
|
||||
private void updateRings(boolean checkedIsIn) {
|
||||
maxLat = -90;
|
||||
minLat = 90;
|
||||
maxLon = -180;
|
||||
minLon = 180;
|
||||
for (Ring r : outerRings) {
|
||||
for (Node n : r.getBorder()) {
|
||||
maxLat = (float) Math.max(maxLat, n.getLatitude());
|
||||
minLat = (float) Math.min(minLat, n.getLatitude());
|
||||
maxLon = (float) Math.max(maxLon, n.getLongitude());
|
||||
minLon = (float) Math.min(minLon, n.getLongitude());
|
||||
}
|
||||
}
|
||||
// keep sorted
|
||||
Collections.sort(outerRings);
|
||||
for (Ring inner : innerRings) {
|
||||
HashSet<Ring> outContainingRings = new HashSet<Ring>();
|
||||
if (checkedIsIn && outerRings.size() == 1) {
|
||||
outContainingRings.add(outerRings.get(0));
|
||||
} else {
|
||||
for (Ring out : outerRings) {
|
||||
if (inner.isIn(out)) {
|
||||
outContainingRings.add(out);
|
||||
}
|
||||
}
|
||||
}
|
||||
containedInnerInOuter.put(inner, outContainingRings);
|
||||
}
|
||||
// keep sorted
|
||||
Collections.sort(innerRings);
|
||||
}
|
||||
|
||||
/**
|
||||
* check if this multipolygon contains a point
|
||||
*
|
||||
* @param latitude lat to check
|
||||
* @param longitude lon to check
|
||||
* @return true if this multipolygon is correct and contains the point
|
||||
*/
|
||||
public boolean containsPoint(double latitude, double longitude) {
|
||||
// fast check
|
||||
if (maxLat + 0.3 < latitude || minLat - 0.3 > latitude ||
|
||||
maxLon + 0.3 < longitude || minLon - 0.3 > longitude) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Ring containedInOuter = null;
|
||||
// use a sortedset to get the smallest outer containing the point
|
||||
for (Ring outer : outerRings) {
|
||||
if (outer.containsPoint(latitude, longitude)) {
|
||||
containedInOuter = outer;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (containedInOuter == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//use a sortedSet to get the smallest inner Ring
|
||||
Ring containedInInner = null;
|
||||
for (Ring inner : innerRings) {
|
||||
if (inner.containsPoint(latitude, longitude)) {
|
||||
containedInInner = inner;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (containedInInner == null) return true;
|
||||
if (outerRings.size() == 1) {
|
||||
// return immediately false
|
||||
return false;
|
||||
}
|
||||
|
||||
// if it is both, in an inner and in an outer, check if the inner is indeed the smallest one
|
||||
Set<Ring> s = containedInnerInOuter.get(containedInInner);
|
||||
if (s == null) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
return !s.contains(containedInOuter);
|
||||
}
|
||||
|
||||
/**
|
||||
* check if this multipolygon contains a point
|
||||
*
|
||||
* @param point point to check
|
||||
* @return true if this multipolygon is correct and contains the point
|
||||
*/
|
||||
public boolean containsPoint(LatLon point) {
|
||||
|
||||
return containsPoint(point.getLatitude(), point.getLongitude());
|
||||
|
||||
}
|
||||
|
||||
public int countOuterPolygons() {
|
||||
return zeroSizeIfNull(outerRings);
|
||||
}
|
||||
|
||||
private int zeroSizeIfNull(Collection<?> l) {
|
||||
return l != null ? l.size() : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the weighted center of all nodes in this multiPolygon <br />
|
||||
* This only works when the ways have initialized nodes
|
||||
*
|
||||
* @return the weighted center
|
||||
*/
|
||||
public LatLon getCenterPoint() {
|
||||
List<Node> points = new ArrayList<Node>();
|
||||
for (Ring w : outerRings) {
|
||||
points.addAll(w.getBorder());
|
||||
}
|
||||
if (points.isEmpty()) {
|
||||
for (Ring w : innerRings) {
|
||||
points.addAll(w.getBorder());
|
||||
}
|
||||
}
|
||||
|
||||
return OsmMapUtils.getWeightCenterForNodes(points);
|
||||
}
|
||||
|
||||
public void mergeWith(Multipolygon multipolygon) {
|
||||
innerRings.addAll(multipolygon.innerRings);
|
||||
outerRings.addAll(multipolygon.outerRings);
|
||||
updateRings();
|
||||
}
|
||||
|
||||
public boolean hasOpenedPolygons() {
|
||||
return !areRingsComplete();
|
||||
}
|
||||
|
||||
public boolean areRingsComplete() {
|
||||
List<Ring> l = outerRings;
|
||||
for (Ring r : l) {
|
||||
if (!r.isClosed()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
l = innerRings;
|
||||
for (Ring r : l) {
|
||||
if (!r.isClosed()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public QuadRect getLatLonBbox() {
|
||||
if(minLat == 90) {
|
||||
return new QuadRect();
|
||||
}
|
||||
return new QuadRect(minLon, maxLat, maxLon, minLat);
|
||||
}
|
||||
|
||||
|
||||
public List<Ring> getInnerRings() {
|
||||
return innerRings;
|
||||
}
|
||||
|
||||
public List<Ring> getOuterRings() {
|
||||
return outerRings;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,278 @@
|
|||
package net.osmand.data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import gnu.trove.map.hash.TLongObjectHashMap;
|
||||
import net.osmand.osm.edit.Node;
|
||||
import net.osmand.osm.edit.Way;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
/**
|
||||
* The idea of multipolygon:
|
||||
* - we treat each outer way as closed polygon
|
||||
* - multipolygon is always closed!
|
||||
* - each way we try to assign to existing way and form
|
||||
* so a more complex polygon
|
||||
* - number of outer ways, is number of polygons
|
||||
*
|
||||
* @author Pavol Zibrita
|
||||
*/
|
||||
public class MultipolygonBuilder {
|
||||
|
||||
/* package */ List<Way> outerWays = new ArrayList<Way>();
|
||||
/* package */ List<Way> innerWays = new ArrayList<Way>();
|
||||
|
||||
long id;
|
||||
|
||||
/**
|
||||
* Create a multipolygon with initialized outer and inner ways
|
||||
*
|
||||
* @param outers a list of outer ways
|
||||
* @param inners a list of inner ways
|
||||
*/
|
||||
public MultipolygonBuilder(List<Way> outers, List<Way> inners) {
|
||||
this();
|
||||
outerWays.addAll(outers);
|
||||
innerWays.addAll(inners);
|
||||
}
|
||||
|
||||
public MultipolygonBuilder() {
|
||||
id = -1L;
|
||||
}
|
||||
|
||||
public void setId(long newId) {
|
||||
id = newId;
|
||||
}
|
||||
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public MultipolygonBuilder addInnerWay(Way w) {
|
||||
innerWays.add(w);
|
||||
return this;
|
||||
}
|
||||
|
||||
public List<Way> getOuterWays() {
|
||||
return outerWays;
|
||||
}
|
||||
|
||||
public List<Way> getInnerWays() {
|
||||
return innerWays;
|
||||
}
|
||||
|
||||
public MultipolygonBuilder addOuterWay(Way w) {
|
||||
outerWays.add(w);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Split this multipolygon in several separate multipolygons with one outer ring each
|
||||
*
|
||||
* @param log the stream to log problems to, if log = null, nothing will be logged
|
||||
* @return a list with multipolygons which have exactly one outer ring
|
||||
*/
|
||||
public List<Multipolygon> splitPerOuterRing(Log log) {
|
||||
SortedSet<Ring> inners = new TreeSet<Ring>(combineToRings(innerWays));
|
||||
ArrayList<Ring> outers = combineToRings(outerWays);
|
||||
ArrayList<Multipolygon> multipolygons = new ArrayList<Multipolygon>();
|
||||
// loop; start with the smallest outer ring
|
||||
for (Ring outer : outers) {
|
||||
ArrayList<Ring> innersInsideOuter = new ArrayList<Ring>();
|
||||
Iterator<Ring> innerIt = inners.iterator();
|
||||
while (innerIt.hasNext()) {
|
||||
Ring inner = innerIt.next();
|
||||
if (inner.isIn(outer)) {
|
||||
innersInsideOuter.add(inner);
|
||||
innerIt.remove();
|
||||
}
|
||||
}
|
||||
multipolygons.add(new Multipolygon(outer, innersInsideOuter, id, true));
|
||||
}
|
||||
|
||||
if (inners.size() != 0 && log != null) {
|
||||
log.warn("Multipolygon " + getId() + " has a mismatch in outer and inner rings");
|
||||
}
|
||||
|
||||
return multipolygons;
|
||||
}
|
||||
|
||||
public Multipolygon build() {
|
||||
return new Multipolygon(combineToRings(outerWays), combineToRings(innerWays), id);
|
||||
}
|
||||
|
||||
public ArrayList<Ring> combineToRings(List<Way> ways) {
|
||||
// make a list of multiLines (connecter pieces of way)
|
||||
TLongObjectHashMap<List<Way>> multilineStartPoint = new TLongObjectHashMap<List<Way>>();
|
||||
TLongObjectHashMap<List<Way>> multilineEndPoint = new TLongObjectHashMap<List<Way>>();
|
||||
for (Way toAdd : ways) {
|
||||
if (toAdd.getNodeIds().size() < 2) {
|
||||
continue;
|
||||
}
|
||||
// iterate over the multiLines, and add the way to the correct one
|
||||
Way changedWay = toAdd;
|
||||
Way newWay;
|
||||
do {
|
||||
newWay = merge(multilineStartPoint, getLastId(changedWay), changedWay,
|
||||
multilineEndPoint, getFirstId(changedWay));
|
||||
if(newWay == null) {
|
||||
newWay = merge(multilineEndPoint, getFirstId(changedWay), changedWay,
|
||||
multilineStartPoint, getLastId(changedWay));
|
||||
}
|
||||
if(newWay == null) {
|
||||
newWay = merge(multilineStartPoint, getFirstId(changedWay), changedWay,
|
||||
multilineEndPoint, getLastId(changedWay));
|
||||
}
|
||||
if(newWay == null) {
|
||||
newWay = merge(multilineEndPoint, getLastId(changedWay), changedWay,
|
||||
multilineStartPoint, getFirstId(changedWay));
|
||||
}
|
||||
if(newWay != null) {
|
||||
changedWay = newWay;
|
||||
}
|
||||
} while (newWay != null);
|
||||
|
||||
addToMap(multilineStartPoint, getFirstId(changedWay), changedWay);
|
||||
addToMap(multilineEndPoint, getLastId(changedWay), changedWay);
|
||||
|
||||
}
|
||||
|
||||
List<Way> multiLines = new ArrayList<Way>();
|
||||
for(List<Way> lst : multilineStartPoint.valueCollection()) {
|
||||
multiLines.addAll(lst);
|
||||
}
|
||||
ArrayList<Ring> result = new ArrayList<Ring>();
|
||||
for (Way multiLine : multiLines) {
|
||||
Ring r = new Ring(multiLine);
|
||||
result.add(r);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private Way merge(TLongObjectHashMap<List<Way>> endMap, long stNodeId, Way changedWay,
|
||||
TLongObjectHashMap<List<Way>> startMap, long endNodeId) {
|
||||
List<Way> lst = endMap.get(stNodeId);
|
||||
if(lst != null && lst.size() > 0) {
|
||||
Way candToMerge = lst.get(0);
|
||||
Way newWay = combineTwoWaysIfHasPoints(candToMerge, changedWay);
|
||||
List<Way> otherLst = startMap.get(
|
||||
getLastId(candToMerge) == stNodeId ? getFirstId(candToMerge) : getLastId(candToMerge));
|
||||
boolean removed1 = lst.remove(candToMerge) ;
|
||||
boolean removed2 = otherLst != null && otherLst.remove(candToMerge);
|
||||
if(newWay == null || !removed1 || !removed2) {
|
||||
throw new UnsupportedOperationException("Can't merge way: " + changedWay.getId() + " " + stNodeId + " -> " + endNodeId);
|
||||
}
|
||||
return newWay;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void addToMap(TLongObjectHashMap<List<Way>> mp, long id, Way changedWay) {
|
||||
List<Way> lst = mp.get(id);
|
||||
if(lst == null) {
|
||||
lst = new ArrayList<>();
|
||||
mp.put(id, lst);
|
||||
}
|
||||
lst.add(changedWay);
|
||||
}
|
||||
|
||||
|
||||
private long getId(Node n) {
|
||||
if(n == null ) {
|
||||
return - nextRandId();
|
||||
}
|
||||
long l = MapUtils.get31TileNumberY(n.getLatitude());
|
||||
l = (l << 31) | MapUtils.get31TileNumberX(n.getLongitude());
|
||||
return l;
|
||||
}
|
||||
|
||||
/**
|
||||
* make a new Way with the nodes from two other ways
|
||||
*
|
||||
* @param w1 the first way
|
||||
* @param w2 the second way
|
||||
* @return null if it is not possible
|
||||
*/
|
||||
private Way combineTwoWaysIfHasPoints(Way w1, Way w2) {
|
||||
boolean combine = true;
|
||||
boolean firstReverse = false;
|
||||
boolean secondReverse = false;
|
||||
long w1f = getFirstId(w1);
|
||||
long w2f = getFirstId(w2);
|
||||
long w1l = getLastId(w1);
|
||||
long w2l = getLastId(w2);
|
||||
if (w1f == w2f) {
|
||||
firstReverse = true;
|
||||
secondReverse = false;
|
||||
} else if (w1l == w2f) {
|
||||
firstReverse = false;
|
||||
secondReverse = false;
|
||||
} else if (w1l == w2l) {
|
||||
firstReverse = false;
|
||||
secondReverse = true;
|
||||
} else if (w1f == w2l) {
|
||||
firstReverse = true;
|
||||
secondReverse = true;
|
||||
} else {
|
||||
combine = false;
|
||||
}
|
||||
if (combine) {
|
||||
Way newWay = new Way(nextRandId());
|
||||
boolean nodePresent = w1.getNodes() != null || w1.getNodes().size() != 0;
|
||||
int w1size = nodePresent ? w1.getNodes().size() : w1.getNodeIds().size();
|
||||
for (int i = 0; i < w1size; i++) {
|
||||
int ind = firstReverse ? (w1size - 1 - i) : i;
|
||||
if (nodePresent) {
|
||||
newWay.addNode(w1.getNodes().get(ind));
|
||||
} else {
|
||||
newWay.addNode(w1.getNodeIds().get(ind));
|
||||
}
|
||||
}
|
||||
int w2size = nodePresent ? w2.getNodes().size() : w2.getNodeIds().size();
|
||||
for (int i = 1; i < w2size; i++) {
|
||||
int ind = secondReverse ? (w2size - 1 - i) : i;
|
||||
if (nodePresent) {
|
||||
newWay.addNode(w2.getNodes().get(ind));
|
||||
} else {
|
||||
newWay.addNode(w2.getNodeIds().get(ind));
|
||||
}
|
||||
}
|
||||
return newWay;
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
private long getLastId(Way w1) {
|
||||
return w1.getLastNodeId() > 0 ? w1.getLastNodeId(): getId(w1.getLastNode());
|
||||
}
|
||||
|
||||
private long getFirstId(Way w1) {
|
||||
return w1.getFirstNodeId() > 0 ? w1.getFirstNodeId(): getId(w1.getFirstNode());
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static long initialValue = -1000;
|
||||
private final static long randomInterval = 5000;
|
||||
|
||||
/**
|
||||
* get a random long number
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private static long nextRandId() {
|
||||
// exclude duplicates in one session (!) and be quazirandom every run
|
||||
long val = initialValue - Math.round(Math.random() * randomInterval);
|
||||
initialValue = val;
|
||||
return val;
|
||||
}
|
||||
|
||||
}
|
369
OsmAnd-java/src/main/java/net/osmand/data/Ring.java
Normal file
|
@ -0,0 +1,369 @@
|
|||
package net.osmand.data;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.vividsolutions.jts.geom.Coordinate;
|
||||
import com.vividsolutions.jts.geom.CoordinateList;
|
||||
import com.vividsolutions.jts.geom.GeometryFactory;
|
||||
import com.vividsolutions.jts.geom.LinearRing;
|
||||
import net.osmand.osm.edit.Node;
|
||||
import net.osmand.osm.edit.OsmMapUtils;
|
||||
import net.osmand.osm.edit.Way;
|
||||
import net.osmand.util.MapAlgorithms;
|
||||
|
||||
/**
|
||||
* A ring is a list of CONTIGUOUS ways that form a simple boundary or an area. <p />
|
||||
*
|
||||
* @author sander
|
||||
*/
|
||||
public class Ring implements Comparable<Ring> {
|
||||
/**
|
||||
* This is a list of the ways added by the user
|
||||
* The order can be changed with methods from this class
|
||||
*/
|
||||
// private final ArrayList<Way> ways;
|
||||
|
||||
private static final int INDEX_RING_NODES_FAST_CHECK = 100;
|
||||
private static final int INDEX_SIZE = 100;
|
||||
private double[] indexedRingIntervals = null;
|
||||
private List<Node>[] indexedRingNodes = null;
|
||||
|
||||
/**
|
||||
* a concatenation of the ways to form the border
|
||||
* this is NOT necessarily a CLOSED way
|
||||
* The id is random, so this may never leave the Ring object
|
||||
*/
|
||||
private Way border;
|
||||
|
||||
/**
|
||||
* area can be asked a lot of times when comparing rings, cache it
|
||||
*/
|
||||
private double area = -1;
|
||||
|
||||
|
||||
/**
|
||||
* Construct a Ring with a list of ways
|
||||
*
|
||||
* @param ways the ways that make up the Ring
|
||||
*/
|
||||
Ring(Way w) {
|
||||
border = w;
|
||||
indexForFastCheck();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void indexForFastCheck() {
|
||||
if(border.getNodes().size() > INDEX_RING_NODES_FAST_CHECK) {
|
||||
// calculate min/max lat
|
||||
double maxLat = Double.MIN_VALUE;
|
||||
double minLat = Double.MAX_VALUE;
|
||||
Node lastNode = null;
|
||||
for(Node n : border.getNodes()) {
|
||||
if(n == null) {
|
||||
continue;
|
||||
}
|
||||
lastNode = n;
|
||||
if(n.getLatitude() > maxLat) {
|
||||
maxLat = n.getLatitude();
|
||||
} else if(n.getLatitude() < minLat) {
|
||||
minLat = n.getLatitude();
|
||||
}
|
||||
}
|
||||
maxLat += 0.0001;
|
||||
minLat -= 0.0001;
|
||||
// create interval array [minLat, minLat+interval, ..., maxLat]
|
||||
double interval = (maxLat - minLat) / (INDEX_SIZE - 1);
|
||||
indexedRingIntervals = new double[INDEX_SIZE];
|
||||
indexedRingNodes = new List[INDEX_SIZE];
|
||||
for(int i = 0; i < INDEX_SIZE; i++) {
|
||||
indexedRingIntervals[i] = minLat + i * interval;
|
||||
indexedRingNodes[i] = new ArrayList<Node>();
|
||||
}
|
||||
// split nodes by intervals
|
||||
Node prev = lastNode;
|
||||
for(int i = 0; i < border.getNodes().size(); i++) {
|
||||
Node current = border.getNodes().get(i);
|
||||
if(current == null) {
|
||||
continue;
|
||||
}
|
||||
int i1 = getIndexedLessOrEq(current.getLatitude());
|
||||
int i2 = getIndexedLessOrEq(prev.getLatitude());
|
||||
int min, max;
|
||||
if(i1 > i2) {
|
||||
min = i2;
|
||||
max = i1;
|
||||
} else {
|
||||
min = i1;
|
||||
max = i2;
|
||||
}
|
||||
for (int j = min; j <= max; j++) {
|
||||
indexedRingNodes[j].add(prev);
|
||||
indexedRingNodes[j].add(current);
|
||||
}
|
||||
prev = current;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private int getIndexedLessOrEq(double latitude) {
|
||||
int ind1 = Arrays.binarySearch(indexedRingIntervals, latitude);
|
||||
if(ind1 < 0) {
|
||||
ind1 = -(ind1 + 1);
|
||||
}
|
||||
return ind1;
|
||||
}
|
||||
|
||||
/**
|
||||
* check if this ring is closed by nature
|
||||
*
|
||||
* @return true if this ring is closed, false otherwise
|
||||
*/
|
||||
public boolean isClosed() {
|
||||
return border.getFirstNodeId() == border.getLastNodeId();
|
||||
}
|
||||
|
||||
public List<Node> getBorder() {
|
||||
return border.getNodes();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* check if this Ring contains the node
|
||||
*
|
||||
* @param n the Node to check
|
||||
* @return yes if the node is inside the ring
|
||||
*/
|
||||
public boolean containsNode(Node n) {
|
||||
return containsPoint(n.getLatitude(), n.getLongitude());
|
||||
}
|
||||
|
||||
/**
|
||||
* check if this Ring contains the point
|
||||
*
|
||||
* @param latitude lat of the point
|
||||
* @param longitude lon of the point
|
||||
* @return yes if the point is inside the ring
|
||||
*/
|
||||
public boolean containsPoint(double latitude, double longitude) {
|
||||
if(indexedRingIntervals != null) {
|
||||
int intersections = 0;
|
||||
int indx = getIndexedLessOrEq(latitude);
|
||||
if(indx == 0 || indx >= indexedRingNodes.length) {
|
||||
return false;
|
||||
}
|
||||
List<Node> lst = indexedRingNodes[indx];
|
||||
for (int k = 0; k < lst.size(); k += 2) {
|
||||
Node first = lst.get(k);
|
||||
Node last = lst.get(k + 1);
|
||||
if (OsmMapUtils.ray_intersect_lon(first, last, latitude, longitude) != -360.0d) {
|
||||
intersections++;
|
||||
}
|
||||
}
|
||||
return intersections % 2 == 1;
|
||||
}
|
||||
return MapAlgorithms.containsPoint(getBorder(), latitude, longitude);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this is in Ring r
|
||||
* @param r the ring to check
|
||||
* @return true if this Ring is inside Ring r (false if it is undetermined)
|
||||
*/
|
||||
public boolean speedIsIn(Ring r) {
|
||||
/*
|
||||
* bi-directional check is needed because some concave rings can intersect
|
||||
* and would only fail on one of the checks
|
||||
*/
|
||||
List<Node> points = this.getBorder();
|
||||
if(points.size() < 2) {
|
||||
return false;
|
||||
}
|
||||
double minlat = points.get(0).getLatitude();
|
||||
double maxlat = points.get(0).getLatitude();
|
||||
double minlon = points.get(0).getLongitude();
|
||||
double maxlon = points.get(0).getLongitude();
|
||||
// r should contain all nodes of this
|
||||
for (Node n : points) {
|
||||
minlat = Math.min(n.getLatitude(), minlat);
|
||||
maxlat = Math.max(n.getLatitude(), maxlat);
|
||||
minlon = Math.min(n.getLongitude(), minlon);
|
||||
maxlon = Math.max(n.getLongitude(), maxlon);
|
||||
}
|
||||
|
||||
// r should contain all nodes of this
|
||||
if (!r.containsPoint(minlat, minlon)) {
|
||||
return false;
|
||||
}
|
||||
if (!r.containsPoint(maxlat, minlon)) {
|
||||
return false;
|
||||
}
|
||||
if (!r.containsPoint(minlat, maxlon)) {
|
||||
return false;
|
||||
}
|
||||
if (!r.containsPoint(maxlat, maxlon)) {
|
||||
return false;
|
||||
}
|
||||
// this should not contain a node from r
|
||||
for (Node n : r.getBorder()) {
|
||||
if(n.getLatitude() > minlat && n.getLatitude() < maxlat &&
|
||||
n.getLongitude() > minlon && n.getLongitude() < maxlon) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this is in Ring r
|
||||
*
|
||||
* @param r the ring to check
|
||||
* @return true if this Ring is inside Ring r
|
||||
*/
|
||||
public boolean isIn(Ring r) {
|
||||
if(speedIsIn(r)) {
|
||||
return true;
|
||||
}
|
||||
/*
|
||||
* bi-directional check is needed because some concave rings can intersect
|
||||
* and would only fail on one of the checks
|
||||
*/
|
||||
List<Node> points = this.getBorder();
|
||||
|
||||
// r should contain all nodes of this
|
||||
for (Node n : points) {
|
||||
if (!r.containsNode(n)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
points = r.getBorder();
|
||||
|
||||
// this should not contain a node from r
|
||||
for (Node n : points) {
|
||||
if (this.containsNode(n)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* If this Ring is not complete
|
||||
* (some ways are not initialized
|
||||
* because they are not included in the OSM file) <p />
|
||||
*
|
||||
* We are trying to close this Ring by using the other Ring.<p />
|
||||
*
|
||||
* The other Ring must be complete, and the part of this Ring
|
||||
* inside the other Ring must also be complete.
|
||||
*
|
||||
* @param other the other Ring (which is complete) used to close this one
|
||||
*/
|
||||
public void closeWithOtherRing(Ring other) {
|
||||
List<Node> thisBorder = getBorder();
|
||||
List<Integer> thisSwitchPoints = new ArrayList<Integer>();
|
||||
|
||||
boolean insideOther = other.containsNode(thisBorder.get(0));
|
||||
|
||||
// Search the node pairs for which the ring goes inside or out the other
|
||||
for (int i = 0; i < thisBorder.size(); i++) {
|
||||
Node n = thisBorder.get(i);
|
||||
if (other.containsNode(n) != insideOther) {
|
||||
// we are getting out or in the boundary now.
|
||||
// toggle switch
|
||||
insideOther = !insideOther;
|
||||
|
||||
thisSwitchPoints.add(i);
|
||||
}
|
||||
}
|
||||
|
||||
List<Integer> otherSwitchPoints = new ArrayList<Integer>();
|
||||
|
||||
// Search the according node pairs in the other ring
|
||||
for (int i : thisSwitchPoints) {
|
||||
LatLon a = thisBorder.get(i - 1).getLatLon();
|
||||
LatLon b = thisBorder.get(i).getLatLon();
|
||||
otherSwitchPoints.add(getTheSegmentRingIntersectsSegment(a, b));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
*
|
||||
* * Split the other Ring into ways from splitPoint to splitPoint
|
||||
*
|
||||
* * Split this ring into ways from splitPoint to splitPoint
|
||||
*
|
||||
* * Filter out the parts of way from this that are inside the other Ring
|
||||
* Use the insideOther var and the switchPoints list for this.
|
||||
*
|
||||
* * For each two parts of way from this, search a part of way connecting the two.
|
||||
* If there are two, take the shortest.
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the segment of the Ring that intersects a segment
|
||||
* going from point a to point b
|
||||
*
|
||||
* @param a the begin point of the segment
|
||||
* @param b the end point of the segment
|
||||
* @return an integer i which is the index so that the segment
|
||||
* from getBorder().get(i-1) to getBorder().get(i) intersects with
|
||||
* the segment from parameters a to b. <p />
|
||||
* <p>
|
||||
* 0 if the segment from a to b doesn't intersect with the Ring.
|
||||
*/
|
||||
private int getTheSegmentRingIntersectsSegment(LatLon a, LatLon b) {
|
||||
List<Node> border = getBorder();
|
||||
for (int i = 1; i < border.size(); i++) {
|
||||
LatLon c = border.get(i - 1).getLatLon();
|
||||
LatLon d = border.get(i).getLatLon();
|
||||
if (MapAlgorithms.linesIntersect(
|
||||
a.getLatitude(), a.getLongitude(),
|
||||
b.getLatitude(), b.getLongitude(),
|
||||
c.getLatitude(), c.getLongitude(),
|
||||
d.getLatitude(), d.getLongitude())) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
public double getArea() {
|
||||
if (area == -1) {
|
||||
//cache the area
|
||||
area = OsmMapUtils.getArea(getBorder());
|
||||
}
|
||||
return area;
|
||||
}
|
||||
|
||||
public LinearRing toLinearRing() {
|
||||
GeometryFactory geometryFactory = new GeometryFactory();
|
||||
CoordinateList coordinates = new CoordinateList();
|
||||
for (Node node : border.getNodes()) {
|
||||
coordinates.add(new Coordinate(node.getLatitude(), node.getLongitude()), true);
|
||||
}
|
||||
coordinates.closeRing();
|
||||
return geometryFactory.createLinearRing(coordinates.toCoordinateArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* Use area size as comparable metric
|
||||
*/
|
||||
@Override
|
||||
public int compareTo(Ring r) {
|
||||
return Double.compare(getArea(), r.getArea());
|
||||
}
|
||||
}
|
|
@ -29,7 +29,7 @@ public interface ITileSource {
|
|||
public long getExpirationTimeMillis();
|
||||
|
||||
public int getExpirationTimeMinutes();
|
||||
|
||||
|
||||
public String getReferer();
|
||||
|
||||
public void deleteTiles(String path);
|
||||
|
|
|
@ -550,7 +550,11 @@ public class TileSourceManager {
|
|||
|
||||
private static String findOneTile(File dir) {
|
||||
if (dir.isDirectory()) {
|
||||
for (File file : dir.listFiles()) {
|
||||
File[] files = dir.listFiles();
|
||||
if (files == null) {
|
||||
return null;
|
||||
}
|
||||
for (File file : files) {
|
||||
if (file.isDirectory()) {
|
||||
String ext = findOneTile(file);
|
||||
if (ext != null) {
|
||||
|
|
|
@ -8,11 +8,17 @@ import java.util.List;
|
|||
import java.util.PriorityQueue;
|
||||
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.data.Multipolygon;
|
||||
import net.osmand.data.MultipolygonBuilder;
|
||||
import net.osmand.data.Ring;
|
||||
import net.osmand.osm.edit.Relation.RelationMember;
|
||||
import net.osmand.util.Algorithms;
|
||||
import net.osmand.util.MapAlgorithms;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
public class OsmMapUtils {
|
||||
|
||||
private static final double POLY_CENTER_PRECISION= 1e-6;
|
||||
|
||||
public static double getDistance(Node e1, Node e2) {
|
||||
return MapUtils.getDistance(e1.getLatitude(), e1.getLongitude(), e2.getLatitude(), e2.getLongitude());
|
||||
|
@ -33,6 +39,38 @@ public class OsmMapUtils {
|
|||
return getWeightCenterForWay(((Way) e));
|
||||
} else if (e instanceof Relation) {
|
||||
List<LatLon> list = new ArrayList<LatLon>();
|
||||
if (e.getTag("type").equals("multipolygon")) {
|
||||
MultipolygonBuilder original = new MultipolygonBuilder();
|
||||
original.setId(e.getId());
|
||||
|
||||
// fill the multipolygon with all ways from the Relation
|
||||
for (RelationMember es : ((Relation) e).getMembers()) {
|
||||
if (es.getEntity() instanceof Way) {
|
||||
boolean inner = "inner".equals(es.getRole()); //$NON-NLS-1$
|
||||
if (inner) {
|
||||
original.addInnerWay((Way) es.getEntity());
|
||||
} else if("outer".equals(es.getRole())){
|
||||
original.addOuterWay((Way) es.getEntity());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<Multipolygon> multipolygons = original.splitPerOuterRing(null);
|
||||
if (!Algorithms.isEmpty(multipolygons)){
|
||||
Multipolygon m = multipolygons.get(0);
|
||||
List<Node> out = m.getOuterRings().get(0).getBorder();
|
||||
List<List<Node>> inner = new ArrayList<List<Node>>();
|
||||
if(!Algorithms.isEmpty(out)) {
|
||||
for (Ring r : m.getInnerRings()) {
|
||||
inner.add(r.getBorder());
|
||||
}
|
||||
}
|
||||
if (!Algorithms.isEmpty(out)) {
|
||||
return getComplexPolyCenter(out, inner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (RelationMember fe : ((Relation) e).getMembers()) {
|
||||
LatLon c = null;
|
||||
// skip relations to avoid circular dependencies
|
||||
|
@ -48,16 +86,26 @@ public class OsmMapUtils {
|
|||
return null;
|
||||
}
|
||||
|
||||
public static LatLon getComplexPolyCenter(Collection<Node> nodes) {
|
||||
double precision = 1e-5; //where to set precision constant?
|
||||
|
||||
public static LatLon getComplexPolyCenter(Collection<Node> outer, List<List<Node>> inner) {
|
||||
final List<List<LatLon>> rings = new ArrayList<>();
|
||||
List<LatLon> outerRing = new ArrayList<>();
|
||||
for (Node n : nodes) {
|
||||
|
||||
for (Node n : outer) {
|
||||
outerRing.add(new LatLon(n.getLatitude(), n.getLongitude()));
|
||||
}
|
||||
rings.add(outerRing);
|
||||
return getPolylabelPoint(rings, precision);
|
||||
if (!Algorithms.isEmpty(inner)) {
|
||||
for (List<Node> ring: inner) {
|
||||
if (!Algorithms.isEmpty(ring)) {
|
||||
List <LatLon> ringll = new ArrayList<LatLon>();
|
||||
for (Node n : ring) {
|
||||
ringll.add(n.getLatLon());
|
||||
}
|
||||
rings.add(ringll);
|
||||
}
|
||||
}
|
||||
}
|
||||
return getPolylabelPoint(rings);
|
||||
}
|
||||
|
||||
public static LatLon getWeightCenter(Collection<LatLon> nodes) {
|
||||
|
@ -109,7 +157,7 @@ public class OsmMapUtils {
|
|||
area = false;
|
||||
}
|
||||
}
|
||||
LatLon ll = area ? getComplexPolyCenter(nodes) : getWeightCenterForNodes(nodes);
|
||||
LatLon ll = area ? getComplexPolyCenter(nodes, null) : getWeightCenterForNodes(nodes);
|
||||
if(ll == null) {
|
||||
return null;
|
||||
}
|
||||
|
@ -464,11 +512,10 @@ public class OsmMapUtils {
|
|||
/**
|
||||
* Calculate "visual" center point of polygons (based on Mapbox' polylabel algorithm)
|
||||
* @param rings - list of lists of nodes
|
||||
* @param precision - precision of calculation, should be small, like 1e-4 or less.
|
||||
* @return coordinates of calculated center
|
||||
*/
|
||||
|
||||
private static LatLon getPolylabelPoint(List<List<LatLon>> rings, double precision) {
|
||||
public static LatLon getPolylabelPoint(List<List<LatLon>> rings) {
|
||||
// find the bounding box of the outer ring
|
||||
double minX = Double.MAX_VALUE;
|
||||
double minY = Double.MAX_VALUE;
|
||||
|
@ -520,7 +567,7 @@ public class OsmMapUtils {
|
|||
|
||||
// do not drill down further if there's no chance of a better solution
|
||||
// System.out.println(String.format("check for precision: cell.max - bestCell.d = %f Precision: %f", cell.max, precision));
|
||||
if (cell.max - bestCell.d <= precision) continue;
|
||||
if (cell.max - bestCell.d <= POLY_CENTER_PRECISION) continue;
|
||||
|
||||
// split the cell into four cells
|
||||
h = cell.h / 2;
|
||||
|
|
|
@ -236,9 +236,9 @@ public class RoutingConfiguration {
|
|||
String id = parser.getAttributeValue("", "id");
|
||||
String type = parser.getAttributeValue("", "type");
|
||||
boolean defaultValue = Boolean.parseBoolean(parser.getAttributeValue("", "default"));
|
||||
if (type.equalsIgnoreCase("boolean")) {
|
||||
if ("boolean".equalsIgnoreCase(type)) {
|
||||
currentRouter.registerBooleanParameter(id, Algorithms.isEmpty(group) ? null : group, name, description, defaultValue);
|
||||
} else if(type.equalsIgnoreCase("numeric")) {
|
||||
} else if ("numeric".equalsIgnoreCase(type)) {
|
||||
String values = parser.getAttributeValue("", "values");
|
||||
String valueDescriptions = parser.getAttributeValue("", "valueDescriptions");
|
||||
String[] strValues = values.split(",");
|
||||
|
@ -292,7 +292,7 @@ public class RoutingConfiguration {
|
|||
for (int i = 0; i < stack.size(); i++) {
|
||||
addSubclause(stack.get(i), ctx);
|
||||
}
|
||||
} else if(stack.size() > 0 && stack.peek().tagName.equals("select")) {
|
||||
} else if (stack.size() > 0 && "select".equals(stack.peek().tagName)) {
|
||||
addSubclause(rr, ctx);
|
||||
}
|
||||
stack.push(rr);
|
||||
|
@ -312,11 +312,11 @@ public class RoutingConfiguration {
|
|||
if (!Algorithms.isEmpty(rr.t)) {
|
||||
ctx.getLastRule().registerAndTagValueCondition(rr.t, Algorithms.isEmpty(rr.v) ? null : rr.v, not);
|
||||
}
|
||||
if (rr.tagName.equals("gt")) {
|
||||
if ("gt".equals(rr.tagName)) {
|
||||
ctx.getLastRule().registerGreatCondition(rr.value1, rr.value2, rr.type);
|
||||
} else if (rr.tagName.equals("le")) {
|
||||
} else if ("le".equals(rr.tagName)) {
|
||||
ctx.getLastRule().registerLessCondition(rr.value1, rr.value2, rr.type);
|
||||
} else if (rr.tagName.equals("eq")) {
|
||||
} else if ("eq".equals(rr.tagName)) {
|
||||
ctx.getLastRule().registerEqualCondition(rr.value1, rr.value2, rr.type);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -76,13 +76,8 @@ public class TransportRoutingConfiguration {
|
|||
public int getBoardingTime() {
|
||||
return boardingTime;
|
||||
}
|
||||
|
||||
public TransportRoutingConfiguration(RoutingConfiguration.Builder builder) {
|
||||
this(builder, new TreeMap<String, String>());
|
||||
}
|
||||
|
||||
public TransportRoutingConfiguration(RoutingConfiguration.Builder builder, Map<String, String> params) {
|
||||
GeneralRouter prouter = builder == null ? null : builder.getRouter("public_transport");
|
||||
|
||||
public TransportRoutingConfiguration(GeneralRouter prouter, Map<String, String> params) {
|
||||
if(prouter != null) {
|
||||
this.router = prouter.build(params);
|
||||
walkRadius = router.getIntAttribute("walkRadius", walkRadius);
|
||||
|
|
|
@ -856,49 +856,55 @@ public class SearchUICore {
|
|||
loc = sp.getLastTokenLocation();
|
||||
sortByName = sp.isSortByName();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int compare(SearchResult o1, SearchResult o2) {
|
||||
boolean topVisible1 = ObjectType.isTopVisible(o1.objectType);
|
||||
boolean topVisible2 = ObjectType.isTopVisible(o2.objectType);
|
||||
if ((!topVisible1 && !topVisible2) || (topVisible1 && topVisible2)) {
|
||||
if (o1.getUnknownPhraseMatchWeight() != o2.getUnknownPhraseMatchWeight()) {
|
||||
return -Double.compare(o1.getUnknownPhraseMatchWeight(), o2.getUnknownPhraseMatchWeight());
|
||||
} else if (o1.getFoundWordCount() != o2.getFoundWordCount()) {
|
||||
return -Algorithms.compare(o1.getFoundWordCount(), o2.getFoundWordCount());
|
||||
}
|
||||
if (topVisible1 != topVisible2) {
|
||||
// -1 - means 1st is less than 2nd
|
||||
return topVisible1 ? -1 : 1;
|
||||
}
|
||||
if (o1.getUnknownPhraseMatchWeight() != o2.getUnknownPhraseMatchWeight()) {
|
||||
return -Double.compare(o1.getUnknownPhraseMatchWeight(), o2.getUnknownPhraseMatchWeight());
|
||||
}
|
||||
if (o1.getFoundWordCount() != o2.getFoundWordCount()) {
|
||||
return -Algorithms.compare(o1.getFoundWordCount(), o2.getFoundWordCount());
|
||||
}
|
||||
if (!sortByName) {
|
||||
double s1 = o1.getSearchDistance(loc);
|
||||
double s2 = o2.getSearchDistance(loc);
|
||||
int cmp = Double.compare(s1, s2);
|
||||
if (cmp != 0) {
|
||||
return cmp;
|
||||
if (s1 != s2) {
|
||||
return Double.compare(s1, s2);
|
||||
}
|
||||
}
|
||||
int st1 = o1.localeName == null ? -10000 : Algorithms.extractFirstIntegerNumber(o1.localeName);
|
||||
int st2 = o2.localeName == null ? -10000 : Algorithms.extractFirstIntegerNumber(o2.localeName);
|
||||
if (st1 != st2) {
|
||||
return Algorithms.compare(st1, st2);
|
||||
}
|
||||
String localeName1 = o1.localeName == null ? "" : o1.localeName;
|
||||
String localeName2 = o2.localeName == null ? "" : o2.localeName;
|
||||
if (o1.parentSearchResult != null && o2.parentSearchResult != null) {
|
||||
if (o1.parentSearchResult == o2.parentSearchResult) {
|
||||
int cmp = collator.compare(localeName1, localeName2);
|
||||
if (cmp != 0) {
|
||||
return cmp;
|
||||
}
|
||||
}
|
||||
double s1 = o1.getSearchDistance(loc, 1);
|
||||
double s2 = o2.getSearchDistance(loc, 1);
|
||||
return Double.compare(s1, s2);
|
||||
int st1 = Algorithms.extractFirstIntegerNumber(localeName1);
|
||||
int st2 = Algorithms.extractFirstIntegerNumber(localeName2);
|
||||
if (st1 != st2) {
|
||||
return Algorithms.compare(st1, st2);
|
||||
}
|
||||
double s1 = o1.getSearchDistance(loc, 1);
|
||||
double s2 = o2.getSearchDistance(loc, 1);
|
||||
double ps1 = o1.parentSearchResult == null ? 0 : o1.parentSearchResult.getSearchDistance(loc);
|
||||
double ps2 = o2.parentSearchResult == null ? 0 : o2.parentSearchResult.getSearchDistance(loc);
|
||||
if (ps1 != ps2) {
|
||||
return Double.compare(ps1, ps2);
|
||||
}
|
||||
int cmp = collator.compare(localeName1, localeName2);
|
||||
if (cmp != 0) {
|
||||
return cmp;
|
||||
}
|
||||
if (o1.object instanceof Amenity && o2.object instanceof Amenity) {
|
||||
if (s1 != s2) {
|
||||
return Double.compare(s1, s2);
|
||||
}
|
||||
boolean am1 = o1.object instanceof Amenity;
|
||||
boolean am2 = o2.object instanceof Amenity;
|
||||
if (am1 != am2) {
|
||||
return Boolean.compare(am1, am2);
|
||||
} else if (am1 && am2) {
|
||||
// here 2 points are amenity
|
||||
Amenity a1 = (Amenity) o1.object;
|
||||
Amenity a2 = (Amenity) o2.object;
|
||||
|
@ -908,6 +914,7 @@ public class SearchUICore {
|
|||
if (cmp != 0) {
|
||||
return cmp;
|
||||
}
|
||||
|
||||
String subType1 = a1.getSubType() == null ? "" : a1.getSubType();
|
||||
String subType2 = a2.getSubType() == null ? "" : a2.getSubType();
|
||||
cmp = collator.compare(subType1, subType2);
|
||||
|
@ -915,10 +922,7 @@ public class SearchUICore {
|
|||
return cmp;
|
||||
}
|
||||
}
|
||||
|
||||
double s1 = o1.getSearchDistance(loc, 1);
|
||||
double s2 = o2.getSearchDistance(loc, 1);
|
||||
return Double.compare(s1, s2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
package net.osmand.search.core;
|
||||
|
||||
import com.jwetherell.openmap.common.LatLonPoint;
|
||||
import com.jwetherell.openmap.common.UTMPoint;
|
||||
|
||||
import net.osmand.CollatorStringMatcher.StringMatcherMode;
|
||||
import net.osmand.ResultMatcher;
|
||||
|
@ -146,7 +144,7 @@ public class SearchCoreFactory {
|
|||
SearchResultMatcher resultMatcher, SearchResult res, SearchBaseAPI api)
|
||||
throws IOException {
|
||||
phrase.countUnknownWordsMatch(res);
|
||||
int cnt = resultMatcher.getCount();
|
||||
// int cnt = resultMatcher.getCount();
|
||||
List<String> ws = phrase.getUnknownSearchWords(res.otherWordsMatch);
|
||||
if(!res.firstUnknownWordMatches) {
|
||||
ws.add(phrase.getUnknownSearchWord());
|
||||
|
@ -938,7 +936,12 @@ public class SearchCoreFactory {
|
|||
}
|
||||
if (phrase.isUnknownSearchWordPresent()
|
||||
&& !(ns.matches(res.localeName) || ns.matches(res.otherNames))) {
|
||||
return false;
|
||||
String ref = object.getTagContent(Amenity.REF, null);
|
||||
if(ref == null || !ns.matches(ref)) {
|
||||
return false;
|
||||
} else {
|
||||
res.localeName += " " + ref;
|
||||
}
|
||||
}
|
||||
|
||||
res.object = object;
|
||||
|
@ -1266,20 +1269,6 @@ public class SearchCoreFactory {
|
|||
return false;
|
||||
}
|
||||
|
||||
// newFormat = PointDescription.FORMAT_DEGREES;
|
||||
// newFormat = PointDescription.FORMAT_MINUTES;
|
||||
// newFormat = PointDescription.FORMAT_SECONDS;
|
||||
public void testUTM() {
|
||||
double northing = 0;
|
||||
double easting = 0;
|
||||
String zone = "";
|
||||
char c = zone.charAt(zone.length() -1);
|
||||
int z = Integer.parseInt(zone.substring(0, zone.length() - 1));
|
||||
UTMPoint upoint = new UTMPoint(northing, easting, z, c);
|
||||
LatLonPoint ll = upoint.toLatLonPoint();
|
||||
LatLon loc = new LatLon(ll.getLatitude(), ll.getLongitude());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean search(SearchPhrase phrase, SearchResultMatcher resultMatcher) throws IOException {
|
||||
if (!phrase.isUnknownSearchWordPresent()) {
|
||||
|
@ -1292,17 +1281,6 @@ public class SearchCoreFactory {
|
|||
return super.search(phrase, resultMatcher);
|
||||
}
|
||||
|
||||
private boolean isKindOfNumber(String s) {
|
||||
for (int i = 0; i < s.length(); i ++) {
|
||||
char c = s.charAt(i);
|
||||
if (c >= '0' && c <= '9') {
|
||||
} else if (c == ':' || c == '.' || c == '#' || c == ',' || c == '-' || c == '\'' || c == '"') {
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
LatLon parsePartialLocation(String s) {
|
||||
s = s.trim();
|
||||
|
@ -1342,8 +1320,7 @@ public class SearchCoreFactory {
|
|||
searchLocation = sr.location;
|
||||
}
|
||||
break;
|
||||
case CITY:
|
||||
case VILLAGE:
|
||||
default:
|
||||
searchLocation = sr.location;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -29,26 +29,26 @@ public class SearchResult {
|
|||
public boolean firstUnknownWordMatches = true;
|
||||
public boolean unknownPhraseMatches = false;
|
||||
|
||||
public SearchResult(SearchPhrase sp) {
|
||||
this.requiredSearchPhrase = sp;
|
||||
}
|
||||
|
||||
public double getUnknownPhraseMatchWeight() {
|
||||
return getUnknownPhraseMatchWeight(false);
|
||||
}
|
||||
|
||||
private double getUnknownPhraseMatchWeight(boolean isHouse) {
|
||||
double res = 0;
|
||||
boolean isHouse = objectType == ObjectType.HOUSE;
|
||||
isHouse = isHouse || objectType == ObjectType.HOUSE;
|
||||
if (unknownPhraseMatches) {
|
||||
res = ObjectType.getTypeWeight(objectType);
|
||||
res = isHouse ? ObjectType.getTypeWeight(ObjectType.HOUSE) : ObjectType.getTypeWeight(objectType);
|
||||
}
|
||||
if (res == 0 && parentSearchResult != null && parentSearchResult.unknownPhraseMatches) {
|
||||
if (isHouse && parentSearchResult.objectType == ObjectType.STREET) {
|
||||
res = ObjectType.getTypeWeight(ObjectType.HOUSE);
|
||||
} else {
|
||||
res = ObjectType.getTypeWeight(parentSearchResult.objectType);
|
||||
}
|
||||
if (res == 0 && parentSearchResult != null) {
|
||||
return parentSearchResult.getUnknownPhraseMatchWeight(isHouse);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public SearchResult(SearchPhrase sp) {
|
||||
this.requiredSearchPhrase = sp;
|
||||
}
|
||||
|
||||
public int getFoundWordCount() {
|
||||
int inc = 0;
|
||||
if (firstUnknownWordMatches) {
|
||||
|
|
|
@ -1996,15 +1996,15 @@ public class OpeningHoursParser {
|
|||
|
||||
private static void fillRuleArray(boolean[] array, Token[] pair) {
|
||||
if (pair[0].mainNumber <= pair[1].mainNumber) {
|
||||
for (int j = pair[0].mainNumber; j <= pair[1].mainNumber && j < array.length; j++) {
|
||||
for (int j = pair[0].mainNumber; j <= pair[1].mainNumber && j >= 0 && j < array.length; j++) {
|
||||
array[j] = true;
|
||||
}
|
||||
} else {
|
||||
// overflow
|
||||
for (int j = pair[0].mainNumber; j < array.length; j++) {
|
||||
for (int j = pair[0].mainNumber; j >= 0 && j < array.length; j++) {
|
||||
array[j] = true;
|
||||
}
|
||||
for (int j = 0; j <= pair[1].mainNumber; j++) {
|
||||
for (int j = 0; j <= pair[1].mainNumber && j < array.length; j++) {
|
||||
array[j] = true;
|
||||
}
|
||||
}
|
||||
|
|
28349
OsmAnd-java/src/test/resources/search/free_street_portland.json
Normal file
|
@ -1,4 +1,270 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="time_zone">المنطقة الزمنية</string>
|
||||
<string name="shared_string_ok">موافق</string>
|
||||
<string name="timeline_available_for_free_now">الجدول الزمني ميزة متوفرة الآن مجانا.</string>
|
||||
<string name="disable_monitoring">تعطيل العرض</string>
|
||||
<string name="location_recording_enabled">تسجيل الموقع ممكن</string>
|
||||
<string name="timeline_description">تمكين العرض لتوفير جميع المواقع في السجل.</string>
|
||||
<string name="app_name_short">متتبع أوسماند</string>
|
||||
<string name="shared_string_telegram">تيليجرام</string>
|
||||
<string name="privacy_policy_use_telegram">يستخدم تيليجرام (تطبيق المراسلة) للاتصال والتواصل مع الأشخاص.</string>
|
||||
<string name="privacy_policy_telegram_client">تتبع أوسماند هوأحد العملاء الذين يستخدمون منصة تيليجرام المفتوحة. يمكن لجهات الاتصال الخاصة بك استخدام أي عميل تيليجرام آخر.</string>
|
||||
<string name="privacy_policy_agree">من خلال النقر على \"متابعة\" فإنك توافق على شروط سياسة الخصوصية تيليجرام وأوسماند.</string>
|
||||
<string name="shared_string_accept">قبول</string>
|
||||
<string name="telegram_privacy_policy">سياسة خصوصية تيليجرام</string>
|
||||
<string name="osmand_privacy_policy">سياسة الخصوصية Osmand</string>
|
||||
<string name="how_it_works">كيف يعمل</string>
|
||||
<string name="received_gps_points">نقاط GPX المستلمة: %1$s</string>
|
||||
<string name="shared_string_appearance">المظهر</string>
|
||||
<string name="show_gps_points">إظهار نقاط GPS</string>
|
||||
<string name="show_gps_points_descr">إظهار كمية نقاط GPS التي تم جمعها وإرسالها.</string>
|
||||
<string name="please_update_osmand">يرجى تحديث OsmAnd لعرض البيانات على الخريطة</string>
|
||||
<string name="shared_string_update">تحديث</string>
|
||||
<string name="gps_points_in_buffer">أرسلت (%1$d في المخزن المؤقت)</string>
|
||||
<string name="points_size">%1$d من النقاط</string>
|
||||
<string name="shared_string_date">تاريخ</string>
|
||||
<string name="shared_string_collected">جمع</string>
|
||||
<string name="gps_points">نقاط GPS</string>
|
||||
<string name="shared_string_sent">إرسال</string>
|
||||
<string name="monitoring_is_enabled">تمكين المراقبة</string>
|
||||
<string name="monitoring_is_disabled">تعطيل المراقبة</string>
|
||||
<string name="time_on_the_move">نقل الوقت</string>
|
||||
<string name="average_altitude">متوسط الارتفاع</string>
|
||||
<string name="average_speed">متوسط السرعة</string>
|
||||
<string name="open_in_osmand">عرض في OsmAnd</string>
|
||||
<string name="end_date">تاريخ الانتهاء</string>
|
||||
<string name="start_date">تاريخ البدء</string>
|
||||
<string name="send_location_as">إرسال موقع</string>
|
||||
<string name="send_location_as_descr">اختر كيف ستبدو الرسائل مع موقعك.</string>
|
||||
<string name="shared_string_map">إدارة الخرائط</string>
|
||||
<string name="shared_string_text">النص</string>
|
||||
<string name="map_and_text">خريطة ونص</string>
|
||||
<string name="last_update_from_telegram">آخر تحديث من تيليجرام</string>
|
||||
<string name="enter_another_device_name">اختيار اسم لم تستخدمه بالفعل</string>
|
||||
<string name="search_contacts">البحث عن جهات الاتصال</string>
|
||||
<string name="search_contacts_descr">ابحث في جميع المجموعات وجهات الاتصال.</string>
|
||||
<string name="type_contact_or_group_name">نوع الاتصال أو اسم المجموعة</string>
|
||||
<string name="shared_string_search">بحث</string>
|
||||
<string name="direction">الاتجاه</string>
|
||||
<string name="precision">الدقة</string>
|
||||
<string name="altitude">الارتفاع</string>
|
||||
<string name="proxy_key">مفتاح</string>
|
||||
<string name="proxy_password">كلمه المرور</string>
|
||||
<string name="proxy_username">اسم المستخدم</string>
|
||||
<string name="proxy_credentials">وثائق التفويض</string>
|
||||
<string name="proxy_port">منفذ</string>
|
||||
<string name="proxy_server">الخادم</string>
|
||||
<string name="shared_string_connection">اتصال</string>
|
||||
<string name="shared_string_enable">تفعيل</string>
|
||||
<string name="proxy_type">نوع الخادم</string>
|
||||
<string name="proxy_connected">متصل</string>
|
||||
<string name="proxy_disconnected">قطع اتصال</string>
|
||||
<string name="proxy_settings">إعدادات الوكيل</string>
|
||||
<string name="proxy">الوكيل</string>
|
||||
<string name="privacy">الخصوصيه</string>
|
||||
<string name="shared_string_select">تحديد</string>
|
||||
<string name="min_logging_distance">الحد الأدنى لمسافة التسجيل</string>
|
||||
<string name="min_logging_distance_descr">عامل التصفية: الحد الأدنى للمسافة لتسجيل نقطة جديدة</string>
|
||||
<string name="min_logging_accuracy">الحد الأدنى من دقة التسجيل</string>
|
||||
<string name="min_logging_accuracy_descr">عامل التصفية: لا تسجيل ما لم يتم الوصول إلى الدقة</string>
|
||||
<string name="min_logging_speed">الحد الأدنى لسرعة التسجيل</string>
|
||||
<string name="min_logging_speed_descr">عامل التصفية: لا تسجيل أقل من السرعة المحددة</string>
|
||||
<string name="gpx_settings">إعدادات GPX</string>
|
||||
<string name="timeline_no_data_descr">ليس لدينا بيانات تم جمعها لليوم المحدد</string>
|
||||
<string name="timeline_no_data">لا توجد بيانات</string>
|
||||
<string name="shared_string_end">نهاية</string>
|
||||
<string name="shared_string_start">بدء</string>
|
||||
<string name="shared_string_apply">تطبيق</string>
|
||||
<string name="set_time_timeline_descr">تحديد وقت للعرض</string>
|
||||
<string name="start_end_date">تاريخ البدء — تاريخ الانتهاء</string>
|
||||
<string name="saved_messages">الرسائل المحفوظة</string>
|
||||
<string name="time_zone_descr">حدد المنطقة الزمنية للعرض في موقع الرسائل.</string>
|
||||
<string name="units_and_formats">الوحدات والأشكال</string>
|
||||
<string name="unit_of_length_descr">اختيار الوحدات: كم، ميل، ميل بحري.. إلخ.</string>
|
||||
<string name="unit_of_length">وحدات الطول</string>
|
||||
<string name="unit_of_speed_system_descr">تحديد وحدة من السرعة.</string>
|
||||
<string name="unit_of_speed_system">وحدة السرعة</string>
|
||||
<string name="buffer_time_descr">الحد الأقصى للوقت لتخزين النقاط في التخزين المؤقت</string>
|
||||
<string name="buffer_time">وقت انتهاء صلاحية التخزين المؤقت</string>
|
||||
<string name="shared_string_suggested">اقترح</string>
|
||||
<string name="status_widget_title">تتبع حالة أوسماند</string>
|
||||
<string name="back_to_osmand">العودة إلى OsmAnd</string>
|
||||
<string name="last_update_from_telegram_date">آخر تحديث من تيليجرام: %1$s</string>
|
||||
<string name="last_response_date">الرد الأخير:٪ 1 $ s</string>
|
||||
<string name="last_update_from_telegram_duration">آخر تحديث من تيليجرام: %1$s قبل</string>
|
||||
<string name="last_response_duration">الرد الأخير: قبل٪ 1 $ s</string>
|
||||
<string name="shared_string_error_short">خطا</string>
|
||||
<string name="device_added_successfully">%1$s المضاف.</string>
|
||||
<string name="shared_string_add">إضافة</string>
|
||||
<string name="error_adding_new_device">تعذر إضافة جهاز جديد</string>
|
||||
<string name="enter_device_name_description">قم بتسمية جهازك الجديد كحد أقصى. 200 رمز.</string>
|
||||
<string name="device_name_is_too_long">اسم الجهاز طويل جدًا</string>
|
||||
<string name="device_name_cannot_be_empty">لا يمكن أن يكون اسم الجهاز فارغًا</string>
|
||||
<string name="device_name">اسم الجهاز</string>
|
||||
<string name="shared_string_hide">إخفاء</string>
|
||||
<string name="share_location_as_description_second_line">يمكنك إنشاء معرف الجهاز وعرضه في تليجرام باستخدام %1$s بوت الدردشة. %2$s</string>
|
||||
<string name="share_location_as_description">إذا كنت تريد توصيل أجهزة متعددة بحساب تليجرام واحد ، فأنت بحاجة إلى استخدام جهاز مختلف لمشاركة موقعك.</string>
|
||||
<string name="last_updated_location">آخر موقع تم تحديثه:</string>
|
||||
<string name="successfully_sent_and_updated">تم التحديث والإرسال بنجاح</string>
|
||||
<string name="not_possible_to_send_to_telegram_chats">لا يمكن الإرسال إلى دردشات تليجرام:</string>
|
||||
<string name="waiting_for_response_from_telegram">في انتظار الرد من تيليجرام</string>
|
||||
<string name="sending_location_messages">إرسال الموقع</string>
|
||||
<string name="initializing">بدء</string>
|
||||
<string name="searching_for_gps">تحديد المواقع…</string>
|
||||
<string name="connecting_to_the_internet">الاتصال بالإنترنت</string>
|
||||
<string name="background_work_description">تغيير إعدادات تحسين البطارية لتحقيق الاستقرار في مشاركة الموقع.</string>
|
||||
<string name="background_work">عمل الخلفية</string>
|
||||
<string name="battery_optimization_description">قم بإيقاف تشغيل تحسين البطارية لمتتبع أوسماند بحيث لا يتم إيقاف تشغيله فجأة أثناء وجوده في الخلفية.</string>
|
||||
<string name="sharing_in_background">المشاركة في الخلفية</string>
|
||||
<string name="go_to_settings">الانتقال إلى الإعدادات</string>
|
||||
<string name="shared_string_later">لاحقا</string>
|
||||
<string name="not_sent_yet">لم ترسل بعد</string>
|
||||
<string name="not_found_yet">لم يتم العثور حتى الآن</string>
|
||||
<string name="re_send_location">إعادة إرسال الموقع</string>
|
||||
<string name="last_available_location">آخر موقع متاح</string>
|
||||
<string name="sharing_status">حالات المشاركة</string>
|
||||
<string name="shared_string_status">الحالة</string>
|
||||
<string name="no_gps_connection">لا يوجد اتصال GPS</string>
|
||||
<string name="no_internet_connection">لا يوجد اتصال بالإنترنت</string>
|
||||
<string name="shared_string_disable">تعطيل</string>
|
||||
<string name="shared_string_save">حفظ</string>
|
||||
<string name="add_device">إضافة جهاز</string>
|
||||
<string name="share_location_as">مشاركة الموقع باسم</string>
|
||||
<string name="live_now_description">جهات الاتصال والمجموعات التي تشارك الموقع معك.</string>
|
||||
<string name="logout_from_osmand_telegram_descr">هل أنت متأكد من أنك تريد تسجيل الخروج من تتبع أوسماند حتى لا تتمكن من مشاركة الموقع أو رؤية موقع الآخرين؟</string>
|
||||
<string name="logout_from_osmand_telegram">تسجيل الخروج من متتبع أوسماند؟</string>
|
||||
<string name="shared_string_name">الاسم</string>
|
||||
<string name="by_distance">من خلال المسافة</string>
|
||||
<string name="by_name">بالاسم</string>
|
||||
<string name="by_group">حسب المجموعة</string>
|
||||
<string name="shared_string_sort">فرز</string>
|
||||
<string name="shared_string_sort_by">الفرز حسب</string>
|
||||
<string name="choose_osmand_desc">حدد إصدار أوسماند حيث سيتم عرض جهات الاتصال على الخريطة.</string>
|
||||
<string name="choose_osmand">حدد إصدار أوسماند لاستخدامه</string>
|
||||
<string name="disable_all_sharing_desc">إيقاف مشاركة الموقع إلى جميع الدردشات المحددة (%1$d).</string>
|
||||
<string name="disable_all_sharing">تعطيل كل المشاركة</string>
|
||||
<string name="turn_off_all">إيقاف تشغيل الكل</string>
|
||||
<string name="shared_string_exit">خروج</string>
|
||||
<string name="time_ago">قبل</string>
|
||||
<string name="last_response">الاستجابة الأخيرة</string>
|
||||
<string name="shared_string_group">مجموعة</string>
|
||||
<string name="logout_no_internet_msg">الاتصال بالإنترنت لتسجيل الخروج من تيليجرام بشكل صحيح.</string>
|
||||
<string name="shared_string_close">إغلاق</string>
|
||||
<string name="disconnect_from_telegram_desc">لإلغاء الوصول إلى مشاركة الموقع. افتح تليجرام، وانتقل إلى الإعدادات ← الخصوصية والأمان ← الجلسات ، ثم قم بإنهاء جلسة تتبع أوسماند.</string>
|
||||
<string name="disconnect_from_telegram">كيفية إيقاف تتبع أوسماند من تيليجرام</string>
|
||||
<string name="logout_help_desc">كيفية إيقاف تتبع أوسماند من تيليجرام</string>
|
||||
<string name="connected_account">حساب متصل</string>
|
||||
<string name="shared_string_account">الحساب</string>
|
||||
<string name="in_time">في %1$s</string>
|
||||
<string name="osmand_connect_desc">اختر إصدار أوسماند الذي يستخدمه تتبع أوسماند لعرض المواضع.</string>
|
||||
<string name="osmand_connect">اتصال أوسماند</string>
|
||||
<string name="location_history_desc">إخفاء جهات الاتصال التي لم يتم نقلها في وقت معين.</string>
|
||||
<string name="location_history">تاريخ الموقع</string>
|
||||
<string name="stale_location_desc">آخر مرة تم فيها نقل جهة اتصال.</string>
|
||||
<string name="stale_location">عدم النقل</string>
|
||||
<string name="send_my_location_desc">تعيين الحد الأدنى للفاصل الزمني لمشاركة الموقع.</string>
|
||||
<string name="send_my_location">إرسال موقعي</string>
|
||||
<string name="gps_and_location">موقف</string>
|
||||
<string name="sharing_time">مشاركة الوقت</string>
|
||||
<string name="expire_at">الانتهاء</string>
|
||||
<string name="stop_sharing_all">المشاركة قيد التشغيل (إيقاف التشغيل)</string>
|
||||
<string name="turn_off_location_sharing">إيقاف مشاركة الموقع</string>
|
||||
<string name="open_osmand">فتح أوسماند</string>
|
||||
<string name="shared_string_live">مباشر</string>
|
||||
<string name="shared_string_bot">بوت</string>
|
||||
<string name="get_telegram_title">التسجيل في تيليجرام</string>
|
||||
<string name="get_telegram_account_first">تحتاج إلى حساب تيليجرام لاستخدام مشاركة الموقع.</string>
|
||||
<string name="get_telegram_description_continue">الرجاء تثبيت تيليجرام وإنشاء حساب.</string>
|
||||
<string name="get_telegram_after_creating_account">ثم يمكنك استخدام هذا التطبيق.</string>
|
||||
<string name="shared_string_all">الكل</string>
|
||||
<string name="shared_string_off">إيقاف</string>
|
||||
<string name="already_registered_in_telegram">تحتاج إلى حساب تيليجرام مسجل ورقم هاتف</string>
|
||||
<string name="do_not_have_telegram">ليس لدي حساب تيليجرام</string>
|
||||
<string name="enter_phone_number">إدخال رقم الهاتف</string>
|
||||
<string name="enter_authentication_code">إدخال رمز المصادقة</string>
|
||||
<string name="set_visible_time_for_all">تعيين وقت مرئي للجميع</string>
|
||||
<string name="hours_and_minutes_format">%1$d ساعة %2$d دقيقة</string>
|
||||
<string name="minutes_format">%1$d دقيقة</string>
|
||||
<string name="hours_format">%1$d ساعة</string>
|
||||
<string name="shared_string_install">تثبيت</string>
|
||||
<string name="shared_string_share">مشاركة</string>
|
||||
<string name="shared_string_back">عودة</string>
|
||||
<string name="visible_time_for_all">وقت مرئي للجميع</string>
|
||||
<string name="set_time_description">قم بتعيين الوقت الذي ستظهر فيه جهات الاتصال والمجموعات المحددة لموقعك في الوقت الفعلي.</string>
|
||||
<string name="set_time">تعيين الوقت</string>
|
||||
<string name="location_sharing_description">حدد جهات الاتصال والمجموعات التي تريد مشاركة موقعك معها.</string>
|
||||
<string name="my_location_search_hint">البحث: مجموعة أو جهة اتصال</string>
|
||||
<string name="start_location_sharing">مشاركة الموقع</string>
|
||||
<string name="show_on_map">إظهار على الخريطة</string>
|
||||
<string name="app_name">تتبع أوسماند متصل بالجي بي اس</string>
|
||||
<string name="phone_number_title">رقم الهاتف</string>
|
||||
<string name="phone_number_descr">رقم الهاتف في شكل دولي</string>
|
||||
<string name="shared_string_password">كلمة المرور</string>
|
||||
<string name="enter_code">أدخل الرمز</string>
|
||||
<string name="authentication_code">رمز المصادقة</string>
|
||||
<string name="authentication_code_descr">أرسل لك تيليجرام رمزا لأوسماند لتسجيل الدخول إلى حسابك.</string>
|
||||
<string name="enter_password">أدخل كلمة المرور</string>
|
||||
<string name="password_descr">كلمة مرور تيليجرام</string>
|
||||
<string name="shared_string_login">تسجيل الدخول</string>
|
||||
<string name="shared_string_logout">تسجيل الخروج</string>
|
||||
<string name="initialization">بدء</string>
|
||||
<string name="logging_out">تسجيل الخروج</string>
|
||||
<string name="closing">اغلاق</string>
|
||||
<string name="gps_network_not_enabled">تشغيل \"الموقع\"؟</string>
|
||||
<string name="not_logged_in">لم تقم بتسجيل الدخول</string>
|
||||
<string name="shared_string_continue">استمرار</string>
|
||||
<string name="shared_string_cancel">إلغاء</string>
|
||||
<string name="shared_string_settings">الإعدادات</string>
|
||||
<string name="no_location_permission">يفتقر التطبيق إلى إذن للوصول إلى بيانات الموقع.</string>
|
||||
<string name="gps_not_available">الرجاء تشغيل \"الموقع\" في إعدادات النظام</string>
|
||||
<string name="location_service_no_gps_available">حدد أحد موفري الموقع لمشاركة موقعك.</string>
|
||||
<string name="osmand_service">حالة وضع السكون</string>
|
||||
<string name="osmand_service_descr">يعمل تتبع أوسماند في الخلفية مع إيقاف تشغيل الشاشة.</string>
|
||||
<string name="shared_string_distance">المسافة</string>
|
||||
<string name="share_location">مشاركة الموقع</string>
|
||||
<string name="sharing_location">مشاركة الموقع</string>
|
||||
<string name="process_service">خدمة تتبع أوسماند</string>
|
||||
<string name="osmand_logo">شعار أوسماند</string>
|
||||
<string name="install_osmand_dialog_message">تحتاج إلى تثبيت النسخة المجانية أو المدفوعة من أوسماند أولا</string>
|
||||
<string name="install_osmand">تثبيت أوسماند</string>
|
||||
<string name="show_users_on_map">عرض المستخدمين على الخريطة</string>
|
||||
<string name="active_chats">محادثات نشطة</string>
|
||||
<string name="shared_string_authorization">تفويض</string>
|
||||
<string name="shared_string_authorization_descr">يرجى إدخال رقم هاتف تيليجرام الخاص بك بالصيغة الدولية</string>
|
||||
<string name="shared_string_welcome">مرحبا بك</string>
|
||||
<string name="yard">ياردة</string>
|
||||
<string name="foot">قدم</string>
|
||||
<string name="mile">ميل</string>
|
||||
<string name="km">كلم</string>
|
||||
<string name="m">م</string>
|
||||
<string name="nm">ميل بحري</string>
|
||||
<string name="min_mile">د/م</string>
|
||||
<string name="min_km">د/كم</string>
|
||||
<string name="nm_h">ميل بحري</string>
|
||||
<string name="m_s">م/ث</string>
|
||||
<string name="km_h">كم/س</string>
|
||||
<string name="mile_per_hour">ميل ساعة</string>
|
||||
<string name="si_kmh">كم/س</string>
|
||||
<string name="si_mph">ميل ساعة</string>
|
||||
<string name="si_m_s">م/ث</string>
|
||||
<string name="si_min_km">دقيقة/كم</string>
|
||||
<string name="si_min_m">دقيقة/ميل</string>
|
||||
<string name="si_nm_h">ميل بحري في الساعة (عقدة)</string>
|
||||
<string name="si_mi_feet">ميل ، قدم</string>
|
||||
<string name="si_mi_yard">ميل ، ياردة</string>
|
||||
<string name="si_km_m">كم ، متر</string>
|
||||
<string name="si_nm">ميل بحري</string>
|
||||
<string name="si_mi_meters">ميل ، متر</string>
|
||||
<string name="shared_string_hour_short">س</string>
|
||||
<string name="shared_string_minute_short">دقيقة</string>
|
||||
<string name="shared_string_second_short">ثانية</string>
|
||||
<string name="welcome_descr"><b>تتبع أوسماند</b> يتيح لك مشاركة موقعك ورؤية الآخرين في أوسماند.<br/><br/>يستخدم التطبيق تيليجرام API، لذلك تحتاج إلى حساب تيليجرام.</string>
|
||||
<string name="my_location">موقعي</string>
|
||||
<string name="live_now">مباشر الآن</string>
|
||||
<string name="timeline">المخطط الزمني</string>
|
||||
<string name="bearing">اتجاه</string>
|
||||
<string name="location_sharing_status">مشاركة: %1$s</string>
|
||||
<string name="shared_string_enabled">مفعل</string>
|
||||
<string name="duration_ago">%1$s منذ</string>
|
||||
</resources>
|
|
@ -13,7 +13,7 @@
|
|||
<string name="osmand_service">حالة وضع السكون</string>
|
||||
<string name="nm_h">ميل بحري</string>
|
||||
<string name="si_nm_h">ميل بحري في الساعة (عقدة)</string>
|
||||
<string name="si_km_m">كم ، متر</string>
|
||||
<string name="si_km_m">كم ، م</string>
|
||||
<string name="shared_string_end">نهاية</string>
|
||||
<string name="saved_messages">الرسائل المحفوظة</string>
|
||||
<string name="shared_string_update">تحديث</string>
|
||||
|
@ -28,7 +28,7 @@
|
|||
<string name="shared_string_name">الاسم</string>
|
||||
<string name="by_name">بالاسم</string>
|
||||
<string name="shared_string_sort">فرز</string>
|
||||
<string name="shared_string_exit">مخرج</string>
|
||||
<string name="shared_string_exit">خروج</string>
|
||||
<string name="shared_string_close">إغلاق</string>
|
||||
<string name="shared_string_all">الكل</string>
|
||||
<string name="shared_string_off">إيقاف</string>
|
||||
|
@ -43,7 +43,7 @@
|
|||
<string name="yard">ياردة</string>
|
||||
<string name="foot">قدم</string>
|
||||
<string name="mile">ميل</string>
|
||||
<string name="km">كلم</string>
|
||||
<string name="km">كم</string>
|
||||
<string name="m">م</string>
|
||||
<string name="nm">ميل بحري</string>
|
||||
<string name="min_mile">د/م</string>
|
||||
|
@ -58,7 +58,7 @@
|
|||
<string name="si_mi_feet">ميل ، قدم</string>
|
||||
<string name="si_mi_yard">ميل ، ياردة</string>
|
||||
<string name="si_nm">ميل بحري</string>
|
||||
<string name="si_mi_meters">ميل ، متر</string>
|
||||
<string name="si_mi_meters">ميل ، م</string>
|
||||
<string name="shared_string_search">بحث</string>
|
||||
<string name="altitude">الارتفاع</string>
|
||||
<string name="shared_string_enable">تفعيل</string>
|
||||
|
@ -73,4 +73,198 @@
|
|||
<string name="last_response_date">الرد الأخير:٪ 1 $ s</string>
|
||||
<string name="last_update_from_telegram_duration">آخر تحديث من تيليجرام: %1$s قبل</string>
|
||||
<string name="last_response_duration">الرد الأخير: قبل٪ 1 $ s</string>
|
||||
<string name="shared_string_error_short">خطا</string>
|
||||
<string name="privacy_policy_telegram_client">تتبع أوسماند هوأحد العملاء الذين يستخدمون منصة تيليجرام المفتوحة. يمكن لجهات الاتصال الخاصة بك استخدام أي عميل تيليجرام آخر.</string>
|
||||
<string name="privacy_policy_agree">من خلال النقر على \"متابعة\" فإنك توافق على شروط سياسة الخصوصية تيليجرام وأوسماند.</string>
|
||||
<string name="shared_string_accept">قبول</string>
|
||||
<string name="telegram_privacy_policy">سياسة خصوصية تيليجرام</string>
|
||||
<string name="osmand_privacy_policy">سياسة الخصوصية Osmand</string>
|
||||
<string name="how_it_works">كيف يعمل</string>
|
||||
<string name="received_gps_points">نقاط GPX المستلمة: %1$s</string>
|
||||
<string name="shared_string_appearance">المظهر</string>
|
||||
<string name="show_gps_points">إظهار نقاط GPS</string>
|
||||
<string name="show_gps_points_descr">إظهار كمية نقاط GPS التي تم جمعها وإرسالها.</string>
|
||||
<string name="please_update_osmand">يرجى تحديث OsmAnd لعرض البيانات على الخريطة</string>
|
||||
<string name="gps_points_in_buffer">أرسلت (%1$d في المخزن المؤقت)</string>
|
||||
<string name="points_size">%1$d من النقاط</string>
|
||||
<string name="shared_string_date">تاريخ</string>
|
||||
<string name="shared_string_collected">جمع</string>
|
||||
<string name="gps_points">نقاط GPS</string>
|
||||
<string name="shared_string_sent">إرسال</string>
|
||||
<string name="monitoring_is_enabled">تمكين المراقبة</string>
|
||||
<string name="monitoring_is_disabled">تعطيل المراقبة</string>
|
||||
<string name="time_on_the_move">نقل الوقت</string>
|
||||
<string name="open_in_osmand">عرض في OsmAnd</string>
|
||||
<string name="end_date">تاريخ الانتهاء</string>
|
||||
<string name="start_date">تاريخ البدء</string>
|
||||
<string name="send_location_as">إرسال موقع</string>
|
||||
<string name="send_location_as_descr">اختر كيف ستبدو الرسائل مع موقعك.</string>
|
||||
<string name="shared_string_text">النص</string>
|
||||
<string name="map_and_text">خريطة ونص</string>
|
||||
<string name="last_update_from_telegram">آخر تحديث من تيليجرام</string>
|
||||
<string name="enter_another_device_name">اختيار اسم لم تستخدمه بالفعل</string>
|
||||
<string name="device_added_successfully">%1$s المضاف.</string>
|
||||
<string name="error_adding_new_device">تعذر إضافة جهاز جديد</string>
|
||||
<string name="enter_device_name_description">قم بتسمية جهازك الجديد كحد أقصى. 200 رمز.</string>
|
||||
<string name="device_name_is_too_long">اسم الجهاز طويل جدًا</string>
|
||||
<string name="device_name_cannot_be_empty">لا يمكن أن يكون اسم الجهاز فارغًا</string>
|
||||
<string name="device_name">اسم الجهاز</string>
|
||||
<string name="share_location_as_description_second_line">يمكنك إنشاء معرف الجهاز وعرضه في تليجرام باستخدام %1$s بوت الدردشة. %2$s</string>
|
||||
<string name="share_location_as_description">إذا كنت تريد توصيل أجهزة متعددة بحساب تليجرام واحد ، فأنت بحاجة إلى استخدام جهاز مختلف لمشاركة موقعك.</string>
|
||||
<string name="last_updated_location">آخر موقع تم تحديثه:</string>
|
||||
<string name="successfully_sent_and_updated">تم التحديث والإرسال بنجاح</string>
|
||||
<string name="not_possible_to_send_to_telegram_chats">لا يمكن الإرسال إلى دردشات تليجرام:</string>
|
||||
<string name="waiting_for_response_from_telegram">في انتظار الرد من تيليجرام</string>
|
||||
<string name="sending_location_messages">إرسال الموقع</string>
|
||||
<string name="initializing">بدء</string>
|
||||
<string name="searching_for_gps">تحديد المواقع…</string>
|
||||
<string name="connecting_to_the_internet">الاتصال بالإنترنت</string>
|
||||
<string name="background_work_description">تغيير إعدادات تحسين البطارية لتحقيق الاستقرار في مشاركة الموقع.</string>
|
||||
<string name="background_work">عمل الخلفية</string>
|
||||
<string name="battery_optimization_description">قم بإيقاف تشغيل تحسين البطارية لمتتبع أوسماند بحيث لا يتم إيقاف تشغيله فجأة أثناء وجوده في الخلفية.</string>
|
||||
<string name="sharing_in_background">المشاركة في الخلفية</string>
|
||||
<string name="go_to_settings">الانتقال إلى الإعدادات</string>
|
||||
<string name="not_sent_yet">لم ترسل بعد</string>
|
||||
<string name="not_found_yet">لم يتم العثور حتى الآن</string>
|
||||
<string name="re_send_location">إعادة إرسال الموقع</string>
|
||||
<string name="last_available_location">آخر موقع متاح</string>
|
||||
<string name="sharing_status">حالات المشاركة</string>
|
||||
<string name="no_gps_connection">لا يوجد اتصال GPS</string>
|
||||
<string name="no_internet_connection">لا يوجد اتصال بالإنترنت</string>
|
||||
<string name="add_device">إضافة جهاز</string>
|
||||
<string name="share_location_as">مشاركة الموقع باسم</string>
|
||||
<string name="live_now_description">جهات الاتصال والمجموعات التي تشارك الموقع معك.</string>
|
||||
<string name="logout_from_osmand_telegram_descr">هل أنت متأكد من أنك تريد تسجيل الخروج من تتبع أوسماند حتى لا تتمكن من مشاركة الموقع أو رؤية موقع الآخرين؟</string>
|
||||
<string name="logout_from_osmand_telegram">تسجيل الخروج من متتبع أوسماند؟</string>
|
||||
<string name="by_distance">من خلال المسافة</string>
|
||||
<string name="by_group">حسب المجموعة</string>
|
||||
<string name="shared_string_sort_by">الفرز حسب</string>
|
||||
<string name="choose_osmand_desc">حدد إصدار أوسماند حيث سيتم عرض جهات الاتصال على الخريطة.</string>
|
||||
<string name="choose_osmand">حدد إصدار أوسماند لاستخدامه</string>
|
||||
<string name="disable_all_sharing_desc">إيقاف مشاركة الموقع إلى جميع الدردشات المحددة (%1$d).</string>
|
||||
<string name="disable_all_sharing">تعطيل كل المشاركة</string>
|
||||
<string name="turn_off_all">إيقاف تشغيل الكل</string>
|
||||
<string name="time_ago">قبل</string>
|
||||
<string name="last_response">الاستجابة الأخيرة</string>
|
||||
<string name="shared_string_group">مجموعة</string>
|
||||
<string name="logout_no_internet_msg">الاتصال بالإنترنت لتسجيل الخروج من تيليجرام بشكل صحيح.</string>
|
||||
<string name="disconnect_from_telegram_desc">لإلغاء الوصول إلى مشاركة الموقع. افتح تليجرام، وانتقل إلى الإعدادات ← الخصوصية والأمان ← الجلسات ، ثم قم بإنهاء جلسة تتبع أوسماند.</string>
|
||||
<string name="disconnect_from_telegram">كيفية إيقاف تتبع أوسماند من تيليجرام</string>
|
||||
<string name="logout_help_desc">كيفية إيقاف تتبع أوسماند من تيليجرام</string>
|
||||
<string name="connected_account">حساب متصل</string>
|
||||
<string name="shared_string_account">الحساب</string>
|
||||
<string name="in_time">في %1$s</string>
|
||||
<string name="osmand_connect_desc">اختر إصدار أوسماند الذي يستخدمه تتبع أوسماند لعرض المواضع.</string>
|
||||
<string name="osmand_connect">اتصال أوسماند</string>
|
||||
<string name="location_history_desc">إخفاء جهات الاتصال التي لم يتم نقلها في وقت معين.</string>
|
||||
<string name="location_history">تاريخ الموقع</string>
|
||||
<string name="stale_location_desc">آخر مرة تم فيها نقل جهة اتصال.</string>
|
||||
<string name="stale_location">عدم النقل</string>
|
||||
<string name="send_my_location_desc">تعيين الحد الأدنى للفاصل الزمني لمشاركة الموقع.</string>
|
||||
<string name="send_my_location">إرسال موقعي</string>
|
||||
<string name="gps_and_location">موقف</string>
|
||||
<string name="sharing_time">مشاركة الوقت</string>
|
||||
<string name="expire_at">الانتهاء</string>
|
||||
<string name="stop_sharing_all">المشاركة قيد التشغيل (إيقاف التشغيل)</string>
|
||||
<string name="turn_off_location_sharing">إيقاف مشاركة الموقع</string>
|
||||
<string name="open_osmand">فتح أوسماند</string>
|
||||
<string name="shared_string_live">مباشر</string>
|
||||
<string name="shared_string_bot">بوت</string>
|
||||
<string name="get_telegram_title">التسجيل في تيليجرام</string>
|
||||
<string name="get_telegram_account_first">تحتاج إلى حساب تيليجرام لاستخدام مشاركة الموقع.</string>
|
||||
<string name="get_telegram_description_continue">الرجاء تثبيت تيليجرام وإنشاء حساب.</string>
|
||||
<string name="get_telegram_after_creating_account">ثم يمكنك استخدام هذا التطبيق.</string>
|
||||
<string name="already_registered_in_telegram">تحتاج إلى حساب تيليجرام مسجل ورقم هاتف</string>
|
||||
<string name="do_not_have_telegram">ليس لدي حساب تيليجرام</string>
|
||||
<string name="enter_phone_number">إدخال رقم الهاتف</string>
|
||||
<string name="enter_authentication_code">إدخال رمز المصادقة</string>
|
||||
<string name="set_visible_time_for_all">تعيين وقت مرئي للجميع</string>
|
||||
<string name="hours_and_minutes_format">%1$d ساعة %2$d دقيقة</string>
|
||||
<string name="minutes_format">%1$d دقيقة</string>
|
||||
<string name="hours_format">%1$d ساعة</string>
|
||||
<string name="visible_time_for_all">وقت مرئي للجميع</string>
|
||||
<string name="set_time_description">قم بتعيين الوقت الذي ستظهر فيه جهات الاتصال والمجموعات المحددة لموقعك في الوقت الفعلي.</string>
|
||||
<string name="set_time">تعيين الوقت</string>
|
||||
<string name="location_sharing_description">حدد جهات الاتصال والمجموعات التي تريد مشاركة موقعك معها.</string>
|
||||
<string name="my_location_search_hint">البحث: مجموعة أو جهة اتصال</string>
|
||||
<string name="start_location_sharing">مشاركة الموقع</string>
|
||||
<string name="show_on_map">إظهار على الخريطة</string>
|
||||
<string name="app_name">تتبع أوسماند متصل بالجي بي اس</string>
|
||||
<string name="phone_number_title">رقم الهاتف</string>
|
||||
<string name="phone_number_descr">رقم الهاتف في شكل دولي</string>
|
||||
<string name="enter_code">أدخل الرمز</string>
|
||||
<string name="authentication_code">رمز المصادقة</string>
|
||||
<string name="authentication_code_descr">أرسل لك تيليجرام رمزا لأوسماند لتسجيل الدخول إلى حسابك.</string>
|
||||
<string name="enter_password">أدخل كلمة المرور</string>
|
||||
<string name="password_descr">كلمة مرور تيليجرام</string>
|
||||
<string name="shared_string_login">تسجيل الدخول</string>
|
||||
<string name="shared_string_logout">تسجيل الخروج</string>
|
||||
<string name="initialization">بدء</string>
|
||||
<string name="logging_out">تسجيل الخروج</string>
|
||||
<string name="closing">اغلاق</string>
|
||||
<string name="gps_network_not_enabled">تشغيل \"الموقع\"؟</string>
|
||||
<string name="not_logged_in">لم تقم بتسجيل الدخول</string>
|
||||
<string name="no_location_permission">يفتقر التطبيق إلى إذن للوصول إلى بيانات الموقع.</string>
|
||||
<string name="gps_not_available">الرجاء تشغيل \"الموقع\" في إعدادات النظام</string>
|
||||
<string name="location_service_no_gps_available">حدد أحد موفري الموقع لمشاركة موقعك.</string>
|
||||
<string name="osmand_service_descr">يعمل تتبع أوسماند في الخلفية مع إيقاف تشغيل الشاشة.</string>
|
||||
<string name="share_location">مشاركة الموقع</string>
|
||||
<string name="sharing_location">مشاركة الموقع</string>
|
||||
<string name="process_service">خدمة تتبع أوسماند</string>
|
||||
<string name="osmand_logo">شعار أوسماند</string>
|
||||
<string name="install_osmand_dialog_message">تحتاج إلى تثبيت النسخة المجانية أو المدفوعة من أوسماند أولا</string>
|
||||
<string name="install_osmand">تثبيت أوسماند</string>
|
||||
<string name="show_users_on_map">عرض المستخدمين على الخريطة</string>
|
||||
<string name="active_chats">محادثات نشطة</string>
|
||||
<string name="shared_string_authorization">تفويض</string>
|
||||
<string name="shared_string_authorization_descr">يرجى إدخال رقم هاتف تيليجرام الخاص بك بالصيغة الدولية</string>
|
||||
<string name="shared_string_welcome">مرحبا بك</string>
|
||||
<string name="shared_string_hour_short">س</string>
|
||||
<string name="shared_string_minute_short">دقيقة</string>
|
||||
<string name="shared_string_second_short">ثانية</string>
|
||||
<string name="welcome_descr"><b>تتبع أوسماند</b> يتيح لك مشاركة موقعك ورؤية الآخرين في أوسماند.<br/><br/>يستخدم التطبيق تيليجرام API، لذلك تحتاج إلى حساب تيليجرام.</string>
|
||||
<string name="my_location">موقعي</string>
|
||||
<string name="live_now">مباشر الآن</string>
|
||||
<string name="timeline">المخطط الزمني</string>
|
||||
<string name="search_contacts">البحث عن جهات الاتصال</string>
|
||||
<string name="search_contacts_descr">ابحث في جميع المجموعات وجهات الاتصال.</string>
|
||||
<string name="type_contact_or_group_name">نوع الاتصال أو اسم المجموعة</string>
|
||||
<string name="direction">الاتجاه</string>
|
||||
<string name="precision">الدقة</string>
|
||||
<string name="bearing">اتجاه</string>
|
||||
<string name="proxy_key">مفتاح</string>
|
||||
<string name="proxy_password">كلمه المرور</string>
|
||||
<string name="proxy_username">اسم المستخدم</string>
|
||||
<string name="proxy_credentials">وثائق التفويض</string>
|
||||
<string name="proxy_port">منفذ</string>
|
||||
<string name="proxy_server">الخادم</string>
|
||||
<string name="shared_string_connection">اتصال</string>
|
||||
<string name="proxy_type">نوع الخادم</string>
|
||||
<string name="proxy_connected">متصل</string>
|
||||
<string name="proxy_disconnected">قطع اتصال</string>
|
||||
<string name="proxy_settings">إعدادات الوكيل</string>
|
||||
<string name="proxy">الوكيل</string>
|
||||
<string name="privacy">الخصوصيه</string>
|
||||
<string name="min_logging_distance">الحد الأدنى لمسافة التسجيل</string>
|
||||
<string name="min_logging_distance_descr">عامل التصفية: الحد الأدنى للمسافة لتسجيل نقطة جديدة</string>
|
||||
<string name="min_logging_accuracy">الحد الأدنى من دقة التسجيل</string>
|
||||
<string name="min_logging_accuracy_descr">عامل التصفية: لا تسجيل ما لم يتم الوصول إلى الدقة</string>
|
||||
<string name="min_logging_speed">الحد الأدنى لسرعة التسجيل</string>
|
||||
<string name="min_logging_speed_descr">عامل التصفية: لا تسجيل أقل من السرعة المحددة</string>
|
||||
<string name="gpx_settings">إعدادات GPX</string>
|
||||
<string name="timeline_no_data_descr">ليس لدينا بيانات مجمعة لليوم المحدد</string>
|
||||
<string name="timeline_no_data">لا توجد بيانات</string>
|
||||
<string name="set_time_timeline_descr">تحديد وقت للعرض</string>
|
||||
<string name="start_end_date">تاريخ البدء — تاريخ الانتهاء</string>
|
||||
<string name="location_sharing_status">مشاركة: %1$s</string>
|
||||
<string name="time_zone_descr">حدد المنطقة الزمنية للعرض في موقع الرسائل.</string>
|
||||
<string name="time_zone">المنطقة الزمنية</string>
|
||||
<string name="unit_of_speed_system_descr">تحديد وحدة من السرعة.</string>
|
||||
<string name="unit_of_speed_system">وحدة السرعة</string>
|
||||
<string name="buffer_time_descr">الحد الأقصى للوقت لتخزين النقاط في التخزين المؤقت</string>
|
||||
<string name="buffer_time">وقت انتهاء صلاحية التخزين المؤقت</string>
|
||||
<string name="shared_string_suggested">مقترح</string>
|
||||
<string name="status_widget_title">تتبع حالة أوسماند</string>
|
||||
<string name="back_to_osmand">العودة إلى OsmAnd</string>
|
||||
<string name="duration_ago">%1$s منذ</string>
|
||||
</resources>
|
|
@ -268,4 +268,5 @@
|
|||
<string name="last_update_from_telegram_duration">Апошняе абнаўленне з Telegram: %1$s таму</string>
|
||||
<string name="last_response_duration">Апошні адказ: %1$s таму</string>
|
||||
<string name="duration_ago">%1$s таму</string>
|
||||
<string name="shared_string_error_short">ERR</string>
|
||||
</resources>
|
|
@ -241,7 +241,7 @@
|
|||
<string name="min_logging_speed">Velocitat mínima de registre</string>
|
||||
<string name="min_logging_speed_descr">Filtre: no s\'enregistra per sota de la velocitat seleccionada</string>
|
||||
<string name="gpx_settings">Configuració GPX</string>
|
||||
<string name="timeline_no_data_descr">No hem recopilat dades per al dia seleccionat</string>
|
||||
<string name="timeline_no_data_descr">No hem recopilat dades del dia seleccionat</string>
|
||||
<string name="timeline_no_data">No hi ha dades</string>
|
||||
<string name="shared_string_end">Finalitza</string>
|
||||
<string name="shared_string_start">Comença</string>
|
||||
|
@ -266,4 +266,5 @@
|
|||
<string name="last_update_from_telegram_duration">Darrera actualització des de Telegram: fa %1$s</string>
|
||||
<string name="last_response_duration">Darrera resposta: fa %1$s</string>
|
||||
<string name="duration_ago">fa %1$s</string>
|
||||
<string name="shared_string_error_short">ERR</string>
|
||||
</resources>
|
|
@ -67,4 +67,5 @@
|
|||
<string name="gpx_settings">Nastavení GPX</string>
|
||||
<string name="timeline_no_data_descr">Nemáme nasbíraná data pro daný den</string>
|
||||
<string name="timeline_no_data">Žádná data</string>
|
||||
<string name="unit_of_length_descr">Zvolte, v čem se měří vzdálenost.</string>
|
||||
</resources>
|
|
@ -268,4 +268,5 @@
|
|||
<string name="last_update_from_telegram_duration">Sidste opdatering fra Telegram: %1$s siden</string>
|
||||
<string name="last_response_duration">Sidste svar: %1$s siden</string>
|
||||
<string name="duration_ago">%1$s siden</string>
|
||||
<string name="shared_string_error_short">ERR</string>
|
||||
</resources>
|
|
@ -187,4 +187,11 @@
|
|||
<string name="set_time_timeline_descr">Hautatu bistaratzeko denbora</string>
|
||||
<string name="start_end_date">Hasiera — Amaiera data</string>
|
||||
<string name="shared_string_enabled">Gaituta</string>
|
||||
<string name="saved_messages">Gordetako mezuak</string>
|
||||
<string name="units_and_formats">Unitate eta formatuak</string>
|
||||
<string name="unit_of_length_descr">Aldatu distantzia neurtzeko unitateak.</string>
|
||||
<string name="unit_of_length">Luzera unitatea</string>
|
||||
<string name="unit_of_speed_system_descr">Zehaztu abiadura unitatea.</string>
|
||||
<string name="unit_of_speed_system">Abiadura unitatea</string>
|
||||
<string name="shared_string_error_short">ERR</string>
|
||||
</resources>
|
|
@ -1,2 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="shared_string_disable">Pois käytöstä</string>
|
||||
<string name="shared_string_save">Tallenna</string>
|
||||
<string name="add_device">Lisää laite</string>
|
||||
</resources>
|
|
@ -243,7 +243,7 @@
|
|||
<string name="min_logging_speed">Velocidade mínima de registro</string>
|
||||
<string name="min_logging_speed_descr">Filtro: sem registro abaixo da velocidade selecionada</string>
|
||||
<string name="gpx_settings">Configurações de GPX</string>
|
||||
<string name="timeline_no_data_descr">Nós não coletamos dados para o dia selecionado</string>
|
||||
<string name="timeline_no_data_descr">Não coletamos dados para o dia selecionado</string>
|
||||
<string name="timeline_no_data">Sem dados</string>
|
||||
<string name="shared_string_end">Fim</string>
|
||||
<string name="shared_string_start">Iniciar</string>
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
<string name="sharing_status">Стан трансляції</string>
|
||||
<string name="location_sharing_status">Трансляція: %1$s</string>
|
||||
<string name="shared_string_enabled">Увімкнено</string>
|
||||
<string name="shared_string_status">Статус</string>
|
||||
<string name="shared_string_status">Стан</string>
|
||||
<string name="no_gps_connection">Немає зʼєднання із GPS</string>
|
||||
<string name="no_internet_connection">Немає зʼєднання із інтернетом</string>
|
||||
<string name="shared_string_disable">Вимкнути</string>
|
||||
|
@ -221,10 +221,10 @@
|
|||
<string name="privacy">Конфіденційність</string>
|
||||
<string name="timeline_no_data">Нема даних</string>
|
||||
<string name="shared_string_end">Кінець</string>
|
||||
<string name="shared_string_start">Початок</string>
|
||||
<string name="shared_string_start">Почати</string>
|
||||
<string name="start_end_date">Дата початку - кінця</string>
|
||||
<string name="gpx_settings">Налаштування GPX</string>
|
||||
<string name="timeline_no_data_descr">Накопичені дані для обраного дня відсутні</string>
|
||||
<string name="timeline_no_data_descr">Ми не збирали дані за вибраний день</string>
|
||||
<string name="send_location_as">Надіслати місцезнаходження як</string>
|
||||
<string name="send_location_as_descr">Виберіть, як виглядатимуть повідомлення з вашим місцезнаходженням.</string>
|
||||
<string name="time_on_the_move">Час руху</string>
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
<string name="shared_string_apply">Apply</string>
|
||||
<string name="set_time_timeline_descr">Select time to display</string>
|
||||
<string name="start_end_date">Start — End date</string>
|
||||
<string name="timeline_no_data_descr">We don`t have collected data for the selected day</string>
|
||||
<string name="timeline_no_data_descr">We don\'t have collected data for the selected day</string>
|
||||
<string name="timeline_no_data">No data</string>
|
||||
<string name="shared_string_select">Select</string>
|
||||
<string name="min_logging_distance">Minimum logging distance</string>
|
||||
|
|
|
@ -446,7 +446,7 @@ class TelegramHelper private constructor() {
|
|||
offsetOrder = last.order
|
||||
offsetChatId = last.chatId
|
||||
}
|
||||
client?.send(TdApi.GetChats(offsetOrder, offsetChatId, CHATS_LIMIT - chatList.size)) { obj ->
|
||||
client?.send(TdApi.GetChats(TdApi.ChatListMain(), offsetOrder, offsetChatId, CHATS_LIMIT - chatList.size)) { obj ->
|
||||
when (obj.constructor) {
|
||||
TdApi.Error.CONSTRUCTOR -> {
|
||||
val error = obj as TdApi.Error
|
||||
|
@ -533,8 +533,9 @@ class TelegramHelper private constructor() {
|
|||
}
|
||||
resultArticles.forEach {
|
||||
shareInfo.lastTextMessageHandled = false
|
||||
client?.send(TdApi.SendInlineQueryResultMessage(shareInfo.chatId, 0, true,
|
||||
true, inlineQueryResults.inlineQueryId, it.id, false)) { obj ->
|
||||
val sendOptions = TdApi.SendMessageOptions(true, true, null)
|
||||
client?.send(TdApi.SendInlineQueryResultMessage(shareInfo.chatId, 0, sendOptions,
|
||||
inlineQueryResults.inlineQueryId, it.id, false)) { obj ->
|
||||
handleTextLocationMessageUpdate(obj, shareInfo, true)
|
||||
}
|
||||
}
|
||||
|
@ -861,7 +862,8 @@ class TelegramHelper private constructor() {
|
|||
shareInfo.pendingTdLibText++
|
||||
shareInfo.lastSendTextMessageTime = (System.currentTimeMillis() / 1000).toInt()
|
||||
log.error("sendNewTextLocation ${shareInfo.pendingTdLibText}")
|
||||
client?.send(TdApi.SendMessage(shareInfo.chatId, 0, false, true, null, content)) { obj ->
|
||||
val sendOptions = TdApi.SendMessageOptions(false, true, null)
|
||||
client?.send(TdApi.SendMessage(shareInfo.chatId, 0, sendOptions, null, content)) { obj ->
|
||||
handleTextLocationMessageUpdate(obj, shareInfo, false)
|
||||
}
|
||||
}
|
||||
|
@ -893,7 +895,8 @@ class TelegramHelper private constructor() {
|
|||
shareInfo.pendingTdLibMap++
|
||||
shareInfo.lastSendMapMessageTime = (System.currentTimeMillis() / 1000).toInt()
|
||||
log.error("sendNewMapLocation ${shareInfo.pendingTdLibMap}")
|
||||
client?.send(TdApi.SendMessage(shareInfo.chatId, 0, false, true, null, content)) { obj ->
|
||||
val sendOptions = TdApi.SendMessageOptions(false, true, null)
|
||||
client?.send(TdApi.SendMessage(shareInfo.chatId, 0, sendOptions, null, content)) { obj ->
|
||||
handleMapLocationMessageUpdate(obj, shareInfo, false)
|
||||
}
|
||||
}
|
||||
|
@ -1224,7 +1227,7 @@ class TelegramHelper private constructor() {
|
|||
val updateUser = obj as TdApi.UpdateUser
|
||||
val user = updateUser.user
|
||||
users[updateUser.user.id] = user
|
||||
if (user.outgoingLink is TdApi.LinkStateIsContact) {
|
||||
if (user.isContact) {
|
||||
contacts[user.id] = user
|
||||
}
|
||||
if (isOsmAndBot(user.id)) {
|
||||
|
|
BIN
OsmAnd/res/drawable-hdpi/map_bg_point_circle_bottom_small.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
OsmAnd/res/drawable-hdpi/map_bg_point_circle_center_small.png
Normal file
After Width: | Height: | Size: 440 B |
BIN
OsmAnd/res/drawable-hdpi/map_bg_point_circle_top_small.png
Normal file
After Width: | Height: | Size: 971 B |
BIN
OsmAnd/res/drawable-hdpi/map_bg_point_rhomb_bottom_small.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
OsmAnd/res/drawable-hdpi/map_bg_point_rhomb_center_small.png
Normal file
After Width: | Height: | Size: 327 B |
BIN
OsmAnd/res/drawable-hdpi/map_bg_point_rhomb_top_small.png
Normal file
After Width: | Height: | Size: 861 B |
BIN
OsmAnd/res/drawable-hdpi/map_bg_point_square_bottom_small.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
OsmAnd/res/drawable-hdpi/map_bg_point_square_center_small.png
Normal file
After Width: | Height: | Size: 204 B |
BIN
OsmAnd/res/drawable-hdpi/map_bg_point_square_top_small.png
Normal file
After Width: | Height: | Size: 724 B |
BIN
OsmAnd/res/drawable-mdpi/map_bg_point_circle_bottom_small.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
OsmAnd/res/drawable-mdpi/map_bg_point_circle_center_small.png
Normal file
After Width: | Height: | Size: 302 B |
BIN
OsmAnd/res/drawable-mdpi/map_bg_point_circle_top_small.png
Normal file
After Width: | Height: | Size: 586 B |
BIN
OsmAnd/res/drawable-mdpi/map_bg_point_rhomb_bottom_small.png
Normal file
After Width: | Height: | Size: 975 B |
BIN
OsmAnd/res/drawable-mdpi/map_bg_point_rhomb_center_small.png
Normal file
After Width: | Height: | Size: 207 B |
BIN
OsmAnd/res/drawable-mdpi/map_bg_point_rhomb_top_small.png
Normal file
After Width: | Height: | Size: 516 B |
BIN
OsmAnd/res/drawable-mdpi/map_bg_point_square_bottom_small.png
Normal file
After Width: | Height: | Size: 891 B |
BIN
OsmAnd/res/drawable-mdpi/map_bg_point_square_center_small.png
Normal file
After Width: | Height: | Size: 149 B |
BIN
OsmAnd/res/drawable-mdpi/map_bg_point_square_top_small.png
Normal file
After Width: | Height: | Size: 398 B |
BIN
OsmAnd/res/drawable-xhdpi/map_bg_point_circle_bottom_small.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
OsmAnd/res/drawable-xhdpi/map_bg_point_circle_center_small.png
Normal file
After Width: | Height: | Size: 563 B |
BIN
OsmAnd/res/drawable-xhdpi/map_bg_point_circle_top_small.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
OsmAnd/res/drawable-xhdpi/map_bg_point_rhomb_bottom_small.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
OsmAnd/res/drawable-xhdpi/map_bg_point_rhomb_center_small.png
Normal file
After Width: | Height: | Size: 397 B |
BIN
OsmAnd/res/drawable-xhdpi/map_bg_point_rhomb_top_small.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
OsmAnd/res/drawable-xhdpi/map_bg_point_square_bottom_small.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
OsmAnd/res/drawable-xhdpi/map_bg_point_square_center_small.png
Normal file
After Width: | Height: | Size: 309 B |
BIN
OsmAnd/res/drawable-xhdpi/map_bg_point_square_top_small.png
Normal file
After Width: | Height: | Size: 955 B |
BIN
OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_bottom_small.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_center_small.png
Normal file
After Width: | Height: | Size: 851 B |
BIN
OsmAnd/res/drawable-xxhdpi/map_bg_point_circle_top_small.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/map_bg_point_rhomb_bottom_small.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/map_bg_point_rhomb_center_small.png
Normal file
After Width: | Height: | Size: 543 B |
BIN
OsmAnd/res/drawable-xxhdpi/map_bg_point_rhomb_top_small.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/map_bg_point_square_bottom_small.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/map_bg_point_square_center_small.png
Normal file
After Width: | Height: | Size: 418 B |
BIN
OsmAnd/res/drawable-xxhdpi/map_bg_point_square_top_small.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_bottom_small.png
Normal file
After Width: | Height: | Size: 8.2 KiB |
BIN
OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_center_small.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
OsmAnd/res/drawable-xxxhdpi/map_bg_point_circle_top_small.png
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
OsmAnd/res/drawable-xxxhdpi/map_bg_point_rhomb_bottom_small.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
OsmAnd/res/drawable-xxxhdpi/map_bg_point_rhomb_center_small.png
Normal file
After Width: | Height: | Size: 739 B |
BIN
OsmAnd/res/drawable-xxxhdpi/map_bg_point_rhomb_top_small.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_bottom_small.png
Normal file
After Width: | Height: | Size: 7 KiB |
BIN
OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_center_small.png
Normal file
After Width: | Height: | Size: 646 B |
BIN
OsmAnd/res/drawable-xxxhdpi/map_bg_point_square_top_small.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
10
OsmAnd/res/drawable/ic_action_close.xml
Normal file
|
@ -0,0 +1,10 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M10.5858,12L3.2929,4.7071L4.7071,3.2929L12,10.5858L19.2929,3.2929L20.7071,4.7071L13.4142,12L20.7071,19.2929L19.2929,20.7071L12,13.4142L4.7071,20.7071L3.2929,19.2929L10.5858,12Z"
|
||||
android:fillColor="#ffffff"
|
||||
android:fillType="evenOdd"/>
|
||||
</vector>
|
20
OsmAnd/res/drawable/ic_logo_wikimedia.xml
Normal file
|
@ -0,0 +1,20 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="32dp"
|
||||
android:height="32dp"
|
||||
android:viewportWidth="32"
|
||||
android:viewportHeight="32">
|
||||
<path
|
||||
android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0"
|
||||
android:fillColor="#ffffff"/>
|
||||
<path
|
||||
android:pathData="M27,16C27,22.0751 22.0751,27 16,27C9.9249,27 5,22.0751 5,16C5,12.708 6.4461,9.7537 8.7378,7.7379L10.8651,9.8652C9.1137,11.3327 8,13.5363 8,16C8,20.4183 11.5817,24 16,24C20.4183,24 24,20.4183 24,16C24,13.5363 22.8863,11.3327 21.1349,9.8652L23.2622,7.7379C25.5539,9.7537 27,12.708 27,16ZM16.0524,5.0001C16.0349,5 16.0175,5 16,5C15.9825,5 15.9651,5 15.9476,5.0001H16.0524Z"
|
||||
android:fillColor="#006699"
|
||||
android:fillType="evenOdd"/>
|
||||
<path
|
||||
android:pathData="M12.2868,11.2868C10.894,12.3855 10,14.0884 10,16C10,18.973 12.1623,21.441 15,21.917V14L12.2868,11.2868ZM17,21.9171C19.8377,21.441 22,18.973 22,16C22,14.0883 21.106,12.3855 19.7132,11.2867L17,14V21.9171Z"
|
||||
android:fillColor="#339966"
|
||||
android:fillType="evenOdd"/>
|
||||
<path
|
||||
android:pathData="M16,7m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"
|
||||
android:fillColor="#990000"/>
|
||||
</vector>
|
12
OsmAnd/res/drawable/ic_speed_camera_disabled.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<vector android:autoMirrored="true" android:height="24dp"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#727272" android:fillType="evenOdd" android:pathData="M20,4H4V20H20V4ZM4,2C2.8954,2 2,2.8954 2,4V20C2,21.1046 2.8954,22 4,22H20C21.1046,22 22,21.1046 22,20V4C22,2.8954 21.1046,2 20,2H4Z"/>
|
||||
<path android:fillColor="#727272" android:pathData="M7.4142,17H11.9999C12.5522,17 12.9999,16.5523 12.9999,16V11.4143L9.9445,14.4697C9.7695,15.197 9.197,15.7695 8.4697,15.9446L7.4142,17Z"/>
|
||||
<path android:fillColor="#727272" android:pathData="M8.4691,13.1167L7.1166,14.4692C7.0422,14.3293 7,14.1696 7,14C7,13.4477 7.4477,13 8,13C8.1695,13 8.3292,13.0422 8.4691,13.1167Z"/>
|
||||
<path android:fillColor="#727272" android:pathData="M9.1919,12.3939C8.8591,12.1464 8.4466,12 8,12C6.8954,12 6,12.8954 6,14C6,14.4467 6.1464,14.8591 6.3938,15.192L5.1166,16.4692C5.0421,16.3293 4.9999,16.1696 4.9999,16V8C4.9999,7.4477 5.4476,7 5.9999,7H11.9999C12.5522,7 12.9999,7.4477 12.9999,8V8.5859L11.9973,9.5885C11.999,9.5592 11.9999,9.5297 11.9999,9.5C11.9999,8.6716 11.3283,8 10.4999,8C9.6715,8 8.9999,8.6716 8.9999,9.5C8.9999,10.3284 9.6715,11 10.4999,11C10.5296,11 10.5591,10.9992 10.5883,10.9975L9.1919,12.3939Z"/>
|
||||
<path android:fillColor="#727272" android:pathData="M13.9999,10.4143L15.4142,9H15.9999V14H13.9999V10.4143Z"/>
|
||||
<path android:fillColor="#727272" android:pathData="M10.4999,10C10.776,10 10.9999,9.7762 10.9999,9.5C10.9999,9.2239 10.776,9 10.4999,9C10.2238,9 9.9999,9.2239 9.9999,9.5C9.9999,9.7762 10.2238,10 10.4999,10Z"/>
|
||||
<path android:fillColor="#727272" android:pathData="M16.9999,10H17.9999V11.0666H18.9999V14H17.9999V16H13.9999V15H16.9999V10Z"/>
|
||||
<path android:fillColor="#727272" android:fillType="evenOdd" android:pathData="M3.2929,19.2929L19.2929,3.2929L20.7071,4.7071L4.7071,20.7071L3.2929,19.2929Z"/>
|
||||
</vector>
|
15
OsmAnd/res/drawable/img_speed_camera_warning.xml
Normal file
|
@ -0,0 +1,15 @@
|
|||
<vector android:autoMirrored="true" android:height="92dp"
|
||||
android:viewportHeight="92" android:viewportWidth="92"
|
||||
android:width="92dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#000000" android:pathData="M36,54C36,56.7614 33.7614,59 31,59C28.2386,59 26,56.7614 26,54C26,51.2386 28.2386,49 31,49C33.7614,49 36,51.2386 36,54Z"/>
|
||||
<path android:fillColor="#000000" android:pathData="M43,37C44.6569,37 46,35.6569 46,34C46,32.3431 44.6569,31 43,31C41.3431,31 40,32.3431 40,34C40,35.6569 41.3431,37 43,37Z"/>
|
||||
<path android:fillColor="#000000" android:fillType="evenOdd" android:pathData="M19,29C19,27.3431 20.3431,26 22,26H48C49.6569,26 51,27.3431 51,29V63C51,64.6569 49.6569,66 48,66H22C20.3431,66 19,64.6569 19,63V29ZM31,62C35.4183,62 39,58.4183 39,54C39,49.5817 35.4183,46 31,46C26.5817,46 23,49.5817 23,54C23,58.4183 26.5817,62 31,62ZM48,34C48,36.7614 45.7614,39 43,39C40.2386,39 38,36.7614 38,34C38,31.2386 40.2386,29 43,29C45.7614,29 48,31.2386 48,34Z"/>
|
||||
<path android:fillColor="#000000" android:pathData="M53,33H61V55H53V33Z"/>
|
||||
<path android:fillColor="#000000" android:pathData="M63,39H65V42H73V54H65V59H53V57H63V39Z"/>
|
||||
<path android:fillColor="#000000" android:fillType="evenOdd" android:pathData="M8,14C8,10.6863 10.6863,8 14,8H78C81.3137,8 84,10.6863 84,14V77C84,80.3137 81.3137,83 78,83H14C10.6863,83 8,80.3137 8,77V14ZM14,14H78V77H14V14Z"/>
|
||||
<path android:fillColor="#EE5622"
|
||||
android:pathData="M60.5071,52.532L61.2286,52.9701L60.5071,52.532L44.5991,78.7335C44.2072,79.3789 44,80.1195 44,80.8745C44,83.153 45.847,85 48.1255,85H49H81H81.8745C84.153,85 86,83.153 86,80.8745C86,80.1195 85.7928,79.3789 85.4009,78.7335L69.4929,52.532L68.6381,53.051L69.4929,52.532C68.9778,51.6836 68.2305,50.9972 67.3443,50.5541C66.6178,50.1909 65.8136,50 65,50C64.1864,50 63.3822,50.1909 62.6557,50.5541C61.7695,50.9972 61.0222,51.6836 60.5071,52.532Z"
|
||||
android:strokeColor="#D13C06" android:strokeWidth="2"/>
|
||||
<path android:fillColor="#ffffff" android:pathData="M65,60C63.8954,60 63,60.8954 63,62V70C63,71.1046 63.8954,72 65,72C66.1046,72 67,71.1046 67,70V62C67,60.8954 66.1046,60 65,60Z"/>
|
||||
<path android:fillColor="#ffffff" android:pathData="M65,76C63.8954,76 63,76.8954 63,78C63,79.1046 63.8954,80 65,80C66.1046,80 67,79.1046 67,78C67,76.8954 66.1046,76 65,76Z"/>
|
||||
</vector>
|
|
@ -15,7 +15,7 @@
|
|||
android:id="@+id/icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="16dp"
|
||||
android:padding="@dimen/content_padding"
|
||||
android:src="@drawable/ic_action_photo_dark"/>
|
||||
|
||||
<LinearLayout
|
||||
|
@ -29,21 +29,25 @@
|
|||
style="@style/TextAppearance.ContextMenuTitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="@string/waypoint_one"/>
|
||||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginTop="@dimen/content_padding"
|
||||
android:text="@string/waypoint_one"
|
||||
android:layout_marginEnd="@dimen/content_padding"
|
||||
android:layout_marginStart="@dimen/content_padding" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/description"
|
||||
style="@style/TextAppearance.ContextMenuSubtitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginTop="8dp"
|
||||
tools:text="Lat: 50.45375 Lon: 30.48693"/>
|
||||
android:layout_marginBottom="@dimen/content_padding_half"
|
||||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginTop="@dimen/content_padding_half"
|
||||
tools:text="Lat: 50.45375 Lon: 30.48693"
|
||||
android:layout_marginEnd="@dimen/content_padding"
|
||||
android:layout_marginStart="@dimen/content_padding" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -60,7 +64,8 @@
|
|||
style="@style/Widget.AppCompat.Button.Borderless.Colored"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:text="@string/shared_string_cancel"/>
|
||||
android:text="@string/shared_string_cancel"
|
||||
android:layout_marginEnd="@dimen/content_padding" />
|
||||
</LinearLayout>
|
|
@ -66,10 +66,12 @@
|
|||
android:background="?attr/bg_color"
|
||||
android:clickable="true"
|
||||
android:gravity="center"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:textSize="@dimen/default_list_text_size_large"
|
||||
android:visibility="gone"/>
|
||||
android:visibility="gone"
|
||||
android:paddingEnd="@dimen/content_padding"
|
||||
android:paddingStart="@dimen/content_padding" />
|
||||
|
||||
</FrameLayout>
|
||||
</LinearLayout>
|
||||
|
|
|
@ -44,7 +44,8 @@
|
|||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:orientation="vertical">
|
||||
android:orientation="vertical"
|
||||
android:layout_marginStart="8dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
@ -60,7 +61,8 @@
|
|||
android:paddingRight="8dp"
|
||||
android:text="@string/arrived_at_destination"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:textSize="@dimen/dialog_header_text_size"/>
|
||||
android:textSize="@dimen/dialog_header_text_size"
|
||||
android:paddingEnd="8dp" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/closeImageButton"
|
||||
|
@ -84,10 +86,13 @@
|
|||
android:paddingRight="8dp"
|
||||
android:drawableLeft="@drawable/ic_action_parking_dark"
|
||||
android:drawablePadding="12dp"
|
||||
android:gravity="left|center_vertical"
|
||||
android:gravity="start|center_vertical"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:text="@string/find_parking"/>
|
||||
android:text="@string/find_parking"
|
||||
android:drawableStart="@drawable/ic_action_parking_dark"
|
||||
android:paddingStart="8dp"
|
||||
android:paddingEnd="8dp" />
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
|
@ -105,10 +110,13 @@
|
|||
android:paddingRight="8dp"
|
||||
android:drawableLeft="@drawable/ic_action_gdirections_dark"
|
||||
android:drawablePadding="12dp"
|
||||
android:gravity="left|center_vertical"
|
||||
android:gravity="start|center_vertical"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:text="@string/recalculate_route"/>
|
||||
android:text="@string/recalculate_route"
|
||||
android:paddingStart="8dp"
|
||||
android:paddingEnd="8dp"
|
||||
android:drawableStart="@drawable/ic_action_gdirections_dark" />
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
|
@ -126,10 +134,13 @@
|
|||
android:paddingRight="8dp"
|
||||
android:drawableLeft="@drawable/ic_action_done"
|
||||
android:drawablePadding="12dp"
|
||||
android:gravity="left|center_vertical"
|
||||
android:gravity="start|center_vertical"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:text="@string/finish_navigation"/>
|
||||
android:text="@string/finish_navigation"
|
||||
android:paddingEnd="8dp"
|
||||
android:paddingStart="8dp"
|
||||
android:drawableStart="@drawable/ic_action_done" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
@ -64,7 +64,9 @@
|
|||
android:textAllCaps="true"
|
||||
android:textColor="@color/color_white"
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
osmand:typeface="@string/font_roboto_medium"/>
|
||||
osmand:typeface="@string/font_roboto_medium"
|
||||
android:paddingStart="16dp"
|
||||
android:paddingEnd="16dp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
@ -53,7 +53,8 @@
|
|||
android:textColor="@color/color_white"
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
tools:drawableRight="@drawable/ic_action_car_dark"
|
||||
tools:text="car"/>
|
||||
tools:text="car"
|
||||
tools:drawableEnd="@drawable/ic_action_car_dark" />
|
||||
</LinearLayout>
|
||||
|
||||
</android.support.v7.widget.Toolbar>
|
||||
|
@ -78,7 +79,9 @@
|
|||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginLeft="@dimen/bottom_sheet_content_margin_small"
|
||||
android:layout_marginRight="@dimen/bottom_sheet_content_margin_small"
|
||||
tools:src="@drawable/img_help_markers_direction_device_night"/>
|
||||
tools:src="@drawable/img_help_markers_direction_device_night"
|
||||
android:layout_marginStart="@dimen/bottom_sheet_content_margin_small"
|
||||
android:layout_marginEnd="@dimen/bottom_sheet_content_margin_small" />
|
||||
</FrameLayout>
|
||||
|
||||
<com.github.ksoichiro.android.observablescrollview.ObservableScrollView
|
||||
|
@ -91,7 +94,9 @@
|
|||
android:layout_height="match_parent"
|
||||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:orientation="vertical">
|
||||
android:orientation="vertical"
|
||||
android:layout_marginEnd="@dimen/content_padding"
|
||||
android:layout_marginStart="@dimen/content_padding">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
@ -128,7 +133,8 @@
|
|||
android:textColor="?attr/contextMenuButtonColor"
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
tools:drawableRight="@drawable/ic_action_arrow_drop_down"
|
||||
tools:text="Two"/>
|
||||
tools:text="Two"
|
||||
tools:drawableEnd="@drawable/ic_action_arrow_drop_down" />
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
|
@ -163,7 +169,9 @@
|
|||
android:layout_height="@dimen/bottom_sheet_title_height"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding">
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:paddingStart="@dimen/content_padding"
|
||||
android:paddingEnd="@dimen/content_padding">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
|
@ -204,7 +212,9 @@
|
|||
android:paddingTop="@dimen/content_padding_small"
|
||||
android:text="@string/distance_indication_descr"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_desc_text_size"/>
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
android:layout_marginStart="@dimen/content_padding"
|
||||
android:layout_marginEnd="@dimen/content_padding" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/top_bar_row"
|
||||
|
@ -301,7 +311,9 @@
|
|||
android:layout_height="@dimen/bottom_sheet_title_height"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding">
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:paddingStart="@dimen/content_padding"
|
||||
android:paddingEnd="@dimen/content_padding">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
|
@ -342,7 +354,9 @@
|
|||
android:paddingTop="@dimen/content_padding_small"
|
||||
android:text="@string/show_arrows_descr"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_desc_text_size"/>
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
android:layout_marginStart="@dimen/content_padding"
|
||||
android:layout_marginEnd="@dimen/content_padding" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -359,7 +373,9 @@
|
|||
android:layout_height="@dimen/bottom_sheet_title_height"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding">
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:paddingStart="@dimen/content_padding"
|
||||
android:paddingEnd="@dimen/content_padding">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
|
@ -400,7 +416,9 @@
|
|||
android:paddingTop="@dimen/content_padding_small"
|
||||
android:text="@string/show_guide_line_descr"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_desc_text_size"/>
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
android:layout_marginEnd="@dimen/content_padding"
|
||||
android:layout_marginStart="@dimen/content_padding" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -417,7 +435,9 @@
|
|||
android:layout_height="@dimen/bottom_sheet_title_height"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding">
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:paddingEnd="@dimen/content_padding"
|
||||
android:paddingStart="@dimen/content_padding">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
|
@ -458,7 +478,9 @@
|
|||
android:paddingTop="@dimen/content_padding_small"
|
||||
android:text="@string/one_tap_active_descr"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_desc_text_size"/>
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
android:layout_marginStart="@dimen/content_padding"
|
||||
android:layout_marginEnd="@dimen/content_padding" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -476,7 +498,9 @@
|
|||
android:layout_height="@dimen/bottom_sheet_title_height"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding">
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:paddingStart="@dimen/content_padding"
|
||||
android:paddingEnd="@dimen/content_padding">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
|
@ -517,7 +541,9 @@
|
|||
android:paddingTop="@dimen/content_padding_small"
|
||||
android:text="@string/keep_passed_markers_descr"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_desc_text_size"/>
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
android:layout_marginStart="@dimen/content_padding"
|
||||
android:layout_marginEnd="@dimen/content_padding" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
@ -210,7 +210,10 @@
|
|||
android:paddingLeft="@dimen/measurement_tool_button_padding"
|
||||
android:paddingRight="@dimen/measurement_tool_button_padding"
|
||||
android:text="@string/shared_string_add"
|
||||
android:textColor="@color/color_white"/>
|
||||
android:textColor="@color/color_white"
|
||||
android:paddingEnd="@dimen/measurement_tool_button_padding"
|
||||
android:paddingStart="@dimen/measurement_tool_button_padding"
|
||||
android:drawableStart="@drawable/ic_action_plus" />
|
||||
</FrameLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
@ -238,7 +241,9 @@
|
|||
android:paddingLeft="@dimen/measurement_tool_button_padding"
|
||||
android:paddingRight="@dimen/measurement_tool_button_padding"
|
||||
android:text="@string/shared_string_apply"
|
||||
android:textColor="@color/color_white"/>
|
||||
android:textColor="@color/color_white"
|
||||
android:paddingEnd="@dimen/measurement_tool_button_padding"
|
||||
android:paddingStart="@dimen/measurement_tool_button_padding" />
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/cancel_move_point_button"
|
||||
|
@ -298,7 +303,9 @@
|
|||
android:paddingLeft="@dimen/measurement_tool_button_padding"
|
||||
android:paddingRight="@dimen/measurement_tool_button_padding"
|
||||
android:text="@string/shared_string_apply"
|
||||
android:textColor="?attr/color_dialog_buttons"/>
|
||||
android:textColor="?attr/color_dialog_buttons"
|
||||
android:paddingEnd="@dimen/measurement_tool_button_padding"
|
||||
android:paddingStart="@dimen/measurement_tool_button_padding" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/add_point_before_after_button"
|
||||
|
@ -314,7 +321,10 @@
|
|||
android:paddingLeft="@dimen/measurement_tool_button_padding"
|
||||
android:paddingRight="@dimen/measurement_tool_button_padding"
|
||||
android:text="@string/shared_string_add"
|
||||
android:textColor="@color/color_white"/>
|
||||
android:textColor="@color/color_white"
|
||||
android:paddingStart="@dimen/measurement_tool_button_padding"
|
||||
android:paddingEnd="@dimen/measurement_tool_button_padding"
|
||||
android:drawableStart="@drawable/ic_action_plus" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
|
|
@ -92,7 +92,9 @@
|
|||
android:textAllCaps="true"
|
||||
android:textColor="?attr/color_dialog_buttons"
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
osmand:typeface="@string/font_roboto_medium"/>
|
||||
osmand:typeface="@string/font_roboto_medium"
|
||||
android:paddingStart="@dimen/list_content_padding"
|
||||
android:paddingEnd="@dimen/list_content_padding" />
|
||||
</LinearLayout>
|
||||
|
||||
</android.support.v7.widget.Toolbar>
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<FrameLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|left">
|
||||
android:layout_gravity="bottom|start">
|
||||
|
||||
<!-- ALARM -->
|
||||
|
||||
|
@ -24,9 +24,10 @@
|
|||
android:id="@+id/map_alarm_warning"
|
||||
android:layout_width="@dimen/map_alarm_size"
|
||||
android:layout_height="@dimen/map_alarm_size"
|
||||
android:layout_gravity="bottom|left"
|
||||
android:layout_gravity="bottom|start"
|
||||
android:layout_marginBottom="@dimen/map_alarm_bottom_margin_land"
|
||||
android:layout_marginLeft="@dimen/map_button_shadow_margin">
|
||||
android:layout_marginLeft="@dimen/map_button_shadow_margin"
|
||||
android:layout_marginStart="@dimen/map_button_shadow_margin">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/map_alarm_warning_icon"
|
||||
|
@ -64,6 +65,7 @@
|
|||
android:layout_gravity="bottom"
|
||||
android:layout_marginBottom="130dp"
|
||||
android:layout_marginLeft="@dimen/map_button_margin"
|
||||
android:layout_marginStart="@dimen/map_button_margin"
|
||||
android:gravity="center_horizontal"
|
||||
android:textSize="@dimen/map_button_text_size"
|
||||
tools:text="13.88"/>
|
||||
|
@ -71,7 +73,7 @@
|
|||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|left">
|
||||
android:layout_gravity="bottom|start">
|
||||
|
||||
<!-- PREPARATION SCREEN -->
|
||||
|
||||
|
@ -79,15 +81,17 @@
|
|||
layout="@layout/recording_note_fragment"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|left"/>
|
||||
android:layout_gravity="bottom|start"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|left"
|
||||
android:layout_gravity="bottom|start"
|
||||
android:layout_marginBottom="@dimen/map_button_margin"
|
||||
android:layout_marginLeft="@dimen/map_button_margin"
|
||||
android:layout_marginStart="@dimen/map_button_margin"
|
||||
android:layout_marginRight="@dimen/map_button_spacing_land"
|
||||
android:layout_marginEnd="@dimen/map_button_spacing_land"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageButton
|
||||
|
@ -103,6 +107,7 @@
|
|||
android:layout_width="@dimen/map_button_size"
|
||||
android:layout_height="@dimen/map_button_size"
|
||||
android:layout_marginLeft="@dimen/map_button_spacing_land"
|
||||
android:layout_marginStart="@dimen/map_button_spacing_land"
|
||||
android:background="@drawable/btn_round"
|
||||
android:contentDescription="@string/layer_route"
|
||||
tools:src="@drawable/ic_action_test_light"/>
|
||||
|
@ -210,6 +215,8 @@
|
|||
android:layout_gravity="bottom"
|
||||
android:layout_marginBottom="@dimen/map_button_margin"
|
||||
android:layout_marginLeft="@dimen/map_button_spacing_land"
|
||||
android:layout_marginStart="@dimen/map_button_spacing_land"
|
||||
android:layout_marginEnd="@dimen/map_button_margin"
|
||||
android:layout_marginRight="@dimen/map_button_margin">
|
||||
|
||||
<ImageButton
|
||||
|
@ -226,6 +233,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginLeft="@dimen/map_button_spacing_land"
|
||||
android:layout_marginStart="@dimen/map_button_spacing_land"
|
||||
android:orientation="vertical">
|
||||
|
||||
<ImageButton
|
||||
|
@ -254,14 +262,14 @@
|
|||
layout="@layout/move_marker_bottom_sheet"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|left"
|
||||
android:layout_gravity="bottom|start"
|
||||
tools:visibility="visible"/>
|
||||
|
||||
<include
|
||||
layout="@layout/add_gpx_point_bottom_sheet"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|left"
|
||||
android:layout_gravity="bottom|start"
|
||||
tools:visibility="visible"/>
|
||||
|
||||
<FrameLayout
|
||||
|
|
|
@ -32,7 +32,9 @@
|
|||
android:layout_marginLeft="@dimen/content_padding_half"
|
||||
android:layout_marginRight="@dimen/content_padding_half"
|
||||
android:layout_weight="1"
|
||||
android:orientation="horizontal">
|
||||
android:orientation="horizontal"
|
||||
android:layout_marginStart="@dimen/content_padding_half"
|
||||
android:layout_marginEnd="@dimen/content_padding_half">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/lat_icon"
|
||||
|
@ -73,7 +75,9 @@
|
|||
android:layout_marginLeft="@dimen/content_padding_half"
|
||||
android:layout_marginRight="@dimen/content_padding_half"
|
||||
android:layout_weight="1"
|
||||
android:orientation="horizontal">
|
||||
android:orientation="horizontal"
|
||||
android:layout_marginStart="@dimen/content_padding_half"
|
||||
android:layout_marginEnd="@dimen/content_padding_half">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/lon_icon"
|
||||
|
@ -295,20 +299,20 @@
|
|||
android:id="@+id/map_route_land_left_margin"
|
||||
android:layout_width="@dimen/map_route_planning_land_width_minus_shadow"
|
||||
android:layout_height="0dp"
|
||||
android:layout_gravity="top|left"
|
||||
android:layout_gravity="top|start"
|
||||
android:visibility="gone"/>
|
||||
<!-- LEFT widgets colon -->
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top|left"
|
||||
android:layout_gravity="top|start"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/map_left_widgets_panel"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top|left"
|
||||
android:layout_gravity="top|start"
|
||||
android:orientation="vertical">
|
||||
|
||||
<include
|
||||
|
@ -342,7 +346,9 @@
|
|||
android:layout_marginLeft="5dp"
|
||||
android:layout_marginRight="5dp"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal">
|
||||
android:orientation="horizontal"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_marginEnd="5dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/map_exit_ref"
|
||||
|
@ -417,7 +423,9 @@
|
|||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginLeft="@dimen/map_button_margin"
|
||||
android:layout_marginRight="@dimen/map_button_margin"
|
||||
android:src="@drawable/ic_action_test_light"/>
|
||||
android:src="@drawable/ic_action_test_light"
|
||||
android:layout_marginStart="@dimen/map_button_margin"
|
||||
android:layout_marginEnd="@dimen/map_button_margin" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
|
@ -431,6 +439,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginLeft="2dp"
|
||||
android:layout_marginStart="2dp"
|
||||
android:maxLines="2"
|
||||
android:textColor="@color/osmand_orange"
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
|
@ -442,6 +451,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginLeft="2dp"
|
||||
android:layout_marginStart="2dp"
|
||||
android:drawablePadding="2dp"
|
||||
android:maxLines="1"
|
||||
android:textColor="@color/osmand_orange"
|
||||
|
@ -456,6 +466,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:layout_marginStart="4dp"
|
||||
android:layout_weight="1">
|
||||
|
||||
|
||||
|
@ -655,8 +666,9 @@
|
|||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top|left"
|
||||
android:layout_gravity="top|start"
|
||||
android:layout_marginLeft="@dimen/map_button_margin"
|
||||
android:layout_marginStart="@dimen/map_button_margin"
|
||||
android:layout_marginTop="@dimen/map_button_margin"
|
||||
android:orientation="horizontal">
|
||||
|
||||
|
@ -690,6 +702,7 @@
|
|||
android:layout_width="@dimen/map_small_button_size"
|
||||
android:layout_height="@dimen/map_small_button_size"
|
||||
android:layout_marginLeft="@dimen/map_small_button_margin"
|
||||
android:layout_marginStart="@dimen/map_small_button_margin"
|
||||
android:background="@drawable/btn_inset_circle_trans"
|
||||
android:contentDescription="@string/map_widget_search"
|
||||
tools:src="@drawable/ic_action_test_light"/>
|
||||
|
@ -713,7 +726,9 @@
|
|||
android:layout_gravity="center"
|
||||
android:layout_marginLeft="@dimen/widget_turn_lane_border"
|
||||
android:layout_marginRight="@dimen/widget_turn_lane_border"
|
||||
android:layout_marginTop="@dimen/widget_turn_lane_border"/>
|
||||
android:layout_marginTop="@dimen/widget_turn_lane_border"
|
||||
android:layout_marginStart="@dimen/widget_turn_lane_border"
|
||||
android:layout_marginEnd="@dimen/widget_turn_lane_border" />
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="wrap_content"
|
||||
|
@ -732,7 +747,9 @@
|
|||
android:maxLines="1"
|
||||
android:textColor="@color/color_black"
|
||||
android:textSize="@dimen/map_button_text_size"
|
||||
tools:text="1048 km"/>
|
||||
tools:text="1048 km"
|
||||
android:layout_marginEnd="@dimen/widget_turn_lane_border"
|
||||
android:layout_marginStart="@dimen/widget_turn_lane_border" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/map_lanes_dist_text"
|
||||
|
@ -744,7 +761,9 @@
|
|||
android:maxLines="1"
|
||||
android:textColor="@color/color_black"
|
||||
android:textSize="@dimen/map_button_text_size"
|
||||
tools:text="1048 km"/>
|
||||
tools:text="1048 km"
|
||||
android:layout_marginEnd="@dimen/widget_turn_lane_border"
|
||||
android:layout_marginStart="@dimen/widget_turn_lane_border" />
|
||||
|
||||
|
||||
</FrameLayout>
|
||||
|
@ -758,19 +777,19 @@
|
|||
<FrameLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top|right">
|
||||
android:layout_gravity="top|end">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top|right"
|
||||
android:layout_gravity="top|end"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/map_right_widgets_panel"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top|right"
|
||||
android:layout_gravity="top|end"
|
||||
android:orientation="vertical">
|
||||
|
||||
<include layout="@layout/map_hud_widget"/>
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
android:id="@+id/icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="16dp"
|
||||
android:padding="@dimen/content_padding"
|
||||
android:src="@drawable/ic_action_photo_dark"/>
|
||||
|
||||
<LinearLayout
|
||||
|
@ -28,21 +28,25 @@
|
|||
style="@style/TextAppearance.ContextMenuTitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="@string/move_marker_bottom_sheet_title"/>
|
||||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginTop="@dimen/content_padding"
|
||||
android:text="@string/move_marker_bottom_sheet_title"
|
||||
android:layout_marginStart="@dimen/content_padding"
|
||||
android:layout_marginEnd="@dimen/content_padding" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/description"
|
||||
style="@style/TextAppearance.ContextMenuSubtitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginTop="8dp"
|
||||
tools:text="Lat: 50.45375 Lon: 30.48693"/>
|
||||
android:layout_marginBottom="@dimen/content_padding_half"
|
||||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginTop="@dimen/content_padding_half"
|
||||
tools:text="Lat: 50.45375 Lon: 30.48693"
|
||||
android:layout_marginStart="@dimen/content_padding"
|
||||
android:layout_marginEnd="@dimen/content_padding" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -59,7 +63,8 @@
|
|||
style="@style/Widget.AppCompat.Button.Borderless.Colored"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:text="@string/shared_string_cancel"/>
|
||||
android:text="@string/shared_string_cancel"
|
||||
android:layout_marginEnd="@dimen/content_padding" />
|
||||
</LinearLayout>
|
|
@ -12,7 +12,9 @@
|
|||
android:paddingBottom="@dimen/dialog_content_bottom_margin"
|
||||
android:paddingLeft="@dimen/dialog_content_margin"
|
||||
android:paddingRight="@dimen/dialog_content_margin"
|
||||
android:paddingTop="@dimen/dialog_content_bottom_margin">
|
||||
android:paddingTop="@dimen/dialog_content_bottom_margin"
|
||||
android:paddingStart="@dimen/dialog_content_margin"
|
||||
android:paddingEnd="@dimen/dialog_content_margin">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/parkTime"
|
||||
|
|
|
@ -85,19 +85,23 @@
|
|||
android:layout_marginRight="12dp"
|
||||
android:text="@string/shared_string_name"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_list_text_size"/>
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
android:layout_marginEnd="@dimen/content_padding_small"
|
||||
android:layout_marginStart="@dimen/content_padding_small" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/name_edit"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginTop="@dimen/content_padding_half"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginLeft="@dimen/content_padding_half"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:textColorHint="?android:textColorSecondary"
|
||||
android:imeOptions="actionDone"
|
||||
android:inputType="text"/>
|
||||
android:inputType="text"
|
||||
android:layout_marginEnd="@dimen/content_padding"
|
||||
android:layout_marginStart="@dimen/content_padding_half" />
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
|
@ -121,8 +125,8 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginLeft="@dimen/content_padding_small"
|
||||
android:layout_marginStart="@dimen/content_padding_small"
|
||||
android:scaleType="centerInside"
|
||||
android:src="@drawable/ic_action_building_number"/>
|
||||
|
||||
|
@ -131,7 +135,7 @@
|
|||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_marginBottom="@dimen/content_padding"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical">
|
||||
|
||||
|
@ -139,19 +143,23 @@
|
|||
android:id="@+id/category_caption"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:layout_marginRight="12dp"
|
||||
android:layout_marginLeft="@dimen/content_padding_small"
|
||||
android:layout_marginRight="@dimen/content_padding_small"
|
||||
android:text="@string/shared_string_name"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_list_text_size"/>
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
android:layout_marginStart="@dimen/content_padding_small"
|
||||
android:layout_marginEnd="@dimen/content_padding_small" />
|
||||
|
||||
<net.osmand.plus.widgets.AutoCompleteTextViewEx
|
||||
android:id="@+id/category_edit"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginLeft="8dp"/>
|
||||
android:layout_marginTop="@dimen/content_padding_half"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginLeft="@dimen/content_padding_half"
|
||||
android:layout_marginStart="@dimen/content_padding_half"
|
||||
android:layout_marginEnd="@dimen/content_padding" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -182,8 +190,8 @@
|
|||
android:id="@+id/description_image"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginLeft="@dimen/content_padding_small"
|
||||
android:layout_marginStart="@dimen/content_padding_small"
|
||||
android:layout_marginTop="10dp"
|
||||
android:scaleType="center"
|
||||
android:src="@drawable/ic_action_note_dark"/>
|
||||
|
@ -193,7 +201,7 @@
|
|||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginBottom="@dimen/content_padding_half"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical">
|
||||
|
||||
|
@ -201,13 +209,15 @@
|
|||
android:id="@+id/description_edit"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginLeft="@dimen/content_padding_half"
|
||||
android:maxLines="1000"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:textColorHint="?android:textColorSecondary"
|
||||
android:inputType="textMultiLine"/>
|
||||
android:inputType="textMultiLine"
|
||||
android:layout_marginEnd="@dimen/content_padding"
|
||||
android:layout_marginStart="@dimen/content_padding_half" />
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
|
@ -248,7 +258,9 @@
|
|||
android:paddingLeft="10dp"
|
||||
android:paddingRight="10dp"
|
||||
android:text="@string/shared_string_delete"
|
||||
android:textColor="?attr/contextMenuButtonColor"/>
|
||||
android:textColor="?attr/contextMenuButtonColor"
|
||||
android:paddingEnd="10dp"
|
||||
android:paddingStart="10dp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/replace_button"
|
||||
|
@ -259,7 +271,9 @@
|
|||
android:paddingRight="10dp"
|
||||
android:text="@string/update_existing"
|
||||
android:textColor="?attr/contextMenuButtonColor"
|
||||
android:visibility="gone"/>
|
||||
android:visibility="gone"
|
||||
android:paddingEnd="10dp"
|
||||
android:paddingStart="10dp" />
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
|
@ -274,7 +288,9 @@
|
|||
android:paddingLeft="10dp"
|
||||
android:paddingRight="10dp"
|
||||
android:text="@string/shared_string_cancel"
|
||||
android:textColor="?attr/contextMenuButtonColor"/>
|
||||
android:textColor="?attr/contextMenuButtonColor"
|
||||
android:paddingStart="10dp"
|
||||
android:paddingEnd="10dp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/save_button"
|
||||
|
@ -284,7 +300,9 @@
|
|||
android:paddingLeft="10dp"
|
||||
android:paddingRight="10dp"
|
||||
android:text="@string/shared_string_save"
|
||||
android:textColor="?attr/contextMenuButtonColor"/>
|
||||
android:textColor="?attr/contextMenuButtonColor"
|
||||
android:paddingEnd="10dp"
|
||||
android:paddingStart="10dp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
android:id="@+id/container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="8dp"
|
||||
android:layout_margin="@dimen/content_padding_half"
|
||||
android:background="@drawable/bg_card_light"
|
||||
android:clickable="true"
|
||||
android:orientation="vertical">
|
||||
|
@ -33,8 +33,10 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp" />
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:paddingEnd="@dimen/content_padding"
|
||||
android:paddingStart="@dimen/content_padding" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/dots"
|
||||
|
@ -51,8 +53,10 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp" />
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:paddingStart="@dimen/content_padding"
|
||||
android:paddingEnd="@dimen/content_padding" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
@ -44,7 +44,8 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:gravity="left|center_vertical">
|
||||
android:gravity="start|center_vertical"
|
||||
android:layout_marginStart="12dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/leftButtonIcon"
|
||||
|
@ -63,7 +64,9 @@
|
|||
android:layout_marginRight="8dp"
|
||||
android:text="@string/shared_string_hide"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_list_text_size"/>
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginStart="8dp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -99,7 +102,9 @@
|
|||
android:layout_marginRight="8dp"
|
||||
android:text="@string/shared_string_control_stop"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_list_text_size"/>
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginStart="8dp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -137,7 +142,9 @@
|
|||
android:layout_marginRight="8dp"
|
||||
android:text="@string/shared_string_control_stop"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_list_text_size"/>
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginStart="8dp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -157,10 +164,12 @@
|
|||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:layout_marginRight="12dp"
|
||||
android:gravity="right"
|
||||
android:gravity="end"
|
||||
android:text="00:00:00"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:textSize="@dimen/default_list_text_size"/>
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginEnd="12dp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
@ -19,7 +19,9 @@
|
|||
android:layout_marginLeft="3dp"
|
||||
android:layout_marginRight="3dp"
|
||||
android:layout_marginBottom="0dp"
|
||||
android:layout_marginTop="0dp" >
|
||||
android:layout_marginTop="0dp"
|
||||
android:layout_marginEnd="3dp"
|
||||
android:layout_marginStart="3dp">
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/ProgressBar"
|
||||
|
@ -49,7 +51,9 @@
|
|||
android:layout_marginBottom="-5dp"
|
||||
android:layout_marginTop="0dp"
|
||||
android:padding="0dp"
|
||||
android:text="@string/shared_string_clear" />
|
||||
android:text="@string/shared_string_clear"
|
||||
android:layout_marginStart="0dp"
|
||||
android:layout_marginEnd="0dp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -60,6 +64,8 @@
|
|||
android:dividerHeight="1dp"
|
||||
android:layout_marginLeft="3dp"
|
||||
android:layout_marginRight="3dp"
|
||||
android:layout_marginTop="0dp" />
|
||||
android:layout_marginTop="0dp"
|
||||
android:layout_marginEnd="3dp"
|
||||
android:layout_marginStart="3dp" />
|
||||
|
||||
</LinearLayout>
|
|
@ -6,7 +6,9 @@
|
|||
android:paddingTop="1dp"
|
||||
android:paddingBottom="1dp"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp">
|
||||
android:paddingRight="16dp"
|
||||
android:paddingStart="16dp"
|
||||
android:paddingEnd="16dp">
|
||||
|
||||
<!--
|
||||
ppenguin 2016-03-07: more compact layout (less padding) for landscape, to allow the maximum
|
||||
|
|
|
@ -114,7 +114,9 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="@dimen/list_content_padding"
|
||||
android:layout_marginRight="@dimen/list_content_padding"
|
||||
android:src="@drawable/ic_action_altitude_average"/>
|
||||
android:src="@drawable/ic_action_altitude_average"
|
||||
android:layout_marginStart="@dimen/list_content_padding"
|
||||
android:layout_marginEnd="@dimen/list_content_padding" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/y_axis_title"
|
||||
|
@ -124,14 +126,16 @@
|
|||
android:layout_marginRight="8dp"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
tools:text="@string/altitude"/>
|
||||
tools:text="@string/altitude"
|
||||
android:layout_marginEnd="8dp" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/y_axis_arrow"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginRight="8dp"
|
||||
android:src="@drawable/ic_action_arrow_drop_down"/>
|
||||
android:src="@drawable/ic_action_arrow_drop_down"
|
||||
android:layout_marginEnd="8dp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
@ -158,7 +162,9 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="@dimen/list_content_padding"
|
||||
android:layout_marginRight="@dimen/list_content_padding"
|
||||
android:src="@drawable/ic_action_speed"/>
|
||||
android:src="@drawable/ic_action_speed"
|
||||
android:layout_marginStart="@dimen/list_content_padding"
|
||||
android:layout_marginEnd="@dimen/list_content_padding" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/x_axis_title"
|
||||
|
@ -168,14 +174,16 @@
|
|||
android:layout_marginRight="8dp"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
tools:text="@string/map_widget_speed"/>
|
||||
tools:text="@string/map_widget_speed"
|
||||
android:layout_marginEnd="8dp" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/x_axis_arrow"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginRight="8dp"
|
||||
android:src="@drawable/ic_action_arrow_drop_down"/>
|
||||
android:src="@drawable/ic_action_arrow_drop_down"
|
||||
android:layout_marginEnd="8dp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
@ -24,7 +24,9 @@
|
|||
android:orientation="vertical"
|
||||
android:paddingLeft="40dp"
|
||||
android:paddingRight="40dp"
|
||||
android:paddingTop="@dimen/first_usage_title_margin">
|
||||
android:paddingTop="@dimen/first_usage_title_margin"
|
||||
android:paddingStart="40dp"
|
||||
android:paddingEnd="40dp">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
|
@ -46,7 +48,9 @@
|
|||
android:layout_marginRight="180dp"
|
||||
android:textSize="@dimen/first_usage_subtitle_text_size"
|
||||
android:textStyle="bold"
|
||||
osmand:typeface="@string/font_roboto_regular"/>
|
||||
osmand:typeface="@string/font_roboto_regular"
|
||||
android:layout_marginEnd="180dp"
|
||||
android:layout_marginStart="180dp" />
|
||||
|
||||
|
||||
<View
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="right"
|
||||
android:gravity="end"
|
||||
android:textColor="?attr/color_dialog_buttons"
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
android:padding="8dp"
|
||||
android:padding="@dimen/content_padding_half"
|
||||
tools:text="Test text"/>
|
|
@ -15,7 +15,7 @@
|
|||
android:id="@+id/icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="16dp"
|
||||
android:padding="@dimen/content_padding"
|
||||
android:src="@drawable/ic_action_photo_dark"/>
|
||||
|
||||
<LinearLayout
|
||||
|
@ -28,34 +28,41 @@
|
|||
style="@style/TextAppearance.ContextMenuTitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginTop="16dp"
|
||||
tools:text="@string/waypoint_one"/>
|
||||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginTop="@dimen/content_padding"
|
||||
tools:text="@string/waypoint_one"
|
||||
android:layout_marginEnd="@dimen/content_padding"
|
||||
android:layout_marginStart="@dimen/content_padding" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/description"
|
||||
style="@style/TextAppearance.ContextMenuSubtitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginTop="8dp"
|
||||
tools:text="Lat: 50.45375\nLon: 30.48693"/>
|
||||
android:layout_marginBottom="@dimen/content_padding_half"
|
||||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginTop="@dimen/content_padding_half"
|
||||
tools:text="Lat: 50.45375\nLon: 30.48693"
|
||||
android:layout_marginEnd="@dimen/content_padding"
|
||||
android:layout_marginStart="@dimen/content_padding" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:layout_marginRight="12dp">
|
||||
android:layout_marginBottom="@dimen/content_padding"
|
||||
android:layout_marginLeft="@dimen/content_padding_small"
|
||||
android:layout_marginRight="@dimen/content_padding_small"
|
||||
android:layout_marginStart="@dimen/content_padding_small"
|
||||
android:layout_marginEnd="@dimen/content_padding_small">
|
||||
|
||||
<Button
|
||||
android:id="@+id/create_button"
|
||||
style="@style/DialogActionButton"
|
||||
android:layout_marginRight="8dp"
|
||||
android:text="@string/shared_string_add"/>
|
||||
android:layout_marginRight="@dimen/content_padding_half"
|
||||
android:text="@string/shared_string_add"
|
||||
android:layout_marginEnd="@dimen/content_padding_half" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/cancel_button"
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
android:layout_marginRight="10dp"
|
||||
android:id="@android:id/edit"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:layout_marginStart="10dp" />
|
||||
|
||||
</LinearLayout>
|
|
@ -30,10 +30,11 @@
|
|||
android:gravity="end"
|
||||
android:maxLength="4"
|
||||
android:maxLines="1"
|
||||
android:paddingRight="4dp"
|
||||
android:paddingRight="@dimen/text_margin_small"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:textSize="@dimen/default_list_text_size"
|
||||
tools:text="60" />
|
||||
tools:text="60"
|
||||
android:paddingEnd="@dimen/text_margin_small" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/speed_units"
|
||||
|
|
|
@ -22,21 +22,25 @@
|
|||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginTop="@dimen/content_padding"
|
||||
tools:src="@drawable/ic_action_arrow_down" />
|
||||
tools:src="@drawable/ic_action_arrow_down"
|
||||
android:layout_marginStart="@dimen/content_padding"
|
||||
android:layout_marginEnd="@dimen/content_padding" />
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginLeft="64dp"
|
||||
android:layout_marginRight="64dp"
|
||||
android:layout_marginLeft="@dimen/bottom_sheet_divider_margin_start"
|
||||
android:layout_marginRight="@dimen/bottom_sheet_divider_margin_start"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:textAppearance="@style/TextAppearance.ListItemTitle"
|
||||
android:textColor="?attr/active_color_basic"
|
||||
osmand:typeface="@string/font_roboto_medium"
|
||||
tools:text="Some Title" />
|
||||
tools:text="Some Title"
|
||||
android:layout_marginEnd="@dimen/bottom_sheet_divider_margin_start"
|
||||
android:layout_marginStart="@dimen/bottom_sheet_divider_margin_start" />
|
||||
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/compound_button"
|
||||
|
@ -48,7 +52,9 @@
|
|||
android:background="@null"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:focusableInTouchMode="false" />
|
||||
android:focusableInTouchMode="false"
|
||||
android:layout_marginEnd="@dimen/content_padding"
|
||||
android:layout_marginStart="@dimen/content_padding" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
|
|
|
@ -23,7 +23,9 @@
|
|||
android:layout_marginLeft="@dimen/content_padding"
|
||||
android:layout_marginRight="@dimen/content_padding"
|
||||
android:layout_marginTop="@dimen/content_padding"
|
||||
android:src="@drawable/ic_action_fav_dark" />
|
||||
android:src="@drawable/ic_action_fav_dark"
|
||||
android:layout_marginStart="@dimen/content_padding"
|
||||
android:layout_marginEnd="@dimen/content_padding" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
|
@ -48,7 +50,7 @@
|
|||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="2dp">
|
||||
android:layout_marginTop="@dimen/subHeaderPadding">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/waypoint_dist"
|
||||
|
@ -65,9 +67,9 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginLeft="6dp"
|
||||
android:layout_marginStart="6dp"
|
||||
android:drawablePadding="2dp"
|
||||
android:layout_marginLeft="@dimen/dashPadding"
|
||||
android:layout_marginStart="@dimen/dashPadding"
|
||||
android:drawablePadding="@dimen/subHeaderPadding"
|
||||
android:maxLines="1"
|
||||
android:textColor="@color/text_color_secondary_dark"
|
||||
android:textSize="@dimen/default_sub_text_size"
|
||||
|
@ -92,11 +94,11 @@
|
|||
<ImageButton
|
||||
android:id="@+id/info_close"
|
||||
style="@style/Widget.AppCompat.ActionButton"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_width="@dimen/bottom_sheet_list_item_height"
|
||||
android:layout_height="@dimen/bottom_sheet_list_item_height"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginEnd="2dp"
|
||||
android:layout_marginRight="2dp"
|
||||
android:layout_marginEnd="@dimen/subHeaderPadding"
|
||||
android:layout_marginRight="@dimen/subHeaderPadding"
|
||||
android:contentDescription="@string/shared_string_delete"
|
||||
android:focusable="false"
|
||||
android:scaleType="center"
|
||||
|
@ -108,7 +110,7 @@
|
|||
android:id="@+id/bottom_divider"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginTop="@dimen/content_padding_half"
|
||||
android:background="?attr/divider_color_basic" />
|
||||
|
||||
</LinearLayout>
|
||||
|
|