Date: Fri, 12 Feb 2021 18:43:25 +0200
Subject: [PATCH 29/70] Precision implemented
---
.../binary/BinaryMapPoiReaderAdapter.java | 27 +-
.../java/net/osmand/binary/OsmandOdb.java | 253 +++++-------------
.../main/java/net/osmand/util/MapUtils.java | 12 +-
3 files changed, 84 insertions(+), 208 deletions(-)
diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapPoiReaderAdapter.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapPoiReaderAdapter.java
index ee3fe4a6fa..9c0f30ebe2 100644
--- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapPoiReaderAdapter.java
+++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapPoiReaderAdapter.java
@@ -714,9 +714,7 @@ public class BinaryMapPoiReaderAdapter {
Amenity am = null;
int x = 0;
int y = 0;
- int preciseX = 0;
- int preciseY = 0;
- boolean isPrecised = false;
+ int precisionXY = 0;
boolean hasLocation = false;
StringBuilder retValue = new StringBuilder();
PoiCategory amenityType = null;
@@ -745,8 +743,11 @@ public class BinaryMapPoiReaderAdapter {
}
}
if (hasLocation) {
- if (isPrecised) {
- am.setLocation(MapUtils.get31LatitudeY(preciseY), MapUtils.get31LongitudeX(preciseX));
+ if (precisionXY != 0) {
+ int[] xy = MapUtils.calculateFinalXYFromBaseAndPrecisionXY(24, 26, precisionXY, x >> 7, y >> 7, true);
+ int x31 = xy[0] << 5;
+ int y31 = xy[1] << 5;
+ am.setLocation(MapUtils.get31LatitudeY(y31), MapUtils.get31LongitudeX(x31));
} else {
am.setLocation(MapUtils.get31LatitudeY(y), MapUtils.get31LongitudeX(x));
}
@@ -839,21 +840,9 @@ public class BinaryMapPoiReaderAdapter {
case OsmandOdb.OsmAndPoiBoxDataAtom.NOTE_FIELD_NUMBER:
am.setDescription(codedIS.readString());
break;
- case OsmandOdb.OsmAndPoiBoxDataAtom.PRECISEDX_FIELD_NUMBER:
+ case OsmandOdb.OsmAndPoiBoxDataAtom.PRECISIONXY_FIELD_NUMBER:
if (hasLocation) {
- preciseX = codedIS.readSInt32() + x;
- }
- break;
- case OsmandOdb.OsmAndPoiBoxDataAtom.PRECISEDY_FIELD_NUMBER:
- if (hasLocation) {
- preciseY = codedIS.readSInt32() + y;
- if (checkBounds) {
- if (left31 > preciseX || right31 < preciseX || top31 > preciseY || bottom31 < preciseY) {
- codedIS.skipRawBytes(codedIS.getBytesUntilLimit());
- return null;
- }
- }
- isPrecised = true;
+ precisionXY = codedIS.readInt32();
}
break;
default:
diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/OsmandOdb.java b/OsmAnd-java/src/main/java/net/osmand/binary/OsmandOdb.java
index 6adce33378..f531dfbfde 100644
--- a/OsmAnd-java/src/main/java/net/osmand/binary/OsmandOdb.java
+++ b/OsmAnd-java/src/main/java/net/osmand/binary/OsmandOdb.java
@@ -54372,41 +54372,23 @@ public final class OsmandOdb {
com.google.protobuf.ByteString
getTextValuesBytes(int index);
- // optional sint32 preciseDx = 16;
+ // optional int32 precisionXY = 16;
/**
- * optional sint32 preciseDx = 16;
+ * optional int32 precisionXY = 16;
*
*
- * diff between deltas of 28 and 24 zooms
+ * precision in 1-xy-xy-xy binary format
*
*/
- boolean hasPreciseDx();
+ boolean hasPrecisionXY();
/**
- * optional sint32 preciseDx = 16;
+ * optional int32 precisionXY = 16;
*
*
- * diff between deltas of 28 and 24 zooms
+ * precision in 1-xy-xy-xy binary format
*
*/
- int getPreciseDx();
-
- // optional sint32 preciseDy = 17;
- /**
- * optional sint32 preciseDy = 17;
- *
- *
- * diff between deltas of 28 and 24 zooms
- *
- */
- boolean hasPreciseDy();
- /**
- * optional sint32 preciseDy = 17;
- *
- *
- * diff between deltas of 28 and 24 zooms
- *
- */
- int getPreciseDy();
+ int getPrecisionXY();
}
/**
* Protobuf type {@code OsmAnd.OBF.OsmAndPoiBoxDataAtom}
@@ -54577,12 +54559,7 @@ public final class OsmandOdb {
}
case 128: {
bitField0_ |= 0x00000200;
- preciseDx_ = input.readSInt32();
- break;
- }
- case 136: {
- bitField0_ |= 0x00000400;
- preciseDy_ = input.readSInt32();
+ precisionXY_ = input.readInt32();
break;
}
}
@@ -55094,52 +55071,28 @@ public final class OsmandOdb {
return textValues_.getByteString(index);
}
- // optional sint32 preciseDx = 16;
- public static final int PRECISEDX_FIELD_NUMBER = 16;
- private int preciseDx_;
+ // optional int32 precisionXY = 16;
+ public static final int PRECISIONXY_FIELD_NUMBER = 16;
+ private int precisionXY_;
/**
- * optional sint32 preciseDx = 16;
+ * optional int32 precisionXY = 16;
*
*
- * diff between deltas of 28 and 24 zooms
+ * precision in 1-xy-xy-xy binary format
*
*/
- public boolean hasPreciseDx() {
+ public boolean hasPrecisionXY() {
return ((bitField0_ & 0x00000200) == 0x00000200);
}
/**
- * optional sint32 preciseDx = 16;
+ * optional int32 precisionXY = 16;
*
*
- * diff between deltas of 28 and 24 zooms
+ * precision in 1-xy-xy-xy binary format
*
*/
- public int getPreciseDx() {
- return preciseDx_;
- }
-
- // optional sint32 preciseDy = 17;
- public static final int PRECISEDY_FIELD_NUMBER = 17;
- private int preciseDy_;
- /**
- * optional sint32 preciseDy = 17;
- *
- *
- * diff between deltas of 28 and 24 zooms
- *
- */
- public boolean hasPreciseDy() {
- return ((bitField0_ & 0x00000400) == 0x00000400);
- }
- /**
- * optional sint32 preciseDy = 17;
- *
- *
- * diff between deltas of 28 and 24 zooms
- *
- */
- public int getPreciseDy() {
- return preciseDy_;
+ public int getPrecisionXY() {
+ return precisionXY_;
}
private void initFields() {
@@ -55156,8 +55109,7 @@ public final class OsmandOdb {
note_ = "";
textCategories_ = java.util.Collections.emptyList();
textValues_ = com.google.protobuf.LazyStringArrayList.EMPTY;
- preciseDx_ = 0;
- preciseDy_ = 0;
+ precisionXY_ = 0;
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
@@ -55219,10 +55171,7 @@ public final class OsmandOdb {
output.writeBytes(15, textValues_.getByteString(i));
}
if (((bitField0_ & 0x00000200) == 0x00000200)) {
- output.writeSInt32(16, preciseDx_);
- }
- if (((bitField0_ & 0x00000400) == 0x00000400)) {
- output.writeSInt32(17, preciseDy_);
+ output.writeInt32(16, precisionXY_);
}
getUnknownFields().writeTo(output);
}
@@ -55307,11 +55256,7 @@ public final class OsmandOdb {
}
if (((bitField0_ & 0x00000200) == 0x00000200)) {
size += com.google.protobuf.CodedOutputStream
- .computeSInt32Size(16, preciseDx_);
- }
- if (((bitField0_ & 0x00000400) == 0x00000400)) {
- size += com.google.protobuf.CodedOutputStream
- .computeSInt32Size(17, preciseDy_);
+ .computeInt32Size(16, precisionXY_);
}
size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size;
@@ -55455,10 +55400,8 @@ public final class OsmandOdb {
bitField0_ = (bitField0_ & ~0x00000800);
textValues_ = com.google.protobuf.LazyStringArrayList.EMPTY;
bitField0_ = (bitField0_ & ~0x00001000);
- preciseDx_ = 0;
+ precisionXY_ = 0;
bitField0_ = (bitField0_ & ~0x00002000);
- preciseDy_ = 0;
- bitField0_ = (bitField0_ & ~0x00004000);
return this;
}
@@ -55547,11 +55490,7 @@ public final class OsmandOdb {
if (((from_bitField0_ & 0x00002000) == 0x00002000)) {
to_bitField0_ |= 0x00000200;
}
- result.preciseDx_ = preciseDx_;
- if (((from_bitField0_ & 0x00004000) == 0x00004000)) {
- to_bitField0_ |= 0x00000400;
- }
- result.preciseDy_ = preciseDy_;
+ result.precisionXY_ = precisionXY_;
result.bitField0_ = to_bitField0_;
onBuilt();
return result;
@@ -55647,11 +55586,8 @@ public final class OsmandOdb {
}
onChanged();
}
- if (other.hasPreciseDx()) {
- setPreciseDx(other.getPreciseDx());
- }
- if (other.hasPreciseDy()) {
- setPreciseDy(other.getPreciseDy());
+ if (other.hasPrecisionXY()) {
+ setPrecisionXY(other.getPrecisionXY());
}
this.mergeUnknownFields(other.getUnknownFields());
return this;
@@ -56634,100 +56570,51 @@ public final class OsmandOdb {
return this;
}
- // optional sint32 preciseDx = 16;
- private int preciseDx_ ;
+ // optional int32 precisionXY = 16;
+ private int precisionXY_ ;
/**
- * optional sint32 preciseDx = 16;
+ * optional int32 precisionXY = 16;
*
*
- * diff between deltas of 28 and 24 zooms
+ * precision in 1-xy-xy-xy binary format
*
*/
- public boolean hasPreciseDx() {
+ public boolean hasPrecisionXY() {
return ((bitField0_ & 0x00002000) == 0x00002000);
}
/**
- * optional sint32 preciseDx = 16;
+ * optional int32 precisionXY = 16;
*
*
- * diff between deltas of 28 and 24 zooms
+ * precision in 1-xy-xy-xy binary format
*
*/
- public int getPreciseDx() {
- return preciseDx_;
+ public int getPrecisionXY() {
+ return precisionXY_;
}
/**
- * optional sint32 preciseDx = 16;
+ * optional int32 precisionXY = 16;
*
*
- * diff between deltas of 28 and 24 zooms
+ * precision in 1-xy-xy-xy binary format
*
*/
- public Builder setPreciseDx(int value) {
+ public Builder setPrecisionXY(int value) {
bitField0_ |= 0x00002000;
- preciseDx_ = value;
+ precisionXY_ = value;
onChanged();
return this;
}
/**
- * optional sint32 preciseDx = 16;
+ * optional int32 precisionXY = 16;
*
*
- * diff between deltas of 28 and 24 zooms
+ * precision in 1-xy-xy-xy binary format
*
*/
- public Builder clearPreciseDx() {
+ public Builder clearPrecisionXY() {
bitField0_ = (bitField0_ & ~0x00002000);
- preciseDx_ = 0;
- onChanged();
- return this;
- }
-
- // optional sint32 preciseDy = 17;
- private int preciseDy_ ;
- /**
- * optional sint32 preciseDy = 17;
- *
- *
- * diff between deltas of 28 and 24 zooms
- *
- */
- public boolean hasPreciseDy() {
- return ((bitField0_ & 0x00004000) == 0x00004000);
- }
- /**
- * optional sint32 preciseDy = 17;
- *
- *
- * diff between deltas of 28 and 24 zooms
- *
- */
- public int getPreciseDy() {
- return preciseDy_;
- }
- /**
- * optional sint32 preciseDy = 17;
- *
- *
- * diff between deltas of 28 and 24 zooms
- *
- */
- public Builder setPreciseDy(int value) {
- bitField0_ |= 0x00004000;
- preciseDy_ = value;
- onChanged();
- return this;
- }
- /**
- * optional sint32 preciseDy = 17;
- *
- *
- * diff between deltas of 28 and 24 zooms
- *
- */
- public Builder clearPreciseDy() {
- bitField0_ = (bitField0_ & ~0x00004000);
- preciseDy_ = 0;
+ precisionXY_ = 0;
onChanged();
return this;
}
@@ -65234,38 +65121,38 @@ public final class OsmandOdb {
"tegories\030\003 \003(\r\022\025\n\rsubcategories\030\005 \003(\r\"i\n" +
"\020OsmAndPoiBoxData\022\014\n\004zoom\030\001 \001(\r\022\t\n\001x\030\002 \001" +
"(\r\022\t\n\001y\030\003 \001(\r\0221\n\007poiData\030\005 \003(\0132 .OsmAnd." +
- "OBF.OsmAndPoiBoxDataAtom\"\226\002\n\024OsmAndPoiBo",
+ "OBF.OsmAndPoiBoxDataAtom\"\205\002\n\024OsmAndPoiBo",
"xDataAtom\022\n\n\002dx\030\002 \002(\021\022\n\n\002dy\030\003 \002(\021\022\022\n\ncat" +
"egories\030\004 \003(\r\022\025\n\rsubcategories\030\005 \003(\r\022\014\n\004" +
"name\030\006 \001(\t\022\016\n\006nameEn\030\007 \001(\t\022\n\n\002id\030\010 \001(\004\022\024" +
"\n\014openingHours\030\n \001(\t\022\014\n\004site\030\013 \001(\t\022\r\n\005ph" +
"one\030\014 \001(\t\022\014\n\004note\030\r \001(\t\022\026\n\016textCategorie" +
- "s\030\016 \003(\r\022\022\n\ntextValues\030\017 \003(\t\022\021\n\tpreciseDx" +
- "\030\020 \001(\021\022\021\n\tpreciseDy\030\021 \001(\021\"\032\n\007IdTable\022\017\n\007" +
- "routeId\030\001 \003(\022\"F\n\017RestrictionData\022\014\n\004type" +
- "\030\001 \002(\005\022\014\n\004from\030\002 \002(\005\022\n\n\002to\030\003 \002(\005\022\013\n\003via\030" +
- "\004 \001(\005\"x\n\tRouteData\022\016\n\006points\030\001 \002(\014\022\022\n\npo",
- "intTypes\030\004 \001(\014\022\022\n\npointNames\030\005 \001(\014\022\r\n\005ty" +
- "pes\030\007 \002(\014\022\017\n\007routeId\030\014 \002(\005\022\023\n\013stringName" +
- "s\030\016 \001(\014\"\304\005\n\022OsmAndRoutingIndex\022\014\n\004name\030\001" +
- " \002(\t\022?\n\005rules\030\002 \003(\01320.OsmAnd.OBF.OsmAndR" +
- "outingIndex.RouteEncodingRule\022>\n\trootBox" +
- "es\030\003 \003(\0132+.OsmAnd.OBF.OsmAndRoutingIndex" +
- ".RouteDataBox\022A\n\014basemapBoxes\030\004 \003(\0132+.Os" +
- "mAnd.OBF.OsmAndRoutingIndex.RouteDataBox" +
- "\022=\n\006blocks\030\005 \003(\0132-.OsmAnd.OBF.OsmAndRout" +
- "ingIndex.RouteDataBlock\032;\n\021RouteEncoding",
- "Rule\022\013\n\003tag\030\003 \002(\t\022\r\n\005value\030\005 \002(\t\022\n\n\002id\030\007" +
- " \001(\r\032\231\001\n\014RouteDataBox\022\014\n\004left\030\001 \002(\021\022\r\n\005r" +
- "ight\030\002 \002(\021\022\013\n\003top\030\003 \002(\021\022\016\n\006bottom\030\004 \002(\021\022" +
- "\023\n\013shiftToData\030\005 \001(\007\022:\n\005boxes\030\007 \003(\0132+.Os" +
- "mAnd.OBF.OsmAndRoutingIndex.RouteDataBox" +
- "\032\303\001\n\016RouteDataBlock\022$\n\007idTable\030\005 \001(\0132\023.O" +
- "smAnd.OBF.IdTable\022*\n\013dataObjects\030\006 \003(\0132\025" +
- ".OsmAnd.OBF.RouteData\0221\n\014restrictions\030\007 " +
- "\003(\0132\033.OsmAnd.OBF.RestrictionData\022,\n\013stri" +
- "ngTable\030\010 \001(\0132\027.OsmAnd.OBF.StringTableB\036",
- "\n\021net.osmand.binaryB\tOsmandOdb"
+ "s\030\016 \003(\r\022\022\n\ntextValues\030\017 \003(\t\022\023\n\013precision" +
+ "XY\030\020 \001(\005\"\032\n\007IdTable\022\017\n\007routeId\030\001 \003(\022\"F\n\017" +
+ "RestrictionData\022\014\n\004type\030\001 \002(\005\022\014\n\004from\030\002 " +
+ "\002(\005\022\n\n\002to\030\003 \002(\005\022\013\n\003via\030\004 \001(\005\"x\n\tRouteDat" +
+ "a\022\016\n\006points\030\001 \002(\014\022\022\n\npointTypes\030\004 \001(\014\022\022\n",
+ "\npointNames\030\005 \001(\014\022\r\n\005types\030\007 \002(\014\022\017\n\007rout" +
+ "eId\030\014 \002(\005\022\023\n\013stringNames\030\016 \001(\014\"\304\005\n\022OsmAn" +
+ "dRoutingIndex\022\014\n\004name\030\001 \002(\t\022?\n\005rules\030\002 \003" +
+ "(\01320.OsmAnd.OBF.OsmAndRoutingIndex.Route" +
+ "EncodingRule\022>\n\trootBoxes\030\003 \003(\0132+.OsmAnd" +
+ ".OBF.OsmAndRoutingIndex.RouteDataBox\022A\n\014" +
+ "basemapBoxes\030\004 \003(\0132+.OsmAnd.OBF.OsmAndRo" +
+ "utingIndex.RouteDataBox\022=\n\006blocks\030\005 \003(\0132" +
+ "-.OsmAnd.OBF.OsmAndRoutingIndex.RouteDat" +
+ "aBlock\032;\n\021RouteEncodingRule\022\013\n\003tag\030\003 \002(\t",
+ "\022\r\n\005value\030\005 \002(\t\022\n\n\002id\030\007 \001(\r\032\231\001\n\014RouteDat" +
+ "aBox\022\014\n\004left\030\001 \002(\021\022\r\n\005right\030\002 \002(\021\022\013\n\003top" +
+ "\030\003 \002(\021\022\016\n\006bottom\030\004 \002(\021\022\023\n\013shiftToData\030\005 " +
+ "\001(\007\022:\n\005boxes\030\007 \003(\0132+.OsmAnd.OBF.OsmAndRo" +
+ "utingIndex.RouteDataBox\032\303\001\n\016RouteDataBlo" +
+ "ck\022$\n\007idTable\030\005 \001(\0132\023.OsmAnd.OBF.IdTable" +
+ "\022*\n\013dataObjects\030\006 \003(\0132\025.OsmAnd.OBF.Route" +
+ "Data\0221\n\014restrictions\030\007 \003(\0132\033.OsmAnd.OBF." +
+ "RestrictionData\022,\n\013stringTable\030\010 \001(\0132\027.O" +
+ "smAnd.OBF.StringTableB\036\n\021net.osmand.bina",
+ "ryB\tOsmandOdb"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
@@ -65523,7 +65410,7 @@ public final class OsmandOdb {
internal_static_OsmAnd_OBF_OsmAndPoiBoxDataAtom_fieldAccessorTable = new
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_OsmAnd_OBF_OsmAndPoiBoxDataAtom_descriptor,
- new java.lang.String[] { "Dx", "Dy", "Categories", "Subcategories", "Name", "NameEn", "Id", "OpeningHours", "Site", "Phone", "Note", "TextCategories", "TextValues", "PreciseDx", "PreciseDy", });
+ new java.lang.String[] { "Dx", "Dy", "Categories", "Subcategories", "Name", "NameEn", "Id", "OpeningHours", "Site", "Phone", "Note", "TextCategories", "TextValues", "PrecisionXY", });
internal_static_OsmAnd_OBF_IdTable_descriptor =
getDescriptor().getMessageTypes().get(36);
internal_static_OsmAnd_OBF_IdTable_fieldAccessorTable = new
diff --git a/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java b/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java
index a9c3411b68..97e921a3d4 100644
--- a/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java
+++ b/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java
@@ -48,12 +48,12 @@ public class MapUtils {
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '_', '~'
};
-
- public static int calculateFromBaseZoomPrecisionXY(int bazeZoom, int finalZoom, int xBase, int yBase) {
- int px = xBase;
- int py = yBase;
+
+ public static int calculateFromBaseZoomPrecisionXY(int baseZoom, int finalZoom, int xFinal, int yFinal) {
+ int px = xFinal;
+ int py = yFinal;
int precisionNumber = 1;
- for (int zoom = finalZoom - 1; zoom >= bazeZoom; zoom--) {
+ for (int zoom = finalZoom - 1; zoom >= baseZoom; zoom--) {
int x = px / 2; // (int) MapUtils.getTileNumberX(zoom, lon);
int y = py / 2; // (int) MapUtils.getTileNumberY(zoom, lat);
int deltax = px - x * 2;
@@ -67,7 +67,7 @@ public class MapUtils {
px = x;
py = y;
}
- System.out.println(String.format("Bits: %d %s (%d)", Integer.toBinaryString(precisionNumber).length(), Integer.toBinaryString(precisionNumber), precisionNumber));
+ // System.out.println(String.format("Bits: %d %s (%d)", Integer.toBinaryString(precisionNumber).length(), Integer.toBinaryString(precisionNumber), precisionNumber));
return precisionNumber;
}
From 357ab00ed60df90daa8f61db5dbf5e271840aa91 Mon Sep 17 00:00:00 2001
From: nazar-kutz
Date: Fri, 12 Feb 2021 21:38:28 +0200
Subject: [PATCH 30/70] Download all button implementation
---
.../java/net/osmand/map/OsmandRegions.java | 39 ++
.../main/java/net/osmand/map/WorldRegion.java | 29 ++
OsmAnd/res/values/strings.xml | 2 +
.../download/AbstractDownloadActivity.java | 2 +-
.../osmand/plus/download/CustomIndexItem.java | 3 +-
.../plus/download/DownloadActivity.java | 1 -
.../plus/download/DownloadActivityType.java | 27 +-
.../plus/download/DownloadIndexesThread.java | 10 +
.../osmand/plus/download/DownloadItem.java | 76 ++++
.../plus/download/DownloadResourceGroup.java | 80 ++--
.../plus/download/DownloadResources.java | 158 ++++++--
.../download/DownloadValidationManager.java | 2 +-
.../net/osmand/plus/download/IndexItem.java | 85 ++--
.../plus/download/MultipleIndexItem.java | 122 ++++++
.../ui/DownloadResourceGroupAdapter.java | 6 +-
.../plus/download/ui/ItemViewHolder.java | 367 ++++++++++++------
.../download/ui/UpdatesIndexFragment.java | 3 +-
17 files changed, 763 insertions(+), 249 deletions(-)
create mode 100644 OsmAnd/src/net/osmand/plus/download/DownloadItem.java
create mode 100644 OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java
diff --git a/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java b/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java
index 033beb3789..eba0d94b2b 100644
--- a/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java
+++ b/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java
@@ -10,6 +10,7 @@ import net.osmand.binary.BinaryMapIndexReader.TagValuePair;
import net.osmand.data.LatLon;
import net.osmand.data.QuadRect;
import net.osmand.data.QuadTree;
+import net.osmand.map.WorldRegion.RegionBoundingBox;
import net.osmand.util.Algorithms;
import net.osmand.util.MapAlgorithms;
import net.osmand.util.MapUtils;
@@ -436,6 +437,7 @@ public class OsmandRegions {
cx /= object.getPointsLength();
cy /= object.getPointsLength();
rd.regionCenter = new LatLon(MapUtils.get31LatitudeY((int) cy), MapUtils.get31LongitudeX((int) cx));
+ rd.boundingBox = findBoundingBox(object);
}
rd.regionParentFullName = mapIndexFields.get(mapIndexFields.parentFullName, object);
@@ -461,6 +463,43 @@ public class OsmandRegions {
return rd;
}
+ private RegionBoundingBox findBoundingBox(BinaryMapDataObject object) {
+ if (object.getPointsLength() == 0) {
+ return new RegionBoundingBox(0, 0, 0, 0);
+ }
+
+ double currentX = object.getPoint31XTile(0);
+ double currentY = object.getPoint31YTile(0);
+ double minX = currentX;
+ double maxX = currentX;
+ double minY = currentY;
+ double maxY = currentY;
+
+ if (object.getPointsLength() > 1) {
+ for (int i = 1; i < object.getPointsLength(); i++) {
+ currentX = object.getPoint31XTile(i);
+ currentY = object.getPoint31YTile(i);
+ if (currentX > maxX) {
+ maxX = currentX;
+ } else if (currentX < minX) {
+ minX = currentX;
+ }
+ if (currentY > maxY) {
+ maxY = currentY;
+ } else if (currentY < minY) {
+ minY = currentY;
+ }
+ }
+ }
+
+ minX = MapUtils.get31LongitudeX((int) minX);
+ maxX = MapUtils.get31LongitudeX((int) maxX);
+ double revertedMinY = MapUtils.get31LatitudeY((int) maxY);
+ double revertedMaxY = MapUtils.get31LatitudeY((int) minY);
+
+ return new RegionBoundingBox(minX, maxX, revertedMinY, revertedMaxY);
+ }
+
private String getSearchIndex(BinaryMapDataObject object) {
MapIndex mi = object.getMapIndex();
TIntObjectIterator it = object.getObjectNames().iterator();
diff --git a/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java b/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java
index 38fbc40c3d..e95efb4f5b 100644
--- a/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java
+++ b/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java
@@ -40,6 +40,7 @@ public class WorldRegion implements Serializable {
protected String regionDownloadName;
protected boolean regionMapDownload;
protected LatLon regionCenter;
+ protected RegionBoundingBox boundingBox;
public static class RegionParams {
protected String regionLeftHandDriving;
@@ -182,4 +183,32 @@ public class WorldRegion implements Serializable {
}
return res;
}
+
+ public static boolean isFirstRegionInsideTheSecond(WorldRegion first,
+ WorldRegion second) {
+ RegionBoundingBox bbox1 = first.boundingBox;
+ RegionBoundingBox bbox2 = second.boundingBox;
+ if ((bbox1.minX > bbox2.minX) && (bbox1.maxX < bbox2.maxX)) {
+ if ((bbox1.minY > bbox2.minY) && (bbox1.maxY < bbox2.maxY)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static class RegionBoundingBox {
+
+ double minX;
+ double maxX;
+ double minY;
+ double maxY;
+
+ public RegionBoundingBox(double minX, double maxX, double minY, double maxY) {
+ this.minX = minX;
+ this.maxX = maxX;
+ this.minY = minY;
+ this.maxY = maxY;
+ }
+
+ }
}
\ No newline at end of file
diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index 8b1a73aa95..71c3591ade 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -12,6 +12,8 @@
-->
+ Delete %1$d files?
+ All regions
Car
Motorbike
Off-road
diff --git a/OsmAnd/src/net/osmand/plus/download/AbstractDownloadActivity.java b/OsmAnd/src/net/osmand/plus/download/AbstractDownloadActivity.java
index 9bcb0ebb6c..93b887ea1c 100644
--- a/OsmAnd/src/net/osmand/plus/download/AbstractDownloadActivity.java
+++ b/OsmAnd/src/net/osmand/plus/download/AbstractDownloadActivity.java
@@ -17,7 +17,7 @@ public class AbstractDownloadActivity extends ActionBarProgressActivity {
downloadValidationManager.startDownload(this, indexItem);
}
- public void makeSureUserCancelDownload(IndexItem item) {
+ public void makeSureUserCancelDownload(DownloadItem item) {
downloadValidationManager.makeSureUserCancelDownload(this, item);
}
}
diff --git a/OsmAnd/src/net/osmand/plus/download/CustomIndexItem.java b/OsmAnd/src/net/osmand/plus/download/CustomIndexItem.java
index 16067b7c04..885e28fdf6 100644
--- a/OsmAnd/src/net/osmand/plus/download/CustomIndexItem.java
+++ b/OsmAnd/src/net/osmand/plus/download/CustomIndexItem.java
@@ -56,7 +56,8 @@ public class CustomIndexItem extends IndexItem {
}
@Override
- public File getTargetFile(OsmandApplication ctx) {
+ @NonNull
+ public File getTargetFile(@NonNull OsmandApplication ctx) {
String basename = getTranslatedBasename();
if (!Algorithms.isEmpty(subfolder)) {
basename = subfolder + "/" + basename;
diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java
index d076f329f0..bc92fc050f 100644
--- a/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java
+++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java
@@ -1,7 +1,6 @@
package net.osmand.plus.download;
import android.Manifest;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java
index 298e3fc287..b78617d426 100644
--- a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java
+++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java
@@ -18,6 +18,7 @@ import java.io.IOException;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
@@ -113,6 +114,10 @@ public class DownloadActivityType {
public static DownloadActivityType getIndexType(String tagName) {
return byTag.get(tagName);
}
+
+ public static Collection values() {
+ return byTag.values();
+ }
protected static String addVersionToExt(String ext, int version) {
return "_" + version + ext;
@@ -318,7 +323,7 @@ public class DownloadActivityType {
}
}
- public String getVisibleDescription(IndexItem indexItem, Context ctx) {
+ public String getVisibleDescription(DownloadItem downloadItem, Context ctx) {
if (this == SRTM_COUNTRY_FILE) {
return ctx.getString(R.string.download_srtm_maps);
} else if (this == WIKIPEDIA_FILE) {
@@ -337,20 +342,20 @@ public class DownloadActivityType {
return "";
}
- public String getVisibleName(IndexItem indexItem, Context ctx, OsmandRegions osmandRegions, boolean includingParent) {
+ public String getVisibleName(DownloadItem downloadItem, Context ctx, OsmandRegions osmandRegions, boolean includingParent) {
if (this == VOICE_FILE) {
- String fileName = indexItem.fileName;
+ String fileName = downloadItem.getFileName();
if (fileName.endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)) {
- return FileNameTranslationHelper.getVoiceName(ctx, getBasename(indexItem));
+ return FileNameTranslationHelper.getVoiceName(ctx, getBasename(downloadItem));
} else if (fileName.endsWith(IndexConstants.TTSVOICE_INDEX_EXT_JS)) {
- return FileNameTranslationHelper.getVoiceName(ctx, getBasename(indexItem));
+ return FileNameTranslationHelper.getVoiceName(ctx, getBasename(downloadItem));
}
- return getBasename(indexItem);
+ return getBasename(downloadItem);
}
if (this == FONT_FILE) {
- return FileNameTranslationHelper.getFontName(ctx, getBasename(indexItem));
+ return FileNameTranslationHelper.getFontName(ctx, getBasename(downloadItem));
}
- final String basename = getBasename(indexItem);
+ final String basename = getBasename(downloadItem);
if (basename.endsWith(FileNameTranslationHelper.WIKI_NAME)) {
return FileNameTranslationHelper.getWikiName(ctx, basename);
}
@@ -442,8 +447,8 @@ public class DownloadActivityType {
}
- public String getBasename(IndexItem indexItem) {
- String fileName = indexItem.fileName;
+ public String getBasename(DownloadItem downloadItem) {
+ String fileName = downloadItem.getFileName();
if (fileName.endsWith(IndexConstants.EXTRA_ZIP_EXT)) {
return fileName.substring(0, fileName.length() - IndexConstants.EXTRA_ZIP_EXT.length());
}
@@ -458,7 +463,7 @@ public class DownloadActivityType {
if (fileName.endsWith(IndexConstants.SQLITE_EXT)) {
return fileName.substring(0, fileName.length() - IndexConstants.SQLITE_EXT.length());
}
- if (indexItem.getType() == WIKIVOYAGE_FILE &&
+ if (downloadItem.getType() == WIKIVOYAGE_FILE &&
fileName.endsWith(IndexConstants.BINARY_WIKIVOYAGE_MAP_INDEX_EXT)) {
return fileName.substring(0, fileName.length() - IndexConstants.BINARY_WIKIVOYAGE_MAP_INDEX_EXT.length());
}
diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java
index 9d47f57762..20ac836139 100644
--- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java
+++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java
@@ -239,6 +239,16 @@ public class DownloadIndexesThread {
}
}
+ public void cancelDownload(DownloadItem item) {
+ if (item instanceof MultipleIndexItem) {
+ MultipleIndexItem multipleIndexItem = (MultipleIndexItem) item;
+ cancelDownload(multipleIndexItem.getAllIndexes());
+ } else if (item instanceof IndexItem) {
+ IndexItem indexItem = (IndexItem) item;
+ cancelDownload(indexItem);
+ }
+ }
+
public void cancelDownload(IndexItem item) {
app.logMapDownloadEvent("cancel", item);
if (currentDownloadingItem == item) {
diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadItem.java b/OsmAnd/src/net/osmand/plus/download/DownloadItem.java
new file mode 100644
index 0000000000..f0a566cea6
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/download/DownloadItem.java
@@ -0,0 +1,76 @@
+package net.osmand.plus.download;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+
+import net.osmand.map.OsmandRegions;
+import net.osmand.plus.OsmandApplication;
+import net.osmand.plus.R;
+
+import java.io.File;
+import java.util.List;
+import java.util.Locale;
+
+public abstract class DownloadItem {
+
+ protected DownloadActivityType type;
+ protected DownloadResourceGroup relatedGroup;
+
+ public DownloadItem(DownloadActivityType type) {
+ this.type = type;
+ }
+
+ public DownloadActivityType getType() {
+ return type;
+ }
+
+ public void setRelatedGroup(DownloadResourceGroup relatedGroup) {
+ this.relatedGroup = relatedGroup;
+ }
+
+ public DownloadResourceGroup getRelatedGroup() {
+ return relatedGroup;
+ }
+
+ @NonNull
+ public String getSizeDescription(Context ctx) {
+ String pattern = ctx.getString(R.string.ltr_or_rtl_combine_via_space);
+ String size = String.format(Locale.US, "%.2f", getSizeToDownloadInMb());
+ return String.format(pattern, size, "MB");
+ }
+
+ public String getVisibleName(Context ctx, OsmandRegions osmandRegions) {
+ return type.getVisibleName(this, ctx, osmandRegions, true);
+ }
+
+ public String getVisibleName(Context ctx, OsmandRegions osmandRegions, boolean includingParent) {
+ return type.getVisibleName(this, ctx, osmandRegions, includingParent);
+ }
+
+ public String getVisibleDescription(OsmandApplication clctx) {
+ return type.getVisibleDescription(this, clctx);
+ }
+
+ public String getBasename() {
+ return type.getBasename(this);
+ }
+
+ protected abstract double getSizeToDownloadInMb();
+
+ public abstract double getArchiveSizeMB();
+
+ public abstract boolean isDownloaded();
+
+ public abstract boolean isOutdated();
+
+ public abstract boolean hasActualDataToDownload();
+
+ public abstract boolean isDownloading(DownloadIndexesThread thread);
+
+ public abstract String getFileName();
+
+ @NonNull
+ public abstract List getDownloadedFiles(OsmandApplication app);
+
+}
diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadResourceGroup.java b/OsmAnd/src/net/osmand/plus/download/DownloadResourceGroup.java
index 416e20bc94..dc4e697cb4 100644
--- a/OsmAnd/src/net/osmand/plus/download/DownloadResourceGroup.java
+++ b/OsmAnd/src/net/osmand/plus/download/DownloadResourceGroup.java
@@ -8,6 +8,7 @@ import net.osmand.map.OsmandRegions;
import net.osmand.map.WorldRegion;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
+import net.osmand.util.Algorithms;
import java.util.ArrayList;
import java.util.Collections;
@@ -20,8 +21,8 @@ public class DownloadResourceGroup {
private final DownloadResourceGroupType type;
private final DownloadResourceGroup parentGroup;
- // ASSERT: individualResources are not empty if and only if groups are empty
- private final List individualResources;
+ // ASSERT: individualDisplayItems are not empty if and only if groups are empty
+ private final List individualDownloadItems;
private final List groups;
protected final String id;
@@ -107,10 +108,10 @@ public class DownloadResourceGroup {
public DownloadResourceGroup(DownloadResourceGroup parentGroup, DownloadResourceGroupType type, String id) {
boolean flat = type.containsIndexItem();
if (flat) {
- this.individualResources = new ArrayList();
+ this.individualDownloadItems = new ArrayList();
this.groups = null;
} else {
- this.individualResources = null;
+ this.individualDownloadItems = null;
this.groups = new ArrayList();
}
this.id = id;
@@ -173,7 +174,7 @@ public class DownloadResourceGroup {
DownloadResourceGroup regionMaps = getSubGroupById(DownloadResourceGroupType.REGION_MAPS.getDefaultId());
if(regionMaps != null && regionMaps.size() == 1 && parentGroup != null && parentGroup.getParentGroup() != null &&
isEmpty(getSubGroupById(DownloadResourceGroupType.SUBREGIONS.getDefaultId()))) {
- IndexItem item = regionMaps.individualResources.get(0);
+ IndexItem item = regionMaps.getIndividualResources().get(0);
DownloadResourceGroup screenParent = parentGroup.getParentGroup();
if(item.getType() == DownloadActivityType.HILLSHADE_FILE) {
DownloadResourceGroup hillshades =
@@ -183,7 +184,7 @@ public class DownloadResourceGroup {
screenParent.addGroup(hillshades);
}
hillshades.addItem(item);
- regionMaps.individualResources.remove(0);
+ regionMaps.individualDownloadItems.remove(0);
} else if (item.getType() == DownloadActivityType.SRTM_COUNTRY_FILE) {
DownloadResourceGroup hillshades = screenParent
.getSubGroupById(DownloadResourceGroupType.SRTM_HEADER.getDefaultId());
@@ -192,7 +193,7 @@ public class DownloadResourceGroup {
screenParent.addGroup(hillshades);
}
hillshades.addItem(item);
- regionMaps.individualResources.remove(0);
+ regionMaps.individualDownloadItems.remove(0);
}
}
@@ -221,35 +222,38 @@ public class DownloadResourceGroup {
}
}
groups.add(g);
- if (g.individualResources != null) {
- final net.osmand.Collator collator = OsmAndCollator.primaryCollator();
- final OsmandApplication app = getRoot().app;
- final OsmandRegions osmandRegions = app.getRegions();
- Collections.sort(g.individualResources, new Comparator() {
- @Override
- public int compare(IndexItem lhs, IndexItem rhs) {
- int lli = lhs.getType().getOrderIndex();
- int rri = rhs.getType().getOrderIndex();
- if(lli < rri) {
- return -1;
- } else if(lli > rri) {
- return 1;
- }
+ sortDownloadItems(g.individualDownloadItems);
+ }
- return collator.compare(lhs.getVisibleName(app.getApplicationContext(), osmandRegions),
- rhs.getVisibleName(app.getApplicationContext(), osmandRegions));
+ protected void sortDownloadItems(List items) {
+ if (Algorithms.isEmpty(items)) return;
+ final net.osmand.Collator collator = OsmAndCollator.primaryCollator();
+ final OsmandApplication app = getRoot().app;
+ final OsmandRegions osmandRegions = app.getRegions();
+ Collections.sort(items, new Comparator() {
+ @Override
+ public int compare(DownloadItem firstItem, DownloadItem secondItem) {
+ int firstOrder = firstItem.getType().getOrderIndex();
+ int secondOrder = secondItem.getType().getOrderIndex();
+ if(firstOrder < secondOrder) {
+ return -1;
+ } else if(firstOrder > secondOrder) {
+ return 1;
}
- });
- }
+ String firstName = firstItem.getVisibleName(app, osmandRegions);
+ String secondName = secondItem.getVisibleName(app, osmandRegions);
+ return collator.compare(firstName, secondName);
+ }
+ });
}
- public void addItem(IndexItem i) {
+ public void addItem(DownloadItem i) {
i.setRelatedGroup(this);
- individualResources.add(i);
+ individualDownloadItems.add(i);
}
public boolean isEmpty() {
- return isEmpty(individualResources) && isEmpty(groups);
+ return isEmpty(individualDownloadItems) && isEmpty(groups);
}
private boolean isEmpty(List> l) {
@@ -265,7 +269,7 @@ public class DownloadResourceGroup {
}
public int size() {
- return groups != null ? groups.size() : individualResources.size();
+ return groups != null ? groups.size() : individualDownloadItems.size();
}
public DownloadResourceGroup getGroupByIndex(int ind) {
@@ -275,9 +279,9 @@ public class DownloadResourceGroup {
return null;
}
- public IndexItem getItemByIndex(int ind) {
- if (individualResources != null && ind >= 0 && ind < individualResources.size()) {
- return individualResources.get(ind);
+ public DownloadItem getItemByIndex(int ind) {
+ if (individualDownloadItems != null && ind >= 0 && ind < individualDownloadItems.size()) {
+ return individualDownloadItems.get(ind);
}
return null;
}
@@ -306,8 +310,20 @@ public class DownloadResourceGroup {
}
public List getIndividualResources() {
+ List individualResources = new ArrayList<>();
+ if (individualDownloadItems != null) {
+ for (DownloadItem item : individualDownloadItems) {
+ if (item instanceof IndexItem) {
+ individualResources.add((IndexItem) item);
+ }
+ }
+ }
return individualResources;
}
+
+ public List getIndividualDownloadItems() {
+ return individualDownloadItems;
+ }
public WorldRegion getRegion() {
return region;
diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java
index 56d137a696..a3aa20c79f 100644
--- a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java
+++ b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java
@@ -25,10 +25,14 @@ import java.io.InputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+
+import static net.osmand.plus.download.DownloadResourceGroup.DownloadResourceGroupType.REGION_MAPS;
public class DownloadResources extends DownloadResourceGroup {
private static final String TAG = DownloadResources.class.getSimpleName();
@@ -40,7 +44,7 @@ public class DownloadResources extends DownloadResourceGroup {
private Map indexFileNames = new LinkedHashMap<>();
private Map indexActivatedFileNames = new LinkedHashMap<>();
private List rawResources;
- private Map > groupByRegion;
+ private Map> groupByRegion;
private List itemsToUpdate = new ArrayList<>();
public static final String WORLD_SEAMARKS_KEY = "world_seamarks";
public static final String WORLD_SEAMARKS_NAME = "World_seamarks";
@@ -55,7 +59,7 @@ public class DownloadResources extends DownloadResourceGroup {
this.region = app.getRegions().getWorldRegion();
this.app = app;
}
-
+
public List getItemsToUpdate() {
return itemsToUpdate;
}
@@ -260,7 +264,7 @@ public class DownloadResources extends DownloadResourceGroup {
}
private Map listWithAlternatives(final java.text.DateFormat dateFormat, File file,
- final String ext, final Map files) {
+ final String ext, final Map files) {
if (file.isDirectory()) {
file.list(new FilenameFilter() {
@Override
@@ -292,7 +296,7 @@ public class DownloadResources extends DownloadResourceGroup {
}
return file;
}
-
+
private void prepareFilesToUpdate() {
List filtered = rawResources;
if (filtered != null) {
@@ -307,7 +311,7 @@ public class DownloadResources extends DownloadResourceGroup {
}
}
}
-
+
protected boolean prepareData(List resources) {
this.rawResources = resources;
@@ -332,18 +336,18 @@ public class DownloadResources extends DownloadResourceGroup {
DownloadResourceGroup nauticalMapsGroup = new DownloadResourceGroup(this, DownloadResourceGroupType.NAUTICAL_MAPS_GROUP);
DownloadResourceGroup nauticalMapsScreen = new DownloadResourceGroup(nauticalMapsGroup, DownloadResourceGroupType.NAUTICAL_MAPS);
DownloadResourceGroup nauticalMaps = new DownloadResourceGroup(nauticalMapsGroup, DownloadResourceGroupType.NAUTICAL_MAPS_HEADER);
-
+
DownloadResourceGroup wikivoyageMapsGroup = new DownloadResourceGroup(this, DownloadResourceGroupType.TRAVEL_GROUP);
DownloadResourceGroup wikivoyageMapsScreen = new DownloadResourceGroup(wikivoyageMapsGroup, DownloadResourceGroupType.WIKIVOYAGE_MAPS);
DownloadResourceGroup wikivoyageMaps = new DownloadResourceGroup(wikivoyageMapsGroup, DownloadResourceGroupType.WIKIVOYAGE_HEADER);
- Map > groupByRegion = new LinkedHashMap>();
+ Map> groupByRegion = new LinkedHashMap<>();
OsmandRegions regs = app.getRegions();
for (IndexItem ii : resources) {
if (ii.getType() == DownloadActivityType.VOICE_FILE) {
- if (ii.getFileName().endsWith(IndexConstants.TTSVOICE_INDEX_EXT_JS)){
+ if (ii.getFileName().endsWith(IndexConstants.TTSVOICE_INDEX_EXT_JS)) {
voiceTTS.addItem(ii);
- } else if (ii.getFileName().endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)){
+ } else if (ii.getFileName().endsWith(IndexConstants.VOICE_INDEX_EXT_ZIP)) {
voiceRec.addItem(ii);
}
continue;
@@ -377,7 +381,7 @@ public class DownloadResources extends DownloadResourceGroup {
groupByRegion.get(wg).add(ii);
} else {
if (ii.getFileName().startsWith("World_")) {
- if (ii.getFileName().toLowerCase().startsWith(WORLD_SEAMARKS_KEY) ||
+ if (ii.getFileName().toLowerCase().startsWith(WORLD_SEAMARKS_KEY) ||
ii.getFileName().toLowerCase().startsWith(WORLD_SEAMARKS_OLD_KEY)) {
nauticalMaps.addItem(ii);
} else {
@@ -402,22 +406,22 @@ public class DownloadResources extends DownloadResourceGroup {
LinkedList parent = new LinkedList();
DownloadResourceGroup worldSubregions = new DownloadResourceGroup(this, DownloadResourceGroupType.SUBREGIONS);
addGroup(worldSubregions);
- for(WorldRegion rg : region.getSubregions()) {
+ for (WorldRegion rg : region.getSubregions()) {
queue.add(rg);
parent.add(worldSubregions);
}
- while(!queue.isEmpty()) {
+ while (!queue.isEmpty()) {
WorldRegion reg = queue.pollFirst();
DownloadResourceGroup parentGroup = parent.pollFirst();
List subregions = reg.getSubregions();
DownloadResourceGroup mainGrp = new DownloadResourceGroup(parentGroup, DownloadResourceGroupType.REGION, reg.getRegionId());
mainGrp.region = reg;
parentGroup.addGroup(mainGrp);
-
+
List list = groupByRegion.get(reg);
- if(list != null) {
- DownloadResourceGroup flatFiles = new DownloadResourceGroup(mainGrp, DownloadResourceGroupType.REGION_MAPS);
- for(IndexItem ii : list) {
+ if (list != null) {
+ DownloadResourceGroup flatFiles = new DownloadResourceGroup(mainGrp, REGION_MAPS);
+ for (IndexItem ii : list) {
flatFiles.addItem(ii);
}
mainGrp.addGroup(flatFiles);
@@ -425,10 +429,10 @@ public class DownloadResources extends DownloadResourceGroup {
DownloadResourceGroup subRegions = new DownloadResourceGroup(mainGrp, DownloadResourceGroupType.SUBREGIONS);
mainGrp.addGroup(subRegions);
// add to processing queue
- for(WorldRegion rg : subregions) {
+ for (WorldRegion rg : subregions) {
queue.add(rg);
parent.add(subRegions);
- }
+ }
}
// Possible improvements
// 1. if there is no subregions no need to create resource group REGIONS_MAPS - objection raise diversity and there is no value
@@ -455,8 +459,8 @@ public class DownloadResources extends DownloadResourceGroup {
}
otherGroup.addGroup(voiceScreenTTS);
otherGroup.addGroup(voiceScreenRec);
-
-
+
+
if (fonts.getIndividualResources() != null) {
otherGroup.addGroup(fontScreen);
}
@@ -465,9 +469,87 @@ public class DownloadResources extends DownloadResourceGroup {
createHillshadeSRTMGroups();
trimEmptyGroups();
updateLoadedFiles();
+ collectMultipleIndexesItems(region);
return true;
}
+ private void collectMultipleIndexesItems(@NonNull WorldRegion region) {
+ List subRegions = region.getSubregions();
+ if (Algorithms.isEmpty(subRegions)) return;
+
+ DownloadResourceGroup group = getRegionMapsGroup(region);
+ if (group != null) {
+ boolean listModified = false;
+ List indexesList = group.getIndividualResources();
+ for (DownloadActivityType type : DownloadActivityType.values()) {
+ if (!doesListContainIndexWithType(indexesList, type)) {
+ List indexesFromSubRegions = collectIndexesOfType(subRegions, type);
+ if (indexesFromSubRegions != null) {
+ group.addItem(new MultipleIndexItem(region, indexesFromSubRegions, type));
+ listModified = true;
+ }
+ }
+ }
+ if (listModified) {
+ sortDownloadItems(group.getIndividualDownloadItems());
+ }
+ }
+ for (WorldRegion subRegion : subRegions) {
+ collectMultipleIndexesItems(subRegion);
+ }
+ }
+
+ private DownloadResourceGroup getRegionMapsGroup(WorldRegion region) {
+ DownloadResourceGroup group = getRegionGroup(region);
+ if (group != null) {
+ return group.getSubGroupById(REGION_MAPS.getDefaultId());
+ }
+ return null;
+ }
+
+ @Nullable
+ private List collectIndexesOfType(@NonNull List regions,
+ @NonNull DownloadActivityType type) {
+ Map collectedIndexes = new LinkedHashMap<>();
+ for (WorldRegion region : regions) {
+ List regionIndexes = getIndexItems(region);
+ boolean found = false;
+ if (regionIndexes != null) {
+ for (IndexItem index : regionIndexes) {
+ if (index.getType() == type) {
+ found = true;
+ collectedIndexes.put(region, index);
+ break;
+ }
+ }
+ }
+ if (!found) return null;
+ }
+ return removeDuplicates(collectedIndexes);
+ }
+
+ private List removeDuplicates(Map collectedIndexes) {
+ List regions = new ArrayList<>(collectedIndexes.keySet());
+ // collect duplicates
+ Set duplicates = new HashSet<>();
+ for (int i = 0; i < regions.size() - 1; i++) {
+ WorldRegion firstRegion = regions.get(i);
+ for (int j = i + 1; j < regions.size(); j++) {
+ WorldRegion secondRegion = regions.get(j);
+ if (WorldRegion.isFirstRegionInsideTheSecond(firstRegion, secondRegion)) {
+ duplicates.add(firstRegion);
+ } else if (WorldRegion.isFirstRegionInsideTheSecond(secondRegion, firstRegion)) {
+ duplicates.add(secondRegion);
+ }
+ }
+ }
+ // remove duplicates
+ for (WorldRegion key : duplicates) {
+ collectedIndexes.remove(key);
+ }
+ return new ArrayList<>(collectedIndexes.values());
+ }
+
private void buildRegionsGroups(WorldRegion region, DownloadResourceGroup group) {
LinkedList queue = new LinkedList();
LinkedList parent = new LinkedList();
@@ -485,7 +567,7 @@ public class DownloadResources extends DownloadResourceGroup {
CustomRegion customRegion = (CustomRegion) reg;
List indexItems = customRegion.loadIndexItems();
if (!Algorithms.isEmpty(indexItems)) {
- DownloadResourceGroup flatFiles = new DownloadResourceGroup(mainGrp, DownloadResourceGroupType.REGION_MAPS);
+ DownloadResourceGroup flatFiles = new DownloadResourceGroup(mainGrp, REGION_MAPS);
for (IndexItem ii : indexItems) {
flatFiles.addItem(ii);
}
@@ -557,7 +639,11 @@ public class DownloadResources extends DownloadResourceGroup {
return res;
}
- public static List findIndexItemsAt(OsmandApplication app, List names, DownloadActivityType type, boolean includeDownloaded, int limit) {
+ public static List findIndexItemsAt(OsmandApplication app,
+ List names,
+ DownloadActivityType type,
+ boolean includeDownloaded,
+ int limit) {
List res = new ArrayList<>();
OsmandRegions regions = app.getRegions();
DownloadIndexesThread downloadThread = app.getDownloadThread();
@@ -573,8 +659,12 @@ public class DownloadResources extends DownloadResourceGroup {
return res;
}
- private static boolean isIndexItemDownloaded(DownloadIndexesThread downloadThread, DownloadActivityType type, WorldRegion downloadRegion, List res) {
- List otherIndexItems = new ArrayList<>(downloadThread.getIndexes().getIndexItems(downloadRegion));
+ private static boolean isIndexItemDownloaded(DownloadIndexesThread downloadThread,
+ DownloadActivityType type,
+ WorldRegion downloadRegion,
+ List res) {
+ List otherIndexItems =
+ new ArrayList<>(downloadThread.getIndexes().getIndexItems(downloadRegion));
for (IndexItem indexItem : otherIndexItems) {
if (indexItem.getType() == type && indexItem.isDownloaded()) {
return true;
@@ -584,8 +674,24 @@ public class DownloadResources extends DownloadResourceGroup {
&& isIndexItemDownloaded(downloadThread, type, downloadRegion.getSuperregion(), res);
}
- private static boolean addIndexItem(DownloadIndexesThread downloadThread, DownloadActivityType type, WorldRegion downloadRegion, List res) {
- List otherIndexItems = new ArrayList<>(downloadThread.getIndexes().getIndexItems(downloadRegion));
+ private boolean doesListContainIndexWithType(List indexItems,
+ DownloadActivityType type) {
+ if (indexItems != null) {
+ for (IndexItem indexItem : indexItems) {
+ if (indexItem.getType() == type) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private static boolean addIndexItem(DownloadIndexesThread downloadThread,
+ DownloadActivityType type,
+ WorldRegion downloadRegion,
+ List res) {
+ List otherIndexItems =
+ new ArrayList<>(downloadThread.getIndexes().getIndexItems(downloadRegion));
for (IndexItem indexItem : otherIndexItems) {
if (indexItem.getType() == type
&& !res.contains(indexItem)) {
diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadValidationManager.java b/OsmAnd/src/net/osmand/plus/download/DownloadValidationManager.java
index 8e03b2c1e5..6b12fb6713 100644
--- a/OsmAnd/src/net/osmand/plus/download/DownloadValidationManager.java
+++ b/OsmAnd/src/net/osmand/plus/download/DownloadValidationManager.java
@@ -192,7 +192,7 @@ public class DownloadValidationManager {
}
- public void makeSureUserCancelDownload(FragmentActivity ctx, final IndexItem item) {
+ public void makeSureUserCancelDownload(FragmentActivity ctx, final DownloadItem item) {
AlertDialog.Builder bld = new AlertDialog.Builder(ctx);
bld.setTitle(ctx.getString(R.string.shared_string_cancel));
bld.setMessage(R.string.confirm_interrupt_download);
diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItem.java b/OsmAnd/src/net/osmand/plus/download/IndexItem.java
index 650ab0679b..a746d4aa90 100644
--- a/OsmAnd/src/net/osmand/plus/download/IndexItem.java
+++ b/OsmAnd/src/net/osmand/plus/download/IndexItem.java
@@ -1,12 +1,9 @@
package net.osmand.plus.download;
-import android.content.Context;
-
import androidx.annotation.NonNull;
import net.osmand.IndexConstants;
import net.osmand.PlatformUtil;
-import net.osmand.map.OsmandRegions;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.helpers.FileNameTranslationHelper;
@@ -16,9 +13,11 @@ import org.apache.commons.logging.Log;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.List;
-public class IndexItem implements Comparable {
+public class IndexItem extends DownloadItem implements Comparable {
private static final Log log = PlatformUtil.getLog(IndexItem.class);
String description;
@@ -27,43 +26,44 @@ public class IndexItem implements Comparable {
long timestamp;
long contentSize;
long containerSize;
- DownloadActivityType type;
boolean extra;
// Update information
boolean outdated;
boolean downloaded;
long localTimestamp;
- DownloadResourceGroup relatedGroup;
-
- public IndexItem(String fileName, String description, long timestamp, String size, long contentSize,
- long containerSize, @NonNull DownloadActivityType tp) {
+ public IndexItem(String fileName,
+ String description,
+ long timestamp,
+ String size,
+ long contentSize,
+ long containerSize,
+ @NonNull DownloadActivityType type) {
+ super(type);
this.fileName = fileName;
this.description = description;
this.timestamp = timestamp;
this.size = size;
this.contentSize = contentSize;
this.containerSize = containerSize;
- this.type = tp;
- }
-
- public DownloadActivityType getType() {
- return type;
- }
-
- public void setRelatedGroup(DownloadResourceGroup relatedGroup) {
- this.relatedGroup = relatedGroup;
- }
-
- public DownloadResourceGroup getRelatedGroup() {
- return relatedGroup;
}
+ @Override
public String getFileName() {
return fileName;
}
+ @NonNull
+ @Override
+ public List getDownloadedFiles(OsmandApplication app) {
+ File targetFile = getTargetFile(app);
+ List result = new ArrayList<>();
+ if (targetFile.exists()) {
+ result.add(targetFile);
+ }
+ return result;
+ }
public String getDescription() {
return description;
@@ -89,10 +89,14 @@ public class IndexItem implements Comparable {
return ((double)containerSize) / (1 << 20);
}
- public String getSizeDescription(Context ctx) {
- return ctx.getString(R.string.ltr_or_rtl_combine_via_space, size, "MB");
+ @Override
+ protected double getSizeToDownloadInMb() {
+ try {
+ return Double.parseDouble(size);
+ } catch (Exception e) {
+ return 0;
+ }
}
-
public DownloadEntry createDownloadEntry(OsmandApplication ctx) {
String fileName = this.fileName;
@@ -132,11 +136,8 @@ public class IndexItem implements Comparable {
return type.getTargetFileName(this);
}
- public String getBasename() {
- return type.getBasename(this);
- }
-
- public File getTargetFile(OsmandApplication ctx) {
+ @NonNull
+ public File getTargetFile(@NonNull OsmandApplication ctx) {
String basename = getTranslatedBasename();
return new File(type.getDownloadFolder(ctx, this), basename + type.getUnzipExtension(ctx, this));
}
@@ -190,7 +191,7 @@ public class IndexItem implements Comparable {
&& getType() != DownloadActivityType.HILLSHADE_FILE
&& getType() != DownloadActivityType.SLOPE_FILE;
}
-
+
public void setOutdated(boolean outdated) {
this.outdated = outdated;
}
@@ -198,7 +199,12 @@ public class IndexItem implements Comparable {
public void setDownloaded(boolean downloaded) {
this.downloaded = downloaded;
}
-
+
+ @Override
+ public boolean hasActualDataToDownload() {
+ return !isDownloaded() || isOutdated();
+ }
+
public void setLocalTimestamp(long localTimestamp) {
this.localTimestamp = localTimestamp;
}
@@ -211,20 +217,11 @@ public class IndexItem implements Comparable {
return downloaded;
}
- public String getVisibleName(Context ctx, OsmandRegions osmandRegions) {
- return type.getVisibleName(this, ctx, osmandRegions, true);
+ @Override
+ public boolean isDownloading(DownloadIndexesThread thread) {
+ return thread.isDownloading(this);
}
- public String getVisibleName(Context ctx, OsmandRegions osmandRegions, boolean includingParent) {
- return type.getVisibleName(this, ctx, osmandRegions, includingParent);
- }
-
- public String getVisibleDescription(OsmandApplication clctx) {
- return type.getVisibleDescription(this, clctx);
- }
-
-
-
public String getDate(java.text.DateFormat format) {
return format.format(new Date(timestamp));
}
diff --git a/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java b/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java
new file mode 100644
index 0000000000..e28d606653
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java
@@ -0,0 +1,122 @@
+package net.osmand.plus.download;
+
+import androidx.annotation.NonNull;
+
+import net.osmand.map.WorldRegion;
+import net.osmand.plus.OsmandApplication;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MultipleIndexItem extends DownloadItem {
+
+ private final List items;
+
+ public MultipleIndexItem(@NonNull WorldRegion region,
+ @NonNull List items,
+ @NonNull DownloadActivityType type) {
+ super(type);
+ this.items = items;
+ }
+
+ public List getAllIndexes() {
+ return items;
+ }
+
+ @Override
+ public boolean isOutdated() {
+ for (IndexItem item : items) {
+ if (item.isOutdated()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isDownloaded() {
+ for (IndexItem item : items) {
+ if (item.isDownloaded()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isDownloading(DownloadIndexesThread thread) {
+ for (IndexItem item : items) {
+ if (thread.isDownloading(item)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getFileName() {
+ // The file name is used in many places.
+ // But in the case of a Multiple Indexes element it's not use in most cases.
+ // File is not created for Multiple Indexes element,
+ // and all file names are available in internal IndexItem elements.
+
+ // The only one place where a filename may be needed
+ // is to generate the base and display names.
+ // Since these names are generated based on the filename.
+ // But now we don't need a name for display,
+ // because on all screens where we now use multiple elements item,
+ // for display used a type name instead of a file name.
+
+ // Later, if you need a file name,
+ // you can try to create it based on the WorldRegion
+ // and file name of one of the internal IndexItem elements.
+ return "";
+ }
+
+ @NonNull
+ @Override
+ public List getDownloadedFiles(OsmandApplication app) {
+ List result = new ArrayList<>();
+ for (IndexItem item : items) {
+ result.addAll(item.getDownloadedFiles(app));
+ }
+ return result;
+ }
+
+ public List getIndexesToDownload() {
+ List indexesToDownload = new ArrayList<>();
+ for (IndexItem item : items) {
+ if (item.hasActualDataToDownload()) {
+ indexesToDownload.add(item);
+ }
+ }
+ return indexesToDownload;
+ }
+
+ @Override
+ public boolean hasActualDataToDownload() {
+ return getIndexesToDownload().size() > 0;
+ }
+
+ @Override
+ public double getSizeToDownloadInMb() {
+ double totalSizeMb = 0.0d;
+ for (IndexItem item : items) {
+ if (item.hasActualDataToDownload()) {
+ totalSizeMb += Double.parseDouble(item.size);
+ }
+ }
+ return totalSizeMb;
+ }
+
+ @Override
+ public double getArchiveSizeMB() {
+ double result = 0.0d;
+ for (IndexItem item : items) {
+ result += item.getArchiveSizeMB();
+ }
+ return result;
+ }
+
+}
diff --git a/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupAdapter.java b/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupAdapter.java
index a212dd5e31..d2e281bbfc 100644
--- a/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupAdapter.java
+++ b/OsmAnd/src/net/osmand/plus/download/ui/DownloadResourceGroupAdapter.java
@@ -10,9 +10,9 @@ import android.widget.TextView;
import net.osmand.plus.R;
import net.osmand.plus.activities.OsmandBaseExpandableListAdapter;
import net.osmand.plus.download.CustomIndexItem;
+import net.osmand.plus.download.DownloadItem;
import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.download.DownloadResourceGroup;
-import net.osmand.plus.download.IndexItem;
import java.util.ArrayList;
import java.util.List;
@@ -52,9 +52,9 @@ public class DownloadResourceGroupAdapter extends OsmandBaseExpandableListAdapte
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
final Object child = getChild(groupPosition, childPosition);
- if (child instanceof IndexItem) {
+ if (child instanceof DownloadItem) {
- IndexItem item = (IndexItem) child;
+ DownloadItem item = (DownloadItem) child;
DownloadResourceGroup group = getGroupObj(groupPosition);
ItemViewHolder viewHolder;
if (convertView != null && convertView.getTag() instanceof ItemViewHolder) {
diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java
index 70041a525e..7fd4172fce 100644
--- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java
+++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java
@@ -17,11 +17,14 @@ import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
+import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.PopupMenu;
import androidx.core.view.ViewCompat;
+import net.osmand.map.OsmandRegions;
import net.osmand.map.WorldRegion;
+import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.activities.LocalIndexHelper.LocalIndexType;
@@ -31,11 +34,13 @@ import net.osmand.plus.activities.PluginsFragment;
import net.osmand.plus.chooseplan.ChoosePlanDialogFragment;
import net.osmand.plus.download.CityItem;
import net.osmand.plus.download.CustomIndexItem;
+import net.osmand.plus.download.DownloadItem;
import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.download.DownloadActivityType;
import net.osmand.plus.download.DownloadResourceGroup;
import net.osmand.plus.download.DownloadResources;
import net.osmand.plus.download.IndexItem;
+import net.osmand.plus.download.MultipleIndexItem;
import net.osmand.plus.download.ui.LocalIndexesFragment.LocalIndexOperationTask;
import net.osmand.plus.helpers.FileNameTranslationHelper;
import net.osmand.plus.inapp.InAppPurchaseHelper;
@@ -43,6 +48,8 @@ import net.osmand.util.Algorithms;
import java.io.File;
import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.List;
public class ItemViewHolder {
@@ -137,24 +144,24 @@ public class ItemViewHolder {
depthContoursPurchased = InAppPurchaseHelper.isDepthContoursPurchased(context.getMyApplication());
}
- public void bindIndexItem(final IndexItem indexItem) {
- bindIndexItem(indexItem, null);
+ public void bindIndexItem(final DownloadItem downloadItem) {
+ bindIndexItem(downloadItem, null);
}
- public void bindIndexItem(final IndexItem indexItem, final String cityName) {
+ public void bindIndexItem(final DownloadItem downloadItem, final String cityName) {
initAppStatusVariables();
- boolean isDownloading = context.getDownloadThread().isDownloading(indexItem);
+ boolean isDownloading = downloadItem.isDownloading(context.getDownloadThread());
int progress = -1;
- if (context.getDownloadThread().getCurrentDownloadingItem() == indexItem) {
+ if (context.getDownloadThread().getCurrentDownloadingItem() == downloadItem) {
progress = context.getDownloadThread().getCurrentDownloadingItemProgress();
}
- boolean disabled = checkDisabledAndClickAction(indexItem);
+ boolean disabled = checkDisabledAndClickAction(downloadItem);
/// name and left item
String name;
if(showTypeInName) {
- name = indexItem.getType().getString(context);
+ name = downloadItem.getType().getString(context);
} else {
- name = indexItem.getVisibleName(context, context.getMyApplication().getRegions(), showParentRegionName);
+ name = downloadItem.getVisibleName(context, context.getMyApplication().getRegions(), showParentRegionName);
}
String text = (!Algorithms.isEmpty(cityName) && !cityName.equals(name) ? cityName + "\n" : "") + name;
nameTextView.setText(text);
@@ -164,43 +171,78 @@ public class ItemViewHolder {
nameTextView.setTextColor(textColorSecondary);
}
int color = textColorSecondary;
- if(indexItem.isDownloaded() && !isDownloading) {
- int colorId = indexItem.isOutdated() ? R.color.color_distance : R.color.color_ok;
+ if(downloadItem.isDownloaded() && !isDownloading) {
+ int colorId = downloadItem.isOutdated() ? R.color.color_distance : R.color.color_ok;
color = context.getResources().getColor(colorId);
}
- if (indexItem.isDownloaded()) {
+ if (downloadItem.isDownloaded()) {
leftImageView.setImageDrawable(getContentIcon(context,
- indexItem.getType().getIconResource(), color));
+ downloadItem.getType().getIconResource(), color));
} else if (disabled) {
leftImageView.setImageDrawable(getContentIcon(context,
- indexItem.getType().getIconResource(), textColorSecondary));
+ downloadItem.getType().getIconResource(), textColorSecondary));
} else {
leftImageView.setImageDrawable(getContentIcon(context,
- indexItem.getType().getIconResource()));
+ downloadItem.getType().getIconResource()));
}
descrTextView.setTextColor(textColorSecondary);
if (!isDownloading) {
progressBar.setVisibility(View.GONE);
descrTextView.setVisibility(View.VISIBLE);
- if (indexItem instanceof CustomIndexItem && (((CustomIndexItem) indexItem).getSubName(context) != null)) {
- descrTextView.setText(((CustomIndexItem) indexItem).getSubName(context));
- } else if (indexItem.getType() == DownloadActivityType.DEPTH_CONTOUR_FILE && !depthContoursPurchased) {
+ if (downloadItem instanceof CustomIndexItem && (((CustomIndexItem) downloadItem).getSubName(context) != null)) {
+ descrTextView.setText(((CustomIndexItem) downloadItem).getSubName(context));
+ } else if (downloadItem.getType() == DownloadActivityType.DEPTH_CONTOUR_FILE && !depthContoursPurchased) {
descrTextView.setText(context.getString(R.string.depth_contour_descr));
- } else if ((indexItem.getType() == DownloadActivityType.SRTM_COUNTRY_FILE
- || indexItem.getType() == DownloadActivityType.HILLSHADE_FILE
- || indexItem.getType() == DownloadActivityType.SLOPE_FILE) && srtmDisabled) {
+ } else if ((downloadItem.getType() == DownloadActivityType.SRTM_COUNTRY_FILE
+ || downloadItem.getType() == DownloadActivityType.HILLSHADE_FILE
+ || downloadItem.getType() == DownloadActivityType.SLOPE_FILE) && srtmDisabled) {
if (showTypeInName) {
descrTextView.setText("");
} else {
- descrTextView.setText(indexItem.getType().getString(context));
+ descrTextView.setText(downloadItem.getType().getString(context));
}
- } else if (showTypeInDesc) {
- descrTextView.setText(indexItem.getType().getString(context) +
- " • " + indexItem.getSizeDescription(context) +
- " • " + (showRemoteDate ? indexItem.getRemoteDate(dateFormat) : indexItem.getLocalDate(dateFormat)));
+ } else if (downloadItem instanceof MultipleIndexItem) {
+ MultipleIndexItem item = (MultipleIndexItem) downloadItem;
+ String allRegionsHeader = context.getString(R.string.shared_strings_all_regions);
+ String regionsHeader = context.getString(R.string.regions);
+ String allRegionsCount = String.valueOf(item.getAllIndexes().size());
+ String leftToDownloadCount = String.valueOf(item.getIndexesToDownload().size());
+ String header;
+ String count;
+ if (item.hasActualDataToDownload()) {
+ if (!item.isDownloaded()) {
+ header = allRegionsHeader;
+ count = leftToDownloadCount;
+ } else {
+ header = regionsHeader;
+ count = String.format(
+ context.getString(R.string.ltr_or_rtl_combine_via_slash),
+ leftToDownloadCount,
+ allRegionsCount);
+ }
+ } else {
+ header = allRegionsHeader;
+ count = allRegionsCount;
+ }
+ String fullDescription =
+ context.getString(R.string.ltr_or_rtl_combine_via_colon, header, count);
+ if (item.hasActualDataToDownload()) {
+ fullDescription = context.getString(
+ R.string.ltr_or_rtl_combine_via_bold_point, fullDescription,
+ item.getSizeDescription(context));
+ }
+ descrTextView.setText(fullDescription);
} else {
- descrTextView.setText(indexItem.getSizeDescription(context) + " • " +
- (showRemoteDate ? indexItem.getRemoteDate(dateFormat) : indexItem.getLocalDate(dateFormat)));
+ IndexItem item = (IndexItem) downloadItem;
+ String pattern = context.getString(R.string.ltr_or_rtl_combine_via_bold_point);
+ String type = item.getType().getString(context);
+ String size = item.getSizeDescription(context);
+ String date = showRemoteDate ? item.getRemoteDate(dateFormat) : item.getLocalDate(dateFormat);
+ String fullDescription = String.format(pattern, size, date);
+ if (showTypeInDesc) {
+ fullDescription = String.format(pattern, type, fullDescription);
+ }
+ descrTextView.setText(fullDescription);
}
} else {
@@ -209,18 +251,19 @@ public class ItemViewHolder {
progressBar.setProgress(progress);
if (showProgressInDesc) {
- double mb = indexItem.getArchiveSizeMB();
+ double mb = downloadItem.getArchiveSizeMB();
String v ;
if (progress != -1) {
v = context.getString(R.string.value_downloaded_of_max, mb * progress / 100, mb);
} else {
v = context.getString(R.string.file_size_in_mb, mb);
}
- if(showTypeInDesc && indexItem.getType() == DownloadActivityType.ROADS_FILE) {
- descrTextView.setText(indexItem.getType().getString(context) + " • " + v);
- } else {
- descrTextView.setText(v);
+ String fullDescription = v;
+ if(showTypeInDesc && downloadItem.getType() == DownloadActivityType.ROADS_FILE) {
+ fullDescription = context.getString(R.string.ltr_or_rtl_combine_via_bold_point,
+ downloadItem.getType().getString(context), fullDescription);
}
+ descrTextView.setText(fullDescription);
descrTextView.setVisibility(View.VISIBLE);
} else {
descrTextView.setVisibility(View.GONE);
@@ -241,44 +284,7 @@ public class ItemViewHolder {
}
}
- protected void download(IndexItem indexItem, DownloadResourceGroup parentOptional) {
- boolean handled = false;
- if(parentOptional != null) {
- WorldRegion region = DownloadResourceGroup.getRegion(parentOptional);
- context.setDownloadItem(region, indexItem.getTargetFile(context.getMyApplication()).getAbsolutePath());
- }
- if (indexItem.getType() == DownloadActivityType.ROADS_FILE && parentOptional != null) {
- for (IndexItem ii : parentOptional.getIndividualResources()) {
- if (ii.getType() == DownloadActivityType.NORMAL_FILE) {
- if (ii.isDownloaded()) {
- handled = true;
- confirmDownload(indexItem);
- }
- break;
- }
- }
- }
- if(!handled) {
- context.startDownload(indexItem);
- }
- }
- private void confirmDownload(final IndexItem indexItem) {
- AlertDialog.Builder builder = new AlertDialog.Builder(context);
- builder.setTitle(R.string.are_you_sure);
- builder.setMessage(R.string.confirm_download_roadmaps);
- builder.setNegativeButton(R.string.shared_string_cancel, null).setPositiveButton(
- R.string.shared_string_download, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (indexItem != null) {
- context.startDownload(indexItem);
- }
- }
- });
- builder.show();
- }
-
- private boolean checkDisabledAndClickAction(final IndexItem item) {
+ private boolean checkDisabledAndClickAction(final DownloadItem item) {
RightButtonAction clickAction = getClickAction(item);
boolean disabled = clickAction != RightButtonAction.DOWNLOAD;
OnClickListener action = getRightButtonAction(item, clickAction);
@@ -290,15 +296,15 @@ public class ItemViewHolder {
} else {
rightButton.setVisibility(View.GONE);
rightImageButton.setVisibility(View.VISIBLE);
- final boolean isDownloading = context.getDownloadThread().isDownloading(item);
+ final boolean isDownloading = item.isDownloading(context.getDownloadThread());
if (isDownloading) {
rightImageButton.setImageDrawable(getContentIcon(context, R.drawable.ic_action_remove_dark));
rightImageButton.setContentDescription(context.getString(R.string.shared_string_cancel));
- } else if(item.isDownloaded() && !item.isOutdated()) {
+ } else if(!item.hasActualDataToDownload()) {
rightImageButton.setImageDrawable(getContentIcon(context, R.drawable.ic_overflow_menu_white));
rightImageButton.setContentDescription(context.getString(R.string.shared_string_more));
} else {
- rightImageButton.setImageDrawable(getContentIcon(context, R.drawable.ic_action_import));
+ rightImageButton.setImageDrawable(getContentIcon(context, getDownloadActionIconId(item)));
rightImageButton.setContentDescription(context.getString(R.string.shared_string_download));
}
rightImageButton.setOnClickListener(action);
@@ -307,31 +313,37 @@ public class ItemViewHolder {
return disabled;
}
+ private int getDownloadActionIconId(@NonNull DownloadItem item) {
+ return item instanceof MultipleIndexItem ?
+ R.drawable.ic_action_multi_download :
+ R.drawable.ic_action_import;
+ }
+
@SuppressLint("DefaultLocale")
- public RightButtonAction getClickAction(final IndexItem indexItem) {
+ public RightButtonAction getClickAction(final DownloadItem item) {
RightButtonAction clickAction = RightButtonAction.DOWNLOAD;
- if (indexItem.getBasename().toLowerCase().equals(DownloadResources.WORLD_SEAMARKS_KEY)
+ if (item.getBasename().toLowerCase().equals(DownloadResources.WORLD_SEAMARKS_KEY)
&& nauticalPluginDisabled) {
clickAction = RightButtonAction.ASK_FOR_SEAMARKS_PLUGIN;
- } else if ((indexItem.getType() == DownloadActivityType.SRTM_COUNTRY_FILE
- || indexItem.getType() == DownloadActivityType.HILLSHADE_FILE
- || indexItem.getType() == DownloadActivityType.SLOPE_FILE) && srtmDisabled) {
+ } else if ((item.getType() == DownloadActivityType.SRTM_COUNTRY_FILE
+ || item.getType() == DownloadActivityType.HILLSHADE_FILE
+ || item.getType() == DownloadActivityType.SLOPE_FILE) && srtmDisabled) {
if (srtmNeedsInstallation) {
clickAction = RightButtonAction.ASK_FOR_SRTM_PLUGIN_PURCHASE;
} else {
clickAction = RightButtonAction.ASK_FOR_SRTM_PLUGIN_ENABLE;
}
- } else if (indexItem.getType() == DownloadActivityType.WIKIPEDIA_FILE
+ } else if (item.getType() == DownloadActivityType.WIKIPEDIA_FILE
&& !Version.isPaidVersion(context.getMyApplication())) {
clickAction = RightButtonAction.ASK_FOR_FULL_VERSION_PURCHASE;
- } else if (indexItem.getType() == DownloadActivityType.DEPTH_CONTOUR_FILE && !depthContoursPurchased) {
+ } else if (item.getType() == DownloadActivityType.DEPTH_CONTOUR_FILE && !depthContoursPurchased) {
clickAction = RightButtonAction.ASK_FOR_DEPTH_CONTOURS_PURCHASE;
}
return clickAction;
}
- public OnClickListener getRightButtonAction(final IndexItem item, final RightButtonAction clickAction) {
+ public OnClickListener getRightButtonAction(final DownloadItem item, final RightButtonAction clickAction) {
if (clickAction != RightButtonAction.DOWNLOAD) {
return new View.OnClickListener() {
@Override
@@ -370,7 +382,7 @@ public class ItemViewHolder {
}
};
} else {
- final boolean isDownloading = context.getDownloadThread().isDownloading(item);
+ final boolean isDownloading = item.isDownloading(context.getDownloadThread());
return new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -380,8 +392,8 @@ public class ItemViewHolder {
} else {
context.makeSureUserCancelDownload(item);
}
- } else if(item.isDownloaded() && !item.isOutdated()){
- contextMenu(v, item, item.getRelatedGroup());
+ } else if(!item.hasActualDataToDownload()){
+ showContextMenu(v, item, item.getRelatedGroup());
} else {
download(item, item.getRelatedGroup());
}
@@ -390,52 +402,21 @@ public class ItemViewHolder {
}
}
- protected void contextMenu(View v, final IndexItem indexItem, final DownloadResourceGroup parentOptional) {
- final PopupMenu optionsMenu = new PopupMenu(context, v);
+ protected void showContextMenu(View v,
+ final DownloadItem downloadItem,
+ final DownloadResourceGroup parentOptional) {
+ OsmandApplication app = context.getMyApplication();
+ PopupMenu optionsMenu = new PopupMenu(context, v);
MenuItem item;
-
- final File fl = indexItem.getTargetFile(context.getMyApplication());
- if (fl.exists()) {
- item = optionsMenu.getMenu().add(R.string.shared_string_remove).setIcon(
- context.getMyApplication().getUIUtilities().getThemedIcon(R.drawable.ic_action_remove_dark));
+
+ final List downloadedFiles = downloadItem.getDownloadedFiles(app);
+ if (!Algorithms.isEmpty(downloadedFiles)) {
+ item = optionsMenu.getMenu().add(R.string.shared_string_remove)
+ .setIcon(getThemedIcon(context, R.drawable.ic_action_remove_dark));
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
- LocalIndexType tp = LocalIndexType.MAP_DATA;
- if (indexItem.getType() == DownloadActivityType.HILLSHADE_FILE) {
- tp = LocalIndexType.TILES_DATA;
- } else if (indexItem.getType() == DownloadActivityType.SLOPE_FILE) {
- tp = LocalIndexType.TILES_DATA;
- } else if (indexItem.getType() == DownloadActivityType.ROADS_FILE) {
- tp = LocalIndexType.MAP_DATA;
- } else if (indexItem.getType() == DownloadActivityType.SRTM_COUNTRY_FILE) {
- tp = LocalIndexType.SRTM_DATA;
- } else if (indexItem.getType() == DownloadActivityType.WIKIPEDIA_FILE) {
- tp = LocalIndexType.MAP_DATA;
- } else if (indexItem.getType() == DownloadActivityType.WIKIVOYAGE_FILE) {
- tp = LocalIndexType.MAP_DATA;
- } else if (indexItem.getType() == DownloadActivityType.TRAVEL_FILE) {
- tp = LocalIndexType.MAP_DATA;
- } else if (indexItem.getType() == DownloadActivityType.FONT_FILE) {
- tp = LocalIndexType.FONT_DATA;
- } else if (indexItem.getType() == DownloadActivityType.VOICE_FILE) {
- tp = indexItem.getBasename().contains("tts") ? LocalIndexType.TTS_VOICE_DATA
- : LocalIndexType.VOICE_DATA;
- }
- final LocalIndexInfo info = new LocalIndexInfo(tp, fl, false, context.getMyApplication());
- AlertDialog.Builder confirm = new AlertDialog.Builder(context);
- confirm.setPositiveButton(R.string.shared_string_yes, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- new LocalIndexOperationTask(context, null, LocalIndexOperationTask.DELETE_OPERATION)
- .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, info);
- }
- });
- confirm.setNegativeButton(R.string.shared_string_no, null);
- String fn = FileNameTranslationHelper.getFileName(context, context.getMyApplication().getRegions(),
- indexItem.getVisibleName(context, context.getMyApplication().getRegions()));
- confirm.setMessage(context.getString(R.string.delete_confirmation_msg, fn));
- confirm.show();
+ confirmRemove(downloadItem, downloadedFiles);
return true;
}
});
@@ -445,14 +426,144 @@ public class ItemViewHolder {
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
- download(indexItem, parentOptional);
+ download(downloadItem, parentOptional);
return true;
}
});
-
+
optionsMenu.show();
}
+ protected void download(DownloadItem item, DownloadResourceGroup parentOptional) {
+ boolean handled = false;
+ if (parentOptional != null && item instanceof IndexItem) {
+ IndexItem indexItem = (IndexItem) item;
+ WorldRegion region = DownloadResourceGroup.getRegion(parentOptional);
+ context.setDownloadItem(region, indexItem.getTargetFile(context.getMyApplication()).getAbsolutePath());
+ }
+ if (item.getType() == DownloadActivityType.ROADS_FILE && parentOptional != null) {
+ for (IndexItem ii : parentOptional.getIndividualResources()) {
+ if (ii.getType() == DownloadActivityType.NORMAL_FILE) {
+ if (ii.isDownloaded()) {
+ handled = true;
+ confirmDownload(item);
+ }
+ break;
+ }
+ }
+ }
+ if(!handled) {
+ startDownload(item);
+ }
+ }
+ private void confirmDownload(final DownloadItem item) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+ builder.setTitle(R.string.are_you_sure);
+ builder.setMessage(R.string.confirm_download_roadmaps);
+ builder.setNegativeButton(R.string.shared_string_cancel, null).setPositiveButton(
+ R.string.shared_string_download, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (item != null) {
+ startDownload(item);
+ }
+ }
+ });
+ builder.show();
+ }
+
+ private void startDownload(DownloadItem item) {
+ if (item instanceof MultipleIndexItem) {
+ MultipleIndexItem multipleIndexItem = (MultipleIndexItem) item;
+ List indexes;
+ if (multipleIndexItem.hasActualDataToDownload()) {
+ // download left regions
+ indexes = multipleIndexItem.getIndexesToDownload();
+ } else {
+ // download all regions again
+ indexes = multipleIndexItem.getAllIndexes();
+ }
+ IndexItem[] indexesArray = new IndexItem[indexes.size()];
+ context.startDownload(indexes.toArray(indexesArray));
+ } else if (item instanceof IndexItem) {
+ IndexItem indexItem = (IndexItem) item;
+ context.startDownload(indexItem);
+ }
+ }
+
+ private void confirmRemove(@NonNull final DownloadItem downloadItem,
+ @NonNull final List downloadedFiles) {
+ OsmandApplication app = context.getMyApplication();
+ AlertDialog.Builder confirm = new AlertDialog.Builder(context);
+
+ String message;
+ if (downloadedFiles.size() > 1) {
+ message = context.getString(R.string.delete_number_files_question, downloadedFiles.size());
+ } else {
+ OsmandRegions regions = app.getRegions();
+ String visibleName = downloadItem.getVisibleName(context, regions);
+ String fileName = FileNameTranslationHelper.getFileName(context, regions, visibleName);
+ message = context.getString(R.string.delete_confirmation_msg, fileName);
+ }
+ confirm.setMessage(message);
+
+ confirm.setPositiveButton(R.string.shared_string_yes, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ LocalIndexType type = getLocalIndexType(downloadItem);
+ remove(type, downloadedFiles);
+ }
+ });
+ confirm.setNegativeButton(R.string.shared_string_no, null);
+
+ confirm.show();
+ }
+
+ private void remove(@NonNull LocalIndexType type,
+ @NonNull List filesToDelete) {
+ OsmandApplication app = context.getMyApplication();
+ LocalIndexOperationTask removeTask = new LocalIndexOperationTask(
+ context,
+ null,
+ LocalIndexOperationTask.DELETE_OPERATION);
+ LocalIndexInfo[] params = new LocalIndexInfo[filesToDelete.size()];
+ for (int i = 0; i < filesToDelete.size(); i++) {
+ File file = filesToDelete.get(i);
+ params[i] = new LocalIndexInfo(type, file, false, app);
+ }
+ removeTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
+ }
+
+ @NonNull
+ private LocalIndexType getLocalIndexType(@NonNull DownloadItem downloadItem) {
+ LocalIndexType type = LocalIndexType.MAP_DATA;
+ if (downloadItem.getType() == DownloadActivityType.HILLSHADE_FILE) {
+ type = LocalIndexType.TILES_DATA;
+ } else if (downloadItem.getType() == DownloadActivityType.SLOPE_FILE) {
+ type = LocalIndexType.TILES_DATA;
+ } else if (downloadItem.getType() == DownloadActivityType.ROADS_FILE) {
+ type = LocalIndexType.MAP_DATA;
+ } else if (downloadItem.getType() == DownloadActivityType.SRTM_COUNTRY_FILE) {
+ type = LocalIndexType.SRTM_DATA;
+ } else if (downloadItem.getType() == DownloadActivityType.WIKIPEDIA_FILE) {
+ type = LocalIndexType.MAP_DATA;
+ } else if (downloadItem.getType() == DownloadActivityType.WIKIVOYAGE_FILE) {
+ type = LocalIndexType.MAP_DATA;
+ } else if (downloadItem.getType() == DownloadActivityType.TRAVEL_FILE) {
+ type = LocalIndexType.MAP_DATA;
+ } else if (downloadItem.getType() == DownloadActivityType.FONT_FILE) {
+ type = LocalIndexType.FONT_DATA;
+ } else if (downloadItem.getType() == DownloadActivityType.VOICE_FILE) {
+ type = downloadItem.getBasename().contains("tts") ? LocalIndexType.TTS_VOICE_DATA
+ : LocalIndexType.VOICE_DATA;
+ }
+ return type;
+ }
+
+ private Drawable getThemedIcon(DownloadActivity context, int resourceId) {
+ return context.getMyApplication().getUIUtilities().getThemedIcon(resourceId);
+ }
+
private Drawable getContentIcon(DownloadActivity context, int resourceId) {
return context.getMyApplication().getUIUtilities().getThemedIcon(resourceId);
}
diff --git a/OsmAnd/src/net/osmand/plus/download/ui/UpdatesIndexFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/UpdatesIndexFragment.java
index f7362edc76..faf39a56f7 100644
--- a/OsmAnd/src/net/osmand/plus/download/ui/UpdatesIndexFragment.java
+++ b/OsmAnd/src/net/osmand/plus/download/ui/UpdatesIndexFragment.java
@@ -153,7 +153,8 @@ public class UpdatesIndexFragment extends OsmAndListFragment implements Download
for (IndexItem indexItem : indexItems) {
downloadsSize += indexItem.getSize();
}
- String updateAllText = getActivity().getString(R.string.update_all, downloadsSize >> 20);
+ String updateAllText = getActivity().getString(
+ R.string.update_all, String.valueOf(downloadsSize >> 20));
updateAllButton.setText(updateAllText);
updateAllButton.setOnClickListener(new View.OnClickListener() {
@Override
From 63351ebf66b086c840e278c6cc24b3a544ed6b2b Mon Sep 17 00:00:00 2001
From: Skalii
Date: Sat, 13 Feb 2021 05:57:28 +0200
Subject: [PATCH 31/70] fix vertical arrow alignment; fix blocks within width
60dp-120dp
---
OsmAnd/res/layout/favorites_list_item.xml | 1 +
OsmAnd/res/layout/gpx_overview_fragment.xml | 10 ++++++----
OsmAnd/res/layout/item_gpx_stat_block.xml | 9 +++++----
.../plus/track/GpxBlockStatisticsBuilder.java | 15 +++++++++++----
4 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/OsmAnd/res/layout/favorites_list_item.xml b/OsmAnd/res/layout/favorites_list_item.xml
index d53497c0f5..b444aae2ac 100644
--- a/OsmAnd/res/layout/favorites_list_item.xml
+++ b/OsmAnd/res/layout/favorites_list_item.xml
@@ -93,6 +93,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
+ android:layout_marginTop="1sp"
android:contentDescription="@string/show_view_angle"
osmand:srcCompat="@drawable/ic_direction_arrow" />
diff --git a/OsmAnd/res/layout/gpx_overview_fragment.xml b/OsmAnd/res/layout/gpx_overview_fragment.xml
index 3b205ae60e..e613260e86 100644
--- a/OsmAnd/res/layout/gpx_overview_fragment.xml
+++ b/OsmAnd/res/layout/gpx_overview_fragment.xml
@@ -38,21 +38,23 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
- android:gravity="center"
- android:orientation="horizontal"
- android:paddingTop="@dimen/dash_margin"
- android:paddingBottom="@dimen/dash_margin">
+ android:layout_marginTop="@dimen/dash_margin"
+ android:layout_marginBottom="@dimen/dash_margin"
+ android:orientation="horizontal">
@@ -61,8 +60,10 @@
android:layout_height="wrap_content"
android:background="@null"
android:ellipsize="end"
+ android:gravity="start|center_vertical"
android:lines="1"
android:maxWidth="@dimen/grid_menu_item_width"
+ android:minWidth="@dimen/map_route_buttons_width"
android:textColor="?android:attr/textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
tools:text="@string/distance" />
diff --git a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java
index 0c1b77a1fa..75bd8f58bb 100644
--- a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java
+++ b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java
@@ -32,6 +32,7 @@ import net.osmand.plus.widgets.TextViewEx;
import net.osmand.util.Algorithms;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
public class GpxBlockStatisticsBuilder {
@@ -232,12 +233,10 @@ public class GpxBlockStatisticsBuilder {
public void onBindViewHolder(BlockStatisticsViewHolder holder, int position) {
final StatBlock item = items.get(position);
holder.valueText.setText(item.value);
- holder.titleText.setText(item.title);
- if (updateRunning) {
- holder.titleText.setWidth(app.getResources().getDimensionPixelSize(R.dimen.map_route_buttons_width));
- }
holder.valueText.setTextColor(activeColor);
+ holder.titleText.setText(item.title);
holder.titleText.setTextColor(app.getResources().getColor(R.color.text_color_secondary_light));
+ holder.titleText.setWidth(calculateWidthWithin(item.title, item.value));
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -271,6 +270,14 @@ public class GpxBlockStatisticsBuilder {
}
}
+ public int calculateWidthWithin(String... texts) {
+ int textSize = app.getResources().getDimensionPixelSize(R.dimen.default_desc_text_size);
+ int textWidth = AndroidUtils.getTextMaxWidth(textSize, Arrays.asList(texts));
+ int minWidth = AndroidUtils.dpToPx(app, 60);
+ int maxWidth = AndroidUtils.dpToPx(app, 120);
+ return Math.min(maxWidth, Math.max(minWidth, textWidth));
+ }
+
private class BlockStatisticsViewHolder extends RecyclerView.ViewHolder {
private final TextViewEx valueText;
From b04115aad20c3ce37fc6632b68793c8639207140 Mon Sep 17 00:00:00 2001
From: Vitaliy
Date: Sun, 14 Feb 2021 16:51:24 +0200
Subject: [PATCH 32/70] Add ability to choose gpx segment for routing
---
.../layout/bottom_sheet_select_segment.xml | 2 -
.../plus/activities/MapActivityActions.java | 6 +-
.../osmand/plus/base/FailSafeFuntions.java | 3 +
.../helpers/TrackSelectSegmentAdapter.java | 33 +++----
.../FollowTrackFragment.java | 42 ++++++---
.../osmand/plus/routing/RouteProvider.java | 73 +++++++++++-----
.../plus/settings/backend/OsmandSettings.java | 5 +-
.../track/TrackSelectSegmentBottomSheet.java | 87 ++++++++-----------
8 files changed, 138 insertions(+), 113 deletions(-)
diff --git a/OsmAnd/res/layout/bottom_sheet_select_segment.xml b/OsmAnd/res/layout/bottom_sheet_select_segment.xml
index ddfa37f927..ee4dfec006 100644
--- a/OsmAnd/res/layout/bottom_sheet_select_segment.xml
+++ b/OsmAnd/res/layout/bottom_sheet_select_segment.xml
@@ -45,7 +45,6 @@
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular" />
-
-
ps = params.getPoints(settings.getContext());
mapActivity.getRoutingHelper().setGpxParams(params);
settings.FOLLOW_THE_GPX_ROUTE.set(result.path);
diff --git a/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java b/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java
index d898505b76..46708ce5ae 100644
--- a/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java
+++ b/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java
@@ -134,6 +134,9 @@ public class FailSafeFuntions {
if(settings.GPX_ROUTE_CALC.get()) {
gpxRoute.setCalculateOsmAndRoute(true);
}
+ if (settings.GPX_ROUTE_SEGMENT.get() != -1) {
+ gpxRoute.setSelectedSegment(settings.GPX_ROUTE_SEGMENT.get());
+ }
} else {
gpxRoute = null;
}
diff --git a/OsmAnd/src/net/osmand/plus/helpers/TrackSelectSegmentAdapter.java b/OsmAnd/src/net/osmand/plus/helpers/TrackSelectSegmentAdapter.java
index 96ceefed24..4f621b9161 100644
--- a/OsmAnd/src/net/osmand/plus/helpers/TrackSelectSegmentAdapter.java
+++ b/OsmAnd/src/net/osmand/plus/helpers/TrackSelectSegmentAdapter.java
@@ -16,16 +16,18 @@ import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
+import net.osmand.plus.helpers.TrackSelectSegmentAdapter.TrackViewHolder;
import net.osmand.util.MapUtils;
import java.util.List;
-public class TrackSelectSegmentAdapter extends RecyclerView.Adapter {
+public class TrackSelectSegmentAdapter extends RecyclerView.Adapter {
+
private final OsmandApplication app;
private final LayoutInflater themedInflater;
private final UiUtilities iconsCache;
private final List segments;
- private GpxTrackAdapter.OnItemClickListener onItemClickListener;
+ private OnItemClickListener onItemClickListener;
public TrackSelectSegmentAdapter(Context ctx, List segments) {
app = (OsmandApplication) ctx.getApplicationContext();
@@ -36,17 +38,17 @@ public class TrackSelectSegmentAdapter extends RecyclerView.Adapter 1;
String fileName = null;
File file = null;
if (!Algorithms.isEmpty(gpxFile.path)) {
file = new File(gpxFile.path);
- if (isTrackContainsMultiSegment) {
- fileName = Algorithms.getFileNameWithoutExtension(file.getName());
- } else {
- fileName = Algorithms.getFileNameWithoutExtension(file.getName());
- }
+ fileName = Algorithms.getFileNameWithoutExtension(file.getName());
} else if (!Algorithms.isEmpty(gpxFile.tracks)) {
fileName = gpxFile.tracks.get(0).name;
}
if (Algorithms.isEmpty(fileName)) {
fileName = app.getString(R.string.shared_string_gpx_track);
}
+ GPXRouteParamsBuilder routeParams = app.getRoutingHelper().getCurrentGPXRoute();
+ if (gpxFile.getNonEmptySegmentsCount() > 1 && routeParams != null && routeParams.getSelectedSegment() != -1) {
+ fileName = fileName + " segment " + (routeParams.getSelectedSegment() + 1);
+ }
sortButton.setVisibility(View.GONE);
GPXInfo gpxInfo = new GPXInfo(fileName, file != null ? file.lastModified() : 0, file != null ? file.length() : 0);
TrackEditCard importTrackCard = new TrackEditCard(mapActivity, gpxInfo);
@@ -497,10 +498,10 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
if (selectedGpxFile != null) {
GPXFile gpxFile = selectedGpxFile.getGpxFile();
if (gpxFile.getNonEmptySegmentsCount() > 1) {
- TrackSelectSegmentBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), gpxFile);
+ TrackSelectSegmentBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), gpxFile, this);
} else {
- updateSelectionMode(false);
selectTrackToFollow(gpxFile);
+ updateSelectionMode(false);
}
} else {
CallbackWithObject callback = new CallbackWithObject() {
@@ -509,10 +510,10 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
if (result[0].getNonEmptySegmentsCount() > 1) {
- TrackSelectSegmentBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), result[0]);
+ TrackSelectSegmentBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), result[0], FollowTrackFragment.this);
} else {
- updateSelectionMode(false);
selectTrackToFollow(result[0]);
+ updateSelectionMode(false);
}
}
return true;
@@ -536,7 +537,7 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
app.initVoiceCommandPlayer(mapActivity, mode, true, null, false, false, true);
}
}
- mapActivity.getMapActions().setGPXRouteParams(gpxFile, 1);
+ mapActivity.getMapActions().setGPXRouteParams(gpxFile);
app.getTargetPointsHelper().updateRouteAndRefresh(true);
app.getRoutingHelper().onSettingsChanged(true);
}
@@ -719,7 +720,6 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
}
}
-
@Override
public void routeWasCancelled() {
@@ -734,4 +734,18 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
protected String getThemeInfoProviderTag() {
return TAG;
}
+
+ @Override
+ public void onSegmentSelect(GPXFile gpxFile, int selectedSegment) {
+ selectTrackToFollow(gpxFile);
+ if (selectedSegment != -1) {
+ GPXRouteParamsBuilder paramsBuilder = app.getRoutingHelper().getCurrentGPXRoute();
+ if (paramsBuilder != null) {
+ paramsBuilder.setSelectedSegment(selectedSegment);
+ app.getSettings().GPX_ROUTE_SEGMENT.set(selectedSegment);
+ app.getRoutingHelper().onSettingsChanged(true);
+ }
+ }
+ updateSelectionMode(false);
+ }
}
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java
index b3b2a11ab6..051a5218fa 100644
--- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java
+++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java
@@ -8,7 +8,6 @@ import android.util.Base64;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.Route;
-import net.osmand.GPXUtilities.Track;
import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.Location;
@@ -20,15 +19,15 @@ import net.osmand.data.LatLon;
import net.osmand.data.LocationPoint;
import net.osmand.data.WptLocationPoint;
import net.osmand.plus.OsmandApplication;
-import net.osmand.plus.onlinerouting.OnlineRoutingHelper;
-import net.osmand.plus.onlinerouting.engine.OnlineRoutingEngine.OnlineRoutingResponse;
-import net.osmand.plus.settings.backend.OsmandSettings;
-import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.R;
import net.osmand.plus.TargetPointsHelper;
import net.osmand.plus.TargetPointsHelper.TargetPoint;
+import net.osmand.plus.onlinerouting.OnlineRoutingHelper;
+import net.osmand.plus.onlinerouting.engine.OnlineRoutingEngine.OnlineRoutingResponse;
import net.osmand.plus.render.NativeOsmandLibrary;
import net.osmand.plus.settings.backend.ApplicationMode;
+import net.osmand.plus.settings.backend.CommonPreference;
+import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.router.GeneralRouter;
import net.osmand.router.GeneralRouter.RoutingParameter;
import net.osmand.router.GeneralRouter.RoutingParameterType;
@@ -161,6 +160,7 @@ public class RouteProvider {
private boolean leftSide;
private boolean passWholeRoute;
private boolean calculateOsmAndRouteParts;
+ private int selectedSegment = -1;
public GPXRouteParamsBuilder(GPXFile file, OsmandSettings settings) {
leftSide = settings.DRIVING_REGION.get().leftHandDriving;
@@ -191,6 +191,14 @@ public class RouteProvider {
this.calculateOsmAndRoute = calculateOsmAndRoute;
}
+ public int getSelectedSegment() {
+ return selectedSegment;
+ }
+
+ public void setSelectedSegment(int selectedSegment) {
+ this.selectedSegment = selectedSegment;
+ }
+
public void setPassWholeRoute(boolean passWholeRoute) {
this.passWholeRoute = passWholeRoute;
}
@@ -278,8 +286,9 @@ public class RouteProvider {
wpt.add(new WptLocationPoint(w));
}
}
+ int selectedSegment = builder.getSelectedSegment();
if (OSMAND_ROUTER_V2.equals(file.author)) {
- route = parseOsmAndGPXRoute(points, file);
+ route = parseOsmAndGPXRoute(points, file, selectedSegment);
routePoints = file.getRoutePoints();
if (reverse) {
Collections.reverse(points);
@@ -287,7 +296,7 @@ public class RouteProvider {
}
addMissingTurns = route != null && route.isEmpty();
} else if (file.isCloudmadeRouteFile() || OSMAND_ROUTER.equals(file.author)) {
- directions = parseOsmAndGPXRoute(points, file, OSMAND_ROUTER.equals(file.author), builder.leftSide, 10);
+ directions = parseOsmAndGPXRoute(points, file, OSMAND_ROUTER.equals(file.author), builder.leftSide, 10, selectedSegment);
if (OSMAND_ROUTER.equals(file.author) && file.hasRtePt()) {
// For files generated by OSMAND_ROUTER use directions contained unaltered
addMissingTurns = false;
@@ -301,12 +310,16 @@ public class RouteProvider {
} else {
// first of all check tracks
if (!useIntermediatePointsRTE) {
- for (Track tr : file.tracks) {
- if (!tr.generalTrack) {
- for (TrkSegment tkSeg : tr.segments) {
- for (WptPt pt : tkSeg.points) {
- points.add(createLocation(pt));
- }
+ List segments = file.getNonEmptyTrkSegments(false);
+ if (selectedSegment != -1 && segments.size() > selectedSegment) {
+ TrkSegment segment = segments.get(selectedSegment);
+ for (WptPt p : segment.points) {
+ points.add(createLocation(p));
+ }
+ } else {
+ for (TrkSegment tkSeg : segments) {
+ for (WptPt p : tkSeg.points) {
+ points.add(createLocation(p));
}
}
}
@@ -998,35 +1011,49 @@ public class RouteProvider {
return new RouteCalculationResult("Empty result");
}
- private static List parseOsmAndGPXRoute(List points, GPXFile gpxFile) {
- for (Track tr : gpxFile.tracks) {
- for (TrkSegment ts : tr.segments) {
+ private static List parseOsmAndGPXRoute(List points, GPXFile gpxFile, int selectedSegment) {
+ List segments = gpxFile.getNonEmptyTrkSegments(false);
+ if (selectedSegment != -1 && segments.size() > selectedSegment) {
+ TrkSegment segment = segments.get(selectedSegment);
+ for (WptPt p : segment.points) {
+ points.add(createLocation(p));
+ }
+ RouteImporter routeImporter = new RouteImporter(segment);
+ return routeImporter.importRoute();
+ } else {
+ for (TrkSegment ts : segments) {
for (WptPt p : ts.points) {
points.add(createLocation(p));
}
}
+ RouteImporter routeImporter = new RouteImporter(gpxFile);
+ return routeImporter.importRoute();
}
- RouteImporter routeImporter = new RouteImporter(gpxFile);
- return routeImporter.importRoute();
}
private static List parseOsmAndGPXRoute(List points, GPXFile gpxFile, boolean osmandRouter,
- boolean leftSide, float defSpeed) {
+ boolean leftSide, float defSpeed, int selectedSegment) {
List directions = null;
if (!osmandRouter) {
for (WptPt pt : gpxFile.getPoints()) {
points.add(createLocation(pt));
}
} else {
- for (Track tr : gpxFile.tracks) {
- for (TrkSegment ts : tr.segments) {
+ List segments = gpxFile.getNonEmptyTrkSegments(false);
+ if (selectedSegment != -1 && segments.size() > selectedSegment) {
+ TrkSegment segment = segments.get(selectedSegment);
+ for (WptPt p : segment.points) {
+ points.add(createLocation(p));
+ }
+ } else {
+ for (TrkSegment ts : segments) {
for (WptPt p : ts.points) {
points.add(createLocation(p));
}
}
}
}
- float[] distanceToEnd = new float[points.size()];
+ float[] distanceToEnd = new float[points.size()];
for (int i = points.size() - 2; i >= 0; i--) {
distanceToEnd[i] = distanceToEnd[i + 1] + points.get(i).distanceTo(points.get(i + 1));
}
@@ -1307,7 +1334,7 @@ public class RouteProvider {
GPXFile gpxFile = GPXUtilities.loadGPXFile(gpxStream);
- dir = parseOsmAndGPXRoute(res, gpxFile, true, params.leftSide, params.mode.getDefaultSpeed());
+ dir = parseOsmAndGPXRoute(res, gpxFile, true, params.leftSide, params.mode.getDefaultSpeed(), -1);
if (dir != null) {
addMissingTurns = false;
diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java
index 45cefd2723..9652fc3bad 100644
--- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java
+++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java
@@ -45,10 +45,8 @@ import net.osmand.plus.helpers.enums.DrivingRegion;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.helpers.enums.SpeedConstants;
import net.osmand.plus.helpers.enums.TracksSortByMode;
-import net.osmand.plus.mapillary.MapillaryPlugin;
import net.osmand.plus.mapmarkers.CoordinateInputFormats.Format;
import net.osmand.plus.mapmarkers.MapMarkersMode;
-import net.osmand.plus.openplacereviews.OpenPlaceReviewsPlugin;
import net.osmand.plus.profiles.LocationIcon;
import net.osmand.plus.profiles.NavigationIcon;
import net.osmand.plus.profiles.ProfileIconColors;
@@ -1389,6 +1387,7 @@ public class OsmandSettings {
public final OsmandPreference GPX_ROUTE_CALC_OSMAND_PARTS = new BooleanPreference(this, "gpx_routing_calculate_osmand_route", true).makeGlobal().makeShared().cache();
public final OsmandPreference GPX_CALCULATE_RTEPT = new BooleanPreference(this, "gpx_routing_calculate_rtept", true).makeGlobal().makeShared().cache();
public final OsmandPreference GPX_ROUTE_CALC = new BooleanPreference(this, "calc_gpx_route", false).makeGlobal().makeShared().cache();
+ public final OsmandPreference GPX_ROUTE_SEGMENT = new IntPreference(this, "gpx_route_segment", -1).makeGlobal().makeShared().cache();
public final OsmandPreference SHOW_START_FINISH_ICONS = new BooleanPreference(this, "show_start_finish_icons", true).makeGlobal().makeShared().cache();
public final OsmandPreference AVOID_TOLL_ROADS = new BooleanPreference(this, "avoid_toll_roads", false).makeProfile().cache();
@@ -2594,7 +2593,7 @@ public class OsmandSettings {
public static final String VOICE_PROVIDER_NOT_USE = "VOICE_PROVIDER_NOT_USE";
- public static final String[] TTS_AVAILABLE_VOICES = new String[]{
+ public static final String[] TTS_AVAILABLE_VOICES = new String[] {
"de", "en", "es", "fr", "it", "ja", "nl", "pl", "pt", "ru", "zh"
};
// this value string is synchronized with settings_pref.xml preference name
diff --git a/OsmAnd/src/net/osmand/plus/track/TrackSelectSegmentBottomSheet.java b/OsmAnd/src/net/osmand/plus/track/TrackSelectSegmentBottomSheet.java
index 319605dd98..b49c2eb898 100644
--- a/OsmAnd/src/net/osmand/plus/track/TrackSelectSegmentBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/track/TrackSelectSegmentBottomSheet.java
@@ -9,31 +9,30 @@ import android.text.style.ForegroundColorSpan;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
-import androidx.appcompat.widget.AppCompatImageView;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities;
+import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
-import net.osmand.plus.TargetPointsHelper;
import net.osmand.plus.UiUtilities;
-import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.helpers.FontCache;
-import net.osmand.plus.helpers.GpxTrackAdapter;
import net.osmand.plus.helpers.TrackSelectSegmentAdapter;
-import net.osmand.plus.routing.RoutingHelper;
-import net.osmand.plus.settings.backend.ApplicationMode;
+import net.osmand.plus.helpers.TrackSelectSegmentAdapter.OnItemClickListener;
import net.osmand.plus.widgets.style.CustomTypefaceSpan;
import net.osmand.util.Algorithms;
@@ -42,33 +41,18 @@ import java.util.List;
public class TrackSelectSegmentBottomSheet extends MenuBottomSheetDialogFragment {
public static final String TAG = TrackSelectSegmentBottomSheet.class.getSimpleName();
- protected TrackSelectSegmentAdapter adapterSegments;
- private MapActivity mapActivity;
- private GPXUtilities.GPXFile gpxFile;
- private OsmandApplication app;
- public static void showInstance(@NonNull FragmentManager fragmentManager, @NonNull GPXUtilities.GPXFile gpxFile) {
- if (!fragmentManager.isStateSaved()) {
- TrackSelectSegmentBottomSheet fragment = new TrackSelectSegmentBottomSheet();
- fragment.setRetainInstance(true);
- fragment.gpxFile = gpxFile;
- fragment.show(fragmentManager, TAG);
- }
- }
+ private OsmandApplication app;
+ private GPXFile gpxFile;
@Override
public void createMenuItems(Bundle savedInstanceState) {
+ app = requiredMyApplication();
Context context = requireContext();
LayoutInflater inflater = UiUtilities.getInflater(context, nightMode);
View itemView = inflater.inflate(R.layout.bottom_sheet_select_segment, null, false);
- app = getMyApplication();
- if (app == null) {
- return;
- }
-
- mapActivity = (MapActivity) getActivity();
String titleGpxTrack = Algorithms.getFileWithoutDirs(gpxFile.path);
Typeface typeface = FontCache.getRobotoMedium(app);
String selectSegmentDescription = getString(R.string.select_segments_description, titleGpxTrack);
@@ -86,9 +70,9 @@ public class TrackSelectSegmentBottomSheet extends MenuBottomSheetDialogFragment
LinearLayout gpxTrackContainer = itemView.findViewById(R.id.gpx_track_container);
GPXUtilities.GPXTrackAnalysis analysis = gpxFile.getAnalysis(0);
- AppCompatImageView icon = gpxTrackContainer.findViewById(R.id.icon);
- int sidePadding = AndroidUtils.dpToPx(mapActivity, 16f);
- int bottomTopPadding = AndroidUtils.dpToPx(mapActivity, 2f);
+ ImageView icon = gpxTrackContainer.findViewById(R.id.icon);
+ int sidePadding = AndroidUtils.dpToPx(context, 16f);
+ int bottomTopPadding = AndroidUtils.dpToPx(context, 2f);
LinearLayout readContainer = gpxTrackContainer.findViewById(R.id.read_section);
readContainer.setPadding(0, bottomTopPadding, 0, bottomTopPadding);
@@ -111,15 +95,19 @@ public class TrackSelectSegmentBottomSheet extends MenuBottomSheetDialogFragment
time.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
time.setText(analysis.isTimeSpecified() ? Algorithms.formatDuration((int) (analysis.timeSpan / 1000), app.accessibilityEnabled()) : "");
- final RecyclerView recyclerView = itemView.findViewById(R.id.gpx_segment_list);
+ RecyclerView recyclerView = itemView.findViewById(R.id.gpx_segment_list);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setNestedScrollingEnabled(false);
- final List segments = gpxFile.getNonEmptyTrkSegments(true);
- adapterSegments = new TrackSelectSegmentAdapter(requireContext(), segments);
- adapterSegments.setAdapterListener(new GpxTrackAdapter.OnItemClickListener() {
+
+ List segments = gpxFile.getNonEmptyTrkSegments(false);
+ TrackSelectSegmentAdapter adapterSegments = new TrackSelectSegmentAdapter(context, segments);
+ adapterSegments.setAdapterListener(new OnItemClickListener() {
@Override
public void onItemClick(int position) {
- //select segment
+ Fragment fragment = getTargetFragment();
+ if (fragment instanceof OnSegmentSelectedListener) {
+ ((OnSegmentSelectedListener) fragment).onSegmentSelect(gpxFile, position);
+ }
dismiss();
}
});
@@ -128,30 +116,27 @@ public class TrackSelectSegmentBottomSheet extends MenuBottomSheetDialogFragment
gpxTrackContainer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- selectSegmentToFollow(gpxFile);
+ Fragment fragment = getTargetFragment();
+ if (fragment instanceof OnSegmentSelectedListener) {
+ ((OnSegmentSelectedListener) fragment).onSegmentSelect(gpxFile, -1);
+ }
dismiss();
}
});
}
- private void selectSegmentToFollow(GPXUtilities.GPXFile gpxFile) {
- if (mapActivity != null) {
- this.gpxFile = gpxFile;
- TargetPointsHelper targetPointsHelper = app.getTargetPointsHelper();
- RoutingHelper routingHelper = app.getRoutingHelper();
- List points = gpxFile.getRoutePoints();
- if (!points.isEmpty()) {
- ApplicationMode mode = ApplicationMode.valueOfStringKey(points.get(0).getProfileType(), null);
- if (mode != null) {
- routingHelper.setAppMode(mode);
- app.initVoiceCommandPlayer(mapActivity, mode, true, null, false, false, true);
- }
- }
- mapActivity.getMapActions().setGPXRouteParams(gpxFile);
- targetPointsHelper.updateRouteAndRefresh(true);
- routingHelper.onSettingsChanged(true);
+ public interface OnSegmentSelectedListener {
+ void onSegmentSelect(GPXFile gpxFile, int selectedSegment);
+ }
+
+ public static void showInstance(@NonNull FragmentManager fragmentManager, @NonNull GPXFile gpxFile, @Nullable Fragment target) {
+ if (!fragmentManager.isStateSaved()) {
+ TrackSelectSegmentBottomSheet fragment = new TrackSelectSegmentBottomSheet();
+ fragment.setRetainInstance(true);
+ fragment.setTargetFragment(target, 0);
+ fragment.gpxFile = gpxFile;
+ fragment.show(fragmentManager, TAG);
}
}
-}
-
+}
\ No newline at end of file
From 9b7446f57a4761b18371a911235ee6026c5997b0 Mon Sep 17 00:00:00 2001
From: cepprice
Date: Mon, 15 Feb 2021 15:01:55 +0500
Subject: [PATCH 33/70] Add support of URLs in plain text inside favourites and
waypoints context menu
---
OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java | 6 +++++-
.../plus/mapcontextmenu/builders/AmenityMenuBuilder.java | 2 +-
.../plus/mapcontextmenu/builders/WptPtMenuBuilder.java | 4 ++--
OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java | 2 +-
4 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java
index 51e7370da6..77193c7c16 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java
@@ -808,7 +808,11 @@ public class MenuBuilder {
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
- POIMapLayer.showHtmlDescriptionDialog(view.getContext(), app, description, descriptionLabel);
+ if (description.contains("")) {
+ POIMapLayer.showHtmlDescriptionDialog(view.getContext(), app, description, descriptionLabel);
+ } else {
+ POIMapLayer.showPlainDescriptionDialog(view.getContext(), app, description, descriptionLabel);
+ }
}
};
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java
index 846c2cdd0e..45d0e348f2 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java
@@ -302,7 +302,7 @@ public class AmenityMenuBuilder extends MenuBuilder {
ll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- POIMapLayer.showDescriptionDialog(view.getContext(), app, text, textPrefix);
+ POIMapLayer.showPlainDescriptionDialog(view.getContext(), app, text, textPrefix);
}
});
}
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/WptPtMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/WptPtMenuBuilder.java
index 278e0cd432..532ef2a676 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/WptPtMenuBuilder.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/WptPtMenuBuilder.java
@@ -61,7 +61,7 @@ public class WptPtMenuBuilder extends MenuBuilder {
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
- POIMapLayer.showDescriptionDialog(view.getContext(), app, wpt.desc, textPrefix);
+ POIMapLayer.showPlainDescriptionDialog(view.getContext(), app, wpt.desc, textPrefix);
}
};
@@ -103,7 +103,7 @@ public class WptPtMenuBuilder extends MenuBuilder {
rowc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- POIMapLayer.showDescriptionDialog(rowc.getContext(), app, wpt.comment,
+ POIMapLayer.showPlainDescriptionDialog(rowc.getContext(), app, wpt.comment,
rowc.getResources().getString(R.string.poi_dialog_comment));
}
});
diff --git a/OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java
index 758588228f..85b538b6c6 100644
--- a/OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java
@@ -274,7 +274,7 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon
return true;
}
- public static void showDescriptionDialog(Context ctx, OsmandApplication app, String text, String title) {
+ public static void showPlainDescriptionDialog(Context ctx, OsmandApplication app, String text, String title) {
final TextView textView = new TextView(ctx);
LinearLayout.LayoutParams llTextParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
int textMargin = dpToPx(app, 10f);
From 992f31f75d339c17591ffd34ec990913c611d06e Mon Sep 17 00:00:00 2001
From: Victor Shcherb
Date: Mon, 15 Feb 2021 12:02:06 +0100
Subject: [PATCH 34/70] Update constant definition (same value)
---
.../src/main/java/net/osmand/binary/BinaryMapIndexReader.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java
index dc16b89f30..34483b01b7 100644
--- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java
+++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapIndexReader.java
@@ -83,7 +83,7 @@ public class BinaryMapIndexReader {
public final static int TRANSPORT_STOP_ZOOM = 24;
public static final int SHIFT_COORDINATES = 5;
- public static final int LABEL_ZOOM_ENCODE = 26;
+ public static final int LABEL_ZOOM_ENCODE = 31 - SHIFT_COORDINATES;
private final static Log log = PlatformUtil.getLog(BinaryMapIndexReader.class);
public static boolean READ_STATS = false;
public static final SearchPoiTypeFilter ACCEPT_ALL_POI_TYPE_FILTER = new SearchPoiTypeFilter() {
From 0eddb3503865d8111bdea535ad75dc6df4d1f779 Mon Sep 17 00:00:00 2001
From: ivanPyrohivskyi
Date: Mon, 15 Feb 2021 13:15:25 +0200
Subject: [PATCH 35/70] Added constants
---
.../binary/BinaryMapPoiReaderAdapter.java | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapPoiReaderAdapter.java b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapPoiReaderAdapter.java
index 9c0f30ebe2..742eae1f61 100644
--- a/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapPoiReaderAdapter.java
+++ b/OsmAnd-java/src/main/java/net/osmand/binary/BinaryMapPoiReaderAdapter.java
@@ -37,7 +37,12 @@ public class BinaryMapPoiReaderAdapter {
private static final int CATEGORY_MASK = (1 << SHIFT_BITS_CATEGORY) - 1;
private static final int ZOOM_TO_SKIP_FILTER_READ = 6;
private static final int ZOOM_TO_SKIP_FILTER = 3;
- private static final int BUCKET_SEARCH_BY_NAME = 15; // should be bigger 100?
+ private static final int BUCKET_SEARCH_BY_NAME = 15; // should be bigger 100?
+ private static final int BASE_POI_SHIFT = SHIFT_BITS_CATEGORY;// 7
+ private static final int FINAL_POI_SHIFT = BinaryMapIndexReader.SHIFT_COORDINATES;// 5
+ private static final int BASE_POI_ZOOM = 31 - BASE_POI_SHIFT;// 24 zoom
+ private static final int FINAL_POI_ZOOM = 31 - FINAL_POI_SHIFT;// 26 zoom
+
public static class PoiSubType {
public boolean text;
@@ -744,9 +749,9 @@ public class BinaryMapPoiReaderAdapter {
}
if (hasLocation) {
if (precisionXY != 0) {
- int[] xy = MapUtils.calculateFinalXYFromBaseAndPrecisionXY(24, 26, precisionXY, x >> 7, y >> 7, true);
- int x31 = xy[0] << 5;
- int y31 = xy[1] << 5;
+ int[] xy = MapUtils.calculateFinalXYFromBaseAndPrecisionXY(BASE_POI_ZOOM, FINAL_POI_ZOOM, precisionXY, x >> BASE_POI_SHIFT, y >> BASE_POI_SHIFT, true);
+ int x31 = xy[0] << FINAL_POI_SHIFT;
+ int y31 = xy[1] << FINAL_POI_SHIFT;
am.setLocation(MapUtils.get31LatitudeY(y31), MapUtils.get31LongitudeX(x31));
} else {
am.setLocation(MapUtils.get31LatitudeY(y), MapUtils.get31LongitudeX(x));
@@ -754,10 +759,10 @@ public class BinaryMapPoiReaderAdapter {
}
return am;
case OsmandOdb.OsmAndPoiBoxDataAtom.DX_FIELD_NUMBER:
- x = (codedIS.readSInt32() + (px << (24 - zoom))) << 7;
+ x = (codedIS.readSInt32() + (px << (BASE_POI_ZOOM - zoom))) << BASE_POI_SHIFT;
break;
case OsmandOdb.OsmAndPoiBoxDataAtom.DY_FIELD_NUMBER:
- y = (codedIS.readSInt32() + (py << (24 - zoom))) << 7;
+ y = (codedIS.readSInt32() + (py << (BASE_POI_ZOOM - zoom))) << BASE_POI_SHIFT;
req.numberOfVisitedObjects++;
if (checkBounds) {
if (left31 > x || right31 < x || top31 > y || bottom31 < y) {
From 454831591bd2bb06fbaee7c4d1e4aa437656950f Mon Sep 17 00:00:00 2001
From: nazar-kutz
Date: Mon, 15 Feb 2021 13:39:43 +0200
Subject: [PATCH 36/70] Fix "Download all button" request after code review
---
.../java/net/osmand/map/OsmandRegions.java | 7 ++---
.../main/java/net/osmand/map/WorldRegion.java | 30 ++++---------------
.../main/java/net/osmand/util/Algorithms.java | 11 +++++++
.../osmand/plus/download/DownloadItem.java | 7 ++---
.../plus/download/DownloadResourceGroup.java | 2 +-
.../plus/download/DownloadResources.java | 12 ++++----
.../net/osmand/plus/download/IndexItem.java | 14 ++++-----
.../plus/download/MultipleIndexItem.java | 2 +-
.../plus/download/ui/ItemViewHolder.java | 7 +----
9 files changed, 36 insertions(+), 56 deletions(-)
diff --git a/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java b/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java
index eba0d94b2b..882231d8a6 100644
--- a/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java
+++ b/OsmAnd-java/src/main/java/net/osmand/map/OsmandRegions.java
@@ -10,7 +10,6 @@ import net.osmand.binary.BinaryMapIndexReader.TagValuePair;
import net.osmand.data.LatLon;
import net.osmand.data.QuadRect;
import net.osmand.data.QuadTree;
-import net.osmand.map.WorldRegion.RegionBoundingBox;
import net.osmand.util.Algorithms;
import net.osmand.util.MapAlgorithms;
import net.osmand.util.MapUtils;
@@ -463,9 +462,9 @@ public class OsmandRegions {
return rd;
}
- private RegionBoundingBox findBoundingBox(BinaryMapDataObject object) {
+ private QuadRect findBoundingBox(BinaryMapDataObject object) {
if (object.getPointsLength() == 0) {
- return new RegionBoundingBox(0, 0, 0, 0);
+ return new QuadRect(0, 0, 0, 0);
}
double currentX = object.getPoint31XTile(0);
@@ -497,7 +496,7 @@ public class OsmandRegions {
double revertedMinY = MapUtils.get31LatitudeY((int) maxY);
double revertedMaxY = MapUtils.get31LatitudeY((int) minY);
- return new RegionBoundingBox(minX, maxX, revertedMinY, revertedMaxY);
+ return new QuadRect(minX, revertedMinY, maxX, revertedMaxY);
}
private String getSearchIndex(BinaryMapDataObject object) {
diff --git a/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java b/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java
index e95efb4f5b..99eca34f19 100644
--- a/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java
+++ b/OsmAnd-java/src/main/java/net/osmand/map/WorldRegion.java
@@ -1,6 +1,7 @@
package net.osmand.map;
import net.osmand.data.LatLon;
+import net.osmand.data.QuadRect;
import net.osmand.util.Algorithms;
import java.io.Serializable;
@@ -40,7 +41,7 @@ public class WorldRegion implements Serializable {
protected String regionDownloadName;
protected boolean regionMapDownload;
protected LatLon regionCenter;
- protected RegionBoundingBox boundingBox;
+ protected QuadRect boundingBox;
public static class RegionParams {
protected String regionLeftHandDriving;
@@ -184,31 +185,10 @@ public class WorldRegion implements Serializable {
return res;
}
- public static boolean isFirstRegionInsideTheSecond(WorldRegion first,
- WorldRegion second) {
- RegionBoundingBox bbox1 = first.boundingBox;
- RegionBoundingBox bbox2 = second.boundingBox;
- if ((bbox1.minX > bbox2.minX) && (bbox1.maxX < bbox2.maxX)) {
- if ((bbox1.minY > bbox2.minY) && (bbox1.maxY < bbox2.maxY)) {
- return true;
- }
+ public boolean containsRegion(WorldRegion region) {
+ if (this.boundingBox != null && region.boundingBox != null) {
+ return this.boundingBox.contains(region.boundingBox);
}
return false;
}
-
- public static class RegionBoundingBox {
-
- double minX;
- double maxX;
- double minY;
- double maxY;
-
- public RegionBoundingBox(double minX, double maxX, double minY, double maxY) {
- this.minX = minX;
- this.maxX = maxX;
- this.minY = minY;
- this.maxY = maxY;
- }
-
- }
}
\ No newline at end of file
diff --git a/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java b/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java
index a9d85ce118..83b7c14b44 100644
--- a/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java
+++ b/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java
@@ -127,6 +127,17 @@ public class Algorithms {
return def;
}
+ public static double parseDoubleSilently(String input, double def) {
+ if (input != null && input.length() > 0) {
+ try {
+ return Double.parseDouble(input);
+ } catch (NumberFormatException e) {
+ return def;
+ }
+ }
+ return def;
+ }
+
public static String getFileNameWithoutExtension(File f) {
return getFileNameWithoutExtension(f.getName());
}
diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadItem.java b/OsmAnd/src/net/osmand/plus/download/DownloadItem.java
index f0a566cea6..23e9f410a7 100644
--- a/OsmAnd/src/net/osmand/plus/download/DownloadItem.java
+++ b/OsmAnd/src/net/osmand/plus/download/DownloadItem.java
@@ -35,9 +35,8 @@ public abstract class DownloadItem {
@NonNull
public String getSizeDescription(Context ctx) {
- String pattern = ctx.getString(R.string.ltr_or_rtl_combine_via_space);
String size = String.format(Locale.US, "%.2f", getSizeToDownloadInMb());
- return String.format(pattern, size, "MB");
+ return ctx.getString(R.string.ltr_or_rtl_combine_via_space, size, "MB");
}
public String getVisibleName(Context ctx, OsmandRegions osmandRegions) {
@@ -48,8 +47,8 @@ public abstract class DownloadItem {
return type.getVisibleName(this, ctx, osmandRegions, includingParent);
}
- public String getVisibleDescription(OsmandApplication clctx) {
- return type.getVisibleDescription(this, clctx);
+ public String getVisibleDescription(OsmandApplication ctx) {
+ return type.getVisibleDescription(this, ctx);
}
public String getBasename() {
diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadResourceGroup.java b/OsmAnd/src/net/osmand/plus/download/DownloadResourceGroup.java
index dc4e697cb4..5d34c95ec4 100644
--- a/OsmAnd/src/net/osmand/plus/download/DownloadResourceGroup.java
+++ b/OsmAnd/src/net/osmand/plus/download/DownloadResourceGroup.java
@@ -21,7 +21,7 @@ public class DownloadResourceGroup {
private final DownloadResourceGroupType type;
private final DownloadResourceGroup parentGroup;
- // ASSERT: individualDisplayItems are not empty if and only if groups are empty
+ // ASSERT: individualDownloadItems are not empty if and only if groups are empty
private final List individualDownloadItems;
private final List groups;
protected final String id;
diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java
index a3aa20c79f..86c89f9cc5 100644
--- a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java
+++ b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java
@@ -533,13 +533,13 @@ public class DownloadResources extends DownloadResourceGroup {
// collect duplicates
Set duplicates = new HashSet<>();
for (int i = 0; i < regions.size() - 1; i++) {
- WorldRegion firstRegion = regions.get(i);
+ WorldRegion r1 = regions.get(i);
for (int j = i + 1; j < regions.size(); j++) {
- WorldRegion secondRegion = regions.get(j);
- if (WorldRegion.isFirstRegionInsideTheSecond(firstRegion, secondRegion)) {
- duplicates.add(firstRegion);
- } else if (WorldRegion.isFirstRegionInsideTheSecond(secondRegion, firstRegion)) {
- duplicates.add(secondRegion);
+ WorldRegion r2 = regions.get(j);
+ if (r1.containsRegion(r2)) {
+ duplicates.add(r1);
+ } else if (r2.containsRegion(r1)) {
+ duplicates.add(r2);
}
}
}
diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItem.java b/OsmAnd/src/net/osmand/plus/download/IndexItem.java
index a746d4aa90..637b1f5467 100644
--- a/OsmAnd/src/net/osmand/plus/download/IndexItem.java
+++ b/OsmAnd/src/net/osmand/plus/download/IndexItem.java
@@ -7,13 +7,14 @@ import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.helpers.FileNameTranslationHelper;
+import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
-import java.util.ArrayList;
+import java.util.Collections;
import java.util.Date;
import java.util.List;
@@ -58,11 +59,10 @@ public class IndexItem extends DownloadItem implements Comparable {
@Override
public List getDownloadedFiles(OsmandApplication app) {
File targetFile = getTargetFile(app);
- List result = new ArrayList<>();
if (targetFile.exists()) {
- result.add(targetFile);
+ return Collections.singletonList(targetFile);
}
- return result;
+ return Collections.emptyList();
}
public String getDescription() {
@@ -91,11 +91,7 @@ public class IndexItem extends DownloadItem implements Comparable {
@Override
protected double getSizeToDownloadInMb() {
- try {
- return Double.parseDouble(size);
- } catch (Exception e) {
- return 0;
- }
+ return Algorithms.parseDoubleSilently(size, 0.0);
}
public DownloadEntry createDownloadEntry(OsmandApplication ctx) {
diff --git a/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java b/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java
index e28d606653..9e58db0655 100644
--- a/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java
+++ b/OsmAnd/src/net/osmand/plus/download/MultipleIndexItem.java
@@ -104,7 +104,7 @@ public class MultipleIndexItem extends DownloadItem {
double totalSizeMb = 0.0d;
for (IndexItem item : items) {
if (item.hasActualDataToDownload()) {
- totalSizeMb += Double.parseDouble(item.size);
+ totalSizeMb += item.getSizeToDownloadInMb();
}
}
return totalSizeMb;
diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java
index 7fd4172fce..5c71fa342b 100644
--- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java
+++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java
@@ -48,7 +48,6 @@ import net.osmand.util.Algorithms;
import java.io.File;
import java.text.DateFormat;
-import java.util.ArrayList;
import java.util.List;
public class ItemViewHolder {
@@ -412,7 +411,7 @@ public class ItemViewHolder {
final List downloadedFiles = downloadItem.getDownloadedFiles(app);
if (!Algorithms.isEmpty(downloadedFiles)) {
item = optionsMenu.getMenu().add(R.string.shared_string_remove)
- .setIcon(getThemedIcon(context, R.drawable.ic_action_remove_dark));
+ .setIcon(getContentIcon(context, R.drawable.ic_action_remove_dark));
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
@@ -560,10 +559,6 @@ public class ItemViewHolder {
return type;
}
- private Drawable getThemedIcon(DownloadActivity context, int resourceId) {
- return context.getMyApplication().getUIUtilities().getThemedIcon(resourceId);
- }
-
private Drawable getContentIcon(DownloadActivity context, int resourceId) {
return context.getMyApplication().getUIUtilities().getThemedIcon(resourceId);
}
From d379b6cf4a58a65efc0d6194a10f2ee5b4d4942a Mon Sep 17 00:00:00 2001
From: Skalii
Date: Mon, 15 Feb 2021 16:07:01 +0200
Subject: [PATCH 37/70] fix crash after screen rotation; remove unnecessary
layout for buttons; some other code fixes;
---
.../bottom_sheet_item_button_with_icon.xml | 69 -------
.../ClearRecordedDataBottomSheetFragment.java | 89 ++++-----
.../StopTrackRecordingBottomFragment.java | 131 ++++++-------
.../TripRecordingActiveBottomSheet.java | 177 +++++++++++-------
4 files changed, 204 insertions(+), 262 deletions(-)
delete mode 100644 OsmAnd/res/layout/bottom_sheet_item_button_with_icon.xml
diff --git a/OsmAnd/res/layout/bottom_sheet_item_button_with_icon.xml b/OsmAnd/res/layout/bottom_sheet_item_button_with_icon.xml
deleted file mode 100644
index 2e1c2cd881..0000000000
--- a/OsmAnd/res/layout/bottom_sheet_item_button_with_icon.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/monitoring/ClearRecordedDataBottomSheetFragment.java b/OsmAnd/src/net/osmand/plus/monitoring/ClearRecordedDataBottomSheetFragment.java
index 0bdced7bc5..6a58b750ce 100644
--- a/OsmAnd/src/net/osmand/plus/monitoring/ClearRecordedDataBottomSheetFragment.java
+++ b/OsmAnd/src/net/osmand/plus/monitoring/ClearRecordedDataBottomSheetFragment.java
@@ -1,10 +1,10 @@
package net.osmand.plus.monitoring;
-import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
+import android.widget.FrameLayout;
import android.widget.LinearLayout;
import net.osmand.plus.OsmandApplication;
@@ -13,17 +13,16 @@ import net.osmand.plus.UiUtilities;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
+import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
+import net.osmand.plus.monitoring.TripRecordingActiveBottomSheet.ItemType;
import net.osmand.plus.widgets.TextViewEx;
-import androidx.annotation.DimenRes;
-import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
-import androidx.annotation.StringRes;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
-public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogFragment implements View.OnClickListener {
+public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogFragment {
public static final String TAG = ClearRecordedDataBottomSheetFragment.class.getSimpleName();
@@ -32,6 +31,9 @@ public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogF
@Override
public void createMenuItems(Bundle savedInstanceState) {
app = requiredMyApplication();
+ LayoutInflater inflater = UiUtilities.getInflater(app, nightMode);
+ int verticalBig = getResources().getDimensionPixelSize(R.dimen.dialog_content_margin);
+ int verticalSmall = getResources().getDimensionPixelSize(R.dimen.content_padding_small);
items.add(new BottomSheetItemWithDescription.Builder()
.setDescription(app.getString(R.string.clear_recorded_data_warning))
@@ -41,64 +43,65 @@ public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogF
.setLayoutId(R.layout.bottom_sheet_item_title_with_description)
.create());
- LayoutInflater inflater = UiUtilities.getInflater(getContext(), nightMode);
+ items.add(new DividerSpaceItem(app, verticalBig));
items.add(new BaseBottomSheetItem.Builder()
- .setCustomView(setupBtn(inflater, ButtonType.CLEAR))
- .setOnClickListener(this)
+ .setCustomView(setupBtn(inflater, ItemType.CLEAR_DATA))
+ .setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ app.getSavingTrackHelper().clearRecordedData(true);
+ dismiss();
+ }
+ })
.create());
+ items.add(new DividerSpaceItem(app, verticalBig));
+
items.add(new BaseBottomSheetItem.Builder()
- .setCustomView(setupBtn(inflater, ButtonType.CANCEL))
- .setOnClickListener(this)
+ .setCustomView(setupBtn(inflater, ItemType.CANCEL))
+ .setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dismiss();
+ }
+ })
.create());
+ items.add(new DividerSpaceItem(app, verticalSmall));
}
- private View setupBtn(LayoutInflater inflater, ButtonType type) {
- View button = inflater.inflate(R.layout.bottom_sheet_item_button_with_icon, null);
+ private View setupBtn(LayoutInflater inflater, ItemType type) {
+ View button = inflater.inflate(R.layout.bottom_sheet_button_with_icon, null);
button.setTag(type);
Context context = button.getContext();
+ LinearLayout container = button.findViewById(R.id.button_container);
+ container.setClickable(false);
+ container.setFocusable(false);
- LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
+ FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
int horizontal = context.getResources().getDimensionPixelSize(R.dimen.content_padding);
- int top = context.getResources().getDimensionPixelSize(type.topMarginRes);
- int bottom = context.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
- params.setMargins(horizontal, top, horizontal, bottom);
+ params.setMargins(horizontal, 0, horizontal, 0);
button.setLayoutParams(params);
- UiUtilities.setupDialogButton(nightMode, button, type.effect, type.titleId);
+ UiUtilities.setupDialogButton(nightMode, button, type.getEffect(), type.getTitleId());
TextViewEx title = button.findViewById(R.id.button_text);
int margin = context.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_medium);
UiUtilities.setMargins(title, 0, margin, 0, margin);
int colorRes;
- if (type.effect == UiUtilities.DialogButtonType.SECONDARY_HARMFUL) {
+ if (type.getEffect() == UiUtilities.DialogButtonType.SECONDARY_HARMFUL) {
colorRes = R.color.color_osm_edit_delete;
} else {
colorRes = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light;
}
AppCompatImageView icon = button.findViewById(R.id.icon);
- icon.setImageDrawable(getIcon(type.iconRes, colorRes));
+ icon.setImageDrawable(getIcon(type.getIconId(), colorRes));
return button;
}
- @Override
- public void onClick(View v) {
- Object o = v.getTag();
- if (!(o instanceof ButtonType)) {
- return;
- }
-
- ButtonType tag = (ButtonType) o;
- if (tag == ButtonType.CLEAR) {
- app.getSavingTrackHelper().clearRecordedData(true);
- }
- dismiss();
- }
-
@Override
public void onResume() {
super.onResume();
@@ -117,26 +120,6 @@ public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogF
}
}
- enum ButtonType {
- CLEAR(R.string.clear_recorded_data, R.drawable.ic_action_delete_dark, R.dimen.dialog_content_margin, UiUtilities.DialogButtonType.SECONDARY_HARMFUL),
- CANCEL(R.string.shared_string_cancel, R.drawable.ic_action_close, R.dimen.content_padding_small, UiUtilities.DialogButtonType.SECONDARY);
-
- @StringRes
- private final int titleId;
- @DrawableRes
- private final int iconRes;
- @DimenRes
- private final int topMarginRes;
- private final UiUtilities.DialogButtonType effect;
-
- ButtonType(int titleId, int iconRes, int topMarginRes, UiUtilities.DialogButtonType effect) {
- this.titleId = titleId;
- this.iconRes = iconRes;
- this.topMarginRes = topMarginRes;
- this.effect = effect;
- }
- }
-
@Override
protected boolean hideButtonsContainer() {
return true;
diff --git a/OsmAnd/src/net/osmand/plus/monitoring/StopTrackRecordingBottomFragment.java b/OsmAnd/src/net/osmand/plus/monitoring/StopTrackRecordingBottomFragment.java
index 3d648f432b..cca494b31b 100644
--- a/OsmAnd/src/net/osmand/plus/monitoring/StopTrackRecordingBottomFragment.java
+++ b/OsmAnd/src/net/osmand/plus/monitoring/StopTrackRecordingBottomFragment.java
@@ -4,6 +4,7 @@ import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
+import android.widget.FrameLayout;
import android.widget.LinearLayout;
import net.osmand.plus.OsmandApplication;
@@ -15,18 +16,17 @@ import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
+import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
+import net.osmand.plus.monitoring.TripRecordingActiveBottomSheet.ItemType;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.widgets.TextViewEx;
-import androidx.annotation.DimenRes;
-import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
-import androidx.annotation.StringRes;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
-public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragment implements View.OnClickListener {
+public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragment {
public static final String TAG = StopTrackRecordingBottomFragment.class.getSimpleName();
@@ -34,7 +34,7 @@ public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragm
private MapActivity mapActivity;
private OsmandSettings settings;
private OsmandMonitoringPlugin plugin;
- private ButtonType tag = ButtonType.CANCEL;
+ private ItemType tag = ItemType.CANCEL;
public void setMapActivity(MapActivity mapActivity) {
this.mapActivity = mapActivity;
@@ -45,6 +45,9 @@ public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragm
app = requiredMyApplication();
settings = app.getSettings();
plugin = OsmandPlugin.getPlugin(OsmandMonitoringPlugin.class);
+ LayoutInflater inflater = UiUtilities.getInflater(app, nightMode);
+ int verticalBig = getResources().getDimensionPixelSize(R.dimen.dialog_content_margin);
+ int verticalSmall = getResources().getDimensionPixelSize(R.dimen.content_padding_small);
items.add(new BottomSheetItemWithDescription.Builder()
.setDescription(app.getString(R.string.track_recording_description))
@@ -54,52 +57,86 @@ public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragm
.setLayoutId(R.layout.bottom_sheet_item_title_with_description)
.create());
- LayoutInflater inflater = UiUtilities.getInflater(getContext(), nightMode);
+ items.add(new DividerSpaceItem(app, verticalBig));
items.add(new BaseBottomSheetItem.Builder()
- .setCustomView(setupButton(inflater, ButtonType.STOP_AND_DISCARD))
- .setOnClickListener(this)
+ .setCustomView(setupButton(inflater, ItemType.STOP_AND_DISCARD))
+ .setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ tag = ItemType.STOP_AND_DISCARD;
+ if (plugin != null && settings.SAVE_GLOBAL_TRACK_TO_GPX.get()) {
+ plugin.stopRecording();
+ app.getNotificationHelper().refreshNotifications();
+ }
+ app.getSavingTrackHelper().clearRecordedData(true);
+ dismiss();
+ }
+ })
.create());
- items.add(new BaseBottomSheetItem.Builder()
- .setCustomView(setupButton(inflater, ButtonType.SAVE_AND_STOP))
- .setOnClickListener(this)
- .create());
+ items.add(new DividerSpaceItem(app, verticalBig));
items.add(new BaseBottomSheetItem.Builder()
- .setCustomView(setupButton(inflater, ButtonType.CANCEL))
- .setOnClickListener(this)
+ .setCustomView(setupButton(inflater, ItemType.SAVE_AND_STOP))
+ .setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ tag = ItemType.SAVE_AND_STOP;
+ if (plugin != null && settings.SAVE_GLOBAL_TRACK_TO_GPX.get()) {
+ plugin.saveCurrentTrack(null, mapActivity);
+ app.getNotificationHelper().refreshNotifications();
+ }
+ dismiss();
+ }
+ })
.create());
+
+ items.add(new DividerSpaceItem(app, verticalSmall));
+
+ items.add(new BaseBottomSheetItem.Builder()
+ .setCustomView(setupButton(inflater, ItemType.CANCEL))
+ .setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ tag = ItemType.CANCEL;
+ dismiss();
+ }
+ })
+ .create());
+
+ items.add(new DividerSpaceItem(app, verticalSmall));
}
- private View setupButton(LayoutInflater inflater, ButtonType type) {
- View button = inflater.inflate(R.layout.bottom_sheet_item_button_with_icon, null);
+ private View setupButton(LayoutInflater inflater, ItemType type) {
+ View button = inflater.inflate(R.layout.bottom_sheet_button_with_icon, null);
button.setTag(type);
Context context = button.getContext();
+ LinearLayout container = button.findViewById(R.id.button_container);
+ container.setClickable(false);
+ container.setFocusable(false);
- LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
+ FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
int horizontal = context.getResources().getDimensionPixelSize(R.dimen.content_padding);
- int top = context.getResources().getDimensionPixelSize(type.topMarginRes);
- int bottom = context.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
- params.setMargins(horizontal, top, horizontal, bottom);
+ params.setMargins(horizontal, 0, horizontal, 0);
button.setLayoutParams(params);
- UiUtilities.setupDialogButton(nightMode, button, type.effect, type.titleId);
+ UiUtilities.setupDialogButton(nightMode, button, type.getEffect(), type.getTitleId());
TextViewEx title = button.findViewById(R.id.button_text);
int margin = context.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_medium);
UiUtilities.setMargins(title, 0, margin, 0, margin);
int colorRes;
- if (type.effect == DialogButtonType.SECONDARY_HARMFUL) {
+ if (type.getEffect() == DialogButtonType.SECONDARY_HARMFUL) {
colorRes = R.color.color_osm_edit_delete;
} else {
colorRes = nightMode ? R.color.dlg_btn_secondary_text_dark : R.color.dlg_btn_secondary_text_light;
}
AppCompatImageView icon = button.findViewById(R.id.icon);
- icon.setImageDrawable(getIcon(type.iconRes, colorRes));
+ icon.setImageDrawable(getIcon(type.getIconId(), colorRes));
- if (type == ButtonType.STOP_AND_DISCARD) {
+ if (type == ItemType.STOP_AND_DISCARD) {
int size = context.getResources().getDimensionPixelSize(R.dimen.map_widget_height);
LinearLayout.LayoutParams iconParams = new LinearLayout.LayoutParams(size, size);
icon.setLayoutParams(iconParams);
@@ -108,29 +145,6 @@ public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragm
return button;
}
- @Override
- public void onClick(View v) {
- Object o = v.getTag();
- if (!(o instanceof ButtonType)) {
- return;
- }
-
- tag = (ButtonType) o;
- if (tag == ButtonType.STOP_AND_DISCARD) {
- if (plugin != null && settings.SAVE_GLOBAL_TRACK_TO_GPX.get()) {
- plugin.stopRecording();
- app.getNotificationHelper().refreshNotifications();
- }
- app.getSavingTrackHelper().clearRecordedData(true);
- } else if (tag == ButtonType.SAVE_AND_STOP) {
- if (plugin != null && settings.SAVE_GLOBAL_TRACK_TO_GPX.get()) {
- plugin.saveCurrentTrack(null, mapActivity);
- app.getNotificationHelper().refreshNotifications();
- }
- }
- dismiss();
- }
-
@Override
public void onResume() {
super.onResume();
@@ -143,7 +157,7 @@ public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragm
@Override
public void onPause() {
super.onPause();
- if (tag == ButtonType.CANCEL) {
+ if (tag == ItemType.CANCEL) {
Fragment target = getTargetFragment();
if (target instanceof TripRecordingActiveBottomSheet) {
((TripRecordingActiveBottomSheet) target).show();
@@ -151,27 +165,6 @@ public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragm
}
}
- enum ButtonType {
- STOP_AND_DISCARD(R.string.track_recording_stop_without_saving, R.drawable.ic_action_rec_stop, R.dimen.dialog_content_margin, DialogButtonType.SECONDARY_HARMFUL),
- SAVE_AND_STOP(R.string.track_recording_save_and_stop, R.drawable.ic_action_save_to_file, R.dimen.content_padding_small, DialogButtonType.SECONDARY),
- CANCEL(R.string.shared_string_cancel, R.drawable.ic_action_close, R.dimen.zero, DialogButtonType.SECONDARY);
-
- @StringRes
- private final int titleId;
- @DrawableRes
- private final int iconRes;
- @DimenRes
- private final int topMarginRes;
- private final DialogButtonType effect;
-
- ButtonType(int titleId, int iconRes, int topMarginRes, DialogButtonType type) {
- this.titleId = titleId;
- this.iconRes = iconRes;
- this.topMarginRes = topMarginRes;
- this.effect = type;
- }
- }
-
@Override
protected boolean hideButtonsContainer() {
return true;
diff --git a/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingActiveBottomSheet.java b/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingActiveBottomSheet.java
index a06064bcb4..70b0198633 100644
--- a/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingActiveBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/monitoring/TripRecordingActiveBottomSheet.java
@@ -42,6 +42,7 @@ import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
+import net.osmand.plus.UiUtilities.DialogButtonType;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.SavingTrackHelper;
import net.osmand.plus.activities.SavingTrackHelper.SaveGpxResult;
@@ -67,6 +68,7 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen
public static final String TAG = TripRecordingActiveBottomSheet.class.getSimpleName();
private static final Log log = PlatformUtil.getLog(TripRecordingActiveBottomSheet.class);
+ private static final String UPDATE_CURRENT_GPX_FILE = "update_current_gpx_file";
private OsmandApplication app;
private OsmandSettings settings;
@@ -137,6 +139,11 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen
updateStatus();
RecyclerView statBlocks = itemView.findViewById(R.id.block_statistics);
+ if (savedInstanceState != null) {
+ if (savedInstanceState.containsKey(UPDATE_CURRENT_GPX_FILE) && savedInstanceState.getBoolean(UPDATE_CURRENT_GPX_FILE)) {
+ selectedGpxFile = app.getSavingTrackHelper().getCurrentTrack();
+ }
+ }
blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile);
blockStatisticsBuilder.setBlocksView(statBlocks);
blockStatisticsBuilder.setBlocksClickable(false);
@@ -262,17 +269,29 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen
});
}
+ @Override
+ public void onSaveInstanceState(@NonNull Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(UPDATE_CURRENT_GPX_FILE, true);
+ }
+
private void updateStatus() {
TextView statusTitle = statusContainer.findViewById(R.id.text_status);
AppCompatImageView statusIcon = statusContainer.findViewById(R.id.icon_status);
ItemType status = searchingGPS() ? ItemType.SEARCHING_GPS : !wasTrackMonitored() ? ItemType.ON_PAUSE : ItemType.RECORDING;
- statusTitle.setText(status.getTitleId());
+ Integer titleId = status.getTitleId();
+ if (titleId != null) {
+ statusTitle.setText(titleId);
+ }
int colorText = status.equals(ItemType.SEARCHING_GPS) ? getSecondaryTextColorId(nightMode) : getOsmandIconColorId(nightMode);
statusTitle.setTextColor(ContextCompat.getColor(app, colorText));
- int colorDrawable = ContextCompat.getColor(app,
- status.equals(ItemType.SEARCHING_GPS) ? getSecondaryIconColorId(nightMode) : getOsmandIconColorId(nightMode));
- Drawable statusDrawable = UiUtilities.tintDrawable(AppCompatResources.getDrawable(app, status.getIconId()), colorDrawable);
- statusIcon.setImageDrawable(statusDrawable);
+ Integer iconId = status.getIconId();
+ if (iconId != null) {
+ int colorDrawable = ContextCompat.getColor(app,
+ status.equals(ItemType.SEARCHING_GPS) ? getSecondaryIconColorId(nightMode) : getOsmandIconColorId(nightMode));
+ Drawable statusDrawable = UiUtilities.tintDrawable(AppCompatResources.getDrawable(app, iconId), colorDrawable);
+ statusIcon.setImageDrawable(statusDrawable);
+ }
}
private void createItem(View view, ItemType type, boolean enabled, @Nullable String description) {
@@ -281,13 +300,14 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen
AppCompatImageView icon = view.findViewById(R.id.icon);
if (icon != null) {
- type.setTintedIcon(icon, app, enabled, false, nightMode);
+ setTintedIcon(icon, app, enabled, false, nightMode, type);
}
TextView title = view.findViewById(R.id.button_text);
- if (title != null) {
- title.setText(type.getTitleId());
- type.setTextColor(title, app, enabled, false, nightMode);
+ Integer titleId = type.getTitleId();
+ if (title != null && titleId != null) {
+ title.setText(titleId);
+ setTextColor(title, app, enabled, false, nightMode, type);
}
TextViewEx desc = view.findViewById(R.id.desc);
@@ -295,13 +315,15 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen
boolean isShowDesc = !Algorithms.isBlank(description);
int marginDesc = isShowDesc ? 0 : app.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_medium);
AndroidUiHelper.updateVisibility(desc, isShowDesc);
- UiUtilities.setMargins(title, 0, marginDesc, 0, marginDesc);
+ if (title != null) {
+ UiUtilities.setMargins(title, 0, marginDesc, 0, marginDesc);
+ }
desc.setText(description);
- type.setTextColor(desc, app, false, false, nightMode);
+ setTextColor(desc, app, false, false, nightMode, type);
}
setItemBackgroundInactive(button != null ? button : (LinearLayout) view, app, nightMode);
- type.changeOnTouch(button != null ? button : (LinearLayout) view, icon, title, app, enabled, nightMode);
+ changeOnTouch(button != null ? button : (LinearLayout) view, icon, title, app, enabled, nightMode, type);
}
private String getTimeTrackSaved() {
@@ -457,89 +479,102 @@ public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragmen
view.setBackgroundDrawable(background);
}
- enum ItemType {
- SHOW_TRACK(R.string.shared_string_show_on_map, null),
- APPEARANCE(null, null),
- SEARCHING_GPS(R.string.searching_gps, R.drawable.ic_action_gps_info),
- RECORDING(R.string.recording_default_name, R.drawable.ic_action_track_recordable),
- ON_PAUSE(R.string.on_pause, R.drawable.ic_pause),
- CLEAR_DATA(R.string.clear_recorded_data, R.drawable.ic_action_delete_dark),
- START_SEGMENT(R.string.gpx_start_new_segment, R.drawable.ic_action_new_segment),
- SAVE(R.string.shared_string_save, R.drawable.ic_action_save_to_file),
- PAUSE(R.string.shared_string_pause, R.drawable.ic_pause),
- RESUME(R.string.shared_string_resume, R.drawable.ic_play_dark),
- STOP(R.string.shared_string_control_stop, R.drawable.ic_action_rec_stop);
+ public enum ItemType {
+ SHOW_TRACK(R.string.shared_string_show_on_map, null, null),
+ APPEARANCE(null, null, null),
+ SEARCHING_GPS(R.string.searching_gps, R.drawable.ic_action_gps_info, null),
+ RECORDING(R.string.recording_default_name, R.drawable.ic_action_track_recordable, null),
+ ON_PAUSE(R.string.on_pause, R.drawable.ic_pause, null),
+ CLEAR_DATA(R.string.clear_recorded_data, R.drawable.ic_action_delete_dark, UiUtilities.DialogButtonType.SECONDARY_HARMFUL),
+ START_SEGMENT(R.string.gpx_start_new_segment, R.drawable.ic_action_new_segment, null),
+ SAVE(R.string.shared_string_save, R.drawable.ic_action_save_to_file, null),
+ PAUSE(R.string.shared_string_pause, R.drawable.ic_pause, null),
+ RESUME(R.string.shared_string_resume, R.drawable.ic_play_dark, null),
+ STOP(R.string.shared_string_control_stop, R.drawable.ic_action_rec_stop, null),
+ STOP_AND_DISCARD(R.string.track_recording_stop_without_saving, R.drawable.ic_action_rec_stop, DialogButtonType.SECONDARY_HARMFUL),
+ SAVE_AND_STOP(R.string.track_recording_save_and_stop, R.drawable.ic_action_save_to_file, DialogButtonType.SECONDARY),
+ CANCEL(R.string.shared_string_cancel, R.drawable.ic_action_close, DialogButtonType.SECONDARY);
@StringRes
private final Integer titleId;
@DrawableRes
private final Integer iconId;
+ private final DialogButtonType effect;
- ItemType(@Nullable @StringRes Integer titleId, @Nullable @DrawableRes Integer iconId) {
+ ItemType(@Nullable @StringRes Integer titleId, @Nullable @DrawableRes Integer iconId, @Nullable DialogButtonType effect) {
this.titleId = titleId;
this.iconId = iconId;
+ this.effect = effect;
}
+ @Nullable
public Integer getTitleId() {
return titleId;
}
+ @Nullable
public Integer getIconId() {
return iconId;
}
- public void setTextColor(TextView tv, Context context, boolean enabled, boolean pressed, boolean nightMode) {
- if (tv != null) {
- tv.setTextColor(ContextCompat.getColor(context,
- enabled ? pressed ? getPressedColorId(nightMode)
- : this == ItemType.CLEAR_DATA ? R.color.color_osm_edit_delete
- : getActiveTextColorId(nightMode) : getSecondaryTextColorId(nightMode)));
+ @Nullable
+ public DialogButtonType getEffect() {
+ return effect;
+ }
+ }
+
+ public void setTextColor(TextView tv, Context context, boolean enabled, boolean pressed, boolean nightMode, ItemType type) {
+ if (tv != null) {
+ tv.setTextColor(ContextCompat.getColor(context,
+ enabled ? pressed ? getPressedColorId(nightMode)
+ : type == ItemType.CLEAR_DATA ? R.color.color_osm_edit_delete
+ : getActiveTextColorId(nightMode) : getSecondaryTextColorId(nightMode)));
+ }
+ }
+
+ public void setTintedIcon(AppCompatImageView iv, Context context, boolean enabled, boolean pressed, boolean nightMode, ItemType type) {
+ Integer iconId = type.getIconId();
+ if (iv != null && iconId != null) {
+ Drawable icon = AppCompatResources.getDrawable(context, iconId);
+ int iconColor = enabled ? pressed ? getPressedColorId(nightMode)
+ : type == ItemType.CLEAR_DATA ? R.color.color_osm_edit_delete
+ : getActiveIconColorId(nightMode) : getSecondaryIconColorId(nightMode);
+ Drawable tintedIcon = UiUtilities.tintDrawable(icon, ContextCompat.getColor(context, iconColor));
+ iv.setImageDrawable(tintedIcon);
+ if (type == ItemType.STOP) {
+ int stopSize = iv.getResources().getDimensionPixelSize(R.dimen.bottom_sheet_icon_margin_large);
+ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(stopSize, stopSize);
+ iv.setLayoutParams(params);
}
}
+ }
- public void setTintedIcon(AppCompatImageView iv, Context context, boolean enabled, boolean pressed, boolean nightMode) {
- if (iv != null) {
- Drawable icon = AppCompatResources.getDrawable(context, iconId);
- int iconColor = enabled ? pressed ? getPressedColorId(nightMode)
- : this == ItemType.CLEAR_DATA ? R.color.color_osm_edit_delete
- : getActiveIconColorId(nightMode) : getSecondaryIconColorId(nightMode);
- Drawable tintedIcon = UiUtilities.tintDrawable(icon, ContextCompat.getColor(context, iconColor));
- iv.setImageDrawable(tintedIcon);
- if (this == ItemType.STOP) {
- int stopSize = iv.getResources().getDimensionPixelSize(R.dimen.bottom_sheet_icon_margin_large);
- LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(stopSize, stopSize);
- iv.setLayoutParams(params);
- }
- }
- }
-
- @SuppressLint("ClickableViewAccessibility")
- private void changeOnTouch(final LinearLayout button, @Nullable final AppCompatImageView iv, @Nullable final TextView tv,
- final Context context, final boolean enabled, final boolean nightMode) {
- button.setOnTouchListener(new View.OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (enabled) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN: {
- setItemBackgroundActive(button, context, nightMode);
- setTintedIcon(iv, context, true, true, nightMode);
- setTextColor(tv, context, true, true, nightMode);
- break;
- }
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL: {
- setItemBackgroundInactive(button, context, nightMode);
- setTintedIcon(iv, context, true, false, nightMode);
- setTextColor(tv, context, true, false, nightMode);
- break;
- }
+ @SuppressLint("ClickableViewAccessibility")
+ private void changeOnTouch(final LinearLayout button, @Nullable final AppCompatImageView iv, @Nullable final TextView tv,
+ final Context context, final boolean enabled, final boolean nightMode, final ItemType type) {
+ button.setOnTouchListener(new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (enabled) {
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN: {
+ setItemBackgroundActive(button, context, nightMode);
+ setTintedIcon(iv, context, true, true, nightMode, type);
+ setTextColor(tv, context, true, true, nightMode, type);
+ break;
+ }
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL: {
+ setItemBackgroundInactive(button, context, nightMode);
+ setTintedIcon(iv, context, true, false, nightMode, type);
+ setTextColor(tv, context, true, false, nightMode, type);
+ break;
}
}
- return false;
}
- });
- }
+ return false;
+ }
+ });
}
@ColorRes
From 9fe74b12cdbdd56471467cc76e2eae0502aff2e4 Mon Sep 17 00:00:00 2001
From: Dima-1
Date: Mon, 15 Feb 2021 16:48:22 +0200
Subject: [PATCH 38/70] Fix GPX file from bookmarked articles doesn't show
without file
---
.../data/TravelLocalDataHelper.java | 94 +++++++++++-----
.../plus/wikivoyage/data/TravelObfHelper.java | 106 +++++++++---------
.../explore/travelcards/TravelGpxCard.java | 18 ++-
3 files changed, 134 insertions(+), 84 deletions(-)
diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelLocalDataHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelLocalDataHelper.java
index d95b9239ee..6778b3c736 100644
--- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelLocalDataHelper.java
+++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelLocalDataHelper.java
@@ -7,13 +7,19 @@ import android.database.sqlite.SQLiteDatabase;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import net.osmand.GPXUtilities;
import net.osmand.IndexConstants;
+import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
import net.osmand.plus.api.SQLiteAPI.SQLiteCursor;
import net.osmand.util.Algorithms;
+import org.apache.commons.logging.Log;
+
+import java.io.ByteArrayInputStream;
import java.io.File;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -27,6 +33,8 @@ import java.util.Set;
public class TravelLocalDataHelper {
+ private static final Log LOG = PlatformUtil.getLog(TravelLocalDataHelper.class);
+
private static final int HISTORY_ITEMS_LIMIT = 300;
private final WikivoyageLocalDataDbHelper dbHelper;
@@ -189,7 +197,7 @@ public class TravelLocalDataHelper {
private static class WikivoyageLocalDataDbHelper {
- private static final int DB_VERSION = 7;
+ private static final int DB_VERSION = 8;
private static final String DB_NAME = "wikivoyage_local_data";
private static final String HISTORY_TABLE_NAME = "wikivoyage_search_history";
@@ -227,6 +235,7 @@ public class TravelLocalDataHelper {
private static final String BOOKMARKS_COL_CONTENT_JSON = "content_json";
private static final String BOOKMARKS_COL_CONTENT = "content";
private static final String BOOKMARKS_COL_LAST_MODIFIED = "last_modified";
+ private static final String BOOKMARKS_COL_GPX_GZ = "gpx_gz";
private static final String BOOKMARKS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " +
BOOKMARKS_TABLE_NAME + " (" +
@@ -240,7 +249,8 @@ public class TravelLocalDataHelper {
BOOKMARKS_COL_ROUTE_ID + " TEXT, " +
BOOKMARKS_COL_CONTENT_JSON + " TEXT, " +
BOOKMARKS_COL_CONTENT + " TEXT, " +
- BOOKMARKS_COL_LAST_MODIFIED + " long" + ");";
+ BOOKMARKS_COL_LAST_MODIFIED + " long, " +
+ BOOKMARKS_COL_GPX_GZ + " blob" + ");";
private static final String BOOKMARKS_TABLE_SELECT = "SELECT " +
BOOKMARKS_COL_ARTICLE_TITLE + ", " +
@@ -253,7 +263,8 @@ public class TravelLocalDataHelper {
BOOKMARKS_COL_ROUTE_ID + ", " +
BOOKMARKS_COL_CONTENT_JSON + ", " +
BOOKMARKS_COL_CONTENT + ", " +
- BOOKMARKS_COL_LAST_MODIFIED +
+ BOOKMARKS_COL_LAST_MODIFIED + ", " +
+ BOOKMARKS_COL_GPX_GZ +
" FROM " + BOOKMARKS_TABLE_NAME;
private final OsmandApplication context;
@@ -322,6 +333,9 @@ public class TravelLocalDataHelper {
conn.execSQL("UPDATE " + BOOKMARKS_TABLE_NAME +
" SET " + BOOKMARKS_COL_PARTIAL_CONTENT + " = null");
}
+ if (oldVersion < 8) {
+ conn.execSQL("ALTER TABLE " + BOOKMARKS_TABLE_NAME + " ADD " + BOOKMARKS_COL_GPX_GZ + " blob");
+ }
}
@NonNull
@@ -465,35 +479,48 @@ public class TravelLocalDataHelper {
return count > 0;
}
- void addSavedArticle(@NonNull TravelArticle article) {
- String travelBook = article.getTravelBook(context);
+ void addSavedArticle(@NonNull final TravelArticle article) {
+ final String travelBook = article.getTravelBook(context);
if (travelBook == null) {
return;
}
- SQLiteConnection conn = openConnection(false);
- if (conn != null) {
- try {
- String query = "INSERT INTO " + BOOKMARKS_TABLE_NAME + " (" +
- BOOKMARKS_COL_ARTICLE_TITLE + ", " +
- BOOKMARKS_COL_LANG + ", " +
- BOOKMARKS_COL_IS_PART_OF + ", " +
- BOOKMARKS_COL_IMAGE_TITLE + ", " +
- BOOKMARKS_COL_TRAVEL_BOOK + ", " +
- BOOKMARKS_COL_LAT + ", " +
- BOOKMARKS_COL_LON + ", " +
- BOOKMARKS_COL_ROUTE_ID + ", " +
- BOOKMARKS_COL_CONTENT_JSON + ", " +
- BOOKMARKS_COL_CONTENT + ", " +
- BOOKMARKS_COL_LAST_MODIFIED +
- ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
- conn.execSQL(query, new Object[]{article.title, article.lang,
- article.aggregatedPartOf, article.imageTitle,
- travelBook, article.lat, article.lon, article.routeId, article.contentsJson,
- article.content, article.getFile().lastModified()});
- } finally {
- conn.close();
- }
- }
+ context.getTravelHelper().getArticleById(article.generateIdentifier(), article.lang, true,
+ new TravelHelper.GpxReadCallback() {
+ @Override
+ public void onGpxFileReading() {
+
+ }
+
+ @Override
+ public void onGpxFileRead(@Nullable GPXUtilities.GPXFile gpxFile) {
+ SQLiteConnection conn = openConnection(false);
+ if (conn != null) {
+ try {
+ String query = "INSERT INTO " + BOOKMARKS_TABLE_NAME + " (" +
+ BOOKMARKS_COL_ARTICLE_TITLE + ", " +
+ BOOKMARKS_COL_LANG + ", " +
+ BOOKMARKS_COL_IS_PART_OF + ", " +
+ BOOKMARKS_COL_IMAGE_TITLE + ", " +
+ BOOKMARKS_COL_TRAVEL_BOOK + ", " +
+ BOOKMARKS_COL_LAT + ", " +
+ BOOKMARKS_COL_LON + ", " +
+ BOOKMARKS_COL_ROUTE_ID + ", " +
+ BOOKMARKS_COL_CONTENT_JSON + ", " +
+ BOOKMARKS_COL_CONTENT + ", " +
+ BOOKMARKS_COL_LAST_MODIFIED + ", " +
+ BOOKMARKS_COL_GPX_GZ +
+ ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+ conn.execSQL(query, new Object[]{article.title, article.lang,
+ article.aggregatedPartOf, article.imageTitle,
+ travelBook, article.lat, article.lon, article.routeId, article.contentsJson,
+ article.content, article.getFile().lastModified(),
+ Algorithms.stringToGzip(GPXUtilities.asString(article.gpxFile))});
+ } finally {
+ conn.close();
+ }
+ }
+ }
+ });
}
void removeSavedArticle(@NonNull TravelArticle article) {
@@ -584,6 +611,15 @@ public class TravelLocalDataHelper {
res.file = context.getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR + travelBook);
res.lastModified = cursor.getLong(cursor.getColumnIndex(BOOKMARKS_COL_LAST_MODIFIED));
}
+ try {
+ byte[] blob = cursor.getBlob(cursor.getColumnIndex(BOOKMARKS_COL_GPX_GZ));
+ if (blob != null) {
+ String gpxContent = Algorithms.gzipToString(blob);
+ res.gpxFile = GPXUtilities.loadGPXFile(new ByteArrayInputStream(gpxContent.getBytes("UTF-8")));
+ }
+ } catch (IOException e) {
+ LOG.error(e.getMessage(), e);
+ }
return res;
}
}
diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java
index cd215fc28c..27ccb89f64 100644
--- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java
+++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java
@@ -116,48 +116,50 @@ public class TravelObfHelper implements TravelHelper {
String lang = app.getLanguage();
List popularArticles = new ArrayList<>(this.popularArticles);
int pagesCount;
- do {
- if (foundAmenities.size() - foundAmenitiesIndex < MAX_POPULAR_ARTICLES_COUNT) {
- final LatLon location = app.getMapViewTrackingUtilities().getMapLocation();
- for (final BinaryMapIndexReader reader : getReaders()) {
- try {
- searchAmenity(foundAmenities, location, reader, searchRadius, -1, ROUTE_ARTICLE);
- searchAmenity(foundAmenities, location, reader, searchRadius / 5, 15, ROUTE_TRACK);
- } catch (Exception e) {
- LOG.error(e.getMessage(), e);
- }
- }
- if (foundAmenities.size() > 0) {
- Collections.sort(foundAmenities, new Comparator>() {
- @Override
- public int compare(Pair article1, Pair article2) {
- Amenity amenity1 = (Amenity) article1.second;
- double d1 = MapUtils.getDistance(amenity1.getLocation(), location)
- / (ROUTE_ARTICLE.equals(amenity1.getSubType()) ? 5 : 1);
- Amenity amenity2 = (Amenity) article2.second;
- double d2 = MapUtils.getDistance(amenity2.getLocation(), location)
- / (ROUTE_ARTICLE.equals(amenity2.getSubType()) ? 5 : 1);
- return Double.compare(d1, d2);
- }
- });
- }
- searchRadius *= 2;
- }
- pagesCount = popularArticles.size() / MAX_POPULAR_ARTICLES_COUNT;
- while (foundAmenitiesIndex < foundAmenities.size() - 1) {
- Pair amenity = foundAmenities.get(foundAmenitiesIndex);
- if (!Algorithms.isEmpty(amenity.second.getName(lang))) {
- TravelArticle article = cacheTravelArticles(amenity.first, amenity.second, lang, false, null);
- if (article != null && !popularArticles.contains(article)) {
- popularArticles.add(article);
- if (popularArticles.size() >= (pagesCount + 1) * MAX_POPULAR_ARTICLES_COUNT) {
- break;
+ if (isAnyTravelBookPresent()) {
+ do {
+ if (foundAmenities.size() - foundAmenitiesIndex < MAX_POPULAR_ARTICLES_COUNT) {
+ final LatLon location = app.getMapViewTrackingUtilities().getMapLocation();
+ for (final BinaryMapIndexReader reader : getReaders()) {
+ try {
+ searchAmenity(foundAmenities, location, reader, searchRadius, -1, ROUTE_ARTICLE);
+ searchAmenity(foundAmenities, location, reader, searchRadius / 5, 15, ROUTE_TRACK);
+ } catch (Exception e) {
+ LOG.error(e.getMessage(), e);
}
}
+ if (foundAmenities.size() > 0) {
+ Collections.sort(foundAmenities, new Comparator>() {
+ @Override
+ public int compare(Pair article1, Pair article2) {
+ Amenity amenity1 = (Amenity) article1.second;
+ double d1 = MapUtils.getDistance(amenity1.getLocation(), location)
+ / (ROUTE_ARTICLE.equals(amenity1.getSubType()) ? 5 : 1);
+ Amenity amenity2 = (Amenity) article2.second;
+ double d2 = MapUtils.getDistance(amenity2.getLocation(), location)
+ / (ROUTE_ARTICLE.equals(amenity2.getSubType()) ? 5 : 1);
+ return Double.compare(d1, d2);
+ }
+ });
+ }
+ searchRadius *= 2;
}
- foundAmenitiesIndex++;
- }
- } while (popularArticles.size() < (pagesCount + 1) * MAX_POPULAR_ARTICLES_COUNT);
+ pagesCount = popularArticles.size() / MAX_POPULAR_ARTICLES_COUNT;
+ while (foundAmenitiesIndex < foundAmenities.size() - 1) {
+ Pair amenity = foundAmenities.get(foundAmenitiesIndex);
+ if (!Algorithms.isEmpty(amenity.second.getName(lang))) {
+ TravelArticle article = cacheTravelArticles(amenity.first, amenity.second, lang, false, null);
+ if (article != null && !popularArticles.contains(article)) {
+ popularArticles.add(article);
+ if (popularArticles.size() >= (pagesCount + 1) * MAX_POPULAR_ARTICLES_COUNT) {
+ break;
+ }
+ }
+ }
+ foundAmenitiesIndex++;
+ }
+ } while (popularArticles.size() < (pagesCount + 1) * MAX_POPULAR_ARTICLES_COUNT);
+ }
this.popularArticles = popularArticles;
return popularArticles;
}
@@ -667,7 +669,7 @@ public class TravelObfHelper implements TravelHelper {
if (article == null && articles == null) {
article = findArticleById(articleId, lang, readGpx, callback);
}
- if (article != null && readGpx && !Algorithms.isEmpty(lang)) {
+ if (article != null && readGpx && (!Algorithms.isEmpty(lang) || article instanceof TravelGpx)) {
readGpxFile(article, callback);
}
return article;
@@ -858,11 +860,7 @@ public class TravelObfHelper implements TravelHelper {
@Override
public File createGpxFile(@NonNull TravelArticle article) {
final GPXFile gpx;
- if (article instanceof TravelGpx) {
- gpx = buildTravelGpxFile((TravelGpx) article);
- } else {
- gpx = article.getGpxFile();
- }
+ gpx = article.getGpxFile();
File file = app.getAppPath(IndexConstants.GPX_TRAVEL_DIR + getGPXName(article));
writeGpxFile(file, gpx);
return file;
@@ -898,13 +896,17 @@ public class TravelObfHelper implements TravelHelper {
@Override
protected GPXFile doInBackground(Void... voids) {
GPXFile gpxFile = null;
- List pointList = getPointList(article);
- if (!Algorithms.isEmpty(pointList)) {
- gpxFile = new GPXFile(article.getTitle(), article.getLang(), article.getContent());
- gpxFile.metadata.link = TravelArticle.getImageUrl(article.getImageTitle(), false);
- for (Amenity amenity : pointList) {
- WptPt wptPt = createWptPt(amenity, article.getLang());
- gpxFile.addPoint(wptPt);
+ if (article instanceof TravelGpx) {
+ gpxFile = buildTravelGpxFile((TravelGpx) article);
+ } else {
+ List pointList = getPointList(article);
+ if (!Algorithms.isEmpty(pointList)) {
+ gpxFile = new GPXFile(article.getTitle(), article.getLang(), article.getContent());
+ gpxFile.metadata.link = TravelArticle.getImageUrl(article.getImageTitle(), false);
+ for (Amenity amenity : pointList) {
+ WptPt wptPt = createWptPt(amenity, article.getLang());
+ gpxFile.addPoint(wptPt);
+ }
}
}
return gpxFile;
diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelGpxCard.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelGpxCard.java
index be89018bb6..7e07b55be4 100644
--- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelGpxCard.java
+++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelGpxCard.java
@@ -7,16 +7,19 @@ import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.AndroidUtils;
+import net.osmand.GPXUtilities;
import net.osmand.osm.RouteActivityType;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.track.TrackMenuFragment;
import net.osmand.plus.wikivoyage.data.TravelGpx;
+import net.osmand.plus.wikivoyage.data.TravelHelper;
import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper;
import net.osmand.util.Algorithms;
@@ -64,8 +67,18 @@ public class TravelGpxCard extends BaseTravelCard {
@Override
public void onClick(View v) {
if (activity != null) {
- File file = app.getTravelHelper().createGpxFile(article);
- TrackMenuFragment.openTrack(activity, file, null);
+ app.getTravelHelper().getArticleById(article.generateIdentifier(), null, true,
+ new TravelHelper.GpxReadCallback() {
+ @Override
+ public void onGpxFileReading() {
+ }
+
+ @Override
+ public void onGpxFileRead(@Nullable GPXUtilities.GPXFile gpxFile) {
+ File file = app.getTravelHelper().createGpxFile(article);
+ TrackMenuFragment.openTrack(activity, file, null);
+ }
+ });
}
}
};
@@ -102,7 +115,6 @@ public class TravelGpxCard extends BaseTravelCard {
if (saved) {
helper.removeArticleFromSaved(article);
} else {
- app.getTravelHelper().createGpxFile(article);
helper.addArticleToSaved(article);
}
updateSaveButton(holder);
From c635ebfef5fec162f396904836f234e51dedc464 Mon Sep 17 00:00:00 2001
From: xmd5a
Date: Mon, 15 Feb 2021 18:18:16 +0300
Subject: [PATCH 39/70] Add phrases
---
OsmAnd/res/values/phrases.xml | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml
index 4ffcb6202d..c3b693f87f 100644
--- a/OsmAnd/res/values/phrases.xml
+++ b/OsmAnd/res/values/phrases.xml
@@ -4332,6 +4332,7 @@
Bat bridge
Bat tunnel
+<<<<<<< HEAD
Ski jump
Piste name
Gladed: yes
@@ -4344,5 +4345,12 @@
Summit register: no
Mobile library stop position
+=======
+ Conference centre
+
+ Geodesist
+
+
+>>>>>>> Add phrases
From 2960dc93c0e37b62f32dfbd02968fb64c8e594f3 Mon Sep 17 00:00:00 2001
From: Victor Shcherb
Date: Mon, 15 Feb 2021 16:27:51 +0100
Subject: [PATCH 40/70] Fix merge
---
OsmAnd/res/values/phrases.xml | 8 --------
1 file changed, 8 deletions(-)
diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml
index c3b693f87f..53138bcc18 100644
--- a/OsmAnd/res/values/phrases.xml
+++ b/OsmAnd/res/values/phrases.xml
@@ -4332,7 +4332,6 @@
Bat bridge
Bat tunnel
-<<<<<<< HEAD
Ski jump
Piste name
Gladed: yes
@@ -4340,17 +4339,10 @@
Patrolled: no
Piste status: open
Piste status: closed
-
Summit register: yes
Summit register: no
-
Mobile library stop position
-=======
Conference centre
-
Geodesist
-
->>>>>>> Add phrases
-
From ef915fc0bc9b4e841eed9800a8a9b9711e1d891c Mon Sep 17 00:00:00 2001
From: Dmitry
Date: Mon, 15 Feb 2021 17:32:38 +0200
Subject: [PATCH 41/70] Added icon ruler_line
---
OsmAnd/res/drawable/ic_action_ruler_line.xml | 23 ++++++++++++++++++++
1 file changed, 23 insertions(+)
create mode 100644 OsmAnd/res/drawable/ic_action_ruler_line.xml
diff --git a/OsmAnd/res/drawable/ic_action_ruler_line.xml b/OsmAnd/res/drawable/ic_action_ruler_line.xml
new file mode 100644
index 0000000000..0fb6bfc5fa
--- /dev/null
+++ b/OsmAnd/res/drawable/ic_action_ruler_line.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
From 8af6416366d6c7425e0db773a8f4a279e9fb7559 Mon Sep 17 00:00:00 2001
From: cepprice
Date: Fri, 12 Feb 2021 22:39:38 +0500
Subject: [PATCH 42/70] Fix UI
---
OsmAnd/res/drawable/btn_unstroked.xml | 13 +++
.../layout/dialog_edit_gpx_description.xml | 28 +++---
.../layout/dialog_read_gpx_description.xml | 93 ++++++++++++++-----
.../layout/gpx_description_preview_card.xml | 24 +++--
OsmAnd/res/values/attrs.xml | 1 +
OsmAnd/res/values/styles.xml | 2 +
.../osmand/plus/track/DescriptionCard.java | 22 ++++-
.../GpxEditDescriptionDialogFragment.java | 72 ++++++++++----
.../GpxReadDescriptionDialogFragment.java | 90 +++++++-----------
9 files changed, 219 insertions(+), 126 deletions(-)
create mode 100644 OsmAnd/res/drawable/btn_unstroked.xml
diff --git a/OsmAnd/res/drawable/btn_unstroked.xml b/OsmAnd/res/drawable/btn_unstroked.xml
new file mode 100644
index 0000000000..e9405e72c7
--- /dev/null
+++ b/OsmAnd/res/drawable/btn_unstroked.xml
@@ -0,0 +1,13 @@
+
+
+
+ -
+
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/dialog_edit_gpx_description.xml b/OsmAnd/res/layout/dialog_edit_gpx_description.xml
index 1d2428f82b..66c0d57f0a 100644
--- a/OsmAnd/res/layout/dialog_edit_gpx_description.xml
+++ b/OsmAnd/res/layout/dialog_edit_gpx_description.xml
@@ -21,11 +21,13 @@
android:layout_marginLeft="@dimen/card_padding"
android:padding="@dimen/context_menu_padding_margin_small"
android:paddingStart="@dimen/context_menu_padding_margin_small"
- android:paddingEnd="@dimen/context_menu_padding_margin_small">
+ android:paddingEnd="@dimen/context_menu_padding_margin_small"
+ android:background="@null">