Gpx width per file
This commit is contained in:
parent
1b65e5076a
commit
dbfb379cc8
11 changed files with 654 additions and 484 deletions
|
@ -148,6 +148,18 @@ public class GPXUtilities {
|
||||||
getExtensionsToWrite().remove("color");
|
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 Map<String, String> getExtensionsToWrite() {
|
public Map<String, String> getExtensionsToWrite() {
|
||||||
if (extensions == null) {
|
if (extensions == null) {
|
||||||
extensions = new LinkedHashMap<>();
|
extensions = new LinkedHashMap<>();
|
||||||
|
|
|
@ -43,6 +43,7 @@ import net.osmand.data.PointDescription;
|
||||||
import net.osmand.plus.AppInitializer;
|
import net.osmand.plus.AppInitializer;
|
||||||
import net.osmand.plus.AppInitializer.AppInitializeListener;
|
import net.osmand.plus.AppInitializer.AppInitializeListener;
|
||||||
import net.osmand.plus.AppInitializer.InitEvents;
|
import net.osmand.plus.AppInitializer.InitEvents;
|
||||||
|
import net.osmand.plus.dialogs.GpxAppearanceAdapter;
|
||||||
import net.osmand.plus.settings.backend.ApplicationMode;
|
import net.osmand.plus.settings.backend.ApplicationMode;
|
||||||
import net.osmand.plus.ContextMenuAdapter;
|
import net.osmand.plus.ContextMenuAdapter;
|
||||||
import net.osmand.plus.ContextMenuItem;
|
import net.osmand.plus.ContextMenuItem;
|
||||||
|
@ -60,7 +61,6 @@ import net.osmand.plus.SQLiteTileSource;
|
||||||
import net.osmand.plus.settings.backend.SettingsHelper;
|
import net.osmand.plus.settings.backend.SettingsHelper;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
import net.osmand.plus.audionotes.AudioVideoNotesPlugin;
|
import net.osmand.plus.audionotes.AudioVideoNotesPlugin;
|
||||||
import net.osmand.plus.dialogs.ConfigureMapMenu;
|
|
||||||
import net.osmand.plus.helpers.ColorDialogs;
|
import net.osmand.plus.helpers.ColorDialogs;
|
||||||
import net.osmand.plus.helpers.ExternalApiHelper;
|
import net.osmand.plus.helpers.ExternalApiHelper;
|
||||||
import net.osmand.plus.mapcontextmenu.MapContextMenu;
|
import net.osmand.plus.mapcontextmenu.MapContextMenu;
|
||||||
|
@ -1146,7 +1146,7 @@ public class OsmandAidlApi {
|
||||||
|
|
||||||
@SuppressLint("StaticFieldLeak")
|
@SuppressLint("StaticFieldLeak")
|
||||||
private void finishGpxImport(boolean destinationExists, File destination, String color, boolean show) {
|
private void finishGpxImport(boolean destinationExists, File destination, String color, boolean show) {
|
||||||
final int col = ConfigureMapMenu.GpxAppearanceAdapter.parseTrackColor(
|
final int col = GpxAppearanceAdapter.parseTrackColor(
|
||||||
app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
||||||
if (!destinationExists) {
|
if (!destinationExists) {
|
||||||
GpxDataItem gpxDataItem = new GpxDataItem(destination, col);
|
GpxDataItem gpxDataItem = new GpxDataItem(destination, col);
|
||||||
|
@ -1390,7 +1390,7 @@ public class OsmandAidlApi {
|
||||||
int color = dataItem.getColor();
|
int color = dataItem.getColor();
|
||||||
String colorName = "";
|
String colorName = "";
|
||||||
if (color != 0) {
|
if (color != 0) {
|
||||||
colorName = ConfigureMapMenu.GpxAppearanceAdapter.parseTrackColorName(app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
colorName = GpxAppearanceAdapter.parseTrackColorName(app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
||||||
}
|
}
|
||||||
net.osmand.aidlapi.gpx.AGpxFileDetails details = null;
|
net.osmand.aidlapi.gpx.AGpxFileDetails details = null;
|
||||||
GPXTrackAnalysis analysis = dataItem.getAnalysis();
|
GPXTrackAnalysis analysis = dataItem.getAnalysis();
|
||||||
|
@ -1431,7 +1431,7 @@ public class OsmandAidlApi {
|
||||||
if (file.getName().equals(gpxFileName)) {
|
if (file.getName().equals(gpxFileName)) {
|
||||||
int color = dataItem.getColor();
|
int color = dataItem.getColor();
|
||||||
if (color != 0) {
|
if (color != 0) {
|
||||||
return ConfigureMapMenu.GpxAppearanceAdapter.parseTrackColorName(app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
return GpxAppearanceAdapter.parseTrackColorName(app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,9 @@ import java.util.List;
|
||||||
|
|
||||||
public class GPXDatabase {
|
public class GPXDatabase {
|
||||||
|
|
||||||
|
private static final int DB_VERSION = 11;
|
||||||
private static final String DB_NAME = "gpx_database";
|
private static final String DB_NAME = "gpx_database";
|
||||||
private static final int DB_VERSION = 10;
|
|
||||||
private static final String GPX_TABLE_NAME = "gpxTable";
|
private static final String GPX_TABLE_NAME = "gpxTable";
|
||||||
private static final String GPX_COL_NAME = "fileName";
|
private static final String GPX_COL_NAME = "fileName";
|
||||||
private static final String GPX_COL_DIR = "fileDir";
|
private static final String GPX_COL_DIR = "fileDir";
|
||||||
|
@ -56,6 +57,8 @@ public class GPXDatabase {
|
||||||
|
|
||||||
private static final String GPX_COL_JOIN_SEGMENTS = "joinSegments";
|
private static final String GPX_COL_JOIN_SEGMENTS = "joinSegments";
|
||||||
|
|
||||||
|
private static final String GPX_COL_WIDTH = "width";
|
||||||
|
|
||||||
public static final int GPX_SPLIT_TYPE_NO_SPLIT = -1;
|
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_DISTANCE = 1;
|
||||||
public static final int GPX_SPLIT_TYPE_TIME = 2;
|
public static final int GPX_SPLIT_TYPE_TIME = 2;
|
||||||
|
@ -89,7 +92,8 @@ public class GPXDatabase {
|
||||||
GPX_COL_API_IMPORTED + " int, " + // 1 = true, 0 = false
|
GPX_COL_API_IMPORTED + " int, " + // 1 = true, 0 = false
|
||||||
GPX_COL_WPT_CATEGORY_NAMES + " TEXT, " +
|
GPX_COL_WPT_CATEGORY_NAMES + " TEXT, " +
|
||||||
GPX_COL_SHOW_AS_MARKERS + " int, " + // 1 = true, 0 = false
|
GPX_COL_SHOW_AS_MARKERS + " int, " + // 1 = true, 0 = false
|
||||||
GPX_COL_JOIN_SEGMENTS + " int);"; // 1 = true, 0 = false
|
GPX_COL_JOIN_SEGMENTS + " int, " + // 1 = true, 0 = false
|
||||||
|
GPX_COL_WIDTH + " TEXT);";
|
||||||
|
|
||||||
private static final String GPX_TABLE_SELECT = "SELECT " +
|
private static final String GPX_TABLE_SELECT = "SELECT " +
|
||||||
GPX_COL_NAME + ", " +
|
GPX_COL_NAME + ", " +
|
||||||
|
@ -117,7 +121,8 @@ public class GPXDatabase {
|
||||||
GPX_COL_API_IMPORTED + ", " +
|
GPX_COL_API_IMPORTED + ", " +
|
||||||
GPX_COL_WPT_CATEGORY_NAMES + ", " +
|
GPX_COL_WPT_CATEGORY_NAMES + ", " +
|
||||||
GPX_COL_SHOW_AS_MARKERS + ", " +
|
GPX_COL_SHOW_AS_MARKERS + ", " +
|
||||||
GPX_COL_JOIN_SEGMENTS +
|
GPX_COL_JOIN_SEGMENTS + ", " +
|
||||||
|
GPX_COL_WIDTH +
|
||||||
" FROM " + GPX_TABLE_NAME;
|
" FROM " + GPX_TABLE_NAME;
|
||||||
|
|
||||||
private static final String GPX_TABLE_UPDATE_ANALYSIS = "UPDATE " +
|
private static final String GPX_TABLE_UPDATE_ANALYSIS = "UPDATE " +
|
||||||
|
@ -144,12 +149,14 @@ public class GPXDatabase {
|
||||||
private OsmandApplication context;
|
private OsmandApplication context;
|
||||||
|
|
||||||
public static class GpxDataItem {
|
public static class GpxDataItem {
|
||||||
|
|
||||||
private File file;
|
private File file;
|
||||||
private GPXTrackAnalysis analysis;
|
private GPXTrackAnalysis analysis;
|
||||||
|
private String width;
|
||||||
private int color;
|
private int color;
|
||||||
private long fileLastModifiedTime;
|
|
||||||
private int splitType;
|
private int splitType;
|
||||||
private double splitInterval;
|
private double splitInterval;
|
||||||
|
private long fileLastModifiedTime;
|
||||||
private boolean apiImported;
|
private boolean apiImported;
|
||||||
private boolean showAsMarkers;
|
private boolean showAsMarkers;
|
||||||
private boolean joinSegments;
|
private boolean joinSegments;
|
||||||
|
@ -177,6 +184,14 @@ public class GPXDatabase {
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getWidth() {
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWidth(String width) {
|
||||||
|
this.width = width;
|
||||||
|
}
|
||||||
|
|
||||||
public long getFileLastModifiedTime() {
|
public long getFileLastModifiedTime() {
|
||||||
return fileLastModifiedTime;
|
return fileLastModifiedTime;
|
||||||
}
|
}
|
||||||
|
@ -341,6 +356,9 @@ public class GPXDatabase {
|
||||||
" SET " + GPX_COL_JOIN_SEGMENTS + " = ? " +
|
" SET " + GPX_COL_JOIN_SEGMENTS + " = ? " +
|
||||||
"WHERE " + GPX_COL_JOIN_SEGMENTS + " IS NULL", new Object[]{0});
|
"WHERE " + GPX_COL_JOIN_SEGMENTS + " IS NULL", new Object[]{0});
|
||||||
}
|
}
|
||||||
|
if (oldVersion < 11) {
|
||||||
|
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_WIDTH + " TEXT");
|
||||||
|
}
|
||||||
db.execSQL("CREATE INDEX IF NOT EXISTS " + GPX_INDEX_NAME_DIR + " ON " + GPX_TABLE_NAME + " (" + GPX_COL_NAME + ", " + GPX_COL_DIR + ");");
|
db.execSQL("CREATE INDEX IF NOT EXISTS " + GPX_INDEX_NAME_DIR + " ON " + GPX_TABLE_NAME + " (" + GPX_COL_NAME + ", " + GPX_COL_DIR + ");");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -391,8 +409,7 @@ public class GPXDatabase {
|
||||||
try {
|
try {
|
||||||
String fileName = getFileName(item.file);
|
String fileName = getFileName(item.file);
|
||||||
String fileDir = getFileDir(item.file);
|
String fileDir = getFileDir(item.file);
|
||||||
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " +
|
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + GPX_COL_COLOR + " = ? " +
|
||||||
GPX_COL_COLOR + " = ? " +
|
|
||||||
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
||||||
new Object[] { (color == 0 ? "" : Algorithms.colorToString(color)), fileName, fileDir });
|
new Object[] { (color == 0 ? "" : Algorithms.colorToString(color)), fileName, fileDir });
|
||||||
item.color = color;
|
item.color = color;
|
||||||
|
@ -404,6 +421,24 @@ public class GPXDatabase {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean updateWidth(GpxDataItem item, String width) {
|
||||||
|
SQLiteConnection db = openConnection(false);
|
||||||
|
if (db != null){
|
||||||
|
try {
|
||||||
|
String fileName = getFileName(item.file);
|
||||||
|
String fileDir = getFileDir(item.file);
|
||||||
|
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + GPX_COL_WIDTH + " = ? " +
|
||||||
|
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
||||||
|
new Object[] { width, fileName, fileDir });
|
||||||
|
item.width = width;
|
||||||
|
} finally {
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean updateShowAsMarkers(GpxDataItem item, boolean showAsMarkers) {
|
public boolean updateShowAsMarkers(GpxDataItem item, boolean showAsMarkers) {
|
||||||
SQLiteConnection db = openConnection(false);
|
SQLiteConnection db = openConnection(false);
|
||||||
if (db != null) {
|
if (db != null) {
|
||||||
|
@ -518,12 +553,12 @@ public class GPXDatabase {
|
||||||
}
|
}
|
||||||
if (a != null) {
|
if (a != null) {
|
||||||
db.execSQL(
|
db.execSQL(
|
||||||
"INSERT INTO " + GPX_TABLE_NAME + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
"INSERT INTO " + GPX_TABLE_NAME + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
||||||
new Object[] {fileName, fileDir, a.totalDistance, a.totalTracks, a.startTime, a.endTime,
|
new Object[] {fileName, fileDir, a.totalDistance, a.totalTracks, a.startTime, a.endTime,
|
||||||
a.timeSpan, a.timeMoving, a.totalDistanceMoving, a.diffElevationUp, a.diffElevationDown,
|
a.timeSpan, a.timeMoving, a.totalDistanceMoving, a.diffElevationUp, a.diffElevationDown,
|
||||||
a.avgElevation, a.minElevation, a.maxElevation, a.maxSpeed, a.avgSpeed, a.points, a.wptPoints,
|
a.avgElevation, a.minElevation, a.maxElevation, a.maxSpeed, a.avgSpeed, a.points, a.wptPoints,
|
||||||
color, item.file.lastModified(), item.splitType, item.splitInterval, item.apiImported ? 1 : 0,
|
color, item.file.lastModified(), item.splitType, item.splitInterval, item.apiImported ? 1 : 0,
|
||||||
Algorithms.encodeStringSet(item.analysis.wptCategoryNames), item.showAsMarkers ? 1 : 0, item.joinSegments ? 1 : 0});
|
Algorithms.encodeStringSet(item.analysis.wptCategoryNames), item.showAsMarkers ? 1 : 0, item.joinSegments ? 1 : 0, item.width});
|
||||||
} else {
|
} else {
|
||||||
db.execSQL("INSERT INTO " + GPX_TABLE_NAME + "(" +
|
db.execSQL("INSERT INTO " + GPX_TABLE_NAME + "(" +
|
||||||
GPX_COL_NAME + ", " +
|
GPX_COL_NAME + ", " +
|
||||||
|
@ -534,9 +569,10 @@ public class GPXDatabase {
|
||||||
GPX_COL_SPLIT_INTERVAL + ", " +
|
GPX_COL_SPLIT_INTERVAL + ", " +
|
||||||
GPX_COL_API_IMPORTED + ", " +
|
GPX_COL_API_IMPORTED + ", " +
|
||||||
GPX_COL_SHOW_AS_MARKERS + ", " +
|
GPX_COL_SHOW_AS_MARKERS + ", " +
|
||||||
GPX_COL_JOIN_SEGMENTS +
|
GPX_COL_JOIN_SEGMENTS + ", " +
|
||||||
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
GPX_COL_WIDTH +
|
||||||
new Object[] {fileName, fileDir, color, 0, item.splitType, item.splitInterval, item.apiImported ? 1 : 0, item.showAsMarkers ? 1 : 0, item.joinSegments ? 1 : 0});
|
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
||||||
|
new Object[] {fileName, fileDir, color, 0, item.splitType, item.splitInterval, item.apiImported ? 1 : 0, item.showAsMarkers ? 1 : 0, item.joinSegments ? 1 : 0, item.width});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -617,6 +653,7 @@ public class GPXDatabase {
|
||||||
String wptCategoryNames = query.getString(23);
|
String wptCategoryNames = query.getString(23);
|
||||||
boolean showAsMarkers = query.getInt(24) == 1;
|
boolean showAsMarkers = query.getInt(24) == 1;
|
||||||
boolean joinSegments = query.getInt(25) == 1;
|
boolean joinSegments = query.getInt(25) == 1;
|
||||||
|
String width = query.getString(26);
|
||||||
|
|
||||||
GPXTrackAnalysis a = new GPXTrackAnalysis();
|
GPXTrackAnalysis a = new GPXTrackAnalysis();
|
||||||
a.totalDistance = totalDistance;
|
a.totalDistance = totalDistance;
|
||||||
|
@ -658,6 +695,7 @@ public class GPXDatabase {
|
||||||
item.apiImported = apiImported;
|
item.apiImported = apiImported;
|
||||||
item.showAsMarkers = showAsMarkers;
|
item.showAsMarkers = showAsMarkers;
|
||||||
item.joinSegments = joinSegments;
|
item.joinSegments = joinSegments;
|
||||||
|
item.width = width;
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,12 @@ public class GpxDbHelper {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean updateWidth(GpxDataItem item, String width) {
|
||||||
|
boolean res = db.updateWidth(item, width);
|
||||||
|
putToCache(item);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean updateShowAsMarkers(GpxDataItem item, boolean showAsMarkers) {
|
public boolean updateShowAsMarkers(GpxDataItem item, boolean showAsMarkers) {
|
||||||
boolean res = db.updateShowAsMarkers(item, showAsMarkers);
|
boolean res = db.updateShowAsMarkers(item, showAsMarkers);
|
||||||
putToCache(item);
|
putToCache(item);
|
||||||
|
|
|
@ -51,6 +51,7 @@ public class GpxSelectionHelper {
|
||||||
private static final String BACKUP = "backup";
|
private static final String BACKUP = "backup";
|
||||||
private static final String BACKUPMODIFIEDTIME = "backupTime";
|
private static final String BACKUPMODIFIEDTIME = "backupTime";
|
||||||
private static final String COLOR = "color";
|
private static final String COLOR = "color";
|
||||||
|
private static final String WIDTH = "width";
|
||||||
private static final String SELECTED_BY_USER = "selected_by_user";
|
private static final String SELECTED_BY_USER = "selected_by_user";
|
||||||
|
|
||||||
private OsmandApplication app;
|
private OsmandApplication app;
|
||||||
|
@ -515,6 +516,9 @@ public class GpxSelectionHelper {
|
||||||
int clr = Algorithms.parseColor(obj.getString(COLOR));
|
int clr = Algorithms.parseColor(obj.getString(COLOR));
|
||||||
gpx.setColor(clr);
|
gpx.setColor(clr);
|
||||||
}
|
}
|
||||||
|
if (obj.has(WIDTH)) {
|
||||||
|
gpx.setWidth(obj.getString(WIDTH));
|
||||||
|
}
|
||||||
if (gpx.error != null) {
|
if (gpx.error != null) {
|
||||||
save = true;
|
save = true;
|
||||||
} else if (obj.has(BACKUP)) {
|
} else if (obj.has(BACKUP)) {
|
||||||
|
@ -554,6 +558,9 @@ public class GpxSelectionHelper {
|
||||||
if (s.gpxFile.getColor(0) != 0) {
|
if (s.gpxFile.getColor(0) != 0) {
|
||||||
obj.put(COLOR, Algorithms.colorToString(s.gpxFile.getColor(0)));
|
obj.put(COLOR, Algorithms.colorToString(s.gpxFile.getColor(0)));
|
||||||
}
|
}
|
||||||
|
if (s.gpxFile.getWidth(null) != null) {
|
||||||
|
obj.put(WIDTH, s.gpxFile.getWidth(null));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
obj.put(SELECTED_BY_USER, s.selectedByUser);
|
obj.put(SELECTED_BY_USER, s.selectedByUser);
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
|
@ -606,6 +613,9 @@ public class GpxSelectionHelper {
|
||||||
if (dataItem.getColor() != 0) {
|
if (dataItem.getColor() != 0) {
|
||||||
gpx.setColor(dataItem.getColor());
|
gpx.setColor(dataItem.getColor());
|
||||||
}
|
}
|
||||||
|
if (dataItem.getWidth() != null) {
|
||||||
|
gpx.setWidth(dataItem.getWidth());
|
||||||
|
}
|
||||||
sf.setJoinSegments(dataItem.isJoinSegments());
|
sf.setJoinSegments(dataItem.isJoinSegments());
|
||||||
}
|
}
|
||||||
sf.setGpxFile(gpx, app);
|
sf.setGpxFile(gpx, app);
|
||||||
|
|
|
@ -2,9 +2,7 @@ package net.osmand.plus.dialogs;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
|
@ -25,8 +23,6 @@ import androidx.appcompat.widget.SwitchCompat;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
|
|
||||||
import net.osmand.AndroidUtils;
|
import net.osmand.AndroidUtils;
|
||||||
import net.osmand.CallbackWithObject;
|
|
||||||
import net.osmand.GPXUtilities;
|
|
||||||
import net.osmand.IndexConstants;
|
import net.osmand.IndexConstants;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.core.android.MapRendererContext;
|
import net.osmand.core.android.MapRendererContext;
|
||||||
|
@ -35,20 +31,14 @@ import net.osmand.plus.ContextMenuAdapter.ItemClickListener;
|
||||||
import net.osmand.plus.ContextMenuAdapter.OnRowItemClick;
|
import net.osmand.plus.ContextMenuAdapter.OnRowItemClick;
|
||||||
import net.osmand.plus.ContextMenuItem;
|
import net.osmand.plus.ContextMenuItem;
|
||||||
import net.osmand.plus.DialogListItemAdapter;
|
import net.osmand.plus.DialogListItemAdapter;
|
||||||
import net.osmand.plus.GpxSelectionHelper;
|
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.OsmandPlugin;
|
import net.osmand.plus.OsmandPlugin;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.UiUtilities;
|
import net.osmand.plus.UiUtilities;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
import net.osmand.plus.activities.MapActivityLayers;
|
|
||||||
import net.osmand.plus.activities.PluginActivity;
|
|
||||||
import net.osmand.plus.activities.SettingsActivity;
|
import net.osmand.plus.activities.SettingsActivity;
|
||||||
import net.osmand.plus.dashboard.DashboardOnMap;
|
|
||||||
import net.osmand.plus.inapp.InAppPurchaseHelper;
|
import net.osmand.plus.inapp.InAppPurchaseHelper;
|
||||||
import net.osmand.plus.poi.PoiFiltersHelper;
|
|
||||||
import net.osmand.plus.poi.PoiUIFilter;
|
import net.osmand.plus.poi.PoiUIFilter;
|
||||||
import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin;
|
|
||||||
import net.osmand.plus.render.RendererRegistry;
|
import net.osmand.plus.render.RendererRegistry;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
|
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
|
||||||
|
@ -58,7 +48,6 @@ import net.osmand.plus.transport.TransportLinesMenu;
|
||||||
import net.osmand.plus.views.OsmandMapTileView;
|
import net.osmand.plus.views.OsmandMapTileView;
|
||||||
import net.osmand.plus.views.corenative.NativeCoreContext;
|
import net.osmand.plus.views.corenative.NativeCoreContext;
|
||||||
import net.osmand.plus.wikipedia.WikipediaPoiMenu;
|
import net.osmand.plus.wikipedia.WikipediaPoiMenu;
|
||||||
import net.osmand.render.RenderingRule;
|
|
||||||
import net.osmand.render.RenderingRuleProperty;
|
import net.osmand.render.RenderingRuleProperty;
|
||||||
import net.osmand.render.RenderingRuleStorageProperties;
|
import net.osmand.render.RenderingRuleStorageProperties;
|
||||||
import net.osmand.render.RenderingRulesStorage;
|
import net.osmand.render.RenderingRulesStorage;
|
||||||
|
@ -67,7 +56,6 @@ import net.osmand.util.SunriseSunset;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -101,7 +89,6 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.ROUTES_ID;
|
||||||
import static net.osmand.aidlapi.OsmAndCustomizationConstants.SHOW_CATEGORY_ID;
|
import static net.osmand.aidlapi.OsmAndCustomizationConstants.SHOW_CATEGORY_ID;
|
||||||
import static net.osmand.aidlapi.OsmAndCustomizationConstants.TEXT_SIZE_ID;
|
import static net.osmand.aidlapi.OsmAndCustomizationConstants.TEXT_SIZE_ID;
|
||||||
import static net.osmand.aidlapi.OsmAndCustomizationConstants.TRANSPORT_ID;
|
import static net.osmand.aidlapi.OsmAndCustomizationConstants.TRANSPORT_ID;
|
||||||
import static net.osmand.aidlapi.OsmAndCustomizationConstants.WIKIPEDIA_ID;
|
|
||||||
import static net.osmand.plus.ContextMenuAdapter.makeDeleteAction;
|
import static net.osmand.plus.ContextMenuAdapter.makeDeleteAction;
|
||||||
import static net.osmand.plus.srtmplugin.SRTMPlugin.CONTOUR_DENSITY_ATTR;
|
import static net.osmand.plus.srtmplugin.SRTMPlugin.CONTOUR_DENSITY_ATTR;
|
||||||
import static net.osmand.plus.srtmplugin.SRTMPlugin.CONTOUR_LINES_ATTR;
|
import static net.osmand.plus.srtmplugin.SRTMPlugin.CONTOUR_LINES_ATTR;
|
||||||
|
@ -181,188 +168,13 @@ public class ConfigureMapMenu {
|
||||||
return customRules;
|
return customRules;
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class LayerMenuListener extends OnRowItemClick {
|
|
||||||
private MapActivity ma;
|
|
||||||
private ContextMenuAdapter cm;
|
|
||||||
|
|
||||||
private LayerMenuListener(MapActivity ma, ContextMenuAdapter cm) {
|
|
||||||
this.ma = ma;
|
|
||||||
this.cm = cm;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> getAlreadySelectedGpx() {
|
|
||||||
GpxSelectionHelper selectedGpxHelper = ma.getMyApplication().getSelectedGpxHelper();
|
|
||||||
List<GpxSelectionHelper.SelectedGpxFile> selectedGpxFiles = selectedGpxHelper.getSelectedGPXFiles();
|
|
||||||
|
|
||||||
List<String> files = new ArrayList<>();
|
|
||||||
for (GpxSelectionHelper.SelectedGpxFile file : selectedGpxFiles) {
|
|
||||||
files.add(file.getGpxFile().path);
|
|
||||||
}
|
|
||||||
if (selectedGpxFiles.isEmpty()) {
|
|
||||||
Map<GPXUtilities.GPXFile, Long> fls = selectedGpxHelper.getSelectedGpxFilesBackUp();
|
|
||||||
for(Map.Entry<GPXUtilities.GPXFile, Long> f : fls.entrySet()) {
|
|
||||||
if(!Algorithms.isEmpty(f.getKey().path)) {
|
|
||||||
File file = new File(f.getKey().path);
|
|
||||||
if(file.exists() && !file.isDirectory()) {
|
|
||||||
files.add(f.getKey().path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return files;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onRowItemClick(final ArrayAdapter<ContextMenuItem> adapter, View view, int itemId, int pos) {
|
|
||||||
if (itemId == R.string.layer_poi) {
|
|
||||||
showPoiFilterDialog(adapter, adapter.getItem(pos));
|
|
||||||
return false;
|
|
||||||
} else if (itemId == R.string.layer_gpx_layer && cm.getItem(pos).getSelected()) {
|
|
||||||
showGpxSelectionDialog(adapter, adapter.getItem(pos));
|
|
||||||
return false;
|
|
||||||
} else if (itemId == R.string.rendering_category_transport) {
|
|
||||||
final ContextMenuItem item = adapter.getItem(pos);
|
|
||||||
TransportLinesMenu.showTransportsDialog(ma, new CallbackWithObject<Boolean>() {
|
|
||||||
@Override
|
|
||||||
public boolean processResult(Boolean result) {
|
|
||||||
if (item != null) {
|
|
||||||
item.setSelected(result);
|
|
||||||
item.setColorRes(result ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
|
||||||
adapter.notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
boolean selected = TransportLinesMenu.isShowLines(ma.getMyApplication());
|
|
||||||
if (!selected && item != null) {
|
|
||||||
item.setSelected(true);
|
|
||||||
item.setColorRes(R.color.osmand_orange);
|
|
||||||
adapter.notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
CompoundButton btn = (CompoundButton) view.findViewById(R.id.toggle_item);
|
|
||||||
if (btn != null && btn.getVisibility() == View.VISIBLE) {
|
|
||||||
btn.setChecked(!btn.isChecked());
|
|
||||||
cm.getItem(pos).setColorRes(btn.isChecked() ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
|
||||||
adapter.notifyDataSetChanged();
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
return onContextMenuClick(adapter, itemId, pos, false, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onContextMenuClick(final ArrayAdapter<ContextMenuItem> adapter, int itemId,
|
|
||||||
final int pos, boolean isChecked, int[] viewCoordinates) {
|
|
||||||
final OsmandSettings settings = ma.getMyApplication().getSettings();
|
|
||||||
final PoiFiltersHelper poiFiltersHelper = ma.getMyApplication().getPoiFilters();
|
|
||||||
final ContextMenuItem item = cm.getItem(pos);
|
|
||||||
if (item.getSelected() != null) {
|
|
||||||
item.setColorRes(isChecked ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
|
||||||
}
|
|
||||||
if (itemId == R.string.layer_poi) {
|
|
||||||
PoiUIFilter wiki = poiFiltersHelper.getTopWikiPoiFilter();
|
|
||||||
poiFiltersHelper.clearSelectedPoiFilters(wiki);
|
|
||||||
if (isChecked) {
|
|
||||||
showPoiFilterDialog(adapter, adapter.getItem(pos));
|
|
||||||
} else {
|
|
||||||
adapter.getItem(pos).setDescription(
|
|
||||||
poiFiltersHelper.getSelectedPoiFiltersName(wiki));
|
|
||||||
}
|
|
||||||
} else if (itemId == R.string.layer_amenity_label) {
|
|
||||||
settings.SHOW_POI_LABEL.set(isChecked);
|
|
||||||
} else if (itemId == R.string.shared_string_favorites) {
|
|
||||||
settings.SHOW_FAVORITES.set(isChecked);
|
|
||||||
} else if (itemId == R.string.layer_gpx_layer) {
|
|
||||||
final GpxSelectionHelper selectedGpxHelper = ma.getMyApplication().getSelectedGpxHelper();
|
|
||||||
if (selectedGpxHelper.isShowingAnyGpxFiles()) {
|
|
||||||
selectedGpxHelper.clearAllGpxFilesToShow(true);
|
|
||||||
adapter.getItem(pos).setDescription(selectedGpxHelper.getGpxDescription());
|
|
||||||
} else {
|
|
||||||
showGpxSelectionDialog(adapter, adapter.getItem(pos));
|
|
||||||
}
|
|
||||||
} else if (itemId == R.string.rendering_category_transport) {
|
|
||||||
boolean selected = TransportLinesMenu.isShowLines(ma.getMyApplication());
|
|
||||||
TransportLinesMenu.toggleTransportLines(ma, !selected, new CallbackWithObject<Boolean>() {
|
|
||||||
@Override
|
|
||||||
public boolean processResult(Boolean result) {
|
|
||||||
item.setSelected(result);
|
|
||||||
item.setColorRes(result ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
|
||||||
adapter.notifyDataSetChanged();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else if (itemId == R.string.map_markers) {
|
|
||||||
settings.SHOW_MAP_MARKERS.set(isChecked);
|
|
||||||
} else if (itemId == R.string.layer_map) {
|
|
||||||
if (OsmandPlugin.getEnabledPlugin(OsmandRasterMapsPlugin.class) == null) {
|
|
||||||
Intent intent = new Intent(ma, PluginActivity.class);
|
|
||||||
intent.putExtra(PluginActivity.EXTRA_PLUGIN_ID, OsmandRasterMapsPlugin.ID);
|
|
||||||
ma.startActivity(intent);
|
|
||||||
} else {
|
|
||||||
ContextMenuItem it = adapter.getItem(pos);
|
|
||||||
ma.getMapLayers().selectMapLayer(ma.getMapView(), it, adapter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
adapter.notifyDataSetChanged();
|
|
||||||
ma.getMapLayers().updateLayers(ma.getMapView());
|
|
||||||
ma.getMapView().refreshMap();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showGpxSelectionDialog(final ArrayAdapter<ContextMenuItem> adapter,
|
|
||||||
final ContextMenuItem item) {
|
|
||||||
AlertDialog dialog = ma.getMapLayers().showGPXFileLayer(getAlreadySelectedGpx(),
|
|
||||||
ma.getMapView());
|
|
||||||
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
|
|
||||||
@Override
|
|
||||||
public void onDismiss(DialogInterface dialog) {
|
|
||||||
OsmandApplication app = ma.getMyApplication();
|
|
||||||
boolean selected = app.getSelectedGpxHelper().isShowingAnyGpxFiles();
|
|
||||||
item.setSelected(selected);
|
|
||||||
item.setDescription(app.getSelectedGpxHelper().getGpxDescription());
|
|
||||||
item.setColorRes(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
|
||||||
adapter.notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void showPoiFilterDialog(final ArrayAdapter<ContextMenuItem> adapter,
|
|
||||||
final ContextMenuItem item) {
|
|
||||||
final PoiFiltersHelper poiFiltersHelper = ma.getMyApplication().getPoiFilters();
|
|
||||||
final PoiUIFilter wiki = poiFiltersHelper.getTopWikiPoiFilter();
|
|
||||||
MapActivityLayers.DismissListener dismissListener =
|
|
||||||
new MapActivityLayers.DismissListener() {
|
|
||||||
@Override
|
|
||||||
public void dismiss() {
|
|
||||||
PoiFiltersHelper pf = ma.getMyApplication().getPoiFilters();
|
|
||||||
boolean selected = pf.isShowingAnyPoi(wiki);
|
|
||||||
item.setSelected(selected);
|
|
||||||
item.setDescription(pf.getSelectedPoiFiltersName(wiki));
|
|
||||||
item.setColorRes(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
|
||||||
adapter.notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if (poiFiltersHelper.isShowingAnyPoi(wiki)) {
|
|
||||||
ma.getMapLayers().showMultichoicePoiFilterDialog(ma.getMapView(),
|
|
||||||
dismissListener);
|
|
||||||
} else {
|
|
||||||
ma.getMapLayers().showSingleChoicePoiFilterDialog(ma.getMapView(),
|
|
||||||
dismissListener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void createLayersItems(List<RenderingRuleProperty> customRules, ContextMenuAdapter adapter,
|
private void createLayersItems(List<RenderingRuleProperty> customRules, ContextMenuAdapter adapter,
|
||||||
final MapActivity activity, final int themeRes, final boolean nightMode) {
|
final MapActivity activity, final int themeRes, final boolean nightMode) {
|
||||||
final OsmandApplication app = activity.getMyApplication();
|
final OsmandApplication app = activity.getMyApplication();
|
||||||
final OsmandSettings settings = app.getSettings();
|
final OsmandSettings settings = app.getSettings();
|
||||||
final int selectedProfileColorRes = settings.getApplicationMode().getIconColorInfo().getColor(nightMode);
|
final int selectedProfileColorRes = settings.getApplicationMode().getIconColorInfo().getColor(nightMode);
|
||||||
final int selectedProfileColor = ContextCompat.getColor(app, selectedProfileColorRes);
|
final int selectedProfileColor = ContextCompat.getColor(app, selectedProfileColorRes);
|
||||||
LayerMenuListener l = new LayerMenuListener(activity, adapter);
|
MapLayerMenuListener l = new MapLayerMenuListener(activity, adapter);
|
||||||
adapter.addItem(new ContextMenuItem.ItemBuilder()
|
adapter.addItem(new ContextMenuItem.ItemBuilder()
|
||||||
.setId(SHOW_CATEGORY_ID)
|
.setId(SHOW_CATEGORY_ID)
|
||||||
.setTitleId(R.string.shared_string_show, activity)
|
.setTitleId(R.string.shared_string_show, activity)
|
||||||
|
@ -1299,230 +1111,35 @@ public class ConfigureMapMenu {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class StringSpinnerArrayAdapter extends ArrayAdapter<String> {
|
private static class StringSpinnerArrayAdapter extends ArrayAdapter<String> {
|
||||||
|
|
||||||
private boolean nightMode;
|
private boolean nightMode;
|
||||||
|
|
||||||
public StringSpinnerArrayAdapter(Context context, boolean nightMode) {
|
public StringSpinnerArrayAdapter(Context context, boolean nightMode) {
|
||||||
super(context, android.R.layout.simple_spinner_item);
|
super(context, android.R.layout.simple_spinner_item);
|
||||||
setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||||
OsmandApplication app = (OsmandApplication )getContext().getApplicationContext();
|
|
||||||
this.nightMode = nightMode;
|
this.nightMode = nightMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public View getView(int position, View convertView, ViewGroup parent) {
|
|
||||||
TextView label = (TextView) super.getView(position, convertView, parent);
|
|
||||||
|
|
||||||
String text = getItem(position);
|
|
||||||
label.setText(text);
|
|
||||||
label.setTextColor(nightMode ?
|
|
||||||
ContextCompat.getColorStateList(getContext(), R.color.text_color_primary_dark) : ContextCompat.getColorStateList(getContext(), R.color.text_color_primary_light));
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View getDropDownView(int position, View convertView, ViewGroup parent) {
|
|
||||||
TextView label = (TextView) super.getDropDownView(position, convertView, parent);
|
|
||||||
|
|
||||||
String text = getItem(position);
|
|
||||||
label.setText(text);
|
|
||||||
label.setTextColor(nightMode ?
|
|
||||||
ContextCompat.getColorStateList(getContext(), R.color.text_color_primary_dark) : ContextCompat.getColorStateList(getContext(), R.color.text_color_primary_light));
|
|
||||||
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class GpxAppearanceAdapter extends ArrayAdapter<AppearanceListItem> {
|
|
||||||
|
|
||||||
private OsmandApplication app;
|
|
||||||
private int currentColor;
|
|
||||||
private GpxAppearanceAdapterType adapterType = GpxAppearanceAdapterType.TRACK_WIDTH_COLOR;
|
|
||||||
|
|
||||||
public enum GpxAppearanceAdapterType {
|
|
||||||
TRACK_WIDTH,
|
|
||||||
TRACK_COLOR,
|
|
||||||
TRACK_WIDTH_COLOR
|
|
||||||
}
|
|
||||||
|
|
||||||
public GpxAppearanceAdapter(Context context, String currentColorValue, GpxAppearanceAdapterType adapterType) {
|
|
||||||
super(context, R.layout.rendering_prop_menu_item);
|
|
||||||
this.app = (OsmandApplication) getContext().getApplicationContext();
|
|
||||||
this.adapterType = adapterType;
|
|
||||||
RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer();
|
|
||||||
this.currentColor = parseTrackColor(renderer, currentColorValue);
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
public GpxAppearanceAdapter(Context context, int currentColor, GpxAppearanceAdapterType adapterType) {
|
|
||||||
super(context, R.layout.rendering_prop_menu_item);
|
|
||||||
this.app = (OsmandApplication) getContext().getApplicationContext();
|
|
||||||
this.adapterType = adapterType;
|
|
||||||
this.currentColor = currentColor;
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void init() {
|
|
||||||
RenderingRuleProperty trackWidthProp = null;
|
|
||||||
RenderingRuleProperty trackColorProp = null;
|
|
||||||
RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer();
|
|
||||||
if (renderer != null) {
|
|
||||||
if (adapterType == GpxAppearanceAdapterType.TRACK_WIDTH || adapterType == GpxAppearanceAdapterType.TRACK_WIDTH_COLOR) {
|
|
||||||
trackWidthProp = renderer.PROPS.getCustomRule(CURRENT_TRACK_WIDTH_ATTR);
|
|
||||||
}
|
|
||||||
if (adapterType == GpxAppearanceAdapterType.TRACK_COLOR || adapterType == GpxAppearanceAdapterType.TRACK_WIDTH_COLOR) {
|
|
||||||
trackColorProp = renderer.PROPS.getCustomRule(CURRENT_TRACK_COLOR_ATTR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (trackWidthProp != null) {
|
|
||||||
AppearanceListItem item = new AppearanceListItem(CURRENT_TRACK_WIDTH_ATTR, "",
|
|
||||||
SettingsActivity.getStringPropertyValue(getContext(), trackWidthProp.getDefaultValueDescription()));
|
|
||||||
add(item);
|
|
||||||
for (int j = 0; j < trackWidthProp.getPossibleValues().length; j++) {
|
|
||||||
item = new AppearanceListItem(CURRENT_TRACK_WIDTH_ATTR,
|
|
||||||
trackWidthProp.getPossibleValues()[j],
|
|
||||||
SettingsActivity.getStringPropertyValue(getContext(), trackWidthProp.getPossibleValues()[j]));
|
|
||||||
add(item);
|
|
||||||
}
|
|
||||||
item.setLastItem(true);
|
|
||||||
}
|
|
||||||
if (trackColorProp != null) {
|
|
||||||
AppearanceListItem item = new AppearanceListItem(CURRENT_TRACK_COLOR_ATTR, "",
|
|
||||||
SettingsActivity.getStringPropertyValue(getContext(), trackColorProp.getDefaultValueDescription()),
|
|
||||||
parseTrackColor(renderer, ""));
|
|
||||||
add(item);
|
|
||||||
for (int j = 0; j < trackColorProp.getPossibleValues().length; j++) {
|
|
||||||
item = new AppearanceListItem(CURRENT_TRACK_COLOR_ATTR,
|
|
||||||
trackColorProp.getPossibleValues()[j],
|
|
||||||
SettingsActivity.getStringPropertyValue(getContext(), trackColorProp.getPossibleValues()[j]),
|
|
||||||
parseTrackColor(renderer, trackColorProp.getPossibleValues()[j]));
|
|
||||||
add(item);
|
|
||||||
}
|
|
||||||
item.setLastItem(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int parseTrackColor(RenderingRulesStorage renderer, String colorName) {
|
|
||||||
int defaultColor = -1;
|
|
||||||
RenderingRule gpxRule = null;
|
|
||||||
if (renderer != null) {
|
|
||||||
gpxRule = renderer.getRenderingAttributeRule("gpx");
|
|
||||||
}
|
|
||||||
if (gpxRule != null && gpxRule.getIfElseChildren().size() > 0) {
|
|
||||||
List<RenderingRule> rules = gpxRule.getIfElseChildren().get(0).getIfElseChildren();
|
|
||||||
for (RenderingRule r : rules) {
|
|
||||||
String cName = r.getStringPropertyValue(CURRENT_TRACK_COLOR_ATTR);
|
|
||||||
if (!Algorithms.isEmpty(cName) && cName.equals(colorName)) {
|
|
||||||
return r.getIntPropertyValue(COLOR_ATTR);
|
|
||||||
}
|
|
||||||
if (cName == null && defaultColor == -1) {
|
|
||||||
defaultColor = r.getIntPropertyValue(COLOR_ATTR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return defaultColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String parseTrackColorName(RenderingRulesStorage renderer, int color) {
|
|
||||||
RenderingRule gpxRule = null;
|
|
||||||
if (renderer != null) {
|
|
||||||
gpxRule = renderer.getRenderingAttributeRule("gpx");
|
|
||||||
}
|
|
||||||
if (gpxRule != null && gpxRule.getIfElseChildren().size() > 0) {
|
|
||||||
List<RenderingRule> rules = gpxRule.getIfElseChildren().get(0).getIfElseChildren();
|
|
||||||
for (RenderingRule r : rules) {
|
|
||||||
String cName = r.getStringPropertyValue(CURRENT_TRACK_COLOR_ATTR);
|
|
||||||
if (!Algorithms.isEmpty(cName) && color == r.getIntPropertyValue(COLOR_ATTR)) {
|
|
||||||
return cName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Algorithms.colorToString(color);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
|
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
|
||||||
AppearanceListItem item = getItem(position);
|
TextView label = (TextView) super.getView(position, convertView, parent);
|
||||||
View v = convertView;
|
setupLabel(label, getItem(position));
|
||||||
if (v == null) {
|
return label;
|
||||||
v = LayoutInflater.from(getContext()).inflate(R.layout.rendering_prop_menu_item, null);
|
|
||||||
}
|
|
||||||
if (item != null) {
|
|
||||||
TextView textView = (TextView) v.findViewById(R.id.text1);
|
|
||||||
textView.setText(item.localizedValue);
|
|
||||||
if (item.attrName == CURRENT_TRACK_WIDTH_ATTR) {
|
|
||||||
int iconId;
|
|
||||||
if (item.value.equals("bold")) {
|
|
||||||
iconId = R.drawable.ic_action_gpx_width_bold;
|
|
||||||
} else if (item.value.equals("medium")) {
|
|
||||||
iconId = R.drawable.ic_action_gpx_width_medium;
|
|
||||||
} else {
|
|
||||||
iconId = R.drawable.ic_action_gpx_width_thin;
|
|
||||||
}
|
|
||||||
textView.setCompoundDrawablesWithIntrinsicBounds(null, null,
|
|
||||||
app.getUIUtilities().getPaintedIcon(iconId, currentColor), null);
|
|
||||||
} else {
|
|
||||||
if (item.color == -1) {
|
|
||||||
textView.setCompoundDrawablesWithIntrinsicBounds(null, null,
|
|
||||||
app.getUIUtilities().getThemedIcon(R.drawable.ic_action_circle), null);
|
|
||||||
} else {
|
|
||||||
textView.setCompoundDrawablesWithIntrinsicBounds(null, null,
|
|
||||||
app.getUIUtilities().getPaintedIcon(R.drawable.ic_action_circle, item.color), null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
textView.setCompoundDrawablePadding(AndroidUtils.dpToPx(getContext(), 10f));
|
|
||||||
v.findViewById(R.id.divider).setVisibility(item.lastItem
|
|
||||||
&& position < getCount() - 1 ? View.VISIBLE : View.GONE);
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class AppearanceListItem {
|
|
||||||
private String attrName;
|
|
||||||
private String value;
|
|
||||||
private String localizedValue;
|
|
||||||
private int color;
|
|
||||||
private boolean lastItem;
|
|
||||||
|
|
||||||
public AppearanceListItem(String attrName, String value, String localizedValue) {
|
|
||||||
this.attrName = attrName;
|
|
||||||
this.value = value;
|
|
||||||
this.localizedValue = localizedValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public AppearanceListItem(String attrName, String value, String localizedValue, int color) {
|
@Override
|
||||||
this.attrName = attrName;
|
public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) {
|
||||||
this.value = value;
|
TextView label = (TextView) super.getDropDownView(position, convertView, parent);
|
||||||
this.localizedValue = localizedValue;
|
setupLabel(label, getItem(position));
|
||||||
this.color = color;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAttrName() {
|
private void setupLabel(TextView label, String text) {
|
||||||
return attrName;
|
int colorId = nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light;
|
||||||
}
|
label.setText(text);
|
||||||
|
label.setTextColor(ContextCompat.getColorStateList(getContext(), colorId));
|
||||||
public String getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLocalizedValue() {
|
|
||||||
return localizedValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getColor() {
|
|
||||||
return color;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isLastItem() {
|
|
||||||
return lastItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLastItem(boolean lastItem) {
|
|
||||||
this.lastItem = lastItem;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
214
OsmAnd/src/net/osmand/plus/dialogs/GpxAppearanceAdapter.java
Normal file
214
OsmAnd/src/net/osmand/plus/dialogs/GpxAppearanceAdapter.java
Normal file
|
@ -0,0 +1,214 @@
|
||||||
|
package net.osmand.plus.dialogs;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ArrayAdapter;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import net.osmand.AndroidUtils;
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.R;
|
||||||
|
import net.osmand.plus.activities.SettingsActivity;
|
||||||
|
import net.osmand.render.RenderingRule;
|
||||||
|
import net.osmand.render.RenderingRuleProperty;
|
||||||
|
import net.osmand.render.RenderingRulesStorage;
|
||||||
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class GpxAppearanceAdapter extends ArrayAdapter<GpxAppearanceAdapter.AppearanceListItem> {
|
||||||
|
|
||||||
|
private OsmandApplication app;
|
||||||
|
private GpxAppearanceAdapterType adapterType;
|
||||||
|
private int currentColor;
|
||||||
|
|
||||||
|
public enum GpxAppearanceAdapterType {
|
||||||
|
TRACK_WIDTH,
|
||||||
|
TRACK_COLOR,
|
||||||
|
TRACK_WIDTH_COLOR
|
||||||
|
}
|
||||||
|
|
||||||
|
public GpxAppearanceAdapter(Context context, String currentColorValue, GpxAppearanceAdapterType adapterType) {
|
||||||
|
super(context, R.layout.rendering_prop_menu_item);
|
||||||
|
this.app = (OsmandApplication) context.getApplicationContext();
|
||||||
|
this.adapterType = adapterType;
|
||||||
|
RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer();
|
||||||
|
this.currentColor = parseTrackColor(renderer, currentColorValue);
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
public GpxAppearanceAdapter(Context context, int currentColor, GpxAppearanceAdapterType adapterType) {
|
||||||
|
super(context, R.layout.rendering_prop_menu_item);
|
||||||
|
this.app = (OsmandApplication) context.getApplicationContext();
|
||||||
|
this.adapterType = adapterType;
|
||||||
|
this.currentColor = currentColor;
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
|
||||||
|
AppearanceListItem item = getItem(position);
|
||||||
|
View v = convertView;
|
||||||
|
if (v == null) {
|
||||||
|
v = LayoutInflater.from(getContext()).inflate(R.layout.rendering_prop_menu_item, null);
|
||||||
|
}
|
||||||
|
if (item != null) {
|
||||||
|
TextView textView = (TextView) v.findViewById(R.id.text1);
|
||||||
|
textView.setText(item.localizedValue);
|
||||||
|
if (ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR.equals(item.attrName)) {
|
||||||
|
int iconId;
|
||||||
|
if ("bold".equals(item.value)) {
|
||||||
|
iconId = R.drawable.ic_action_gpx_width_bold;
|
||||||
|
} else if ("medium".equals(item.value)) {
|
||||||
|
iconId = R.drawable.ic_action_gpx_width_medium;
|
||||||
|
} else {
|
||||||
|
iconId = R.drawable.ic_action_gpx_width_thin;
|
||||||
|
}
|
||||||
|
textView.setCompoundDrawablesWithIntrinsicBounds(null, null,
|
||||||
|
app.getUIUtilities().getPaintedIcon(iconId, currentColor), null);
|
||||||
|
} else {
|
||||||
|
if (item.color == -1) {
|
||||||
|
textView.setCompoundDrawablesWithIntrinsicBounds(null, null,
|
||||||
|
app.getUIUtilities().getThemedIcon(R.drawable.ic_action_circle), null);
|
||||||
|
} else {
|
||||||
|
textView.setCompoundDrawablesWithIntrinsicBounds(null, null,
|
||||||
|
app.getUIUtilities().getPaintedIcon(R.drawable.ic_action_circle, item.color), null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
textView.setCompoundDrawablePadding(AndroidUtils.dpToPx(getContext(), 10f));
|
||||||
|
v.findViewById(R.id.divider).setVisibility(item.lastItem
|
||||||
|
&& position < getCount() - 1 ? View.VISIBLE : View.GONE);
|
||||||
|
}
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init() {
|
||||||
|
RenderingRuleProperty trackWidthProp = null;
|
||||||
|
RenderingRuleProperty trackColorProp = null;
|
||||||
|
RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer();
|
||||||
|
if (renderer != null) {
|
||||||
|
if (adapterType == GpxAppearanceAdapterType.TRACK_WIDTH || adapterType == GpxAppearanceAdapterType.TRACK_WIDTH_COLOR) {
|
||||||
|
trackWidthProp = renderer.PROPS.getCustomRule(ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR);
|
||||||
|
}
|
||||||
|
if (adapterType == GpxAppearanceAdapterType.TRACK_COLOR || adapterType == GpxAppearanceAdapterType.TRACK_WIDTH_COLOR) {
|
||||||
|
trackColorProp = renderer.PROPS.getCustomRule(ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trackWidthProp != null) {
|
||||||
|
AppearanceListItem item = new AppearanceListItem(ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR, "",
|
||||||
|
SettingsActivity.getStringPropertyValue(getContext(), trackWidthProp.getDefaultValueDescription()));
|
||||||
|
add(item);
|
||||||
|
for (int j = 0; j < trackWidthProp.getPossibleValues().length; j++) {
|
||||||
|
item = new AppearanceListItem(ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR,
|
||||||
|
trackWidthProp.getPossibleValues()[j],
|
||||||
|
SettingsActivity.getStringPropertyValue(getContext(), trackWidthProp.getPossibleValues()[j]));
|
||||||
|
add(item);
|
||||||
|
}
|
||||||
|
item.setLastItem(true);
|
||||||
|
}
|
||||||
|
if (trackColorProp != null) {
|
||||||
|
AppearanceListItem item = new AppearanceListItem(ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR, "",
|
||||||
|
SettingsActivity.getStringPropertyValue(getContext(), trackColorProp.getDefaultValueDescription()),
|
||||||
|
parseTrackColor(renderer, ""));
|
||||||
|
add(item);
|
||||||
|
for (int j = 0; j < trackColorProp.getPossibleValues().length; j++) {
|
||||||
|
item = new AppearanceListItem(ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR,
|
||||||
|
trackColorProp.getPossibleValues()[j],
|
||||||
|
SettingsActivity.getStringPropertyValue(getContext(), trackColorProp.getPossibleValues()[j]),
|
||||||
|
parseTrackColor(renderer, trackColorProp.getPossibleValues()[j]));
|
||||||
|
add(item);
|
||||||
|
}
|
||||||
|
item.setLastItem(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int parseTrackColor(RenderingRulesStorage renderer, String colorName) {
|
||||||
|
int defaultColor = -1;
|
||||||
|
RenderingRule gpxRule = null;
|
||||||
|
if (renderer != null) {
|
||||||
|
gpxRule = renderer.getRenderingAttributeRule("gpx");
|
||||||
|
}
|
||||||
|
if (gpxRule != null && gpxRule.getIfElseChildren().size() > 0) {
|
||||||
|
List<RenderingRule> rules = gpxRule.getIfElseChildren().get(0).getIfElseChildren();
|
||||||
|
for (RenderingRule r : rules) {
|
||||||
|
String cName = r.getStringPropertyValue(ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR);
|
||||||
|
if (!Algorithms.isEmpty(cName) && cName.equals(colorName)) {
|
||||||
|
return r.getIntPropertyValue(ConfigureMapMenu.COLOR_ATTR);
|
||||||
|
}
|
||||||
|
if (cName == null && defaultColor == -1) {
|
||||||
|
defaultColor = r.getIntPropertyValue(ConfigureMapMenu.COLOR_ATTR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return defaultColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String parseTrackColorName(RenderingRulesStorage renderer, int color) {
|
||||||
|
RenderingRule gpxRule = null;
|
||||||
|
if (renderer != null) {
|
||||||
|
gpxRule = renderer.getRenderingAttributeRule("gpx");
|
||||||
|
}
|
||||||
|
if (gpxRule != null && gpxRule.getIfElseChildren().size() > 0) {
|
||||||
|
List<RenderingRule> rules = gpxRule.getIfElseChildren().get(0).getIfElseChildren();
|
||||||
|
for (RenderingRule r : rules) {
|
||||||
|
String cName = r.getStringPropertyValue(ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR);
|
||||||
|
if (!Algorithms.isEmpty(cName) && color == r.getIntPropertyValue(ConfigureMapMenu.COLOR_ATTR)) {
|
||||||
|
return cName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Algorithms.colorToString(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class AppearanceListItem {
|
||||||
|
|
||||||
|
private String attrName;
|
||||||
|
private String value;
|
||||||
|
private String localizedValue;
|
||||||
|
private int color;
|
||||||
|
private boolean lastItem;
|
||||||
|
|
||||||
|
public AppearanceListItem(String attrName, String value, String localizedValue) {
|
||||||
|
this.attrName = attrName;
|
||||||
|
this.value = value;
|
||||||
|
this.localizedValue = localizedValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppearanceListItem(String attrName, String value, String localizedValue, int color) {
|
||||||
|
this.attrName = attrName;
|
||||||
|
this.value = value;
|
||||||
|
this.localizedValue = localizedValue;
|
||||||
|
this.color = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAttrName() {
|
||||||
|
return attrName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLocalizedValue() {
|
||||||
|
return localizedValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getColor() {
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isLastItem() {
|
||||||
|
return lastItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastItem(boolean lastItem) {
|
||||||
|
this.lastItem = lastItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
229
OsmAnd/src/net/osmand/plus/dialogs/MapLayerMenuListener.java
Normal file
229
OsmAnd/src/net/osmand/plus/dialogs/MapLayerMenuListener.java
Normal file
|
@ -0,0 +1,229 @@
|
||||||
|
package net.osmand.plus.dialogs;
|
||||||
|
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.ArrayAdapter;
|
||||||
|
import android.widget.CompoundButton;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
|
||||||
|
import net.osmand.AndroidUtils;
|
||||||
|
import net.osmand.CallbackWithObject;
|
||||||
|
import net.osmand.GPXUtilities.GPXFile;
|
||||||
|
import net.osmand.plus.ContextMenuAdapter;
|
||||||
|
import net.osmand.plus.ContextMenuAdapter.OnRowItemClick;
|
||||||
|
import net.osmand.plus.ContextMenuItem;
|
||||||
|
import net.osmand.plus.GpxSelectionHelper;
|
||||||
|
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.OsmandPlugin;
|
||||||
|
import net.osmand.plus.R;
|
||||||
|
import net.osmand.plus.activities.MapActivity;
|
||||||
|
import net.osmand.plus.activities.MapActivityLayers;
|
||||||
|
import net.osmand.plus.activities.PluginActivity;
|
||||||
|
import net.osmand.plus.dashboard.DashboardOnMap;
|
||||||
|
import net.osmand.plus.poi.PoiFiltersHelper;
|
||||||
|
import net.osmand.plus.poi.PoiUIFilter;
|
||||||
|
import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin;
|
||||||
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
|
import net.osmand.plus.transport.TransportLinesMenu;
|
||||||
|
import net.osmand.plus.wikipedia.WikipediaPoiMenu;
|
||||||
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
final class MapLayerMenuListener extends OnRowItemClick {
|
||||||
|
|
||||||
|
private MapActivity mapActivity;
|
||||||
|
private ContextMenuAdapter menuAdapter;
|
||||||
|
|
||||||
|
MapLayerMenuListener(MapActivity mapActivity, ContextMenuAdapter menuAdapter) {
|
||||||
|
this.mapActivity = mapActivity;
|
||||||
|
this.menuAdapter = menuAdapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getAlreadySelectedGpx() {
|
||||||
|
GpxSelectionHelper selectedGpxHelper = mapActivity.getMyApplication().getSelectedGpxHelper();
|
||||||
|
List<SelectedGpxFile> selectedGpxFiles = selectedGpxHelper.getSelectedGPXFiles();
|
||||||
|
|
||||||
|
List<String> files = new ArrayList<>();
|
||||||
|
for (SelectedGpxFile file : selectedGpxFiles) {
|
||||||
|
files.add(file.getGpxFile().path);
|
||||||
|
}
|
||||||
|
if (selectedGpxFiles.isEmpty()) {
|
||||||
|
Map<GPXFile, Long> fls = selectedGpxHelper.getSelectedGpxFilesBackUp();
|
||||||
|
for (Map.Entry<GPXFile, Long> f : fls.entrySet()) {
|
||||||
|
if (!Algorithms.isEmpty(f.getKey().path)) {
|
||||||
|
File file = new File(f.getKey().path);
|
||||||
|
if (file.exists() && !file.isDirectory()) {
|
||||||
|
files.add(f.getKey().path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onRowItemClick(final ArrayAdapter<ContextMenuItem> adapter, View view, int itemId, int pos) {
|
||||||
|
if (itemId == R.string.layer_poi) {
|
||||||
|
showPoiFilterDialog(adapter, adapter.getItem(pos));
|
||||||
|
return false;
|
||||||
|
} else if (itemId == R.string.layer_gpx_layer && menuAdapter.getItem(pos).getSelected()) {
|
||||||
|
showGpxSelectionDialog(adapter, adapter.getItem(pos));
|
||||||
|
return false;
|
||||||
|
} else if (itemId == R.string.shared_string_wikipedia) {
|
||||||
|
mapActivity.getDashboard().setDashboardVisibility(true, DashboardOnMap.DashboardType.WIKIPEDIA,
|
||||||
|
AndroidUtils.getCenterViewCoordinates(view));
|
||||||
|
return false;
|
||||||
|
} else if (itemId == R.string.rendering_category_transport) {
|
||||||
|
final ContextMenuItem item = adapter.getItem(pos);
|
||||||
|
TransportLinesMenu.showTransportsDialog(mapActivity, new CallbackWithObject<Boolean>() {
|
||||||
|
@Override
|
||||||
|
public boolean processResult(Boolean result) {
|
||||||
|
if (item != null) {
|
||||||
|
item.setSelected(result);
|
||||||
|
item.setColorRes(result ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
boolean selected = TransportLinesMenu.isShowLines(mapActivity.getMyApplication());
|
||||||
|
if (!selected && item != null) {
|
||||||
|
item.setSelected(true);
|
||||||
|
item.setColorRes(R.color.osmand_orange);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
CompoundButton btn = (CompoundButton) view.findViewById(R.id.toggle_item);
|
||||||
|
if (btn != null && btn.getVisibility() == View.VISIBLE) {
|
||||||
|
btn.setChecked(!btn.isChecked());
|
||||||
|
menuAdapter.getItem(pos).setColorRes(btn.isChecked() ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return onContextMenuClick(adapter, itemId, pos, false, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onContextMenuClick(final ArrayAdapter<ContextMenuItem> adapter, int itemId,
|
||||||
|
final int pos, boolean isChecked, int[] viewCoordinates) {
|
||||||
|
final OsmandSettings settings = mapActivity.getMyApplication().getSettings();
|
||||||
|
final PoiFiltersHelper poiFiltersHelper = mapActivity.getMyApplication().getPoiFilters();
|
||||||
|
final ContextMenuItem item = menuAdapter.getItem(pos);
|
||||||
|
if (item.getSelected() != null) {
|
||||||
|
item.setColorRes(isChecked ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||||
|
}
|
||||||
|
if (itemId == R.string.layer_poi) {
|
||||||
|
PoiUIFilter wiki = poiFiltersHelper.getTopWikiPoiFilter();
|
||||||
|
poiFiltersHelper.clearSelectedPoiFilters(wiki);
|
||||||
|
if (isChecked) {
|
||||||
|
showPoiFilterDialog(adapter, adapter.getItem(pos));
|
||||||
|
} else {
|
||||||
|
adapter.getItem(pos).setDescription(
|
||||||
|
poiFiltersHelper.getSelectedPoiFiltersName(wiki));
|
||||||
|
}
|
||||||
|
} else if (itemId == R.string.layer_amenity_label) {
|
||||||
|
settings.SHOW_POI_LABEL.set(isChecked);
|
||||||
|
} else if (itemId == R.string.shared_string_favorites) {
|
||||||
|
settings.SHOW_FAVORITES.set(isChecked);
|
||||||
|
} else if (itemId == R.string.layer_gpx_layer) {
|
||||||
|
final GpxSelectionHelper selectedGpxHelper = mapActivity.getMyApplication().getSelectedGpxHelper();
|
||||||
|
if (selectedGpxHelper.isShowingAnyGpxFiles()) {
|
||||||
|
selectedGpxHelper.clearAllGpxFilesToShow(true);
|
||||||
|
adapter.getItem(pos).setDescription(selectedGpxHelper.getGpxDescription());
|
||||||
|
} else {
|
||||||
|
showGpxSelectionDialog(adapter, adapter.getItem(pos));
|
||||||
|
}
|
||||||
|
} else if (itemId == R.string.shared_string_wikipedia) {
|
||||||
|
WikipediaPoiMenu.toggleWikipediaPoi(mapActivity, isChecked, new CallbackWithObject<Boolean>() {
|
||||||
|
@Override
|
||||||
|
public boolean processResult(Boolean selected) {
|
||||||
|
item.setSelected(selected);
|
||||||
|
item.setColorRes(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||||
|
item.setDescription(selected ?
|
||||||
|
WikipediaPoiMenu.getLanguagesSummary(mapActivity.getMyApplication()) : null);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (itemId == R.string.rendering_category_transport) {
|
||||||
|
boolean selected = TransportLinesMenu.isShowLines(mapActivity.getMyApplication());
|
||||||
|
TransportLinesMenu.toggleTransportLines(mapActivity, !selected, new CallbackWithObject<Boolean>() {
|
||||||
|
@Override
|
||||||
|
public boolean processResult(Boolean result) {
|
||||||
|
item.setSelected(result);
|
||||||
|
item.setColorRes(result ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (itemId == R.string.map_markers) {
|
||||||
|
settings.SHOW_MAP_MARKERS.set(isChecked);
|
||||||
|
} else if (itemId == R.string.layer_map) {
|
||||||
|
if (OsmandPlugin.getEnabledPlugin(OsmandRasterMapsPlugin.class) == null) {
|
||||||
|
Intent intent = new Intent(mapActivity, PluginActivity.class);
|
||||||
|
intent.putExtra(PluginActivity.EXTRA_PLUGIN_ID, OsmandRasterMapsPlugin.ID);
|
||||||
|
mapActivity.startActivity(intent);
|
||||||
|
} else {
|
||||||
|
ContextMenuItem it = adapter.getItem(pos);
|
||||||
|
mapActivity.getMapLayers().selectMapLayer(mapActivity.getMapView(), it, adapter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
mapActivity.getMapLayers().updateLayers(mapActivity.getMapView());
|
||||||
|
mapActivity.getMapView().refreshMap();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showGpxSelectionDialog(final ArrayAdapter<ContextMenuItem> adapter,
|
||||||
|
final ContextMenuItem item) {
|
||||||
|
AlertDialog dialog = mapActivity.getMapLayers().showGPXFileLayer(getAlreadySelectedGpx(),
|
||||||
|
mapActivity.getMapView());
|
||||||
|
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
|
||||||
|
@Override
|
||||||
|
public void onDismiss(DialogInterface dialog) {
|
||||||
|
OsmandApplication app = mapActivity.getMyApplication();
|
||||||
|
boolean selected = app.getSelectedGpxHelper().isShowingAnyGpxFiles();
|
||||||
|
item.setSelected(selected);
|
||||||
|
item.setDescription(app.getSelectedGpxHelper().getGpxDescription());
|
||||||
|
item.setColorRes(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void showPoiFilterDialog(final ArrayAdapter<ContextMenuItem> adapter,
|
||||||
|
final ContextMenuItem item) {
|
||||||
|
final PoiFiltersHelper poiFiltersHelper = mapActivity.getMyApplication().getPoiFilters();
|
||||||
|
final PoiUIFilter wiki = poiFiltersHelper.getTopWikiPoiFilter();
|
||||||
|
MapActivityLayers.DismissListener dismissListener =
|
||||||
|
new MapActivityLayers.DismissListener() {
|
||||||
|
@Override
|
||||||
|
public void dismiss() {
|
||||||
|
PoiFiltersHelper pf = mapActivity.getMyApplication().getPoiFilters();
|
||||||
|
boolean selected = pf.isShowingAnyPoi(wiki);
|
||||||
|
item.setSelected(selected);
|
||||||
|
item.setDescription(pf.getSelectedPoiFiltersName(wiki));
|
||||||
|
item.setColorRes(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (poiFiltersHelper.isShowingAnyPoi(wiki)) {
|
||||||
|
mapActivity.getMapLayers().showMultichoicePoiFilterDialog(mapActivity.getMapView(),
|
||||||
|
dismissListener);
|
||||||
|
} else {
|
||||||
|
mapActivity.getMapLayers().showSingleChoicePoiFilterDialog(mapActivity.getMapView(),
|
||||||
|
dismissListener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -80,7 +80,6 @@ import net.osmand.plus.OsmAndConstants;
|
||||||
import net.osmand.plus.OsmAndFormatter;
|
import net.osmand.plus.OsmAndFormatter;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.OsmandPlugin;
|
import net.osmand.plus.OsmandPlugin;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.UiUtilities;
|
import net.osmand.plus.UiUtilities;
|
||||||
import net.osmand.plus.Version;
|
import net.osmand.plus.Version;
|
||||||
|
@ -90,10 +89,11 @@ import net.osmand.plus.activities.MapActivity;
|
||||||
import net.osmand.plus.activities.PluginActivity;
|
import net.osmand.plus.activities.PluginActivity;
|
||||||
import net.osmand.plus.activities.SettingsActivity;
|
import net.osmand.plus.activities.SettingsActivity;
|
||||||
import net.osmand.plus.dialogs.ConfigureMapMenu;
|
import net.osmand.plus.dialogs.ConfigureMapMenu;
|
||||||
import net.osmand.plus.dialogs.ConfigureMapMenu.AppearanceListItem;
|
import net.osmand.plus.dialogs.GpxAppearanceAdapter;
|
||||||
import net.osmand.plus.dialogs.ConfigureMapMenu.GpxAppearanceAdapter;
|
import net.osmand.plus.dialogs.GpxAppearanceAdapter.AppearanceListItem;
|
||||||
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
|
||||||
import net.osmand.plus.routing.RouteCalculationResult;
|
import net.osmand.plus.routing.RouteCalculationResult;
|
||||||
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
import net.osmand.render.RenderingRuleProperty;
|
import net.osmand.render.RenderingRuleProperty;
|
||||||
import net.osmand.render.RenderingRulesStorage;
|
import net.osmand.render.RenderingRulesStorage;
|
||||||
import net.osmand.router.RouteStatisticsHelper;
|
import net.osmand.router.RouteStatisticsHelper;
|
||||||
|
@ -540,9 +540,9 @@ public class GpxUiHelper {
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||||
AppearanceListItem item = gpxApprAdapter.getItem(position);
|
AppearanceListItem item = gpxApprAdapter.getItem(position);
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
if (item.getAttrName() == CURRENT_TRACK_WIDTH_ATTR) {
|
if (CURRENT_TRACK_WIDTH_ATTR.equals(item.getAttrName())) {
|
||||||
gpxAppearanceParams.put(CURRENT_TRACK_WIDTH_ATTR, item.getValue());
|
gpxAppearanceParams.put(CURRENT_TRACK_WIDTH_ATTR, item.getValue());
|
||||||
} else if (item.getAttrName() == CURRENT_TRACK_COLOR_ATTR) {
|
} else if (CURRENT_TRACK_COLOR_ATTR.equals(item.getAttrName())) {
|
||||||
gpxAppearanceParams.put(CURRENT_TRACK_COLOR_ATTR, item.getValue());
|
gpxAppearanceParams.put(CURRENT_TRACK_COLOR_ATTR, item.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -592,7 +592,7 @@ public class GpxUiHelper {
|
||||||
}
|
}
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
loadGPXFileInDifferentThread(activity, callbackWithObject, dir, currentGPX,
|
loadGPXFileInDifferentThread(activity, callbackWithObject, dir, currentGPX,
|
||||||
s.toArray(new String[s.size()]));
|
s.toArray(new String[0]));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
builder.setNegativeButton(R.string.shared_string_cancel, null);
|
builder.setNegativeButton(R.string.shared_string_cancel, null);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package net.osmand.plus.myplaces;
|
package net.osmand.plus.myplaces;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
@ -14,8 +15,10 @@ import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.AbsListView;
|
import android.widget.AbsListView;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.AdapterView.OnItemClickListener;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
import android.widget.ListAdapter;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
@ -49,19 +52,23 @@ import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
|
||||||
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
||||||
import net.osmand.plus.OsmAndFormatter;
|
import net.osmand.plus.OsmAndFormatter;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.settings.backend.OsmandSettings;
|
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
import net.osmand.plus.activities.TrackActivity;
|
import net.osmand.plus.activities.TrackActivity;
|
||||||
import net.osmand.plus.dialogs.ConfigureMapMenu;
|
import net.osmand.plus.dialogs.GpxAppearanceAdapter;
|
||||||
|
import net.osmand.plus.dialogs.GpxAppearanceAdapter.AppearanceListItem;
|
||||||
|
import net.osmand.plus.dialogs.GpxAppearanceAdapter.GpxAppearanceAdapterType;
|
||||||
import net.osmand.plus.measurementtool.NewGpxData;
|
import net.osmand.plus.measurementtool.NewGpxData;
|
||||||
import net.osmand.plus.myplaces.TrackBitmapDrawer.TrackBitmapDrawerListener;
|
import net.osmand.plus.myplaces.TrackBitmapDrawer.TrackBitmapDrawerListener;
|
||||||
|
import net.osmand.plus.settings.backend.OsmandSettings;
|
||||||
|
import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
|
||||||
import net.osmand.plus.widgets.tools.CropCircleTransformation;
|
import net.osmand.plus.widgets.tools.CropCircleTransformation;
|
||||||
import net.osmand.plus.wikipedia.WikiArticleHelper;
|
import net.osmand.plus.wikipedia.WikiArticleHelper;
|
||||||
import net.osmand.plus.wikivoyage.WikivoyageUtils;
|
import net.osmand.plus.wikivoyage.WikivoyageUtils;
|
||||||
import net.osmand.plus.wikivoyage.article.WikivoyageArticleDialogFragment;
|
import net.osmand.plus.wikivoyage.article.WikivoyageArticleDialogFragment;
|
||||||
import net.osmand.plus.wikivoyage.data.TravelArticle;
|
import net.osmand.plus.wikivoyage.data.TravelArticle;
|
||||||
import net.osmand.render.RenderingRulesStorage;
|
import net.osmand.render.RenderingRulesStorage;
|
||||||
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -71,6 +78,7 @@ import java.util.Map;
|
||||||
import gnu.trove.list.array.TIntArrayList;
|
import gnu.trove.list.array.TIntArrayList;
|
||||||
|
|
||||||
import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR;
|
import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR;
|
||||||
|
import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR;
|
||||||
|
|
||||||
public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
||||||
|
|
||||||
|
@ -356,50 +364,27 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
TrackActivity activity = getTrackActivity();
|
TrackActivity activity = getTrackActivity();
|
||||||
if (activity != null) {
|
final GPXFile gpxFile = getGpx();
|
||||||
colorListPopupWindow = new ListPopupWindow(activity);
|
if (activity != null && gpxFile != null) {
|
||||||
colorListPopupWindow.setAnchorView(colorView);
|
final GpxAppearanceAdapter appearanceAdapter = new GpxAppearanceAdapter(activity,
|
||||||
colorListPopupWindow.setContentWidth(AndroidUtils.dpToPx(app, 200f));
|
gpxFile.getColor(0), GpxAppearanceAdapterType.TRACK_WIDTH_COLOR);
|
||||||
colorListPopupWindow.setModal(true);
|
OnItemClickListener itemClickListener = new OnItemClickListener() {
|
||||||
colorListPopupWindow.setDropDownGravity(Gravity.RIGHT | Gravity.TOP);
|
|
||||||
colorListPopupWindow.setVerticalOffset(AndroidUtils.dpToPx(app, -48f));
|
|
||||||
colorListPopupWindow.setHorizontalOffset(AndroidUtils.dpToPx(app, -6f));
|
|
||||||
GPXFile gpxFile = getGpx();
|
|
||||||
final ConfigureMapMenu.GpxAppearanceAdapter gpxApprAdapter = new ConfigureMapMenu.GpxAppearanceAdapter(activity,
|
|
||||||
gpxFile.getColor(0), ConfigureMapMenu.GpxAppearanceAdapter.GpxAppearanceAdapterType.TRACK_COLOR);
|
|
||||||
colorListPopupWindow.setAdapter(gpxApprAdapter);
|
|
||||||
colorListPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||||
ConfigureMapMenu.AppearanceListItem item = gpxApprAdapter.getItem(position);
|
AppearanceListItem item = appearanceAdapter.getItem(position);
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
if (CURRENT_TRACK_COLOR_ATTR.equals(item.getAttrName())) {
|
if (CURRENT_TRACK_COLOR_ATTR.equals(item.getAttrName())) {
|
||||||
GPXFile gpx = getGpx();
|
setGpxColor(item, gpxFile);
|
||||||
int clr = item.getColor();
|
} else if (CURRENT_TRACK_WIDTH_ATTR.equals(item.getAttrName())) {
|
||||||
if (vis.isChecked()) {
|
setGpxWidth(item, gpxFile);
|
||||||
if (gpx != null) {
|
|
||||||
SelectedGpxFile sf = app.getSelectedGpxHelper().selectGpxFile(gpx, vis.isChecked(), false);
|
|
||||||
if (clr != 0 && sf.getModifiableGpxFile() != null) {
|
|
||||||
sf.getModifiableGpxFile().setColor(clr);
|
|
||||||
if (getGpxDataItem() != null) {
|
|
||||||
app.getGpxDbHelper().updateColor(getGpxDataItem(), clr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (getGpxDataItem() != null) {
|
|
||||||
app.getGpxDbHelper().updateColor(getGpxDataItem(), clr);
|
|
||||||
}
|
|
||||||
if (gpx != null && gpx.showCurrentTrack) {
|
|
||||||
app.getSettings().CURRENT_TRACK_COLOR.set(clr);
|
|
||||||
}
|
|
||||||
refreshTrackBitmap();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
colorListPopupWindow.dismiss();
|
colorListPopupWindow.dismiss();
|
||||||
updateColorView(colorView);
|
updateColorView(colorView);
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
colorListPopupWindow = createPopupWindow(activity, splitIntervalView, appearanceAdapter, itemClickListener);
|
||||||
colorListPopupWindow.show();
|
colorListPopupWindow.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -415,16 +400,8 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
TrackActivity activity = getTrackActivity();
|
TrackActivity activity = getTrackActivity();
|
||||||
if (activity != null) {
|
if (activity != null) {
|
||||||
splitListPopupWindow = new ListPopupWindow(activity);
|
ListAdapter adapter = new ArrayAdapter<>(activity, R.layout.popup_list_text_item, options);
|
||||||
splitListPopupWindow.setAnchorView(splitIntervalView);
|
OnItemClickListener itemClickListener = new OnItemClickListener() {
|
||||||
splitListPopupWindow.setContentWidth(AndroidUtils.dpToPx(app, 200f));
|
|
||||||
splitListPopupWindow.setModal(true);
|
|
||||||
splitListPopupWindow.setDropDownGravity(Gravity.RIGHT | Gravity.TOP);
|
|
||||||
splitListPopupWindow.setVerticalOffset(AndroidUtils.dpToPx(app, -48f));
|
|
||||||
splitListPopupWindow.setHorizontalOffset(AndroidUtils.dpToPx(app, -6f));
|
|
||||||
splitListPopupWindow.setAdapter(new ArrayAdapter<>(activity,
|
|
||||||
R.layout.popup_list_text_item, options));
|
|
||||||
splitListPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||||
|
@ -433,7 +410,8 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
||||||
splitListPopupWindow.dismiss();
|
splitListPopupWindow.dismiss();
|
||||||
updateSplitIntervalView(splitIntervalView);
|
updateSplitIntervalView(splitIntervalView);
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
splitListPopupWindow = createPopupWindow(activity, splitIntervalView, adapter, itemClickListener);
|
||||||
splitListPopupWindow.show();
|
splitListPopupWindow.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -451,6 +429,55 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setGpxColor(AppearanceListItem item, GPXFile gpxFile) {
|
||||||
|
int color = item.getColor();
|
||||||
|
if (vis.isChecked()) {
|
||||||
|
SelectedGpxFile sf = app.getSelectedGpxHelper().selectGpxFile(gpxFile, vis.isChecked(), false);
|
||||||
|
if (color != 0 && sf.getModifiableGpxFile() != null) {
|
||||||
|
sf.getModifiableGpxFile().setColor(color);
|
||||||
|
if (getGpxDataItem() != null) {
|
||||||
|
app.getGpxDbHelper().updateColor(getGpxDataItem(), color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (getGpxDataItem() != null) {
|
||||||
|
app.getGpxDbHelper().updateColor(getGpxDataItem(), color);
|
||||||
|
}
|
||||||
|
if (gpxFile.showCurrentTrack) {
|
||||||
|
app.getSettings().CURRENT_TRACK_COLOR.set(color);
|
||||||
|
}
|
||||||
|
refreshTrackBitmap();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setGpxWidth(AppearanceListItem item, GPXFile gpxFile) {
|
||||||
|
String width = item.getValue();
|
||||||
|
if (vis.isChecked()) {
|
||||||
|
SelectedGpxFile sf = app.getSelectedGpxHelper().selectGpxFile(gpxFile, vis.isChecked(), false);
|
||||||
|
if (!Algorithms.isEmpty(width) && sf.getModifiableGpxFile() != null) {
|
||||||
|
sf.getModifiableGpxFile().setWidth(width);
|
||||||
|
if (getGpxDataItem() != null) {
|
||||||
|
app.getGpxDbHelper().updateWidth(getGpxDataItem(), width);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (getGpxDataItem() != null) {
|
||||||
|
app.getGpxDbHelper().updateWidth(getGpxDataItem(), width);
|
||||||
|
}
|
||||||
|
refreshTrackBitmap();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ListPopupWindow createPopupWindow(Activity activity, View anchorView, ListAdapter adapter, OnItemClickListener itemClickListener) {
|
||||||
|
ListPopupWindow popupWindow = new ListPopupWindow(activity);
|
||||||
|
popupWindow.setAnchorView(anchorView);
|
||||||
|
popupWindow.setContentWidth(AndroidUtils.dpToPx(app, 200f));
|
||||||
|
popupWindow.setModal(true);
|
||||||
|
popupWindow.setDropDownGravity(Gravity.RIGHT | Gravity.TOP);
|
||||||
|
popupWindow.setVerticalOffset(AndroidUtils.dpToPx(app, -48f));
|
||||||
|
popupWindow.setHorizontalOffset(AndroidUtils.dpToPx(app, -6f));
|
||||||
|
popupWindow.setAdapter(adapter);
|
||||||
|
popupWindow.setOnItemClickListener(itemClickListener);
|
||||||
|
|
||||||
|
return popupWindow;
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private View getDescriptionCardView(Context context) {
|
private View getDescriptionCardView(Context context) {
|
||||||
GPXFile gpx = getGpx();
|
GPXFile gpx = getGpx();
|
||||||
|
@ -729,7 +756,7 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
||||||
text.setText(options.get(selectedSplitInterval));
|
text.setText(options.get(selectedSplitInterval));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getSelectedSplitInterval() {
|
private int getSelectedSplitInterval() {
|
||||||
if (getGpxDataItem() == null) {
|
if (getGpxDataItem() == null) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -737,14 +764,14 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
||||||
int splitType = getGpxDataItem().getSplitType();
|
int splitType = getGpxDataItem().getSplitType();
|
||||||
double splitInterval = getGpxDataItem().getSplitInterval();
|
double splitInterval = getGpxDataItem().getSplitInterval();
|
||||||
int position = 0;
|
int position = 0;
|
||||||
|
|
||||||
if (splitType == GPXDatabase.GPX_SPLIT_TYPE_DISTANCE) {
|
if (splitType == GPXDatabase.GPX_SPLIT_TYPE_DISTANCE) {
|
||||||
position = distanceSplit.indexOf(splitInterval);
|
position = distanceSplit.indexOf(splitInterval);
|
||||||
} else if (splitType == GPXDatabase.GPX_SPLIT_TYPE_TIME) {
|
} else if (splitType == GPXDatabase.GPX_SPLIT_TYPE_TIME) {
|
||||||
position = timeSplit.indexOf((int) splitInterval);
|
position = timeSplit.indexOf((int) splitInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
return position > 0 ? position : 0;
|
return Math.max(position, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateColorView(View colorView) {
|
private void updateColorView(View colorView) {
|
||||||
|
@ -759,10 +786,9 @@ public class TrackActivityFragmentAdapter implements TrackBitmapDrawerListener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (color == 0) {
|
if (color == 0) {
|
||||||
final RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer();
|
RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer();
|
||||||
final OsmandSettings.CommonPreference<String> prefColor
|
CommonPreference<String> prefColor = app.getSettings().getCustomRenderProperty(CURRENT_TRACK_COLOR_ATTR);
|
||||||
= app.getSettings().getCustomRenderProperty(CURRENT_TRACK_COLOR_ATTR);
|
color = GpxAppearanceAdapter.parseTrackColor(renderer, prefColor.get());
|
||||||
color = ConfigureMapMenu.GpxAppearanceAdapter.parseTrackColor(renderer, prefColor.get());
|
|
||||||
}
|
}
|
||||||
if (color == 0) {
|
if (color == 0) {
|
||||||
colorImageView.setImageDrawable(app.getUIUtilities().getThemedIcon(R.drawable.ic_action_circle));
|
colorImageView.setImageDrawable(app.getUIUtilities().getThemedIcon(R.drawable.ic_action_circle));
|
||||||
|
|
|
@ -26,6 +26,7 @@ import net.osmand.GPXUtilities.GPXFile;
|
||||||
import net.osmand.GPXUtilities.TrkSegment;
|
import net.osmand.GPXUtilities.TrkSegment;
|
||||||
import net.osmand.GPXUtilities.WptPt;
|
import net.osmand.GPXUtilities.WptPt;
|
||||||
import net.osmand.Location;
|
import net.osmand.Location;
|
||||||
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
import net.osmand.data.PointDescription;
|
import net.osmand.data.PointDescription;
|
||||||
import net.osmand.data.QuadRect;
|
import net.osmand.data.QuadRect;
|
||||||
|
@ -55,6 +56,8 @@ import net.osmand.render.RenderingRulesStorage;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
import net.osmand.util.MapUtils;
|
import net.osmand.util.MapUtils;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -67,6 +70,7 @@ import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR;
|
||||||
|
|
||||||
public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IMoveObjectProvider, MapTextProvider<WptPt> {
|
public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IMoveObjectProvider, MapTextProvider<WptPt> {
|
||||||
|
|
||||||
|
private static final Log log = PlatformUtil.getLog(GPXLayer.class);
|
||||||
private static final double TOUCH_RADIUS_MULTIPLIER = 1.5;
|
private static final double TOUCH_RADIUS_MULTIPLIER = 1.5;
|
||||||
private static final int START_ZOOM = 7;
|
private static final int START_ZOOM = 7;
|
||||||
|
|
||||||
|
@ -81,6 +85,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
private boolean isPaint_1;
|
private boolean isPaint_1;
|
||||||
private int cachedHash;
|
private int cachedHash;
|
||||||
private int cachedColor;
|
private int cachedColor;
|
||||||
|
private Map<String, Float> cachedWidth = new HashMap<>();
|
||||||
private Paint paintIcon;
|
private Paint paintIcon;
|
||||||
private int currentTrackColor;
|
private int currentTrackColor;
|
||||||
|
|
||||||
|
@ -220,29 +225,30 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private int updatePaints(int color, boolean routePoints, boolean currentTrack, DrawSettings nightMode, RotatedTileBox tileBox) {
|
private int updatePaints(int color, String width, boolean routePoints, boolean currentTrack, DrawSettings nightMode, RotatedTileBox tileBox) {
|
||||||
RenderingRulesStorage rrs = view.getApplication().getRendererRegistry().getCurrentSelectedRenderer();
|
RenderingRulesStorage rrs = view.getApplication().getRendererRegistry().getCurrentSelectedRenderer();
|
||||||
final boolean isNight = nightMode != null && nightMode.isNightMode();
|
final boolean isNight = nightMode != null && nightMode.isNightMode();
|
||||||
int hsh = calculateHash(rrs, routePoints, isNight, tileBox.getMapDensity(), tileBox.getZoom(),
|
int hsh = calculateHash(rrs, cachedWidth, routePoints, isNight, tileBox.getMapDensity(), tileBox.getZoom(),
|
||||||
currentTrackColorPref.get(), currentTrackWidthPref.get());
|
currentTrackColorPref.get(), currentTrackWidthPref.get());
|
||||||
|
String widthKey = width;
|
||||||
if (hsh != cachedHash) {
|
if (hsh != cachedHash) {
|
||||||
|
log.debug("updatePaints new HASH " + width);
|
||||||
cachedHash = hsh;
|
cachedHash = hsh;
|
||||||
cachedColor = ContextCompat.getColor(view.getApplication(), R.color.gpx_track);
|
cachedColor = ContextCompat.getColor(view.getApplication(), R.color.gpx_track);
|
||||||
if (rrs != null) {
|
if (rrs != null) {
|
||||||
RenderingRuleSearchRequest req = new RenderingRuleSearchRequest(rrs);
|
RenderingRuleSearchRequest req = new RenderingRuleSearchRequest(rrs);
|
||||||
req.setBooleanFilter(rrs.PROPS.R_NIGHT_MODE, isNight);
|
req.setBooleanFilter(rrs.PROPS.R_NIGHT_MODE, isNight);
|
||||||
CommonPreference<String> p = view.getSettings().getCustomRenderProperty(CURRENT_TRACK_COLOR_ATTR);
|
if (currentTrackColorPref != null && currentTrackColorPref.isSet()) {
|
||||||
if (p != null && p.isSet()) {
|
|
||||||
RenderingRuleProperty ctColor = rrs.PROPS.get(CURRENT_TRACK_COLOR_ATTR);
|
RenderingRuleProperty ctColor = rrs.PROPS.get(CURRENT_TRACK_COLOR_ATTR);
|
||||||
if (ctColor != null) {
|
if (ctColor != null) {
|
||||||
req.setStringFilter(ctColor, p.get());
|
req.setStringFilter(ctColor, currentTrackColorPref.get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CommonPreference<String> p2 = view.getSettings().getCustomRenderProperty(CURRENT_TRACK_WIDTH_ATTR);
|
if (currentTrackWidthPref != null && currentTrackWidthPref.isSet()) {
|
||||||
if (p2 != null && p2.isSet()) {
|
|
||||||
RenderingRuleProperty ctWidth = rrs.PROPS.get(CURRENT_TRACK_WIDTH_ATTR);
|
RenderingRuleProperty ctWidth = rrs.PROPS.get(CURRENT_TRACK_WIDTH_ATTR);
|
||||||
if (ctWidth != null) {
|
if (ctWidth != null) {
|
||||||
req.setStringFilter(ctWidth, p2.get());
|
widthKey = width == null ? currentTrackWidthPref.get() : width;
|
||||||
|
req.setStringFilter(ctWidth, widthKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
String additional = "";
|
String additional = "";
|
||||||
|
@ -261,6 +267,10 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
RenderingContext rc = new OsmandRenderer.RenderingContext(view.getContext());
|
RenderingContext rc = new OsmandRenderer.RenderingContext(view.getContext());
|
||||||
rc.setDensityValue((float) tileBox.getMapDensity());
|
rc.setDensityValue((float) tileBox.getMapDensity());
|
||||||
cachedColor = req.getIntPropertyValue(rrs.PROPS.R_COLOR);
|
cachedColor = req.getIntPropertyValue(rrs.PROPS.R_COLOR);
|
||||||
|
|
||||||
|
float widthF = rc.getComplexValue(req, req.ALL.R_STROKE_WIDTH);
|
||||||
|
cachedWidth.put(widthKey, widthF);
|
||||||
|
|
||||||
osmandRenderer.updatePaint(req, paint, 0, false, rc);
|
osmandRenderer.updatePaint(req, paint, 0, false, rc);
|
||||||
isPaint2 = osmandRenderer.updatePaint(req, paint2, 1, false, rc);
|
isPaint2 = osmandRenderer.updatePaint(req, paint2, 1, false, rc);
|
||||||
isPaint_1 = osmandRenderer.updatePaint(req, paint_1, -1, false, rc);
|
isPaint_1 = osmandRenderer.updatePaint(req, paint_1, -1, false, rc);
|
||||||
|
@ -279,6 +289,10 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
paint.setColor(color == 0 ? cachedColor : color);
|
paint.setColor(color == 0 ? cachedColor : color);
|
||||||
|
Float strikeWidth = cachedWidth.get(widthKey);
|
||||||
|
if (strikeWidth != null) {
|
||||||
|
paint.setStrokeWidth(strikeWidth);
|
||||||
|
}
|
||||||
return cachedColor;
|
return cachedColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -536,6 +550,10 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
RotatedTileBox tileBox, DrawSettings settings) {
|
RotatedTileBox tileBox, DrawSettings settings) {
|
||||||
List<TrkSegment> segments = selectedGpxFile.getPointsToDisplay();
|
List<TrkSegment> segments = selectedGpxFile.getPointsToDisplay();
|
||||||
for (TrkSegment ts : segments) {
|
for (TrkSegment ts : segments) {
|
||||||
|
String width = selectedGpxFile.getGpxFile().getWidth(null);
|
||||||
|
if (!cachedWidth.containsKey(width)) {
|
||||||
|
cachedWidth.put(width, null);
|
||||||
|
}
|
||||||
int color = selectedGpxFile.getGpxFile().getColor(0);
|
int color = selectedGpxFile.getGpxFile().getColor(0);
|
||||||
if (currentTrack) {
|
if (currentTrack) {
|
||||||
color = currentTrackColor;
|
color = currentTrackColor;
|
||||||
|
@ -550,8 +568,8 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
|
||||||
ts.renderer = new Renderable.StandardTrack(ts.points, 17.2);
|
ts.renderer = new Renderable.StandardTrack(ts.points, 17.2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updatePaints(color, selectedGpxFile.isRoutePoints(), currentTrack, settings, tileBox);
|
updatePaints(color, width, selectedGpxFile.isRoutePoints(), currentTrack, settings, tileBox);
|
||||||
if(ts.renderer instanceof Renderable.RenderableSegment) {
|
if (ts.renderer instanceof Renderable.RenderableSegment) {
|
||||||
((Renderable.RenderableSegment) ts.renderer).drawSegment(view.getZoom(), paint, canvas, tileBox);
|
((Renderable.RenderableSegment) ts.renderer).drawSegment(view.getZoom(), paint, canvas, tileBox);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue