Merge branch 'master' into Fix_default_color_favorites

# Conflicts:
#	OsmAnd/src/net/osmand/plus/activities/FavoritesTreeFragment.java
This commit is contained in:
Dima-1 2020-05-18 12:00:36 +03:00
commit a8db838530
300 changed files with 9289 additions and 3441 deletions

View file

@ -3,6 +3,7 @@ package net.osmand.binary;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.WireFormat;
import net.osmand.Collator;
@ -26,6 +27,7 @@ import net.osmand.binary.OsmandOdb.OsmAndMapIndex.MapRootLevel;
import net.osmand.data.Amenity;
import net.osmand.data.Building;
import net.osmand.data.City;
import net.osmand.data.IncompleteTransportRoute;
import net.osmand.data.LatLon;
import net.osmand.data.MapObject;
import net.osmand.data.Street;
@ -109,6 +111,7 @@ public class BinaryMapIndexReader {
/*private*/ List<TransportIndex> transportIndexes = new ArrayList<TransportIndex>();
/*private*/ List<RouteRegion> routingIndexes = new ArrayList<RouteRegion>();
/*private*/ List<BinaryIndexPart> indexes = new ArrayList<BinaryIndexPart>();
TLongObjectHashMap<IncompleteTransportRoute> incompleteTransportRoutes = null;
protected CodedInputStream codedIS;
@ -2634,5 +2637,18 @@ public class BinaryMapIndexReader {
}
}
public TLongObjectHashMap<IncompleteTransportRoute> getIncompleteTransportRoutes() throws InvalidProtocolBufferException, IOException {
if (incompleteTransportRoutes == null) {
incompleteTransportRoutes = new TLongObjectHashMap<>();
for (TransportIndex ti : transportIndexes) {
if (ti.incompleteRoutesLength > 0) {
transportAdapter.readIncompleteRoutesList(incompleteTransportRoutes, ti.incompleteRoutesLength,
ti.incompleteRoutesOffset);
}
}
}
return incompleteTransportRoutes;
}
}

View file

@ -9,6 +9,7 @@ import com.google.protobuf.CodedInputStream;
import com.google.protobuf.WireFormat;
import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.map.hash.TLongObjectHashMap;
import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
import net.osmand.data.TransportSchedule;
import net.osmand.data.TransportStop;
@ -43,6 +44,8 @@ public class BinaryMapTransportReaderAdapter {
int stopsFileOffset = 0;
int stopsFileLength = 0;
int incompleteRoutesOffset = 0;
int incompleteRoutesLength = 0;
public String getPartName() {
return "Transport";
@ -68,6 +71,7 @@ public class BinaryMapTransportReaderAdapter {
return bottom;
}
IndexStringTable stringTable = null;
}
@ -108,6 +112,12 @@ public class BinaryMapTransportReaderAdapter {
ind.stringTable = st;
codedIS.seek(st.length + st.fileOffset);
break;
case OsmandOdb.OsmAndTransportIndex.INCOMPLETEROUTES_FIELD_NUMBER :
ind.incompleteRoutesLength = codedIS.readRawVarint32();
ind.incompleteRoutesOffset = codedIS.getTotalBytesRead();
codedIS.seek(ind.incompleteRoutesLength + ind.incompleteRoutesOffset);
break;
default:
skipUnknownField(t);
break;
@ -115,6 +125,7 @@ public class BinaryMapTransportReaderAdapter {
}
}
private void readTransportBounds(TransportIndex ind) throws IOException {
while(true){
int t = codedIS.readTag();
@ -240,6 +251,79 @@ public class BinaryMapTransportReaderAdapter {
return ((char) i)+"";
}
public void readIncompleteRoutesList(TLongObjectHashMap<net.osmand.data.IncompleteTransportRoute> incompleteRoutes,
int length, int offset) throws IOException {
codedIS.seek(offset);
boolean end = false;
while (!end) {
int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t);
switch (tag) {
case 0:
end = true;
break;
case OsmandOdb.IncompleteTransportRoutes.ROUTES_FIELD_NUMBER:
int l = codedIS.readRawVarint32();
int olds = codedIS.pushLimit(l);
net.osmand.data.IncompleteTransportRoute ir = readIncompleteRoute();
net.osmand.data.IncompleteTransportRoute itr = incompleteRoutes.get(ir.getRouteId());
if(itr != null) {
itr.setNextLinkedRoute(ir);
} else {
incompleteRoutes.put(ir.getRouteId(), ir);
}
codedIS.popLimit(olds);
break;
default:
skipUnknownField(t);
break;
}
}
}
public net.osmand.data.IncompleteTransportRoute readIncompleteRoute() throws IOException {
net.osmand.data.IncompleteTransportRoute dataObject = new net.osmand.data.IncompleteTransportRoute();
boolean end = false;
while(!end){
int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t);
switch (tag) {
case 0:
end = true;
break;
case OsmandOdb.IncompleteTransportRoute.ID_FIELD_NUMBER :
dataObject.setRouteId(codedIS.readUInt64());
break;
case OsmandOdb.IncompleteTransportRoute.ROUTEREF_FIELD_NUMBER :
dataObject.setRouteOffset(codedIS.readRawVarint32());
break;
case OsmandOdb.IncompleteTransportRoute.OPERATOR_FIELD_NUMBER :
skipUnknownField(t);
// dataObject.setOperator(regStr(stringTable));
break;
case OsmandOdb.IncompleteTransportRoute.REF_FIELD_NUMBER :
skipUnknownField(t);
// dataObject.setRef(regStr(stringTable));
break;
case OsmandOdb.IncompleteTransportRoute.TYPE_FIELD_NUMBER :
skipUnknownField(t);
// dataObject.setType(regStr(stringTable));
break;
case OsmandOdb.IncompleteTransportRoute.MISSINGSTOPS_FIELD_NUMBER :
// dataObject.getMissingStops().add(codedIS.readSInt32()); //skip for now
skipUnknownField(t);
break;
default:
skipUnknownField(t);
break;
}
}
return dataObject;
}
public net.osmand.data.TransportRoute getTransportRoute(int filePointer, TIntObjectHashMap<String> stringTable,
boolean onlyDescription) throws IOException {
codedIS.seek(filePointer);
@ -394,7 +478,6 @@ public class BinaryMapTransportReaderAdapter {
codedIS.seek(ind.stringTable.fileOffset);
int oldLimit = codedIS.pushLimit(ind.stringTable.length);
int current = 0;
int i = 0;
while (codedIS.getBytesUntilLimit() > 0) {
int t = codedIS.readTag();
int tag = WireFormat.getTagFieldNumber(t);

View file

@ -26,7 +26,6 @@ import net.osmand.binary.OsmandIndex.PoiPart;
import net.osmand.binary.OsmandIndex.RoutingPart;
import net.osmand.binary.OsmandIndex.RoutingSubregion;
import net.osmand.binary.OsmandIndex.TransportPart;
import net.osmand.util.MapUtils;
import org.apache.commons.logging.Log;
@ -131,6 +130,10 @@ public class CachedOsmandIndexes {
transport.setBottom(index.getBottom());
transport.setStopsTableLength(index.stopsFileLength);
transport.setStopsTableOffset(index.stopsFileOffset);
// if(index.incompleteRoutesLength > 0) {
transport.setIncompleteRoutesLength(index.incompleteRoutesLength);
transport.setIncompleteRoutesOffset(index.incompleteRoutesOffset);
// }
transport.setStringTableLength(index.stringTable.length);
transport.setStringTableOffset(index.stringTable.fileOffset);
fileIndex.addTransportIndex(transport);
@ -269,6 +272,8 @@ public class CachedOsmandIndexes {
mi.bottom = index.getBottom();
mi.stopsFileLength = index.getStopsTableLength();
mi.stopsFileOffset = index.getStopsTableOffset();
mi.incompleteRoutesLength = index.getIncompleteRoutesLength();
mi.incompleteRoutesOffset = index.getIncompleteRoutesOffset();
mi.stringTable = new IndexStringTable();
mi.stringTable.fileOffset = index.getStringTableOffset();
mi.stringTable.length = index.getStringTableLength();

File diff suppressed because it is too large Load diff

View file

@ -1012,8 +1012,7 @@ public class RouteDataObject {
}
public boolean hasNameTagStartsWith(String tagStartsWith) {
int[] nextSegmentNameIds = nameIds;
for (int nm = 0; nm < nameIds.length; nm++) {
for (int nm = 0; nameIds != null && nm < nameIds.length; nm++) {
RouteTypeRule rtr = region.quickGetEncodingRule(nameIds[nm]);
if (rtr != null && rtr.getTag().startsWith(tagStartsWith)) {
return true;

View file

@ -44,8 +44,8 @@ public class DataTileManager<T> {
return x;
}
private void putObjects(int tx, int ty, List<T> r){
if(objects.containsKey(evTile(tx, ty))){
private void putObjects(int tx, int ty, List<T> r) {
if (objects.containsKey(evTile(tx, ty))) {
r.addAll(objects.get(evTile(tx, ty)));
}
}

View file

@ -0,0 +1,59 @@
package net.osmand.data;
public class IncompleteTransportRoute {
private long routeId;
private int routeOffset = -1;
private String operator;
private String type;
private String ref;
private IncompleteTransportRoute nextLinkedRoute;
public IncompleteTransportRoute getNextLinkedRoute() {
return nextLinkedRoute;
}
public void setNextLinkedRoute(IncompleteTransportRoute nextLinkedRoute) {
this.nextLinkedRoute = nextLinkedRoute;
}
public long getRouteId() {
return routeId;
}
public void setRouteId(long routeId) {
this.routeId = routeId;
}
public int getRouteOffset() {
return routeOffset;
}
public void setRouteOffset(int routeOffset) {
this.routeOffset = routeOffset;
}
public String getOperator() {
return operator;
}
public void setOperator(String operator) {
this.operator = operator;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getRef() {
return ref;
}
public void setRef(String ref) {
this.ref = ref;
}
}

View file

@ -1,10 +1,5 @@
package net.osmand.data;
import net.osmand.osm.edit.Node;
import net.osmand.osm.edit.Way;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@ -12,6 +7,11 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.osmand.osm.edit.Node;
import net.osmand.osm.edit.Way;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
public class TransportRoute extends MapObject {
private List<TransportStop> forwardStops = new ArrayList<TransportStop>();
private String ref;
@ -26,6 +26,20 @@ public class TransportRoute extends MapObject {
public TransportRoute() {
}
public TransportRoute(TransportRoute r, List<TransportStop> forwardStops, List<Way> forwardWay) {
this.name = r.name;
this.enName = r.enName;
this.names = r.names;
this.id = r.id;
this.operator = r.operator;
this.ref = r.ref;
this.type = r.type;
this.color = r.color;
this.schedule = r.schedule;
this.forwardStops = forwardStops;
this.forwardWays = forwardWay;
}
public TransportSchedule getSchedule() {
return schedule;
}
@ -37,6 +51,14 @@ public class TransportRoute extends MapObject {
return schedule;
}
public boolean isIncomplete() {
for (TransportStop s : forwardStops) {
if (s.isMissingStop()) {
return true;
}
}
return false;
}
public List<TransportStop> getForwardStops() {
return forwardStops;
@ -70,7 +92,8 @@ public class TransportRoute extends MapObject {
resortWaysToStopsOrder(forwardWays, forwardStops);
}
public static void mergeRouteWays(List<Way> forwardWays) {
// intrusive operation cause it changes ways itself!
private static void mergeRouteWays(List<Way> forwardWays) {
boolean changed = true;
// combine as many ways as possible
while (changed && forwardWays != null) {
@ -137,7 +160,7 @@ public class TransportRoute extends MapObject {
}
}
public static Map<Way, int[]> resortWaysToStopsOrder(List<Way> forwardWays, List<TransportStop> forwardStops) {
private static Map<Way, int[]> resortWaysToStopsOrder(List<Way> forwardWays, List<TransportStop> forwardStops) {
final Map<Way, int[]> orderWays = new HashMap<Way, int[]>();
if (forwardWays != null && forwardStops.size() > 0) {
// resort ways to stops order

View file

@ -12,6 +12,7 @@ import java.util.List;
public class TransportStop extends MapObject {
private static final int DELETED_STOP = -1;
public static final String MISSING_STOP_NAME = "#Missing Stop";
private int[] referencesToRoutes = null;
private long[] deletedRoutesIds;
@ -31,6 +32,10 @@ public class TransportStop extends MapObject {
return routes;
}
public boolean isMissingStop() {
return MISSING_STOP_NAME.equals(getName());
}
public LinkedHashMap<String, int[]> getReferencesToRoutesMap() {
return referencesToRoutesMap;
}

View file

@ -54,10 +54,14 @@ public class Relation extends Entity {
}
public void addMember(Long id, EntityType type, String role){
addMember(new EntityId(type, id), role);
}
public void addMember(EntityId id, String role){
if(members == null){
members = new ArrayList<>();
}
members.add(new RelationMember(new EntityId(type, id), role));
members.add(new RelationMember(id, role));
}
public List<RelationMember> getMembers(String role) {
@ -116,6 +120,15 @@ public class Relation extends Entity {
return null;
}
public void update(RelationMember r, EntityId newEntityId) {
r.entity = null;
r.entityId = newEntityId;
}
public void updateRole(RelationMember r, String newRole) {
r.role = newRole;
}
public boolean remove(EntityId key) {
if(members != null) {
Iterator<RelationMember> it = members.iterator();

View file

@ -5,20 +5,23 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
import gnu.trove.iterator.TIntIterator;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.map.hash.TLongObjectHashMap;
import net.osmand.NativeLibrary;
import net.osmand.binary.BinaryMapIndexReader;
import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
import net.osmand.data.IncompleteTransportRoute;
import net.osmand.data.LatLon;
import net.osmand.data.QuadRect;
import net.osmand.data.TransportRoute;
@ -32,11 +35,14 @@ import net.osmand.util.MapUtils;
public class TransportRoutePlanner {
private static final boolean MEASURE_TIME = false;
private static final int MISSING_STOP_SEARCH_RADIUS = 15000;
private static final int MIN_DIST_STOP_TO_GEOMETRY = 150;
public static final long GEOMETRY_WAY_ID = -1;
public static final long STOPS_WAY_ID = -2;
public List<TransportRouteResult> buildRoute(TransportRoutingContext ctx, LatLon start, LatLon end) throws IOException, InterruptedException {
ctx.startCalcTime = System.currentTimeMillis();
double totalDistance = MapUtils.getDistance(start, end);
List<TransportRouteSegment> startStops = ctx.getTransportStops(start);
List<TransportRouteSegment> endStops = ctx.getTransportStops(end);
@ -55,7 +61,14 @@ public class TransportRoutePlanner {
}
double finishTime = ctx.cfg.maxRouteTime;
double maxTravelTimeCmpToWalk = MapUtils.getDistance(start, end) / ctx.cfg.walkSpeed - ctx.cfg.changeTime / 2;
ctx.finishTimeSeconds = ctx.cfg.finishTimeSeconds;
if (totalDistance > ctx.cfg.maxRouteDistance && ctx.cfg.maxRouteIncreaseSpeed > 0) {
int increaseTime = (int) ((totalDistance - ctx.cfg.maxRouteDistance)
* 3.6 / ctx.cfg.maxRouteIncreaseSpeed);
finishTime += increaseTime;
ctx.finishTimeSeconds += increaseTime / 6;
}
double maxTravelTimeCmpToWalk = totalDistance / ctx.cfg.walkSpeed - ctx.cfg.changeTime / 2;
List<TransportRouteSegment> results = new ArrayList<TransportRouteSegment>();
initProgressBar(ctx, start, end);
while (!queue.isEmpty()) {
@ -77,7 +90,7 @@ public class TransportRoutePlanner {
if (segment.getDepth() > ctx.cfg.maxNumberOfChanges + 1) {
continue;
}
if (segment.distFromStart > finishTime + ctx.cfg.finishTimeSeconds ||
if (segment.distFromStart > finishTime + ctx.finishTimeSeconds ||
segment.distFromStart > maxTravelTimeCmpToWalk) {
break;
}
@ -109,7 +122,7 @@ public class TransportRoutePlanner {
} else {
travelTime += ctx.cfg.stopTime + segmentDist / routeTravelSpeed;
}
if(segment.distFromStart + travelTime > finishTime + ctx.cfg.finishTimeSeconds) {
if(segment.distFromStart + travelTime > finishTime + ctx.finishTimeSeconds) {
break;
}
sgms.clear();
@ -164,7 +177,7 @@ public class TransportRoutePlanner {
if (finishTime > finish.distFromStart) {
finishTime = finish.distFromStart;
}
if(finish.distFromStart < finishTime + ctx.cfg.finishTimeSeconds &&
if(finish.distFromStart < finishTime + ctx.finishTimeSeconds &&
(finish.distFromStart < maxTravelTimeCmpToWalk || results.size() == 0)) {
results.add(finish);
}
@ -376,8 +389,13 @@ public class TransportRoutePlanner {
return nodes;
}
private static class SearchNodeInd {
int ind = -1;
Way way = null;
double dist = MIN_DIST_STOP_TO_GEOMETRY;
}
public List<Way> getGeometry() {
List<Way> list = new ArrayList<>();
route.mergeForwardWays();
if (DISPLAY_FULL_SEGMENT_ROUTE) {
System.out.println("TOTAL SEGMENTS: " + route.getForwardWays().size());
@ -386,44 +404,69 @@ public class TransportRoutePlanner {
}
return route.getForwardWays();
}
List<Way> fw = route.getForwardWays();
double minStart = 150;
double minEnd = 150;
LatLon str = getStart().getLocation();
LatLon en = getEnd().getLocation();
int endInd = -1;
List<Node> res = new ArrayList<>();
for (int i = 0; i < fw.size() ; i++) {
List<Node> nodes = fw.get(i).getNodes();
List<Way> ways = route.getForwardWays();
final LatLon startLoc = getStart().getLocation();
final LatLon endLoc = getEnd().getLocation();
SearchNodeInd startInd = new SearchNodeInd();
SearchNodeInd endInd = new SearchNodeInd();
for (int i = 0; i < ways.size() ; i++) {
List<Node> nodes = ways.get(i).getNodes();
for (int j = 0; j < nodes.size(); j++) {
Node n = nodes.get(j);
if (MapUtils.getDistance(str, n.getLatitude(), n.getLongitude()) < minStart) {
minStart = MapUtils.getDistance(str, n.getLatitude(), n.getLongitude());
res.clear();
if (MapUtils.getDistance(startLoc, n.getLatitude(), n.getLongitude()) < startInd.dist) {
startInd.dist = MapUtils.getDistance(startLoc, n.getLatitude(), n.getLongitude());
startInd.ind = j;
startInd.way = ways.get(i);
}
res.add(n);
if (MapUtils.getDistance(en, n.getLatitude(), n.getLongitude()) < minEnd) {
endInd = res.size();
minEnd = MapUtils.getDistance(en, n.getLatitude(), n.getLongitude());
if (MapUtils.getDistance(endLoc, n.getLatitude(), n.getLongitude()) < endInd.dist) {
endInd.dist = MapUtils.getDistance(endLoc, n.getLatitude(), n.getLongitude());
endInd.ind = j;
endInd.way = ways.get(i);
}
}
}
Way way;
if (res.isEmpty() || endInd == -1) {
way = new Way(STOPS_WAY_ID);
boolean validOneWay = startInd.way != null && startInd.way == endInd.way && startInd.ind <= endInd.ind;
if (validOneWay) {
Way way = new Way(GEOMETRY_WAY_ID);
for (int k = startInd.ind; k <= endInd.ind; k++) {
way.addNode(startInd.way.getNodes().get(k));
}
return Collections.singletonList(way);
}
boolean validContinuation = startInd.way != null && endInd.way != null &&
startInd.way != endInd.way;
if (validContinuation) {
Node ln = startInd.way.getLastNode();
Node fn = endInd.way.getFirstNode();
// HERE we need to check other ways for continuation
if (ln != null && fn != null && MapUtils.getDistance(ln.getLatLon(), fn.getLatLon()) < MISSING_STOP_SEARCH_RADIUS) {
validContinuation = true;
} else {
validContinuation = false;
}
}
if (validContinuation) {
List<Way> two = new ArrayList<Way>();
Way way = new Way(GEOMETRY_WAY_ID);
for (int k = startInd.ind; k < startInd.way.getNodes().size(); k++) {
way.addNode(startInd.way.getNodes().get(k));
}
two.add(way);
way = new Way(GEOMETRY_WAY_ID);
for (int k = 0; k <= endInd.ind; k++) {
way.addNode(endInd.way.getNodes().get(k));
}
two.add(way);
return two;
}
Way way = new Way(STOPS_WAY_ID);
for (int i = start; i <= end; i++) {
LatLon l = getStop(i).getLocation();
Node n = new Node(l.getLatitude(), l.getLongitude(), -1);
way.addNode(n);
}
} else {
way = new Way(GEOMETRY_WAY_ID);
for(int k = 0; k < res.size() && k < endInd; k++) {
way.addNode(res.get(k));
}
}
list.add(way);
return list;
return Collections.singletonList(way);
}
public double getTravelDist() {
@ -574,8 +617,8 @@ public class TransportRoutePlanner {
if(aTime != -1) {
arriveTime = String.format("and arrive at %s", formatTransporTime(aTime));
}
bld.append(String.format(" %d. %s: walk %.1f m to '%s' and travel %s to '%s' by %s %d stops %s\n",
i + 1, s.route.getRef(), s.walkDist, s.getStart().getName(),
bld.append(String.format(" %d. %s [%d]: walk %.1f m to '%s' and travel %s to '%s' by %s %d stops %s\n",
i + 1, s.route.getRef(), s.route.getId() / 2, s.walkDist, s.getStart().getName(),
time, s.getEnd().getName(),s.route.getName(), (s.end - s.start), arriveTime));
}
bld.append(String.format(" F. Walk %.1f m to reach your destination", finishWalkDist));
@ -697,16 +740,23 @@ public class TransportRoutePlanner {
}
public static class TransportRoutingContext {
public NativeLibrary library;
public RouteCalculationProgress calculationProgress;
public TLongObjectHashMap<TransportRouteSegment> visitedSegments = new TLongObjectHashMap<TransportRouteSegment>();
public TransportRoutingConfiguration cfg;
public TLongObjectHashMap<TransportRoute> combinedRoutesCache = new TLongObjectHashMap<TransportRoute>();
public Map<TransportStop, List<TransportRoute>> missingStopsCache = new HashMap<TransportStop, List<TransportRoute>>();
public TLongObjectHashMap<List<TransportRouteSegment>> quadTree;
// Here we don't limit files by bbox, so it could be an issue while searching for multiple unused files
// Incomplete routes usually don't need more files than around Max-BBOX of start/end,
// so here an improvement could be introduced
public final Map<BinaryMapIndexReader, TIntObjectHashMap<TransportRoute>> routeMap =
new LinkedHashMap<BinaryMapIndexReader, TIntObjectHashMap<TransportRoute>>();
public int finishTimeSeconds;
// stats
public long startCalcTime;
public int visitedRoutesCount;
@ -723,7 +773,6 @@ public class TransportRoutePlanner {
public TransportRoutingContext(TransportRoutingConfiguration cfg, NativeLibrary library, BinaryMapIndexReader... readers) {
this.cfg = cfg;
walkRadiusIn31 = (int) (cfg.walkRadius / MapUtils.getTileDistanceWidth(31));
@ -785,7 +834,7 @@ public class TransportRoutePlanner {
// could be global ?
TLongObjectHashMap<TransportStop> loadedTransportStops = new TLongObjectHashMap<TransportStop>();
TIntObjectHashMap<TransportRoute> localFileRoutes = new TIntObjectHashMap<>();
TIntObjectHashMap<TransportRoute> localFileRoutes = new TIntObjectHashMap<>(); //reference, route
for (BinaryMapIndexReader r : routeMap.keySet()) {
sr.clearSearchResults();
List<TransportStop> stops = r.searchTransportIndex(sr);
@ -794,44 +843,49 @@ public class TransportRoutePlanner {
mergeTransportStops(r, loadedTransportStops, stops, localFileRoutes, routeMap.get(r));
for (TransportStop stop : stops) {
// skip missing stops
if (stop.isMissingStop()) {
continue;
}
long stopId = stop.getId();
TransportStop multifileStop = loadedTransportStops.get(stopId);
int[] rrs = stop.getReferencesToRoutes();
if (multifileStop == stop) {
// clear up so it won't be used as it is multi file stop
stop.setReferencesToRoutes(null);
} else {
// add other routes
stop.setReferencesToRoutes(null);
}
if (rrs != null && !multifileStop.isDeleted()) {
for (int rr : rrs) {
TransportRoute route = localFileRoutes.get(rr);
if (route == null) {
System.err.println(String.format("Something went wrong by loading route %d for stop %s", rr, stop));
} else if (multifileStop == stop ||
(!multifileStop.hasRoute(route.getId()) &&
!multifileStop.isRouteDeleted(route.getId()))) {
System.err.println(
String.format("Something went wrong by loading combined route %d for stop %s",
rr, stop));
} else {
TransportRoute combinedRoute = getCombinedRoute(route);
if (multifileStop == stop || (!multifileStop.hasRoute(combinedRoute.getId()) &&
!multifileStop.isRouteDeleted(combinedRoute.getId()))) {
// duplicates won't be added
multifileStop.addRouteId(route.getId());
multifileStop.addRoute(route);
multifileStop.addRouteId(combinedRoute.getId());
multifileStop.addRoute(combinedRoute);
}
}
}
}
}
}
// There should go stops with complete routes:
loadTransportSegments(loadedTransportStops.valueCollection(), lst);
readTime += System.nanoTime() - nanoTime;
return lst;
}
public static List<TransportStop> mergeTransportStops(BinaryMapIndexReader reader,
TLongObjectHashMap<TransportStop> loadedTransportStops,
List<TransportStop> stops,
TIntObjectHashMap<TransportRoute> localFileRoutes,
TIntObjectHashMap<TransportRoute> loadedRoutes) throws IOException {
TIntObjectHashMap<TransportRoute> loadedRoutes
) throws IOException {
TIntArrayList routesToLoad = new TIntArrayList();
TIntArrayList localRoutesToLoad = new TIntArrayList();
Iterator<TransportStop> it = stops.iterator();
@ -849,7 +903,7 @@ public class TransportRoutePlanner {
localRoutesToLoad.addAll(stop.getReferencesToRoutes());
}
} else if (multifileStop.isDeleted()){
// stop has noting to load, so not needed
// stop has nothing to load, so not needed
it.remove();
} else {
if (delRIds != null) {
@ -876,10 +930,10 @@ public class TransportRoutePlanner {
}
}
routesToLoad.addAll(localRoutesToLoad);
multifileStop.putReferencesToRoutes(reader.getFile().getName(), localRoutesToLoad.toArray());
multifileStop.putReferencesToRoutes(reader.getFile().getName(), localRoutesToLoad.toArray()); //add valid stop and references to routes
}
// load routes
// load/combine routes
if (routesToLoad.size() > 0) {
routesToLoad.sort();
TIntArrayList referencesToLoad = new TIntArrayList();
@ -888,7 +942,7 @@ public class TransportRoutePlanner {
while (itr.hasNext()) {
int nxt = itr.next();
if (p != nxt) {
if (localFileRoutes != null && loadedRoutes != null && loadedRoutes.contains(nxt)) {
if (localFileRoutes != null && loadedRoutes != null && loadedRoutes.contains(nxt)) { //check if
localFileRoutes.put(nxt, loadedRoutes.get(nxt));
} else {
referencesToLoad.add(nxt);
@ -904,6 +958,241 @@ public class TransportRoutePlanner {
return stops;
}
private TransportRoute getCombinedRoute(TransportRoute route) throws IOException {
if (!route.isIncomplete()) {
return route;
}
TransportRoute c = combinedRoutesCache.get(route.getId());
if (c == null) {
c = combineRoute(route);
combinedRoutesCache.put(route.getId(), c);
}
return c;
}
private TransportRoute combineRoute(TransportRoute route) throws IOException {
// 1. Get all available route parts;
List<TransportRoute> incompleteRoutes = findIncompleteRouteParts(route);
if (incompleteRoutes == null) {
return route;
}
// here could be multiple overlays between same points
// It's better to remove them especially identical segments
List<Way> allWays = getAllWays(incompleteRoutes);
// 2. Get array of segments (each array size > 1):
LinkedList<List<TransportStop>> stopSegments = parseRoutePartsToSegments(incompleteRoutes);
// 3. Merge segments and remove excess missingStops (when they are closer then MISSING_STOP_SEARCH_RADIUS):
// + Check for missingStops. If they present in the middle/there more then one segment - we have a hole in the map data
List<List<TransportStop>> mergedSegments = combineSegmentsOfSameRoute(stopSegments);
// 4. Now we need to properly sort segments, proper sorting is minimizing distance between stops
// So it is salesman problem, we have this solution at TspAnt, but if we know last or first segment we can solve it straightforward
List<TransportStop> firstSegment = null;
List<TransportStop> lastSegment = null;
for(List<TransportStop> l : mergedSegments) {
if(!l.get(0).isMissingStop()) {
firstSegment = l;
}
if(!l.get(l.size() - 1).isMissingStop()) {
lastSegment = l;
}
}
List<List<TransportStop>> sortedSegments = new ArrayList<List<TransportStop>>();
if(firstSegment != null) {
sortedSegments.add(firstSegment);
mergedSegments.remove(firstSegment);
while(!mergedSegments.isEmpty()) {
List<TransportStop> last = sortedSegments.get(sortedSegments.size() - 1);
List<TransportStop> add = findAndDeleteMinDistance(last.get(last.size() - 1).getLocation(), mergedSegments, true);
sortedSegments.add(add);
}
} else if(lastSegment != null) {
sortedSegments.add(lastSegment);
mergedSegments.remove(lastSegment);
while(!mergedSegments.isEmpty()) {
List<TransportStop> first = sortedSegments.get(0);
List<TransportStop> add = findAndDeleteMinDistance(first.get(0).getLocation(), mergedSegments, false);
sortedSegments.add(0, add);
}
} else {
sortedSegments = mergedSegments;
}
List<TransportStop> finalList = new ArrayList<TransportStop>();
for(List<TransportStop> s : sortedSegments) {
finalList.addAll(s);
}
// 5. Create combined TransportRoute and return it
return new TransportRoute(route, finalList, allWays);
}
private List<TransportStop> findAndDeleteMinDistance(LatLon location, List<List<TransportStop>> mergedSegments,
boolean attachToBegin) {
int ind = attachToBegin ? 0 : mergedSegments.get(0).size() - 1;
double minDist = MapUtils.getDistance(mergedSegments.get(0).get(ind).getLocation(), location);
int minInd = 0;
for(int i = 1; i < mergedSegments.size(); i++) {
ind = attachToBegin ? 0 : mergedSegments.get(i).size() - 1;
double dist = MapUtils.getDistance(mergedSegments.get(i).get(ind).getLocation(), location);
if(dist < minDist) {
minInd = i;
}
}
return mergedSegments.remove(minInd);
}
private List<Way> getAllWays(List<TransportRoute> parts) {
List<Way> w = new ArrayList<Way>();
for (TransportRoute t : parts) {
w.addAll(t.getForwardWays());
}
return w;
}
private List<List<TransportStop>> combineSegmentsOfSameRoute(LinkedList<List<TransportStop>> segments) {
List<List<TransportStop>> resultSegments = new ArrayList<List<TransportStop>>();
while (!segments.isEmpty()) {
List<TransportStop> firstSegment = segments.poll();
boolean merged = true;
while (merged) {
merged = false;
Iterator<List<TransportStop>> it = segments.iterator();
while (it.hasNext()) {
List<TransportStop> segmentToMerge = it.next();
merged = tryToMerge(firstSegment, segmentToMerge);
if (merged) {
it.remove();
break;
}
}
}
resultSegments.add(firstSegment);
}
return resultSegments;
}
private boolean tryToMerge(List<TransportStop> firstSegment, List<TransportStop> segmentToMerge) {
if(firstSegment.size() < 2 || segmentToMerge.size() < 2) {
return false;
}
// 1st we check that segments overlap by stop
int commonStopFirst = 0;
int commonStopSecond = 0;
boolean found = false;
for(;commonStopFirst < firstSegment.size(); commonStopFirst++) {
for(commonStopSecond = 0; commonStopSecond < segmentToMerge.size() && !found; commonStopSecond++) {
long lid1 = firstSegment.get(commonStopFirst).getId();
long lid2 = segmentToMerge.get(commonStopSecond).getId();
if(lid1 > 0 && lid2 == lid1) {
found = true;
break;
}
}
if(found) {
// important to increment break inside loop
break;
}
}
if(found && commonStopFirst < firstSegment.size()) {
// we've found common stop so we can merge based on stops
// merge last part first
int leftPartFirst = firstSegment.size() - commonStopFirst;
int leftPartSecond = segmentToMerge.size() - commonStopSecond;
if(leftPartFirst < leftPartSecond || (leftPartFirst == leftPartSecond &&
firstSegment.get(firstSegment.size() - 1).isMissingStop())) {
while(firstSegment.size() > commonStopFirst) {
firstSegment.remove(firstSegment.size() - 1);
}
for(int i = commonStopSecond; i < segmentToMerge.size(); i++) {
firstSegment.add(segmentToMerge.get(i));
}
}
// merge first part
if(commonStopFirst < commonStopSecond || (commonStopFirst == commonStopSecond &&
firstSegment.get(0).isMissingStop())) {
for(int i = 0; i < commonStopFirst; i++) {
firstSegment.remove(0);
}
for(int i = commonStopSecond; i >= 0; i--) {
firstSegment.add(0, segmentToMerge.get(i));
}
}
return true;
}
// no common stops, so try to connect to the end or beginning
// beginning
boolean merged = false;
if (MapUtils.getDistance(firstSegment.get(0).getLocation(),
segmentToMerge.get(segmentToMerge.size() - 1).getLocation()) < MISSING_STOP_SEARCH_RADIUS) {
firstSegment.remove(0);
for(int i = segmentToMerge.size() - 2; i >= 0; i--) {
firstSegment.add(0, segmentToMerge.get(i));
}
merged = true;
} else if(MapUtils.getDistance(firstSegment.get(firstSegment.size() - 1).getLocation(),
segmentToMerge.get(0).getLocation()) < MISSING_STOP_SEARCH_RADIUS) {
firstSegment.remove(firstSegment.size() - 1);
for(int i = 1; i < segmentToMerge.size(); i++) {
firstSegment.add(segmentToMerge.get(i));
}
merged = true;
}
return merged;
}
private LinkedList<List<TransportStop>> parseRoutePartsToSegments(List<TransportRoute> routeParts) {
LinkedList<List<TransportStop>> segs = new LinkedList<List<TransportStop>>();
// here we assume that missing stops come in pairs <A, B, C, MISSING, MISSING, D, E...>
// we don't add segments with 1 stop cause they are irrelevant further
for (TransportRoute part : routeParts) {
List<TransportStop> newSeg = new ArrayList<TransportStop>();
for (TransportStop s : part.getForwardStops()) {
newSeg.add(s);
if (s.isMissingStop()) {
if (newSeg.size() > 1) {
segs.add(newSeg);
newSeg = new ArrayList<TransportStop>();
}
}
}
if (newSeg.size() > 1) {
segs.add(newSeg);
}
}
return segs;
}
private List<TransportRoute> findIncompleteRouteParts(TransportRoute baseRoute) throws IOException {
List<TransportRoute> allRoutes = null;
for (BinaryMapIndexReader bmir : routeMap.keySet()) {
// here we could limit routeMap indexes by only certain bbox around start / end (check comment on field)
IncompleteTransportRoute ptr = bmir.getIncompleteTransportRoutes().get(baseRoute.getId());
if (ptr != null) {
TIntArrayList lst = new TIntArrayList();
while(ptr != null) {
lst.add(ptr.getRouteOffset());
ptr = ptr.getNextLinkedRoute();
}
if(lst.size() > 0) {
if(allRoutes == null) {
allRoutes = new ArrayList<TransportRoute>();
}
allRoutes.addAll(bmir.getTransportRoutes(lst.toArray()).valueCollection());
}
}
}
return allRoutes;
}
private void loadTransportSegments(Collection<TransportStop> stops, List<TransportRouteSegment> lst) throws IOException {
for(TransportStop s : stops) {
if (s.isDeleted() || s.getRoutes() == null) {
@ -1089,5 +1378,4 @@ public class TransportRoutePlanner {
}
return stops;
}
}

View file

@ -23,6 +23,10 @@ public class TransportRoutingConfiguration {
public int finishTimeSeconds = 1200;
public int maxRouteTime = 60 * 60 * 10; // 10 hours
public int maxRouteDistance = 0; // distance for maxRouteTime
public int maxRouteIncreaseSpeed = 30; // speed to increase route time
public GeneralRouter router;
// cache values from router for fast access
@ -85,6 +89,8 @@ public class TransportRoutingConfiguration {
ZOOM_TO_LOAD_TILES = router.getIntAttribute("zoomToLoadTiles", ZOOM_TO_LOAD_TILES);
maxNumberOfChanges = router.getIntAttribute("maxNumberOfChanges", maxNumberOfChanges);
maxRouteTime = router.getIntAttribute("maxRouteTime", maxRouteTime);
maxRouteIncreaseSpeed = router.getIntAttribute("maxRouteIncreaseSpeed", maxRouteIncreaseSpeed);
maxRouteDistance = router.getIntAttribute("maxRouteDistance", maxRouteDistance);
finishTimeSeconds = router.getIntAttribute("delayForAlternativesRoutes", finishTimeSeconds);
String mn = params.get("max_num_changes");
maxNumberOfChanges = (int) RoutingConfiguration.parseSilentFloat(mn, maxNumberOfChanges);

View file

@ -145,7 +145,7 @@
</FrameLayout>
<CheckBox
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/check_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -0,0 +1,34 @@
<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="M15,10H11V12H15V10Z"
android:strokeAlpha="0.2"
android:fillColor="#ffffff"
android:fillAlpha="0.2"/>
<path
android:pathData="M19,18H17V22H19V18Z"
android:strokeAlpha="0.2"
android:fillColor="#ffffff"
android:fillAlpha="0.2"/>
<path
android:pathData="M15,2L9,6H8V8H9V12H11V8H13V10H15V22H17V18H19V22H21V8H22V6H21L15,2ZM15,4C14.4477,4 14,4.4477 14,5C14,5.5523 14.4477,6 15,6C15.5523,6 16,5.5523 16,5C16,4.4477 15.5523,4 15,4ZM19,14H17V16H19V14ZM17,8H19V10H17V8Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillType="evenOdd"
android:fillAlpha="0.5"/>
<path
android:pathData="M13,22V16H9V22H13Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillAlpha="0.5"/>
<path
android:pathData="M1,14L9,8L13,11V10H15V12.5L17,14V16H15V22L13,22V16H9L9,18.5L9,22L3,22V16H1V14ZM7,16H5V20H7V16Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="M10,18.5H9V20H10V18.5Z"
android:fillColor="#ffffff"/>
</vector>

View file

@ -12,7 +12,7 @@
android:visibility="gone"
tools:visibility="visible">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -31,7 +31,7 @@
android:layout_width="56dp"
android:layout_height="match_parent">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/titleIconImageView"
android:layout_width="56dp"
android:layout_height="56dp"

View file

@ -7,7 +7,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/empty_state_image_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"

View file

@ -7,7 +7,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_marginTop="@dimen/empty_state_image_margin_top"
android:layout_marginBottom="@dimen/empty_state_image_margin_bottom"
android:adjustViewBounds="true"

View file

@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_marginTop="@dimen/empty_state_image_margin_top"
android:layout_marginBottom="@dimen/empty_state_image_margin_bottom"
android:adjustViewBounds="true"

View file

@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_marginTop="@dimen/empty_state_image_margin_top"
android:layout_marginBottom="@dimen/empty_state_image_margin_bottom"
android:adjustViewBounds="true"

View file

@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_marginTop="@dimen/empty_state_image_margin_top"
android:layout_marginBottom="@dimen/empty_state_image_margin_bottom"
android:adjustViewBounds="true"

View file

@ -7,7 +7,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_marginTop="@dimen/empty_state_image_margin_top"
android:layout_marginBottom="@dimen/empty_state_image_margin_bottom"
android:adjustViewBounds="true"

View file

@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_marginTop="@dimen/empty_state_image_margin_top"
android:layout_marginBottom="@dimen/empty_state_image_margin_bottom"
android:adjustViewBounds="true"

View file

@ -86,7 +86,7 @@
android:layout_height="match_parent"
android:layout_weight="1">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/left_shadow"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -102,7 +102,7 @@
android:layout_height="match_parent"
android:layout_weight="1">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/right_shadow"
android:layout_width="wrap_content"
android:layout_height="match_parent"

View file

@ -74,7 +74,7 @@
android:background="?attr/actionModeBackground"
android:paddingTop="@dimen/action_bar_image_top_margin_land">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/action_bar_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -229,7 +229,7 @@
android:paddingRight="@dimen/content_padding_small"
android:paddingStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/top_bar_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -269,7 +269,7 @@
android:paddingRight="@dimen/content_padding_small"
android:paddingStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/widget_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -37,7 +37,7 @@
android:layout_weight="0.45"
android:background="?attr/selectableItemBackground">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/main_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -51,7 +51,7 @@
android:background="@null"
tools:src="@drawable/ic_action_ruler"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/up_down_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -29,7 +29,7 @@
android:layout_marginLeft="@dimen/map_button_shadow_margin"
android:layout_marginStart="@dimen/map_button_shadow_margin">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/map_alarm_warning_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -165,7 +165,7 @@
tools:text="100 m"/>
</FrameLayout>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/map_ruler_image"
android:layout_width="fill_parent"
android:layout_height="wrap_content"

View file

@ -36,7 +36,7 @@
android:layout_marginStart="@dimen/content_padding_half"
android:layout_marginEnd="@dimen/content_padding_half">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/lat_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
@ -79,7 +79,7 @@
android:layout_marginStart="@dimen/content_padding_half"
android:layout_marginEnd="@dimen/content_padding_half">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/lon_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
@ -142,7 +142,7 @@
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/map_marker_arrow"
android:layout_width="60dp"
android:layout_height="24dp"
@ -219,7 +219,7 @@
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/map_marker_arrow_2nd"
android:layout_width="60dp"
android:layout_height="24dp"
@ -363,14 +363,14 @@
tools:text="8"
tools:visibility="visible" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/map_turn_icon"
android:layout_width="@dimen/map_widget_height"
android:layout_height="@dimen/map_widget_height"
android:scaleType="fitCenter"
tools:src="@drawable/map_turn_right_small" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/map_shield_icon"
android:layout_width="60dp"
android:layout_height="match_parent"
@ -416,7 +416,7 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/waypoint_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -719,7 +719,7 @@
android:orientation="vertical"
android:visibility="gone">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/map_lanes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -12,7 +12,7 @@
android:visibility="gone"
tools:visibility="visible">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -52,7 +52,7 @@
</LinearLayout>
<CheckBox
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/check_event_in_calendar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -60,7 +60,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/name_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -122,7 +122,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/category_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -188,7 +188,7 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/description_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View file

@ -47,7 +47,7 @@
android:gravity="start|center_vertical"
android:layout_marginStart="12dp">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/leftButtonIcon"
android:layout_width="24dp"
android:layout_height="24dp"
@ -85,7 +85,7 @@
android:layout_gravity="center_vertical"
android:gravity="center">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/centerButtonIcon"
android:layout_width="24dp"
android:layout_height="24dp"
@ -125,7 +125,7 @@
android:layout_gravity="center_vertical"
android:gravity="center">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/rightButtonIcon"
android:layout_width="24dp"
android:layout_height="24dp"

View file

@ -109,7 +109,7 @@
android:background="?attr/selectableItemBackground"
android:gravity="center_vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/y_axis_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="wrap_content"
@ -130,7 +130,7 @@
tools:text="@string/altitude"
android:layout_marginEnd="8dp" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/y_axis_arrow"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -157,7 +157,7 @@
android:background="?attr/dashboard_divider"
android:focusable="false"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/x_axis_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="wrap_content"
@ -178,7 +178,7 @@
tools:text="@string/map_widget_speed"
android:layout_marginEnd="8dp" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/x_axis_arrow"
android:layout_width="wrap_content"
android:layout_height="match_parent"

View file

@ -7,7 +7,7 @@
android:clickable="true"
android:theme="@style/OsmandLightTheme">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/background_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -28,7 +28,7 @@
android:paddingStart="40dp"
android:paddingEnd="40dp">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"

View file

@ -12,7 +12,7 @@
android:visibility="gone"
tools:visibility="visible">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -13,7 +13,7 @@
android:layout_height="@dimen/bottom_sheet_selected_item_title_height"
android:background="?attr/selectableItemBackground">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -15,7 +15,7 @@
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/waypoint_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -23,7 +23,7 @@
android:layout_width="@dimen/context_menu_action_buttons_height"
android:layout_height="match_parent">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/titleIconImageView"
android:layout_width="@dimen/context_menu_action_buttons_height"
android:layout_height="@dimen/context_menu_action_buttons_height"

View file

@ -20,7 +20,7 @@
android:background="?attr/selectableItemBackground"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/first_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
@ -72,7 +72,7 @@
android:background="?attr/selectableItemBackground"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/second_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -8,7 +8,7 @@
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -14,7 +14,7 @@
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -14,7 +14,7 @@
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -26,7 +26,7 @@
app:typeface="@string/font_roboto_medium"
tools:text="Title" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -11,7 +11,7 @@
android:paddingEnd="@dimen/content_padding"
android:paddingStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -12,7 +12,7 @@
android:paddingEnd="@dimen/content_padding"
android:paddingStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -17,7 +17,7 @@
android:paddingEnd="@dimen/list_content_padding"
android:paddingRight="@dimen/list_content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -12,7 +12,7 @@
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -12,7 +12,7 @@
android:paddingRight="@dimen/content_padding_small"
android:paddingStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -12,7 +12,7 @@
android:paddingEnd="@dimen/content_padding"
android:paddingStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -12,7 +12,7 @@
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -11,7 +11,7 @@
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -14,7 +14,7 @@
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -5,7 +5,7 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"

View file

@ -9,7 +9,7 @@
android:layout_width="match_parent"
android:layout_height="6dp"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"

View file

@ -13,7 +13,7 @@
android:paddingStart="@dimen/list_content_padding"
android:paddingEnd="@dimen/list_content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/change_color_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBox
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/toggle_item"
android:text="@string/osmo_connect_menu"
android:layout_width="wrap_content"

View file

@ -10,7 +10,7 @@
android:paddingTop="@dimen/context_menu_main_actions_padding_top"
android:paddingBottom="@dimen/context_menu_main_actions_padding_bottom">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -12,7 +12,7 @@
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -31,7 +31,7 @@
tools:text="https://osmand.net/images/123456789012.jpg"
tools:visibility="visible"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -6,7 +6,7 @@
android:layout_height="@dimen/contex_menu_top_shadow_height"
android:orientation="vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"

View file

@ -33,7 +33,7 @@
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/south_side_iv"
android:layout_width="24dp"
android:layout_height="24dp"
@ -54,7 +54,7 @@
tools:text="N"
tools:textColor="@color/active_color_primary_light"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/north_side_iv"
android:layout_width="24dp"
android:layout_height="24dp"
@ -143,7 +143,7 @@
</LinearLayout>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/lat_backspace_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -182,7 +182,7 @@
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/east_side_iv"
android:layout_width="24dp"
android:layout_height="24dp"
@ -204,7 +204,7 @@
tools:text="W"
tools:textColor="@color/active_color_primary_light"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/west_side_iv"
android:layout_width="24dp"
android:layout_height="24dp"
@ -294,7 +294,7 @@
</LinearLayout>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/lon_backspace_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -349,7 +349,7 @@
android:inputType="text"
android:textSize="@dimen/default_list_text_size"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/point_name_keyboard_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -28,7 +28,7 @@
android:layout_height="0dp"
android:layout_weight="0.25"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/keyboard_item_image"
android:layout_width="match_parent"
android:layout_height="0dp"

View file

@ -21,7 +21,7 @@
android:paddingBottom="@dimen/content_padding_half"
android:orientation="horizontal">
<CheckBox
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/check_local_index"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -31,7 +31,7 @@
android:visibility="gone"
android:layout_marginStart="@dimen/list_content_padding" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -93,7 +93,7 @@
android:visibility="visible"
android:gravity="center_vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/distance_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -110,7 +110,7 @@
android:textSize="@dimen/default_sub_text_size"
android:layout_marginEnd="@dimen/gpx_small_text_margin" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/points_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -21,7 +21,7 @@
android:layout_marginTop="10dp"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"

View file

@ -29,7 +29,7 @@
android:minHeight="@dimen/list_item_height"
android:gravity="center_vertical">
<CheckBox
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/check_local_index"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -38,7 +38,7 @@
android:visibility="gone"
android:layout_marginStart="@dimen/list_content_padding" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -76,7 +76,7 @@
android:visibility="visible"
android:gravity="center_vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/distance_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -94,7 +94,7 @@
android:textSize="@dimen/default_sub_text_size"
android:layout_marginEnd="@dimen/gpx_small_text_margin" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/points_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -112,7 +112,7 @@
android:textSize="@dimen/default_sub_text_size"
android:layout_marginEnd="@dimen/gpx_small_text_margin" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/time_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -14,7 +14,7 @@
android:minHeight="@dimen/setting_list_item_large_height"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -20,7 +20,7 @@
android:layout_height="wrap_content"
android:minHeight="@dimen/list_item_height">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/list_item_height"
android:layout_height="@dimen/list_item_height"

View file

@ -20,7 +20,7 @@
android:background="?attr/dash_parking_bg"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/direction_icon"
android:layout_width="@dimen/dashboard_parking_icon_size"
android:layout_height="@dimen/dashboard_parking_icon_size"

View file

@ -19,7 +19,7 @@
android:layout_height="wrap_content"
android:orientation="horizontal" >
<CheckBox
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/check_local_index"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -29,7 +29,7 @@
android:visibility="gone"
android:layout_marginStart="@dimen/local_index_check_right_margin" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -61,7 +61,7 @@
tools:text="Location path \u2022 300 MB"/>
</LinearLayout>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/edit_icon"
android:contentDescription="@string/shared_string_edit"
android:layout_width="@dimen/list_item_height"

View file

@ -25,7 +25,7 @@
android:gravity="start"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/toolbar_back"
android:contentDescription="@string/back_to_map"
android:layout_marginLeft="@dimen/multi_selection_menu_padding_top"
@ -37,7 +37,7 @@
app:srcCompat="@drawable/ic_arrow_back"
tools:visibility="visible"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/toolbar_list"
android:contentDescription="@string/backToMenu"
android:layout_marginLeft="@dimen/multi_selection_menu_padding_top"
@ -67,7 +67,7 @@
android:gravity="end"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/toolbar_settings"
android:contentDescription="@string/shared_string_settings"
android:layout_marginLeft="@dimen/multi_selection_menu_padding_top"
@ -79,7 +79,7 @@
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_configure_screen_dark"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/toolbar_ok"
android:contentDescription="@string/shared_string_ok"
android:layout_marginLeft="@dimen/multi_selection_menu_padding_top"
@ -90,7 +90,7 @@
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_action_done"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/toolbar_sort"
android:contentDescription="@string/intermediate_points_change_order"
android:layout_marginLeft="@dimen/multi_selection_menu_padding_top"
@ -101,7 +101,7 @@
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_sort_waypoint_dark"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/toolbar_flat"
android:contentDescription="@string/drawer"
android:layout_marginLeft="@dimen/multi_selection_menu_padding_top"
@ -113,7 +113,7 @@
app:srcCompat="@drawable/ic_flat_list_dark"
android:visibility="gone"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/toolbar_edit"
android:contentDescription="@string/shared_string_edit"
android:layout_marginLeft="@dimen/multi_selection_menu_padding_top"

View file

@ -31,7 +31,7 @@
android:layout_width="56dp"
android:layout_height="match_parent">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/titleIconImageView"
android:layout_width="56dp"
android:layout_height="56dp"

View file

@ -107,7 +107,7 @@
android:textSize="@dimen/default_list_text_size"
tools:text="Only download over WiFi long text like really long"/>
<CheckBox
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/downloadOverWiFiSwitch"
android:layout_width="wrap_content"
android:layout_height="match_parent"

View file

@ -51,7 +51,7 @@
</LinearLayout>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/card_content_padding_large"

View file

@ -10,7 +10,7 @@
android:paddingStart="@dimen/list_content_padding"
android:paddingEnd="@dimen/list_content_padding">
<CheckBox
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/check_download_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -72,7 +72,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="10dp"

View file

@ -32,7 +32,7 @@
tools:text="Some title text"
android:layout_marginStart="11dp" />
<CheckBox
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/toggle_item"
android:layout_width="wrap_content"
android:layout_height="@dimen/list_item_height"

View file

@ -8,7 +8,7 @@
android:minHeight="48dp"
android:layout_marginBottom="5dp">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/waypoint_icon"
android:layout_marginLeft="8dp"
android:layout_height="wrap_content"

View file

@ -29,7 +29,7 @@
android:layout_gravity="bottom"
android:orientation="vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/buttons_shadow"
android:layout_width="match_parent"
android:layout_height="10dp"

View file

@ -7,7 +7,7 @@
android:orientation="horizontal">
<CheckBox
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/filter_poi_check"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"

View file

@ -8,7 +8,7 @@
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/empty_state_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -8,7 +8,7 @@
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/empty_state_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -7,7 +7,7 @@
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/empty_state_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -7,7 +7,7 @@
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/empty_state_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -7,7 +7,7 @@
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/empty_state_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -8,7 +8,7 @@
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/empty_state_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -7,7 +7,7 @@
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/empty_state_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -19,14 +19,14 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/context_menu_padding_margin_large"
android:paddingStart="@dimen/context_menu_padding_margin_large"
android:paddingLeft="@dimen/content_padding"
android:paddingStart="@dimen/content_padding"
android:paddingRight="0dp"
android:paddingEnd="0dp"
android:minHeight="@dimen/bottom_sheet_list_item_height"
android:background="?attr/expandable_list_item_background">
<CheckBox
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/toggle_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -36,7 +36,7 @@
android:visibility="gone"
tools:visiblity="visible"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/category_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
@ -47,15 +47,15 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/card_content_padding_large"
android:layout_marginLeft="@dimen/list_content_padding_large"
android:layout_weight="1"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="Category name"
android:layout_marginStart="@dimen/card_content_padding_large" />
android:layout_marginStart="@dimen/list_content_padding_large" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/options"
android:contentDescription="@string/shared_string_more"
android:layout_width="46dp"
@ -70,7 +70,7 @@
tools:visiblity="visible"
android:layout_marginEnd="4dp" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/explist_indicator"
android:layout_width="@dimen/context_menu_padding_margin_large"
android:layout_height="match_parent"

View file

@ -31,17 +31,17 @@
android:minHeight="@dimen/favorites_list_item_height"
android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="@dimen/content_padding_small"
android:paddingLeft="@dimen/content_padding_small"
android:paddingEnd="@dimen/content_padding_small"
android:paddingRight="@dimen/content_padding_small">
android:paddingStart="@dimen/favorites_my_places_icon_left_padding"
android:paddingLeft="@dimen/favorites_my_places_icon_left_padding"
android:paddingEnd="@dimen/favorites_my_places_icon_left_padding"
android:paddingRight="@dimen/favorites_my_places_icon_left_padding">
<FrameLayout
android:layout_width="@dimen/favorites_icon_size"
android:layout_width="@dimen/favorites_my_places_icon_size"
android:layout_height="match_parent"
android:layout_gravity="center_vertical">
<CheckBox
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/toggle_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -52,7 +52,7 @@
android:visibility="gone"
tools:visibility="visible" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/favourite_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -67,10 +67,10 @@
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="vertical"
android:layout_marginStart="@dimen/context_menu_padding_margin_large"
android:layout_marginLeft="@dimen/context_menu_padding_margin_large"
android:layout_marginEnd="@dimen/context_menu_padding_margin_large"
android:layout_marginRight="@dimen/context_menu_padding_margin_large"
android:layout_marginStart="@dimen/favorites_my_places_icon_right_padding"
android:layout_marginLeft="@dimen/favorites_my_places_icon_right_padding"
android:layout_marginEnd="@dimen/favorites_my_places_icon_right_padding"
android:layout_marginRight="@dimen/favorites_my_places_icon_right_padding"
android:paddingTop="@dimen/context_menu_padding_margin_small"
android:paddingBottom="@dimen/context_menu_padding_margin_small">
@ -90,7 +90,7 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/direction"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -110,7 +110,7 @@
android:textSize="@dimen/default_desc_text_size"
tools:text="100500 km" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/group_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -13,7 +13,7 @@
android:paddingStart="@dimen/list_content_padding"
android:paddingEnd="@dimen/list_content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/favourite_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
@ -48,7 +48,7 @@
android:layout_height="wrap_content"
android:gravity="center_vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/favourite_direction_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -7,7 +7,7 @@
android:clickable="true"
android:theme="@style/OsmandLightTheme">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/background_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -28,7 +28,7 @@
android:paddingStart="40dp"
android:paddingEnd="40dp">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"

View file

@ -12,7 +12,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/folderIconImageView"
android:layout_width="56dp"
android:layout_height="56dp"
@ -86,7 +86,7 @@
android:background="?attr/selectableItemBackground"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/deviceMemoryImageView"
android:layout_width="wrap_content"
android:layout_height="56dp"
@ -138,7 +138,7 @@
android:background="?attr/selectableItemBackground"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/sharedMemoryImageView"
android:layout_width="wrap_content"
android:layout_height="56dp"
@ -187,7 +187,7 @@
android:background="?attr/selectableItemBackground"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/memoryStickImageView"
android:layout_width="wrap_content"
android:layout_height="56dp"

View file

@ -77,7 +77,7 @@
android:layout_height="@dimen/action_bar_image_height"
android:background="?attr/actionModeBackground">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/action_bar_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -218,7 +218,7 @@
android:paddingRight="@dimen/content_padding_small"
android:paddingStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/top_bar_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -258,7 +258,7 @@
android:paddingRight="@dimen/content_padding_small"
android:paddingStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/widget_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -547,7 +547,7 @@
</com.github.ksoichiro.android.observablescrollview.ObservableScrollView>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/app_bar_shadow"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View file

@ -22,7 +22,7 @@
osmand:typeface="@string/font_roboto_medium"
android:layout_marginStart="@dimen/content_padding" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/streetImageView"
style="@style/edit_poi_imageview_style"
android:layout_below="@id/contactInfoTextView"
@ -36,7 +36,7 @@
android:inputType="textMultiLine"
tools:text="testText"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/houseNumberImageView"
style="@style/edit_poi_imageview_style"
android:layout_below="@id/streetEditText"
@ -49,7 +49,7 @@
android:hint="@string/building_number"
android:inputType="text"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/phoneImageView"
style="@style/edit_poi_imageview_style"
android:layout_below="@id/houseNumberEditText"
@ -62,7 +62,7 @@
android:hint="@string/phone"
android:inputType="phone"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/webSiteImageView"
style="@style/edit_poi_imageview_style"
android:layout_below="@id/phoneEditText"
@ -75,7 +75,7 @@
android:hint="@string/website"
android:inputType="textUri"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/descriptionImageView"
style="@style/edit_poi_imageview_style"
android:layout_below="@id/webSiteEditText"
@ -110,7 +110,7 @@
android:orientation="vertical"
android:layout_marginBottom="4dp"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/openingHoursImageView"
style="@style/edit_poi_imageview_style"
android:layout_below="@id/openHoursContainer"

View file

@ -123,7 +123,7 @@
</com.google.android.material.appbar.CollapsingToolbarLayout>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/shadowView"
android:layout_width="match_parent"
android:layout_height="@dimen/abp__shadow_height"

View file

@ -5,7 +5,7 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/shadow_on_map"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -255,7 +255,7 @@
android:orientation="horizontal"
android:visibility="gone">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/warning_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

View file

@ -49,7 +49,7 @@
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/sort_by_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
@ -87,7 +87,7 @@
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/show_direction_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
@ -118,7 +118,7 @@
android:paddingEnd="@dimen/content_padding"
android:paddingStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/coordinate_input_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
@ -147,7 +147,7 @@
android:paddingEnd="@dimen/content_padding"
android:paddingStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/build_route_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
@ -185,7 +185,7 @@
android:paddingEnd="@dimen/content_padding"
android:paddingStart="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/save_as_new_track_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
@ -214,7 +214,7 @@
android:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/move_all_to_history_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"

View file

@ -32,7 +32,7 @@
android:layout_height="@dimen/measurement_tool_up_down_row_height"
android:background="?attr/selectableItemBackground">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/main_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -46,7 +46,7 @@
android:background="@null"
tools:src="@drawable/ic_action_ruler"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/up_down_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -149,7 +149,7 @@
<include layout="@layout/card_bottom_divider"/>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="5dp"
android:layout_gravity="bottom"

View file

@ -15,7 +15,7 @@
android:layout_gravity="bottom"
android:orientation="vertical">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"

View file

@ -27,7 +27,7 @@
android:minHeight="60dp"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/calendarImageView"
android:layout_width="56dp"
android:layout_height="56dp"
@ -46,7 +46,7 @@
android:layout_marginStart="-8dp"
android:layout_marginEnd="16dp" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/monthDropDownIcon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -73,7 +73,7 @@
android:minHeight="60dp"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/regionIconImageView"
android:layout_width="56dp"
android:layout_height="56dp"
@ -105,7 +105,7 @@
tools:text="Worldwide"/>
</LinearLayout>
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/countryDropDownIcon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -147,7 +147,7 @@
android:minHeight="60dp"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/numberOfContributorsIcon"
android:layout_width="56dp"
android:layout_height="56dp"
@ -198,7 +198,7 @@
android:minHeight="60dp"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/numberOfEditsIcon"
android:layout_width="56dp"
android:layout_height="56dp"
@ -245,7 +245,7 @@
android:minHeight="60dp"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/donationsIcon"
android:layout_width="56dp"
android:layout_height="56dp"
@ -301,7 +301,7 @@
android:minHeight="60dp"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/donationsTotalIcon"
android:layout_width="56dp"
android:layout_height="56dp"
@ -353,7 +353,7 @@
android:minHeight="60dp"
android:orientation="horizontal">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/numberOfRecipientsIcon"
android:layout_width="56dp"
android:layout_height="60dp"

View file

@ -21,7 +21,7 @@
android:layout_marginStart="@dimen/bottom_sheet_content_margin"
android:layout_weight="1">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/route_point_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -53,7 +53,7 @@
android:layout_marginStart="@dimen/bottom_sheet_content_margin_small"
android:layout_weight="1">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/line_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"

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