diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesGpsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesGpsFragment.java index 4b89200a0..0adf61f47 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesGpsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesGpsFragment.java @@ -88,7 +88,9 @@ public class ActivitySummariesGpsFragment extends AbstractGBFragment { } if (gpxParser != null) { - drawTrack(canvas, gpxParser.getPoints()); + if (gpxParser.getPoints().toArray().length > 0) { + drawTrack(canvas, gpxParser.getPoints()); + } } } }).start(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/export/GPXExporter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/export/GPXExporter.java index 7f7d8cbf8..1dee199e0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/export/GPXExporter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/export/GPXExporter.java @@ -19,6 +19,9 @@ package nodomain.freeyourgadget.gadgetbridge.export; import android.util.Xml; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import org.xmlpull.v1.XmlSerializer; import java.io.File; @@ -29,9 +32,8 @@ import java.math.RoundingMode; import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.List; +import java.util.UUID; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import nodomain.freeyourgadget.gadgetbridge.activities.HeartRateUtils; import nodomain.freeyourgadget.gadgetbridge.model.ActivityPoint; import nodomain.freeyourgadget.gadgetbridge.model.ActivityTrack; @@ -45,6 +47,10 @@ public class GPXExporter implements ActivityTrackExporter { private static final String NS_TRACKPOINT_EXTENSION = "gpxtpx"; private static final String NS_TRACKPOINT_EXTENSION_URI = "http://www.garmin.com/xmlschemas/TrackPointExtension/v1"; private static final String NS_XSI_URI = "http://www.w3.org/2001/XMLSchema-instance"; + private static final String TOPOGRAFIX_NAMESPACE_XSD = "http://www.topografix.com/GPX/1/1/gpx.xsd"; + private static final String OPENTRACKS_PREFIX = "opentracks"; + private static final String OPENTRACKS_NAMESPACE_URI = "http://opentracksapp.com/xmlschemas/v1"; + private static final String OPENTRACKS_NAMESPACE_XSD = "http://opentracksapp.com/xmlschemas/OpenTracks_v1.xsd"; private String creator; private boolean includeHeartRate = true; @@ -66,11 +72,14 @@ public class GPXExporter implements ActivityTrackExporter { ser.setPrefix("xsi", NS_XSI_URI); ser.setPrefix(NS_TRACKPOINT_EXTENSION, NS_TRACKPOINT_EXTENSION_URI); ser.setPrefix(NS_GPX_PREFIX, NS_GPX_URI); + ser.setPrefix(OPENTRACKS_PREFIX, OPENTRACKS_NAMESPACE_URI); ser.startTag(NS_GPX_URI, "gpx"); - ser.attribute(null,"version", "1.1"); + ser.attribute(null, "version", "1.1"); ser.attribute(null, "creator", getCreator()); - ser.attribute(NS_XSI_URI, "schemaLocation", NS_GPX_URI + " " + "http://www.topografix.com/GPX/1/1/gpx.xsd"); + ser.attribute(NS_XSI_URI, "schemaLocation", NS_GPX_URI + " " + + TOPOGRAFIX_NAMESPACE_XSD + " " + + OPENTRACKS_NAMESPACE_URI + " " + OPENTRACKS_NAMESPACE_XSD); exportMetadata(ser, track); exportTrack(ser, track); @@ -99,7 +108,12 @@ public class GPXExporter implements ActivityTrackExporter { } private void exportTrack(XmlSerializer ser, ActivityTrack track) throws IOException, GPXTrackEmptyException { + String uuid = UUID.randomUUID().toString(); ser.startTag(NS_GPX_URI, "trk"); + ser.startTag(NS_GPX_URI, "extensions"); + ser.startTag(NS_GPX_URI, OPENTRACKS_PREFIX + ":trackid").text(uuid).endTag(NS_GPX_URI, OPENTRACKS_PREFIX + ":trackid"); + ser.endTag(NS_GPX_URI, "extensions"); + ser.startTag(NS_GPX_URI, "trkseg"); List trackPoints = track.getTrackPoints(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiActivityDetailsParser.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiActivityDetailsParser.java index 165578830..af206c294 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiActivityDetailsParser.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiActivityDetailsParser.java @@ -70,7 +70,7 @@ public class HuamiActivityDetailsParser { this.activityTrack = new ActivityTrack(); activityTrack.setUser(summary.getUser()); activityTrack.setDevice(summary.getDevice()); - activityTrack.setName(summary.getName() + "-" + summary.getId()); + activityTrack.setName(createActivityName(summary)); } public ActivityTrack parse(byte[] bytes) throws GBException { @@ -295,4 +295,14 @@ public class HuamiActivityDetailsParser { LOG.debug("got packet type 8 (swimming?): " + GB.hexdump(bytes, offset, 6)); return 6; } + + private String createActivityName(BaseActivitySummary summary) { + String name = summary.getName(); + String nameText = ""; + Long id = summary.getId(); + if (name != null) { + nameText = name + " - "; + } + return nameText + id; + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GpxParser.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GpxParser.java index 5de07c89d..3c8c49db1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GpxParser.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GpxParser.java @@ -16,6 +16,8 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; @@ -28,8 +30,9 @@ import java.util.List; import nodomain.freeyourgadget.gadgetbridge.model.GPSCoordinate; public class GpxParser { + private static final Logger LOG = LoggerFactory.getLogger(GpxParser.class); private XmlPullParser parser; - private List points; + private List points = new ArrayList<>(); private int eventType; public GpxParser(InputStream stream) { @@ -52,11 +55,13 @@ public class GpxParser { private void parseGpx() throws XmlPullParserException, IOException { eventType = parser.getEventType(); + while (eventType != XmlPullParser.END_DOCUMENT) { - if (eventType == XmlPullParser.START_TAG && parser.getName().equals("trkpt")) + if (eventType == XmlPullParser.START_TAG && parser.getName().equals("trkpt")) { points.add(parsePoint(parser)); - else + } else { eventType = parser.next(); + } } } diff --git a/app/src/test/resources/gpx-exporter-test-SampleTrack.gpx b/app/src/test/resources/gpx-exporter-test-SampleTrack.gpx index 24141feb1..6fcf1c640 100644 --- a/app/src/test/resources/gpx-exporter-test-SampleTrack.gpx +++ b/app/src/test/resources/gpx-exporter-test-SampleTrack.gpx @@ -1,13 +1,16 @@ - + Test Track Test User - + + + 0555e104-e8ea-4e10-b3e9-8b58abae257f + 40.000000