From eb8d28dfc1a7d4081efb3e63f918207c5258e4a1 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Thu, 15 Jun 2023 18:23:50 +0200 Subject: [PATCH] Units: add imperial with meters. Fixes of #1609. --- .../opentracks/chart/ChartPointTest.java | 2 +- .../data/models/DistanceFormatterTest.java | 2 +- .../opentracks/data/models/SpeedFormatterTest.java | 4 ++-- .../announcement/VoiceAnnouncementUtilsTest.java | 8 ++++---- .../opentracks/chart/ChartValueSeries.java | 2 +- .../de/dennisguse/opentracks/chart/ChartView.java | 2 +- .../opentracks/data/models/Distance.java | 10 ++++------ .../opentracks/data/models/DistanceFormatter.java | 14 +++++++++++--- .../dennisguse/opentracks/data/models/Speed.java | 5 +---- .../opentracks/data/models/SpeedFormatter.java | 2 +- .../announcement/VoiceAnnouncementUtils.java | 2 +- .../settings/DefaultsSettingsFragment.java | 3 ++- .../opentracks/settings/PreferencesUtils.java | 10 +++++----- .../dennisguse/opentracks/settings/UnitSystem.java | 5 ++++- .../opentracks/share/DescriptionGenerator.java | 2 +- src/main/res/values/settings.xml | 7 +++++-- src/main/res/values/strings.xml | 1 + 17 files changed, 46 insertions(+), 35 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/chart/ChartPointTest.java b/src/androidTest/java/de/dennisguse/opentracks/chart/ChartPointTest.java index 3744e7e32..217802f58 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/chart/ChartPointTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/chart/ChartPointTest.java @@ -27,7 +27,7 @@ public class ChartPointTest { statistics.setTotalTime(Duration.ofSeconds(1000)); // when - ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(0), false, UnitSystem.IMPERIAL); + ChartPoint point = new ChartPoint(statistics, TrackStubUtils.createDefaultTrackPoint(), Speed.of(0), false, UnitSystem.IMPERIAL_FEET); // then assertEquals(1000000, (long) point.getTimeOrDistance()); diff --git a/src/androidTest/java/de/dennisguse/opentracks/data/models/DistanceFormatterTest.java b/src/androidTest/java/de/dennisguse/opentracks/data/models/DistanceFormatterTest.java index 5eb52f5fe..61bd210d1 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/data/models/DistanceFormatterTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/data/models/DistanceFormatterTest.java @@ -35,7 +35,7 @@ public class DistanceFormatterTest { public void testFormatDistance_imperial() { DistanceFormatter formatter = DistanceFormatter.Builder() .setDecimalCount(2) - .setUnit(UnitSystem.IMPERIAL) + .setUnit(UnitSystem.IMPERIAL_FEET) .build(context); // A large number in imperial diff --git a/src/androidTest/java/de/dennisguse/opentracks/data/models/SpeedFormatterTest.java b/src/androidTest/java/de/dennisguse/opentracks/data/models/SpeedFormatterTest.java index f7f0fa668..7a7618d2d 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/data/models/SpeedFormatterTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/data/models/SpeedFormatterTest.java @@ -36,7 +36,7 @@ public class SpeedFormatterTest { public void testGetSpeedParts_pace_imperial() { SpeedFormatter formatter = SpeedFormatter.Builder() .setDecimalCount(2) - .setUnit(UnitSystem.IMPERIAL) + .setUnit(UnitSystem.IMPERIAL_FEET) .setReportSpeedOrPace(false) .build(context); @@ -72,7 +72,7 @@ public class SpeedFormatterTest { public void testGetSpeedParts_speed_imperial() { SpeedFormatter formatter = SpeedFormatter.Builder() .setDecimalCount(2) - .setUnit(UnitSystem.IMPERIAL) + .setUnit(UnitSystem.IMPERIAL_FEET) .setReportSpeedOrPace(true) .build(context); diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtilsTest.java index 76e8771e0..aea280e68 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtilsTest.java @@ -185,7 +185,7 @@ public class VoiceAnnouncementUtilsTest { stats.setTotalAltitudeGain(6000f); // when - String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL, true, null, null).toString(); + String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, true, null, null).toString(); // then assertEquals("Total distance 12.4 miles. 1 hour 5 minutes 10 seconds. Average moving speed 11.4 miles per hour.", announcement); @@ -207,7 +207,7 @@ public class VoiceAnnouncementUtilsTest { } // when - String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL, true, lastInterval, null).toString(); + String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, true, lastInterval, null).toString(); // then assertEquals("Total distance 8.8 miles. 16 minutes 39 seconds. Average moving speed 31.8 miles per hour. Lap speed 31.8 miles per hour.", announcement); @@ -223,7 +223,7 @@ public class VoiceAnnouncementUtilsTest { stats.setTotalAltitudeGain(6000f); // when - String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL, false, null, null).toString(); + String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, false, null, null).toString(); // then assertEquals("Total distance 12.4 miles. 1 hour 5 minutes 10 seconds. Pace 5 minutes 15 seconds per mile.", announcement); @@ -245,7 +245,7 @@ public class VoiceAnnouncementUtilsTest { } // when - String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL, false, lastInterval, null).toString(); + String announcement = VoiceAnnouncementUtils.getAnnouncement(context, stats, UnitSystem.IMPERIAL_FEET, false, lastInterval, null).toString(); // then assertEquals("Total distance 8.8 miles. 16 minutes 39 seconds. Pace 1 minute 53 seconds per mile. Lap time 1 minute 53 seconds per mile.", announcement); diff --git a/src/main/java/de/dennisguse/opentracks/chart/ChartValueSeries.java b/src/main/java/de/dennisguse/opentracks/chart/ChartValueSeries.java index 6a7dd48d5..c99ee47da 100644 --- a/src/main/java/de/dennisguse/opentracks/chart/ChartValueSeries.java +++ b/src/main/java/de/dennisguse/opentracks/chart/ChartValueSeries.java @@ -212,7 +212,7 @@ abstract class ChartValueSeries { int getTitleId(UnitSystem unitSystem) { return switch (unitSystem) { case METRIC -> metricTitleId; - case IMPERIAL -> imperialTitleId; + case IMPERIAL_FEET, IMPERIAL_METER -> imperialTitleId; case NAUTICAL_IMPERIAL -> nauticalTitleId; }; } diff --git a/src/main/java/de/dennisguse/opentracks/chart/ChartView.java b/src/main/java/de/dennisguse/opentracks/chart/ChartView.java index 2d08711e6..ec1566cc0 100644 --- a/src/main/java/de/dennisguse/opentracks/chart/ChartView.java +++ b/src/main/java/de/dennisguse/opentracks/chart/ChartView.java @@ -735,7 +735,7 @@ public class ChartView extends View { if (chartByDistance) { return switch (unitSystem) { case METRIC -> context.getString(R.string.unit_kilometer); - case IMPERIAL -> context.getString(R.string.unit_mile); + case IMPERIAL_FEET, IMPERIAL_METER -> context.getString(R.string.unit_mile); case NAUTICAL_IMPERIAL -> context.getString(R.string.unit_nautical_mile); }; } else { diff --git a/src/main/java/de/dennisguse/opentracks/data/models/Distance.java b/src/main/java/de/dennisguse/opentracks/data/models/Distance.java index 0bb197eef..b009da8b5 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/Distance.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/Distance.java @@ -3,8 +3,6 @@ package de.dennisguse.opentracks.data.models; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import java.util.Objects; - import de.dennisguse.opentracks.settings.UnitSystem; public record Distance(double distance_m) { @@ -57,7 +55,7 @@ public record Distance(double distance_m) { public static Distance one(UnitSystem unitSystem) { return switch (unitSystem) { case METRIC -> Distance.ofKilometer(1); - case IMPERIAL -> Distance.ofMile(1); + case IMPERIAL_FEET, IMPERIAL_METER -> Distance.ofMile(1); case NAUTICAL_IMPERIAL -> Distance.ofNauticalMile(1); }; } @@ -121,15 +119,15 @@ public record Distance(double distance_m) { public double toKM_Miles(UnitSystem unitSystem) { return switch (unitSystem) { case METRIC -> toKM(); - case IMPERIAL -> toMI(); + case IMPERIAL_FEET, IMPERIAL_METER -> toMI(); case NAUTICAL_IMPERIAL -> toNauticalMiles(); }; } public double toM_FT(UnitSystem unitSystem) { return switch (unitSystem) { - case METRIC -> toM(); - case NAUTICAL_IMPERIAL, IMPERIAL -> toFT(); + case METRIC, IMPERIAL_METER -> toM(); + case NAUTICAL_IMPERIAL, IMPERIAL_FEET -> toFT(); }; } diff --git a/src/main/java/de/dennisguse/opentracks/data/models/DistanceFormatter.java b/src/main/java/de/dennisguse/opentracks/data/models/DistanceFormatter.java index 8c853f048..1be2a1e5f 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/DistanceFormatter.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/DistanceFormatter.java @@ -47,8 +47,9 @@ public class DistanceFormatter { if (distance.isInvalid()) { String valueUnknown = resources.getString(R.string.value_unknown); return switch (unitSystem) { - case METRIC -> new Pair<>(valueUnknown, resources.getString(R.string.unit_meter)); - case IMPERIAL, NAUTICAL_IMPERIAL -> + case METRIC, IMPERIAL_METER -> + new Pair<>(valueUnknown, resources.getString(R.string.unit_meter)); + case IMPERIAL_FEET, NAUTICAL_IMPERIAL -> new Pair<>(valueUnknown, resources.getString(R.string.unit_feet)); }; } @@ -61,13 +62,20 @@ public class DistanceFormatter { return new Pair<>(StringUtils.formatDecimal(distance.toM(), decimalCount), resources.getString(R.string.unit_meter)); } } - case IMPERIAL -> { + case IMPERIAL_FEET -> { if (distance.greaterThan(Distance.ofMile(threshold))) { return new Pair<>(StringUtils.formatDecimal(distance.toMI(), decimalCount), resources.getString(R.string.unit_mile)); } else { return new Pair<>(StringUtils.formatDecimal(distance.toFT(), decimalCount), resources.getString(R.string.unit_feet)); } } + case IMPERIAL_METER -> { + if (distance.greaterThan(Distance.ofMile(threshold))) { + return new Pair<>(StringUtils.formatDecimal(distance.toMI(), decimalCount), resources.getString(R.string.unit_mile)); + } else { + return new Pair<>(StringUtils.formatDecimal(distance.toM(), decimalCount), resources.getString(R.string.unit_meter)); + } + } case NAUTICAL_IMPERIAL -> { if (distance.greaterThan(Distance.ofNauticalMile(threshold))) { return new Pair<>(StringUtils.formatDecimal(distance.toNauticalMiles(), decimalCount), resources.getString(R.string.unit_nautical_mile)); diff --git a/src/main/java/de/dennisguse/opentracks/data/models/Speed.java b/src/main/java/de/dennisguse/opentracks/data/models/Speed.java index 46a0d6289..7714b678a 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/Speed.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/Speed.java @@ -1,9 +1,6 @@ package de.dennisguse.opentracks.data.models; -import androidx.annotation.NonNull; - import java.time.Duration; -import java.util.Objects; import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.settings.UnitSystem; @@ -111,7 +108,7 @@ public record Speed(double speed_mps) { public double to(UnitSystem unitSystem) { return switch (unitSystem) { case METRIC -> toKMH(); - case IMPERIAL -> toMPH(); + case IMPERIAL_FEET, IMPERIAL_METER -> toMPH(); case NAUTICAL_IMPERIAL -> toKnots(); }; } diff --git a/src/main/java/de/dennisguse/opentracks/data/models/SpeedFormatter.java b/src/main/java/de/dennisguse/opentracks/data/models/SpeedFormatter.java index d58fc384e..038b489ac 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/SpeedFormatter.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/SpeedFormatter.java @@ -42,7 +42,7 @@ public class SpeedFormatter { int unitId = switch (unitSystem) { case METRIC -> reportSpeedOrPace ? R.string.unit_kilometer_per_hour : R.string.unit_minute_per_kilometer; - case IMPERIAL -> + case IMPERIAL_FEET, IMPERIAL_METER -> reportSpeedOrPace ? R.string.unit_mile_per_hour : R.string.unit_minute_per_mile; case NAUTICAL_IMPERIAL -> reportSpeedOrPace ? R.string.unit_knots : R.string.unit_minute_per_nautical_mile; diff --git a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtils.java b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtils.java index 9e91dd194..f28518fac 100644 --- a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtils.java +++ b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtils.java @@ -50,7 +50,7 @@ class VoiceAnnouncementUtils { unitDistanceTTS = "kilometer"; unitSpeedTTS = "kilometer per hour"; } - case IMPERIAL -> { + case IMPERIAL_FEET -> { perUnitStringId = R.string.voice_per_mile; distanceId = R.plurals.voiceDistanceMiles; speedId = R.plurals.voiceSpeedMilesPerHour; diff --git a/src/main/java/de/dennisguse/opentracks/settings/DefaultsSettingsFragment.java b/src/main/java/de/dennisguse/opentracks/settings/DefaultsSettingsFragment.java index 156e45bf4..59a6ab64e 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/DefaultsSettingsFragment.java +++ b/src/main/java/de/dennisguse/opentracks/settings/DefaultsSettingsFragment.java @@ -70,7 +70,8 @@ public class DefaultsSettingsFragment extends PreferenceFragmentCompat implement int entriesId = switch (unitSystem) { case METRIC -> R.array.stats_rate_metric_options; - case IMPERIAL, NAUTICAL_IMPERIAL -> R.array.stats_rate_imperial_options; + case IMPERIAL_FEET, IMPERIAL_METER, NAUTICAL_IMPERIAL -> + R.array.stats_rate_imperial_options; }; String[] entries = getResources().getStringArray(entriesId); diff --git a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java index 58d4eb680..1835b1f42 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java +++ b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java @@ -228,7 +228,7 @@ public class PreferencesUtils { if (!Locale.US.equals(Locale.getDefault())) { setUnit(UnitSystem.METRIC); } else { - setUnit(UnitSystem.IMPERIAL); + setUnit(UnitSystem.IMPERIAL_FEET); } } } @@ -455,7 +455,7 @@ public class PreferencesUtils { entries[i] = displayValue; } } - case IMPERIAL, NAUTICAL_IMPERIAL -> { + case IMPERIAL_FEET, NAUTICAL_IMPERIAL -> { if (value == recordingDistanceIntervalDefault) { entries[i] = resources.getString(R.string.value_integer_feet_recommended, (int) distance.toFT()); } else { @@ -499,7 +499,7 @@ public class PreferencesUtils { entries[i] = displayValue; } } - case IMPERIAL, NAUTICAL_IMPERIAL -> { + case IMPERIAL_FEET, NAUTICAL_IMPERIAL -> { if (value == maxRecordingDistanceDefault) { entries[i] = resources.getString(R.string.value_integer_feet_recommended, (int) distance.toFT()); } else { @@ -576,7 +576,7 @@ public class PreferencesUtils { entries[i] = displayValue; } } - case IMPERIAL, NAUTICAL_IMPERIAL -> { + case IMPERIAL_FEET, NAUTICAL_IMPERIAL -> { if (value == recordingGPSAccuracyDefault) { entries[i] = resources.getString(R.string.value_integer_feet_recommended, (int) distance.toFT()); } else if (value == recordingGPSAccuracyExcellent) { @@ -618,7 +618,7 @@ public class PreferencesUtils { entries[i] = resources.getString(R.string.value_float_kilometer_hour, value); } } - case IMPERIAL -> { + case IMPERIAL_FEET -> { double valueMPH = Speed.ofKMH(value).toMPH(); if (value == idleSpeedDefault) { entries[i] = resources.getString(R.string.value_float_mile_hour_recommended, valueMPH); diff --git a/src/main/java/de/dennisguse/opentracks/settings/UnitSystem.java b/src/main/java/de/dennisguse/opentracks/settings/UnitSystem.java index 2cdeff1e6..1d4f41f0a 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/UnitSystem.java +++ b/src/main/java/de/dennisguse/opentracks/settings/UnitSystem.java @@ -4,7 +4,10 @@ import de.dennisguse.opentracks.R; public enum UnitSystem { METRIC(R.string.stats_units_metric), - IMPERIAL(R.string.stats_units_imperial), + + IMPERIAL_FEET(R.string.stats_units_imperial_feet), + IMPERIAL_METER(R.string.stats_units_imperial_meter), + NAUTICAL_IMPERIAL(R.string.stats_units_nautical); // Nautical miles with feet private final int preferenceIdentifier; diff --git a/src/main/java/de/dennisguse/opentracks/share/DescriptionGenerator.java b/src/main/java/de/dennisguse/opentracks/share/DescriptionGenerator.java index 2dec8ed1a..45d086a7d 100644 --- a/src/main/java/de/dennisguse/opentracks/share/DescriptionGenerator.java +++ b/src/main/java/de/dennisguse/opentracks/share/DescriptionGenerator.java @@ -211,7 +211,7 @@ public class DescriptionGenerator { @VisibleForTesting void writePace(Speed speed, StringBuilder builder, int resId, String lineBreak) { Pair paceInMetrics = SpeedFormatter.Builder().setUnit(UnitSystem.METRIC).setReportSpeedOrPace(false).build(context).getSpeedParts(speed); - Pair paceInImperial = SpeedFormatter.Builder().setUnit(UnitSystem.IMPERIAL).setReportSpeedOrPace(false).build(context).getSpeedParts(speed); + Pair paceInImperial = SpeedFormatter.Builder().setUnit(UnitSystem.IMPERIAL_FEET).setReportSpeedOrPace(false).build(context).getSpeedParts(speed); String formattedPaceMetrics = paceInMetrics.first != null ? paceInMetrics.first : context.getString(R.string.value_unknown); String formattedPaceImperial = paceInImperial.first != null ? paceInImperial.first : context.getString(R.string.value_unknown); diff --git a/src/main/res/values/settings.xml b/src/main/res/values/settings.xml index a2ad42e87..95ea4ecc1 100644 --- a/src/main/res/values/settings.xml +++ b/src/main/res/values/settings.xml @@ -169,15 +169,18 @@ @string/stats_units_metric @string/stats_units_metric - @string/stats_units_imperial + @string/stats_units_imperial_feet + @string/stats_units_imperial_meter @string/stats_units_nautical METRIC - IMPERIAL + IMPERIAL + IMPERIAL_METER NAUTICAL @string/settings_stats_units_metric @string/settings_stats_units_imperial + @string/settings_stats_units_imperial_meter @string/settings_stats_units_nautical diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 1fba61506..872996f9f 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -440,6 +440,7 @@ limitations under the License. Preferred rate Imperial (mi, ft) + Imperial (mi, m) Metric (km, m) Nautical (NM, ft) Preferred units