From dc60a72e4fd08e038b5ffe4087a6b7942575999e Mon Sep 17 00:00:00 2001 From: punchdeerflyscorpion Date: Sun, 19 Oct 2025 08:49:55 +0200 Subject: [PATCH] Add diving graphs (garmin) --- .../workouts/charts/DefaultWorkoutCharts.java | 70 +++++++++++++++++++ .../gadgetbridge/model/ActivityPoint.java | 8 +++ .../model/ActivitySummaryEntries.java | 1 + .../garmin/fit/messages/FitRecord.java | 7 ++ app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 1 + 6 files changed, 88 insertions(+) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/workouts/charts/DefaultWorkoutCharts.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/workouts/charts/DefaultWorkoutCharts.java index a4b71b4fbf..c0476278ee 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/workouts/charts/DefaultWorkoutCharts.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/workouts/charts/DefaultWorkoutCharts.java @@ -2,6 +2,7 @@ package nodomain.freeyourgadget.gadgetbridge.activities.workouts.charts; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_BPM; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_BREATHS_PER_MIN; +import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_CELSIUS; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_KMPH; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_METERS; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_METERS_PER_SECOND; @@ -53,6 +54,8 @@ public class DefaultWorkoutCharts { final List elevationDataPoints = new ArrayList<>(); final List powerDataPoints = new ArrayList<>(); final List respiratoryRatePoints = new ArrayList<>(); + final List temperatureDataPoints = new ArrayList<>(); + final List depthDataPoints = new ArrayList<>(); boolean hasSpeedValues = false; boolean hasCadenceValues = false; boolean hasElevationValues = false; @@ -94,6 +97,16 @@ public class DefaultWorkoutCharts { if (point.getRespiratoryRate() >= 0) { respiratoryRatePoints.add(new Entry(tsShorten, point.getRespiratoryRate())); } + + // Depth (diving activity) + if (point.getDepth() > 0) { + depthDataPoints.add(new Entry(tsShorten, (float) point.getDepth() * -1)); + } + + // Temperature + if (point.getTemperature() > -273) { + temperatureDataPoints.add(new Entry(tsShorten, (float) point.getTemperature())); + } } if (!heartRateDataPoints.isEmpty()) { @@ -120,6 +133,14 @@ public class DefaultWorkoutCharts { charts.add(createRespiratoryRateChart(context, respiratoryRatePoints)); } + if (!depthDataPoints.isEmpty()) { + charts.add(createDepthChart(context, depthDataPoints)); + } + + if (!temperatureDataPoints.isEmpty()) { + charts.add(createTemperatureChart(context, temperatureDataPoints)); + } + return charts; } @@ -265,6 +286,55 @@ public class DefaultWorkoutCharts { ); } + private static WorkoutChart createDepthChart(final Context context, + final List depthDataPoints) { + final String label = String.format("%s(%s)", context.getString(R.string.diving_depth), getUnitString(context, UNIT_METERS)); + final LineDataSet dataset = createLineDataSet(context, depthDataPoints, label, ContextCompat.getColor(context, R.color.chart_line_depth)); + final ValueFormatter integerFormatter = new ValueFormatter() { + @Override + public String getFormattedValue(float value) { + return String.valueOf((int) value); + } + }; + return new WorkoutChart( + "diving_depth", + context.getString(R.string.diving_depth), + ActivitySummaryEntries.GROUP_DIVING, + new LineData(dataset), + integerFormatter, + getUnitString(context, UNIT_METERS) + ); + } + + private static WorkoutChart createTemperatureChart(final Context context, + final List temperatureDataPoints) { + final String label = String.format("%s(%s)", context.getString(R.string.menuitem_temperature), getUnitString(context, UNIT_CELSIUS)); + final LineDataSet dataset = createLineDataSet(context, temperatureDataPoints, label, ContextCompat.getColor(context, R.color.chart_line_heart_rate)); + final ValueFormatter integerFormatter = new ValueFormatter() { + @Override + public String getFormattedValue(float value) { + return String.valueOf((int) value); + } + }; + return new WorkoutChart( + "temperature", + context.getString(R.string.menuitem_temperature), + ActivitySummaryEntries.GROUP_OTHER, + new LineData(dataset), + integerFormatter, + getUnitString(context, UNIT_CELSIUS), + lineChart -> { + YAxis yAxisLeft = lineChart.getAxisLeft(); + yAxisLeft.setAxisMinimum(0); + yAxisLeft.setAxisMaximum(35); + YAxis yAxisRight = lineChart.getAxisRight(); + yAxisRight.setAxisMinimum(0); + yAxisRight.setAxisMaximum(35); + return kotlin.Unit.INSTANCE; + } + ); + } + public static String getUnitString(final Context context, final String unit) { final int resId = context.getResources().getIdentifier(unit, "string", context.getPackageName()); if (resId != 0) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityPoint.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityPoint.java index a2edeb87fd..25cb481260 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityPoint.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityPoint.java @@ -43,6 +43,8 @@ public class ActivityPoint { private int cadence = -1; private int power = -1; private float respiratoryRate = -1; + private double depth = -1; + private double temperature = -273; // e.g. to describe a pause during the activity private @Nullable String description; @@ -118,4 +120,10 @@ public class ActivityPoint { public void setRespiratoryRate(final float respiratoryRate) { this.respiratoryRate = respiratoryRate; } + + public double getTemperature() {return temperature; } + public void setTemperature(final double temperature) { this.temperature = temperature; } + public double getDepth() {return depth; } + public void setDepth(final double depth) { this.depth = depth; } + } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryEntries.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryEntries.java index 8a7a852464..f3f25f0039 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryEntries.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryEntries.java @@ -230,6 +230,7 @@ public class ActivitySummaryEntries { public static final String UNIT_SECONDS_PER_100_METERS = "seconds_100m"; public static final String UNIT_MINUTES_PER_100_YARDS = "minutes_100yd"; public static final String UNIT_SECONDS_PER_100_YARDS = "seconds_100yd"; + public static final String UNIT_CELSIUS = "unit_celsius"; public static final String GROUP_PACE = "Pace"; public static final String GROUP_ACTIVITY = "Activity"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecord.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecord.java index 7d8811afa1..7c4175c02f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecord.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecord.java @@ -1010,6 +1010,13 @@ public class FitRecord extends RecordData { if (getEnhancedRespirationRate() != null) { activityPoint.setRespiratoryRate(getEnhancedRespirationRate()); } + if (getTemperature() != null) { + activityPoint.setTemperature(getTemperature()); + } + if (getDepth() != null) { + activityPoint.setDepth(getDepth()); + } + return activityPoint; } } diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 1d0369a6b6..cb3952c2d6 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -97,6 +97,7 @@ #F9DB22 #6495ED #ffff8800 + #ff4040ff #FFEDEDED diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a93e4e6a84..5c12080545 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2657,6 +2657,7 @@ %1$d x %2$.2f kg %1$d x %2$.2f lbs Average depth + Depth Average descent rate Average ascent rate Max descent rate