diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/maps/MapsTrackViewModel.kt b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/maps/MapsTrackViewModel.kt index 5e2ab9fa2d..148c7d47c3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/maps/MapsTrackViewModel.kt +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/maps/MapsTrackViewModel.kt @@ -11,6 +11,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityPoint import nodomain.freeyourgadget.gadgetbridge.model.GPSCoordinate import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitFile import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitRecord +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitSession import nodomain.freeyourgadget.gadgetbridge.util.gpx.GpxParseException import nodomain.freeyourgadget.gadgetbridge.util.gpx.GpxParser import org.slf4j.LoggerFactory @@ -69,9 +70,15 @@ class MapsTrackViewModel : ViewModel() { trackFile.name.endsWith(".fit") -> { val fitFile = FitFile.parseIncoming(trackFile) - return fitFile.records - .filterIsInstance() - .map { it.toActivityPoint() } + val activityPoints = fitFile.records + .filterIsInstance() + .map { it.toActivityPoint() } + for (activityPoint in activityPoints) { + if (activityPoint.location != null) { + return activityPoints + } + } + return fitFile.records.filterIsInstance()[0].toActivityPoints() } else -> { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminWorkoutParser.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminWorkoutParser.java index 34369d0e67..737e710e40 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminWorkoutParser.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminWorkoutParser.java @@ -54,6 +54,7 @@ public class GarminWorkoutParser implements ActivitySummaryParser { private final List timesInZone = new ArrayList<>(); private final List activityPoints = new ArrayList<>(); + private List sessionActivityPoints; private FitSession session = null; private FitSport sport = null; private FitUserProfile userProfile = null; @@ -154,6 +155,7 @@ public class GarminWorkoutParser implements ActivitySummaryParser { } else { // We only support 1 session session = (FitSession) record; + sessionActivityPoints = (session.toActivityPoints()); } } else if (record instanceof FitPhysiologicalMetrics) { LOG.debug("Physiological Metrics: {}", record); @@ -681,7 +683,8 @@ public class GarminWorkoutParser implements ActivitySummaryParser { summaryData.add( INTERNAL_HAS_GPS, - String.valueOf(activityPoints.stream().anyMatch(p -> p.getLocation() != null)) + String.valueOf(activityPoints.stream().anyMatch(p -> p.getLocation() != null) || + sessionActivityPoints.stream().anyMatch(p -> p.getLocation() != null)) ); summary.setSummaryData(summaryData.toString()); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSession.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSession.java index 3408398184..ce370c5d4c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSession.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSession.java @@ -18,6 +18,12 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages import androidx.annotation.Nullable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import nodomain.freeyourgadget.gadgetbridge.model.ActivityPoint; +import nodomain.freeyourgadget.gadgetbridge.model.GPSCoordinate; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; @@ -1952,4 +1958,32 @@ public class FitSession extends RecordData { return (FitSession) super.build(); } } + + // manual changes below + + public List toActivityPoints() { + final List activityPoints = new ArrayList(); + final ActivityPoint startActivityPoint = new ActivityPoint(); + startActivityPoint.setTime(new Date(getComputedTimestamp() * 1000L)); + if (getStartLatitude() != null && getStartLongitude() != null) { + startActivityPoint.setLocation(new GPSCoordinate( + getStartLongitude(), + getStartLatitude(), + GPSCoordinate.UNKNOWN_ALTITUDE + )); + activityPoints.add(startActivityPoint); + } + final ActivityPoint endActivityPoint = new ActivityPoint(); + endActivityPoint.setTime(new Date(getComputedTimestamp() * 1000L)); + if (getEndLatitude() != null && getEndLongitude() != null) { + endActivityPoint.setLocation(new GPSCoordinate( + getEndLongitude(), + getEndLatitude(), + GPSCoordinate.UNKNOWN_ALTITUDE + )); + activityPoints.add(endActivityPoint); + } + + return activityPoints; + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/maps/MapsManager.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/maps/MapsManager.java index 68ed6a31ec..10b6011cf1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/maps/MapsManager.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/maps/MapsManager.java @@ -178,6 +178,22 @@ public final class MapsManager { isMapLoaded = false; } + private BoundingBox minimalBoundingBox(double minLat, double minLon, double maxLat, double maxLon) { + final LatLong center = new LatLong(minLat + (maxLat - minLat) / 2, minLon + (maxLon - minLon) / 2); + final double minLatDistance = LatLongUtils.latitudeDistance(1000); + final double minLonDistance = LatLongUtils.longitudeDistance(1000, center.latitude); + if ((maxLat - minLat) < minLatDistance) { + maxLat = center.latitude + minLatDistance/2; + minLat = center.latitude - minLatDistance/2; + } + if ((maxLon - minLon) < minLonDistance) { + maxLon = center.longitude + minLonDistance/2; + minLon = center.longitude - minLonDistance/2; + } + + return new BoundingBox(minLat, minLon, maxLat, maxLon); + } + public void setTrack(final List trackPoints) { final Accumulator latitudeAccumulator = new Accumulator(); final Accumulator longitudeAccumulator = new Accumulator(); @@ -189,6 +205,7 @@ public final class MapsManager { final double minLat = latitudeAccumulator.getMin(); final double maxLon = longitudeAccumulator.getMax(); final double minLon = longitudeAccumulator.getMin(); + final LatLong center = new LatLong(minLat + (maxLat - minLat) / 2, minLon + (maxLon - minLon) / 2); final List points = trackPoints.stream() .map(p -> new LatLong(p.getLatitude(), p.getLongitude())) @@ -206,10 +223,11 @@ public final class MapsManager { } polyline.setPoints(points); - mapView.setCenter(new LatLong(minLat + (maxLat - minLat) / 2, minLon + (maxLon - minLon) / 2)); + mapView.setCenter(center); + final byte zoom = LatLongUtils.zoomForBounds( new Dimension(mapView.getWidth(), mapView.getHeight()), - new BoundingBox(minLat, minLon, maxLat, maxLon), + minimalBoundingBox(minLat, minLon, maxLat, maxLon), mapView.getModel().displayModel.getTileSize() ); mapView.setZoomLevel(zoom);