Add track gradient scale types

This commit is contained in:
Vitaliy 2020-07-06 12:30:55 +03:00
parent 94919b25a5
commit a0c83cf8b5
4 changed files with 171 additions and 50 deletions

View file

@ -42,7 +42,9 @@ import java.util.Stack;
import java.util.TimeZone;
public class GPXUtilities {
public final static Log log = PlatformUtil.getLog(GPXUtilities.class);
private static final String ICON_NAME_EXTENSION = "icon";
private static final String DEFAULT_ICON_NAME = "special_star";
private static final String BACKGROUND_TYPE_EXTENSION = "background";
@ -115,6 +117,13 @@ public class GPXUtilities {
return extensions;
}
public Map<String, String> getExtensionsToWrite() {
if (extensions == null) {
extensions = new LinkedHashMap<>();
}
return extensions;
}
public GPXExtensionsWriter getExtensionsWriter() {
return extensionsWriter;
}
@ -148,50 +157,7 @@ public class GPXUtilities {
getExtensionsToWrite().remove("color");
}
public String getWidth(String defWidth) {
String widthValue = null;
if (extensions != null) {
widthValue = extensions.get("width");
}
return widthValue != null ? widthValue : defWidth;
}
public void setWidth(String width) {
getExtensionsToWrite().put("width", width);
}
public boolean isShowArrows() {
String showArrows = null;
if (extensions != null) {
showArrows = extensions.get("showArrows");
}
return Boolean.parseBoolean(showArrows);
}
public void setShowArrows(boolean showArrows) {
getExtensionsToWrite().put("showArrows", String.valueOf(showArrows));
}
public boolean isShowStartFinish() {
String showStartFinish = null;
if (extensions != null) {
showStartFinish = extensions.get("showStartFinish");
}
return Boolean.parseBoolean(showStartFinish);
}
public void setShowStartFinish(boolean showStartFinish) {
getExtensionsToWrite().put("showStartFinish", String.valueOf(showStartFinish));
}
public Map<String, String> getExtensionsToWrite() {
if (extensions == null) {
extensions = new LinkedHashMap<>();
}
return extensions;
}
private int parseColor(String colorString, int defColor) {
protected int parseColor(String colorString, int defColor) {
if (!Algorithms.isEmpty(colorString)) {
if (colorString.charAt(0) == '#') {
long color = Long.parseLong(colorString.substring(1), 16);
@ -1547,6 +1513,70 @@ public class GPXUtilities {
}
return new QuadRect(left, top, right, bottom);
}
public enum GradientScaleType {
SPEED("gradientSpeedColor"),
ALTITUDE("gradientAltitudeColor"),
SLOPE("gradientSlopeColor");
private String typeName;
GradientScaleType(String typeName) {
this.typeName = typeName;
}
public String getTypeName() {
return typeName;
}
}
public void setGradientScaleColor(GradientScaleType gradientScaleType, int gradientScaleSpeedColor) {
getExtensionsToWrite().put(gradientScaleType.getTypeName(), Algorithms.colorToString(gradientScaleSpeedColor));
}
public int getGradientScaleColor(GradientScaleType gradientScaleType, int defColor) {
String clrValue = null;
if (extensions != null) {
clrValue = extensions.get(gradientScaleType.getTypeName());
}
return parseColor(clrValue, defColor);
}
public String getWidth(String defWidth) {
String widthValue = null;
if (extensions != null) {
widthValue = extensions.get("width");
}
return widthValue != null ? widthValue : defWidth;
}
public void setWidth(String width) {
getExtensionsToWrite().put("width", width);
}
public boolean isShowArrows() {
String showArrows = null;
if (extensions != null) {
showArrows = extensions.get("showArrows");
}
return Boolean.parseBoolean(showArrows);
}
public void setShowArrows(boolean showArrows) {
getExtensionsToWrite().put("showArrows", String.valueOf(showArrows));
}
public boolean isShowStartFinish() {
String showStartFinish = null;
if (extensions != null) {
showStartFinish = extensions.get("showStartFinish");
}
return Boolean.parseBoolean(showStartFinish);
}
public void setShowStartFinish(boolean showStartFinish) {
getExtensionsToWrite().put("showStartFinish", String.valueOf(showStartFinish));
}
}
public static String asString(GPXFile file) {

View file

@ -3,6 +3,7 @@ package net.osmand.plus;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.GPXUtilities.GPXFile.GradientScaleType;
import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.IndexConstants;
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
@ -63,6 +64,12 @@ public class GPXDatabase {
private static final String GPX_COL_WIDTH = "width";
private static final String GPX_COL_GRADIENT_SPEED_COLOR = "gradientSpeedColor";
private static final String GPX_COL_GRADIENT_ALTITUDE_COLOR = "gradientAltitudeColor";
private static final String GPX_COL_GRADIENT_SLOPE_COLOR = "gradientSlopeColor";
public static final int GPX_SPLIT_TYPE_NO_SPLIT = -1;
public static final int GPX_SPLIT_TYPE_DISTANCE = 1;
public static final int GPX_SPLIT_TYPE_TIME = 2;
@ -99,7 +106,10 @@ public class GPXDatabase {
GPX_COL_JOIN_SEGMENTS + " int, " + // 1 = true, 0 = false
GPX_COL_SHOW_ARROWS + " int, " + // 1 = true, 0 = false
GPX_COL_SHOW_START_FINISH + " int, " + // 1 = true, 0 = false
GPX_COL_WIDTH + " TEXT);";
GPX_COL_WIDTH + " TEXT, " +
GPX_COL_GRADIENT_SPEED_COLOR + " TEXT, " +
GPX_COL_GRADIENT_ALTITUDE_COLOR + " TEXT, " +
GPX_COL_GRADIENT_SLOPE_COLOR + " TEXT);";
private static final String GPX_TABLE_SELECT = "SELECT " +
GPX_COL_NAME + ", " +
@ -129,8 +139,10 @@ public class GPXDatabase {
GPX_COL_SHOW_AS_MARKERS + ", " +
GPX_COL_JOIN_SEGMENTS + ", " +
GPX_COL_SHOW_ARROWS + ", " +
GPX_COL_SHOW_START_FINISH + ", " +
GPX_COL_WIDTH +
GPX_COL_WIDTH + ", " +
GPX_COL_GRADIENT_SPEED_COLOR + ", " +
GPX_COL_GRADIENT_ALTITUDE_COLOR + ", " +
GPX_COL_GRADIENT_SLOPE_COLOR +
" FROM " + GPX_TABLE_NAME;
private static final String GPX_TABLE_UPDATE_ANALYSIS = "UPDATE " +
@ -162,6 +174,9 @@ public class GPXDatabase {
private GPXTrackAnalysis analysis;
private String width;
private int color;
private int gradientSpeedColor;
private int gradientAltitudeColor;
private int gradientSlopeColor;
private int splitType;
private double splitInterval;
private long fileLastModifiedTime;
@ -194,6 +209,30 @@ public class GPXDatabase {
return color;
}
public int getGradientSpeedColor() {
return gradientSpeedColor;
}
public void setGradientSpeedColor(int gradientSpeedColor) {
this.gradientSpeedColor = gradientSpeedColor;
}
public int getGradientAltitudeColor() {
return gradientAltitudeColor;
}
public void setGradientAltitudeColor(int gradientAltitudeColor) {
this.gradientAltitudeColor = gradientAltitudeColor;
}
public int getGradientSlopeColor() {
return gradientSlopeColor;
}
public void setGradientSlopeColor(int gradientSlopeColor) {
this.gradientSlopeColor = gradientSlopeColor;
}
public String getWidth() {
return width;
}
@ -386,6 +425,9 @@ public class GPXDatabase {
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_SHOW_ARROWS + " int");
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_SHOW_START_FINISH + " int");
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_WIDTH + " TEXT");
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_GRADIENT_SPEED_COLOR + " TEXT");
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_GRADIENT_ALTITUDE_COLOR + " TEXT");
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_GRADIENT_SLOPE_COLOR + " TEXT");
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + GPX_COL_SHOW_ARROWS + " = ? " +
"WHERE " + GPX_COL_SHOW_ARROWS + " IS NULL", new Object[]{0});
@ -454,6 +496,34 @@ public class GPXDatabase {
return false;
}
public boolean updateGradientScaleColor(@NonNull GpxDataItem item, @NonNull GradientScaleType gradientScaleType, int gradientScaleColor) {
SQLiteConnection db = openConnection(false);
if (db != null) {
try {
String fileName = getFileName(item.file);
String fileDir = getFileDir(item.file);
String columnName = null;
if (GradientScaleType.SPEED == gradientScaleType) {
columnName = GPX_COL_GRADIENT_SPEED_COLOR;
item.gradientSpeedColor = gradientScaleColor;
} else if (GradientScaleType.ALTITUDE == gradientScaleType) {
columnName = GPX_COL_GRADIENT_ALTITUDE_COLOR;
item.gradientAltitudeColor = gradientScaleColor;
} else if (GradientScaleType.SLOPE == gradientScaleType) {
columnName = GPX_COL_GRADIENT_SLOPE_COLOR;
item.gradientSlopeColor = gradientScaleColor;
}
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + columnName + " = ? " +
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
new Object[] {(gradientScaleColor == 0 ? "" : Algorithms.colorToString(gradientScaleColor)), fileName, fileDir});
} finally {
db.close();
}
return true;
}
return false;
}
public boolean updateShowArrows(GpxDataItem item, boolean showArrows) {
SQLiteConnection db = openConnection(false);
if (db != null) {
@ -642,7 +712,10 @@ public class GPXDatabase {
GPX_COL_JOIN_SEGMENTS + ", " +
GPX_COL_SHOW_ARROWS + ", " +
GPX_COL_SHOW_START_FINISH + ", " +
GPX_COL_WIDTH +
GPX_COL_WIDTH + ", " +
GPX_COL_GRADIENT_SPEED_COLOR + ", " +
GPX_COL_GRADIENT_ALTITUDE_COLOR + ", " +
GPX_COL_GRADIENT_SLOPE_COLOR +
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
new Object[] {fileName, fileDir, color, 0, item.splitType, item.splitInterval,
item.apiImported ? 1 : 0, item.showAsMarkers ? 1 : 0, item.joinSegments ? 1 : 0,

View file

@ -8,6 +8,7 @@ import androidx.annotation.Nullable;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.GPXFile.GradientScaleType;
import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.plus.GPXDatabase.GpxDataItem;
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
@ -77,6 +78,12 @@ public class GpxDbHelper {
return res;
}
public boolean updateGradientScaleColor(@NonNull GpxDataItem item, @NonNull GradientScaleType gradientScaleType, int color) {
boolean res = db.updateGradientScaleColor(item, gradientScaleType, color);
putToCache(item);
return res;
}
public boolean updateShowAsMarkers(GpxDataItem item, boolean showAsMarkers) {
boolean res = db.updateShowAsMarkers(item, showAsMarkers);
putToCache(item);
@ -107,7 +114,7 @@ public class GpxDbHelper {
return res;
}
public boolean updateJoinSegments(@NonNull GpxDataItem item, boolean joinSegments) {
public boolean updateJoinSegments(@NonNull GpxDataItem item, boolean joinSegments) {
boolean res = db.updateJoinSegments(item, joinSegments);
putToCache(item);
return res;

View file

@ -11,6 +11,7 @@ import androidx.core.content.ContextCompat;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.GPXFile.GradientScaleType;
import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.GPXUtilities.Route;
import net.osmand.GPXUtilities.Track;
@ -518,6 +519,7 @@ public class GpxSelectionHelper {
int clr = Algorithms.parseColor(obj.getString(COLOR));
gpx.setColor(clr);
}
loadGpxScaleTypes(obj, gpx);
if (obj.has(SHOW_ARROWS)) {
boolean showArrows = obj.optBoolean(SHOW_ARROWS, false);
gpx.setShowArrows(showArrows);
@ -555,6 +557,15 @@ public class GpxSelectionHelper {
}
}
private void loadGpxScaleTypes(JSONObject obj, GPXFile gpx) throws JSONException {
for (GradientScaleType scaleType : GradientScaleType.values()) {
if (obj.has(scaleType.getTypeName())) {
int clr = Algorithms.parseColor(obj.getString(scaleType.getTypeName()));
gpx.setGradientScaleColor(scaleType, clr);
}
}
}
private void saveCurrentSelections() {
JSONArray ar = new JSONArray();
for (SelectedGpxFile s : selectedGPXFiles) {