Merge branch 'master' into FIx_8032_Customize_fav_icons_tmp

This commit is contained in:
max-klaus 2020-03-25 20:59:00 +03:00 committed by GitHub
commit 67a9205157
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
324 changed files with 9096 additions and 3419 deletions

View file

@ -44,7 +44,7 @@ public interface OsmAndCustomizationConstants {
String OVERLAY_MAP = SHOW_ITEMS_ID_SCHEME + "overlay_map"; String OVERLAY_MAP = SHOW_ITEMS_ID_SCHEME + "overlay_map";
String UNDERLAY_MAP = SHOW_ITEMS_ID_SCHEME + "underlay_map"; String UNDERLAY_MAP = SHOW_ITEMS_ID_SCHEME + "underlay_map";
String CONTOUR_LINES = SHOW_ITEMS_ID_SCHEME + "contour_lines"; String CONTOUR_LINES = SHOW_ITEMS_ID_SCHEME + "contour_lines";
String HILLSHADE_LAYER = SHOW_ITEMS_ID_SCHEME + "hillshade_layer"; String TERRAIN = SHOW_ITEMS_ID_SCHEME + "terrain";
String MAP_RENDERING_CATEGORY_ID = RENDERING_ITEMS_ID_SCHEME + "category"; String MAP_RENDERING_CATEGORY_ID = RENDERING_ITEMS_ID_SCHEME + "category";
String MAP_STYLE_ID = RENDERING_ITEMS_ID_SCHEME + "map_style"; String MAP_STYLE_ID = RENDERING_ITEMS_ID_SCHEME + "map_style";

View file

@ -12,6 +12,7 @@ import org.xmlpull.v1.XmlSerializer;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -96,8 +97,17 @@ public class GPXUtilities {
} }
} }
public interface GPXExtensionsWriter {
public void writeExtensions(XmlSerializer serializer);
}
public interface GPXExtensionsReader {
public boolean readExtensions(GPXFile res, XmlPullParser parser) throws Exception;
}
public static class GPXExtensions { public static class GPXExtensions {
Map<String, String> extensions = null; Map<String, String> extensions = null;
GPXExtensionsWriter extensionsWriter = null;
public Map<String, String> getExtensionsToRead() { public Map<String, String> getExtensionsToRead() {
if (extensions == null) { if (extensions == null) {
@ -106,6 +116,14 @@ public class GPXUtilities {
return extensions; return extensions;
} }
public GPXExtensionsWriter getExtensionsWriter() {
return extensionsWriter;
}
public void setExtensionsWriter(GPXExtensionsWriter extensionsWriter) {
this.extensionsWriter = extensionsWriter;
}
public int getColor(int defColor) { public int getColor(int defColor) {
String clrValue = null; String clrValue = null;
if (extensions != null) { if (extensions != null) {
@ -1637,10 +1655,17 @@ public class GPXUtilities {
} }
private static void writeExtensions(XmlSerializer serializer, GPXExtensions p) throws IOException { private static void writeExtensions(XmlSerializer serializer, GPXExtensions p) throws IOException {
if (!p.getExtensionsToRead().isEmpty()) { Map<String, String> extensionsToRead = p.getExtensionsToRead();
GPXExtensionsWriter extensionsWriter = p.getExtensionsWriter();
if (!extensionsToRead.isEmpty() || extensionsWriter != null) {
serializer.startTag(null, "extensions"); serializer.startTag(null, "extensions");
for (Entry<String, String> s : p.getExtensionsToRead().entrySet()) { if (!extensionsToRead.isEmpty()) {
writeNotNullText(serializer, s.getKey(), s.getValue()); for (Entry<String, String> s : extensionsToRead.entrySet()) {
writeNotNullText(serializer, s.getKey(), s.getValue());
}
}
if (extensionsWriter != null) {
extensionsWriter.writeExtensions(serializer);
} }
serializer.endTag(null, "extensions"); serializer.endTag(null, "extensions");
} }
@ -1816,7 +1841,23 @@ public class GPXUtilities {
} }
public static GPXFile loadGPXFile(InputStream f) { public static GPXFile loadGPXFile(InputStream f) {
GPXFile res = new GPXFile(null); return loadGPXFile(f, null, null);
}
public static GPXFile loadGPXFile(InputStream f, GPXFile gpxFile, GPXExtensionsReader extensionsReader) {
boolean readExtensionsOnly = false;
if (gpxFile == null) {
gpxFile = new GPXFile(null);
} else {
if (f == null) {
try {
f = new FileInputStream(new File(gpxFile.path));
} catch (FileNotFoundException e) {
return gpxFile;
}
}
readExtensionsOnly = extensionsReader != null;
}
SimpleDateFormat format = new SimpleDateFormat(GPX_TIME_FORMAT, Locale.US); SimpleDateFormat format = new SimpleDateFormat(GPX_TIME_FORMAT, Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC")); format.setTimeZone(TimeZone.getTimeZone("UTC"));
SimpleDateFormat formatMillis = new SimpleDateFormat(GPX_TIME_FORMAT_MILLIS, Locale.US); SimpleDateFormat formatMillis = new SimpleDateFormat(GPX_TIME_FORMAT_MILLIS, Locale.US);
@ -1830,38 +1871,45 @@ public class GPXUtilities {
Stack<GPXExtensions> parserState = new Stack<>(); Stack<GPXExtensions> parserState = new Stack<>();
boolean extensionReadMode = false; boolean extensionReadMode = false;
boolean routePointExtension = false; boolean routePointExtension = false;
parserState.push(res); parserState.push(gpxFile);
int tok; int tok;
while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) { while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) {
if (tok == XmlPullParser.START_TAG) { if (tok == XmlPullParser.START_TAG) {
GPXExtensions parse = parserState.peek(); GPXExtensions parse = parserState.peek();
String tag = parser.getName(); String tag = parser.getName();
if (extensionReadMode && parse != null && !routePointExtension) { if (extensionReadMode && parse != null && !routePointExtension) {
switch (tag.toLowerCase()) { String tagName = tag.toLowerCase();
case "routepointextension": boolean extensionsRead = false;
routePointExtension = true; if (extensionsReader != null) {
if (parse instanceof WptPt) { extensionsRead = extensionsReader.readExtensions(gpxFile, parser);
parse.getExtensionsToWrite().put("offset", routeTrackSegment.points.size() + ""); }
} if (!readExtensionsOnly && !extensionsRead) {
break; switch (tagName) {
case "routepointextension":
routePointExtension = true;
if (parse instanceof WptPt) {
parse.getExtensionsToWrite().put("offset", routeTrackSegment.points.size() + "");
}
break;
default: default:
Map<String, String> values = readTextMap(parser, tag); Map<String, String> values = readTextMap(parser, tag);
if (values.size() > 0) { if (values.size() > 0) {
for (Entry<String, String> entry : values.entrySet()) { for (Entry<String, String> entry : values.entrySet()) {
String t = entry.getKey().toLowerCase(); String t = entry.getKey().toLowerCase();
String value = entry.getValue(); String value = entry.getValue();
parse.getExtensionsToWrite().put(t, value); parse.getExtensionsToWrite().put(t, value);
if (tag.equals("speed") && parse instanceof WptPt) { if (tag.equals("speed") && parse instanceof WptPt) {
try { try {
((WptPt) parse).speed = Float.parseFloat(value); ((WptPt) parse).speed = Float.parseFloat(value);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
log.debug(e.getMessage(), e); log.debug(e.getMessage(), e);
}
} }
} }
} }
} break;
break; }
} }
} else if (parse != null && tag.equals("extensions")) { } else if (parse != null && tag.equals("extensions")) {
extensionReadMode = true; extensionReadMode = true;
@ -1871,7 +1919,7 @@ public class GPXUtilities {
routeTrackSegment.points.add(wptPt); routeTrackSegment.points.add(wptPt);
parserState.push(wptPt); parserState.push(wptPt);
} }
} else { } else if (!readExtensionsOnly) {
if (parse instanceof GPXFile) { if (parse instanceof GPXFile) {
if (tag.equals("gpx")) { if (tag.equals("gpx")) {
((GPXFile) parse).author = parser.getAttributeValue("", "creator"); ((GPXFile) parse).author = parser.getAttributeValue("", "creator");
@ -2058,6 +2106,9 @@ public class GPXUtilities {
if (parse != null && tag.equals("extensions")) { if (parse != null && tag.equals("extensions")) {
extensionReadMode = false; extensionReadMode = false;
} }
if (readExtensionsOnly) {
continue;
}
if (tag.equals("metadata")) { if (tag.equals("metadata")) {
Object pop = parserState.pop(); Object pop = parserState.pop();
@ -2099,13 +2150,13 @@ public class GPXUtilities {
} }
} }
if (!routeTrackSegment.points.isEmpty()) { if (!routeTrackSegment.points.isEmpty()) {
res.tracks.add(routeTrack); gpxFile.tracks.add(routeTrack);
} }
} catch (Exception e) { } catch (Exception e) {
res.error = e; gpxFile.error = e;
log.error("Error reading gpx", e); //$NON-NLS-1$ log.error("Error reading gpx", e); //$NON-NLS-1$
} }
return res; return gpxFile;
} }
private static Reader getUTF8Reader(InputStream f) throws IOException { private static Reader getUTF8Reader(InputStream f) throws IOException {

View file

@ -109,7 +109,7 @@ public class BinaryMapDataObject {
} }
public boolean containsAdditionalType(int cachedType) { public boolean containsAdditionalType(int cachedType) {
if (cachedType != -1) { if (cachedType != -1 && additionalTypes != null) {
for (int i = 0; i < additionalTypes.length; i++) { for (int i = 0; i < additionalTypes.length; i++) {
if (additionalTypes[i] == cachedType) { if (additionalTypes[i] == cachedType) {
return true; return true;

View file

@ -1,19 +1,8 @@
package net.osmand.binary; package net.osmand.binary;
import gnu.trove.iterator.TLongObjectIterator; import com.google.protobuf.CodedInputStream;
import gnu.trove.list.array.TIntArrayList; import com.google.protobuf.InvalidProtocolBufferException;
import gnu.trove.list.array.TLongArrayList; import com.google.protobuf.WireFormat;
import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.map.hash.TLongObjectHashMap;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.ResultMatcher; import net.osmand.ResultMatcher;
@ -25,27 +14,51 @@ import net.osmand.binary.OsmandOdb.OsmAndRoutingIndex.RouteEncodingRule;
import net.osmand.binary.OsmandOdb.RestrictionData; import net.osmand.binary.OsmandOdb.RestrictionData;
import net.osmand.binary.OsmandOdb.RouteData; import net.osmand.binary.OsmandOdb.RouteData;
import net.osmand.binary.RouteDataObject.RestrictionInfo; import net.osmand.binary.RouteDataObject.RestrictionInfo;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils; import net.osmand.util.MapUtils;
import net.osmand.util.OpeningHoursParser; import net.osmand.util.OpeningHoursParser;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import com.google.protobuf.CodedInputStream; import java.io.IOException;
import com.google.protobuf.InvalidProtocolBufferException; import java.util.ArrayList;
import com.google.protobuf.WireFormat; import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import gnu.trove.iterator.TLongObjectIterator;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.list.array.TLongArrayList;
import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.map.hash.TLongObjectHashMap;
public class BinaryMapRouteReaderAdapter { public class BinaryMapRouteReaderAdapter {
protected static final Log LOG = PlatformUtil.getLog(BinaryMapRouteReaderAdapter.class); protected static final Log LOG = PlatformUtil.getLog(BinaryMapRouteReaderAdapter.class);
private static final int SHIFT_COORDINATES = 4; private static final int SHIFT_COORDINATES = 4;
private static class RouteTypeCondition { private static class RouteTypeCondition implements StringExternalizable<RouteDataBundle> {
String condition = ""; String condition = "";
OpeningHoursParser.OpeningHours hours = null; OpeningHoursParser.OpeningHours hours = null;
String value; String value;
int ruleid; int ruleid;
@Override
public void writeToBundle(RouteDataBundle bundle) {
bundle.putString("c", condition);
bundle.putString("v", value);
bundle.putInt("id", ruleid);
}
@Override
public void readFromBundle(RouteDataBundle bundle) {
}
} }
public static class RouteTypeRule { public static class RouteTypeRule implements StringExternalizable<RouteDataBundle> {
private final static int ACCESS = 1; private final static int ACCESS = 1;
private final static int ONEWAY = 2; private final static int ONEWAY = 2;
private final static int HIGHWAY_TYPE = 3; private final static int HIGHWAY_TYPE = 3;
@ -54,23 +67,26 @@ public class BinaryMapRouteReaderAdapter {
public final static int TRAFFIC_SIGNALS = 6; public final static int TRAFFIC_SIGNALS = 6;
public final static int RAILWAY_CROSSING = 7; public final static int RAILWAY_CROSSING = 7;
private final static int LANES = 8; private final static int LANES = 8;
private final String t; private String t;
private final String v; private String v;
private int intValue; private int intValue;
private float floatValue; private float floatValue;
private int type; private int type;
private List<RouteTypeCondition> conditions = null; private List<RouteTypeCondition> conditions = null;
private int forward; private int forward;
public RouteTypeRule() {
}
public RouteTypeRule(String t, String v) { public RouteTypeRule(String t, String v) {
this.t = t.intern(); this.t = t.intern();
if("true".equals(v)) { if ("true".equals(v)) {
v = "yes"; v = "yes";
} }
if("false".equals(v)) { if ("false".equals(v)) {
v = "no"; v = "no";
} }
this.v = v == null? null : v.intern(); this.v = v == null ? null : v.intern();
try { try {
analyze(); analyze();
} catch(RuntimeException e) { } catch(RuntimeException e) {
@ -79,6 +95,52 @@ public class BinaryMapRouteReaderAdapter {
} }
} }
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((t == null) ? 0 : t.hashCode());
result = prime * result + ((v == null) ? 0 : v.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
RouteTypeRule other = (RouteTypeRule) obj;
return Algorithms.objectEquals(other.t, t) && Algorithms.objectEquals(other.v, v);
}
@Override
public void writeToBundle(RouteDataBundle bundle) {
bundle.putString("t", t);
if (v != null) {
bundle.putString("v", v);
}
}
@Override
public void readFromBundle(RouteDataBundle bundle) {
t = bundle.getString("t", null);
v = bundle.getString("v", null);
try {
analyze();
} catch(RuntimeException e) {
System.err.println("Error analyzing tag/value = " + t + "/" +v);
throw e;
}
}
@Override
public String toString() {
return t + "=" + v;
}
public int isForward() { public int isForward() {
return forward; return forward;
} }
@ -240,11 +302,10 @@ public class BinaryMapRouteReaderAdapter {
int destinationTypeRule = -1; int destinationTypeRule = -1;
int destinationRefTypeRule = -1; int destinationRefTypeRule = -1;
private RouteRegion referenceRouteRegion; private RouteRegion referenceRouteRegion;
public String getPartName() { public String getPartName() {
return "Routing"; return "Routing";
} }
public int getFieldNumber() { public int getFieldNumber() {
return OsmandOdb.OsmAndStructure.ROUTINGINDEX_FIELD_NUMBER; return OsmandOdb.OsmAndStructure.ROUTINGINDEX_FIELD_NUMBER;
@ -265,7 +326,15 @@ public class BinaryMapRouteReaderAdapter {
} }
return -1; return -1;
} }
public int getNameTypeRule() {
return nameTypeRule;
}
public int getRefTypeRule() {
return refTypeRule;
}
public RouteTypeRule quickGetEncodingRule(int id) { public RouteTypeRule quickGetEncodingRule(int id) {
return routeEncodingRules.get(id); return routeEncodingRules.get(id);
} }
@ -477,7 +546,7 @@ public class BinaryMapRouteReaderAdapter {
public int shiftToData; public int shiftToData;
public List<RouteSubregion> subregions = null; public List<RouteSubregion> subregions = null;
public List<RouteDataObject> dataObjects = null; public List<RouteDataObject> dataObjects = null;
public int getEstimatedSize(){ public int getEstimatedSize(){
int shallow = 7 * INT_SIZE + 4*3; int shallow = 7 * INT_SIZE + 4*3;
if (subregions != null) { if (subregions != null) {

View file

@ -0,0 +1,26 @@
package net.osmand.binary;
import net.osmand.router.RouteDataResources;
public class RouteDataBundle extends StringBundle {
private RouteDataResources resources;
public RouteDataBundle(RouteDataResources resources) {
this.resources = resources;
}
public RouteDataBundle(RouteDataResources resources, StringBundle bundle) {
super(bundle.getMap());
this.resources = resources;
}
@Override
public StringBundle newInstance() {
return new RouteDataBundle(resources);
}
public RouteDataResources getResources() {
return resources;
}
}

View file

@ -1,11 +1,5 @@
package net.osmand.binary; package net.osmand.binary;
import gnu.trove.map.hash.TIntObjectHashMap;
import java.text.MessageFormat;
import java.util.Arrays;
import net.osmand.Location; import net.osmand.Location;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion; import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule; import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
@ -13,12 +7,16 @@ import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils; import net.osmand.util.MapUtils;
import net.osmand.util.TransliterationHelper; import net.osmand.util.TransliterationHelper;
import java.text.MessageFormat;
import java.util.Arrays;
import gnu.trove.map.hash.TIntObjectHashMap;
public class RouteDataObject { public class RouteDataObject {
/*private */static final int RESTRICTION_SHIFT = 3; /*private */static final int RESTRICTION_SHIFT = 3;
/*private */static final int RESTRICTION_MASK = 7; /*private */static final int RESTRICTION_MASK = 7;
public static int HEIGHT_UNDEFINED = -80000; public static int HEIGHT_UNDEFINED = -80000;
public final RouteRegion region; public final RouteRegion region;
// all these arrays supposed to be immutable! // all these arrays supposed to be immutable!
// These fields accessible from C++ // These fields accessible from C++
@ -36,11 +34,11 @@ public class RouteDataObject {
public int[] nameIds; public int[] nameIds;
// mixed array [0, height, cumulative_distance height, cumulative_distance, height, ...] - length is length(points)*2 // mixed array [0, height, cumulative_distance height, cumulative_distance, height, ...] - length is length(points)*2
public float[] heightDistanceArray = null; public float[] heightDistanceArray = null;
public RouteDataObject(RouteRegion region) { public RouteDataObject(RouteRegion region) {
this.region = region; this.region = region;
} }
public RouteDataObject(RouteRegion region, int[] nameIds, String[] nameValues) { public RouteDataObject(RouteRegion region, int[] nameIds, String[] nameValues) {
this.region = region; this.region = region;
this.nameIds = nameIds; this.nameIds = nameIds;
@ -65,7 +63,7 @@ public class RouteDataObject {
this.pointNameTypes = copy.pointNameTypes; this.pointNameTypes = copy.pointNameTypes;
this.id = copy.id; this.id = copy.id;
} }
public boolean compareRoute(RouteDataObject thatObj) { public boolean compareRoute(RouteDataObject thatObj) {
if (this.id == thatObj.id if (this.id == thatObj.id
&& Arrays.equals(this.pointsX, thatObj.pointsX) && Arrays.equals(this.pointsX, thatObj.pointsX)
@ -76,11 +74,11 @@ public class RouteDataObject {
if (thatObj.region == null) { if (thatObj.region == null) {
throw new IllegalStateException("Illegal routing object: " + thatObj.id); throw new IllegalStateException("Illegal routing object: " + thatObj.id);
} }
boolean equals = true; boolean equals = true;
equals = equals && Arrays.equals(this.restrictions, thatObj.restrictions); equals = equals && Arrays.equals(this.restrictions, thatObj.restrictions);
equals = equals && Arrays.equals(this.restrictionsVia, thatObj.restrictionsVia); equals = equals && Arrays.equals(this.restrictionsVia, thatObj.restrictionsVia);
if (equals) { if (equals) {
if (this.types == null || thatObj.types == null) { if (this.types == null || thatObj.types == null) {
equals = this.types == thatObj.types; equals = this.types == thatObj.types;
@ -161,7 +159,7 @@ public class RouteDataObject {
} }
return false; return false;
} }
public float[] calculateHeightArray() { public float[] calculateHeightArray() {
if(heightDistanceArray != null) { if(heightDistanceArray != null) {
return heightDistanceArray; return heightDistanceArray;
@ -172,8 +170,8 @@ public class RouteDataObject {
heightDistanceArray = new float[0]; heightDistanceArray = new float[0];
return heightDistanceArray; return heightDistanceArray;
} }
heightDistanceArray = new float[2*getPointsLength()]; heightDistanceArray = new float[2*getPointsLength()];
double plon = 0; double plon = 0;
double plat = 0; double plat = 0;
float prevHeight = startHeight; float prevHeight = startHeight;
@ -214,7 +212,7 @@ public class RouteDataObject {
} }
prevHeight = height; prevHeight = height;
} }
} else { } else {
heightDistanceArray[0] = 0; heightDistanceArray[0] = 0;
heightDistanceArray[1] = startHeight; heightDistanceArray[1] = startHeight;
@ -228,19 +226,19 @@ public class RouteDataObject {
public long getId() { public long getId() {
return id; return id;
} }
public String getName(){ public String getName(){
if(names != null ) { if(names != null ) {
return names.get(region.nameTypeRule); return names.get(region.nameTypeRule);
} }
return null; return null;
} }
public String getName(String lang){ public String getName(String lang){
return getName(lang, false); return getName(lang, false);
} }
public String getName(String lang, boolean transliterate){ public String getName(String lang, boolean transliterate){
if(names != null ) { if(names != null ) {
if(Algorithms.isEmpty(lang)) { if(Algorithms.isEmpty(lang)) {
@ -263,11 +261,11 @@ public class RouteDataObject {
} }
return null; return null;
} }
public int[] getNameIds() { public int[] getNameIds() {
return nameIds; return nameIds;
} }
public TIntObjectHashMap<String> getNames() { public TIntObjectHashMap<String> getNames() {
return names; return names;
} }
@ -393,7 +391,7 @@ public class RouteDataObject {
public int getRestrictionType(int i) { public int getRestrictionType(int i) {
return (int) (restrictions[i] & RESTRICTION_MASK); return (int) (restrictions[i] & RESTRICTION_MASK);
} }
public RestrictionInfo getRestrictionInfo(int k) { public RestrictionInfo getRestrictionInfo(int k) {
RestrictionInfo ri = new RestrictionInfo(); RestrictionInfo ri = new RestrictionInfo();
ri.toWay = getRestrictionId(k); ri.toWay = getRestrictionId(k);
@ -403,26 +401,26 @@ public class RouteDataObject {
} }
return ri; return ri;
} }
public long getRestrictionVia(int i) { public long getRestrictionVia(int i) {
if(restrictionsVia != null && restrictionsVia.length > i) { if(restrictionsVia != null && restrictionsVia.length > i) {
return restrictionsVia[i]; return restrictionsVia[i];
} }
return 0; return 0;
} }
public long getRestrictionId(int i) { public long getRestrictionId(int i) {
return restrictions[i] >> RESTRICTION_SHIFT; return restrictions[i] >> RESTRICTION_SHIFT;
} }
public boolean hasPointTypes() { public boolean hasPointTypes() {
return pointTypes != null; return pointTypes != null;
} }
public boolean hasPointNames() { public boolean hasPointNames() {
return pointNames != null; return pointNames != null;
} }
public void insert(int pos, int x31, int y31) { public void insert(int pos, int x31, int y31) {
int[] opointsX = pointsX; int[] opointsX = pointsX;
@ -455,14 +453,14 @@ public class RouteDataObject {
} }
} }
} }
public String[] getPointNames(int ind) { public String[] getPointNames(int ind) {
if (pointNames == null || ind >= pointNames.length) { if (pointNames == null || ind >= pointNames.length) {
return null; return null;
} }
return pointNames[ind]; return pointNames[ind];
} }
public int[] getPointNameTypes(int ind) { public int[] getPointNameTypes(int ind) {
if (pointNameTypes == null || ind >= pointNameTypes.length) { if (pointNameTypes == null || ind >= pointNameTypes.length) {
return null; return null;
@ -476,11 +474,11 @@ public class RouteDataObject {
} }
return pointTypes[ind]; return pointTypes[ind];
} }
public int[] getTypes() { public int[] getTypes() {
return types; return types;
} }
public void processConditionalTags(long conditionalTime) { public void processConditionalTags(long conditionalTime) {
int sz = types.length; int sz = types.length;
for (int i = 0; i < sz; i++) { for (int i = 0; i < sz; i++) {
@ -582,7 +580,7 @@ public class RouteDataObject {
} }
return def; return def;
} }
public static float parseLength(String v, float def) { public static float parseLength(String v, float def) {
float f = 0; float f = 0;
// 14'10" 14 - inches, 10 feet // 14'10" 14 - inches, 10 feet
@ -602,10 +600,10 @@ public class RouteDataObject {
} }
} }
if(pref.contains("km")) { if(pref.contains("km")) {
f *= 1000; f *= 1000;
} }
if(pref.contains("\"") || pref.contains("in")) { if(pref.contains("\"") || pref.contains("in")) {
f *= 0.0254; f *= 0.0254;
} else if (pref.contains("\'") || pref.contains("ft") || pref.contains("feet")) { } else if (pref.contains("\'") || pref.contains("ft") || pref.contains("feet")) {
// foot to meters // foot to meters
f *= 0.3048; f *= 0.3048;
@ -618,7 +616,7 @@ public class RouteDataObject {
} }
return def; return def;
} }
public static float parseWeightInTon(String v, float def) { public static float parseWeightInTon(String v, float def) {
int i = Algorithms.findFirstNumberEndIndex(v); int i = Algorithms.findFirstNumberEndIndex(v);
if (i > 0) { if (i > 0) {
@ -631,7 +629,7 @@ public class RouteDataObject {
} }
return def; return def;
} }
public boolean loop() { public boolean loop() {
return pointsX[0] == pointsX[pointsX.length - 1] && pointsY[0] == pointsY[pointsY.length - 1]; return pointsX[0] == pointsX[pointsX.length - 1] && pointsY[0] == pointsY[pointsY.length - 1];
} }
@ -662,7 +660,7 @@ public class RouteDataObject {
} }
return false; return false;
} }
public boolean tunnel(){ public boolean tunnel(){
int sz = types.length; int sz = types.length;
for(int i=0; i<sz; i++) { for(int i=0; i<sz; i++) {
@ -754,7 +752,7 @@ public class RouteDataObject {
} }
return 0; return 0;
} }
public String getRoute() { public String getRoute() {
int sz = types.length; int sz = types.length;
for (int i = 0; i < sz; i++) { for (int i = 0; i < sz; i++) {
@ -803,7 +801,7 @@ public class RouteDataObject {
} }
return null; return null;
} }
public String getValue(int pnt, String tag) { public String getValue(int pnt, String tag) {
if (pointTypes != null && pnt < pointTypes.length && pointTypes[pnt] != null) { if (pointTypes != null && pnt < pointTypes.length && pointTypes[pnt] != null) {
for (int i = 0; i < pointTypes[pnt].length; i++) { for (int i = 0; i < pointTypes[pnt].length; i++) {
@ -823,7 +821,7 @@ public class RouteDataObject {
} }
return null; return null;
} }
public static String getHighway(int[] types, RouteRegion region) { public static String getHighway(int[] types, RouteRegion region) {
String highway = null; String highway = null;
int sz = types.length; int sz = types.length;
@ -836,7 +834,7 @@ public class RouteDataObject {
} }
return highway; return highway;
} }
public int getLanes() { public int getLanes() {
int sz = types.length; int sz = types.length;
for (int i = 0; i < sz; i++) { for (int i = 0; i < sz; i++) {
@ -848,7 +846,7 @@ public class RouteDataObject {
} }
return -1; return -1;
} }
public double directionRoute(int startPoint, boolean plus) { public double directionRoute(int startPoint, boolean plus) {
// same goes to C++ // same goes to C++
// Victor : the problem to put more than 5 meters that BinaryRoutePlanner will treat // Victor : the problem to put more than 5 meters that BinaryRoutePlanner will treat
@ -865,7 +863,7 @@ public class RouteDataObject {
} }
return direction; return direction;
} }
public boolean isRoadDeleted() { public boolean isRoadDeleted() {
int[] pt = getTypes(); int[] pt = getTypes();
int sz = pt.length; int sz = pt.length;
@ -921,7 +919,7 @@ public class RouteDataObject {
int kx = getPoint31XTile(k + 1); int kx = getPoint31XTile(k + 1);
int ky = getPoint31YTile(k + 1); int ky = getPoint31YTile(k + 1);
d += simplifyDistance(kx, ky, x, y); d += simplifyDistance(kx, ky, x, y);
} }
return d; return d;
} }
@ -957,7 +955,7 @@ public class RouteDataObject {
private double simplifyDistance(int x, int y, int px, int py) { private double simplifyDistance(int x, int y, int px, int py) {
return Math.abs(px - x) * 0.011d + Math.abs(py - y) * 0.01863d; return Math.abs(px - x) * 0.011d + Math.abs(py - y) * 0.01863d;
} }
private static void assertTrueLength(String vl, float exp){ private static void assertTrueLength(String vl, float exp){
float dest = parseLength(vl, 0); float dest = parseLength(vl, 0);
if(exp != dest) { if(exp != dest) {
@ -966,7 +964,7 @@ public class RouteDataObject {
System.out.println("OK " + vl); System.out.println("OK " + vl);
} }
} }
public static void main(String[] args) { public static void main(String[] args) {
assertTrueLength("10 km", 10000); assertTrueLength("10 km", 10000);
assertTrueLength("0.01 km", 10); assertTrueLength("0.01 km", 10);
@ -987,7 +985,7 @@ public class RouteDataObject {
assertTrueLength("14 feet", 4.2672f); assertTrueLength("14 feet", 4.2672f);
assertTrueLength("14 mile", 22530.76f); assertTrueLength("14 mile", 22530.76f);
assertTrueLength("14 cm", 0.14f); assertTrueLength("14 cm", 0.14f);
// float badValue = -1; // float badValue = -1;
// assertTrueLength("none", badValue); // assertTrueLength("none", badValue);
// assertTrueLength("m 4.1", badValue); // assertTrueLength("m 4.1", badValue);
@ -1012,18 +1010,18 @@ public class RouteDataObject {
return MessageFormat.format("Road id {0} name {1} ref {2}", (getId() / 64) + "", name == null ? "" : name, return MessageFormat.format("Road id {0} name {1} ref {2}", (getId() / 64) + "", name == null ? "" : name,
rf == null ? "" : rf); rf == null ? "" : rf);
} }
public static class RestrictionInfo { public static class RestrictionInfo {
public int type; public int type;
public long toWay; public long toWay;
public long viaWay; public long viaWay;
public RestrictionInfo next; // optional to simulate linked list public RestrictionInfo next; // optional to simulate linked list
public int length() { public int length() {
if(next == null) { if(next == null) {
return 1; return 1;
} }
return next.length() + 1; return next.length() + 1;
} }
} }
@ -1047,5 +1045,5 @@ public class RouteDataObject {
restrictionsVia[k] = viaWay; restrictionsVia[k] = viaWay;
} }
} }

View file

@ -0,0 +1,448 @@
package net.osmand.binary;
import net.osmand.util.Algorithms;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import gnu.trove.iterator.TIntObjectIterator;
import gnu.trove.map.hash.TIntObjectHashMap;
public class StringBundle {
private static final DecimalFormat TWO_DIGITS_FORMATTER = new DecimalFormat("#.##");
private static final DecimalFormat THREE_DIGITS_FORMATTER = new DecimalFormat("#.###");
private static final DecimalFormat FOUR_DIGITS_FORMATTER = new DecimalFormat("#.####");
private static final DecimalFormat FIVE_DIGITS_FORMATTER = new DecimalFormat("#.#####");
private static final DecimalFormat SIX_DIGITS_FORMATTER = new DecimalFormat("#.######");
private Map<String, Item> map = new LinkedHashMap<>();
public enum ItemType {
STRING,
LIST,
MAP
}
public StringBundle() {
}
protected StringBundle(Map<String, Item> map) {
this.map = map;
}
public StringBundle newInstance() {
return new StringBundle();
}
public static abstract class Item<T> {
private String name;
private ItemType type;
private T value;
private Item(String name, ItemType type, T value) {
this.name = name;
this.type = type;
this.value = value;
}
public String getName() {
return name;
}
public ItemType getType() {
return type;
}
public T getValue() {
return value;
}
}
public static class StringItem extends Item<String> {
private StringItem(String name, String value) {
super(name, ItemType.STRING, value);
}
private StringItem(String name, int value) {
super(name, ItemType.STRING, String.valueOf(value));
}
private StringItem(String name, long value) {
super(name, ItemType.STRING, String.valueOf(value));
}
private StringItem(String name, float value) {
super(name, ItemType.STRING, String.valueOf(value));
}
private StringItem(String name, float value, int maxDigits) {
super(name, ItemType.STRING, getFormattedValue(value, maxDigits));
}
private StringItem(String name, boolean value) {
super(name, ItemType.STRING, String.valueOf(value));
}
private static String getFormattedValue(float value, int maxDigits) {
DecimalFormat formatter = null;
if (maxDigits == 2) {
formatter = TWO_DIGITS_FORMATTER;
} else if (maxDigits == 3) {
formatter = THREE_DIGITS_FORMATTER;
} else if (maxDigits == 4) {
formatter = FOUR_DIGITS_FORMATTER;
} else if (maxDigits == 5) {
formatter = FIVE_DIGITS_FORMATTER;
} else if (maxDigits == 6) {
formatter = SIX_DIGITS_FORMATTER;
}
return formatter != null ? formatter.format(value) : String.valueOf(value);
}
private int asInt(int defaultValue) {
try {
return Integer.parseInt(getValue());
} catch (NumberFormatException e) {
return defaultValue;
}
}
private long asLong(long defaultValue) {
try {
return Long.parseLong(getValue());
} catch (NumberFormatException e) {
return defaultValue;
}
}
private float asFloat(float defaultValue) {
try {
return Float.parseFloat(getValue());
} catch (NumberFormatException e) {
return defaultValue;
}
}
private boolean asBoolean(boolean defaultValue) {
try {
return Boolean.parseBoolean(getValue());
} catch (NumberFormatException e) {
return defaultValue;
}
}
private int[] asIntArray(int[] defaultValue) {
try {
return stringToIntArray(getValue());
} catch (NumberFormatException e) {
return defaultValue;
}
}
private int[][] asIntIntArray(int[][] defaultValue) {
try {
return stringToIntIntArray(getValue());
} catch (NumberFormatException e) {
return defaultValue;
}
}
}
public static class StringListItem extends Item<List<Item>> {
private StringListItem(String name, List<Item> list) {
super(name, ItemType.LIST, list);
}
}
public static class StringMapItem extends Item<Map<String, Item>> {
private StringMapItem(String name, Map<String, Item> map) {
super(name, ItemType.MAP, map);
}
}
public static class StringBundleItem extends StringMapItem {
private StringBundleItem(String name, StringBundle bundle) {
super(name, bundle.map);
}
}
public Map<String, Item> getMap() {
return Collections.unmodifiableMap(map);
}
public Item getItem(String key) {
return map.get(key);
}
public void putInt(String key, int value) {
map.put(key, new StringItem(key, value));
}
public int getInt(String key, int defaultValue) {
Item item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).asInt(defaultValue) : defaultValue;
}
public void putLong(String key, long value) {
map.put(key, new StringItem(key, value));
}
public long getLong(String key, long defaultValue) {
Item item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).asLong(defaultValue) : defaultValue;
}
public void putFloat(String key, float value) {
map.put(key, new StringItem(key, value));
}
public void putFloat(String key, float value, int maxDigits) {
map.put(key, new StringItem(key, value, maxDigits));
}
public float getFloat(String key, float defaultValue) {
Item item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).asFloat(defaultValue) : defaultValue;
}
public void putBoolean(String key, boolean value) {
map.put(key, new StringItem(key, value));
}
public boolean getBoolean(String key, boolean defaultValue) {
Item item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).asBoolean(defaultValue) : defaultValue;
}
public void putString(String key, String value) {
if (value != null) {
map.put(key, new StringItem(key, value));
}
}
public String getString(String key, String defaultValue) {
Item item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).getValue() : defaultValue;
}
public void putObject(String key, StringExternalizable object) {
if (object != null) {
StringBundle bundle = newInstance();
object.writeToBundle(bundle);
map.put(key, new StringBundleItem(key, bundle));
}
}
public void putList(String key, String itemName, List<? extends StringExternalizable> list) {
if (list != null) {
List<Item> itemList = new ArrayList<>();
for (StringExternalizable ex : list) {
if (ex != null) {
StringBundle bundle = newInstance();
ex.writeToBundle(bundle);
itemList.add(new StringBundleItem(itemName, bundle));
}
}
map.put(key, new StringListItem(key, itemList));
}
}
public void putBundleList(String key, String itemName, List<StringBundle> list) {
if (list != null) {
List<Item> itemList = new ArrayList<>();
for (StringBundle bundle : list) {
itemList.add(new StringBundleItem(itemName, bundle));
}
map.put(key, new StringListItem(key, itemList));
}
}
public void putBundle(String key, StringBundle bundle) {
map.put(key, new StringBundleItem(key, bundle));
}
public void putArray(String key, int[] array) {
if (array != null) {
map.put(key, new StringItem(key, intArrayToString(array)));
}
}
public int[] getIntArray(String key, int[] defaultValue) {
Item item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).asIntArray(defaultValue) : defaultValue;
}
public void putArray(String key, int[][] array) {
if (array != null) {
map.put(key, new StringItem(key, intIntArrayToString(array)));
}
}
public int[][] getIntIntArray(String key, int[][] defaultValue) {
Item item = map.get(key);
return item instanceof StringItem ? ((StringItem) item).asIntIntArray(defaultValue) : defaultValue;
}
public void putArray(String key, long[] array) {
if (array != null) {
map.put(key, new StringItem(key, longArrayToString(array)));
}
}
public void putArray(String key, float[] array) {
if (array != null) {
map.put(key, new StringItem(key, floatArrayToString(array)));
}
}
public <T> void putMap(String key, TIntObjectHashMap<T> map) {
if (map != null) {
StringBundle bundle = newInstance();
TIntObjectIterator<T> it = map.iterator();
while (it.hasNext()) {
it.advance();
int k = it.key();
T v = it.value();
bundle.putString(String.valueOf(k), String.valueOf(v));
}
this.map.put(key, new StringBundleItem(key, bundle));
}
}
public <K, V> void putMap(String key, Map<K, V> map) {
if (map != null) {
StringBundle bundle = newInstance();
for (Entry<K, V> entry : map.entrySet()) {
bundle.putString(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
}
this.map.put(key, new StringBundleItem(key, bundle));
}
}
private static String intArrayToString(int[] a) {
if (a == null) {
return null;
}
StringBuilder b = new StringBuilder();
for (int value : a) {
if (b.length() > 0) {
b.append(",");
}
b.append(value);
}
return b.toString();
}
private static int[] stringToIntArray(String a) throws NumberFormatException {
if (a == null) {
return null;
}
String[] items = a.split(",");
int[] res = new int[items.length];
for (int i = 0; i < items.length; i++) {
res[i] = Integer.parseInt(items[i]);
}
return res;
}
private static String longArrayToString(long[] a) {
if (a == null) {
return null;
}
StringBuilder b = new StringBuilder();
for (long value : a) {
if (b.length() > 0) {
b.append(",");
}
b.append(value);
}
return b.toString();
}
private static long[] stringToLongArray(String a) throws NumberFormatException {
if (a == null) {
return null;
}
String[] items = a.split(",");
long[] res = new long[items.length];
for (int i = 0; i < items.length; i++) {
res[i] = Integer.parseInt(items[i]);
}
return res;
}
private static String floatArrayToString(float[] a) {
if (a == null) {
return null;
}
StringBuilder b = new StringBuilder();
for (float value : a) {
if (b.length() > 0) {
b.append(",");
}
b.append(value);
}
return b.toString();
}
private static float[] stringToFloatArray(String a) throws NumberFormatException {
if (a == null) {
return null;
}
String[] items = a.split(",");
float[] res = new float[items.length];
for (int i = 0; i < items.length; i++) {
res[i] = Float.parseFloat(items[i]);
}
return res;
}
private static String intIntArrayToString(int[][] a) {
if (a == null) {
return null;
}
StringBuilder b = new StringBuilder();
for (int i = 0; i < a.length; i++) {
if (i > 0) {
b.append(";");
}
int[] arr = a[i];
if (arr != null && arr.length > 0) {
b.append(intArrayToString(arr));
}
}
return b.toString();
}
private static int[][] stringToIntIntArray(String a) throws NumberFormatException {
if (a == null) {
return null;
}
String[] items = a.split(";");
int[][] res = new int[items.length][];
for (int i = 0; i < items.length; i++) {
String item = items[i];
if (Algorithms.isEmpty(item)) {
res[i] = null;
} else {
String[] subItems = item.split(",");
res[i] = new int[subItems.length];
for (int k = 0; k < subItems.length; k++) {
res[i][k] = Integer.parseInt(subItems[k]);
}
}
}
return res;
}
}

View file

@ -0,0 +1,12 @@
package net.osmand.binary;
public abstract class StringBundleReader {
private StringBundle bundle = new StringBundle();
public StringBundle getBundle() {
return bundle;
}
public abstract void readBundle();
}

View file

@ -0,0 +1,26 @@
package net.osmand.binary;
import net.osmand.binary.StringBundle.Item;
import java.util.Map.Entry;
public abstract class StringBundleWriter {
private StringBundle bundle;
public StringBundleWriter(StringBundle bundle) {
this.bundle = bundle;
}
public StringBundle getBundle() {
return bundle;
}
protected abstract void writeItem(String name, Item item);
public void writeBundle() {
for (Entry<String, Item> entry : bundle.getMap().entrySet()) {
writeItem(entry.getKey(), entry.getValue());
}
}
}

View file

@ -0,0 +1,27 @@
package net.osmand.binary;
import net.osmand.PlatformUtil;
import org.apache.commons.logging.Log;
import org.xmlpull.v1.XmlPullParser;
public class StringBundleXmlReader extends StringBundleReader {
public final static Log log = PlatformUtil.getLog(StringBundleXmlReader.class);
private XmlPullParser parser;
public StringBundleXmlReader(XmlPullParser parser) {
this.parser = parser;
}
@Override
public void readBundle() {
StringBundle bundle = getBundle();
for (int i = 0; i < parser.getAttributeCount(); i++) {
String name = parser.getAttributeName(i);
String value = parser.getAttributeValue(i);
bundle.putString(name, value);
}
}
}

View file

@ -0,0 +1,96 @@
package net.osmand.binary;
import net.osmand.PlatformUtil;
import net.osmand.binary.StringBundle.Item;
import net.osmand.binary.StringBundle.StringItem;
import net.osmand.binary.StringBundle.StringListItem;
import net.osmand.binary.StringBundle.StringMapItem;
import org.apache.commons.logging.Log;
import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
import java.util.List;
import java.util.Map.Entry;
public class StringBundleXmlWriter extends StringBundleWriter {
public final static Log log = PlatformUtil.getLog(StringBundleXmlWriter.class);
private XmlSerializer serializer;
public StringBundleXmlWriter(StringBundle bundle, XmlSerializer serializer) {
super(bundle);
this.serializer = serializer;
}
@Override
protected void writeItem(String name, Item item) {
if (serializer != null) {
try {
writeItemImpl(name, item);
} catch (Exception e) {
log.error("Error writing string bundle as xml", e);
}
}
}
@Override
public void writeBundle() {
if (serializer != null) {
super.writeBundle();
try {
serializer.flush();
} catch (Exception e) {
log.error("Error writing string bundle as xml", e);
}
}
}
private void writeItemImpl(String name, Item item) throws IOException {
if (serializer != null && item != null) {
switch (item.getType()) {
case STRING: {
StringItem stringItem = (StringItem) item;
serializer.attribute(null, name, stringItem.getValue());
break;
}
case LIST: {
StringListItem listItem = (StringListItem) item;
serializer.startTag(null, name);
List<Item> list = listItem.getValue();
for (Item i : list) {
if (i.getType() == StringBundle.ItemType.STRING) {
writeItemImpl(i.getName(), i);
}
}
for (Item i : list) {
if (i.getType() != StringBundle.ItemType.STRING) {
writeItemImpl(i.getName(), i);
}
}
serializer.endTag(null, name);
break;
}
case MAP: {
StringMapItem mapItem = (StringMapItem) item;
serializer.startTag(null, name);
for (Entry<String, Item> entry : mapItem.getValue().entrySet()) {
Item i = entry.getValue();
if (i.getType() == StringBundle.ItemType.STRING) {
writeItemImpl(entry.getKey(), i);
}
}
for (Entry<String, Item> entry : mapItem.getValue().entrySet()) {
Item i = entry.getValue();
if (i.getType() != StringBundle.ItemType.STRING) {
writeItemImpl(entry.getKey(), i);
}
}
serializer.endTag(null, name);
break;
}
}
}
}
}

View file

@ -0,0 +1,9 @@
package net.osmand.binary;
public interface StringExternalizable<T extends StringBundle> {
public void writeToBundle(T bundle);
public void readFromBundle(T bundle);
}

View file

@ -176,7 +176,8 @@ public class EntityParser {
amenitiesList.clear(); amenitiesList.clear();
// it could be collection of amenities // it could be collection of amenities
boolean relation = entity instanceof Relation; boolean relation = entity instanceof Relation;
boolean purerelation = relation && !"multipolygon".equals(tags.get("type")); boolean purerelation = relation &&
!("multipolygon".equals(tags.get("type")) || "boundary".equals(tags.get("type")));
Collection<Map<String, String>> it = MapRenderingTypes.splitTagsIntoDifferentObjects(tags); Collection<Map<String, String>> it = MapRenderingTypes.splitTagsIntoDifferentObjects(tags);
for (Map<String, String> ts : it) { for (Map<String, String> ts : it) {
for (Map.Entry<String, String> e : ts.entrySet()) { for (Map.Entry<String, String> e : ts.entrySet()) {

View file

@ -0,0 +1,53 @@
package net.osmand.router;
import net.osmand.Location;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
import net.osmand.binary.RouteDataObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class RouteDataResources {
private Map<RouteTypeRule, Integer> rules = new LinkedHashMap<>();
private List<Location> locations;
private int currentLocation;
private Map<RouteDataObject, int[][]> pointNamesMap = new HashMap<>();
public RouteDataResources() {
this.locations = new ArrayList<>();
}
public RouteDataResources(List<Location> locations) {
this.locations = locations;
}
public Map<RouteTypeRule, Integer> getRules() {
return rules;
}
public List<Location> getLocations() {
return locations;
}
public boolean hasLocations() {
return locations.size() > 0;
}
public Location getLocation(int index) {
index += currentLocation;
return index < locations.size() ? locations.get(index) : null;
}
public void incrementCurrentLocation(int index) {
currentLocation += index;
}
public Map<RouteDataObject, int[][]> getPointNamesMap() {
return pointNamesMap;
}
}

View file

@ -0,0 +1,110 @@
package net.osmand.router;
import net.osmand.GPXUtilities.GPXExtensionsWriter;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.Track;
import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.Location;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
import net.osmand.binary.RouteDataBundle;
import net.osmand.binary.StringBundle;
import net.osmand.binary.StringBundleWriter;
import net.osmand.binary.StringBundleXmlWriter;
import org.xmlpull.v1.XmlSerializer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class RouteExporter {
public static final String OSMAND_ROUTER_V2 = "OsmAndRouterV2";
private String name;
private List<RouteSegmentResult> route;
private List<Location> locations;
private List<WptPt> points;
public RouteExporter(String name, List<RouteSegmentResult> route, List<Location> locations, List<WptPt> points) {
this.name = name;
this.route = route;
this.locations = locations;
this.points = points;
}
public GPXFile exportRoute() {
RouteDataResources resources = new RouteDataResources(locations);
final RouteDataBundle bundle = new RouteDataBundle(resources);
for (RouteSegmentResult sr : route) {
sr.collectTypes(resources);
}
for (RouteSegmentResult sr : route) {
sr.collectNames(resources);
}
List<StringBundle> routeItems = new ArrayList<>();
for (RouteSegmentResult sr : route) {
RouteDataBundle itemBundle = new RouteDataBundle(resources);
sr.writeToBundle(itemBundle);
routeItems.add(itemBundle);
}
bundle.putBundleList("route", "segment", routeItems);
List<StringBundle> typeList = new ArrayList<>();
Map<RouteTypeRule, Integer> rules = resources.getRules();
for (RouteTypeRule rule : rules.keySet()) {
RouteDataBundle typeBundle = new RouteDataBundle(resources);
rule.writeToBundle(typeBundle);
typeList.add(typeBundle);
}
bundle.putBundleList("types", "type", typeList);
GPXFile gpx = new GPXFile(OSMAND_ROUTER_V2);
Track track = new Track();
track.name = name;
gpx.tracks.add(track);
TrkSegment trkSegment = new TrkSegment();
track.segments.add(trkSegment);
if (locations == null || locations.isEmpty()) {
return gpx;
}
for (int i = 0; i < locations.size(); i++) {
Location loc = locations.get(i);
WptPt pt = new WptPt();
pt.lat = loc.getLatitude();
pt.lon = loc.getLongitude();
if (loc.hasSpeed()) {
pt.speed = loc.getSpeed();
}
if (loc.hasAltitude()) {
pt.ele = loc.getAltitude();
}
if (loc.hasAccuracy()) {
pt.hdop = loc.getAccuracy();
}
trkSegment.points.add(pt);
}
if (points != null) {
for (WptPt pt : points) {
gpx.addPoint(pt);
}
}
GPXExtensionsWriter extensionsWriter = new GPXExtensionsWriter() {
@Override
public void writeExtensions(XmlSerializer serializer) {
StringBundleWriter bundleWriter = new StringBundleXmlWriter(bundle, serializer);
bundleWriter.writeBundle();
}
};
gpx.setExtensionsWriter(extensionsWriter);
return gpx;
}
}

View file

@ -0,0 +1,145 @@
package net.osmand.router;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXExtensionsReader;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.Location;
import net.osmand.PlatformUtil;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
import net.osmand.binary.RouteDataBundle;
import net.osmand.binary.RouteDataObject;
import net.osmand.binary.StringBundle;
import net.osmand.binary.StringBundleReader;
import net.osmand.binary.StringBundleXmlReader;
import org.apache.commons.logging.Log;
import org.xmlpull.v1.XmlPullParser;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static net.osmand.binary.RouteDataObject.HEIGHT_UNDEFINED;
public class RouteImporter {
public final static Log log = PlatformUtil.getLog(RouteImporter.class);
private File file;
private GPXFile gpxFile;
public RouteImporter(File file) {
this.file = file;
}
public RouteImporter(GPXFile gpxFile) {
this.gpxFile = gpxFile;
}
public List<RouteSegmentResult> importRoute() {
final List<RouteSegmentResult> route = new ArrayList<>();
final RouteRegion region = new RouteRegion();
final RouteDataResources resources = new RouteDataResources();
GPXExtensionsReader extensionsReader = new GPXExtensionsReader() {
@Override
public boolean readExtensions(GPXFile res, XmlPullParser parser) throws Exception {
if (!resources.hasLocations()) {
List<Location> locations = resources.getLocations();
double lastElevation = HEIGHT_UNDEFINED;
if (res.tracks.size() > 0 && res.tracks.get(0).segments.size() > 0 && res.tracks.get(0).segments.get(0).points.size() > 0) {
for (WptPt point : res.tracks.get(0).segments.get(0).points) {
Location loc = new Location("", point.getLatitude(), point.getLongitude());
if (!Double.isNaN(point.ele)) {
loc.setAltitude(point.ele);
lastElevation = point.ele;
} else if (lastElevation != HEIGHT_UNDEFINED) {
loc.setAltitude(lastElevation);
}
locations.add(loc);
}
}
}
String tag = parser.getName();
if ("route".equals(tag)) {
int tok;
while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) {
if (tok == XmlPullParser.START_TAG) {
tag = parser.getName();
if ("segment".equals(tag)) {
StringBundleReader bundleReader = new StringBundleXmlReader(parser);
RouteDataObject object = new RouteDataObject(region);
RouteSegmentResult segment = new RouteSegmentResult(object);
bundleReader.readBundle();
segment.readFromBundle(new RouteDataBundle(resources, bundleReader.getBundle()));
route.add(segment);
}
} else if (tok == XmlPullParser.END_TAG) {
tag = parser.getName();
if ("route".equals(tag)) {
return true;
}
}
}
} else if ("types".equals(tag)) {
int tok;
int i = 0;
while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) {
if (tok == XmlPullParser.START_TAG) {
tag = parser.getName();
if ("type".equals(tag)) {
StringBundleReader bundleReader = new StringBundleXmlReader(parser);
bundleReader.readBundle();
StringBundle bundle = bundleReader.getBundle();
String t = bundle.getString("t", null);
String v = bundle.getString("v", null);
region.initRouteEncodingRule(i++, t, v);
}
} else if (tok == XmlPullParser.END_TAG) {
tag = parser.getName();
if ("types".equals(tag)) {
return true;
}
}
}
}
return false;
}
};
if (gpxFile != null) {
GPXUtilities.loadGPXFile(null, gpxFile, extensionsReader);
for (RouteSegmentResult segment : route) {
segment.fillNames(resources);
}
} else if (file != null) {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
GPXFile gpxFile = GPXUtilities.loadGPXFile(fis, null, extensionsReader);
for (RouteSegmentResult segment : route) {
segment.fillNames(resources);
}
gpxFile.path = file.getAbsolutePath();
gpxFile.modifiedTime = file.lastModified();
} catch (IOException e) {
log.error("Error importing route " + file.getAbsolutePath(), e);
return null;
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (IOException ignore) {
// ignore
}
}
}
return route;
}
}

View file

@ -26,7 +26,8 @@ import org.apache.commons.logging.Log;
public class RoutePlannerFrontEnd { public class RoutePlannerFrontEnd {
protected static final Log log = PlatformUtil.getLog(RoutePlannerFrontEnd.class); protected static final Log log = PlatformUtil.getLog(RoutePlannerFrontEnd.class);
protected static final double GPS_POSSIBLE_ERROR = 10; // Check issue #8649
protected static final double GPS_POSSIBLE_ERROR = 7;
public boolean useSmartRouteRecalculation = true; public boolean useSmartRouteRecalculation = true;

View file

@ -1,24 +1,5 @@
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;
@ -37,6 +18,26 @@ 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;
@ -1563,7 +1564,7 @@ public class RouteResultPreparation {
return null; return null;
} }
private static int[] calculateRawTurnLanes(String turnLanes, int calcTurnType) { public static int[] calculateRawTurnLanes(String turnLanes, int calcTurnType) {
String[] splitLaneOptions = turnLanes.split("\\|", -1); String[] splitLaneOptions = turnLanes.split("\\|", -1);
int[] lanes = new int[splitLaneOptions.length]; int[] lanes = new int[splitLaneOptions.length];
for (int i = 0; i < splitLaneOptions.length; i++) { for (int i = 0; i < splitLaneOptions.length; i++) {

View file

@ -1,19 +1,26 @@
package net.osmand.router; package net.osmand.router;
import net.osmand.Location;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
import net.osmand.binary.RouteDataBundle;
import net.osmand.binary.RouteDataObject;
import net.osmand.binary.StringExternalizable;
import net.osmand.data.LatLon;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule; import gnu.trove.map.hash.TIntObjectHashMap;
import net.osmand.binary.RouteDataObject;
import net.osmand.data.LatLon;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
public class RouteSegmentResult { public class RouteSegmentResult implements StringExternalizable<RouteDataBundle> {
private final RouteDataObject object; private final RouteDataObject object;
private int startPointIndex; private int startPointIndex;
private int endPointIndex; private int endPointIndex;
@ -26,15 +33,318 @@ public class RouteSegmentResult {
private String description = ""; private String description = "";
// this make not possible to make turns in between segment result for now // this make not possible to make turns in between segment result for now
private TurnType turnType; private TurnType turnType;
public RouteSegmentResult(RouteDataObject object) {
this.object = object;
}
public RouteSegmentResult(RouteDataObject object, int startPointIndex, int endPointIndex) { public RouteSegmentResult(RouteDataObject object, int startPointIndex, int endPointIndex) {
this.object = object; this.object = object;
this.startPointIndex = startPointIndex; this.startPointIndex = startPointIndex;
this.endPointIndex = endPointIndex; this.endPointIndex = endPointIndex;
updateCapacity(); updateCapacity();
} }
void collectTypes(RouteDataResources resources) {
Map<RouteTypeRule, Integer> rules = resources.getRules();
if (object.types != null) {
collectRules(rules, object.types);
}
if (object.pointTypes != null) {
int start = Math.min(startPointIndex, endPointIndex);
int end = Math.max(startPointIndex, endPointIndex);
for (int i = start; i <= end && i < object.pointTypes.length; i++) {
int[] types = object.pointTypes[i];
if (types != null) {
collectRules(rules, types);
}
}
}
}
void collectNames(RouteDataResources resources) {
Map<RouteTypeRule, Integer> rules = resources.getRules();
RouteRegion region = object.region;
if (region.getNameTypeRule() != -1) {
RouteTypeRule r = region.quickGetEncodingRule(region.getNameTypeRule());
if (!rules.containsKey(r)) {
rules.put(r, rules.size());
}
}
if (region.getRefTypeRule() != -1) {
RouteTypeRule r = region.quickGetEncodingRule(region.getRefTypeRule());
if (!rules.containsKey(r)) {
rules.put(r, rules.size());
}
}
if (object.nameIds != null) {
for (int nameId : object.nameIds) {
String name = object.names.get(nameId);
String tag = region.quickGetEncodingRule(nameId).getTag();
RouteTypeRule r = new RouteTypeRule(tag, name);
if (!rules.containsKey(r)) {
rules.put(r, rules.size());
}
}
}
if (object.pointNameTypes != null) {
int start = Math.min(startPointIndex, endPointIndex);
int end = Math.min(Math.max(startPointIndex, endPointIndex) + 1, object.pointNameTypes.length);
for (int i = start; i < end; i++) {
int[] types = object.pointNameTypes[i];
if (types != null) {
for (int type : types) {
RouteTypeRule r = region.quickGetEncodingRule(type);
if (!rules.containsKey(r)) {
rules.put(r, rules.size());
}
}
}
}
}
}
private void collectRules(Map<RouteTypeRule, Integer> rules, int[] types) {
RouteRegion region = object.region;
for (int type : types) {
RouteTypeRule rule = region.quickGetEncodingRule(type);
String tag = rule.getTag();
if (tag.equals("osmand_ele_start") || tag.equals("osmand_ele_end")
|| tag.equals("osmand_ele_asc") || tag.equals("osmand_ele_desc"))
{
continue;
}
if (!rules.containsKey(rule)) {
rules.put(rule, rules.size());
}
}
}
private int[] convertTypes(int[] types, Map<RouteTypeRule, Integer> rules) {
if (types == null || types.length == 0) {
return null;
}
List<Integer> arr = new ArrayList<>();
for (int i = 0; i < types.length; i++) {
int type = types[i];
RouteTypeRule rule = object.region.quickGetEncodingRule(type);
Integer ruleId = rules.get(rule);
if (ruleId != null) {
arr.add(ruleId);
}
}
int[] res = new int[arr.size()];
for (int i = 0; i < arr.size(); i++) {
res[i] = arr.get(i);
}
return res;
}
private int[][] convertTypes(int[][] types, Map<RouteTypeRule, Integer> rules) {
if (types == null || types.length == 0) {
return null;
}
int[][] res = new int[types.length][];
for (int i = 0; i < types.length; i++) {
int[] typesArr = types[i];
if (typesArr != null) {
res[i] = convertTypes(typesArr, rules);
}
}
return res;
}
private int[] convertNameIds(int[] nameIds, Map<RouteTypeRule, Integer> rules) {
if (nameIds == null || nameIds.length == 0) {
return null;
}
int[] res = new int[nameIds.length];
for (int i = 0; i < nameIds.length; i++) {
int nameId = nameIds[i];
String name = object.names.get(nameId);
String tag = object.region.quickGetEncodingRule(nameId).getTag();
RouteTypeRule rule = new RouteTypeRule(tag, name);
Integer ruleId = rules.get(rule);
if (ruleId == null) {
throw new IllegalArgumentException("Cannot find collected rule: " + rule.toString());
}
res[i] = ruleId;
}
return res;
}
private int[][] convertPointNames(int[][] nameTypes, Map<RouteTypeRule, Integer> rules) {
if (nameTypes == null || nameTypes.length == 0) {
return null;
}
int[][] res = new int[nameTypes.length][];
for (int i = 0; i < nameTypes.length; i++) {
int[] types = nameTypes[i];
if (types != null) {
int[] arr = new int[types.length];
for (int k = 0; k < types.length; k++) {
int type = types[k];
String tag = object.region.quickGetEncodingRule(type).getTag();
String name = object.pointNames[i][k];
RouteTypeRule rule = new RouteTypeRule(tag, name);
Integer ruleId = rules.get(rule);
if (ruleId == null) {
ruleId = rules.size();
rules.put(rule, ruleId);
}
arr[k] = ruleId;
}
res[i] = arr;
}
}
return res;
}
public void fillNames(RouteDataResources resources) {
if (object.nameIds != null && object.nameIds.length > 0) {
RouteRegion region = object.region;
int nameTypeRule = region.getNameTypeRule();
int refTypeRule = region.getRefTypeRule();
object.names = new TIntObjectHashMap<>();
for (int nameId : object.nameIds) {
RouteTypeRule rule = region.quickGetEncodingRule(nameId);
if (rule != null) {
if (nameTypeRule != -1 && "name".equals(rule.getTag())) {
nameId = nameTypeRule;
} else if (refTypeRule != -1 && "ref".equals(rule.getTag())) {
nameId = refTypeRule;
}
object.names.put(nameId, rule.getValue());
}
}
}
String[][] pointNames = null;
int[][] pointNameTypes = null;
int[][] pointNamesArr = resources.getPointNamesMap().get(object);
if (pointNamesArr != null) {
pointNames = new String[pointNamesArr.length][];
pointNameTypes = new int[pointNamesArr.length][];
for (int i = 0; i < pointNamesArr.length; i++) {
int[] namesIds = pointNamesArr[i];
if (namesIds != null) {
pointNames[i] = new String[namesIds.length];
pointNameTypes[i] = new int[namesIds.length];
for (int k = 0; k < namesIds.length; k++) {
int id = namesIds[k];
RouteTypeRule r = object.region.quickGetEncodingRule(id);
if (r != null) {
pointNames[i][k] = r.getValue();
int nameType = object.region.searchRouteEncodingRule(r.getTag(), null);
if (nameType != -1) {
pointNameTypes[i][k] = nameType;
}
}
}
}
}
}
object.pointNames = pointNames;
object.pointNameTypes = pointNameTypes;
}
@Override
public void writeToBundle(RouteDataBundle bundle) {
Map<RouteTypeRule, Integer> rules = bundle.getResources().getRules();
bundle.putInt("length", (Math.abs(endPointIndex - startPointIndex) + 1) * (endPointIndex >= startPointIndex ? 1 : -1));
bundle.putFloat("segmentTime", segmentTime, 2);
bundle.putFloat("speed", speed, 2);
if (turnType != null) {
bundle.putString("turnType", turnType.toXmlString());
if (turnType.isSkipToSpeak()) {
bundle.putBoolean("skipTurn", turnType.isSkipToSpeak());
}
if (turnType.getTurnAngle() != 0) {
bundle.putFloat("turnAngle", turnType.getTurnAngle(), 2);
}
int[] turnLanes = turnType.getLanes();
if (turnLanes != null && turnLanes.length > 0) {
bundle.putString("turnLanes", TurnType.lanesToString(turnLanes));
}
}
bundle.putLong("id", object.id);
bundle.putArray("types", convertTypes(object.types, rules));
int start = Math.min(startPointIndex, endPointIndex);
int end = Math.max(startPointIndex, endPointIndex) + 1;
if (object.pointTypes != null && start < object.pointTypes.length) {
int[][] types = Arrays.copyOfRange(object.pointTypes, start, Math.min(end, object.pointTypes.length));
bundle.putArray("pointTypes", convertTypes(types, rules));
}
if (object.nameIds != null) {
bundle.putArray("names", convertNameIds(object.nameIds, rules));
}
if (object.pointNameTypes != null && start < object.pointNameTypes.length) {
int[][] types = Arrays.copyOfRange(object.pointNameTypes, start, Math.min(end, object.pointNameTypes.length));
if (object.pointNames != null) {
bundle.putArray("pointNames", convertPointNames(types, rules));
}
}
}
@Override
public void readFromBundle(RouteDataBundle bundle) {
int length = bundle.getInt("length", 0);
boolean plus = length >= 0;
length = Math.abs(length);
startPointIndex = plus ? 0 : length - 1;
endPointIndex = plus ? length - 1 : 0;
segmentTime = bundle.getFloat("segmentTime", segmentTime);
speed = bundle.getFloat("speed", speed);
String turnTypeStr = bundle.getString("turnType", null);
if (!Algorithms.isEmpty(turnTypeStr)) {
turnType = TurnType.fromString(turnTypeStr, false);
turnType.setSkipToSpeak(bundle.getBoolean("skipTurn", turnType.isSkipToSpeak()));
turnType.setTurnAngle(bundle.getFloat("turnAngle", turnType.getTurnAngle()));
int[] turnLanes = TurnType.lanesFromString(bundle.getString("turnLanes", null));
turnType.setLanes(turnLanes);
}
object.id = bundle.getLong("id", object.id);
object.types = bundle.getIntArray("types", null);
object.pointTypes = bundle.getIntIntArray("pointTypes", null);
object.nameIds = bundle.getIntArray("names", null);
int[][] pointNames = bundle.getIntIntArray("pointNames", null);
if (pointNames != null) {
bundle.getResources().getPointNamesMap().put(object, pointNames);
}
RouteDataResources resources = bundle.getResources();
object.pointsX = new int[length];
object.pointsY = new int[length];
object.heightDistanceArray = new float[length * 2];
int index = plus ? 0 : length - 1;
float distance = 0;
Location prevLocation = null;
for (int i = 0; i < length; i++) {
Location location = resources.getLocation(index);
double dist = 0;
if (prevLocation != null) {
dist = MapUtils.getDistance(prevLocation.getLatitude(), prevLocation.getLongitude(), location.getLatitude(), location.getLongitude());
distance += dist;
}
prevLocation = location;
object.pointsX[i] = MapUtils.get31TileNumberX(location.getLongitude());
object.pointsY[i] = MapUtils.get31TileNumberY(location.getLatitude());
if (location.hasAltitude() && object.heightDistanceArray.length > 0) {
object.heightDistanceArray[i * 2] = (float) dist;
object.heightDistanceArray[i * 2 + 1] = (float) location.getAltitude();
} else {
object.heightDistanceArray = new float[0];
}
if (plus) {
index++;
} else {
index--;
}
}
this.distance = distance;
resources.incrementCurrentLocation(length - 1);
}
public float[] getHeightValues() { public float[] getHeightValues() {
float[] pf = object.calculateHeightArray(); float[] pf = object.calculateHeightArray();
if(pf == null || pf.length == 0) { if(pf == null || pf.length == 0) {

View file

@ -1,6 +1,7 @@
package net.osmand.router; package net.osmand.router;
import gnu.trove.list.array.TIntArrayList; import net.osmand.util.Algorithms;
import gnu.trove.set.hash.TIntHashSet; import gnu.trove.set.hash.TIntHashSet;
public class TurnType { public class TurnType {
@ -18,7 +19,7 @@ public class TurnType {
public static final int OFFR = 12; // Off route //$NON-NLS-1$ public static final int OFFR = 12; // Off route //$NON-NLS-1$
public static final int RNDB = 13; // Roundabout public static final int RNDB = 13; // Roundabout
public static final int RNLB = 14; // Roundabout left public static final int RNLB = 14; // Roundabout left
public static TurnType straight() { public static TurnType straight() {
return valueOf(C, false); return valueOf(C, false);
} }
@ -232,33 +233,74 @@ public class TurnType {
return (laneValue >> 10); return (laneValue >> 10);
} }
public static String toString(int[] lns) { public static String lanesToString(int[] lns) {
String s = ""; StringBuilder s = new StringBuilder();
for (int h = 0; h < lns.length; h++) { for (int h = 0; h < lns.length; h++) {
if (h > 0) { if (h > 0) {
s += "|"; s.append("|");
} }
if (lns[h] % 2 == 1) { if (lns[h] % 2 == 1) {
s += "+"; s.append("+");
} }
int pt = TurnType.getPrimaryTurn(lns[h]); int pt = TurnType.getPrimaryTurn(lns[h]);
if (pt == 0) { if (pt == 0) {
pt = 1; pt = 1;
} }
s += TurnType.valueOf(pt, false).toXmlString(); s.append(TurnType.valueOf(pt, false).toXmlString());
int st = TurnType.getSecondaryTurn(lns[h]); int st = TurnType.getSecondaryTurn(lns[h]);
if (st != 0) { if (st != 0) {
s += "," + TurnType.valueOf(st, false).toXmlString(); s.append(",").append(TurnType.valueOf(st, false).toXmlString());
} }
int tt = TurnType.getTertiaryTurn(lns[h]); int tt = TurnType.getTertiaryTurn(lns[h]);
if (tt != 0) { if (tt != 0) {
s += "," + TurnType.valueOf(tt, false).toXmlString(); s.append(",").append(TurnType.valueOf(tt, false).toXmlString());
} }
} }
s += ""; return s.toString();
return s;
} }
public static int[] lanesFromString(String lanesString) {
if (Algorithms.isEmpty(lanesString)) {
return null;
}
String[] lanesArr = lanesString.split("\\|");
int[] lanes = new int[lanesArr.length];
for (int l = 0; l < lanesArr.length; l++) {
String lane = lanesArr[l];
String[] turns = lane.split(",");
TurnType primaryTurn = null;
TurnType secondaryTurn = null;
TurnType tertiaryTurn = null;
boolean plus = false;
for (int i = 0; i < turns.length; i++) {
String turn = turns[i];
if (i == 0) {
plus = turn.length() > 0 && turn.charAt(0) == '+';
if (plus) {
turn = turn.substring(1);
}
primaryTurn = TurnType.fromString(turn, false);
} else if (i == 1) {
secondaryTurn =TurnType.fromString(turn, false);
} else if (i == 2) {
tertiaryTurn =TurnType.fromString(turn, false);
}
}
setPrimaryTurnAndReset(lanes, l, primaryTurn.value);
if (secondaryTurn != null) {
setSecondaryTurn(lanes, l, secondaryTurn.value);
}
if (tertiaryTurn != null) {
setTertiaryTurn(lanes, l, tertiaryTurn.value);
}
if (plus) {
lanes[l] |= 1;
}
}
return lanes;
}
public int[] getLanes() { public int[] getLanes() {
return lanes; return lanes;
} }
@ -331,7 +373,7 @@ public class TurnType {
} }
if(vl != null) { if(vl != null) {
if(lanes != null) { if(lanes != null) {
vl += "(" + toString(lanes) +")"; vl += "(" + lanesToString(lanes) +")";
} }
return vl; return vl;
} }

View file

@ -817,4 +817,30 @@ public class Algorithms {
return array; return array;
} }
} }
public static String arrayToString(int[] a) {
if (a == null || a.length == 0) {
return null;
}
StringBuilder b = new StringBuilder();
for (int value : a) {
if (b.length() > 0) {
b.append(",");
}
b.append(value);
}
return b.toString();
}
public static int[] stringToArray(String array) throws NumberFormatException {
if (array == null || array.length() == 0) {
return null;
}
String[] items = array.split(",");
int[] res = new int[items.length];
for (int i = 0; i < items.length; i++) {
res[i] = Integer.parseInt(items[i]);
}
return res;
}
} }

View file

@ -138,7 +138,7 @@ public class RouteResultPreparationTest {
private String getLanesString(RouteSegmentResult segment) { private String getLanesString(RouteSegmentResult segment) {
final int[] lns = segment.getTurnType().getLanes(); final int[] lns = segment.getTurnType().getLanes();
if (lns != null) { if (lns != null) {
return TurnType.toString(lns); return TurnType.lanesToString(lns);
} }
return null; return null;
} }

View file

@ -145,11 +145,11 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.0.0' implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'com.google.android.material:material:1.0.0' implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.browser:browser:1.0.0' implementation 'androidx.browser:browser:1.0.0'
implementation 'androidx.annotation:annotation:1.0.0' implementation 'androidx.annotation:annotation:1.1.0'
implementation 'commons-logging:commons-logging-api:1.1' implementation 'commons-logging:commons-logging-api:1.1'
implementation 'androidx.recyclerview:recyclerview:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.vividsolutions:jts-core:1.14.0' implementation 'com.vividsolutions:jts-core:1.14.0'
implementation("com.github.HITGIF:TextFieldBoxes:1.4.4") { implementation("com.github.HITGIF:TextFieldBoxes:1.4.5") {
exclude group: 'com.android.support' exclude group: 'com.android.support'
} }
implementation 'org.jetbrains:annotations-java5:15.0' implementation 'org.jetbrains:annotations-java5:15.0'

View file

@ -6,7 +6,7 @@
<string name="disable_monitoring">تعطيل العرض</string> <string name="disable_monitoring">تعطيل العرض</string>
<string name="location_recording_enabled">تسجيل الموقع ممكن</string> <string name="location_recording_enabled">تسجيل الموقع ممكن</string>
<string name="timeline_description">تمكين العرض لتوفير جميع المواقع في السجل.</string> <string name="timeline_description">تمكين العرض لتوفير جميع المواقع في السجل.</string>
<string name="app_name_short">متتبعOsmAnd</string> <string name="app_name_short">متتبع أوسماند</string>
<string name="shared_string_telegram">تيليجرام</string> <string name="shared_string_telegram">تيليجرام</string>
<string name="privacy_policy_use_telegram">يستخدم تيليجرام (تطبيق المراسلة) للاتصال والتواصل مع الأشخاص.</string> <string name="privacy_policy_use_telegram">يستخدم تيليجرام (تطبيق المراسلة) للاتصال والتواصل مع الأشخاص.</string>
<string name="shared_string_later">لاحقا</string> <string name="shared_string_later">لاحقا</string>

View file

@ -175,7 +175,7 @@
<string name="shared_string_telegram">Telegram</string> <string name="shared_string_telegram">Telegram</string>
<string name="privacy_policy_use_telegram">Telegram (l\'aplicación de mensaxería) emplégase pa coneutar y comunicase cola xente.</string> <string name="privacy_policy_use_telegram">Telegram (l\'aplicación de mensaxería) emplégase pa coneutar y comunicase cola xente.</string>
<string name="privacy_policy_telegram_client">El rastrexador d\'OsmAnd ye unu de los clientes qu\'emplega la plataforma abierta Telegram. Los tos contautos pueden emplegar cualquier otru cliente de Telegram.</string> <string name="privacy_policy_telegram_client">El rastrexador d\'OsmAnd ye unu de los clientes qu\'emplega la plataforma abierta Telegram. Los tos contautos pueden emplegar cualquier otru cliente de Telegram.</string>
<string name="privacy_policy_agree">Al primir siguir, aceutes les condiciones de la Política d\'intimidá de Telegram y la Política d\'intimidá d\'OsmAnd.</string> <string name="privacy_policy_agree">Al primir siguir, aceutes les condiciones de les Polítiques d\'intimidá de Telegram y d\'OsmAnd.</string>
<string name="shared_string_accept">Aceutar</string> <string name="shared_string_accept">Aceutar</string>
<string name="telegram_privacy_policy">Política d\'intimidá de Telegram</string> <string name="telegram_privacy_policy">Política d\'intimidá de Telegram</string>
<string name="osmand_privacy_policy">Política d\'intimidá d\'OsmAnd</string> <string name="osmand_privacy_policy">Política d\'intimidá d\'OsmAnd</string>
@ -235,4 +235,37 @@
<string name="last_response_duration">Cabera respuesta: va %1$s</string> <string name="last_response_duration">Cabera respuesta: va %1$s</string>
<string name="duration_ago">va %1$s</string> <string name="duration_ago">va %1$s</string>
<string name="shared_string_error_short">ERR</string> <string name="shared_string_error_short">ERR</string>
<string name="connecting_to_the_internet">Coneutando a Internet</string>
<string name="battery_optimization_description">Desactiva la optimización de la batería pa OsmAnd Tracker de mou que nun se desconecte de sópitu cuando tea en segundu planu.</string>
<string name="not_sent_yet">Inda nun s\'unvió</string>
<string name="not_found_yet">Entá nun s\'alcontró</string>
<string name="re_send_location">Re-unviar l\'allugamientu</string>
<string name="share_location_as">Compartir allugamientu como</string>
<string name="shared_string_sort">Ordenar</string>
<string name="choose_osmand">Seleiciona la versión d\'OsmAnd a utilizar</string>
<string name="time_ago">va</string>
<string name="last_response">Última respuesta</string>
<string name="logout_no_internet_msg">Conecta a Internet pa zarrar la sesión de Telegram correutamente.</string>
<string name="stop_sharing_all">Compartir ta activáu (desactivar)</string>
<string name="already_registered_in_telegram">Precises una cuenta rexistrada en Telegram y un númberu de teléfonu</string>
<string name="set_visible_time_for_all">Indica l\'horariu de visibilidá pa toos</string>
<string name="my_location_search_hint">Buscar: Grupu o contactu</string>
<string name="start_location_sharing">Compartir allugamientu</string>
<string name="show_on_map">Ver nel mapa</string>
<string name="enter_code">Escribir el códigu</string>
<string name="shared_string_login">Aniciar sesión</string>
<string name="initialization">Principiando</string>
<string name="logging_out">Zarrando sesión</string>
<string name="closing">Zarrando</string>
<string name="no_location_permission">La app nun tien permisu d\'accesu a los datos d\'allugamientu.</string>
<string name="location_service_no_gps_available">Seleiciona unu de los fornidores d\'allugamientu pa compartir el to allugamientu.</string>
<string name="osmand_service">Mou en segundu planu</string>
<string name="share_location">Compartir allugamientu</string>
<string name="show_users_on_map">Amosar usuarios nel mapa</string>
<string name="active_chats">Charres actives</string>
<string name="saved_messages">Mensaxes guardaos</string>
<string name="unit_of_length_descr">Cambia les unidaes de midida de distancia.</string>
<string name="unit_of_length">Unidaes de llonxitú</string>
<string name="unit_of_speed_system_descr">Definir la unidá de velocidá.</string>
<string name="unit_of_speed_system">Unidá de velocidá</string>
</resources> </resources>

View file

@ -46,7 +46,7 @@
<string name="closing">S\'està tancant</string> <string name="closing">S\'està tancant</string>
<string name="app_name_short">Rastrejador OsmAnd</string> <string name="app_name_short">Rastrejador OsmAnd</string>
<string name="privacy_policy_telegram_client">El rastrejador d\'OsmAnd és un dels clients que usen la plataforma oberta de Telegram. Els vostres contactes poden usar qualsevol altra client de Telegram.</string> <string name="privacy_policy_telegram_client">El rastrejador d\'OsmAnd és un dels clients que usen la plataforma oberta de Telegram. Els vostres contactes poden usar qualsevol altra client de Telegram.</string>
<string name="privacy_policy_agree">En clicar \"Continua\" accepteu les condicions de les polítiques de privadesa de Telegram i d\'OsmAnd.</string> <string name="privacy_policy_agree">En clicar \"Continua\" accepteu les condicions en política de privadesa, tant de Telegram com d\'OsmAnd.</string>
<string name="shared_string_accept">D\'acord</string> <string name="shared_string_accept">D\'acord</string>
<string name="telegram_privacy_policy">Política de Privadesa de Telegram</string> <string name="telegram_privacy_policy">Política de Privadesa de Telegram</string>
<string name="osmand_privacy_policy">Política de Privadesa d\'OsmAnd</string> <string name="osmand_privacy_policy">Política de Privadesa d\'OsmAnd</string>
@ -249,12 +249,12 @@
<string name="set_time_timeline_descr">Seleccioneu la durada a mostrar</string> <string name="set_time_timeline_descr">Seleccioneu la durada a mostrar</string>
<string name="start_end_date">Data d\' Inici — Fi</string> <string name="start_end_date">Data d\' Inici — Fi</string>
<string name="saved_messages">Missatges desats</string> <string name="saved_messages">Missatges desats</string>
<string name="time_zone_descr">Seleccioneu fus horari per mostrar en els vostres missatges d\'ubicació.</string> <string name="time_zone_descr">Trieu la zona horària a mostrar en els missatges d\'ubicació.</string>
<string name="time_zone">Fus horari</string> <string name="time_zone">Zona horària</string>
<string name="units_and_formats">Unitats i formats</string> <string name="units_and_formats">Unitats i formats</string>
<string name="unit_of_length_descr">Canvieu en què es mesuren les distàncies.</string> <string name="unit_of_length_descr">Canvieu en què es mesuren les distàncies.</string>
<string name="unit_of_length">Unitats de longitud</string> <string name="unit_of_length">Unitats de longitud</string>
<string name="unit_of_speed_system_descr">Establiu la unitat de velocitat.</string> <string name="unit_of_speed_system_descr">Definiu la unitat de velocitat.</string>
<string name="unit_of_speed_system">Unitat de velocitat</string> <string name="unit_of_speed_system">Unitat de velocitat</string>
<string name="buffer_time_descr">Temps màxim per mantenir punts a la memòria intermèdia</string> <string name="buffer_time_descr">Temps màxim per mantenir punts a la memòria intermèdia</string>
<string name="buffer_time">Temps de caducitat de la memòria intermèdia</string> <string name="buffer_time">Temps de caducitat de la memòria intermèdia</string>

View file

@ -72,4 +72,5 @@
<string name="units_and_formats">یکاها و قالب‌ها</string> <string name="units_and_formats">یکاها و قالب‌ها</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

@ -0,0 +1,147 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="last_update_from_telegram_date">Dernière mise à jour de Telegram : %1$s</string>
<string name="last_response_date">Dernière réponse : %1$s</string>
<string name="back_to_osmand">Retour à OsmAnd</string>
<string name="shared_string_suggested">Suggéré</string>
<string name="time_zone_descr">Choisissez le fuseau horaire à afficher dans vos messages de localisation.</string>
<string name="time_zone">Fuseau horaire</string>
<string name="units_and_formats">Unités et formats</string>
<string name="unit_of_length_descr">Modifier l\'unité de mesure de distance.</string>
<string name="unit_of_length">Unités de longueur</string>
<string name="unit_of_speed_system_descr">Définit l\'unité de vitesse.</string>
<string name="unit_of_speed_system">Unité de vitesse</string>
<string name="saved_messages">Messages enregistrés</string>
<string name="shared_string_end">Fin</string>
<string name="shared_string_start">Début</string>
<string name="shared_string_apply">Appliquer</string>
<string name="set_time_timeline_descr">Sélectionnez l\'heure à afficher</string>
<string name="start_end_date">Date de Début — Fin</string>
<string name="timeline_no_data">Aucune donnée</string>
<string name="shared_string_select">Sélectionner</string>
<string name="gpx_settings">Paramètres GPX</string>
<string name="proxy_key">Clé</string>
<string name="proxy_password">Mot de passe</string>
<string name="proxy_username">Identifiant utilisateur</string>
<string name="proxy_port">Port</string>
<string name="proxy_server">Serveur</string>
<string name="shared_string_connection">Connexion</string>
<string name="shared_string_enable">Activer</string>
<string name="proxy_connected">Connecté</string>
<string name="proxy_disconnected">Déconnecté</string>
<string name="direction">Direction</string>
<string name="precision">Précision</string>
<string name="altitude">Altitude</string>
<string name="bearing">Cap</string>
<string name="shared_string_search">Rechercher</string>
<string name="shared_string_ok">OK</string>
<string name="location_recording_enabled">Enregistrement de la positon activé</string>
<string name="shared_string_telegram">Telegram</string>
<string name="shared_string_accept">Accepter</string>
<string name="shared_string_appearance">Apparence</string>
<string name="show_gps_points">Afficher les points GPS</string>
<string name="show_gps_points_descr">Affiche le nombre de points GPS collectés et envoyés.</string>
<string name="shared_string_update">Mettre à jour</string>
<string name="points_size">%1$d points</string>
<string name="shared_string_date">Date</string>
<string name="shared_string_collected">Collecté</string>
<string name="gps_points">Points GPS</string>
<string name="shared_string_sent">Envoyé</string>
<string name="time_on_the_move">Durée de déplacement</string>
<string name="average_altitude">Altitude moyenne</string>
<string name="average_speed">Vitesse moyenne</string>
<string name="end_date">Date de fin</string>
<string name="start_date">Date de début</string>
<string name="shared_string_map">Carte</string>
<string name="shared_string_text">Texte</string>
<string name="map_and_text">Carte et texte</string>
<string name="device_added_successfully">%1$s ajouté.</string>
<string name="shared_string_add">Ajouter</string>
<string name="error_adding_new_device">Impossible d\'ajouter un nouveau périphérique</string>
<string name="device_name_is_too_long">Le nom de l\'appareil est trop long</string>
<string name="device_name_cannot_be_empty">Le nom de lappareil ne peut pas être vide</string>
<string name="device_name">Nom d\'appareil</string>
<string name="shared_string_hide">Masquer</string>
<string name="my_location">Ma position</string>
<string name="last_response">Dernière réponse</string>
<string name="shared_string_group">Groupe</string>
<string name="shared_string_close">Fermer</string>
<string name="connected_account">Compte connecté</string>
<string name="shared_string_account">Compte</string>
<string name="location_history">Historique de localisation</string>
<string name="stale_location">Immobile</string>
<string name="send_my_location">Envoyer ma localisation</string>
<string name="gps_and_location">Position</string>
<string name="shared_string_error_short">ERR</string>
<string name="last_update_from_telegram_duration">Dernière mise à jour de Telegram : il y a %1$s</string>
<string name="last_response_duration">Dernière réponse : il y a %1$s</string>
<string name="duration_ago">il y a %1$s</string>
<string name="status_widget_title">État du pisteur OsmAnd</string>
<string name="buffer_time_descr">Durée maximale de stockage de points dans le tampon</string>
<string name="buffer_time">Date d\'expiration du tampon</string>
<string name="timeline_no_data_descr">Nous n\'avons pas collecté de données pour le jour sélectionné</string>
<string name="min_logging_distance">Distance minimum pour l\'enregistrement</string>
<string name="min_logging_distance_descr">Filtre : distance minimale entre deux points d\'enregistrement</string>
<string name="min_logging_accuracy">Précision minimale pour l\'enregistrement</string>
<string name="min_logging_accuracy_descr">Filtre : pas d\'enregistrement tant que la précision n\'est pas atteinte</string>
<string name="min_logging_speed">Vitesse minimale pour l\'enregistrement</string>
<string name="min_logging_speed_descr">Filtre : pas d\'enregistrement en dessous de la vitesse choisie</string>
<string name="proxy_credentials">Authentification</string>
<string name="proxy_type">Type de mandataire</string>
<string name="proxy_settings">Paramètres de serveur mandataire</string>
<string name="proxy">Serveur mandataire</string>
<string name="privacy">Vie privée</string>
<string name="search_contacts">Rechercher des contacts</string>
<string name="search_contacts_descr">Rechercher parmi tous vos groupes et contacts.</string>
<string name="type_contact_or_group_name">Saisissez le nom d\'un contact ou d\'un groupe</string>
<string name="timeline_available_for_free_now">La timeline est maintenant disponible gratuitement.</string>
<string name="disable_monitoring">Désactiver le suivi</string>
<string name="timeline_description">Activer le suivi pour enregistrer tous les emplacements dans l\'historique.</string>
<string name="app_name_short">OsmAnd Tracker</string>
<string name="privacy_policy_use_telegram">Telegram (l\'application de messagerie) est utilisée pour se connecter et communiquer avec d\'autres personnes.</string>
<string name="privacy_policy_telegram_client">OsmAnd tracker est l\'un des clients qui utilise la plateforme ouverte Telegram. Vos contacts peuvent utiliser n\'importe quel autre client Telegram.</string>
<string name="privacy_policy_agree">En appuyant sur « Continuer » vous acceptez les conditions des politiques de confidentialité de Telegram et d\'OsmAnd.</string>
<string name="telegram_privacy_policy">Politique de confidentialité de Telegram</string>
<string name="osmand_privacy_policy">Politique de confidentialité d\'OsmAnd</string>
<string name="how_it_works">Comment cela fonctionne</string>
<string name="received_gps_points">Points GPX reçus : %1$s</string>
<string name="please_update_osmand">Mettez à jour OsmAnd pour visualiser les données sur la carte</string>
<string name="gps_points_in_buffer">envoyé (%1$d dans le tampon)</string>
<string name="monitoring_is_enabled">Enregistrement activé</string>
<string name="shared_string_enabled">Activé</string>
<string name="shared_string_status">Statut</string>
<string name="shared_string_disable">Désactiver</string>
<string name="shared_string_save">Enregistrer</string>
<string name="shared_string_name">Nom</string>
<string name="shared_string_sort">Trier</string>
<string name="shared_string_exit">Quitter</string>
<string name="shared_string_all">Tout</string>
<string name="shared_string_off">Inactif</string>
<string name="shared_string_install">Installer</string>
<string name="shared_string_share">Partager</string>
<string name="shared_string_back">Retour</string>
<string name="shared_string_continue">Continuer</string>
<string name="shared_string_cancel">Annuler</string>
<string name="shared_string_settings">Paramètres</string>
<string name="yard">yd</string>
<string name="foot">ft</string>
<string name="mile">mi</string>
<string name="km">km</string>
<string name="m">m</string>
<string name="nm">mn</string>
<string name="min_mile">min/m</string>
<string name="min_km">min/km</string>
<string name="m_s">m/s</string>
<string name="km_h">km/h</string>
<string name="mile_per_hour">mph</string>
<string name="si_kmh">Kilomètres par heure</string>
<string name="si_mph">Miles par heure</string>
<string name="si_m_s">Mètres par seconde</string>
<string name="si_min_km">Minutes par kilomètre</string>
<string name="si_min_m">Minutes par mile</string>
<string name="si_mi_feet">Miles/pieds</string>
<string name="si_mi_yard">Miles/yards</string>
<string name="si_km_m">Kilomètres/mètres</string>
<string name="si_nm">Miles nautiques</string>
<string name="si_mi_meters">Miles / Mètres</string>
</resources>

View file

@ -243,7 +243,7 @@
<string name="min_logging_speed">Minimalna szybkość rejestrowania</string> <string name="min_logging_speed">Minimalna szybkość rejestrowania</string>
<string name="min_logging_speed_descr">Filtr: brak rejestrowania poniżej wybranej prędkości</string> <string name="min_logging_speed_descr">Filtr: brak rejestrowania poniżej wybranej prędkości</string>
<string name="gpx_settings">Ustawienia GPX</string> <string name="gpx_settings">Ustawienia GPX</string>
<string name="timeline_no_data_descr">Nie zgromadziliśmy danych dla wybranego dnia</string> <string name="timeline_no_data_descr">Nie zebraliśmy danych dla wybranego dnia</string>
<string name="timeline_no_data">Brak danych</string> <string name="timeline_no_data">Brak danych</string>
<string name="shared_string_end">Koniec</string> <string name="shared_string_end">Koniec</string>
<string name="shared_string_apply">Zastosuj</string> <string name="shared_string_apply">Zastosuj</string>
@ -267,4 +267,6 @@
<string name="last_update_from_telegram_duration">Ostatnia aktualizacja z Telegramu: %1$s temu</string> <string name="last_update_from_telegram_duration">Ostatnia aktualizacja z Telegramu: %1$s temu</string>
<string name="duration_ago">%1$s temu</string> <string name="duration_ago">%1$s temu</string>
<string name="shared_string_error_short">ERR</string> <string name="shared_string_error_short">ERR</string>
<string name="last_response_date">Ostatnia odpowiedź: %1$s</string>
<string name="last_response_duration">Ostatnia odpowiedź: %1$s temu</string>
</resources> </resources>

View file

@ -156,7 +156,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"> <b>OsmAnd Tracker</b> дозволяє Вам транслювати свою позицію та бачити позицію інших в OsmAnd.<br/> <br/>Застосунок використовує Telegram API та потребує облікового запису Telegram.</string> <string name="welcome_descr"><b>OsmAnd Tracker</b> дозволяє Вам транслювати свою позицію та бачити позицію інших в OsmAnd.<br/><br/>Застосунок використовує Telegram API та потребує облікового запису Telegram.</string>
<string name="my_location">Моя позиція</string> <string name="my_location">Моя позиція</string>
<string name="send_my_location_desc">Встановіть мінімальний інтервал між надсиланням позиції.</string> <string name="send_my_location_desc">Встановіть мінімальний інтервал між надсиланням позиції.</string>
<string name="expire_at">Діє до</string> <string name="expire_at">Діє до</string>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 939 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 984 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/empty_hint_bg" />
<corners android:radius="3dp" />
</shape>
</item>
</selector>

View file

@ -1,10 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp" android:width="36dp"
android:height="40dp" android:height="36dp"
android:viewportWidth="40" android:viewportWidth="36"
android:viewportHeight="40"> android:viewportHeight="36">
<path <path
android:pathData="M20,40C31.0457,40 40,31.0457 40,20C40,8.9543 31.0457,0 20,0C8.9543,0 0,8.9543 0,20C0,31.0457 8.9543,40 20,40Z" android:pathData="M18,36C27.9411,36 36,27.9411 36,18C36,8.0589 27.9411,0 18,0C8.0589,0 0,8.0589 0,18C0,27.9411 8.0589,36 18,36Z"
android:fillColor="#727272" android:fillColor="#727272"
android:fillType="evenOdd"/> android:fillType="evenOdd"/>
</vector> </vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="34dp"
android:height="34dp"
android:viewportWidth="34"
android:viewportHeight="34">
<path
android:pathData="M9,0H25L34,9V25L25,34H9L0,25V9L9,0Z"
android:fillColor="#727272"/>
</vector>

View file

@ -1,9 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp" android:width="32dp"
android:height="40dp" android:height="32dp"
android:viewportWidth="40" android:viewportWidth="32"
android:viewportHeight="40"> android:viewportHeight="32">
<path <path
android:pathData="M4,1L36,1A3,3 0,0 1,39 4L39,36A3,3 0,0 1,36 39L4,39A3,3 0,0 1,1 36L1,4A3,3 0,0 1,4 1z" android:pathData="M3,0L29,0A3,3 0,0 1,32 3L32,29A3,3 0,0 1,29 32L3,32A3,3 0,0 1,0 29L0,3A3,3 0,0 1,3 0z"
android:fillColor="#727272"/> android:fillColor="#727272"/>
</vector> </vector>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/switch_button_active" />
<corners android:bottomLeftRadius="4dp" android:topLeftRadius="4dp" />
<stroke android:width="1dp" android:color="@color/switch_button_active_stroke" />
</shape>
</item>
</selector>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/transparent" />
<corners android:bottomLeftRadius="4dp" android:topLeftRadius="4dp" />
<stroke android:width="1dp" android:color="?attr/secondary_icon_color" />
</shape>
</item>
</selector>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/switch_button_active" />
<corners android:bottomRightRadius="4dp" android:topRightRadius="4dp" />
<stroke android:width="1dp" android:color="@color/switch_button_active_stroke" />
</shape>
</item>
</selector>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/transparent" />
<corners android:bottomRightRadius="4dp" android:topRightRadius="4dp" />
<stroke android:width="1dp" android:color="?attr/secondary_icon_color" />
</shape>
</item>
</selector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
<path
android:pathData="M5,6.7324C5.5978,6.3866 6,5.7403 6,5C6,3.8954 5.1046,3 4,3C2.8954,3 2,3.8954 2,5C2,5.7403 2.4022,6.3866 3,6.7324V11C3,12.6569 4.3432,14 6,14C7.6568,14 9,12.6569 9,11V6C9,5.4477 9.4477,5 10,5C10.5523,5 11,5.4477 11,6V10.2676C10.4022,10.6134 10,11.2597 10,12C10,13.1046 10.8954,14 12,14C13.1046,14 14,13.1046 14,12C14,11.2597 13.5978,10.6134 13,10.2676V6C13,4.3432 11.6569,3 10,3C8.3432,3 7,4.3432 7,6V11C7,11.5523 6.5523,12 6,12C5.4477,12 5,11.5523 5,11V6.7324Z"
android:fillColor="#727272"
android:fillType="evenOdd"/>
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M13.5858,5.8284C14.3668,5.0474 15.6332,5.0474 16.4142,5.8284C16.7893,6.2035 17,6.7122 17,7.2426V13C17,13.0565 17.0047,13.1119 17.0137,13.1659C15.8414,13.5739 15,14.6887 15,16C15,17.6569 16.3431,19 18,19C19.6569,19 21,17.6569 21,16C21,14.6887 20.1586,13.5739 18.9863,13.1659C18.9953,13.1119 19,13.0565 19,13V7.2426C19,6.1818 18.5786,5.1644 17.8284,4.4142C16.2663,2.8521 13.7337,2.8521 12.1716,4.4142C11.4214,5.1644 11,6.1818 11,7.2426V16.7574C11,17.2878 10.7893,17.7965 10.4142,18.1716C9.6332,18.9526 8.3668,18.9526 7.5858,18.1716C7.2107,17.7965 7,17.2878 7,16.7574V11C7,10.9435 6.9953,10.8881 6.9863,10.8341C8.1586,10.4262 9,9.3113 9,8C9,6.3432 7.6568,5 6,5C4.3432,5 3,6.3432 3,8C3,9.3113 3.8414,10.4262 5.0137,10.8341C5.0047,10.8881 5,10.9435 5,11V16.7574C5,17.8182 5.4214,18.8356 6.1716,19.5858C7.7337,21.1479 10.2663,21.1479 11.8284,19.5858C12.5786,18.8356 13,17.8182 13,16.7574V7.2426C13,6.7122 13.2107,6.2035 13.5858,5.8284ZM7,8C7,8.5523 6.5523,9 6,9C5.4477,9 5,8.5523 5,8C5,7.4477 5.4477,7 6,7C6.5523,7 7,7.4477 7,8ZM19,16C19,16.5523 18.5523,17 18,17C17.4477,17 17,16.5523 17,16C17,15.4477 17.4477,15 18,15C18.5523,15 19,15.4477 19,16Z"
android:fillColor="#727272"
android:fillType="evenOdd"/>
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
<path
android:pathData="M15,8C15,11.866 11.866,15 8,15C4.134,15 1,11.866 1,8C1,4.134 4.134,1 8,1C11.866,1 15,4.134 15,8ZM13,8C13,10.7614 10.7614,13 8,13C5.2386,13 3,10.7614 3,8C3,5.2386 5.2386,3 8,3C10.7614,3 13,5.2386 13,8ZM9,6C9,5.4477 8.5523,5 8,5C7.4477,5 7,5.4477 7,6V8C7,8.3788 7.214,8.725 7.5528,8.8944L9.5528,9.8944C10.0468,10.1414 10.6474,9.9412 10.8944,9.4472C11.1414,8.9532 10.9412,8.3526 10.4472,8.1056L9,7.382V6Z"
android:fillColor="#727272"
android:fillType="evenOdd"/>
</vector>

View file

@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M13.5858,18.1716C14.3668,18.9526 15.6332,18.9526 16.4142,18.1716C16.7893,17.7965 17,17.2878 17,16.7574V11C17,10.4477 17.4477,10 18,10C18.5523,10 19,10.4477 19,11V16.7574C19,17.8183 18.5786,18.8357 17.8284,19.5858C16.2663,21.1479 13.7337,21.1479 12.1716,19.5858C11.4214,18.8357 11,17.8183 11,16.7574V7.2427C11,6.7122 10.7893,6.2035 10.4142,5.8285C9.6332,5.0474 8.3668,5.0474 7.5858,5.8285C7.2107,6.2035 7,6.7122 7,7.2427V13C7,13.0565 6.9953,13.112 6.9863,13.1659C8.1586,13.5739 9,14.6887 9,16C9,17.6569 7.6568,19 6,19C4.3432,19 3,17.6569 3,16C3,14.6887 3.8414,13.5739 5.0137,13.1659C5.0047,13.112 5,13.0565 5,13V7.2427C5,6.1818 5.4214,5.1644 6.1716,4.4142C7.7337,2.8521 10.2663,2.8521 11.8284,4.4142C12.5786,5.1644 13,6.1818 13,7.2427V16.7574C13,17.2878 13.2107,17.7965 13.5858,18.1716ZM6,15C6.5523,15 7,15.4477 7,16C7,16.5523 6.5523,17 6,17C5.4477,17 5,16.5523 5,16C5,15.4477 5.4477,15 6,15Z"
android:fillColor="#727272"
android:fillType="evenOdd"/>
<path
android:pathData="M18,12L16.1708,12.9146C16.0585,12.9708 15.9346,13.0001 15.809,13.0001C15.3622,13.0001 15,12.6379 15,12.1911V12.1667C15,12.0566 15.0218,11.9477 15.0641,11.8461L17.3074,6.4623C17.424,6.1824 17.6975,6 18.0008,6C18.3033,6 18.5762,6.1814 18.6934,6.4602L20.9318,11.7877C20.9768,11.8949 21,12.0099 21,12.1262V12.191C21,12.6378 20.6378,13 20.191,13C20.0654,13 19.9415,12.9708 19.8292,12.9146L18,12Z"
android:fillColor="#727272"/>
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
<path
android:pathData="M14,5.5455L5,1V5V11V15H7V9.7879L14,5.5455Z"
android:fillColor="#727272"
android:fillType="evenOdd"/>
</vector>

View file

@ -0,0 +1,102 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="328dp"
android:height="73dp"
android:viewportWidth="328"
android:viewportHeight="73">
<path
android:pathData="M0,0h328v48h-328z">
<aapt:attr name="android:fillColor">
<gradient
android:startY="24"
android:startX="2.13832E-6"
android:endY="24"
android:endX="328"
android:type="linear">
<item android:offset="0" android:color="#FFFFFFFF"/>
<item android:offset="0.146341" android:color="#FF2EB900"/>
<item android:offset="0.278963" android:color="#FFFFDE02"/>
<item android:offset="0.567073" android:color="#FFFF0101"/>
<item android:offset="0.998611" android:color="#FF8201FF"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M7.068,64.755C7.068,66.236 6.815,67.337 6.31,68.057C5.804,68.777 5.013,69.137 3.938,69.137C2.876,69.137 2.09,68.786 1.579,68.084C1.069,67.378 0.804,66.325 0.786,64.926V63.237C0.786,61.774 1.039,60.688 1.545,59.977C2.051,59.266 2.844,58.91 3.924,58.91C4.995,58.91 5.783,59.254 6.289,59.942C6.795,60.626 7.055,61.683 7.068,63.114V64.755ZM5.804,63.025C5.804,61.954 5.653,61.175 5.353,60.688C5.052,60.195 4.576,59.949 3.924,59.949C3.277,59.949 2.805,60.193 2.509,60.681C2.213,61.168 2.06,61.918 2.051,62.93V64.953C2.051,66.029 2.206,66.824 2.516,67.339C2.83,67.849 3.304,68.104 3.938,68.104C4.562,68.104 5.024,67.863 5.325,67.38C5.631,66.897 5.79,66.136 5.804,65.097V63.025Z"
android:fillColor="#727272"/>
<path
android:pathData="M9.03,60.688C9.03,60.214 9.199,59.799 9.536,59.443C9.878,59.088 10.29,58.91 10.773,58.91C11.247,58.91 11.65,59.088 11.983,59.443C12.32,59.794 12.489,60.209 12.489,60.688C12.489,61.171 12.32,61.583 11.983,61.925C11.65,62.267 11.247,62.438 10.773,62.438C10.295,62.438 9.884,62.267 9.543,61.925C9.201,61.583 9.03,61.171 9.03,60.688ZM10.773,61.563C11.019,61.563 11.227,61.483 11.395,61.323C11.564,61.159 11.648,60.947 11.648,60.688C11.648,60.423 11.564,60.207 11.395,60.038C11.227,59.865 11.019,59.778 10.773,59.778C10.523,59.778 10.311,59.869 10.137,60.052C9.969,60.229 9.884,60.441 9.884,60.688C9.884,60.934 9.969,61.141 10.137,61.31C10.311,61.478 10.523,61.563 10.773,61.563Z"
android:fillColor="#727272"/>
<path
android:pathData="M43.837,63.408H44.787C45.384,63.399 45.854,63.242 46.196,62.937C46.537,62.631 46.708,62.219 46.708,61.699C46.708,60.533 46.127,59.949 44.965,59.949C44.418,59.949 43.981,60.106 43.653,60.421C43.329,60.731 43.167,61.143 43.167,61.658H41.903C41.903,60.87 42.19,60.216 42.764,59.696C43.343,59.172 44.076,58.91 44.965,58.91C45.904,58.91 46.64,59.159 47.173,59.655C47.706,60.152 47.973,60.842 47.973,61.727C47.973,62.16 47.832,62.579 47.549,62.984C47.271,63.39 46.891,63.693 46.408,63.894C46.954,64.067 47.376,64.354 47.672,64.755C47.973,65.156 48.123,65.646 48.123,66.225C48.123,67.118 47.832,67.826 47.248,68.351C46.665,68.875 45.906,69.137 44.972,69.137C44.038,69.137 43.277,68.884 42.689,68.378C42.105,67.872 41.814,67.204 41.814,66.375H43.085C43.085,66.899 43.256,67.318 43.598,67.633C43.94,67.947 44.398,68.104 44.972,68.104C45.583,68.104 46.05,67.945 46.373,67.626C46.697,67.307 46.859,66.849 46.859,66.252C46.859,65.673 46.681,65.229 46.326,64.919C45.97,64.609 45.457,64.45 44.787,64.44H43.837V63.408Z"
android:fillColor="#727272"/>
<path
android:pathData="M50.201,60.688C50.201,60.214 50.37,59.799 50.707,59.443C51.049,59.088 51.461,58.91 51.944,58.91C52.418,58.91 52.822,59.088 53.154,59.443C53.492,59.794 53.66,60.209 53.66,60.688C53.66,61.171 53.492,61.583 53.154,61.925C52.822,62.267 52.418,62.438 51.944,62.438C51.466,62.438 51.056,62.267 50.714,61.925C50.372,61.583 50.201,61.171 50.201,60.688ZM51.944,61.563C52.19,61.563 52.398,61.483 52.566,61.323C52.735,61.159 52.819,60.947 52.819,60.688C52.819,60.423 52.735,60.207 52.566,60.038C52.398,59.865 52.19,59.778 51.944,59.778C51.694,59.778 51.482,59.869 51.309,60.052C51.14,60.229 51.056,60.441 51.056,60.688C51.056,60.934 51.14,61.141 51.309,61.31C51.482,61.478 51.694,61.563 51.944,61.563Z"
android:fillColor="#727272"/>
<path
android:pathData="M89.084,69H87.812V60.571L85.263,61.508V60.359L88.886,58.999H89.084V69Z"
android:fillColor="#727272"/>
<path
android:pathData="M99.31,64.755C99.31,66.236 99.057,67.337 98.551,68.057C98.046,68.777 97.255,69.137 96.179,69.137C95.118,69.137 94.331,68.786 93.821,68.084C93.311,67.378 93.046,66.325 93.028,64.926V63.237C93.028,61.774 93.281,60.688 93.787,59.977C94.293,59.266 95.086,58.91 96.166,58.91C97.237,58.91 98.025,59.254 98.531,59.942C99.037,60.626 99.297,61.683 99.31,63.114V64.755ZM98.046,63.025C98.046,61.954 97.895,61.175 97.594,60.688C97.294,60.195 96.817,59.949 96.166,59.949C95.519,59.949 95.047,60.193 94.751,60.681C94.454,61.168 94.302,61.918 94.293,62.93V64.953C94.293,66.029 94.448,66.824 94.757,67.339C95.072,67.849 95.546,68.104 96.179,68.104C96.804,68.104 97.266,67.863 97.567,67.38C97.872,66.897 98.032,66.136 98.046,65.097V63.025Z"
android:fillColor="#727272"/>
<path
android:pathData="M101.272,60.688C101.272,60.214 101.44,59.799 101.778,59.443C102.119,59.088 102.532,58.91 103.015,58.91C103.489,58.91 103.892,59.088 104.225,59.443C104.562,59.794 104.731,60.209 104.731,60.688C104.731,61.171 104.562,61.583 104.225,61.925C103.892,62.267 103.489,62.438 103.015,62.438C102.536,62.438 102.126,62.267 101.785,61.925C101.443,61.583 101.272,61.171 101.272,60.688ZM103.015,61.563C103.261,61.563 103.468,61.483 103.637,61.323C103.806,61.159 103.89,60.947 103.89,60.688C103.89,60.423 103.806,60.207 103.637,60.038C103.468,59.865 103.261,59.778 103.015,59.778C102.764,59.778 102.552,59.869 102.379,60.052C102.211,60.229 102.126,60.441 102.126,60.688C102.126,60.934 102.211,61.141 102.379,61.31C102.552,61.478 102.764,61.563 103.015,61.563Z"
android:fillColor="#727272"/>
<path
android:pathData="M182.767,63.408H183.717C184.314,63.399 184.783,63.242 185.125,62.937C185.467,62.631 185.638,62.219 185.638,61.699C185.638,60.533 185.057,59.949 183.894,59.949C183.348,59.949 182.91,60.106 182.582,60.421C182.258,60.731 182.097,61.143 182.097,61.658H180.832C180.832,60.87 181.119,60.216 181.693,59.696C182.272,59.172 183.006,58.91 183.894,58.91C184.833,58.91 185.569,59.159 186.102,59.655C186.636,60.152 186.902,60.842 186.902,61.727C186.902,62.16 186.761,62.579 186.478,62.984C186.2,63.39 185.82,63.693 185.337,63.894C185.884,64.067 186.305,64.354 186.601,64.755C186.902,65.156 187.053,65.646 187.053,66.225C187.053,67.118 186.761,67.826 186.178,68.351C185.594,68.875 184.836,69.137 183.901,69.137C182.967,69.137 182.206,68.884 181.618,68.378C181.035,67.872 180.743,67.204 180.743,66.375H182.015C182.015,66.899 182.185,67.318 182.527,67.633C182.869,67.947 183.327,68.104 183.901,68.104C184.512,68.104 184.979,67.945 185.303,67.626C185.626,67.307 185.788,66.849 185.788,66.252C185.788,65.673 185.61,65.229 185.255,64.919C184.899,64.609 184.387,64.45 183.717,64.44H182.767V63.408Z"
android:fillColor="#727272"/>
<path
android:pathData="M195.31,64.755C195.31,66.236 195.057,67.337 194.551,68.057C194.046,68.777 193.255,69.137 192.179,69.137C191.117,69.137 190.331,68.786 189.821,68.084C189.311,67.378 189.046,66.325 189.028,64.926V63.237C189.028,61.774 189.281,60.688 189.787,59.977C190.293,59.266 191.086,58.91 192.166,58.91C193.237,58.91 194.025,59.254 194.531,59.942C195.037,60.626 195.297,61.683 195.31,63.114V64.755ZM194.046,63.025C194.046,61.954 193.895,61.175 193.594,60.688C193.294,60.195 192.817,59.949 192.166,59.949C191.519,59.949 191.047,60.193 190.751,60.681C190.454,61.168 190.302,61.918 190.293,62.93V64.953C190.293,66.029 190.448,66.824 190.757,67.339C191.072,67.849 191.546,68.104 192.179,68.104C192.804,68.104 193.266,67.863 193.567,67.38C193.872,66.897 194.032,66.136 194.046,65.097V63.025Z"
android:fillColor="#727272"/>
<path
android:pathData="M197.272,60.688C197.272,60.214 197.44,59.799 197.778,59.443C198.119,59.088 198.532,58.91 199.015,58.91C199.489,58.91 199.892,59.088 200.225,59.443C200.562,59.794 200.731,60.209 200.731,60.688C200.731,61.171 200.562,61.583 200.225,61.925C199.892,62.267 199.489,62.438 199.015,62.438C198.536,62.438 198.126,62.267 197.785,61.925C197.443,61.583 197.272,61.171 197.272,60.688ZM199.015,61.563C199.261,61.563 199.468,61.483 199.637,61.323C199.806,61.159 199.89,60.947 199.89,60.688C199.89,60.423 199.806,60.207 199.637,60.038C199.468,59.865 199.261,59.778 199.015,59.778C198.764,59.778 198.552,59.869 198.379,60.052C198.211,60.229 198.126,60.441 198.126,60.688C198.126,60.934 198.211,61.141 198.379,61.31C198.552,61.478 198.764,61.563 199.015,61.563Z"
android:fillColor="#727272"/>
<path
android:pathData="M135.449,69H128.928V68.091L132.373,64.263C132.883,63.684 133.234,63.215 133.426,62.854C133.622,62.49 133.72,62.114 133.72,61.727C133.72,61.207 133.562,60.781 133.248,60.448C132.934,60.116 132.514,59.949 131.99,59.949C131.361,59.949 130.871,60.129 130.52,60.489C130.174,60.845 130.001,61.341 130.001,61.979H128.736C128.736,61.063 129.03,60.323 129.618,59.758C130.211,59.193 131.001,58.91 131.99,58.91C132.915,58.91 133.647,59.154 134.184,59.642C134.722,60.125 134.991,60.77 134.991,61.576C134.991,62.556 134.367,63.723 133.118,65.076L130.452,67.968H135.449V69Z"
android:fillColor="#727272"/>
<path
android:pathData="M143.31,64.755C143.31,66.236 143.057,67.337 142.551,68.057C142.046,68.777 141.255,69.137 140.179,69.137C139.117,69.137 138.331,68.786 137.821,68.084C137.311,67.378 137.046,66.325 137.028,64.926V63.237C137.028,61.774 137.281,60.688 137.787,59.977C138.293,59.266 139.086,58.91 140.166,58.91C141.237,58.91 142.025,59.254 142.531,59.942C143.037,60.626 143.297,61.683 143.31,63.114V64.755ZM142.046,63.025C142.046,61.954 141.895,61.175 141.594,60.688C141.294,60.195 140.817,59.949 140.166,59.949C139.519,59.949 139.047,60.193 138.751,60.681C138.454,61.168 138.302,61.918 138.293,62.93V64.953C138.293,66.029 138.448,66.824 138.757,67.339C139.072,67.849 139.546,68.104 140.179,68.104C140.804,68.104 141.266,67.863 141.567,67.38C141.872,66.897 142.032,66.136 142.046,65.097V63.025Z"
android:fillColor="#727272"/>
<path
android:pathData="M145.272,60.688C145.272,60.214 145.44,59.799 145.778,59.443C146.119,59.088 146.532,58.91 147.015,58.91C147.489,58.91 147.892,59.088 148.225,59.443C148.562,59.794 148.731,60.209 148.731,60.688C148.731,61.171 148.562,61.583 148.225,61.925C147.892,62.267 147.489,62.438 147.015,62.438C146.536,62.438 146.126,62.267 145.785,61.925C145.443,61.583 145.272,61.171 145.272,60.688ZM147.015,61.563C147.261,61.563 147.468,61.483 147.637,61.323C147.806,61.159 147.89,60.947 147.89,60.688C147.89,60.423 147.806,60.207 147.637,60.038C147.468,59.865 147.261,59.778 147.015,59.778C146.764,59.778 146.552,59.869 146.379,60.052C146.211,60.229 146.126,60.441 146.126,60.688C146.126,60.934 146.211,61.141 146.379,61.31C146.552,61.478 146.764,61.563 147.015,61.563Z"
android:fillColor="#727272"/>
<path
android:pathData="M243.267,65.657H244.647V66.689H243.267V69H241.995V66.689H237.463V65.944L241.92,59.047H243.267V65.657ZM238.898,65.657H241.995V60.776L241.845,61.05L238.898,65.657Z"
android:fillColor="#727272"/>
<path
android:pathData="M246.65,64.01L247.156,59.047H252.256V60.216H248.229L247.928,62.93C248.416,62.643 248.97,62.499 249.589,62.499C250.496,62.499 251.216,62.8 251.75,63.401C252.283,63.998 252.549,64.807 252.549,65.828C252.549,66.854 252.271,67.662 251.715,68.255C251.164,68.843 250.392,69.137 249.398,69.137C248.519,69.137 247.801,68.893 247.245,68.405C246.689,67.918 246.372,67.243 246.295,66.382H247.491C247.568,66.951 247.771,67.382 248.099,67.674C248.427,67.961 248.86,68.104 249.398,68.104C249.986,68.104 250.446,67.904 250.779,67.503C251.116,67.102 251.285,66.548 251.285,65.842C251.285,65.176 251.103,64.643 250.738,64.242C250.378,63.837 249.897,63.634 249.296,63.634C248.744,63.634 248.311,63.755 247.997,63.996L247.662,64.27L246.65,64.01Z"
android:fillColor="#727272"/>
<path
android:pathData="M254.272,60.688C254.272,60.214 254.44,59.799 254.778,59.443C255.119,59.088 255.532,58.91 256.015,58.91C256.489,58.91 256.892,59.088 257.225,59.443C257.562,59.794 257.731,60.209 257.731,60.688C257.731,61.171 257.562,61.583 257.225,61.925C256.892,62.267 256.489,62.438 256.015,62.438C255.536,62.438 255.126,62.267 254.785,61.925C254.443,61.583 254.272,61.171 254.272,60.688ZM256.015,61.563C256.261,61.563 256.468,61.483 256.637,61.323C256.806,61.159 256.89,60.947 256.89,60.688C256.89,60.423 256.806,60.207 256.637,60.038C256.468,59.865 256.261,59.778 256.015,59.778C255.764,59.778 255.552,59.869 255.379,60.052C255.211,60.229 255.126,60.441 255.126,60.688C255.126,60.934 255.211,61.141 255.379,61.31C255.552,61.478 255.764,61.563 256.015,61.563Z"
android:fillColor="#727272"/>
<path
android:pathData="M311.991,59.04V60.113H311.759C310.774,60.132 309.99,60.423 309.407,60.988C308.824,61.553 308.487,62.349 308.395,63.374C308.919,62.772 309.635,62.472 310.542,62.472C311.408,62.472 312.098,62.777 312.613,63.388C313.133,63.998 313.392,64.787 313.392,65.753C313.392,66.778 313.112,67.599 312.552,68.214C311.996,68.829 311.248,69.137 310.309,69.137C309.357,69.137 308.584,68.772 307.992,68.043C307.4,67.309 307.103,66.366 307.103,65.213V64.728C307.103,62.896 307.493,61.496 308.272,60.53C309.056,59.56 310.221,59.063 311.765,59.04H311.991ZM310.33,63.524C309.897,63.524 309.498,63.654 309.134,63.914C308.769,64.174 308.516,64.5 308.375,64.892V65.356C308.375,66.177 308.559,66.838 308.929,67.339C309.298,67.84 309.758,68.091 310.309,68.091C310.879,68.091 311.326,67.881 311.649,67.462C311.977,67.043 312.141,66.493 312.141,65.814C312.141,65.131 311.975,64.579 311.642,64.16C311.314,63.736 310.877,63.524 310.33,63.524Z"
android:fillColor="#727272"/>
<path
android:pathData="M321.411,64.755C321.411,66.236 321.158,67.337 320.652,68.057C320.146,68.777 319.355,69.137 318.28,69.137C317.218,69.137 316.432,68.786 315.921,68.084C315.411,67.378 315.147,66.325 315.128,64.926V63.237C315.128,61.774 315.381,60.688 315.887,59.977C316.393,59.266 317.186,58.91 318.266,58.91C319.337,58.91 320.126,59.254 320.631,59.942C321.137,60.626 321.397,61.683 321.411,63.114V64.755ZM320.146,63.025C320.146,61.954 319.996,61.175 319.695,60.688C319.394,60.195 318.918,59.949 318.266,59.949C317.619,59.949 317.147,60.193 316.851,60.681C316.555,61.168 316.402,61.918 316.393,62.93V64.953C316.393,66.029 316.548,66.824 316.858,67.339C317.172,67.849 317.646,68.104 318.28,68.104C318.904,68.104 319.367,67.863 319.668,67.38C319.973,66.897 320.132,66.136 320.146,65.097V63.025Z"
android:fillColor="#727272"/>
<path
android:pathData="M323.372,60.688C323.372,60.214 323.541,59.799 323.878,59.443C324.22,59.088 324.632,58.91 325.116,58.91C325.589,58.91 325.993,59.088 326.325,59.443C326.663,59.794 326.831,60.209 326.831,60.688C326.831,61.171 326.663,61.583 326.325,61.925C325.993,62.267 325.589,62.438 325.116,62.438C324.637,62.438 324.227,62.267 323.885,61.925C323.543,61.583 323.372,61.171 323.372,60.688ZM325.116,61.563C325.362,61.563 325.569,61.483 325.738,61.323C325.906,61.159 325.991,60.947 325.991,60.688C325.991,60.423 325.906,60.207 325.738,60.038C325.569,59.865 325.362,59.778 325.116,59.778C324.865,59.778 324.653,59.869 324.48,60.052C324.311,60.229 324.227,60.441 324.227,60.688C324.227,60.934 324.311,61.141 324.48,61.31C324.653,61.478 324.865,61.563 325.116,61.563Z"
android:fillColor="#727272"/>
<path
android:pathData="M0,48H1V54H0V48Z"
android:fillColor="#CBC7D1"/>
<path
android:pathData="M47,48H48V54H47V48Z"
android:fillColor="#CBC7D1"/>
<path
android:pathData="M92,48H93V54H92V48Z"
android:fillColor="#CBC7D1"/>
<path
android:pathData="M186,48H187V54H186V48Z"
android:fillColor="#CBC7D1"/>
<path
android:pathData="M137,48H138V54H137V48Z"
android:fillColor="#CBC7D1"/>
<path
android:pathData="M242,48H243V54H242V48Z"
android:fillColor="#CBC7D1"/>
<path
android:pathData="M327,48H328V54H327V48Z"
android:fillColor="#CBC7D1"/>
</vector>

View file

@ -0,0 +1,21 @@
<vector android:autoMirrored="true" android:height="200dp"
android:viewportHeight="200" android:viewportWidth="248"
android:width="248dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#EEE7E6" android:pathData="M16,39h216v83h-216z"/>
<path android:fillColor="#ffffff" android:pathData="M16,124h216v76h-216z"/>
<path android:fillColor="#E2DBDB" android:pathData="M16,124l216,-0l0,-2l-216,-0z"/>
<path android:fillColor="#B3B3B3" android:fillType="evenOdd" android:pathData="M34,154C39.523,154 44,149.523 44,144C44,138.477 39.523,134 34,134C28.477,134 24,138.477 24,144C24,149.523 28.477,154 34,154Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M58,139C58,137.343 59.343,136 61,136H139C140.657,136 142,137.343 142,139C142,140.657 140.657,142 139,142H61C59.343,142 58,140.657 58,139Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M58,182C58,180.343 59.343,179 61,179H139C140.657,179 142,180.343 142,182C142,183.657 140.657,185 139,185H61C59.343,185 58,183.657 58,182Z"/>
<path android:fillColor="#D2D2D2" android:pathData="M58,149.5C58,148.672 58.672,148 59.5,148H104.5C105.328,148 106,148.672 106,149.5C106,150.328 105.328,151 104.5,151H59.5C58.672,151 58,150.328 58,149.5Z"/>
<path android:fillColor="#D2D2D2" android:pathData="M58,192.5C58,191.672 58.672,191 59.5,191H104.5C105.328,191 106,191.672 106,192.5C106,193.328 105.328,194 104.5,194H59.5C58.672,194 58,193.328 58,192.5Z"/>
<path android:fillColor="#B3B3B3" android:fillType="evenOdd" android:pathData="M34,197C39.523,197 44,192.523 44,187C44,181.477 39.523,177 34,177C28.477,177 24,181.477 24,187C24,192.523 28.477,197 34,197Z"/>
<path android:fillColor="#D2D2D2" android:pathData="M194,143C194,140.239 196.239,138 199,138H215C217.761,138 220,140.239 220,143C220,145.761 217.761,148 215,148H199C196.239,148 194,145.761 194,143Z"/>
<path android:fillColor="#D2D2D2" android:pathData="M194,186C194,183.239 196.239,181 199,181H215C217.761,181 220,183.239 220,186C220,188.761 217.761,191 215,191H199C196.239,191 194,188.761 194,186Z"/>
<path android:fillColor="#B3B3B3" android:fillType="evenOdd" android:pathData="M213,150C216.866,150 220,146.866 220,143C220,139.134 216.866,136 213,136C209.134,136 206,139.134 206,143C206,146.866 209.134,150 213,150Z"/>
<path android:fillColor="#B3B3B3" android:fillType="evenOdd" android:pathData="M213,193C216.866,193 220,189.866 220,186C220,182.134 216.866,179 213,179C209.134,179 206,182.134 206,186C206,189.866 209.134,193 213,193Z"/>
<path android:fillColor="#8F8B8A" android:pathData="M16,24.025h216v15h-216z"/>
<path android:fillColor="#ffffff" android:pathData="M203,29H198V34H203V29Z"/>
<path android:fillColor="#ffffff" android:pathData="M209,31.5C209,30.119 210.119,29 211.5,29C212.881,29 214,30.119 214,31.5C214,32.881 212.881,34 211.5,34C210.119,34 209,32.881 209,31.5Z"/>
<path android:fillColor="#ffffff" android:pathData="M222.5,34L225,29H220L222.5,34Z"/>
</vector>

View file

@ -0,0 +1,20 @@
<vector android:autoMirrored="true" android:height="200dp"
android:viewportHeight="200" android:viewportWidth="248"
android:width="248dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#060A0D" android:pathData="M16,39h216v85h-216z"/>
<path android:fillColor="#323334" android:pathData="M16,124h216v76h-216z"/>
<path android:fillColor="#727272" android:fillType="evenOdd" android:pathData="M34,154C39.523,154 44,149.523 44,144C44,138.477 39.523,134 34,134C28.477,134 24,138.477 24,144C24,149.523 28.477,154 34,154Z"/>
<path android:fillColor="#727272" android:pathData="M58,139C58,137.343 59.343,136 61,136H139C140.657,136 142,137.343 142,139C142,140.657 140.657,142 139,142H61C59.343,142 58,140.657 58,139Z"/>
<path android:fillColor="#727272" android:pathData="M58,182C58,180.343 59.343,179 61,179H139C140.657,179 142,180.343 142,182C142,183.657 140.657,185 139,185H61C59.343,185 58,183.657 58,182Z"/>
<path android:fillColor="#59595A" android:pathData="M58,149.5C58,148.672 58.672,148 59.5,148H104.5C105.328,148 106,148.672 106,149.5C106,150.328 105.328,151 104.5,151H59.5C58.672,151 58,150.328 58,149.5Z"/>
<path android:fillColor="#59595A" android:pathData="M58,192.5C58,191.672 58.672,191 59.5,191H104.5C105.328,191 106,191.672 106,192.5C106,193.328 105.328,194 104.5,194H59.5C58.672,194 58,193.328 58,192.5Z"/>
<path android:fillColor="#727272" android:fillType="evenOdd" android:pathData="M34,197C39.523,197 44,192.523 44,187C44,181.477 39.523,177 34,177C28.477,177 24,181.477 24,187C24,192.523 28.477,197 34,197Z"/>
<path android:fillColor="#59595A" android:pathData="M194,143C194,140.239 196.239,138 199,138H215C217.761,138 220,140.239 220,143C220,145.761 217.761,148 215,148H199C196.239,148 194,145.761 194,143Z"/>
<path android:fillColor="#59595A" android:pathData="M194,186C194,183.239 196.239,181 199,181H215C217.761,181 220,183.239 220,186C220,188.761 217.761,191 215,191H199C196.239,191 194,188.761 194,186Z"/>
<path android:fillColor="#727272" android:fillType="evenOdd" android:pathData="M213,150C216.866,150 220,146.866 220,143C220,139.134 216.866,136 213,136C209.134,136 206,139.134 206,143C206,146.866 209.134,150 213,150Z"/>
<path android:fillColor="#727272" android:fillType="evenOdd" android:pathData="M213,193C216.866,193 220,189.866 220,186C220,182.134 216.866,179 213,179C209.134,179 206,182.134 206,186C206,189.866 209.134,193 213,193Z"/>
<path android:fillColor="#2D2F2F" android:pathData="M16,24.025h216v15h-216z"/>
<path android:fillColor="#727272" android:pathData="M203,29H198V34H203V29Z"/>
<path android:fillColor="#727272" android:pathData="M209,31.5C209,30.119 210.119,29 211.5,29C212.881,29 214,30.119 214,31.5C214,32.881 212.881,34 211.5,34C210.119,34 209,32.881 209,31.5Z"/>
<path android:fillColor="#727272" android:pathData="M222.5,34L225,29H220L222.5,34Z"/>
</vector>

View file

@ -0,0 +1,30 @@
<vector android:autoMirrored="true" android:height="200dp"
android:viewportHeight="200" android:viewportWidth="248"
android:width="248dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#EEE7E6" android:pathData="M16,0h216v42h-216z"/>
<path android:fillColor="#E2DBDB" android:pathData="M16,44l216,-0l0,-2l-216,-0z"/>
<path android:fillColor="#ffffff" android:pathData="M16,44h216v59h-216z"/>
<path android:fillColor="#F0F0F0" android:pathData="M16,103H232V173C232,174.657 230.657,176 229,176H19C17.343,176 16,174.657 16,173V103Z"/>
<path android:fillColor="#E6E6E6" android:pathData="M16,152h216v1h-216z"/>
<path android:fillColor="#D2D2D2" android:pathData="M31,143.5C31,142.672 31.672,142 32.5,142H53.5C54.328,142 55,142.672 55,143.5C55,144.328 54.328,145 53.5,145H32.5C31.672,145 31,144.328 31,143.5Z"/>
<path android:fillColor="#D2D2D2" android:pathData="M85,143.5C85,142.672 85.672,142 86.5,142H107.5C108.328,142 109,142.672 109,143.5C109,144.328 108.328,145 107.5,145H86.5C85.672,145 85,144.328 85,143.5Z"/>
<path android:fillColor="#D2D2D2" android:pathData="M139,143.5C139,142.672 139.672,142 140.5,142H161.5C162.328,142 163,142.672 163,143.5C163,144.328 162.328,145 161.5,145H140.5C139.672,145 139,144.328 139,143.5Z"/>
<path android:fillColor="#D2D2D2" android:pathData="M193,143.5C193,142.672 193.672,142 194.5,142H215.5C216.328,142 217,142.672 217,143.5C217,144.328 216.328,145 215.5,145H194.5C193.672,145 193,144.328 193,143.5Z"/>
<path android:fillColor="#B3B3B3" android:fillType="evenOdd" android:pathData="M43,131C48.523,131 53,126.523 53,121C53,115.477 48.523,111 43,111C37.477,111 33,115.477 33,121C33,126.523 37.477,131 43,131Z"/>
<path android:fillColor="#B3B3B3" android:fillType="evenOdd" android:pathData="M97,131C102.523,131 107,126.523 107,121C107,115.477 102.523,111 97,111C91.477,111 87,115.477 87,121C87,126.523 91.477,131 97,131Z"/>
<path android:fillColor="#B3B3B3" android:fillType="evenOdd" android:pathData="M151,131C156.523,131 161,126.523 161,121C161,115.477 156.523,111 151,111C145.477,111 141,115.477 141,121C141,126.523 145.477,131 151,131Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M200,128C200,129.105 199.105,130 198,130C196.895,130 196,129.105 196,128C196,126.895 196.895,126 198,126C199.105,126 200,126.895 200,128Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M207,128C207,129.105 206.105,130 205,130C203.895,130 203,129.105 203,128C203,126.895 203.895,126 205,126C206.105,126 207,126.895 207,128Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M212,130C213.105,130 214,129.105 214,128C214,126.895 213.105,126 212,126C210.895,126 210,126.895 210,128C210,129.105 210.895,130 212,130Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M200,121C200,122.105 199.105,123 198,123C196.895,123 196,122.105 196,121C196,119.895 196.895,119 198,119C199.105,119 200,119.895 200,121Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M207,121C207,122.105 206.105,123 205,123C203.895,123 203,122.105 203,121C203,119.895 203.895,119 205,119C206.105,119 207,119.895 207,121Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M212,123C213.105,123 214,122.105 214,121C214,119.895 213.105,119 212,119C210.895,119 210,119.895 210,121C210,122.105 210.895,123 212,123Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M200,114C200,115.105 199.105,116 198,116C196.895,116 196,115.105 196,114C196,112.895 196.895,112 198,112C199.105,112 200,112.895 200,114Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M207,114C207,115.105 206.105,116 205,116C203.895,116 203,115.105 203,114C203,112.895 203.895,112 205,112C206.105,112 207,112.895 207,114Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M212,116C213.105,116 214,115.105 214,114C214,112.895 213.105,112 212,112C210.895,112 210,112.895 210,114C210,115.105 210.895,116 212,116Z"/>
<path android:fillColor="#D2D2D2" android:pathData="M30,70L84,70A3,3 0,0 1,87 73L87,73A3,3 0,0 1,84 76L30,76A3,3 0,0 1,27 73L27,73A3,3 0,0 1,30 70z"/>
<path android:fillColor="#B3B3B3" android:pathData="M30,56L108,56A3,3 0,0 1,111 59L111,59A3,3 0,0 1,108 62L30,62A3,3 0,0 1,27 59L27,59A3,3 0,0 1,30 56z"/>
<path android:fillColor="#FF8800" android:fillType="evenOdd" android:pathData="M214,72C219.523,72 224,67.523 224,62C224,56.477 219.523,52 214,52C208.477,52 204,56.477 204,62C204,67.523 208.477,72 214,72Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M26.5,163C25.672,163 25,163.672 25,164.5C25,165.328 25.672,166 26.5,166H59.5C60.328,166 61,165.328 61,164.5C61,163.672 60.328,163 59.5,163H26.5Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M189.5,163C188.672,163 188,163.672 188,164.5C188,165.328 188.672,166 189.5,166H221.5C222.328,166 223,165.328 223,164.5C223,163.672 222.328,163 221.5,163H189.5Z"/>
</vector>

View file

@ -0,0 +1,29 @@
<vector android:autoMirrored="true" android:height="200dp"
android:viewportHeight="200" android:viewportWidth="248"
android:width="248dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#060A0D" android:pathData="M16,0h216v44h-216z"/>
<path android:fillColor="#1C1C1C" android:pathData="M16,44h216v59h-216z"/>
<path android:fillColor="#28292A" android:pathData="M16,103H232V173C232,174.657 230.657,176 229,176H19C17.343,176 16,174.657 16,173V103Z"/>
<path android:fillColor="#2C3033" android:pathData="M16,152h216v1h-216z"/>
<path android:fillColor="#59595A" android:pathData="M31,143.5C31,142.672 31.672,142 32.5,142H53.5C54.328,142 55,142.672 55,143.5C55,144.328 54.328,145 53.5,145H32.5C31.672,145 31,144.328 31,143.5Z"/>
<path android:fillColor="#59595A" android:pathData="M85,143.5C85,142.672 85.672,142 86.5,142H107.5C108.328,142 109,142.672 109,143.5C109,144.328 108.328,145 107.5,145H86.5C85.672,145 85,144.328 85,143.5Z"/>
<path android:fillColor="#59595A" android:pathData="M139,143.5C139,142.672 139.672,142 140.5,142H161.5C162.328,142 163,142.672 163,143.5C163,144.328 162.328,145 161.5,145H140.5C139.672,145 139,144.328 139,143.5Z"/>
<path android:fillColor="#59595A" android:pathData="M193,143.5C193,142.672 193.672,142 194.5,142H215.5C216.328,142 217,142.672 217,143.5C217,144.328 216.328,145 215.5,145H194.5C193.672,145 193,144.328 193,143.5Z"/>
<path android:fillColor="#727272" android:fillType="evenOdd" android:pathData="M43,131C48.523,131 53,126.523 53,121C53,115.477 48.523,111 43,111C37.477,111 33,115.477 33,121C33,126.523 37.477,131 43,131Z"/>
<path android:fillColor="#727272" android:fillType="evenOdd" android:pathData="M97,131C102.523,131 107,126.523 107,121C107,115.477 102.523,111 97,111C91.477,111 87,115.477 87,121C87,126.523 91.477,131 97,131Z"/>
<path android:fillColor="#727272" android:fillType="evenOdd" android:pathData="M151,131C156.523,131 161,126.523 161,121C161,115.477 156.523,111 151,111C145.477,111 141,115.477 141,121C141,126.523 145.477,131 151,131Z"/>
<path android:fillColor="#727272" android:pathData="M200,128C200,129.105 199.105,130 198,130C196.895,130 196,129.105 196,128C196,126.895 196.895,126 198,126C199.105,126 200,126.895 200,128Z"/>
<path android:fillColor="#727272" android:pathData="M207,128C207,129.105 206.105,130 205,130C203.895,130 203,129.105 203,128C203,126.895 203.895,126 205,126C206.105,126 207,126.895 207,128Z"/>
<path android:fillColor="#727272" android:pathData="M212,130C213.105,130 214,129.105 214,128C214,126.895 213.105,126 212,126C210.895,126 210,126.895 210,128C210,129.105 210.895,130 212,130Z"/>
<path android:fillColor="#727272" android:pathData="M200,121C200,122.105 199.105,123 198,123C196.895,123 196,122.105 196,121C196,119.895 196.895,119 198,119C199.105,119 200,119.895 200,121Z"/>
<path android:fillColor="#727272" android:pathData="M207,121C207,122.105 206.105,123 205,123C203.895,123 203,122.105 203,121C203,119.895 203.895,119 205,119C206.105,119 207,119.895 207,121Z"/>
<path android:fillColor="#727272" android:pathData="M212,123C213.105,123 214,122.105 214,121C214,119.895 213.105,119 212,119C210.895,119 210,119.895 210,121C210,122.105 210.895,123 212,123Z"/>
<path android:fillColor="#727272" android:pathData="M200,114C200,115.105 199.105,116 198,116C196.895,116 196,115.105 196,114C196,112.895 196.895,112 198,112C199.105,112 200,112.895 200,114Z"/>
<path android:fillColor="#727272" android:pathData="M207,114C207,115.105 206.105,116 205,116C203.895,116 203,115.105 203,114C203,112.895 203.895,112 205,112C206.105,112 207,112.895 207,114Z"/>
<path android:fillColor="#727272" android:pathData="M212,116C213.105,116 214,115.105 214,114C214,112.895 213.105,112 212,112C210.895,112 210,112.895 210,114C210,115.105 210.895,116 212,116Z"/>
<path android:fillColor="#59595A" android:pathData="M30,70L84,70A3,3 0,0 1,87 73L87,73A3,3 0,0 1,84 76L30,76A3,3 0,0 1,27 73L27,73A3,3 0,0 1,30 70z"/>
<path android:fillColor="#727272" android:pathData="M30,56L108,56A3,3 0,0 1,111 59L111,59A3,3 0,0 1,108 62L30,62A3,3 0,0 1,27 59L27,59A3,3 0,0 1,30 56z"/>
<path android:fillColor="#E69122" android:fillType="evenOdd" android:pathData="M214,72C219.523,72 224,67.523 224,62C224,56.477 219.523,52 214,52C208.477,52 204,56.477 204,62C204,67.523 208.477,72 214,72Z"/>
<path android:fillColor="#59595A" android:pathData="M26.5,163C25.672,163 25,163.672 25,164.5C25,165.328 25.672,166 26.5,166H59.5C60.328,166 61,165.328 61,164.5C61,163.672 60.328,163 59.5,163H26.5Z"/>
<path android:fillColor="#59595A" android:pathData="M189.5,163C188.672,163 188,163.672 188,164.5C188,165.328 188.672,166 189.5,166H221.5C222.328,166 223,165.328 223,164.5C223,163.672 222.328,163 221.5,163H189.5Z"/>
</vector>

View file

@ -0,0 +1,30 @@
<vector android:autoMirrored="true" android:height="200dp"
android:viewportHeight="200" android:viewportWidth="248"
android:width="248dp" xmlns:android="http://schemas.android.com/apk/res/android">
<group>
<clip-path android:pathData="M0,0h248v200h-248z"/>
<path android:fillColor="#EEE7E6" android:pathData="M166,24h66v177h-66z"/>
<path android:fillColor="#8F8B8A" android:pathData="M166,24h66v15h-66z"/>
<path android:fillColor="#ffffff" android:pathData="M203,29H198V34H203V29Z"/>
<path android:fillColor="#ffffff" android:pathData="M209,31.5C209,30.119 210.119,29 211.5,29C212.881,29 214,30.119 214,31.5C214,32.881 212.881,34 211.5,34C210.119,34 209,32.881 209,31.5Z"/>
<path android:fillColor="#ffffff" android:pathData="M222.5,34L225,29H220L222.5,34Z"/>
<path android:fillColor="#ffffff" android:pathData="M16,72h150v128h-150z"/>
<path android:fillColor="#BDD7FF" android:pathData="M16,24h150v48h-150z"/>
<path android:fillAlpha="0.5" android:fillColor="#237BFF"
android:pathData="M58,39C58,37.343 59.343,36 61,36H139C140.657,36 142,37.343 142,39C142,40.657 140.657,42 139,42H61C59.343,42 58,40.657 58,39Z" android:strokeAlpha="0.5"/>
<path android:fillAlpha="0.5" android:fillColor="#237BFF"
android:pathData="M58,53C58,51.343 59.343,50 61,50H115C116.657,50 118,51.343 118,53C118,54.657 116.657,56 115,56H61C59.343,56 58,54.657 58,53Z" android:strokeAlpha="0.5"/>
<path android:fillColor="#237BFF" android:fillType="evenOdd" android:pathData="M34,52C39.523,52 44,47.523 44,42C44,36.477 39.523,32 34,32C28.477,32 24,36.477 24,42C24,47.523 28.477,52 34,52Z"/>
<path android:fillAlpha="0.5" android:fillColor="#B3B3B3"
android:pathData="M58,95C58,93.343 59.343,92 61,92H139C140.657,92 142,93.343 142,95C142,96.657 140.657,98 139,98H61C59.343,98 58,96.657 58,95Z" android:strokeAlpha="0.5"/>
<path android:fillAlpha="0.5" android:fillColor="#B3B3B3"
android:pathData="M58,138C58,136.343 59.343,135 61,135H139C140.657,135 142,136.343 142,138C142,139.657 140.657,141 139,141H61C59.343,141 58,139.657 58,138Z" android:strokeAlpha="0.5"/>
<path android:fillAlpha="0.5" android:fillColor="#B3B3B3"
android:pathData="M61,178C59.343,178 58,179.343 58,181C58,182.657 59.343,184 61,184H139C140.657,184 142,182.657 142,181C142,179.343 140.657,178 139,178H61Z" android:strokeAlpha="0.5"/>
<path android:fillColor="#B3B3B3" android:pathData="M34,105C39.523,105 44,100.523 44,95C44,89.477 39.523,85 34,85C28.477,85 24,89.477 24,95C24,100.523 28.477,105 34,105Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M34,148C39.523,148 44,143.523 44,138C44,132.477 39.523,128 34,128C28.477,128 24,132.477 24,138C24,143.523 28.477,148 34,148Z"/>
<path android:fillColor="#B3B3B3" android:pathData="M44,181C44,186.523 39.523,191 34,191C28.477,191 24,186.523 24,181C24,175.477 28.477,171 34,171C39.523,171 44,175.477 44,181Z"/>
<path android:fillAlpha="0.1" android:fillColor="#000000"
android:pathData="M166,24h2v176h-2z" android:strokeAlpha="0.1"/>
</group>
</vector>

View file

@ -0,0 +1,30 @@
<vector android:autoMirrored="true" android:height="200dp"
android:viewportHeight="200" android:viewportWidth="248"
android:width="248dp" xmlns:android="http://schemas.android.com/apk/res/android">
<group>
<clip-path android:pathData="M0,0h248v200h-248z"/>
<path android:fillColor="#060A0D" android:pathData="M166,24h66v177h-66z"/>
<path android:fillColor="#2D2F2F" android:pathData="M166,24h66v15h-66z"/>
<path android:fillColor="#727272" android:pathData="M203,29H198V34H203V29Z"/>
<path android:fillColor="#727272" android:pathData="M209,31.5C209,30.119 210.119,29 211.5,29C212.881,29 214,30.119 214,31.5C214,32.881 212.881,34 211.5,34C210.119,34 209,32.881 209,31.5Z"/>
<path android:fillColor="#727272" android:pathData="M222.5,34L225,29H220L222.5,34Z"/>
<path android:fillColor="#323334" android:pathData="M16,72h150v128h-150z"/>
<path android:fillColor="#1F2D41" android:pathData="M16,24h150v48h-150z"/>
<path android:fillAlpha="0.5" android:fillColor="#237BFF"
android:pathData="M58,39C58,37.343 59.343,36 61,36H139C140.657,36 142,37.343 142,39C142,40.657 140.657,42 139,42H61C59.343,42 58,40.657 58,39Z" android:strokeAlpha="0.5"/>
<path android:fillAlpha="0.5" android:fillColor="#237BFF"
android:pathData="M58,53C58,51.343 59.343,50 61,50H115C116.657,50 118,51.343 118,53C118,54.657 116.657,56 115,56H61C59.343,56 58,54.657 58,53Z" android:strokeAlpha="0.5"/>
<path android:fillColor="#237BFF" android:fillType="evenOdd" android:pathData="M34,52C39.523,52 44,47.523 44,42C44,36.477 39.523,32 34,32C28.477,32 24,36.477 24,42C24,47.523 28.477,52 34,52Z"/>
<path android:fillAlpha="0.5" android:fillColor="#B3B3B3"
android:pathData="M58,95C58,93.343 59.343,92 61,92H139C140.657,92 142,93.343 142,95C142,96.657 140.657,98 139,98H61C59.343,98 58,96.657 58,95Z" android:strokeAlpha="0.5"/>
<path android:fillAlpha="0.5" android:fillColor="#B3B3B3"
android:pathData="M58,138C58,136.343 59.343,135 61,135H139C140.657,135 142,136.343 142,138C142,139.657 140.657,141 139,141H61C59.343,141 58,139.657 58,138Z" android:strokeAlpha="0.5"/>
<path android:fillAlpha="0.5" android:fillColor="#B3B3B3"
android:pathData="M61,178C59.343,178 58,179.343 58,181C58,182.657 59.343,184 61,184H139C140.657,184 142,182.657 142,181C142,179.343 140.657,178 139,178H61Z" android:strokeAlpha="0.5"/>
<path android:fillColor="#727272" android:pathData="M34,105C39.523,105 44,100.523 44,95C44,89.477 39.523,85 34,85C28.477,85 24,89.477 24,95C24,100.523 28.477,105 34,105Z"/>
<path android:fillColor="#727272" android:pathData="M34,148C39.523,148 44,143.523 44,138C44,132.477 39.523,128 34,128C28.477,128 24,132.477 24,138C24,143.523 28.477,148 34,148Z"/>
<path android:fillColor="#727272" android:pathData="M44,181C44,186.523 39.523,191 34,191C28.477,191 24,186.523 24,181C24,175.477 28.477,171 34,171C39.523,171 44,175.477 44,181Z"/>
<path android:fillAlpha="0.1" android:fillColor="#000000"
android:pathData="M166,24h2v176h-2z" android:strokeAlpha="0.1"/>
</group>
</vector>

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<net.osmand.plus.widgets.TextViewEx
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
osmand:typeface="@string/font_roboto_regular"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
tools:text="title"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
osmand:typeface="@string/font_roboto_medium"
android:textColor="?attr/active_color_basic"
android:textSize="@dimen/default_list_text_size"
tools:text="summary"/>
</FrameLayout>
<com.google.android.material.slider.Slider
android:id="@+id/slider"
style="@style/Widget.MaterialComponents.Slider"
android:theme="@style/Theme.MaterialComponents"
android:layout_width="match_parent"
android:layout_height="wrap_content"
osmand:labelBehavior="gone" />
</LinearLayout>

View file

@ -10,90 +10,106 @@
app:contentInsetLeft="4dp" app:contentInsetLeft="4dp"
app:contentInsetStart="4dp"> app:contentInsetStart="4dp">
<ImageView <LinearLayout
android:id="@+id/toolbar_back" android:layout_width="match_parent"
android:contentDescription="@string/back_to_map"
android:layout_width="@dimen/list_item_height"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@drawable/dashboard_button_light"
android:scaleType="center"
android:src="@drawable/ic_arrow_back"
tools:visibility="visible"/>
<ImageView
android:id="@+id/toolbar_list"
android:contentDescription="@string/backToMenu"
android:layout_width="@dimen/list_item_height"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@drawable/dashboard_button_light"
android:scaleType="center"
android:src="@drawable/ic_navigation_drawer"
tools:visibility="gone"/>
<ImageView
android:id="@+id/toolbar_settings"
android:contentDescription="@string/shared_string_settings"
android:layout_width="@dimen/list_item_height"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="@drawable/dashboard_button_light"
android:scaleType="center"
android:src="@drawable/ic_configure_screen_dark"/>
<TextView
android:id="@+id/toolbar_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="start" android:gravity="center_vertical"
android:scaleType="center" android:orientation="horizontal">
android:textColor="@color/abc_primary_text_material_dark"
android:textSize="@dimen/abc_text_size_large_material"
tools:text="Toolbar"
tools:visibility="visible"/>
<ImageView <LinearLayout
android:id="@+id/toolbar_ok" android:layout_width="0dp"
android:contentDescription="@string/shared_string_ok" android:layout_weight="1"
android:layout_width="@dimen/list_item_height" android:layout_height="wrap_content"
android:layout_height="match_parent" android:gravity="start"
android:layout_gravity="end" android:orientation="horizontal">
android:background="@drawable/dashboard_button_light"
android:scaleType="center"
android:src="@drawable/ic_action_done"/>
<ImageView <ImageView
android:id="@+id/toolbar_sort" android:id="@+id/toolbar_back"
android:contentDescription="@string/intermediate_points_change_order" android:contentDescription="@string/back_to_map"
android:layout_width="@dimen/list_item_height" android:layout_width="@dimen/list_item_height"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="end" android:background="@drawable/dashboard_button_light"
android:background="@drawable/dashboard_button_light" android:scaleType="center"
android:scaleType="center" android:src="@drawable/ic_arrow_back"
android:src="@drawable/ic_sort_waypoint_dark"/> tools:visibility="visible"/>
<ImageView
android:id="@+id/toolbar_list"
android:contentDescription="@string/backToMenu"
android:layout_width="@dimen/list_item_height"
android:layout_height="match_parent"
android:background="@drawable/dashboard_button_light"
android:scaleType="center"
android:src="@drawable/ic_navigation_drawer"
tools:visibility="gone"/>
<ImageView <TextView
android:id="@+id/toolbar_flat" android:id="@+id/toolbar_text"
android:contentDescription="@string/drawer" android:layout_width="wrap_content"
android:layout_width="@dimen/list_item_height" android:layout_height="wrap_content"
android:layout_height="match_parent" android:scaleType="center"
android:layout_gravity="end" android:textColor="@color/abc_primary_text_material_dark"
android:background="@drawable/dashboard_button_light" android:textSize="@dimen/abc_text_size_large_material"
android:scaleType="center" tools:text="Toolbar"
android:src="@drawable/ic_flat_list_dark" tools:visibility="visible"/>
android:visibility="gone"/>
<ImageView </LinearLayout>
android:id="@+id/toolbar_edit"
android:contentDescription="@string/shared_string_edit" <LinearLayout
android:layout_width="@dimen/list_item_height" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_gravity="end" android:gravity="end"
android:background="@drawable/dashboard_button_light" android:orientation="horizontal">
android:scaleType="center"
android:src="@drawable/ic_action_edit_dark" <ImageView
android:visibility="gone"/> android:id="@+id/toolbar_settings"
android:contentDescription="@string/shared_string_settings"
android:layout_width="@dimen/list_item_height"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="@drawable/dashboard_button_light"
android:scaleType="center"
android:src="@drawable/ic_configure_screen_dark"/>
<ImageView
android:id="@+id/toolbar_ok"
android:contentDescription="@string/shared_string_ok"
android:layout_width="@dimen/list_item_height"
android:layout_height="match_parent"
android:background="@drawable/dashboard_button_light"
android:scaleType="center"
android:src="@drawable/ic_action_done"/>
<ImageView
android:id="@+id/toolbar_sort"
android:contentDescription="@string/intermediate_points_change_order"
android:layout_width="@dimen/list_item_height"
android:layout_height="match_parent"
android:background="@drawable/dashboard_button_light"
android:scaleType="center"
android:src="@drawable/ic_sort_waypoint_dark"/>
<ImageView
android:id="@+id/toolbar_flat"
android:contentDescription="@string/drawer"
android:layout_width="@dimen/list_item_height"
android:layout_height="match_parent"
android:background="@drawable/dashboard_button_light"
android:scaleType="center"
android:src="@drawable/ic_flat_list_dark"
android:visibility="gone"/>
<ImageView
android:id="@+id/toolbar_edit"
android:contentDescription="@string/shared_string_edit"
android:layout_width="@dimen/list_item_height"
android:layout_height="match_parent"
android:background="@drawable/dashboard_button_light"
android:scaleType="center"
android:src="@drawable/ic_action_edit_dark"
android:visibility="gone"/>
</LinearLayout>
</LinearLayout>
</androidx.appcompat.widget.Toolbar> </androidx.appcompat.widget.Toolbar>

View file

@ -19,9 +19,11 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="@dimen/list_content_padding" android:paddingLeft="@dimen/list_content_padding"
android:paddingStart="@dimen/list_content_padding"
android:paddingRight="0dp"
android:paddingEnd="0dp"
android:minHeight="@dimen/list_item_height" android:minHeight="@dimen/list_item_height"
android:background="?attr/expandable_list_item_background" android:background="?attr/expandable_list_item_background">
android:paddingStart="@dimen/list_content_padding">
<CheckBox <CheckBox
android:id="@+id/toggle_item" android:id="@+id/toggle_item"
@ -50,7 +52,7 @@
android:textSize="@dimen/default_list_text_size" android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_medium" osmand:typeface="@string/font_roboto_medium"
tools:text="Category name" tools:text="Category name"
android:layout_marginStart="@dimen/list_content_padding" /> android:layout_marginStart="@dimen/list_content_padding" />
<ImageView <ImageView
android:id="@+id/options" android:id="@+id/options"
@ -65,7 +67,7 @@
android:src="@drawable/ic_overflow_menu_white" android:src="@drawable/ic_overflow_menu_white"
android:visibility="gone" android:visibility="gone"
tools:visiblity="visible" tools:visiblity="visible"
android:layout_marginEnd="4dp" /> android:layout_marginEnd="4dp" />
<ImageView <ImageView
android:id="@+id/explist_indicator" android:id="@+id/explist_indicator"
@ -74,7 +76,7 @@
android:scaleType="center" android:scaleType="center"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginRight="@dimen/list_content_padding" android:layout_marginRight="@dimen/list_content_padding"
android:layout_marginEnd="@dimen/list_content_padding" /> android:layout_marginEnd="@dimen/list_content_padding" />
</LinearLayout> </LinearLayout>

View file

@ -16,7 +16,6 @@
android:focusable="false" android:focusable="false"
android:groupIndicator="@android:color/transparent" android:groupIndicator="@android:color/transparent"
android:listSelector="@android:color/transparent" android:listSelector="@android:color/transparent"
android:paddingBottom="@dimen/dialog_button_ex_height"
osmand:layout_behavior="@string/appbar_scrolling_view_behavior" /> osmand:layout_behavior="@string/appbar_scrolling_view_behavior" />
<LinearLayout <LinearLayout
@ -128,6 +127,16 @@
</com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.CollapsingToolbarLayout>
<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
android:minHeight="0dp"
android:visibility="gone"
tools:visibility="visible" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -0,0 +1,134 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/activity_background_basic">
<androidx.core.widget.NestedScrollView
android:id="@+id/nested_scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
osmand:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/bg_color"
android:orientation="vertical">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="@dimen/content_padding"
android:paddingTop="@dimen/list_header_settings_top_margin"
android:paddingEnd="@dimen/content_padding"
android:paddingBottom="@dimen/list_header_settings_top_margin"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
tools:text="@string/import_complete_description" />
<include
layout="@layout/divider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:paddingBottom="@dimen/bottom_sheet_cancel_button_height" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<LinearLayout
android:id="@+id/button_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="?attr/bg_color"
android:orientation="vertical">
<include layout="@layout/divider" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dialog_button_height"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_small"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginBottom="@dimen/content_padding_small"
android:background="?attr/dlg_btn_secondary">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/button_close"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground"
android:gravity="center"
android:text="@string/shared_string_close"
android:textColor="?attr/active_color_basic"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="Button" />
</FrameLayout>
</LinearLayout>
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_height_expanded"
android:background="?attr/colorPrimary"
osmand:expandedTitleMarginBottom="@dimen/content_padding_small"
osmand:expandedTitleMarginEnd="@dimen/content_padding"
osmand:expandedTitleMarginStart="@dimen/content_padding"
osmand:collapsedTitleTextAppearance="@style/AppBarTitle"
osmand:expandedTitleGravity="start|bottom"
osmand:expandedTitleTextAppearance="@style/AppBarTitle"
osmand:layout_scrollFlags="scroll|exitUntilCollapsed">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_height"
android:minHeight="@dimen/toolbar_height"
osmand:titleMarginEnd="0dp"
osmand:titleMarginStart="0dp"
osmand:layout_collapseMode="pin"
osmand:layout_scrollFlags="scroll|enterAlways|exitUntilCollapsed"
osmand:title="@string/shared_string_import_complete"/>
</com.google.android.material.appbar.CollapsingToolbarLayout>
<ImageView
android:id="@+id/shadowView"
android:layout_width="match_parent"
android:layout_height="@dimen/abp__shadow_height"
android:src="@drawable/preference_activity_action_bar_shadow"
tools:ignore="ContentDescription" />
</com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -3,6 +3,7 @@
xmlns:osmand="http://schemas.android.com/apk/res-auto" xmlns:osmand="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:background="?attr/activity_background_basic"> android:background="?attr/activity_background_basic">
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
@ -128,12 +129,22 @@
osmand:titleMarginStart="0dp" osmand:titleMarginStart="0dp"
osmand:layout_collapseMode="pin" osmand:layout_collapseMode="pin"
osmand:layout_scrollFlags="scroll|enterAlways|exitUntilCollapsed" osmand:layout_scrollFlags="scroll|enterAlways|exitUntilCollapsed"
osmand:title="@string/import_duplicates_title"> tools:title="@string/import_duplicates_title">
</androidx.appcompat.widget.Toolbar> </androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.CollapsingToolbarLayout>
<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="0dp"
android:indeterminate="true"
android:visibility="gone"
tools:visibility="visible" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -24,12 +24,12 @@
android:id="@+id/searchEditText" android:id="@+id/searchEditText"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginLeft="16dp" android:layout_marginLeft="@dimen/content_padding"
android:layout_marginStart="@dimen/content_padding"
android:background="@null" android:background="@null"
android:gravity="center_vertical" android:gravity="center_vertical"
android:lines="1" android:lines="1"
tools:text="Search request" tools:text="Search request" />
android:layout_marginStart="16dp" />
</LinearLayout> </LinearLayout>
<FrameLayout <FrameLayout

View file

@ -35,13 +35,13 @@
android:id="@+id/back_button_flow" android:id="@+id/back_button_flow"
android:layout_width="@dimen/route_info_toolbar_button_size" android:layout_width="@dimen/route_info_toolbar_button_size"
android:layout_height="@dimen/route_info_toolbar_button_size" android:layout_height="@dimen/route_info_toolbar_button_size"
android:layout_marginLeft="8dp" android:layout_marginLeft="@dimen/content_padding_half"
android:layout_marginTop="8dp" android:layout_marginTop="@dimen/content_padding_half"
android:layout_marginStart="@dimen/content_padding_half"
android:background="@drawable/btn_circle_transparent_full" android:background="@drawable/btn_circle_transparent_full"
android:contentDescription="@string/shared_string_back" android:contentDescription="@string/shared_string_back"
android:src="@drawable/ic_arrow_back" android:src="@drawable/ic_arrow_back"
android:tint="?attr/text_color_tab_active_white" android:tint="?attr/text_color_tab_active_white" />
android:layout_marginStart="8dp" />
<LinearLayout <LinearLayout
android:id="@+id/toolbar_options_flow_bg" android:id="@+id/toolbar_options_flow_bg"

View file

@ -0,0 +1,470 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:background="?attr/activity_background_basic"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/bg_color"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingTop="@dimen/content_padding_half"
android:paddingBottom="@dimen/content_padding_half">
<ImageView
android:id="@+id/icon_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/content_padding"
tools:src="@drawable/ic_action_hillshade_dark" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/title_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
tools:text="Terrain" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/state_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
tools:text="Enabled" />
</LinearLayout>
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/switch_compat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/content_padding" />
</LinearLayout>
<include
android:id="@+id/titleBottomDivider"
layout="@layout/card_bottom_divider"
tools:visibility="gone" />
<LinearLayout
android:id="@+id/content_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/bg_color"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_sheet_list_item_height"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"
android:baselineAligned="false"
android:orientation="horizontal">
<FrameLayout
android:id="@+id/hillshade_btn_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
tools:background="@drawable/btn_border_left_active">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/hillshade_btn"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground"
android:gravity="center"
android:text="@string/shared_string_hillshade"
android:textSize="@dimen/default_desc_text_size"
android:textStyle="bold" />
</FrameLayout>
<FrameLayout
android:id="@+id/slope_btn_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/slope_btn"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground"
android:gravity="center"
android:text="@string/shared_string_slope"
android:textSize="@dimen/default_desc_text_size"
android:textStyle="bold"
tools:background="@drawable/btn_border_right_inactive" />
</FrameLayout>
</LinearLayout>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/content_padding"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
tools:text="Hillshade map using dark shades to show slopes, peaks and lowlands." />
</LinearLayout>
<include layout="@layout/card_top_divider" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/bg_color"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingStart="@dimen/content_padding"
android:paddingTop="@dimen/content_padding_small"
android:paddingEnd="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/shared_string_transparency"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/transparency_value_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
tools:text="25%" />
</LinearLayout>
<com.google.android.material.slider.Slider
android:id="@+id/transparency_slider"
style="@style/Widget.MaterialComponents.Slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/list_header_settings_top_margin"
android:stepSize="1"
android:theme="@style/Theme.MaterialComponents"
app:haloRadius="@dimen/slider_thumb_halo_size"
app:thumbRadius="@dimen/slider_thumb_size"
app:tickColor="@android:color/transparent"
app:trackHeight="@dimen/slider_track_height" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_half"
android:background="?attr/dashboard_divider"
android:focusable="false" />
<net.osmand.plus.widgets.TextViewEx
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/content_padding"
android:paddingTop="@dimen/list_header_settings_top_margin"
android:paddingEnd="@dimen/content_padding"
android:text="@string/shared_string_zoom_levels"
android:textColor="@color/preference_category_title"
android:textSize="@dimen/default_desc_text_size" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="@dimen/content_padding"
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding"
android:paddingBottom="@dimen/content_padding_half">
<net.osmand.plus.widgets.TextViewEx
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start"
android:text="Min"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size" />
<net.osmand.plus.widgets.TextViewEx
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:text="Max"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/zoom_value_min"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
tools:text="3" />
<com.google.android.material.slider.Slider
android:id="@+id/zoom_slider"
style="@style/Widget.MaterialComponents.Slider"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:stepSize="1"
app:tickColor="@color/color_black"
android:theme="@style/Theme.MaterialComponents"
app:haloRadius="@dimen/slider_thumb_halo_size"
app:thumbRadius="@dimen/slider_thumb_size"
app:trackHeight="@dimen/slider_track_height" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/zoom_value_max"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
tools:text="19" />
</LinearLayout>
<net.osmand.plus.widgets.TextViewEx
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/content_padding"
android:text="@string/terrain_slider_description"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size" />
</LinearLayout>
<include layout="@layout/card_bottom_divider" />
<include
android:id="@+id/legend_top_divider"
layout="@layout/card_top_divider" />
<LinearLayout
android:id="@+id/legend_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/bg_color"
android:orientation="vertical">
<net.osmand.plus.widgets.TextViewEx
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/content_padding"
android:paddingTop="@dimen/list_header_settings_top_margin"
android:paddingBottom="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding"
android:text="@string/shared_string_legend"
android:textColor="@color/preference_category_title"
android:textSize="@dimen/default_desc_text_size" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:src="@drawable/img_legend_slope" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/slope_read_more_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/content_padding"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
tools:text="@string/slope_read_more" />
</LinearLayout>
<include
android:id="@+id/legend_bottom_divider"
layout="@layout/card_bottom_divider" />
<include
android:id="@+id/download_container_top_divider"
layout="@layout/card_top_divider" />
<LinearLayout
android:id="@+id/download_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/bg_color"
android:orientation="vertical">
<net.osmand.plus.widgets.TextViewEx
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/content_padding"
android:paddingTop="@dimen/list_header_settings_top_margin"
android:paddingEnd="@dimen/content_padding"
android:text="@string/welmode_download_maps"
android:textColor="@color/preference_category_title"
android:textSize="@dimen/default_desc_text_size" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/download_description_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/content_padding"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
tools:text="@string/hillshade_download_description" />
<com.github.ksoichiro.android.observablescrollview.ObservableListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:fadeScrollbars="true" />
</LinearLayout>
<include
android:id="@+id/download_container_bottom_divider"
layout="@layout/card_bottom_divider" />
</LinearLayout>
<LinearLayout
android:id="@+id/empty_state"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/content_padding_small">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/empty_state_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:src="@drawable/img_empty_state_terrain" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|bottom"
android:layout_margin="@dimen/content_padding_half"
android:background="@drawable/bg_dark_transp"
android:gravity="start|bottom"
android:padding="@dimen/map_button_margin"
android:text="@string/shared_string_hillshade"
android:textColor="@color/color_white" />
</FrameLayout>
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|bottom"
android:layout_margin="@dimen/content_padding_half"
android:background="@drawable/bg_dark_transp"
android:gravity="start|bottom"
android:padding="@dimen/map_button_margin"
android:text="@string/shared_string_slope"
android:textColor="@color/color_white" />
</FrameLayout>
</LinearLayout>
</FrameLayout>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/empty_state_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginBottom="@dimen/content_padding"
android:gravity="start"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
tools:text="@string/terrain_empty_state_text" />
</LinearLayout>
<View
android:id="@+id/bottom_empty_space"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="false" />
</LinearLayout>
</ScrollView>

View file

@ -20,8 +20,10 @@
android:orientation="horizontal" android:orientation="horizontal"
android:minHeight="@dimen/list_item_height" android:minHeight="@dimen/list_item_height"
android:paddingLeft="@dimen/dialog_content_margin" android:paddingLeft="@dimen/dialog_content_margin"
android:gravity="center_vertical" android:paddingStart="@dimen/dialog_content_margin"
android:paddingStart="@dimen/dialog_content_margin"> android:paddingRight="0dp"
android:paddingEnd="0dp"
android:gravity="center_vertical">
<CheckBox <CheckBox
android:id="@+id/check_local_index" android:id="@+id/check_local_index"
@ -32,9 +34,11 @@
android:paddingTop="4dp" android:paddingTop="4dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
android:paddingRight="@dimen/dialog_content_margin" android:paddingRight="@dimen/dialog_content_margin"
android:paddingEnd="@dimen/dialog_content_margin"
android:paddingLeft="0dp"
android:paddingStart="0dp"
android:clickable="false" android:clickable="false"
android:focusableInTouchMode="false" android:focusableInTouchMode="false" />
android:paddingEnd="@dimen/dialog_content_margin" />
<ImageView <ImageView
android:id="@+id/icon" android:id="@+id/icon"
@ -51,23 +55,25 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="@dimen/gpx_text_top_margin" android:paddingTop="@dimen/gpx_text_top_margin"
android:paddingBottom="@dimen/gpx_text_top_margin" android:paddingBottom="@dimen/gpx_text_top_margin"
android:paddingRight="@dimen/showAllButtonMarginRight" android:layout_marginRight="@dimen/showAllButtonMarginRight"
android:layout_marginEnd="@dimen/showAllButtonMarginRight"
android:layout_weight="1" android:layout_weight="1"
android:orientation="vertical" android:orientation="vertical">
android:paddingEnd="@dimen/showAllButtonMarginRight">
<TextView <TextView
android:id="@+id/name" android:id="@+id/name"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="start"
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size" android:textSize="@dimen/default_list_text_size"
tools:text="@string/current_track"/> tools:text="@string/current_track"/>
<LinearLayout <LinearLayout
android:id="@+id/read_section" android:id="@+id/read_section"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="start"
android:orientation="horizontal" android:orientation="horizontal"
android:visibility="visible" android:visibility="visible"
android:gravity="center_vertical"> android:gravity="center_vertical">
@ -77,8 +83,8 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="@dimen/gpx_small_icon_margin" android:layout_marginRight="@dimen/gpx_small_icon_margin"
android:src="@drawable/ic_small_distance" android:layout_marginEnd="@dimen/gpx_small_icon_margin"
android:layout_marginEnd="@dimen/gpx_small_icon_margin" /> android:src="@drawable/ic_small_distance" />
<TextView <TextView
android:id="@+id/distance" android:id="@+id/distance"
@ -95,8 +101,8 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="@dimen/gpx_small_icon_margin" android:layout_marginRight="@dimen/gpx_small_icon_margin"
android:src="@drawable/ic_small_point" android:layout_marginEnd="@dimen/gpx_small_icon_margin"
android:layout_marginEnd="@dimen/gpx_small_icon_margin" /> android:src="@drawable/ic_small_point" />
<TextView <TextView
android:id="@+id/points_count" android:id="@+id/points_count"
@ -113,8 +119,8 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="@dimen/gpx_small_icon_margin" android:layout_marginRight="@dimen/gpx_small_icon_margin"
android:src="@drawable/ic_small_time" android:layout_marginEnd="@dimen/gpx_small_icon_margin"
android:layout_marginEnd="@dimen/gpx_small_icon_margin" /> android:src="@drawable/ic_small_time" />
<TextView <TextView
android:id="@+id/time" android:id="@+id/time"
@ -159,10 +165,10 @@
android:layout_width="@dimen/list_item_height" android:layout_width="@dimen/list_item_height"
android:layout_height="@dimen/list_item_height" android:layout_height="@dimen/list_item_height"
android:layout_marginLeft="@dimen/favorites_icon_right_margin" android:layout_marginLeft="@dimen/favorites_icon_right_margin"
android:layout_marginStart="@dimen/favorites_icon_right_margin"
android:background="?attr/dashboard_button" android:background="?attr/dashboard_button"
android:src="@drawable/ic_action_gsave_dark" android:src="@drawable/ic_action_gsave_dark"
android:visibility="gone" android:visibility="gone" />
android:layout_marginStart="@dimen/favorites_icon_right_margin" />
<ImageButton <ImageButton
android:id="@+id/stop" android:id="@+id/stop"
@ -198,9 +204,9 @@
android:clickable="false" android:clickable="false"
android:focusable="false" android:focusable="false"
android:focusableInTouchMode="false" android:focusableInTouchMode="false"
android:paddingRight="@dimen/list_content_padding" android:layout_marginRight="@dimen/list_content_padding"
android:gravity="center_vertical" android:layout_marginEnd="@dimen/list_content_padding"
android:paddingEnd="@dimen/list_content_padding" /> android:gravity="center_vertical" />
<androidx.appcompat.widget.AppCompatCheckBox <androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/toggle_checkbox_item" android:id="@+id/toggle_checkbox_item"
@ -208,12 +214,12 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="4dp" android:paddingTop="4dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
android:paddingRight="@dimen/dialog_content_margin" android:layout_marginRight="@dimen/dialog_content_margin"
android:layout_marginEnd="@dimen/dialog_content_margin"
android:clickable="false" android:clickable="false"
android:focusable="false" android:focusable="false"
android:focusableInTouchMode="false" android:focusableInTouchMode="false"
android:visibility="gone" android:visibility="gone" />
android:paddingEnd="@dimen/dialog_content_margin" />
</LinearLayout> </LinearLayout>

View file

@ -7,49 +7,57 @@
android:minHeight="@dimen/setting_list_item_small_height" android:minHeight="@dimen/setting_list_item_small_height"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout <FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/bg_color" android:background="?attr/bg_color"
android:gravity="center_vertical"> android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/content_padding"
tools:src="@drawable/ic_action_offroad" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:orientation="vertical" android:background="?attr/selectableItemBackground"
android:paddingTop="@dimen/content_padding_small" android:gravity="center_vertical"
android:paddingBottom="@dimen/content_padding_small"> android:orientation="horizontal">
<net.osmand.plus.widgets.TextViewEx <ImageView
android:id="@+id/title" android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/content_padding"
tools:src="@drawable/ic_action_offroad" />
<LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ellipsize="end" android:orientation="vertical"
android:maxLines="1" android:paddingTop="@dimen/content_padding_small"
android:textColor="?android:textColorPrimary" android:paddingBottom="@dimen/content_padding_small">
android:textSize="@dimen/default_list_text_size"
tools:text="OffRoad" />
<net.osmand.plus.widgets.TextViewEx <net.osmand.plus.widgets.TextViewEx
android:id="@+id/sub_title" android:id="@+id/title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1" android:maxLines="1"
android:textColor="?android:textColorSecondary" android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_desc_text_size" android:textSize="@dimen/default_list_text_size"
tools:text="Navigation type: Car" /> tools:text="OffRoad" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/sub_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
tools:text="Navigation type: Car" />
</LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </FrameLayout>
<include <include
android:id="@+id/bottom_divider" android:id="@+id/bottom_divider"

View file

@ -13,43 +13,62 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginLeft="24dp" android:layout_marginLeft="24dp"
android:layout_marginStart="24dp"
android:gravity="center" android:gravity="center"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible" tools:visibility="visible" />
android:layout_marginStart="24dp" />
<androidx.appcompat.widget.AppCompatTextView <FrameLayout
android:id="@+id/title"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="11dip" android:layout_gravity="center_vertical"
android:layout_marginStart="@dimen/content_padding_small"
android:layout_marginLeft="@dimen/content_padding_small" android:layout_marginLeft="@dimen/content_padding_small"
android:layout_marginTop="11dp" android:layout_marginTop="@dimen/content_padding_small"
android:layout_weight="1" android:layout_marginBottom="@dimen/content_padding_small"
android:gravity="center_vertical" android:layout_weight="1">
android:text="@string/layer_poi"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
android:layout_marginStart="@dimen/content_padding_small" />
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/icon_settings" android:id="@+id/title"
android:contentDescription="@string/shared_string_settings" android:layout_width="wrap_content"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_height="match_parent" android:layout_gravity="center_vertical|start"
android:focusable="false" android:gravity="center_vertical|start"
android:gravity="center_vertical" android:layout_marginRight="52dp"
android:visibility="gone" android:layout_marginEnd="52dp"
tools:visibility="visible"/> android:text="@string/layer_poi"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size" />
<!-- android:button="@drawable/ic_btn_wocheckbox" --> <LinearLayout
<androidx.appcompat.widget.AppCompatCheckBox android:layout_width="wrap_content"
android:id="@+id/toggle_item" android:layout_height="wrap_content"
android:layout_width="wrap_content" android:layout_gravity="center_vertical|end"
android:layout_height="match_parent" android:orientation="horizontal">
android:layout_marginRight="24dp"
android:layout_marginEnd="24dp" <androidx.appcompat.widget.AppCompatImageView
android:focusable="false" android:id="@+id/icon_settings"
app:buttonTint="?attr/active_color_basic" /> android:contentDescription="@string/shared_string_settings"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:focusable="false"
android:gravity="center_vertical"
android:visibility="gone"
tools:visibility="visible"/>
<!-- android:button="@drawable/ic_btn_wocheckbox" -->
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/toggle_item"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginRight="24dp"
android:layout_marginEnd="24dp"
android:focusable="false"
android:layout_gravity="center"
app:buttonTint="?attr/active_color_basic" />
</LinearLayout>
</FrameLayout>
</LinearLayout> </LinearLayout>

View file

@ -1,34 +1,36 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/expandable_list_item_background" android:paddingLeft="@dimen/list_content_padding"
android:descendantFocusability="blocksDescendants" android:paddingStart="@dimen/list_content_padding"
android:minHeight="@dimen/list_item_height" android:paddingRight="0dp"
android:orientation="horizontal" android:paddingEnd="0dp"
android:paddingLeft="@dimen/list_content_padding" android:background="?attr/expandable_list_item_background"
android:paddingStart="@dimen/list_content_padding"> android:descendantFocusability="blocksDescendants"
android:minHeight="@dimen/list_item_height"
android:orientation="horizontal">
<CheckBox <CheckBox
android:id="@+id/check_local_index" android:id="@+id/check_local_index"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="@dimen/local_index_check_right_margin"
android:layout_marginEnd="@dimen/local_index_check_right_margin"
android:layout_marginTop="@dimen/favorites_icon_top_margin" android:layout_marginTop="@dimen/favorites_icon_top_margin"
android:layout_marginEnd="@dimen/local_index_check_right_margin"
android:layout_marginRight="@dimen/local_index_check_right_margin"
android:focusable="false" android:focusable="false"
android:visibility="gone"/> android:visibility="gone" />
<ImageView <ImageView
android:id="@+id/icon" android:id="@+id/icon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="@dimen/favorites_icon_right_margin"
android:layout_marginEnd="@dimen/favorites_icon_right_margin"
android:layout_marginTop="@dimen/favorites_icon_top_margin" android:layout_marginTop="@dimen/favorites_icon_top_margin"
android:layout_marginEnd="@dimen/favorites_icon_right_margin"
android:layout_marginRight="@dimen/favorites_icon_right_margin"
android:focusable="false" android:focusable="false"
android:src="@drawable/ic_gpx_track"/> android:src="@drawable/ic_gpx_track" />
<LinearLayout <LinearLayout
android:layout_width="0dp" android:layout_width="0dp"
@ -43,7 +45,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size" android:textSize="@dimen/default_list_text_size"
tools:text="Bangladesh"/> tools:text="Bangladesh" />
<LinearLayout <LinearLayout
@ -55,11 +57,11 @@
android:id="@+id/descriptionTextView" android:id="@+id/descriptionTextView"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="7dp"
android:layout_marginEnd="7dp" android:layout_marginEnd="7dp"
android:layout_marginRight="7dp"
android:textColor="?android:textColorSecondary" android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_sub_text_size" android:textSize="@dimen/default_sub_text_size"
tools:text="12.34 Mb * 10/4/2015"/> tools:text="12.34 Mb * 10/4/2015" />
</LinearLayout> </LinearLayout>
@ -67,11 +69,11 @@
<ImageButton <ImageButton
android:id="@+id/options" android:id="@+id/options"
android:contentDescription="@string/shared_string_more"
android:layout_width="@dimen/list_item_height" android:layout_width="@dimen/list_item_height"
android:layout_height="@dimen/list_item_height" android:layout_height="@dimen/list_item_height"
android:background="?attr/dashboard_button" android:background="?attr/dashboard_button"
android:contentDescription="@string/shared_string_more"
android:focusable="false" android:focusable="false"
android:src="@drawable/ic_overflow_menu_white"/> android:src="@drawable/ic_overflow_menu_white" />
</LinearLayout> </LinearLayout>

View file

@ -43,9 +43,9 @@
<net.osmand.plus.widgets.TextViewEx <net.osmand.plus.widgets.TextViewEx
android:id="@+id/title" android:id="@+id/title"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center|start" android:layout_gravity="center_vertical|start"
android:text="@string/configure_profile" android:text="@string/configure_profile"
osmand:typeface="@string/font_roboto_medium" osmand:typeface="@string/font_roboto_medium"
android:textColor="?attr/active_color_basic" android:textColor="?attr/active_color_basic"

View file

@ -48,8 +48,9 @@
<net.osmand.plus.widgets.TextViewEx <net.osmand.plus.widgets.TextViewEx
android:id="@+id/title" android:id="@+id/title"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical|start"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="2" android:maxLines="2"
osmand:typeface="@string/font_roboto_medium" osmand:typeface="@string/font_roboto_medium"
@ -59,8 +60,9 @@
<net.osmand.plus.widgets.TextViewEx <net.osmand.plus.widgets.TextViewEx
android:id="@+id/description" android:id="@+id/description"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical|start"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1" android:maxLines="1"
osmand:typeface="@string/font_roboto_regular" osmand:typeface="@string/font_roboto_regular"

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