Add extensions writer for itinerary gpx
This commit is contained in:
parent
4ca520005a
commit
4cdb616c83
4 changed files with 85 additions and 22 deletions
|
@ -1965,7 +1965,7 @@ public class GPXUtilities {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void writeNotNullText(XmlSerializer serializer, String tag, String value) throws IOException {
|
public static void writeNotNullText(XmlSerializer serializer, String tag, String value) throws IOException {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
serializer.startTag(null, tag);
|
serializer.startTag(null, tag);
|
||||||
serializer.text(value);
|
serializer.text(value);
|
||||||
|
@ -2175,6 +2175,14 @@ public class GPXUtilities {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class ItineraryGroupItem {
|
||||||
|
public String name;
|
||||||
|
public String type;
|
||||||
|
public String path;
|
||||||
|
public String alias;
|
||||||
|
public String categories;
|
||||||
|
}
|
||||||
|
|
||||||
public static GPXFile loadGPXFile(InputStream f) {
|
public static GPXFile loadGPXFile(InputStream f) {
|
||||||
GPXFile gpxFile = new GPXFile(null);
|
GPXFile gpxFile = new GPXFile(null);
|
||||||
SimpleDateFormat format = new SimpleDateFormat(GPX_TIME_FORMAT, Locale.US);
|
SimpleDateFormat format = new SimpleDateFormat(GPX_TIME_FORMAT, Locale.US);
|
||||||
|
|
|
@ -2,8 +2,8 @@ package net.osmand.util;
|
||||||
|
|
||||||
import net.osmand.IProgress;
|
import net.osmand.IProgress;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.router.RouteColorize;
|
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
|
import net.osmand.router.RouteColorize;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.xmlpull.v1.XmlPullParser;
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
@ -298,17 +298,25 @@ public class Algorithms {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Set<String> decodeStringSet(String s) {
|
public static Set<String> decodeStringSet(String s) {
|
||||||
|
return decodeStringSet(s, String.valueOf(CHAR_TOSPLIT));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<String> decodeStringSet(String s, String split) {
|
||||||
if (isEmpty(s)) {
|
if (isEmpty(s)) {
|
||||||
return Collections.emptySet();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
return new HashSet<>(Arrays.asList(s.split(CHAR_TOSPLIT + "")));
|
return new HashSet<>(Arrays.asList(s.split(split)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String encodeStringSet(Set<String> set) {
|
public static String encodeStringSet(Set<String> set) {
|
||||||
|
return encodeStringSet(set, String.valueOf(CHAR_TOSPLIT));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String encodeStringSet(Set<String> set, String split) {
|
||||||
if (set != null) {
|
if (set != null) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for (String s : set) {
|
for (String s : set) {
|
||||||
sb.append(s).append(CHAR_TOSPLIT);
|
sb.append(s).append(split);
|
||||||
}
|
}
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -685,7 +685,7 @@ public class AppInitializer implements IProgress {
|
||||||
// restore backuped favorites to normal file
|
// restore backuped favorites to normal file
|
||||||
restoreBackupForFavoritesFiles();
|
restoreBackupForFavoritesFiles();
|
||||||
notifyEvent(InitEvents.RESTORE_BACKUPS);
|
notifyEvent(InitEvents.RESTORE_BACKUPS);
|
||||||
app.itineraryHelper.syncAllGroups();
|
app.itineraryHelper.syncItineraryGroups();
|
||||||
app.searchUICore.initSearchUICore();
|
app.searchUICore.initSearchUICore();
|
||||||
|
|
||||||
checkLiveUpdatesAlerts();
|
checkLiveUpdatesAlerts();
|
||||||
|
|
|
@ -6,13 +6,16 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import net.osmand.GPXUtilities;
|
import net.osmand.GPXUtilities;
|
||||||
|
import net.osmand.GPXUtilities.GPXExtensionsWriter;
|
||||||
import net.osmand.GPXUtilities.GPXFile;
|
import net.osmand.GPXUtilities.GPXFile;
|
||||||
|
import net.osmand.GPXUtilities.ItineraryGroupItem;
|
||||||
import net.osmand.GPXUtilities.WptPt;
|
import net.osmand.GPXUtilities.WptPt;
|
||||||
import net.osmand.IndexConstants;
|
import net.osmand.IndexConstants;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.data.FavouritePoint;
|
import net.osmand.data.FavouritePoint;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
import net.osmand.data.PointDescription;
|
import net.osmand.data.PointDescription;
|
||||||
|
import net.osmand.plus.FavouritesDbHelper;
|
||||||
import net.osmand.plus.FavouritesDbHelper.FavoriteGroup;
|
import net.osmand.plus.FavouritesDbHelper.FavoriteGroup;
|
||||||
import net.osmand.plus.GPXDatabase.GpxDataItem;
|
import net.osmand.plus.GPXDatabase.GpxDataItem;
|
||||||
import net.osmand.plus.GpxSelectionHelper;
|
import net.osmand.plus.GpxSelectionHelper;
|
||||||
|
@ -32,8 +35,10 @@ import net.osmand.plus.wikivoyage.data.TravelHelper;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.xmlpull.v1.XmlSerializer;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
@ -46,6 +51,7 @@ import java.util.Set;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
import static net.osmand.GPXUtilities.writeNotNullText;
|
||||||
import static net.osmand.plus.mapmarkers.MapMarkersHelper.BY_DATE_ADDED_DESC;
|
import static net.osmand.plus.mapmarkers.MapMarkersHelper.BY_DATE_ADDED_DESC;
|
||||||
|
|
||||||
public class ItineraryHelper {
|
public class ItineraryHelper {
|
||||||
|
@ -73,11 +79,12 @@ public class ItineraryHelper {
|
||||||
this.app = app;
|
this.app = app;
|
||||||
markersHelper = app.getMapMarkersHelper();
|
markersHelper = app.getMapMarkersHelper();
|
||||||
markersDbHelper = app.getMapMarkersDbHelper();
|
markersDbHelper = app.getMapMarkersDbHelper();
|
||||||
loadGroups();
|
loadMarkersGroups();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ItineraryItem {
|
public static class ItineraryItem {
|
||||||
|
|
||||||
|
public final String id;
|
||||||
public final Object object;
|
public final Object object;
|
||||||
public final ItineraryType type;
|
public final ItineraryType type;
|
||||||
public final ItineraryGroup group;
|
public final ItineraryGroup group;
|
||||||
|
@ -86,6 +93,18 @@ public class ItineraryHelper {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.group = group;
|
this.group = group;
|
||||||
this.object = object;
|
this.object = object;
|
||||||
|
this.id = acquireItemId(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String acquireItemId(Object object) {
|
||||||
|
if (object instanceof MapMarker) {
|
||||||
|
return (((MapMarker) object)).id;
|
||||||
|
} else if (object instanceof WptPt) {
|
||||||
|
return (((WptPt) object)).name;
|
||||||
|
} else if (object instanceof FavouritePoint) {
|
||||||
|
return (((FavouritePoint) object)).getName();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +114,6 @@ public class ItineraryHelper {
|
||||||
public String name;
|
public String name;
|
||||||
public ItineraryType type = ItineraryType.POINTS;
|
public ItineraryType type = ItineraryType.POINTS;
|
||||||
public Set<String> wptCategories;
|
public Set<String> wptCategories;
|
||||||
public boolean disabled;
|
|
||||||
|
|
||||||
private List<ItineraryItem> itineraryItems = new ArrayList<>();
|
private List<ItineraryItem> itineraryItems = new ArrayList<>();
|
||||||
|
|
||||||
|
@ -108,7 +126,6 @@ public class ItineraryHelper {
|
||||||
itineraryGroup.name = markersGroup.getName();
|
itineraryGroup.name = markersGroup.getName();
|
||||||
itineraryGroup.type = markersGroup.getType();
|
itineraryGroup.type = markersGroup.getType();
|
||||||
itineraryGroup.wptCategories = markersGroup.getWptCategories();
|
itineraryGroup.wptCategories = markersGroup.getWptCategories();
|
||||||
itineraryGroup.disabled = markersGroup.isDisabled();
|
|
||||||
|
|
||||||
if (markersGroup.getType() == ItineraryType.FAVOURITES) {
|
if (markersGroup.getType() == ItineraryType.FAVOURITES) {
|
||||||
syncFavoriteGroup(itineraryGroup, markersGroup);
|
syncFavoriteGroup(itineraryGroup, markersGroup);
|
||||||
|
@ -118,22 +135,17 @@ public class ItineraryHelper {
|
||||||
syncMarkersGroup(itineraryGroup, markersGroup);
|
syncMarkersGroup(itineraryGroup, markersGroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (trimEmptyGroups()) {
|
trimEmptyGroups();
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean trimEmptyGroups() {
|
public void trimEmptyGroups() {
|
||||||
boolean changed = false;
|
|
||||||
Iterator<ItineraryGroup> iterator = itineraryGroups.iterator();
|
Iterator<ItineraryGroup> iterator = itineraryGroups.iterator();
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
ItineraryGroup group = iterator.next();
|
ItineraryGroup group = iterator.next();
|
||||||
if (Algorithms.isEmpty(group.itineraryItems)) {
|
if (Algorithms.isEmpty(group.itineraryItems)) {
|
||||||
changed = true;
|
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return changed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void syncFavoriteGroup(ItineraryGroup itineraryGroup, MapMarkersGroup markersGroup) {
|
private void syncFavoriteGroup(ItineraryGroup itineraryGroup, MapMarkersGroup markersGroup) {
|
||||||
|
@ -186,12 +198,11 @@ public class ItineraryHelper {
|
||||||
|
|
||||||
private boolean shouldAddWpt(WptPt wptPt, Set<String> wptCategories) {
|
private boolean shouldAddWpt(WptPt wptPt, Set<String> wptCategories) {
|
||||||
boolean addAll = wptCategories == null || wptCategories.isEmpty();
|
boolean addAll = wptCategories == null || wptCategories.isEmpty();
|
||||||
boolean passed = wptPt.getExtensionsToRead().containsKey(PASSED_TIMESTAMP);
|
return addAll || wptCategories.contains(wptPt.category)
|
||||||
return !passed && (addAll || wptCategories.contains(wptPt.category)
|
|| wptPt.category == null && wptCategories.contains("");
|
||||||
|| wptPt.category == null && wptCategories.contains(""));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadGroups() {
|
private void loadMarkersGroups() {
|
||||||
Map<String, MapMarkersGroup> groupsMap = markersDbHelper.getAllGroupsMap();
|
Map<String, MapMarkersGroup> groupsMap = markersDbHelper.getAllGroupsMap();
|
||||||
List<MapMarker> allMarkers = new ArrayList<>(markersHelper.getMapMarkers());
|
List<MapMarker> allMarkers = new ArrayList<>(markersHelper.getMapMarkers());
|
||||||
allMarkers.addAll(markersHelper.getMapMarkersHistory());
|
allMarkers.addAll(markersHelper.getMapMarkersHistory());
|
||||||
|
@ -236,17 +247,53 @@ public class ItineraryHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void assignRouteExtensionWriter(GPXFile gpx, final List<ItineraryGroupItem> groups) {
|
||||||
|
if (gpx.getExtensionsWriter() == null) {
|
||||||
|
gpx.setExtensionsWriter(new GPXExtensionsWriter() {
|
||||||
|
@Override
|
||||||
|
public void writeExtensions(XmlSerializer serializer) {
|
||||||
|
for (ItineraryGroupItem group : groups) {
|
||||||
|
try {
|
||||||
|
serializer.startTag(null, "itinerary_group");
|
||||||
|
|
||||||
|
writeNotNullText(serializer, "osmand:name", group.name);
|
||||||
|
writeNotNullText(serializer, "osmand:type", group.type);
|
||||||
|
writeNotNullText(serializer, "osmand:path", group.path);
|
||||||
|
writeNotNullText(serializer, "osmand:alias", group.alias);
|
||||||
|
writeNotNullText(serializer, "osmand:categories", group.categories);
|
||||||
|
|
||||||
|
serializer.endTag(null, "itinerary_group");
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getExternalFile() {
|
||||||
|
return new File(app.getAppPath(null), FILE_TO_SAVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private File getInternalFile() {
|
||||||
|
return app.getFileStreamPath(FILE_TO_BACKUP);
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getBackupFile() {
|
||||||
|
return FavouritesDbHelper.getBackupFile(app, "itinerary_bak_");
|
||||||
|
}
|
||||||
|
|
||||||
public List<MapMarkersGroup> getMapMarkersGroups() {
|
public List<MapMarkersGroup> getMapMarkersGroups() {
|
||||||
return mapMarkersGroups;
|
return mapMarkersGroups;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void syncAllGroups() {
|
public void syncMarkersGroups() {
|
||||||
for (MapMarkersGroup group : mapMarkersGroups) {
|
for (MapMarkersGroup group : mapMarkersGroups) {
|
||||||
if (group.getId() != null && group.getName() != null) {
|
if (group.getType() != ItineraryType.MARKERS) {
|
||||||
runGroupSynchronization(group);
|
runGroupSynchronization(group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
syncItineraryGroups();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateGroupWptCategories(@NonNull MapMarkersGroup group, Set<String> wptCategories) {
|
public void updateGroupWptCategories(@NonNull MapMarkersGroup group, Set<String> wptCategories) {
|
||||||
|
|
Loading…
Reference in a new issue