Merge branch 'master' into Vechicle_pref_numeric_dialog_37

# Conflicts:
#	OsmAnd/src/net/osmand/plus/settings/fragments/VehicleParametersFragment.java
This commit is contained in:
Dima-1 2020-06-16 13:51:59 +03:00
commit 533df517f6
322 changed files with 11170 additions and 4963 deletions

View file

@ -33,8 +33,9 @@ public class CollatorStringMatcher implements StringMatcher {
public CollatorStringMatcher(String part, StringMatcherMode mode) { public CollatorStringMatcher(String part, StringMatcherMode mode) {
this.collator = OsmAndCollator.primaryCollator(); this.collator = OsmAndCollator.primaryCollator();
this.part = part.toLowerCase(Locale.getDefault()); this.part = simplifyStringAndAlignChars(part);
this.mode = mode; this.mode = mode;
} }
public Collator getCollator() { public Collator getCollator() {
@ -123,14 +124,15 @@ public class CollatorStringMatcher implements StringMatcher {
* @param theStart * @param theStart
* @return true if searchIn starts with token * @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) { boolean checkBeginning, boolean checkSpaces, boolean equals) {
String searchIn = fullText.toLowerCase(Locale.getDefault()); String searchIn = simplifyStringAndAlignChars(fullTextP);
int searchInLength = searchIn.length(); int searchInLength = searchIn.length();
int startLength = theStart.length(); int startLength = theStart.length();
if (startLength == 0) { if (startLength == 0) {
return true; return true;
} }
// this is not correct because of Auhofstrasse != Auhofstraße
if (startLength > searchInLength) { if (startLength > searchInLength) {
return false; return false;
} }
@ -152,7 +154,8 @@ public class CollatorStringMatcher implements StringMatcher {
if (isSpace(searchIn.charAt(i - 1)) && !isSpace(searchIn.charAt(i))) { if (isSpace(searchIn.charAt(i - 1)) && !isSpace(searchIn.charAt(i))) {
if (collator.equals(searchIn.substring(i, i + startLength), theStart)) { if (collator.equals(searchIn.substring(i, i + startLength), theStart)) {
if(equals) { if(equals) {
if(i + startLength == searchInLength || isSpace(searchIn.charAt(i + startLength))) { if(i + startLength == searchInLength ||
isSpace(searchIn.charAt(i + startLength))) {
return true; return true;
} }
} else { } else {
@ -168,7 +171,17 @@ public class CollatorStringMatcher implements StringMatcher {
return false; 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){ private static boolean isSpace(char c){
return !Character.isLetter(c) && !Character.isDigit(c); return !Character.isLetter(c) && !Character.isDigit(c);
} }
} }

View file

@ -354,6 +354,7 @@ public class NativeLibrary {
FileInputStream fis = new FileInputStream(f); FileInputStream fis = new FileInputStream(f);
Algorithms.streamCopy(fis, ous); Algorithms.streamCopy(fis, ous);
fis.close(); fis.close();
System.out.println("FONT " + name);
initFontType(ous.toByteArray(), name.substring(0, name.length() - 4), name.toLowerCase().contains("bold"), initFontType(ous.toByteArray(), name.substring(0, name.length() - 4), name.toLowerCase().contains("bold"),
name.toLowerCase().contains("italic")); name.toLowerCase().contains("italic"));
} catch (IOException e) { } catch (IOException e) {

View file

@ -38,4 +38,5 @@ public class OsmAndCollator {
} }
}; };
} }
} }

View file

@ -1,6 +1,7 @@
package net.osmand; package net.osmand;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -19,19 +20,23 @@ public class Reshaper {
return ""; return "";
} }
} }
public static String reshape(String s) { public static String reshape(String s) {
// if(true) {
// return s;
// }
try { 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 { try {
s = as.shape(s); s = as.shape(s);
} catch (ArabicShapingException e) { } catch (ArabicShapingException e) {
LOG.error(e.getMessage(), e); LOG.error(e.getMessage(), e);
} }
//printSplit("A", s);
Bidi line = new Bidi(s.length(), s.length()); Bidi line = new Bidi(s.length(), s.length());
line.setPara(s, Bidi.LEVEL_DEFAULT_LTR, null); 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(); byte direction = line.getDirection();
if (direction != Bidi.MIXED) { if (direction != Bidi.MIXED) {
// unidirectional // unidirectional
@ -40,40 +45,42 @@ public class Reshaper {
} else { } else {
char[] chs = new char[s.length()]; char[] chs = new char[s.length()];
for(int i = 0; i< chs.length ; i++) { 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); return new String(chs);
} }
} else { } else {
// // mixed-directional // mixed-directional
// System.out.println(s);
// printSplit("Split", s);
int count = line.countRuns(); 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(); StringBuilder res = new StringBuilder();
// iterate over both directional and style runs // iterate over both directional and style runs
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
StringBuilder runs = new StringBuilder();
BidiRun run = line.getVisualRun(i); BidiRun run = line.getVisualRun(i);
boolean ltr = run.getDirection() == Bidi.LTR;
int st = run.getStart(); int start = run.getStart();
int e = run.getLimit(); int limit = run.getLimit();
int j = run.getDirection() == Bidi.LTR ? st : e - 1; int begin = ltr ? start : limit - 1;
int l = run.getDirection() == Bidi.LTR ? e : st - 1; int end = ltr ? limit : start - 1;
boolean plus = run.getDirection() == Bidi.LTR; int ind = begin;
while (j != l) { while (ind != end) {
res.append(s.charAt(j)); char ch = s.charAt(ind);
if (plus) { if (!ltr) {
j++; ch = mirror(ch);
}
res.append(ch);
runs.append(ch);
if (ltr) {
ind++;
} else { } else {
j--; ind--;
} }
} }
printSplit(run.getDirection() + " " + run.getEmbeddingLevel(), runs.toString());
} }
return res.toString(); return res.toString();
} }
@ -83,24 +90,77 @@ public class Reshaper {
} }
} }
public static void main(String[] args) { private static char mirror(char ch) {
// char[] c = new char[] {'א', 'ד','ם', ' ', '1', '2'} ; switch (ch) {
// String reshape = "אדם"; case '(': ch = ')'; break;
char[] c = new char[] {'א', 'ד','ם'} ; case ')': ch = '('; break;
String reshape = reshape(new String(c)); case '[': ch = ']'; break;
for(int i=0; i < reshape.length(); i++) { case ']': ch = '['; break;
System.out.println(reshape.charAt(i));
} }
return ch;
}
public static void main(String[] args) {
test2(); 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 s = "گچ پژ نمکی باللغة العربي";
String reshape = reshape(s); String reshape = reshape(s);
String expected1 = "ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ ﯽﮑﻤﻧ ﮋﭘ ﭻﮔ";
if (!reshape.equals("ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ ﯽﮑﻤﻧ ﮋﭘ ﭻﮔ")) { String expected2 = "ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ یکﻤﻧ ژپ چگ";
throw new IllegalArgumentException("BUG!!!"); check(s, reshape, expected1);
} }
public static void test4() {
String s = "Abc (123)";
check(s, reshape(s), s);
} }
} }

View file

@ -93,33 +93,6 @@ public class Amenity extends MapObject {
return str; 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() { public Map<String, String> getAdditionalInfo() {
if (additionalInfo == null) { if (additionalInfo == null) {

View file

@ -8,6 +8,10 @@ import net.osmand.util.TransliterationHelper;
import org.json.JSONObject; 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.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@ -18,6 +22,7 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.zip.GZIPInputStream;
public abstract class MapObject implements Comparable<MapObject> { public abstract class MapObject implements Comparable<MapObject> {
@ -55,7 +60,7 @@ public abstract class MapObject implements Comparable<MapObject> {
public String getName() { public String getName() {
if (name != null) { if (name != null) {
return name; return unzipContent(name);
} }
return ""; //$NON-NLS-1$ return ""; //$NON-NLS-1$
} }
@ -73,7 +78,7 @@ public abstract class MapObject implements Comparable<MapObject> {
if (names == null) { if (names == null) {
names = new HashMap<String, String>(); 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>(); Map<String, String> mp = new HashMap<String, String>();
if (names != null) { 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; return mp;
} }
public List<String> getAllNames() { public List<String> getAllNames() {
List<String> l = new ArrayList<String>(); List<String> l = new ArrayList<String>();
if (!Algorithms.isEmpty(enName)) { if (!Algorithms.isEmpty(enName)) {
l.add(enName); l.add(unzipContent(enName));
} }
if (names != null) { if (names != null) {
l.addAll(names.values()); for(String nm : names.values()) {
l.add(unzipContent(nm));
}
} }
return l; return l;
} }
@ -179,7 +190,7 @@ public abstract class MapObject implements Comparable<MapObject> {
if (names != null) { if (names != null) {
String nm = names.get(lang); String nm = names.get(lang);
if (!Algorithms.isEmpty(nm)) { if (!Algorithms.isEmpty(nm)) {
return nm; return unzipContent(nm);
} }
if (transliterate) { if (transliterate) {
return TransliterationHelper.transliterate(getName()); return TransliterationHelper.transliterate(getName());
@ -192,7 +203,7 @@ public abstract class MapObject implements Comparable<MapObject> {
public String getEnName(boolean transliterate) { public String getEnName(boolean transliterate) {
if (!Algorithms.isEmpty(enName)) { if (!Algorithms.isEmpty(enName)) {
return this.enName; return unzipContent(this.enName);
} else if (!Algorithms.isEmpty(getName()) && transliterate) { } else if (!Algorithms.isEmpty(getName()) && transliterate) {
return TransliterationHelper.transliterate(getName()); return TransliterationHelper.transliterate(getName());
} }
@ -322,12 +333,12 @@ public abstract class MapObject implements Comparable<MapObject> {
public JSONObject toJSON() { public JSONObject toJSON() {
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
json.put("name", name); json.put("name", unzipContent(name));
json.put("enName", enName); json.put("enName", unzipContent(enName));
if (names != null && names.size() > 0) { if (names != null && names.size() > 0) {
JSONObject namesObj = new JSONObject(); JSONObject namesObj = new JSONObject();
for (Entry<String, String> e : names.entrySet()) { for (Entry<String, String> e : names.entrySet()) {
namesObj.put(e.getKey(), e.getValue()); namesObj.put(e.getKey(), unzipContent(e.getValue()));
} }
json.put("names", namesObj); json.put("names", namesObj);
} }
@ -340,6 +351,31 @@ public abstract class MapObject implements Comparable<MapObject> {
return json; 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) { protected static void parseJSON(JSONObject json, MapObject o) {
if (json.has("name")) { if (json.has("name")) {
o.name = json.getString("name"); o.name = json.getString("name");

View file

@ -301,8 +301,11 @@ public abstract class Entity implements Serializable {
String values = getTag(OSMTagKey.IS_IN); String values = getTag(OSMTagKey.IS_IN);
if (values == null) { if (values == null) {
String city = getTag(OSMTagKey.ADDR_CITY); String city = getTag(OSMTagKey.ADDR_CITY);
String place = getTag(OSMTagKey.ADDR_PLACE);
if(!Algorithms.isEmpty(city)) { if(!Algorithms.isEmpty(city)) {
return Collections.singleton(city.trim()); return Collections.singleton(city.trim());
} else if(!Algorithms.isEmpty(place)) {
return Collections.singleton(place.trim());
} }
return Collections.emptySet(); return Collections.emptySet();
} }

View file

@ -34,9 +34,11 @@ public class OSMSettings {
// address // address
PLACE("place"), //$NON-NLS-1$ PLACE("place"), //$NON-NLS-1$
ADDR_HOUSE_NUMBER("addr:housenumber"), //$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_HOUSE_NAME("addr:housename"), //$NON-NLS-1$
ADDR_STREET("addr:street"), //$NON-NLS-1$ ADDR_STREET("addr:street"), //$NON-NLS-1$
ADDR_STREET2("addr:street2"), //$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_CITY("addr:city"), //$NON-NLS-1$
ADDR_PLACE("addr:place"), //$NON-NLS-1$ ADDR_PLACE("addr:place"), //$NON-NLS-1$
ADDR_POSTCODE("addr:postcode"), //$NON-NLS-1$ ADDR_POSTCODE("addr:postcode"), //$NON-NLS-1$

View file

@ -8,6 +8,9 @@ import java.util.Map;
public class RenderingRuleStorageProperties { public class RenderingRuleStorageProperties {
public static final String UI_CATEGORY_HIDDEN = "ui_hidden"; 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_ENGINE_V1 = "engine_v1";
public static final String A_APP_MODE= "appMode"; public static final String A_APP_MODE= "appMode";
public static final String A_BASE_APP_MODE = "baseAppMode"; public static final String A_BASE_APP_MODE = "baseAppMode";

View file

@ -11,6 +11,7 @@ import java.util.PriorityQueue;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.binary.RouteDataObject; import net.osmand.binary.RouteDataObject;
import net.osmand.data.LatLon;
import net.osmand.osm.MapRenderingTypes; import net.osmand.osm.MapRenderingTypes;
import net.osmand.util.MapUtils; import net.osmand.util.MapUtils;
@ -138,7 +139,7 @@ public class BinaryRoutePlanner {
checkIfGraphIsEmpty(ctx, ctx.getPlanRoadDirection() >= 0, graphDirectSegments, start, visitedDirectSegments, checkIfGraphIsEmpty(ctx, ctx.getPlanRoadDirection() >= 0, graphDirectSegments, start, visitedDirectSegments,
"Route is not found from selected start point."); "Route is not found from selected start point.");
if (ctx.planRouteIn2Directions()) { 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()) { // if (graphDirectSegments.size() * 2 > graphReverseSegments.size()) {
// forwardSearch = false; // forwardSearch = false;
// } else if (graphDirectSegments.size() < 2 * graphReverseSegments.size()) { // } else if (graphDirectSegments.size() < 2 * graphReverseSegments.size()) {
@ -798,10 +799,30 @@ public class BinaryRoutePlanner {
" distToEnd=" + distanceToEnd + " distToEnd=" + distanceToEnd +
" segmentPoint=" + segmentPoint + " -- ", next, true); " segmentPoint=" + segmentPoint + " -- ", next, true);
} }
if (!visitedSegments.containsKey(calculateRoutePointId(next, next.isPositive()))) { RouteSegment visIt = visitedSegments.get(calculateRoutePointId(next, next.isPositive()));
if (next.getParentRoute() == null boolean toAdd = true;
|| ctx.roadPriorityComparator(next.distanceFromStart, next.distanceToEnd, if (visIt != null) {
distFromStart, distanceToEnd) > 0) { // 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.distanceFromStart = distFromStart;
next.distanceToEnd = distanceToEnd; next.distanceToEnd = distanceToEnd;
if (TRACE_ROUTING) { if (TRACE_ROUTING) {
@ -812,27 +833,6 @@ public class BinaryRoutePlanner {
next.setParentSegmentEnd(segmentPoint); next.setParentSegmentEnd(segmentPoint);
graphSegments.add(next); 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 preciseX;
public int preciseY; public int preciseY;
public List<RouteSegmentPoint> others; public List<RouteSegmentPoint> others;
public LatLon getPreciseLatLon() {
return new LatLon(MapUtils.get31LatitudeY(preciseY), MapUtils.get31LongitudeX(preciseX));
}
} }
public static class RouteSegment { public static class RouteSegment {

View file

@ -91,7 +91,7 @@ public class RoutePlannerFrontEnd {
} }
if (road != null) { if (road != null) {
if(!transportStop) { if(!transportStop) {
float prio = ctx.getRouter().defineSpeedPriority(road.road); float prio = Math.max(ctx.getRouter().defineSpeedPriority(road.road), 0.3f);
if (prio > 0) { if (prio > 0) {
road.distSquare = (road.distSquare + GPS_POSSIBLE_ERROR * GPS_POSSIBLE_ERROR) road.distSquare = (road.distSquare + GPS_POSSIBLE_ERROR * GPS_POSSIBLE_ERROR)
/ (prio * prio); / (prio * prio);
@ -234,6 +234,7 @@ public class RoutePlannerFrontEnd {
if (intermediates != null) { if (intermediates != null) {
for (LatLon l : intermediates) { for (LatLon l : intermediates) {
if (!addSegment(l, ctx, indexNotFound++, points, false)) { if (!addSegment(l, ctx, indexNotFound++, points, false)) {
System.out.println(points.get(points.size() - 1).getRoad().toString());
return null; return null;
} }
} }
@ -242,9 +243,7 @@ public class RoutePlannerFrontEnd {
return null; return null;
} }
ctx.calculationProgress.nextIteration(); ctx.calculationProgress.nextIteration();
List<RouteSegmentResult> res = searchRoute(ctx, points, routeDirection); List<RouteSegmentResult> res = searchRouteImpl(ctx, points, routeDirection);
// make start and end more precise
makeStartEndPointsPrecise(res, start, end, intermediates);
if (res != null) { if (res != null) {
new RouteResultPreparation().printResults(ctx, start, end, res); new RouteResultPreparation().printResults(ctx, start, end, res);
} }
@ -255,33 +254,6 @@ public class RoutePlannerFrontEnd {
if (res.size() > 0) { if (res.size() > 0) {
updateResult(res.get(0), start, true); updateResult(res.get(0), start, true);
updateResult(res.get(res.size() - 1), end, false); 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 py = MapUtils.get31TileNumberY(point.getLatitude());
int pind = st ? routeSegmentResult.getStartPointIndex() : routeSegmentResult.getEndPointIndex(); int pind = st ? routeSegmentResult.getStartPointIndex() : routeSegmentResult.getEndPointIndex();
RouteDataObject r = routeSegmentResult.getObject(); RouteDataObject r = new RouteDataObject(routeSegmentResult.getObject());
routeSegmentResult.setObject(r);
QuadPoint before = null; QuadPoint before = null;
QuadPoint after = null; QuadPoint after = null;
if (pind > 0) { if (pind > 0) {
@ -364,7 +337,7 @@ public class RoutePlannerFrontEnd {
ctx.calculationProgress.segmentNotFound = indexNotFound; ctx.calculationProgress.segmentNotFound = indexNotFound;
return false; return false;
} else { } else {
log.info("Route segment found " + f.getRoad().id + " " + f.getRoad().getName()); log.info("Route segment found " + f.road);
res.add(f); res.add(f);
return true; return true;
} }
@ -383,6 +356,10 @@ public class RoutePlannerFrontEnd {
ctx.precalculatedRouteDirection = routeDirection.adopt(ctx); ctx.precalculatedRouteDirection = routeDirection.adopt(ctx);
} }
if (ctx.nativeLib != null) { if (ctx.nativeLib != null) {
ctx.startX = start.preciseX;
ctx.startY = start.preciseY;
ctx.targetX = end.preciseX;
ctx.targetY = end.preciseY;
return runNativeRouting(ctx, recalculationEnd); return runNativeRouting(ctx, recalculationEnd);
} else { } else {
refreshProgressDistance(ctx); 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 { throws IOException, InterruptedException {
if (points.size() <= 2) { if (points.size() <= 2) {
// simple case 2 points only
if (!useSmartRouteRecalculation) { if (!useSmartRouteRecalculation) {
ctx.previouslyCalculatedRoute = null; 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; ArrayList<RouteSegmentResult> firstPartRecalculatedRoute = null;
@ -516,7 +498,7 @@ public class RoutePlannerFrontEnd {
local.visitor = ctx.visitor; local.visitor = ctx.visitor;
local.calculationProgress = ctx.calculationProgress; local.calculationProgress = ctx.calculationProgress;
List<RouteSegmentResult> res = searchRouteInternalPrepare(local, points.get(i), points.get(i + 1), routeDirection); 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); results.addAll(res);
ctx.distinctLoadedTiles += local.distinctLoadedTiles; ctx.distinctLoadedTiles += local.distinctLoadedTiles;
ctx.loadedTiles += local.loadedTiles; ctx.loadedTiles += local.loadedTiles;
@ -539,27 +521,22 @@ public class RoutePlannerFrontEnd {
} }
@SuppressWarnings("static-access") private void pringGC(final RoutingContext ctx, boolean before) {
private List<RouteSegmentResult> searchRoute(final RoutingContext ctx, RouteSegmentPoint start, RouteSegmentPoint end, if (RoutingContext.SHOW_GC_SIZE && before) {
PrecalculatedRouteDirection routeDirection) throws IOException, InterruptedException { long h1 = RoutingContext.runGCUsedMemory();
if (ctx.SHOW_GC_SIZE) {
long h1 = ctx.runGCUsedMemory();
float mb = (1 << 20); float mb = (1 << 20);
log.warn("Used before routing " + h1 / mb + " actual"); log.warn("Used before routing " + h1 / mb + " actual");
} } else if (RoutingContext.SHOW_GC_SIZE && !before) {
List<RouteSegmentResult> result = searchRouteInternalPrepare(ctx, start, end, routeDirection);
if (RoutingContext.SHOW_GC_SIZE) {
int sz = ctx.global.size; int sz = ctx.global.size;
log.warn("Subregion size " + ctx.subregionTiles.size() + " " + " tiles " + ctx.indexedSubregions.size()); log.warn("Subregion size " + ctx.subregionTiles.size() + " " + " tiles " + ctx.indexedSubregions.size());
ctx.runGCUsedMemory(); RoutingContext.runGCUsedMemory();
long h1 = ctx.runGCUsedMemory(); long h1 = RoutingContext.runGCUsedMemory();
ctx.unloadAllData(); ctx.unloadAllData();
ctx.runGCUsedMemory(); RoutingContext.runGCUsedMemory();
long h2 = ctx.runGCUsedMemory(); long h2 = RoutingContext.runGCUsedMemory();
float mb = (1 << 20); float mb = (1 << 20);
log.warn("Unload context : estimated " + sz / mb + " ?= " + (h1 - h2) / mb + " actual"); log.warn("Unload context : estimated " + sz / mb + " ?= " + (h1 - h2) / mb + " actual");
} }
return result;
} }

View file

@ -1,5 +1,24 @@
package net.osmand.router; 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.PlatformUtil;
import net.osmand.binary.BinaryMapIndexReader; import net.osmand.binary.BinaryMapIndexReader;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule; import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
@ -18,26 +37,6 @@ import net.osmand.util.Algorithms;
import net.osmand.util.MapAlgorithms; import net.osmand.util.MapAlgorithms;
import net.osmand.util.MapUtils; 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 class RouteResultPreparation {
public static boolean PRINT_TO_CONSOLE_ROUTE_INFORMATION_TO_TEST = false; 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 // reverse it just to attach good direction roads
Collections.reverse(result); Collections.reverse(result);
segment = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentRoute() : finalSegment; segment = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentRoute() : finalSegment;
int parentSegmentEnd = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentSegmentEnd() : finalSegment.opposite.getSegmentStart(); int parentSegmentEnd = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentSegmentEnd() : finalSegment.opposite.getSegmentStart();
parentRoutingTime = -1; parentRoutingTime = -1;
@ -622,7 +620,7 @@ public class RouteResultPreparation {
// calculateStatistics(result); // calculateStatistics(result);
} }
private void calculateStatistics(List<RouteSegmentResult> result) { protected void calculateStatistics(List<RouteSegmentResult> result) {
InputStream is = RenderingRulesStorage.class.getResourceAsStream("default.render.xml"); InputStream is = RenderingRulesStorage.class.getResourceAsStream("default.render.xml");
final Map<String, String> renderingConstants = new LinkedHashMap<String, String>(); final Map<String, String> renderingConstants = new LinkedHashMap<String, String>();
try { try {
@ -799,13 +797,22 @@ public class RouteResultPreparation {
} }
if (dist < mergeDistance) { if (dist < mergeDistance) {
mergeTurnLanes(leftside, currentSegment, nextSegment); 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; merged = true;
} }
} }
if (!merged) { if (!merged) {
TurnType tt = currentSegment.getTurnType(); TurnType tt = currentSegment.getTurnType();
inferActiveTurnLanesFromTurn(tt, TurnType.C); inferActiveTurnLanesFromTurn(tt, tt.getValue());
} }
nextSegment = currentSegment; nextSegment = currentSegment;
dist = 0; dist = 0;
@ -983,11 +990,9 @@ public class RouteResultPreparation {
if(turnSet.size() == 1) { if(turnSet.size() == 1) {
singleTurn = turnSet.iterator().next(); singleTurn = turnSet.iterator().next();
} else if(currentTurn.goAhead() && turnSet.contains(nextTurn.getValue())) { } else if(currentTurn.goAhead() && turnSet.contains(nextTurn.getValue())) {
if(currentTurn.isPossibleLeftTurn() && if (currentTurn.isPossibleLeftTurn() && TurnType.isLeftTurn(nextTurn.getValue())) {
TurnType.isLeftTurn(nextTurn.getValue())) {
singleTurn = nextTurn.getValue(); singleTurn = nextTurn.getValue();
} else if(currentTurn.isPossibleLeftTurn() && } else if (currentTurn.isPossibleLeftTurn() && TurnType.isLeftTurn(nextTurn.getActiveCommonLaneTurn())) {
TurnType.isLeftTurn(nextTurn.getActiveCommonLaneTurn())) {
singleTurn = nextTurn.getActiveCommonLaneTurn(); singleTurn = nextTurn.getActiveCommonLaneTurn();
} else if(currentTurn.isPossibleRightTurn() && } else if(currentTurn.isPossibleRightTurn() &&
TurnType.isRightTurn(nextTurn.getValue())) { TurnType.isRightTurn(nextTurn.getValue())) {
@ -1053,7 +1058,7 @@ public class RouteResultPreparation {
// add description about turn // add description about turn
double mpi = MapUtils.degreesDiff(prev.getBearingEnd(), rr.getBearingBegin()); double mpi = MapUtils.degreesDiff(prev.getBearingEnd(), rr.getBearingBegin());
if(noAttachedRoads){ 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") // ? avoid small zigzags is covered at (search for "zigzags")
// double begin = rr.getObject().directionRoute(rr.getStartPointIndex(), rr.getStartPointIndex() < // double begin = rr.getObject().directionRoute(rr.getStartPointIndex(), rr.getStartPointIndex() <
// rr.getEndPointIndex(), 25); // rr.getEndPointIndex(), 25);
@ -1268,17 +1273,8 @@ public class RouteResultPreparation {
String[] splitLaneOptions = turnLanes.split("\\|", -1); String[] splitLaneOptions = turnLanes.split("\\|", -1);
int activeBeginIndex = findActiveIndex(rawLanes, splitLaneOptions, rs.leftLanes, true, int activeBeginIndex = findActiveIndex(rawLanes, splitLaneOptions, rs.leftLanes, true,
rs.leftLanesInfo, rs.roadsOnLeft, rs.addRoadsOnLeft); 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, int activeEndIndex = findActiveIndex(rawLanes, splitLaneOptions, rs.rightLanes, false,
rs.rightLanesInfo, rs.roadsOnRight, rs.addRoadsOnRight); 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) { if (activeBeginIndex == -1 || activeEndIndex == -1 || activeBeginIndex > activeEndIndex) {
// something went wrong // something went wrong
return createSimpleKeepLeftRightTurn(leftSide, prevSegm, currentSegm, rs); return createSimpleKeepLeftRightTurn(leftSide, prevSegm, currentSegm, rs);
@ -1291,6 +1287,12 @@ public class RouteResultPreparation {
int tp = inferSlightTurnFromLanes(rawLanes, rs); int tp = inferSlightTurnFromLanes(rawLanes, rs);
if (tp != t.getValue() && tp != 0) { if (tp != t.getValue() && tp != 0) {
t = TurnType.valueOf(tp, leftSide); 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 { } else {
for (int k = 0; k < rawLanes.length; k++) { for (int k = 0; k < rawLanes.length; k++) {
@ -1596,59 +1598,11 @@ public class RouteResultPreparation {
} }
private int inferSlightTurnFromLanes(int[] oLanes, RoadSplitStructure rs) { private int inferSlightTurnFromLanes(int[] oLanes, RoadSplitStructure rs) {
TIntHashSet possibleTurns = new TIntHashSet(); TIntHashSet possibleTurns = getPossibleTurnsFromActiveLanes(oLanes, false);
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);
if (possibleTurns.isEmpty()) { if (possibleTurns.isEmpty()) {
// No common turns, so can't determine anything. // No common turns, so can't determine anything.
return 0; 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; int infer = 0;
if (possibleTurns.size() == 1) { if (possibleTurns.size() == 1) {
infer = possibleTurns.iterator().next(); infer = possibleTurns.iterator().next();
@ -1687,6 +1641,53 @@ public class RouteResultPreparation {
return infer; 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){ private boolean isMotorway(RouteSegmentResult s){
String h = s.getObject().getHighway(); String h = s.getObject().getHighway();
return "motorway".equals(h) || "motorway_link".equals(h) || return "motorway".equals(h) || "motorway_link".equals(h) ||
@ -1740,7 +1741,7 @@ public class RouteResultPreparation {
public void remove() { 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); RouteSegment rt = ctx.loadRouteSegment(road.getPoint31XTile(pointInd), road.getPoint31YTile(pointInd), ctx.config.memoryLimitation);
it = rt == null ? null : rt.getIterator(); it = rt == null ? null : rt.getIterator();
} else { } else {

View file

@ -21,7 +21,9 @@ import gnu.trove.map.hash.TIntObjectHashMap;
public class RouteSegmentResult implements StringExternalizable<RouteDataBundle> { 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 startPointIndex;
private int endPointIndex; private int endPointIndex;
private List<RouteSegmentResult>[] attachedRoutes; private List<RouteSegmentResult>[] attachedRoutes;
@ -444,11 +446,11 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
} }
public float getBearingBegin() { 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) { 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) { public float getDistance(int point, boolean plus) {
@ -456,7 +458,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
} }
public float getBearingEnd() { 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) { public void setSegmentTime(float segmentTime) {
@ -534,9 +536,15 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
this.description = description; this.description = description;
} }
public void setObject(RouteDataObject r) {
this.object = r;
}
@Override @Override
public String toString() { public String toString() {
return object.toString() + ": " + startPointIndex + "-" + endPointIndex; return object.toString() + ": " + startPointIndex + "-" + endPointIndex;
} }
} }

View file

@ -36,7 +36,7 @@ import net.osmand.router.RoutePlannerFrontEnd.RouteCalculationMode;
public class RoutingContext { 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); private final static Log log = PlatformUtil.getLog(RoutingContext.class);
@ -467,15 +467,14 @@ public class RoutingContext {
long h2 = runGCUsedMemory(); long h2 = runGCUsedMemory();
float mb = (1 << 20); float mb = (1 << 20);
log.warn("Unload tiles : estimated " + (sz1 - sz2) / mb + " ?= " + (h1 - h2) / mb + " actual"); log.warn("Unload tiles : estimated " + (sz1 - sz2) / mb + " ?= " + (h1 - h2) / mb + " actual");
log.warn("Used after " + h2 / mb + " of " + Runtime.getRuntime().totalMemory() / mb + " max " log.warn("Used after " + h2 / mb + " of " + Runtime.getRuntime().totalMemory() / mb );
+ maxMemory() / mb);
} else { } else {
float mb = (1 << 20); float mb = (1 << 20);
int sz2 = getCurrentEstimatedSize(); int sz2 = getCurrentEstimatedSize();
log.warn("Unload tiles : occupied before " + sz1 / mb + " Mb - now " + sz2 / mb + "MB " log.warn("Unload tiles : occupied before " + sz1 / mb + " Mb - now " + sz2 / mb + "MB "
+ memoryLimit / mb + " limit MB " + config.memoryLimitation / mb); + memoryLimit / mb + " limit MB " + config.memoryLimitation / mb);
long us2 = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()); 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)) { if (!indexedSubregions.containsKey(tileId)) {
@ -507,12 +506,6 @@ public class RoutingContext {
return tileId; return tileId;
} }
private long maxMemory() {
// AVIAN FIXME
// return Runtime.getRuntime().maxMemory();
return 0;
}
public boolean checkIfMemoryLimitCritical(long memoryLimit) { public boolean checkIfMemoryLimitCritical(long memoryLimit) {

View file

@ -23,7 +23,7 @@ import net.osmand.osm.edit.Way;
import net.osmand.util.MapUtils; import net.osmand.util.MapUtils;
public class TransportStopsRouteReader { 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>(); TLongObjectHashMap<TransportRoute> combinedRoutesCache = new TLongObjectHashMap<TransportRoute>();
Map<BinaryMapIndexReader, TIntObjectHashMap<TransportRoute>> routesFilesCache = new LinkedHashMap<BinaryMapIndexReader, Map<BinaryMapIndexReader, TIntObjectHashMap<TransportRoute>> routesFilesCache = new LinkedHashMap<BinaryMapIndexReader,
TIntObjectHashMap<TransportRoute>>(); TIntObjectHashMap<TransportRoute>>();

View file

@ -414,7 +414,8 @@ public class SearchCoreFactory {
if (object.getName().startsWith("<")) { if (object.getName().startsWith("<")) {
return false; return false;
} }
if (!phrase.getFirstUnknownNameStringMatcher().matches(stripBraces(sr.localeName))) {
if (!phrase.getUnknownWordToSearchBuildingNameMatcher().matches(stripBraces(sr.localeName))) {
sr.priorityDistance = 5; sr.priorityDistance = 5;
} }
sr.objectType = ObjectType.STREET; sr.objectType = ObjectType.STREET;

View 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();
}
}

View file

@ -38,15 +38,13 @@ public class RouteResultPreparationTest {
private static RoutePlannerFrontEnd fe; private static RoutePlannerFrontEnd fe;
private static RoutingContext ctx; private static RoutingContext ctx;
private String testName;
private LatLon startPoint; private LatLon startPoint;
private LatLon endPoint; private LatLon endPoint;
private Map<Long, String> expectedResults; 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) { public RouteResultPreparationTest(String testName, LatLon startPoint, LatLon endPoint, Map<Long, String> expectedResults) {
this.testName = testName;
this.startPoint = startPoint; this.startPoint = startPoint;
this.endPoint = endPoint; this.endPoint = endPoint;
this.expectedResults = expectedResults; this.expectedResults = expectedResults;

View file

@ -30,7 +30,7 @@
<string name="not_found_yet">Яшчэ не знойдзена</string> <string name="not_found_yet">Яшчэ не знойдзена</string>
<string name="re_send_location">Пераадправіць звесткі аб месцазнаходжанні</string> <string name="re_send_location">Пераадправіць звесткі аб месцазнаходжанні</string>
<string name="last_available_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="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="shared_string_status">Статус</string>
@ -75,7 +75,7 @@
<string name="send_my_location_desc">Вызначыць мінімальны інтэрвал для абмену інфармацыяй аб месцазнаходжанні.</string> <string name="send_my_location_desc">Вызначыць мінімальны інтэрвал для абмену інфармацыяй аб месцазнаходжанні.</string>
<string name="send_my_location">Адправіць маё месцазнаходжанне</string> <string name="send_my_location">Адправіць маё месцазнаходжанне</string>
<string name="gps_and_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="expire_at">Сыходзіць</string>
<string name="stop_sharing_all">Абмен уключаны (выключыць)</string> <string name="stop_sharing_all">Абмен уключаны (выключыць)</string>
<string name="turn_off_location_sharing">Выключыць абмен</string> <string name="turn_off_location_sharing">Выключыць абмен</string>
@ -168,9 +168,7 @@
<string name="shared_string_hour_short">г</string> <string name="shared_string_hour_short">г</string>
<string name="shared_string_minute_short">хвіл</string> <string name="shared_string_minute_short">хвіл</string>
<string name="shared_string_second_short">сек</string> <string name="shared_string_second_short">сек</string>
<string name="welcome_descr"> <string name="welcome_descr"><b>Назіральнік OsmAnd</b> Дае магчымасць дзяліцца сваім месцазнаходжаннем і бачыць месцазнаходжанне іншых у OsmAnd.<br/> <br/> Дадатак выкарыстоўвае Telegram API, таму вам неабходны акаўнт Тэлеграм.</string>
<b>Назіральнік OsmAnd</b> Дае магчымасць дзяліцца сваім месцазнаходжаннем і бачыць месцазнаходжанне іншых у OsmAnd.<br/>
<br/> Дадатак выкарыстоўвае Telegram API, таму вам неабходны акаўнт Тэлеграм.</string>
<string name="my_location">Маё месцазнаходжанне</string> <string name="my_location">Маё месцазнаходжанне</string>
<string name="live_now">Зараз дзейнічае</string> <string name="live_now">Зараз дзейнічае</string>
<string name="send_location_as">Адправіць месцазнаходжанне як</string> <string name="send_location_as">Адправіць месцазнаходжанне як</string>
@ -246,10 +244,10 @@
<string name="timeline_no_data_descr">Даныя для абранага дня адсутнічаюць</string> <string name="timeline_no_data_descr">Даныя для абранага дня адсутнічаюць</string>
<string name="timeline_no_data">Няма даных</string> <string name="timeline_no_data">Няма даных</string>
<string name="shared_string_end">Канец</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="shared_string_apply">Ужыць</string>
<string name="set_time_timeline_descr">Абраць час для паказу</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="saved_messages">Захаваныя паведамленні</string>
<string name="time_zone_descr">Абярыце часавы пояс, каб паказваць ваш час у паведамленнях.</string> <string name="time_zone_descr">Абярыце часавы пояс, каб паказваць ваш час у паведамленнях.</string>
<string name="time_zone">Часавы пояс</string> <string name="time_zone">Часавы пояс</string>

View 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>

View file

@ -18,7 +18,7 @@
<string name="share_location_as">Standort teilen als</string> <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="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="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_distance">Nach Entfernung</string>
<string name="by_name">Nach Namen</string> <string name="by_name">Nach Namen</string>
<string name="by_group">Nach Gruppe</string> <string name="by_group">Nach Gruppe</string>
@ -44,7 +44,7 @@
<string name="send_my_location">Meinen Standort senden</string> <string name="send_my_location">Meinen Standort senden</string>
<string name="gps_and_location">Position</string> <string name="gps_and_location">Position</string>
<string name="open_osmand">OsmAnd öffnen</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_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_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> <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="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="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="sharing_location">Standort teilen</string>
<string name="welcome_descr"> <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>
<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="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="device_added_successfully">%1$s hinzugefügt.</string>
<string name="shared_string_add">Hinzufügen</string> <string name="shared_string_add">Hinzufügen</string>

View file

@ -77,7 +77,7 @@
<string name="shared_string_back">Atzera</string> <string name="shared_string_back">Atzera</string>
<string name="start_location_sharing">Partekatu kokapena</string> <string name="start_location_sharing">Partekatu kokapena</string>
<string name="show_on_map">Erakutsi mapan</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_title">Telefono zenbakia</string>
<string name="phone_number_descr">Telefono zenbakia formatu internazionalean</string> <string name="phone_number_descr">Telefono zenbakia formatu internazionalean</string>
<string name="shared_string_password">Pasahitza</string> <string name="shared_string_password">Pasahitza</string>
@ -100,7 +100,7 @@
<string name="shared_string_distance">Distantzia</string> <string name="shared_string_distance">Distantzia</string>
<string name="share_location">Partekatu kokapena</string> <string name="share_location">Partekatu kokapena</string>
<string name="sharing_location">Partekatzen 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="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_dialog_message">OsmAnd doako edo ordainpeko bertsioa instalatu behar duzu lehenik</string>
<string name="install_osmand">Instalatu OsmAnd</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_descr">Bufferraren puntuak gordetzeko gehieneko denbora</string>
<string name="buffer_time">Bufferraren iraungitze-denbora</string> <string name="buffer_time">Bufferraren iraungitze-denbora</string>
<string name="shared_string_suggested">Iradokita</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="back_to_osmand">Atzera OsmAnd-era</string>
<string name="last_response_date">Azken erantzuna: %1$s</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_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="last_response_duration">Azken erantzuna duela %1$s</string>
<string name="duration_ago">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="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="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="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> <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="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="location_history_desc">Ezkutatu denbora jakin batean mugitu ez diren kontaktuak</string>
<string name="osmand_connect">OsmAnd konexioa</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="in_time">%1$s-n</string>
<string name="logout_help_desc">Nola itzali OsmAnd Tracker Telegram-etik</string> <string name="logout_help_desc">Nola itzali OsmAnd aztarnaria Telegram-etik</string>
<string name="disconnect_from_telegram">Nola itzali OsmAnd Tracker 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 Tracker saioa atalera.</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="logout_no_internet_msg">"Konektatu Internetera Telegram saioa behar bezala amaiatzeko."</string>
<string name="last_response">Azken erantzuna</string> <string name="last_response">Azken erantzuna</string>
<string name="disable_all_sharing_desc">Kokapena partekatzea itzaltzen du hautatutako txat guztietan (%1$d).</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_group">Taldearen arabera</string>
<string name="by_name">Izenaren arabera</string> <string name="by_name">Izenaren arabera</string>
<string name="by_distance">Distantziaren 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">Amaitu OsmAnd aztarnariaren 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_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="live_now_description">Zurekin kokapena partekatzen duten kontaktuak eta taldeak.</string>
<string name="location_sharing_status">Partekatzen:% 1 $ s</string> <string name="location_sharing_status">Partekatzen:% 1 $ s</string>
<string name="sharing_status">Partekatze egoera</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_found_yet">Oraindik ez da aurkitu</string>
<string name="not_sent_yet">Oraindik ez da bidali</string> <string name="not_sent_yet">Oraindik ez da bidali</string>
<string name="sharing_in_background">Atzeko planoan partekatzea</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">Bigarren planoko lana</string>
<string name="background_work_description">Aldatu bateriaren optimizazio ezarpenak kokapena partekatzea egonkortzeko.</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> <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">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="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_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> <string name="last_update_from_telegram_date">Telegram-eko azken eguneratzea: %1$s</string>
</resources> </resources>

View file

@ -90,12 +90,12 @@
<string name="initializing">Estase a iniciar</string> <string name="initializing">Estase a iniciar</string>
<string name="searching_for_gps">Estase a ubicar…</string> <string name="searching_for_gps">Estase a ubicar…</string>
<string name="connecting_to_the_internet">Estase a conectar á Internet</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="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_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="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="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="osmand_connect">Conectar ó OsmAnd</string>
<string name="location_history_desc">Agocha-los contactos que non se moveron nun tempo determinado.</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> <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="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_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_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="shared_string_accept">Aceptar</string>
<string name="telegram_privacy_policy">Política de privacidade do Telegram</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>
@ -216,4 +216,56 @@
<string name="search_contacts_descr">Procura en tódolos teus grupos e contactos.</string> <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="type_contact_or_group_name">Escribe o nome do contacto ou do grupo</string>
<string name="shared_string_search">Procurar</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> </resources>

View file

@ -26,7 +26,7 @@
<string name="searching_for_gps">Posicionando…</string> <string name="searching_for_gps">Posicionando…</string>
<string name="connecting_to_the_internet">Conectando-se à Internet</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_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="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="sharing_in_background">Compartilhando em segundo plano</string>
<string name="go_to_settings">Vá para as configurações</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="shared_string_account">Conta</string>
<string name="in_time">no %1$s</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_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_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="location_history">Histórico de localização</string>
<string name="stale_location_desc">A última vez que um contato foi movido.</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_hour_short">h</string>
<string name="shared_string_minute_short">min</string> <string name="shared_string_minute_short">min</string>
<string name="shared_string_second_short">seg</string> <string name="shared_string_second_short">seg</string>
<string name="welcome_descr"> <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>
<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="my_location">Minha localização</string>
<string name="live_now">Ao vivo agora</string> <string name="live_now">Ao vivo agora</string>
<string name="monitoring_is_enabled">Monitoramento está ativado</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="open_in_osmand">Mostrar no OsmAnd</string>
<string name="end_date">Data final</string> <string name="end_date">Data final</string>
<string name="start_date">Data de início</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="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_date">Data</string>
<string name="shared_string_collected">Coletado</string> <string name="shared_string_collected">Coletado</string>
<string name="gps_points">Pontos de GPS</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="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_update">Atualizar</string>
<string name="shared_string_telegram">Telegram</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="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="shared_string_accept">Aceitar</string>
<string name="telegram_privacy_policy">Política de privacidade do Telegram</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="how_it_works">Como funciona</string>
<string name="received_gps_points">Pontos GPX recebidos: %1$s</string> <string name="received_gps_points">Pontos GPX recebidos: %1$s</string>
<string name="shared_string_appearance">Aparência</string> <string name="shared_string_appearance">Aparência</string>

View file

@ -137,7 +137,7 @@
<string name="last_available_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="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="shared_string_status">Статус</string>
<string name="no_gps_connection">Отсутствует GPS</string> <string name="no_gps_connection">Отсутствует GPS</string>
<string name="no_internet_connection">Отсутствует интернет</string> <string name="no_internet_connection">Отсутствует интернет</string>

View file

@ -53,4 +53,5 @@
<string name="units_and_formats">Мерне јединице &amp; форматирања</string> <string name="units_and_formats">Мерне јединице &amp; форматирања</string>
<string name="unit_of_length_descr">Промени јединице за дужину.</string> <string name="unit_of_length_descr">Промени јединице за дужину.</string>
<string name="unit_of_length">Јединице дужине</string> <string name="unit_of_length">Јединице дужине</string>
<string name="shared_string_appearance">Изглед</string>
</resources> </resources>

View file

@ -60,11 +60,11 @@
<string name="start_end_date">Başlangıç — Bitiş tarihi</string> <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_descr">Seçilen gün için toplanan veri yok</string>
<string name="timeline_no_data">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">Asgari kayıt mesafesi</string>
<string name="min_logging_distance_descr">Filtre: yeni bir nokta kaydetmek için minimum mesafe</string> <string name="min_logging_distance_descr">Filtre: yeni bir nokta kaydetmek için asgari mesafe</string>
<string name="min_logging_accuracy">Minimum kayıt hassasiyeti</string> <string name="min_logging_accuracy">Asgari kayıt doğruluğu</string>
<string name="min_logging_accuracy_descr">Filtre: hassasiyete ulaşılmadığı sürece kaydetme yok</string> <string name="min_logging_accuracy_descr">Filtre: bu doğruluğa ulaşılmadıkça kaydetme yok</string>
<string name="min_logging_speed">Minimum kayıt hızı</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="min_logging_speed_descr">Filtre: seçili hızın altında kaydetme yok</string>
<string name="gpx_settings">GPX ayarları</string> <string name="gpx_settings">GPX ayarları</string>
<string name="proxy_key">Anahtar</string> <string name="proxy_key">Anahtar</string>
@ -81,7 +81,7 @@
<string name="proxy">Proxy</string> <string name="proxy">Proxy</string>
<string name="privacy">Gizlilik</string> <string name="privacy">Gizlilik</string>
<string name="direction">Yön</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">Kişileri ara</string>
<string name="search_contacts_descr">Tüm gruplarınızda ve kişilerinizde arayın.</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> <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="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_desc">Bir kişinin en son hareket ettiği zaman.</string>
<string name="stale_location">Hareket etmiyor</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="send_my_location">Konumumu gönder</string>
<string name="gps_and_location">Konum</string> <string name="gps_and_location">Konum</string>
<string name="sharing_time">Paylaşım zamanı</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_length">Uzunluk birimleri</string>
<string name="unit_of_speed_system_descr">Hız birimini tanımlayın.</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="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="buffer_time">Arabellek zaman aşım süresi</string>
<string name="shared_string_suggested">Önerilen</string> <string name="shared_string_suggested">Önerilen</string>
<string name="status_widget_title">OsmAnd Tracker durumu</string> <string name="status_widget_title">OsmAnd Tracker durumu</string>

View file

@ -524,7 +524,7 @@ dependencies {
implementation 'androidx.gridlayout:gridlayout:1.0.0' implementation 'androidx.gridlayout:gridlayout:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.appcompat:appcompat:1.1.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.browser:browser:1.0.0'
implementation 'androidx.preference:preference:1.1.0' implementation 'androidx.preference:preference:1.1.0'
implementation fileTree(include: ['gnu-trove-osmand.jar', 'icu4j-49_1_patched.jar'], dir: 'libs') implementation fileTree(include: ['gnu-trove-osmand.jar', 'icu4j-49_1_patched.jar'], dir: 'libs')

View 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>

View 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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 971 B

After

Width:  |  Height:  |  Size: 745 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 939 B

After

Width:  |  Height:  |  Size: 638 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 1,012 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 724 B

After

Width:  |  Height:  |  Size: 504 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 984 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

After

Width:  |  Height:  |  Size: 479 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 725 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 984 B

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 685 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 529 B

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 891 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 574 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 B

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 955 B

After

Width:  |  Height:  |  Size: 500 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 906 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

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