From 35a98dab8293b62f12296f65d8e172a6f7dfcf6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Sat, 24 May 2025 21:45:49 +0100 Subject: [PATCH] Garmin: Upload all segments from first track in gpx --- .../garmin/fit/GpxRouteFileConverter.java | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/GpxRouteFileConverter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/GpxRouteFileConverter.java index faec08003..88d7f8cd7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/GpxRouteFileConverter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/GpxRouteFileConverter.java @@ -6,6 +6,7 @@ import org.slf4j.LoggerFactory; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import nodomain.freeyourgadget.gadgetbridge.model.GPSCoordinate; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.FileType; @@ -14,9 +15,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages. import nodomain.freeyourgadget.gadgetbridge.util.StringUtils; import nodomain.freeyourgadget.gadgetbridge.util.gpx.GpxParser; import nodomain.freeyourgadget.gadgetbridge.util.gpx.model.GpxFile; -import nodomain.freeyourgadget.gadgetbridge.util.gpx.model.GpxTrack; import nodomain.freeyourgadget.gadgetbridge.util.gpx.model.GpxTrackPoint; -import nodomain.freeyourgadget.gadgetbridge.util.gpx.model.GpxTrackSegment; public class GpxRouteFileConverter { private static final Logger LOG = LoggerFactory.getLogger(GpxRouteFileConverter.class); @@ -30,11 +29,13 @@ public class GpxRouteFileConverter { public GpxRouteFileConverter(byte[] xmlBytes) { this.timestamp = System.currentTimeMillis() / 1000; this.gpxFile = GpxParser.parseGpx(xmlBytes); - try { - this.convertedFile = convertGpxToRoute(gpxFile); - } catch (Exception e) { - LOG.error(e.getMessage()); - this.convertedFile = null; + if (this.gpxFile != null) { + try { + this.convertedFile = convertGpxToRoute(gpxFile); + } catch (final Exception e) { + LOG.error("Failed to convert gpx to route", e); + this.convertedFile = null; + } } } @@ -74,24 +75,21 @@ public class GpxRouteFileConverter { LOG.error("Gpx file contains no Tracks."); return null; } - //GPX files may contain multiple tracks, we use only the first one - final GpxTrack track = gpxFile.getTracks().get(0); - if (track.getTrackSegments().isEmpty()) { - LOG.error("Gpx track contains no segment."); - return null; - } - //GPX track may contain multiple segments, we use only the first one - GpxTrackSegment gpxTrackSegment = track.getTrackSegments().get(0); + this.name = gpxFile.getTracks().get(0).getName(); + + // GPX files may contain multiple tracks, we use only the first one, + // but we use all segments (#4855) + final List gpxTrackPointList = gpxFile.getTracks().get(0) + .getTrackSegments().stream() + .flatMap(segment -> segment.getTrackPoints().stream()) + .collect(Collectors.toList()); - List gpxTrackPointList = gpxTrackSegment.getTrackPoints(); if (gpxTrackPointList.isEmpty()) { - LOG.error("Gpx track segment contains no point"); + LOG.error("Gpx track contains no points"); return null; } - this.name = track.getName(); - final RecordHeader gpxDataPointRecordHeader = new RecordHeader((byte) 0x05); final RecordDefinition gpxDataPointRecordDefinition = new RecordDefinition(new RecordHeader((byte) 0x45), ByteOrder.BIG_ENDIAN, GlobalFITMessage.RECORD, GlobalFITMessage.RECORD.getFieldDefinitions(0, 1, 2, 5, 253), null); List gpxPointDataRecords = new ArrayList<>();