From f3b204366c1607c844ca24d46bb7c77062fa5fc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Sat, 8 Mar 2025 22:27:53 +0000 Subject: [PATCH] Garmin: Use user profile weight unit --- .../workouts/WorkoutValueFormatter.java | 11 +++++++++- .../devices/garmin/GarminWorkoutParser.java | 21 ++++++++++++++++++- .../model/ActivitySummaryEntries.java | 1 + .../devices/garmin/fit/FitImporter.java | 3 +++ .../FieldDefinitionMeasurementSystem.java | 1 + 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/workouts/WorkoutValueFormatter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/workouts/WorkoutValueFormatter.java index ad98858ca..e83d1460a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/workouts/WorkoutValueFormatter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/workouts/WorkoutValueFormatter.java @@ -3,6 +3,7 @@ package nodomain.freeyourgadget.gadgetbridge.activities.workouts; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_CM; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_KG; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_KILOMETERS; +import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_LB; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_METERS; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_METERS_PER_SECOND; import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_MM; @@ -30,11 +31,13 @@ public class WorkoutValueFormatter { private final String units; private final String UNIT_IMPERIAL; + private final String UNIT_METRIC; private final DecimalFormat df = new DecimalFormat("#.##"); public WorkoutValueFormatter() { this.units = GBApplication.getPrefs().getString(SettingsActivity.PREF_MEASUREMENT_SYSTEM, GBApplication.getContext().getString(R.string.p_unit_metric)); this.UNIT_IMPERIAL = GBApplication.getContext().getString(R.string.p_unit_imperial); + this.UNIT_METRIC = GBApplication.getContext().getString(R.string.p_unit_metric); } public void toggleRawData() { @@ -83,7 +86,13 @@ public class WorkoutValueFormatter { case UNIT_KG: if (units.equals(UNIT_IMPERIAL)) { value = value * 2.2046226f; - unit = "lb"; + unit = UNIT_LB; + } + break; + case UNIT_LB: + if (units.equals(UNIT_METRIC)) { + value = value / 2.2046226f; + unit = UNIT_KG; } break; case UNIT_CM: 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 28ce5087d..76c8e5cff 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 @@ -29,6 +29,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitFile; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.enums.GarminSport; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.exception.FitParseException; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.fieldDefinitions.FieldDefinitionMeasurementSystem; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitLap; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitPhysiologicalMetrics; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitRecord; @@ -36,6 +37,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages. import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitSet; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitSport; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitTimeInZone; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitUserProfile; import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; public class GarminWorkoutParser implements ActivitySummaryParser { @@ -47,6 +49,7 @@ public class GarminWorkoutParser implements ActivitySummaryParser { private final List activityPoints = new ArrayList<>(); private FitSession session = null; private FitSport sport = null; + private FitUserProfile userProfile = null; private FitPhysiologicalMetrics physiologicalMetrics = null; private final List sets = new ArrayList<>(); private final List laps = new ArrayList<>(); @@ -103,6 +106,7 @@ public class GarminWorkoutParser implements ActivitySummaryParser { activityPoints.clear(); session = null; sport = null; + userProfile = null; physiologicalMetrics = null; sets.clear(); laps.clear(); @@ -139,6 +143,14 @@ public class GarminWorkoutParser implements ActivitySummaryParser { } else if (record instanceof FitLap) { LOG.trace("Lap: {}", record); laps.add((FitLap) record); + } else if (record instanceof FitUserProfile) { + LOG.trace("User Profile: {}", record); + if (userProfile != null) { + LOG.warn("Got multiple user profiles - NOT SUPPORTED: {}", record); + } else { + // We only support 1 user profile + userProfile = (FitUserProfile) record; + } } else { return false; } @@ -163,6 +175,13 @@ public class GarminWorkoutParser implements ActivitySummaryParser { } final ActivityKind.CycleUnit cycleUnit = ActivityKind.getCycleUnit(activityKind); + final String weightUnit; + if (userProfile != null && userProfile.getWeightSetting() != null) { + weightUnit = FieldDefinitionMeasurementSystem.Type.metric.equals(userProfile.getWeightSetting()) ? UNIT_KG : UNIT_LB; + } else { + weightUnit = UNIT_KG; + } + summary.setActivityKind(activityKind.getCode()); if (session.getTotalElapsedTime() != null) { @@ -495,7 +514,7 @@ public class GarminWorkoutParser implements ActivitySummaryParser { } if (set.getWeight() != null) { - columns.add(new ActivitySummaryValue(set.getWeight(), UNIT_KG)); + columns.add(new ActivitySummaryValue(set.getWeight(), weightUnit)); } else { columns.add(new ActivitySummaryValue("stats_empty_value")); } 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 2e3351886..4a3083026 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryEntries.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryEntries.java @@ -208,6 +208,7 @@ public class ActivitySummaryEntries { public static final String UNIT_STRING = "string"; public static final String UNIT_RAW_STRING = "raw_string"; public static final String UNIT_KG = "kg"; + public static final String UNIT_LB = "lb"; public static final String UNIT_RPM = "unit_rpm"; public static final String UNIT_MM = "unit_millimeter"; public static final String UNIT_WATT = "unit_watt"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/FitImporter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/FitImporter.java index 9c47763e4..6397c0f97 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/FitImporter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/FitImporter.java @@ -85,6 +85,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages. import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitSport; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitStressLevel; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitTimeInZone; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitUserProfile; import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; import nodomain.freeyourgadget.gadgetbridge.util.GB; @@ -266,6 +267,8 @@ public class FitImporter { // handled in workout parser } else if (record instanceof FitTimeInZone) { // handled in workout parser + } else if (record instanceof FitUserProfile) { + // handled in workout parser } else if (record instanceof FitHrvSummary) { final FitHrvSummary hrvSummary = (FitHrvSummary) record; LOG.trace("HRV summary at {}: {}", ts, record); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionMeasurementSystem.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionMeasurementSystem.java index 83348f090..369378b18 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionMeasurementSystem.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionMeasurementSystem.java @@ -29,6 +29,7 @@ public class FieldDefinitionMeasurementSystem extends FieldDefinition { public enum Type { metric, + imperial, ; public static Type fromId(int id) {