Merge branch 'master' into Vechicle_pref_numeric_dialog_37
# Conflicts: # OsmAnd/src/net/osmand/plus/settings/fragments/VehicleParametersFragment.java
|
@ -33,8 +33,9 @@ public class CollatorStringMatcher implements StringMatcher {
|
|||
|
||||
public CollatorStringMatcher(String part, StringMatcherMode mode) {
|
||||
this.collator = OsmAndCollator.primaryCollator();
|
||||
this.part = part.toLowerCase(Locale.getDefault());
|
||||
this.part = simplifyStringAndAlignChars(part);
|
||||
this.mode = mode;
|
||||
|
||||
}
|
||||
|
||||
public Collator getCollator() {
|
||||
|
@ -123,14 +124,15 @@ public class CollatorStringMatcher implements StringMatcher {
|
|||
* @param theStart
|
||||
* @return true if searchIn starts with token
|
||||
*/
|
||||
public static boolean cstartsWith(Collator collator, String fullText, String theStart,
|
||||
public static boolean cstartsWith(Collator collator, String fullTextP, String theStart,
|
||||
boolean checkBeginning, boolean checkSpaces, boolean equals) {
|
||||
String searchIn = fullText.toLowerCase(Locale.getDefault());
|
||||
String searchIn = simplifyStringAndAlignChars(fullTextP);
|
||||
int searchInLength = searchIn.length();
|
||||
int startLength = theStart.length();
|
||||
if (startLength == 0) {
|
||||
return true;
|
||||
}
|
||||
// this is not correct because of Auhofstrasse != Auhofstraße
|
||||
if (startLength > searchInLength) {
|
||||
return false;
|
||||
}
|
||||
|
@ -152,7 +154,8 @@ public class CollatorStringMatcher implements StringMatcher {
|
|||
if (isSpace(searchIn.charAt(i - 1)) && !isSpace(searchIn.charAt(i))) {
|
||||
if (collator.equals(searchIn.substring(i, i + startLength), theStart)) {
|
||||
if(equals) {
|
||||
if(i + startLength == searchInLength || isSpace(searchIn.charAt(i + startLength))) {
|
||||
if(i + startLength == searchInLength ||
|
||||
isSpace(searchIn.charAt(i + startLength))) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
|
@ -168,7 +171,17 @@ public class CollatorStringMatcher implements StringMatcher {
|
|||
return false;
|
||||
}
|
||||
|
||||
private static String simplifyStringAndAlignChars(String fullText) {
|
||||
int i;
|
||||
fullText = fullText.toLowerCase(Locale.getDefault());
|
||||
while( (i = fullText.indexOf('ß') ) != -1 ) {
|
||||
fullText = fullText.substring(0, i) + "ss" + fullText.substring(i+1);
|
||||
}
|
||||
return fullText;
|
||||
}
|
||||
|
||||
private static boolean isSpace(char c){
|
||||
return !Character.isLetter(c) && !Character.isDigit(c);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -354,6 +354,7 @@ public class NativeLibrary {
|
|||
FileInputStream fis = new FileInputStream(f);
|
||||
Algorithms.streamCopy(fis, ous);
|
||||
fis.close();
|
||||
System.out.println("FONT " + name);
|
||||
initFontType(ous.toByteArray(), name.substring(0, name.length() - 4), name.toLowerCase().contains("bold"),
|
||||
name.toLowerCase().contains("italic"));
|
||||
} catch (IOException e) {
|
||||
|
|
|
@ -38,4 +38,5 @@ public class OsmAndCollator {
|
|||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package net.osmand;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
|
@ -19,19 +20,23 @@ public class Reshaper {
|
|||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public static String reshape(String s) {
|
||||
// if(true) {
|
||||
// return s;
|
||||
// }
|
||||
try {
|
||||
ArabicShaping as = new ArabicShaping(ArabicShaping.LETTERS_SHAPE | ArabicShaping.LENGTH_GROW_SHRINK);
|
||||
ArabicShaping as = new ArabicShaping(ArabicShaping.LETTERS_SHAPE |
|
||||
ArabicShaping.LENGTH_GROW_SHRINK);
|
||||
//printSplit("B", s);
|
||||
try {
|
||||
s = as.shape(s);
|
||||
} catch (ArabicShapingException e) {
|
||||
LOG.error(e.getMessage(), e);
|
||||
}
|
||||
//printSplit("A", s);
|
||||
Bidi line = new Bidi(s.length(), s.length());
|
||||
line.setPara(s, Bidi.LEVEL_DEFAULT_LTR, null);
|
||||
// line.setPara(s, Bidi.LEVEL_DEFAULT_LTR, null);
|
||||
// s = line.writeReordered(Bidi.DO_MIRRORING);
|
||||
// s = reordered;
|
||||
byte direction = line.getDirection();
|
||||
if (direction != Bidi.MIXED) {
|
||||
// unidirectional
|
||||
|
@ -40,40 +45,42 @@ public class Reshaper {
|
|||
} else {
|
||||
char[] chs = new char[s.length()];
|
||||
for(int i = 0; i< chs.length ; i++) {
|
||||
chs[i] = s.charAt(chs.length - i - 1);
|
||||
// chs[i] = s.charAt(chs.length - i - 1);
|
||||
chs[i] = mirror(s.charAt(chs.length - i - 1));
|
||||
}
|
||||
return new String(chs);
|
||||
}
|
||||
} else {
|
||||
// // mixed-directional
|
||||
// mixed-directional
|
||||
// System.out.println(s);
|
||||
// printSplit("Split", s);
|
||||
int count = line.countRuns();
|
||||
// if (styleRunCount <= 1) {
|
||||
// int style = styleRuns[0].style;
|
||||
// // iterate over directional runs
|
||||
// for (i = 0; i < count; ++i) {
|
||||
// run = line.getVisualRun(i);
|
||||
// renderRun(text, run.getStart(), run.getLimit(),
|
||||
// run.getDirection(), style);
|
||||
// }
|
||||
// }
|
||||
StringBuilder res = new StringBuilder();
|
||||
// iterate over both directional and style runs
|
||||
for (int i = 0; i < count; ++i) {
|
||||
StringBuilder runs = new StringBuilder();
|
||||
BidiRun run = line.getVisualRun(i);
|
||||
|
||||
int st = run.getStart();
|
||||
int e = run.getLimit();
|
||||
int j = run.getDirection() == Bidi.LTR ? st : e - 1;
|
||||
int l = run.getDirection() == Bidi.LTR ? e : st - 1;
|
||||
boolean plus = run.getDirection() == Bidi.LTR;
|
||||
while (j != l) {
|
||||
res.append(s.charAt(j));
|
||||
if (plus) {
|
||||
j++;
|
||||
boolean ltr = run.getDirection() == Bidi.LTR;
|
||||
int start = run.getStart();
|
||||
int limit = run.getLimit();
|
||||
int begin = ltr ? start : limit - 1;
|
||||
int end = ltr ? limit : start - 1;
|
||||
int ind = begin;
|
||||
while (ind != end) {
|
||||
char ch = s.charAt(ind);
|
||||
if (!ltr) {
|
||||
ch = mirror(ch);
|
||||
}
|
||||
res.append(ch);
|
||||
runs.append(ch);
|
||||
if (ltr) {
|
||||
ind++;
|
||||
} else {
|
||||
j--;
|
||||
ind--;
|
||||
}
|
||||
|
||||
}
|
||||
printSplit(run.getDirection() + " " + run.getEmbeddingLevel(), runs.toString());
|
||||
}
|
||||
return res.toString();
|
||||
}
|
||||
|
@ -83,24 +90,77 @@ public class Reshaper {
|
|||
}
|
||||
|
||||
}
|
||||
public static void main(String[] args) {
|
||||
// char[] c = new char[] {'א', 'ד','ם', ' ', '1', '2'} ;
|
||||
// String reshape = "אדם";
|
||||
char[] c = new char[] {'א', 'ד','ם'} ;
|
||||
String reshape = reshape(new String(c));
|
||||
for(int i=0; i < reshape.length(); i++) {
|
||||
System.out.println(reshape.charAt(i));
|
||||
private static char mirror(char ch) {
|
||||
switch (ch) {
|
||||
case '(': ch = ')'; break;
|
||||
case ')': ch = '('; break;
|
||||
case '[': ch = ']'; break;
|
||||
case ']': ch = '['; break;
|
||||
}
|
||||
return ch;
|
||||
}
|
||||
public static void main(String[] args) {
|
||||
test2();
|
||||
test3();
|
||||
test4();
|
||||
test5();
|
||||
}
|
||||
|
||||
private static void test2() {
|
||||
public static void test3() {
|
||||
String s = "מרכז מסחרי/השלום (40050)";
|
||||
String reshape = reshape(s);
|
||||
String expected = "(40050) םולשה/ירחסמ זכרמ";
|
||||
check(s, reshape, expected);
|
||||
}
|
||||
|
||||
public static void test5() {
|
||||
String s = "מרכז מסחרי/השלום (מרז)";
|
||||
String reshape = reshape(s);
|
||||
String expected = "(זרמ) םולשה/ירחסמ זכרמ";
|
||||
check(s, reshape, expected);
|
||||
}
|
||||
|
||||
public static void check(String source, String reshape, String expected) {
|
||||
printSplit("Source ", source);
|
||||
printSplit("Expected", expected);
|
||||
printSplit("Reshaped", reshape);
|
||||
System.out.println(reshape);
|
||||
if (!reshape.equals(expected)) {
|
||||
throw new IllegalArgumentException(String.format("Bug: expected '%s', reshaped '%s'", expected, reshape));
|
||||
}
|
||||
}
|
||||
|
||||
static void printSplit(String p, String source) {
|
||||
printSplit(p, source, true);
|
||||
printSplit(p, source, false);
|
||||
}
|
||||
static void printSplit(String p, String source, boolean f) {
|
||||
System.out.print(p);
|
||||
System.out.print(": \u2066");
|
||||
for (int i = 0; i < source.length(); i++) {
|
||||
if (f) {
|
||||
System.out.print(source.charAt(i));
|
||||
System.out.print(" \u200e");
|
||||
} else {
|
||||
System.out.print(String.format("%04x ", (int) source.charAt(i)));
|
||||
}
|
||||
}
|
||||
// System.out.println(Arrays.toString(source.toCharArray()));
|
||||
System.out.println();
|
||||
System.out.flush();
|
||||
}
|
||||
|
||||
public static void test2() {
|
||||
String s = "گچ پژ نمکی باللغة العربي";
|
||||
String reshape = reshape(s);
|
||||
|
||||
if (!reshape.equals("ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ ﯽﮑﻤﻧ ﮋﭘ ﭻﮔ")) {
|
||||
throw new IllegalArgumentException("BUG!!!");
|
||||
String expected1 = "ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ ﯽﮑﻤﻧ ﮋﭘ ﭻﮔ";
|
||||
String expected2 = "ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ یکﻤﻧ ژپ چگ";
|
||||
check(s, reshape, expected1);
|
||||
}
|
||||
|
||||
public static void test4() {
|
||||
String s = "Abc (123)";
|
||||
check(s, reshape(s), s);
|
||||
}
|
||||
|
||||
}
|
|
@ -93,33 +93,6 @@ public class Amenity extends MapObject {
|
|||
return str;
|
||||
}
|
||||
|
||||
public String unzipContent(String str) {
|
||||
if (str != null) {
|
||||
if (str.startsWith(" gz ")) {
|
||||
try {
|
||||
int ind = 4;
|
||||
byte[] bytes = new byte[str.length() - ind];
|
||||
for (int i = ind; i < str.length(); i++) {
|
||||
char ch = str.charAt(i);
|
||||
bytes[i - ind] = (byte) ((int) ch - 128 - 32);
|
||||
|
||||
}
|
||||
GZIPInputStream gzn = new GZIPInputStream(new ByteArrayInputStream(bytes));
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(gzn, "UTF-8"));
|
||||
StringBuilder bld = new StringBuilder();
|
||||
String s;
|
||||
while ((s = br.readLine()) != null) {
|
||||
bld.append(s);
|
||||
}
|
||||
br.close();
|
||||
str = bld.toString();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
public Map<String, String> getAdditionalInfo() {
|
||||
if (additionalInfo == null) {
|
||||
|
|
|
@ -8,6 +8,10 @@ import net.osmand.util.TransliterationHelper;
|
|||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
|
@ -18,6 +22,7 @@ import java.util.List;
|
|||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
|
||||
public abstract class MapObject implements Comparable<MapObject> {
|
||||
|
@ -55,7 +60,7 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
|
||||
public String getName() {
|
||||
if (name != null) {
|
||||
return name;
|
||||
return unzipContent(name);
|
||||
}
|
||||
return ""; //$NON-NLS-1$
|
||||
}
|
||||
|
@ -73,7 +78,7 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
if (names == null) {
|
||||
names = new HashMap<String, String>();
|
||||
}
|
||||
names.put(lang, name);
|
||||
names.put(lang, unzipContent(name));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -95,19 +100,25 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
}
|
||||
Map<String, String> mp = new HashMap<String, String>();
|
||||
if (names != null) {
|
||||
mp.putAll(names);
|
||||
Iterator<Entry<String, String>> it = mp.entrySet().iterator();
|
||||
while(it.hasNext()) {
|
||||
Entry<String, String> e = it.next();
|
||||
mp.put(e.getKey(), unzipContent(e.getValue()));
|
||||
}
|
||||
mp.put("en", enName);
|
||||
}
|
||||
mp.put("en", unzipContent(enName));
|
||||
return mp;
|
||||
}
|
||||
|
||||
public List<String> getAllNames() {
|
||||
List<String> l = new ArrayList<String>();
|
||||
if (!Algorithms.isEmpty(enName)) {
|
||||
l.add(enName);
|
||||
l.add(unzipContent(enName));
|
||||
}
|
||||
if (names != null) {
|
||||
l.addAll(names.values());
|
||||
for(String nm : names.values()) {
|
||||
l.add(unzipContent(nm));
|
||||
}
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
@ -179,7 +190,7 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
if (names != null) {
|
||||
String nm = names.get(lang);
|
||||
if (!Algorithms.isEmpty(nm)) {
|
||||
return nm;
|
||||
return unzipContent(nm);
|
||||
}
|
||||
if (transliterate) {
|
||||
return TransliterationHelper.transliterate(getName());
|
||||
|
@ -192,7 +203,7 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
|
||||
public String getEnName(boolean transliterate) {
|
||||
if (!Algorithms.isEmpty(enName)) {
|
||||
return this.enName;
|
||||
return unzipContent(this.enName);
|
||||
} else if (!Algorithms.isEmpty(getName()) && transliterate) {
|
||||
return TransliterationHelper.transliterate(getName());
|
||||
}
|
||||
|
@ -322,12 +333,12 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
|
||||
public JSONObject toJSON() {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("name", name);
|
||||
json.put("enName", enName);
|
||||
json.put("name", unzipContent(name));
|
||||
json.put("enName", unzipContent(enName));
|
||||
if (names != null && names.size() > 0) {
|
||||
JSONObject namesObj = new JSONObject();
|
||||
for (Entry<String, String> e : names.entrySet()) {
|
||||
namesObj.put(e.getKey(), e.getValue());
|
||||
namesObj.put(e.getKey(), unzipContent(e.getValue()));
|
||||
}
|
||||
json.put("names", namesObj);
|
||||
}
|
||||
|
@ -340,6 +351,31 @@ public abstract class MapObject implements Comparable<MapObject> {
|
|||
return json;
|
||||
}
|
||||
|
||||
public String unzipContent(String str) {
|
||||
if (str != null && str.startsWith(" gz ")) {
|
||||
try {
|
||||
int ind = 4;
|
||||
byte[] bytes = new byte[str.length() - ind];
|
||||
for (int i = ind; i < str.length(); i++) {
|
||||
char ch = str.charAt(i);
|
||||
bytes[i - ind] = (byte) ((int) ch - 128 - 32);
|
||||
}
|
||||
GZIPInputStream gzn = new GZIPInputStream(new ByteArrayInputStream(bytes));
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(gzn, "UTF-8"));
|
||||
StringBuilder bld = new StringBuilder();
|
||||
String s;
|
||||
while ((s = br.readLine()) != null) {
|
||||
bld.append(s);
|
||||
}
|
||||
br.close();
|
||||
str = bld.toString();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
protected static void parseJSON(JSONObject json, MapObject o) {
|
||||
if (json.has("name")) {
|
||||
o.name = json.getString("name");
|
||||
|
|
|
@ -301,8 +301,11 @@ public abstract class Entity implements Serializable {
|
|||
String values = getTag(OSMTagKey.IS_IN);
|
||||
if (values == null) {
|
||||
String city = getTag(OSMTagKey.ADDR_CITY);
|
||||
String place = getTag(OSMTagKey.ADDR_PLACE);
|
||||
if(!Algorithms.isEmpty(city)) {
|
||||
return Collections.singleton(city.trim());
|
||||
} else if(!Algorithms.isEmpty(place)) {
|
||||
return Collections.singleton(place.trim());
|
||||
}
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
|
|
@ -34,9 +34,11 @@ public class OSMSettings {
|
|||
// address
|
||||
PLACE("place"), //$NON-NLS-1$
|
||||
ADDR_HOUSE_NUMBER("addr:housenumber"), //$NON-NLS-1$
|
||||
ADDR2_HOUSE_NUMBER("addr2:housenumber"), //$NON-NLS-1$
|
||||
ADDR_HOUSE_NAME("addr:housename"), //$NON-NLS-1$
|
||||
ADDR_STREET("addr:street"), //$NON-NLS-1$
|
||||
ADDR_STREET2("addr:street2"), //$NON-NLS-1$
|
||||
ADDR2_STREET("addr2:street"), //$NON-NLS-1$
|
||||
ADDR_CITY("addr:city"), //$NON-NLS-1$
|
||||
ADDR_PLACE("addr:place"), //$NON-NLS-1$
|
||||
ADDR_POSTCODE("addr:postcode"), //$NON-NLS-1$
|
||||
|
|
|
@ -8,6 +8,9 @@ import java.util.Map;
|
|||
public class RenderingRuleStorageProperties {
|
||||
|
||||
public static final String UI_CATEGORY_HIDDEN = "ui_hidden";
|
||||
public static final String UI_CATEGORY_DETAILS = "details";
|
||||
public static final String UI_CATEGORY_HIDE = "hide";
|
||||
public static final String UI_CATEGORY_ROUTES = "routes";
|
||||
public static final String A_ENGINE_V1 = "engine_v1";
|
||||
public static final String A_APP_MODE= "appMode";
|
||||
public static final String A_BASE_APP_MODE = "baseAppMode";
|
||||
|
|
|
@ -11,6 +11,7 @@ import java.util.PriorityQueue;
|
|||
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.binary.RouteDataObject;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.osm.MapRenderingTypes;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
|
@ -138,7 +139,7 @@ public class BinaryRoutePlanner {
|
|||
checkIfGraphIsEmpty(ctx, ctx.getPlanRoadDirection() >= 0, graphDirectSegments, start, visitedDirectSegments,
|
||||
"Route is not found from selected start point.");
|
||||
if (ctx.planRouteIn2Directions()) {
|
||||
forwardSearch = (nonHeuristicSegmentsComparator.compare(graphDirectSegments.peek(), graphReverseSegments.peek()) < 0);
|
||||
forwardSearch = nonHeuristicSegmentsComparator.compare(graphDirectSegments.peek(), graphReverseSegments.peek()) <= 0;
|
||||
// if (graphDirectSegments.size() * 2 > graphReverseSegments.size()) {
|
||||
// forwardSearch = false;
|
||||
// } else if (graphDirectSegments.size() < 2 * graphReverseSegments.size()) {
|
||||
|
@ -798,10 +799,30 @@ public class BinaryRoutePlanner {
|
|||
" distToEnd=" + distanceToEnd +
|
||||
" segmentPoint=" + segmentPoint + " -- ", next, true);
|
||||
}
|
||||
if (!visitedSegments.containsKey(calculateRoutePointId(next, next.isPositive()))) {
|
||||
if (next.getParentRoute() == null
|
||||
|| ctx.roadPriorityComparator(next.distanceFromStart, next.distanceToEnd,
|
||||
distFromStart, distanceToEnd) > 0) {
|
||||
RouteSegment visIt = visitedSegments.get(calculateRoutePointId(next, next.isPositive()));
|
||||
boolean toAdd = true;
|
||||
if (visIt != null) {
|
||||
// the segment was already visited! We need to follow better route if it exists
|
||||
// that is very exceptional situation and almost exception, it can happen
|
||||
// 1. when we underestimate distnceToEnd - wrong h()
|
||||
// 2. because we process not small segments but the whole road, it could be that
|
||||
// deviation from the road is faster than following the whole road itself!
|
||||
if (TRACE_ROUTING) {
|
||||
printRoad(">?", visitedSegments.get(calculateRoutePointId(next, next.isPositive())),
|
||||
next.isPositive());
|
||||
}
|
||||
if (distFromStart < visIt.distanceFromStart && next.getParentRoute() == null) {
|
||||
toAdd = true;
|
||||
if (ctx.config.heuristicCoefficient <= 1) {
|
||||
System.err.println("! Alert distance from start " + distFromStart + " < "
|
||||
+ visIt.distanceFromStart + " id=" + next.road.id);
|
||||
}
|
||||
} else {
|
||||
toAdd = false;
|
||||
}
|
||||
}
|
||||
if (toAdd && (next.getParentRoute() == null || ctx.roadPriorityComparator(next.distanceFromStart,
|
||||
next.distanceToEnd, distFromStart, distanceToEnd) > 0)) {
|
||||
next.distanceFromStart = distFromStart;
|
||||
next.distanceToEnd = distanceToEnd;
|
||||
if (TRACE_ROUTING) {
|
||||
|
@ -812,27 +833,6 @@ public class BinaryRoutePlanner {
|
|||
next.setParentSegmentEnd(segmentPoint);
|
||||
graphSegments.add(next);
|
||||
}
|
||||
} else {
|
||||
// the segment was already visited! We need to follow better route if it exists
|
||||
// that is very exceptional situation and almost exception, it can happen
|
||||
// 1. when we underestimate distnceToEnd - wrong h()
|
||||
// 2. because we process not small segments but the whole road, it could be that
|
||||
// deviation from the road is faster than following the whole road itself!
|
||||
if (distFromStart < next.distanceFromStart) {
|
||||
if (ctx.config.heuristicCoefficient <= 1) {
|
||||
System.err.println("! Alert distance from start " + distFromStart + " < "
|
||||
+ next.distanceFromStart + " id=" + next.road.id);
|
||||
}
|
||||
// A: we can't change parent route just here, because we need to update visitedSegments
|
||||
// presumably we can do visitedSegments.put(calculateRoutePointId(next), next);
|
||||
// next.distanceFromStart = distFromStart;
|
||||
// next.setParentRoute(segment);
|
||||
// next.setParentSegmentEnd(segmentPoint);
|
||||
if (ctx.visitor != null) {
|
||||
// ctx.visitor.visitSegment(next, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -860,6 +860,12 @@ public class BinaryRoutePlanner {
|
|||
public int preciseX;
|
||||
public int preciseY;
|
||||
public List<RouteSegmentPoint> others;
|
||||
|
||||
public LatLon getPreciseLatLon() {
|
||||
return new LatLon(MapUtils.get31LatitudeY(preciseY), MapUtils.get31LongitudeX(preciseX));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class RouteSegment {
|
||||
|
|
|
@ -91,7 +91,7 @@ public class RoutePlannerFrontEnd {
|
|||
}
|
||||
if (road != null) {
|
||||
if(!transportStop) {
|
||||
float prio = ctx.getRouter().defineSpeedPriority(road.road);
|
||||
float prio = Math.max(ctx.getRouter().defineSpeedPriority(road.road), 0.3f);
|
||||
if (prio > 0) {
|
||||
road.distSquare = (road.distSquare + GPS_POSSIBLE_ERROR * GPS_POSSIBLE_ERROR)
|
||||
/ (prio * prio);
|
||||
|
@ -234,6 +234,7 @@ public class RoutePlannerFrontEnd {
|
|||
if (intermediates != null) {
|
||||
for (LatLon l : intermediates) {
|
||||
if (!addSegment(l, ctx, indexNotFound++, points, false)) {
|
||||
System.out.println(points.get(points.size() - 1).getRoad().toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -242,9 +243,7 @@ public class RoutePlannerFrontEnd {
|
|||
return null;
|
||||
}
|
||||
ctx.calculationProgress.nextIteration();
|
||||
List<RouteSegmentResult> res = searchRoute(ctx, points, routeDirection);
|
||||
// make start and end more precise
|
||||
makeStartEndPointsPrecise(res, start, end, intermediates);
|
||||
List<RouteSegmentResult> res = searchRouteImpl(ctx, points, routeDirection);
|
||||
if (res != null) {
|
||||
new RouteResultPreparation().printResults(ctx, start, end, res);
|
||||
}
|
||||
|
@ -255,33 +254,6 @@ public class RoutePlannerFrontEnd {
|
|||
if (res.size() > 0) {
|
||||
updateResult(res.get(0), start, true);
|
||||
updateResult(res.get(res.size() - 1), end, false);
|
||||
if (intermediates != null) {
|
||||
int k = 1;
|
||||
for (int i = 0; i < intermediates.size(); i++) {
|
||||
LatLon ll = intermediates.get(i);
|
||||
int px = MapUtils.get31TileNumberX(ll.getLongitude());
|
||||
int py = MapUtils.get31TileNumberY(ll.getLatitude());
|
||||
for (; k < res.size(); k++) {
|
||||
double currentsDist = projectDistance(res, k, px, py);
|
||||
if (currentsDist < 500 * 500) {
|
||||
for (int k1 = k + 1; k1 < res.size(); k1++) {
|
||||
double c2 = projectDistance(res, k1, px, py);
|
||||
if (c2 < currentsDist) {
|
||||
k = k1;
|
||||
currentsDist = c2;
|
||||
} else if (k1 - k > 15) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
updateResult(res.get(k), ll, false);
|
||||
if (k < res.size() - 1) {
|
||||
updateResult(res.get(k + 1), ll, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -300,7 +272,8 @@ public class RoutePlannerFrontEnd {
|
|||
int py = MapUtils.get31TileNumberY(point.getLatitude());
|
||||
int pind = st ? routeSegmentResult.getStartPointIndex() : routeSegmentResult.getEndPointIndex();
|
||||
|
||||
RouteDataObject r = routeSegmentResult.getObject();
|
||||
RouteDataObject r = new RouteDataObject(routeSegmentResult.getObject());
|
||||
routeSegmentResult.setObject(r);
|
||||
QuadPoint before = null;
|
||||
QuadPoint after = null;
|
||||
if (pind > 0) {
|
||||
|
@ -364,7 +337,7 @@ public class RoutePlannerFrontEnd {
|
|||
ctx.calculationProgress.segmentNotFound = indexNotFound;
|
||||
return false;
|
||||
} else {
|
||||
log.info("Route segment found " + f.getRoad().id + " " + f.getRoad().getName());
|
||||
log.info("Route segment found " + f.road);
|
||||
res.add(f);
|
||||
return true;
|
||||
}
|
||||
|
@ -383,6 +356,10 @@ public class RoutePlannerFrontEnd {
|
|||
ctx.precalculatedRouteDirection = routeDirection.adopt(ctx);
|
||||
}
|
||||
if (ctx.nativeLib != null) {
|
||||
ctx.startX = start.preciseX;
|
||||
ctx.startY = start.preciseY;
|
||||
ctx.targetX = end.preciseX;
|
||||
ctx.targetY = end.preciseY;
|
||||
return runNativeRouting(ctx, recalculationEnd);
|
||||
} else {
|
||||
refreshProgressDistance(ctx);
|
||||
|
@ -468,13 +445,18 @@ public class RoutePlannerFrontEnd {
|
|||
}
|
||||
|
||||
|
||||
private List<RouteSegmentResult> searchRoute(final RoutingContext ctx, List<RouteSegmentPoint> points, PrecalculatedRouteDirection routeDirection)
|
||||
private List<RouteSegmentResult> searchRouteImpl(final RoutingContext ctx, List<RouteSegmentPoint> points, PrecalculatedRouteDirection routeDirection)
|
||||
throws IOException, InterruptedException {
|
||||
if (points.size() <= 2) {
|
||||
// simple case 2 points only
|
||||
if (!useSmartRouteRecalculation) {
|
||||
ctx.previouslyCalculatedRoute = null;
|
||||
}
|
||||
return searchRoute(ctx, points.get(0), points.get(1), routeDirection);
|
||||
pringGC(ctx, true);
|
||||
List<RouteSegmentResult> res = searchRouteInternalPrepare(ctx, points.get(0), points.get(1), routeDirection);
|
||||
pringGC(ctx, false);
|
||||
makeStartEndPointsPrecise(res, points.get(0).getPreciseLatLon(), points.get(1).getPreciseLatLon(), null);
|
||||
return res;
|
||||
}
|
||||
|
||||
ArrayList<RouteSegmentResult> firstPartRecalculatedRoute = null;
|
||||
|
@ -516,7 +498,7 @@ public class RoutePlannerFrontEnd {
|
|||
local.visitor = ctx.visitor;
|
||||
local.calculationProgress = ctx.calculationProgress;
|
||||
List<RouteSegmentResult> res = searchRouteInternalPrepare(local, points.get(i), points.get(i + 1), routeDirection);
|
||||
|
||||
makeStartEndPointsPrecise(res, points.get(i).getPreciseLatLon(), points.get(i + 1).getPreciseLatLon(), null);
|
||||
results.addAll(res);
|
||||
ctx.distinctLoadedTiles += local.distinctLoadedTiles;
|
||||
ctx.loadedTiles += local.loadedTiles;
|
||||
|
@ -539,27 +521,22 @@ public class RoutePlannerFrontEnd {
|
|||
|
||||
}
|
||||
|
||||
@SuppressWarnings("static-access")
|
||||
private List<RouteSegmentResult> searchRoute(final RoutingContext ctx, RouteSegmentPoint start, RouteSegmentPoint end,
|
||||
PrecalculatedRouteDirection routeDirection) throws IOException, InterruptedException {
|
||||
if (ctx.SHOW_GC_SIZE) {
|
||||
long h1 = ctx.runGCUsedMemory();
|
||||
private void pringGC(final RoutingContext ctx, boolean before) {
|
||||
if (RoutingContext.SHOW_GC_SIZE && before) {
|
||||
long h1 = RoutingContext.runGCUsedMemory();
|
||||
float mb = (1 << 20);
|
||||
log.warn("Used before routing " + h1 / mb + " actual");
|
||||
}
|
||||
List<RouteSegmentResult> result = searchRouteInternalPrepare(ctx, start, end, routeDirection);
|
||||
if (RoutingContext.SHOW_GC_SIZE) {
|
||||
} else if (RoutingContext.SHOW_GC_SIZE && !before) {
|
||||
int sz = ctx.global.size;
|
||||
log.warn("Subregion size " + ctx.subregionTiles.size() + " " + " tiles " + ctx.indexedSubregions.size());
|
||||
ctx.runGCUsedMemory();
|
||||
long h1 = ctx.runGCUsedMemory();
|
||||
RoutingContext.runGCUsedMemory();
|
||||
long h1 = RoutingContext.runGCUsedMemory();
|
||||
ctx.unloadAllData();
|
||||
ctx.runGCUsedMemory();
|
||||
long h2 = ctx.runGCUsedMemory();
|
||||
RoutingContext.runGCUsedMemory();
|
||||
long h2 = RoutingContext.runGCUsedMemory();
|
||||
float mb = (1 << 20);
|
||||
log.warn("Unload context : estimated " + sz / mb + " ?= " + (h1 - h2) / mb + " actual");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,5 +1,24 @@
|
|||
package net.osmand.router;
|
||||
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import gnu.trove.iterator.TIntIterator;
|
||||
import gnu.trove.list.array.TIntArrayList;
|
||||
import gnu.trove.set.hash.TIntHashSet;
|
||||
import net.osmand.PlatformUtil;
|
||||
import net.osmand.binary.BinaryMapIndexReader;
|
||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
|
||||
|
@ -18,26 +37,6 @@ import net.osmand.util.Algorithms;
|
|||
import net.osmand.util.MapAlgorithms;
|
||||
import net.osmand.util.MapUtils;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import gnu.trove.iterator.TIntIterator;
|
||||
import gnu.trove.list.array.TIntArrayList;
|
||||
import gnu.trove.set.hash.TIntHashSet;
|
||||
|
||||
public class RouteResultPreparation {
|
||||
|
||||
public static boolean PRINT_TO_CONSOLE_ROUTE_INFORMATION_TO_TEST = false;
|
||||
|
@ -395,7 +394,6 @@ public class RouteResultPreparation {
|
|||
}
|
||||
// reverse it just to attach good direction roads
|
||||
Collections.reverse(result);
|
||||
|
||||
segment = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentRoute() : finalSegment;
|
||||
int parentSegmentEnd = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentSegmentEnd() : finalSegment.opposite.getSegmentStart();
|
||||
parentRoutingTime = -1;
|
||||
|
@ -622,7 +620,7 @@ public class RouteResultPreparation {
|
|||
// calculateStatistics(result);
|
||||
}
|
||||
|
||||
private void calculateStatistics(List<RouteSegmentResult> result) {
|
||||
protected void calculateStatistics(List<RouteSegmentResult> result) {
|
||||
InputStream is = RenderingRulesStorage.class.getResourceAsStream("default.render.xml");
|
||||
final Map<String, String> renderingConstants = new LinkedHashMap<String, String>();
|
||||
try {
|
||||
|
@ -799,13 +797,22 @@ public class RouteResultPreparation {
|
|||
}
|
||||
if (dist < mergeDistance) {
|
||||
mergeTurnLanes(leftside, currentSegment, nextSegment);
|
||||
inferCommonActiveLane(currentSegment.getTurnType(), nextSegment.getTurnType());
|
||||
TurnType turnType = currentSegment.getTurnType();
|
||||
TIntHashSet possibleTurn = getPossibleTurnsFromActiveLanes(turnType.getLanes(), true);
|
||||
if (possibleTurn.size() == 1) {
|
||||
TurnType tt = TurnType.valueOf(possibleTurn.iterator().next(), currentSegment.getTurnType().isLeftSide());
|
||||
tt.setLanes(turnType.getLanes());
|
||||
tt.setSkipToSpeak(turnType.isSkipToSpeak());
|
||||
currentSegment.setTurnType(tt);
|
||||
turnType = tt;
|
||||
}
|
||||
inferCommonActiveLane(turnType, nextSegment.getTurnType());
|
||||
merged = true;
|
||||
}
|
||||
}
|
||||
if (!merged) {
|
||||
TurnType tt = currentSegment.getTurnType();
|
||||
inferActiveTurnLanesFromTurn(tt, TurnType.C);
|
||||
inferActiveTurnLanesFromTurn(tt, tt.getValue());
|
||||
}
|
||||
nextSegment = currentSegment;
|
||||
dist = 0;
|
||||
|
@ -983,11 +990,9 @@ public class RouteResultPreparation {
|
|||
if(turnSet.size() == 1) {
|
||||
singleTurn = turnSet.iterator().next();
|
||||
} else if(currentTurn.goAhead() && turnSet.contains(nextTurn.getValue())) {
|
||||
if(currentTurn.isPossibleLeftTurn() &&
|
||||
TurnType.isLeftTurn(nextTurn.getValue())) {
|
||||
if (currentTurn.isPossibleLeftTurn() && TurnType.isLeftTurn(nextTurn.getValue())) {
|
||||
singleTurn = nextTurn.getValue();
|
||||
} else if(currentTurn.isPossibleLeftTurn() &&
|
||||
TurnType.isLeftTurn(nextTurn.getActiveCommonLaneTurn())) {
|
||||
} else if (currentTurn.isPossibleLeftTurn() && TurnType.isLeftTurn(nextTurn.getActiveCommonLaneTurn())) {
|
||||
singleTurn = nextTurn.getActiveCommonLaneTurn();
|
||||
} else if(currentTurn.isPossibleRightTurn() &&
|
||||
TurnType.isRightTurn(nextTurn.getValue())) {
|
||||
|
@ -1053,7 +1058,7 @@ public class RouteResultPreparation {
|
|||
// add description about turn
|
||||
double mpi = MapUtils.degreesDiff(prev.getBearingEnd(), rr.getBearingBegin());
|
||||
if(noAttachedRoads){
|
||||
// TODO VICTOR : look at the comment inside direction route
|
||||
// VICTOR : look at the comment inside direction route
|
||||
// ? avoid small zigzags is covered at (search for "zigzags")
|
||||
// double begin = rr.getObject().directionRoute(rr.getStartPointIndex(), rr.getStartPointIndex() <
|
||||
// rr.getEndPointIndex(), 25);
|
||||
|
@ -1268,17 +1273,8 @@ public class RouteResultPreparation {
|
|||
String[] splitLaneOptions = turnLanes.split("\\|", -1);
|
||||
int activeBeginIndex = findActiveIndex(rawLanes, splitLaneOptions, rs.leftLanes, true,
|
||||
rs.leftLanesInfo, rs.roadsOnLeft, rs.addRoadsOnLeft);
|
||||
|
||||
if(!rs.keepLeft && activeBeginIndex != -1 &&
|
||||
splitLaneOptions.length > 0 && !splitLaneOptions[splitLaneOptions.length - 1].contains(";")) {
|
||||
activeBeginIndex = Math.max(activeBeginIndex, 1);
|
||||
}
|
||||
int activeEndIndex = findActiveIndex(rawLanes, splitLaneOptions, rs.rightLanes, false,
|
||||
rs.rightLanesInfo, rs.roadsOnRight, rs.addRoadsOnRight);
|
||||
if(!rs.keepRight && activeEndIndex != -1 &&
|
||||
splitLaneOptions.length > 0 && !splitLaneOptions[0].contains(";") ) {
|
||||
activeEndIndex = Math.min(activeEndIndex, rawLanes.length - 1);
|
||||
}
|
||||
if (activeBeginIndex == -1 || activeEndIndex == -1 || activeBeginIndex > activeEndIndex) {
|
||||
// something went wrong
|
||||
return createSimpleKeepLeftRightTurn(leftSide, prevSegm, currentSegm, rs);
|
||||
|
@ -1291,6 +1287,12 @@ public class RouteResultPreparation {
|
|||
int tp = inferSlightTurnFromLanes(rawLanes, rs);
|
||||
if (tp != t.getValue() && tp != 0) {
|
||||
t = TurnType.valueOf(tp, leftSide);
|
||||
} else {
|
||||
if (rs.keepRight && TurnType.getSecondaryTurn(rawLanes[activeEndIndex]) == 0) {
|
||||
t = TurnType.valueOf(TurnType.getPrimaryTurn(rawLanes[activeEndIndex]), leftSide);
|
||||
} else if (rs.keepLeft && TurnType.getSecondaryTurn(rawLanes[activeBeginIndex]) == 0) {
|
||||
t = TurnType.valueOf(TurnType.getPrimaryTurn(rawLanes[activeBeginIndex]), leftSide);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int k = 0; k < rawLanes.length; k++) {
|
||||
|
@ -1596,59 +1598,11 @@ public class RouteResultPreparation {
|
|||
}
|
||||
|
||||
private int inferSlightTurnFromLanes(int[] oLanes, RoadSplitStructure rs) {
|
||||
TIntHashSet possibleTurns = new TIntHashSet();
|
||||
for (int i = 0; i < oLanes.length; i++) {
|
||||
if ((oLanes[i] & 1) == 0) {
|
||||
continue;
|
||||
}
|
||||
if (possibleTurns.isEmpty()) {
|
||||
// Nothing is in the list to compare to, so add the first elements
|
||||
possibleTurns.add(TurnType.getPrimaryTurn(oLanes[i]));
|
||||
if (TurnType.getSecondaryTurn(oLanes[i]) != 0) {
|
||||
possibleTurns.add(TurnType.getSecondaryTurn(oLanes[i]));
|
||||
}
|
||||
if (TurnType.getTertiaryTurn(oLanes[i]) != 0) {
|
||||
possibleTurns.add(TurnType.getTertiaryTurn(oLanes[i]));
|
||||
}
|
||||
} else {
|
||||
TIntArrayList laneTurns = new TIntArrayList();
|
||||
laneTurns.add(TurnType.getPrimaryTurn(oLanes[i]));
|
||||
if (TurnType.getSecondaryTurn(oLanes[i]) != 0) {
|
||||
laneTurns.add(TurnType.getSecondaryTurn(oLanes[i]));
|
||||
}
|
||||
if (TurnType.getTertiaryTurn(oLanes[i]) != 0) {
|
||||
laneTurns.add(TurnType.getTertiaryTurn(oLanes[i]));
|
||||
}
|
||||
possibleTurns.retainAll(laneTurns);
|
||||
TIntHashSet possibleTurns = getPossibleTurnsFromActiveLanes(oLanes, false);
|
||||
if (possibleTurns.isEmpty()) {
|
||||
// No common turns, so can't determine anything.
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove all turns from lanes not selected...because those aren't it
|
||||
for (int i = 0; i < oLanes.length; i++) {
|
||||
if ((oLanes[i] & 1) == 0 && !possibleTurns.isEmpty()) {
|
||||
possibleTurns.remove((Integer) TurnType.getPrimaryTurn(oLanes[i]));
|
||||
if (TurnType.getSecondaryTurn(oLanes[i]) != 0) {
|
||||
possibleTurns.remove((Integer) TurnType.getSecondaryTurn(oLanes[i]));
|
||||
}
|
||||
if (TurnType.getTertiaryTurn(oLanes[i]) != 0) {
|
||||
possibleTurns.remove((Integer) TurnType.getTertiaryTurn(oLanes[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
// remove all non-slight turns // TEST don't pass
|
||||
// if(possibleTurns.size() > 1) {
|
||||
// TIntIterator it = possibleTurns.iterator();
|
||||
// while(it.hasNext()) {
|
||||
// int nxt = it.next();
|
||||
// if(!TurnType.isSlightTurn(nxt)) {
|
||||
// it.remove();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
int infer = 0;
|
||||
if (possibleTurns.size() == 1) {
|
||||
infer = possibleTurns.iterator().next();
|
||||
|
@ -1687,6 +1641,53 @@ public class RouteResultPreparation {
|
|||
return infer;
|
||||
}
|
||||
|
||||
private TIntHashSet getPossibleTurnsFromActiveLanes(int[] oLanes, boolean onlyPrimary) {
|
||||
TIntHashSet possibleTurns = new TIntHashSet();
|
||||
for (int i = 0; i < oLanes.length; i++) {
|
||||
if ((oLanes[i] & 1) == 0) {
|
||||
continue;
|
||||
}
|
||||
if (possibleTurns.isEmpty()) {
|
||||
// Nothing is in the list to compare to, so add the first elements
|
||||
possibleTurns.add(TurnType.getPrimaryTurn(oLanes[i]));
|
||||
if (!onlyPrimary && TurnType.getSecondaryTurn(oLanes[i]) != 0) {
|
||||
possibleTurns.add(TurnType.getSecondaryTurn(oLanes[i]));
|
||||
}
|
||||
if (!onlyPrimary && TurnType.getTertiaryTurn(oLanes[i]) != 0) {
|
||||
possibleTurns.add(TurnType.getTertiaryTurn(oLanes[i]));
|
||||
}
|
||||
} else {
|
||||
TIntArrayList laneTurns = new TIntArrayList();
|
||||
laneTurns.add(TurnType.getPrimaryTurn(oLanes[i]));
|
||||
if (!onlyPrimary && TurnType.getSecondaryTurn(oLanes[i]) != 0) {
|
||||
laneTurns.add(TurnType.getSecondaryTurn(oLanes[i]));
|
||||
}
|
||||
if (!onlyPrimary && TurnType.getTertiaryTurn(oLanes[i]) != 0) {
|
||||
laneTurns.add(TurnType.getTertiaryTurn(oLanes[i]));
|
||||
}
|
||||
possibleTurns.retainAll(laneTurns);
|
||||
if (possibleTurns.isEmpty()) {
|
||||
// No common turns, so can't determine anything.
|
||||
return possibleTurns;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove all turns from lanes not selected...because those aren't it
|
||||
for (int i = 0; i < oLanes.length; i++) {
|
||||
if ((oLanes[i] & 1) == 0 && !possibleTurns.isEmpty()) {
|
||||
possibleTurns.remove((Integer) TurnType.getPrimaryTurn(oLanes[i]));
|
||||
if (TurnType.getSecondaryTurn(oLanes[i]) != 0) {
|
||||
possibleTurns.remove((Integer) TurnType.getSecondaryTurn(oLanes[i]));
|
||||
}
|
||||
if (TurnType.getTertiaryTurn(oLanes[i]) != 0) {
|
||||
possibleTurns.remove((Integer) TurnType.getTertiaryTurn(oLanes[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
return possibleTurns;
|
||||
}
|
||||
|
||||
private boolean isMotorway(RouteSegmentResult s){
|
||||
String h = s.getObject().getHighway();
|
||||
return "motorway".equals(h) || "motorway_link".equals(h) ||
|
||||
|
@ -1740,7 +1741,7 @@ public class RouteResultPreparation {
|
|||
public void remove() {
|
||||
}
|
||||
};
|
||||
} else if (recalculation) {
|
||||
} else if (recalculation || ctx.nativeLib == null) {
|
||||
RouteSegment rt = ctx.loadRouteSegment(road.getPoint31XTile(pointInd), road.getPoint31YTile(pointInd), ctx.config.memoryLimitation);
|
||||
it = rt == null ? null : rt.getIterator();
|
||||
} else {
|
||||
|
|
|
@ -21,7 +21,9 @@ import gnu.trove.map.hash.TIntObjectHashMap;
|
|||
|
||||
|
||||
public class RouteSegmentResult implements StringExternalizable<RouteDataBundle> {
|
||||
private final RouteDataObject object;
|
||||
// this should be bigger (50-80m) but tests need to be fixed first
|
||||
private static final float DIST_BEARING_DETECT = 5;
|
||||
private RouteDataObject object;
|
||||
private int startPointIndex;
|
||||
private int endPointIndex;
|
||||
private List<RouteSegmentResult>[] attachedRoutes;
|
||||
|
@ -444,11 +446,11 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
|||
}
|
||||
|
||||
public float getBearingBegin() {
|
||||
return (float) (object.directionRoute(startPointIndex, startPointIndex < endPointIndex) / Math.PI * 180);
|
||||
return (float) (object.directionRoute(startPointIndex, startPointIndex < endPointIndex, DIST_BEARING_DETECT) / Math.PI * 180);
|
||||
}
|
||||
|
||||
public float getBearing(int point, boolean plus) {
|
||||
return (float) (object.directionRoute(point, plus) / Math.PI * 180);
|
||||
return (float) (object.directionRoute(point, plus, DIST_BEARING_DETECT) / Math.PI * 180);
|
||||
}
|
||||
|
||||
public float getDistance(int point, boolean plus) {
|
||||
|
@ -456,7 +458,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
|||
}
|
||||
|
||||
public float getBearingEnd() {
|
||||
return (float) (MapUtils.alignAngleDifference(object.directionRoute(endPointIndex, startPointIndex > endPointIndex) - Math.PI) / Math.PI * 180);
|
||||
return (float) (MapUtils.alignAngleDifference(object.directionRoute(endPointIndex, startPointIndex > endPointIndex, DIST_BEARING_DETECT) - Math.PI) / Math.PI * 180);
|
||||
}
|
||||
|
||||
public void setSegmentTime(float segmentTime) {
|
||||
|
@ -534,9 +536,15 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
|
|||
this.description = description;
|
||||
}
|
||||
|
||||
public void setObject(RouteDataObject r) {
|
||||
this.object = r;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return object.toString() + ": " + startPointIndex + "-" + endPointIndex;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -36,7 +36,7 @@ import net.osmand.router.RoutePlannerFrontEnd.RouteCalculationMode;
|
|||
|
||||
public class RoutingContext {
|
||||
|
||||
public static final boolean SHOW_GC_SIZE = false;
|
||||
public static boolean SHOW_GC_SIZE = false;
|
||||
|
||||
|
||||
private final static Log log = PlatformUtil.getLog(RoutingContext.class);
|
||||
|
@ -467,15 +467,14 @@ public class RoutingContext {
|
|||
long h2 = runGCUsedMemory();
|
||||
float mb = (1 << 20);
|
||||
log.warn("Unload tiles : estimated " + (sz1 - sz2) / mb + " ?= " + (h1 - h2) / mb + " actual");
|
||||
log.warn("Used after " + h2 / mb + " of " + Runtime.getRuntime().totalMemory() / mb + " max "
|
||||
+ maxMemory() / mb);
|
||||
log.warn("Used after " + h2 / mb + " of " + Runtime.getRuntime().totalMemory() / mb );
|
||||
} else {
|
||||
float mb = (1 << 20);
|
||||
int sz2 = getCurrentEstimatedSize();
|
||||
log.warn("Unload tiles : occupied before " + sz1 / mb + " Mb - now " + sz2 / mb + "MB "
|
||||
+ memoryLimit / mb + " limit MB " + config.memoryLimitation / mb);
|
||||
long us2 = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
|
||||
log.warn("Used memory before " + us1 / mb + "after " + us1 / mb + " of max " + maxMemory() / mb);
|
||||
log.warn("Used memory before " + us1 / mb + "after " + us1 / mb );
|
||||
}
|
||||
}
|
||||
if (!indexedSubregions.containsKey(tileId)) {
|
||||
|
@ -507,12 +506,6 @@ public class RoutingContext {
|
|||
return tileId;
|
||||
}
|
||||
|
||||
private long maxMemory() {
|
||||
// AVIAN FIXME
|
||||
// return Runtime.getRuntime().maxMemory();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public boolean checkIfMemoryLimitCritical(long memoryLimit) {
|
||||
|
|
|
@ -23,7 +23,7 @@ import net.osmand.osm.edit.Way;
|
|||
import net.osmand.util.MapUtils;
|
||||
|
||||
public class TransportStopsRouteReader {
|
||||
public static final int MISSING_STOP_SEARCH_RADIUS = 15000;
|
||||
public static final int MISSING_STOP_SEARCH_RADIUS = 30000;
|
||||
TLongObjectHashMap<TransportRoute> combinedRoutesCache = new TLongObjectHashMap<TransportRoute>();
|
||||
Map<BinaryMapIndexReader, TIntObjectHashMap<TransportRoute>> routesFilesCache = new LinkedHashMap<BinaryMapIndexReader,
|
||||
TIntObjectHashMap<TransportRoute>>();
|
||||
|
|
|
@ -414,7 +414,8 @@ public class SearchCoreFactory {
|
|||
if (object.getName().startsWith("<")) {
|
||||
return false;
|
||||
}
|
||||
if (!phrase.getFirstUnknownNameStringMatcher().matches(stripBraces(sr.localeName))) {
|
||||
|
||||
if (!phrase.getUnknownWordToSearchBuildingNameMatcher().matches(stripBraces(sr.localeName))) {
|
||||
sr.priorityDistance = 5;
|
||||
}
|
||||
sr.objectType = ObjectType.STREET;
|
||||
|
|
56
OsmAnd-java/src/test/java/net/osmand/ReShaperTest.java
Normal file
|
@ -0,0 +1,56 @@
|
|||
package net.osmand;
|
||||
|
||||
import java.text.Normalizer;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.ibm.icu.text.ArabicShaping;
|
||||
import com.ibm.icu.text.ArabicShapingException;
|
||||
import com.ibm.icu.text.Bidi;
|
||||
|
||||
import net.osmand.Reshaper;
|
||||
|
||||
public class ReShaperTest {
|
||||
|
||||
|
||||
//
|
||||
|
||||
// Source : ه ە ی ب ە
|
||||
// Expected: ه ە ی ب ە
|
||||
// Reshaped: ە ﺐ ﯾ ە ﻩ
|
||||
@Test
|
||||
public void testArabName() throws ArabicShapingException {
|
||||
// https://www.compart.com/en/unicode/U+FCD8
|
||||
// String source = "\uFEEB\u06d5";
|
||||
// System.out.println(new ArabicShaping(0).shape(s));
|
||||
// System.out.println("\uFEEB\u06d5");
|
||||
String source = "هەیبە";
|
||||
String expected = "ەﺐﯾەﻩ";
|
||||
String res = Reshaper.reshape(source);
|
||||
Reshaper.check(source, res, expected);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void test2() throws ArabicShapingException {
|
||||
Reshaper.test2();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test3() throws ArabicShapingException {
|
||||
Reshaper.test3();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test4() throws ArabicShapingException {
|
||||
Reshaper.test4();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test5() throws ArabicShapingException {
|
||||
Reshaper.test5();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -38,15 +38,13 @@ public class RouteResultPreparationTest {
|
|||
private static RoutePlannerFrontEnd fe;
|
||||
private static RoutingContext ctx;
|
||||
|
||||
private String testName;
|
||||
private LatLon startPoint;
|
||||
private LatLon endPoint;
|
||||
private Map<Long, String> expectedResults;
|
||||
|
||||
private Log log = PlatformUtil.getLog(RouteResultPreparationTest.class);
|
||||
protected Log log = PlatformUtil.getLog(RouteResultPreparationTest.class);
|
||||
|
||||
public RouteResultPreparationTest(String testName, LatLon startPoint, LatLon endPoint, Map<Long, String> expectedResults) {
|
||||
this.testName = testName;
|
||||
this.startPoint = startPoint;
|
||||
this.endPoint = endPoint;
|
||||
this.expectedResults = expectedResults;
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
<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="sharing_status">Статус абмену</string>
|
||||
<string name="location_sharing_status">Абмен: %1$s</string>
|
||||
<string name="shared_string_enabled">Уключана</string>
|
||||
<string name="shared_string_status">Статус</string>
|
||||
|
@ -75,7 +75,7 @@
|
|||
<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="sharing_time">Час абмену</string>
|
||||
<string name="expire_at">Сыходзіць</string>
|
||||
<string name="stop_sharing_all">Абмен уключаны (выключыць)</string>
|
||||
<string name="turn_off_location_sharing">Выключыць абмен</string>
|
||||
|
@ -168,9 +168,7 @@
|
|||
<string name="shared_string_hour_short">г</string>
|
||||
<string name="shared_string_minute_short">хвіл</string>
|
||||
<string name="shared_string_second_short">сек</string>
|
||||
<string name="welcome_descr">
|
||||
<b>Назіральнік OsmAnd</b> Дае магчымасць дзяліцца сваім месцазнаходжаннем і бачыць месцазнаходжанне іншых у OsmAnd.<br/>
|
||||
<br/> Дадатак выкарыстоўвае Telegram API, таму вам неабходны акаўнт Тэлеграм.</string>
|
||||
<string name="welcome_descr"><b>Назіральнік OsmAnd</b> Дае магчымасць дзяліцца сваім месцазнаходжаннем і бачыць месцазнаходжанне іншых у OsmAnd.<br/> <br/> Дадатак выкарыстоўвае Telegram API, таму вам неабходны акаўнт Тэлеграм.</string>
|
||||
<string name="my_location">Маё месцазнаходжанне</string>
|
||||
<string name="live_now">Зараз дзейнічае</string>
|
||||
<string name="send_location_as">Адправіць месцазнаходжанне як</string>
|
||||
|
@ -246,10 +244,10 @@
|
|||
<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_start">Запусціць назіральнік</string>
|
||||
<string name="shared_string_apply">Ужыць</string>
|
||||
<string name="set_time_timeline_descr">Абраць час для паказу</string>
|
||||
<string name="start_end_date">Пачатак - дата завяршэння</string>
|
||||
<string name="start_end_date">Дата пачатку - дата завяршэння</string>
|
||||
<string name="saved_messages">Захаваныя паведамленні</string>
|
||||
<string name="time_zone_descr">Абярыце часавы пояс, каб паказваць ваш час у паведамленнях.</string>
|
||||
<string name="time_zone">Часавы пояс</string>
|
||||
|
|
7
OsmAnd-telegram/res/values-br/strings.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="shared_string_suggested">Kinniget</string>
|
||||
<string name="back_to_osmand">Distreiñ da OsmAnd</string>
|
||||
<string name="duration_ago">%1$e \'zo</string>
|
||||
<string name="shared_string_error_short">FAZI</string>
|
||||
</resources>
|
|
@ -18,7 +18,7 @@
|
|||
<string name="share_location_as">Standort teilen als</string>
|
||||
<string name="live_now_description">Kontakte und Gruppen, die ihren Standort mit Ihnen teilen.</string>
|
||||
<string name="logout_from_osmand_telegram">Aus OsmAnd Tracker abmelden\?</string>
|
||||
<string name="shared_string_name">"Name "</string>
|
||||
<string name="shared_string_name">Name</string>
|
||||
<string name="by_distance">Nach Entfernung</string>
|
||||
<string name="by_name">Nach Namen</string>
|
||||
<string name="by_group">Nach Gruppe</string>
|
||||
|
@ -44,7 +44,7 @@
|
|||
<string name="send_my_location">Meinen Standort senden</string>
|
||||
<string name="gps_and_location">Position</string>
|
||||
<string name="open_osmand">OsmAnd öffnen</string>
|
||||
<string name="shared_string_live">"Live "</string>
|
||||
<string name="shared_string_live">Live</string>
|
||||
<string name="get_telegram_title">Registrierung in Telegram</string>
|
||||
<string name="get_telegram_account_first">Sie benötigen ein Telegram-Konto, um die Standortfreigabe nutzen zu können.</string>
|
||||
<string name="get_telegram_description_continue">Bitte installieren Sie Telegram und richten Sie ein Konto ein.</string>
|
||||
|
@ -151,9 +151,7 @@
|
|||
<string name="start_location_sharing">Standort freigeben</string>
|
||||
<string name="location_service_no_gps_available">Wählen Sie einen der Standortanbieter aus, um Ihren Standort freizugeben.</string>
|
||||
<string name="sharing_location">Standort teilen</string>
|
||||
<string name="welcome_descr">
|
||||
<b>OsmAnd Tracker</b> ermöglicht es Ihnen, Ihren Standort zu teilen und den anderer in OsmAnd zu sehen.<br/>
|
||||
<br/>Die App verwendet die API von Telegram, also benötigen Sie ein Telegram-Konto.</string>
|
||||
<string name="welcome_descr"><b>OsmAnd Tracker</b> ermöglicht es Ihnen, Ihren Standort zu teilen und den anderer in OsmAnd zu sehen.<br/> <br/>Die App verwendet die API von Telegram, also benötigen Sie ein Telegram-Konto.</string>
|
||||
<string name="enter_another_device_name">Wählen Sie einen Namen, den Sie noch nicht benutzt haben</string>
|
||||
<string name="device_added_successfully">%1$s hinzugefügt.</string>
|
||||
<string name="shared_string_add">Hinzufügen</string>
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
<string name="shared_string_back">Atzera</string>
|
||||
<string name="start_location_sharing">Partekatu kokapena</string>
|
||||
<string name="show_on_map">Erakutsi mapan</string>
|
||||
<string name="app_name">OsmAnd Online GPS Tracker</string>
|
||||
<string name="app_name">OsmAnd lineako GPS aztarnaria</string>
|
||||
<string name="phone_number_title">Telefono zenbakia</string>
|
||||
<string name="phone_number_descr">Telefono zenbakia formatu internazionalean</string>
|
||||
<string name="shared_string_password">Pasahitza</string>
|
||||
|
@ -100,7 +100,7 @@
|
|||
<string name="shared_string_distance">Distantzia</string>
|
||||
<string name="share_location">Partekatu kokapena</string>
|
||||
<string name="sharing_location">Partekatzen kokapena</string>
|
||||
<string name="process_service">OsmAnd Tracker zebitzua</string>
|
||||
<string name="process_service">OsmAnd aztarnaria zerbitzua</string>
|
||||
<string name="osmand_logo">OsmAnd logoa</string>
|
||||
<string name="install_osmand_dialog_message">OsmAnd doako edo ordainpeko bertsioa instalatu behar duzu lehenik</string>
|
||||
<string name="install_osmand">Instalatu OsmAnd</string>
|
||||
|
@ -199,15 +199,15 @@
|
|||
<string name="buffer_time_descr">Bufferraren puntuak gordetzeko gehieneko denbora</string>
|
||||
<string name="buffer_time">Bufferraren iraungitze-denbora</string>
|
||||
<string name="shared_string_suggested">Iradokita</string>
|
||||
<string name="status_widget_title">OsmAnd Tracker-en egoera</string>
|
||||
<string name="status_widget_title">OsmAnd aztarnariaren egoera</string>
|
||||
<string name="back_to_osmand">Atzera OsmAnd-era</string>
|
||||
<string name="last_response_date">Azken erantzuna: %1$s</string>
|
||||
<string name="last_update_from_telegram_duration">Telegram-en azken eguneraketa duela %1$s</string>
|
||||
<string name="last_response_duration">Azken erantzuna duela %1$s</string>
|
||||
<string name="duration_ago">duela %1$s</string>
|
||||
<string name="welcome_descr"><b>OsmAnd Tracker</b>-ri esker, kokapena partekatu dezakezu eta besteena OsmAnd-en ikus. <br/> <br/> Aplikazioak Telegram APIa erabiltzen du eta, beraz, Telegram kontua behar duzu.</string>
|
||||
<string name="welcome_descr"><b>OsmAnd aztarnaria</b>-ri esker, kokapena partekatu dezakezu eta besteena OsmAnd-en ikus. <br/> <br/> Aplikazioak Telegram APIa erabiltzen du eta, beraz, Telegram kontua behar duzu.</string>
|
||||
<string name="shared_string_authorization_descr">Sartu zure Telegram-eko telefono zenbakia nazioarteko formatuan</string>
|
||||
<string name="osmand_service_descr">OsmAnd Tracker atzeko planoan exekutatzen da pantaila itzalita dagoenean.</string>
|
||||
<string name="osmand_service_descr">OsmAnd aztarnaria atzeko planoan exekutatzen da pantaila itzalita dagoenean.</string>
|
||||
<string name="location_service_no_gps_available">Hautatu kokapen-hornitzaileetako bat zure kokapena partekatzeko.</string>
|
||||
<string name="no_location_permission">Aplikazioak ez du kokapena atzitzeko baimenik.</string>
|
||||
<string name="authentication_code_descr">"Telegramek kode bat bidali dizu OsmAnd-ek zure kontuan saioa hasteko."</string>
|
||||
|
@ -234,11 +234,11 @@
|
|||
<string name="stale_location_desc">Kontaktu bat mugitu zen azken aldia.</string>
|
||||
<string name="location_history_desc">Ezkutatu denbora jakin batean mugitu ez diren kontaktuak</string>
|
||||
<string name="osmand_connect">OsmAnd konexioa</string>
|
||||
<string name="osmand_connect_desc">Aukeratu OsmAnd Tracker-ek posizioak bistaratzeko erabiliko duen OsmAnd bertsioa.</string>
|
||||
<string name="osmand_connect_desc">Aukeratu OsmAnd aztarnariak posizioak bistaratzeko erabiliko duen OsmAnd bertsioa.</string>
|
||||
<string name="in_time">%1$s-n</string>
|
||||
<string name="logout_help_desc">Nola itzali OsmAnd Tracker Telegram-etik</string>
|
||||
<string name="disconnect_from_telegram">Nola itzali OsmAnd Tracker Telegram-etik</string>
|
||||
<string name="disconnect_from_telegram_desc">Kokapena partekatzeko sarbidea baliogabetzeko. Ireki Telegram, joan Ezarpenak → Pribatutasuna eta segurtasuna → Saioak eta amaitu OsmAnd Tracker saioa atalera.</string>
|
||||
<string name="logout_help_desc">Nola itzali OsmAnd aztarnaria Telegram-etik</string>
|
||||
<string name="disconnect_from_telegram">Nola itzali OsmAnd aztarnaria Telegram-etik</string>
|
||||
<string name="disconnect_from_telegram_desc">Kokapena partekatzeko sarbidea baliogabetzeko. Ireki Telegram, joan Ezarpenak → Pribatutasuna eta segurtasuna → Saioak eta amaitu OsmAnd aztarnariaren saioa atalera.</string>
|
||||
<string name="logout_no_internet_msg">"Konektatu Internetera Telegram saioa behar bezala amaiatzeko."</string>
|
||||
<string name="last_response">Azken erantzuna</string>
|
||||
<string name="disable_all_sharing_desc">Kokapena partekatzea itzaltzen du hautatutako txat guztietan (%1$d).</string>
|
||||
|
@ -246,8 +246,8 @@
|
|||
<string name="by_group">Taldearen arabera</string>
|
||||
<string name="by_name">Izenaren arabera</string>
|
||||
<string name="by_distance">Distantziaren arabera</string>
|
||||
<string name="logout_from_osmand_telegram">Amaitu OsmAnd Tracker saioa\?</string>
|
||||
<string name="logout_from_osmand_telegram_descr">Ziur zaude OsmAnd Tracker saioa amaitu nahi duzula\? Ezingo duzu kokapena partekatu edo besteen kokapena ikusi</string>
|
||||
<string name="logout_from_osmand_telegram">Amaitu OsmAnd aztarnariaren saioa\?</string>
|
||||
<string name="logout_from_osmand_telegram_descr">Ziur zaude OsmAnd aztarnariaren saioa amaitu nahi duzula\? Ezingo duzu kokapena partekatu edo besteen kokapena ikusi</string>
|
||||
<string name="live_now_description">Zurekin kokapena partekatzen duten kontaktuak eta taldeak.</string>
|
||||
<string name="location_sharing_status">Partekatzen:% 1 $ s</string>
|
||||
<string name="sharing_status">Partekatze egoera</string>
|
||||
|
@ -255,7 +255,7 @@
|
|||
<string name="not_found_yet">Oraindik ez da aurkitu</string>
|
||||
<string name="not_sent_yet">Oraindik ez da bidali</string>
|
||||
<string name="sharing_in_background">Atzeko planoan partekatzea</string>
|
||||
<string name="battery_optimization_description">Itzali bateriaren optimizazioa OsmAnd Trackerrentzat, bat-batean itzali ez dadin bigarren planoan dagoela.</string>
|
||||
<string name="battery_optimization_description">Itzali bateriaren optimizazioa OsmAnd aztarnariarentzat, bat-batean itzali ez dadin bigarren planoan dagoela.</string>
|
||||
<string name="background_work">Bigarren planoko lana</string>
|
||||
<string name="background_work_description">Aldatu bateriaren optimizazio ezarpenak kokapena partekatzea egonkortzeko.</string>
|
||||
<string name="waiting_for_response_from_telegram">Telegram-en erantzunaren zain</string>
|
||||
|
@ -265,6 +265,6 @@
|
|||
<string name="share_location_as_description">Hainbat gailu Telegram kontu bakarrera konektatu nahi badituzu, gailu desberdinak erabili behar dituzu kokapena partekatzeko.</string>
|
||||
<string name="share_location_as_description_second_line">Telegrama bezeroan gailuaren IDa sortu eta ikusi dezakezu %1$s txat bota erabiliz. % 2 $ s</string>
|
||||
<string name="privacy_policy_agree">\"Jarraitu\" sakatuz, Telegram eta OsmAnd pribatutasun-politiken baldintzak onartzen dituzu.</string>
|
||||
<string name="privacy_policy_telegram_client">OsmAnd tracker-ek Telegram plataforma irekia erabiltzen duten bezeroetako bat da. Zure kontaktuek Telegram-eko beste edozein bezero erabil dezakete.</string>
|
||||
<string name="privacy_policy_telegram_client">OsmAnd aztarnariak Telegram plataforma irekia erabiltzen duten bezeroetako bat da. Zure kontaktuek Telegram-eko beste edozein bezero erabil dezakete.</string>
|
||||
<string name="last_update_from_telegram_date">Telegram-eko azken eguneratzea: %1$s</string>
|
||||
</resources>
|
|
@ -90,12 +90,12 @@
|
|||
<string name="initializing">Estase a iniciar</string>
|
||||
<string name="searching_for_gps">Estase a ubicar…</string>
|
||||
<string name="connecting_to_the_internet">Estase a conectar á Internet</string>
|
||||
<string name="battery_optimization_description">Desactiva-la optimización da batería para o OsmAnd Tracker de xeito que non se desconecte de xeito súbito cando esté no segundo plano.</string>
|
||||
<string name="battery_optimization_description">Desactivar a optimización da batería para o OsmAnd Tracker de xeito que non se desconecte de xeito súbito cando estea no segundo plano.</string>
|
||||
<string name="logout_no_internet_msg">Conéctate á Internet para pecha-la sesión no Telegram de xeito correcto.</string>
|
||||
<string name="disconnect_from_telegram_desc">Para revoga-lo acceso á ubicación compartillada. Abre o Telegram, vai cara ós «Axustes → Privacidade e Seguranza → Sesións» e pecha a sesión do OsmAnd Tracker.</string>
|
||||
<string name="disconnect_from_telegram">De que xeito desactivar o rastrexador do OsmAnd (OsmAnd Tracker) dende o Telegram</string>
|
||||
<string name="logout_help_desc">De que xeito desactivar o rastrexador do OsmAnd (OsmAnd Tracker) dende o Telegram</string>
|
||||
<string name="osmand_connect_desc">Escolle a versión do OsmAnd na cal o rastrexador do OsmAnd (OsmAnd Tracker) empregará para amosa-las ubicacións.</string>
|
||||
<string name="osmand_connect_desc">Escolle a versión do OsmAnd na cal o OsmAnd Tracker empregará para amosar as posicións.</string>
|
||||
<string name="osmand_connect">Conectar ó OsmAnd</string>
|
||||
<string name="location_history_desc">Agocha-los contactos que non se moveron nun tempo determinado.</string>
|
||||
<string name="stale_location_desc">A última vez que un contacto se moveu.</string>
|
||||
|
@ -195,7 +195,7 @@
|
|||
<string name="shared_string_telegram">Telegram</string>
|
||||
<string name="privacy_policy_use_telegram">O Telegram (a aplicación de mensaxaría) emprégase para conectar e comunicar ás persoas.</string>
|
||||
<string name="privacy_policy_telegram_client">O rastrexador do OsmAnd (OsmAnd tracker) é un dos clientes que emprega a plataforma aberta do Telegram. Os teus contactos poden empregar calquera outro cliente do Telegram.</string>
|
||||
<string name="privacy_policy_agree">Ó premer en continuar, aceptas as Políticas de Privacidade do Telegram e do OsmAnd.</string>
|
||||
<string name="privacy_policy_agree">Ó premer en \"Continuar\", aceptas as condicións do Telegram e as políticas de privacidade do OsmAnd.</string>
|
||||
<string name="shared_string_accept">Aceptar</string>
|
||||
<string name="telegram_privacy_policy">Política de privacidade do Telegram</string>
|
||||
<string name="osmand_privacy_policy">Política de privacidade do OsmAnd</string>
|
||||
|
@ -216,4 +216,56 @@
|
|||
<string name="search_contacts_descr">Procura en tódolos teus grupos e contactos.</string>
|
||||
<string name="type_contact_or_group_name">Escribe o nome do contacto ou do grupo</string>
|
||||
<string name="shared_string_search">Procurar</string>
|
||||
<string name="status_widget_title">Estado do Rastrexador do OsmAnd</string>
|
||||
<string name="shared_string_suggested">Suxerido</string>
|
||||
<string name="back_to_osmand">Voltar ó OsmAnd</string>
|
||||
<string name="duration_ago">hai %1$s</string>
|
||||
<string name="last_response_duration">Última resposta: hai %1$s</string>
|
||||
<string name="last_update_from_telegram_duration">Última actualización dende o Telegram: hai %1$s</string>
|
||||
<string name="last_response_date">Última resposta: %1$s</string>
|
||||
<string name="last_update_from_telegram_date">Última actualización dende o Telegram: %1$s</string>
|
||||
<string name="shared_string_error_short">ERR</string>
|
||||
<string name="bearing">Traxectoria</string>
|
||||
<string name="altitude">Altitude</string>
|
||||
<string name="precision">Precisión</string>
|
||||
<string name="direction">Enderezo</string>
|
||||
<string name="privacy">Privacidade</string>
|
||||
<string name="proxy">Proxy</string>
|
||||
<string name="proxy_settings">Axustes do proxy</string>
|
||||
<string name="proxy_disconnected">Desconectado</string>
|
||||
<string name="proxy_connected">Conectado</string>
|
||||
<string name="proxy_type">Tipo de proxy</string>
|
||||
<string name="shared_string_enable">Activar</string>
|
||||
<string name="shared_string_connection">Conexión</string>
|
||||
<string name="proxy_server">Servidor</string>
|
||||
<string name="proxy_port">Porto</string>
|
||||
<string name="proxy_credentials">Credenciais</string>
|
||||
<string name="proxy_username">Nome de usuario</string>
|
||||
<string name="proxy_password">Contrasinal</string>
|
||||
<string name="proxy_key">Chave</string>
|
||||
<string name="gpx_settings">Axustes de GPX</string>
|
||||
<string name="min_logging_speed_descr">Filtro: sen rexistro por embaixo da velocidade escollida</string>
|
||||
<string name="min_logging_speed">Velocidade mínima de rexistro</string>
|
||||
<string name="min_logging_accuracy_descr">Filtro: sen registro a menos que se acade a precisión</string>
|
||||
<string name="min_logging_accuracy">Precisión mínima de rexistro</string>
|
||||
<string name="min_logging_distance_descr">Filtro: distancia mínima para rexistrar un novo punto</string>
|
||||
<string name="min_logging_distance">Distancia mínima de rexistro</string>
|
||||
<string name="shared_string_select">Escoller</string>
|
||||
<string name="timeline_no_data">Sen datos</string>
|
||||
<string name="timeline_no_data_descr">Non temos datos recollidos para o día escollido</string>
|
||||
<string name="start_end_date">Data de comezo — Fin</string>
|
||||
<string name="set_time_timeline_descr">Escoller a hora para a visualización</string>
|
||||
<string name="shared_string_apply">Aplicar</string>
|
||||
<string name="shared_string_start">Comezo</string>
|
||||
<string name="shared_string_end">Fin</string>
|
||||
<string name="saved_messages">Mensaxes gardadas</string>
|
||||
<string name="unit_of_speed_system">Unidade de velocidade</string>
|
||||
<string name="unit_of_speed_system_descr">Definir unidade de velocidade.</string>
|
||||
<string name="unit_of_length">Unidades de lonxitude</string>
|
||||
<string name="unit_of_length_descr">Mudar as unidades de lonxitude.</string>
|
||||
<string name="units_and_formats">Unidades e formatos</string>
|
||||
<string name="time_zone">Fuso horario</string>
|
||||
<string name="time_zone_descr">Escolle a zona horaria que desexas amosar nas mensaxes de localización.</string>
|
||||
<string name="buffer_time">Tempo de caducidade do búfer</string>
|
||||
<string name="buffer_time_descr">Tempo máximo para almacenar puntos no búfer</string>
|
||||
</resources>
|
|
@ -26,7 +26,7 @@
|
|||
<string name="searching_for_gps">Posicionando…</string>
|
||||
<string name="connecting_to_the_internet">Conectando-se à Internet</string>
|
||||
<string name="background_work_description">Altere as configurações de otimização da bateria para estabilizar o compartilhamento de local.</string>
|
||||
<string name="background_work">"Funcionamento em segundo plano "</string>
|
||||
<string name="background_work">Funcionamento em segundo plano</string>
|
||||
<string name="battery_optimization_description">Desative a otimização da bateria do OsmAnd Tracker para que ele não seja desligado repentinamente quando estiver em segundo plano.</string>
|
||||
<string name="sharing_in_background">Compartilhando em segundo plano</string>
|
||||
<string name="go_to_settings">Vá para as configurações</string>
|
||||
|
@ -72,7 +72,7 @@
|
|||
<string name="shared_string_account">Conta</string>
|
||||
<string name="in_time">no %1$s</string>
|
||||
<string name="osmand_connect_desc">Escolha a versão OsmAnd que OsmAnd Tracker usa para exibir posições.</string>
|
||||
<string name="osmand_connect">"Conectar OsmAnd "</string>
|
||||
<string name="osmand_connect">Conectar OsmAnd</string>
|
||||
<string name="location_history_desc">Ocultar contatos que não foram movidos em um determinado momento.</string>
|
||||
<string name="location_history">Histórico de localização</string>
|
||||
<string name="stale_location_desc">A última vez que um contato foi movido.</string>
|
||||
|
@ -173,9 +173,7 @@
|
|||
<string name="shared_string_hour_short">h</string>
|
||||
<string name="shared_string_minute_short">min</string>
|
||||
<string name="shared_string_second_short">seg</string>
|
||||
<string name="welcome_descr">
|
||||
<b>OsmAnd Tracker</b> permite que você compartilhe sua localização e veja a dos outros no OsmAnd.<br/>
|
||||
<br/>O aplicativo usa a API Telegram e você precisa de uma conta Telegram.</string>
|
||||
<string name="welcome_descr"><b>OsmAnd Tracker</b> permite que você compartilhe sua localização e veja a dos outros no OsmAnd.<br/> <br/>O aplicativo usa a API Telegram e você precisa de uma conta Telegram.</string>
|
||||
<string name="my_location">Minha localização</string>
|
||||
<string name="live_now">Ao vivo agora</string>
|
||||
<string name="monitoring_is_enabled">Monitoramento está ativado</string>
|
||||
|
@ -186,13 +184,13 @@
|
|||
<string name="open_in_osmand">Mostrar no OsmAnd</string>
|
||||
<string name="end_date">Data final</string>
|
||||
<string name="start_date">Data de início</string>
|
||||
<string name="timeline">"Linha do tempo "</string>
|
||||
<string name="timeline">Linha do tempo</string>
|
||||
<string name="gps_points_in_buffer">enviado (%1$d em buffer)</string>
|
||||
<string name="points_size">"%1$d pontos "</string>
|
||||
<string name="points_size">%1$d pontos</string>
|
||||
<string name="shared_string_date">Data</string>
|
||||
<string name="shared_string_collected">Coletado</string>
|
||||
<string name="gps_points">Pontos de GPS</string>
|
||||
<string name="shared_string_sent">"Enviar "</string>
|
||||
<string name="shared_string_sent">Enviar</string>
|
||||
<string name="please_update_osmand">Por favor, atualize o OsmAnd para ver os dados no mapa</string>
|
||||
<string name="shared_string_update">Atualizar</string>
|
||||
<string name="shared_string_telegram">Telegram</string>
|
||||
|
@ -201,7 +199,7 @@
|
|||
<string name="privacy_policy_agree">Ao clicar em \"Continuar\", você concorda com as condições da política de privacidade do Telegram- e OsmAnd.</string>
|
||||
<string name="shared_string_accept">Aceitar</string>
|
||||
<string name="telegram_privacy_policy">Política de privacidade do Telegram</string>
|
||||
<string name="osmand_privacy_policy">"Política de privacidade do OsmAnd "</string>
|
||||
<string name="osmand_privacy_policy">Política de privacidade do OsmAnd</string>
|
||||
<string name="how_it_works">Como funciona</string>
|
||||
<string name="received_gps_points">Pontos GPX recebidos: %1$s</string>
|
||||
<string name="shared_string_appearance">Aparência</string>
|
||||
|
|
|
@ -137,7 +137,7 @@
|
|||
<string name="last_available_location">Последнее местоположение</string>
|
||||
<string name="sharing_status">Статус отправки</string>
|
||||
<string name="location_sharing_status">Трансляция: %1$s</string>
|
||||
<string name="shared_string_enabled">Включён</string>
|
||||
<string name="shared_string_enabled">Включено</string>
|
||||
<string name="shared_string_status">Статус</string>
|
||||
<string name="no_gps_connection">Отсутствует GPS</string>
|
||||
<string name="no_internet_connection">Отсутствует интернет</string>
|
||||
|
|
|
@ -53,4 +53,5 @@
|
|||
<string name="units_and_formats">Мерне јединице & форматирања</string>
|
||||
<string name="unit_of_length_descr">Промени јединице за дужину.</string>
|
||||
<string name="unit_of_length">Јединице дужине</string>
|
||||
<string name="shared_string_appearance">Изглед</string>
|
||||
</resources>
|
|
@ -60,11 +60,11 @@
|
|||
<string name="start_end_date">Başlangıç — Bitiş tarihi</string>
|
||||
<string name="timeline_no_data_descr">Seçilen gün için toplanan veri yok</string>
|
||||
<string name="timeline_no_data">Veri yok</string>
|
||||
<string name="min_logging_distance">Minimum kayıt mesafesi</string>
|
||||
<string name="min_logging_distance_descr">Filtre: yeni bir nokta kaydetmek için minimum mesafe</string>
|
||||
<string name="min_logging_accuracy">Minimum kayıt hassasiyeti</string>
|
||||
<string name="min_logging_accuracy_descr">Filtre: hassasiyete ulaşılmadığı sürece kaydetme yok</string>
|
||||
<string name="min_logging_speed">Minimum kayıt hızı</string>
|
||||
<string name="min_logging_distance">Asgari kayıt mesafesi</string>
|
||||
<string name="min_logging_distance_descr">Filtre: yeni bir nokta kaydetmek için asgari mesafe</string>
|
||||
<string name="min_logging_accuracy">Asgari kayıt doğruluğu</string>
|
||||
<string name="min_logging_accuracy_descr">Filtre: bu doğruluğa ulaşılmadıkça kaydetme yok</string>
|
||||
<string name="min_logging_speed">Asgari kayıt hızı</string>
|
||||
<string name="min_logging_speed_descr">Filtre: seçili hızın altında kaydetme yok</string>
|
||||
<string name="gpx_settings">GPX ayarları</string>
|
||||
<string name="proxy_key">Anahtar</string>
|
||||
|
@ -81,7 +81,7 @@
|
|||
<string name="proxy">Proxy</string>
|
||||
<string name="privacy">Gizlilik</string>
|
||||
<string name="direction">Yön</string>
|
||||
<string name="precision">Hassaslık</string>
|
||||
<string name="precision">Hassasiyet</string>
|
||||
<string name="search_contacts">Kişileri ara</string>
|
||||
<string name="search_contacts_descr">Tüm gruplarınızda ve kişilerinizde arayın.</string>
|
||||
<string name="type_contact_or_group_name">Kişi veya grup adı yazın</string>
|
||||
|
@ -182,7 +182,7 @@
|
|||
<string name="location_history">Konum geçmişi</string>
|
||||
<string name="stale_location_desc">Bir kişinin en son hareket ettiği zaman.</string>
|
||||
<string name="stale_location">Hareket etmiyor</string>
|
||||
<string name="send_my_location_desc">Konum paylaşımı için minimum aralığı ayarlayın.</string>
|
||||
<string name="send_my_location_desc">Konum paylaşımı için en küçük aralığı ayarlayın.</string>
|
||||
<string name="send_my_location">Konumumu gönder</string>
|
||||
<string name="gps_and_location">Konum</string>
|
||||
<string name="sharing_time">Paylaşım zamanı</string>
|
||||
|
@ -256,7 +256,7 @@
|
|||
<string name="unit_of_length">Uzunluk birimleri</string>
|
||||
<string name="unit_of_speed_system_descr">Hız birimini tanımlayın.</string>
|
||||
<string name="unit_of_speed_system">Hız birimi</string>
|
||||
<string name="buffer_time_descr">Noktaların arabellekte saklanacağı maksimum süre</string>
|
||||
<string name="buffer_time_descr">Noktaların arabellekte saklanacağı azami süre</string>
|
||||
<string name="buffer_time">Arabellek zaman aşım süresi</string>
|
||||
<string name="shared_string_suggested">Önerilen</string>
|
||||
<string name="status_widget_title">OsmAnd Tracker durumu</string>
|
||||
|
|
|
@ -524,7 +524,7 @@ dependencies {
|
|||
implementation 'androidx.gridlayout:gridlayout:1.0.0'
|
||||
implementation 'androidx.cardview:cardview:1.0.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.1.0'
|
||||
implementation 'com.google.android.material:material:1.2.0-alpha06'
|
||||
implementation 'com.google.android.material:material:1.2.0-beta01'
|
||||
implementation 'androidx.browser:browser:1.0.0'
|
||||
implementation 'androidx.preference:preference:1.1.0'
|
||||
implementation fileTree(include: ['gnu-trove-osmand.jar', 'icu4j-49_1_patched.jar'], dir: 'libs')
|
||||
|
|
7
OsmAnd/res/anim/slide_in_right.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate android:fromXDelta="100%p" android:toXDelta="0"
|
||||
android:duration="@android:integer/config_mediumAnimTime"/>
|
||||
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
|
||||
android:duration="@android:integer/config_mediumAnimTime" />
|
||||
</set>
|
7
OsmAnd/res/anim/slide_out_right.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate android:fromXDelta="0" android:toXDelta="100%p"
|
||||
android:duration="@android:integer/config_mediumAnimTime"/>
|
||||
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
|
||||
android:duration="@android:integer/config_mediumAnimTime" />
|
||||
</set>
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 971 B After Width: | Height: | Size: 745 B |
BIN
OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
OsmAnd/res/drawable-hdpi/ic_bg_point_comment_bottom_small.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center.png
Normal file
After Width: | Height: | Size: 501 B |
BIN
OsmAnd/res/drawable-hdpi/ic_bg_point_comment_center_small.png
Normal file
After Width: | Height: | Size: 267 B |
BIN
OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
OsmAnd/res/drawable-hdpi/ic_bg_point_comment_top_small.png
Normal file
After Width: | Height: | Size: 528 B |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 939 B After Width: | Height: | Size: 638 B |
Before Width: | Height: | Size: 3 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 1,012 B |
Before Width: | Height: | Size: 724 B After Width: | Height: | Size: 504 B |
BIN
OsmAnd/res/drawable-hdpi/warnings_speed_limit_ca.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 984 B |
Before Width: | Height: | Size: 586 B After Width: | Height: | Size: 479 B |
BIN
OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
OsmAnd/res/drawable-mdpi/ic_bg_point_comment_bottom_small.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center.png
Normal file
After Width: | Height: | Size: 367 B |
BIN
OsmAnd/res/drawable-mdpi/ic_bg_point_comment_center_small.png
Normal file
After Width: | Height: | Size: 201 B |
BIN
OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top.png
Normal file
After Width: | Height: | Size: 725 B |
BIN
OsmAnd/res/drawable-mdpi/ic_bg_point_comment_top_small.png
Normal file
After Width: | Height: | Size: 303 B |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 984 B After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 685 B |
Before Width: | Height: | Size: 529 B After Width: | Height: | Size: 393 B |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 891 B After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 574 B |
Before Width: | Height: | Size: 398 B After Width: | Height: | Size: 282 B |
BIN
OsmAnd/res/drawable-mdpi/warnings_speed_limit_ca.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1 KiB |
BIN
OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_bottom_small.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center.png
Normal file
After Width: | Height: | Size: 591 B |
BIN
OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_center_small.png
Normal file
After Width: | Height: | Size: 304 B |
BIN
OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
OsmAnd/res/drawable-xhdpi/ic_bg_point_comment_top_small.png
Normal file
After Width: | Height: | Size: 582 B |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 715 B |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 955 B After Width: | Height: | Size: 500 B |
BIN
OsmAnd/res/drawable-xhdpi/warnings_speed_limit_ca.png
Normal file
After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.7 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_bottom_small.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center.png
Normal file
After Width: | Height: | Size: 835 B |
BIN
OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_center_small.png
Normal file
After Width: | Height: | Size: 400 B |
BIN
OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/ic_bg_point_comment_top_small.png
Normal file
After Width: | Height: | Size: 906 B |
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 2.6 KiB |