Garmin: ignore Null Island for ActivitySummaryData.setHasGps

Some indoor tracks, like Edge1030's Cycling / Virtual Activity, record all points with fake Null Island (0°N 0°E) position.
This commit is contained in:
Thomas Kuehne
2026-04-11 01:43:45 +02:00
committed by José Rebelo
parent 9344940260
commit 4da08f7968
@@ -44,6 +44,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind;
import nodomain.freeyourgadget.gadgetbridge.model.ActivityPoint;
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryData;
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryParser;
import nodomain.freeyourgadget.gadgetbridge.model.GPSCoordinate;
import nodomain.freeyourgadget.gadgetbridge.model.workout.Workout;
import nodomain.freeyourgadget.gadgetbridge.model.workout.WorkoutChart;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitFile;
@@ -761,8 +762,8 @@ public class GarminWorkoutParser implements ActivitySummaryParser {
}
summaryData.setHasGps(
activityPoints.stream().anyMatch(p -> p.getLocation() != null) ||
sessionActivityPoints.stream().anyMatch(p -> p.getLocation() != null)
activityPoints.stream().anyMatch(GarminWorkoutParser::hasNonNullIslandLocation) ||
sessionActivityPoints.stream().anyMatch(GarminWorkoutParser::hasNonNullIslandLocation)
);
summary.setSummaryData(summaryData.toString());
@@ -770,6 +771,20 @@ public class GarminWorkoutParser implements ActivitySummaryParser {
return summaryData;
}
// Some indoor activities record all points with fake Null Island (0°N 0°E) position.
private static boolean hasNonNullIslandLocation(final ActivityPoint point) {
if (point != null) {
final GPSCoordinate location = point.getLocation();
if (location != null) {
final double lat = location.getLatitude();
final double lon = location.getLongitude();
// test for any value other than NaN and 0.0
return (lat == lat && lat != 0.0) || (lon == lon && lon != 0.0);
}
}
return false;
}
public Number safeRound(final Number number) {
if (number == null) {
return null;