Add support for nautical units

This commit is contained in:
José Rebelo
2026-03-24 21:49:26 +00:00
parent 07fb5704c7
commit 8a16ab2f66
6 changed files with 63 additions and 1 deletions
@@ -1,8 +1,11 @@
package nodomain.freeyourgadget.gadgetbridge.activities.workouts;
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.DISTANCE_METERS;
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_KMPH;
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_KNOTS;
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_HOUR;
@@ -10,6 +13,7 @@ import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_MINUTES_PER_100_METERS;
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_MINUTES_PER_100_YARDS;
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_MM;
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_NAUTICAL_MILES;
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_SECONDS_PER_100_METERS;
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_SECONDS_PER_100_YARDS;
import static nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries.UNIT_SECONDS_PER_KM;
@@ -26,6 +30,7 @@ import nodomain.freeyourgadget.gadgetbridge.BuildConfig;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity;
import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind;
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryEntries;
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
@@ -34,15 +39,23 @@ public class WorkoutValueFormatter {
private boolean show_raw_data = false;
private final ActivityKind activityKind;
private final String units;
private final String UNIT_IMPERIAL;
private final String UNIT_METRIC;
private final boolean useNauticalUnits;
private final DecimalFormat df = new DecimalFormat("#.##");
public WorkoutValueFormatter() {
this(ActivityKind.UNKNOWN);
}
public WorkoutValueFormatter(final ActivityKind activityKind) {
this.activityKind = activityKind;
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);
this.useNauticalUnits = ActivityKind.isNauticalActivity(activityKind) && GBApplication.getPrefs().getBoolean("units_nautical", true);
}
public void toggleRawData() {
@@ -146,7 +159,10 @@ public class WorkoutValueFormatter {
}
break;
case UNIT_METERS:
if (units.equals(UNIT_IMPERIAL)) {
if (useNauticalUnits) {
value = value / 1852D;
unit = UNIT_NAUTICAL_MILES;
} else if (units.equals(UNIT_IMPERIAL)) {
value = value * 3.28084D;
unit = "ft";
if (value > 6000) {
@@ -160,6 +176,15 @@ public class WorkoutValueFormatter {
}
}
break;
case UNIT_KMPH:
if (useNauticalUnits) {
value = value / 1.852D;
unit = UNIT_KNOTS;
} else if (units.equals(UNIT_IMPERIAL)) {
value = value * 0.621371D;
unit = "mi_h";
}
break;
case UNIT_SECONDS_PER_100_METERS:
if (units.equals(UNIT_IMPERIAL)) {
value = (value * 0.9144) / 60D;
@@ -403,6 +403,18 @@ public enum ActivityKind {
activityKind.name().contains("TREADMILL") || activityKind.name().contains("WALK");
}
public static boolean isNauticalActivity(final ActivityKind activityKind) {
return activityKind == SAILING
|| activityKind == SAIL_RACE
|| activityKind == SAIL_EXPEDITION
|| activityKind == BOATING
|| activityKind == POWERBOATING
|| activityKind == MARINE
|| activityKind == ANCHOR
|| activityKind == TROLLING_MOTOR
|| activityKind == WINDSURFING;
}
public static boolean isSwimActivity(final ActivityKind activityKind) {
return activityKind.name().contains("SWIM");
}
@@ -254,6 +254,8 @@ 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_NAUTICAL_MILES = "nautical_miles";
public static final String UNIT_KNOTS = "knots";
public static final String UNIT_CELSIUS = "unit_celsius";
public static final String GROUP_PACE = "Pace";
+12
View File
@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M11,13.5V2L3,13.5H11zM21,13.5C21,6.5 14.5,1 12.5,1c0,0 1,3 1,6.5s-1,6 -1,6H21zM22,15H2c0.31,1.53 1.16,2.84 2.33,3.73C4.98,18.46 5.55,18.01 6,17.5C6.73,18.34 7.8,19 9,19s2.27,-0.66 3,-1.5c0.73,0.84 1.8,1.5 3,1.5s2.26,-0.66 3,-1.5c0.45,0.51 1.02,0.96 1.67,1.23C20.84,17.84 21.69,16.53 22,15zM22,23v-2h-1c-1.04,0 -2.08,-0.35 -3,-1c-1.83,1.3 -4.17,1.3 -6,0c-1.83,1.3 -4.17,1.3 -6,0c-0.91,0.65 -1.96,1 -3,1H2l0,2h1c1.03,0 2.05,-0.25 3,-0.75c1.89,1 4.11,1 6,0c1.89,1 4.11,1 6,0h0c0.95,0.5 1.97,0.75 3,0.75H22z" />
</vector>
+4
View File
@@ -479,6 +479,8 @@
<string name="pref_device_version">Device version</string>
<!-- HPlus Preferences -->
<string name="pref_title_unit_system">Units</string>
<string name="pref_title_nautical_units">Nautical units</string>
<string name="pref_summary_nautical_units">Display speed and distance units in knots / miles for nautical activities</string>
<string name="pref_title_timeformat">Time format</string>
<string name="pref_title_screentime">Screen on duration</string>
<string name="pref_title_goal_secondary">Secondary goal</string>
@@ -2780,6 +2782,8 @@
<string name="centimeters_second">cm/s</string>
<string name="km_h">km/h</string>
<string name="mi_h">mi/h</string>
<string name="nautical_miles">M</string>
<string name="knots">kn</string>
<string name="meters_per_hour">m/h</string>
<string name="foot_per_hour">ft/h</string>
<string name="minutes_mi">min/mi</string>
+7
View File
@@ -79,6 +79,13 @@
android:title="@string/pref_title_unit_system"
android:icon="@drawable/ic_straighten"
app:useSimpleSummaryProvider="true" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="units_nautical"
android:layout="@layout/preference_checkbox"
android:summary="@string/pref_summary_nautical_units"
android:icon="@drawable/ic_sailing"
android:title="@string/pref_title_nautical_units" />
<PreferenceScreen
android:key="pref_screen_rtl"
android:title="@string/preferences_rtl_settings"