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 02c2f4e27..3af78a129 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/data/models/DistanceFormatterTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/data/models/DistanceFormatterTest.java @@ -16,18 +16,28 @@ public class DistanceFormatterTest { private final Context context = ApplicationProvider.getApplicationContext(); @Test - public void testFormatDistance() { + public void testFormatDistance_metric() { DistanceFormatter formatter = DistanceFormatter.Builder() .setDecimalCount(2) + .setMetricUnits(true) .build(context); // A large number in metric - assertEquals("5.00 km", formatter.formatDistance(Distance.of(5000), true)); - // A large number in imperial - assertEquals("3.11 mi", formatter.formatDistance(Distance.of(5000), false)); + assertEquals("5.00 km", formatter.formatDistance(Distance.of(5000))); // A small number in metric - assertEquals("100.00 m", formatter.formatDistance(Distance.of(100), true)); + assertEquals("100.00 m", formatter.formatDistance(Distance.of(100))); + } + + @Test + public void testFormatDistance_imperial() { + DistanceFormatter formatter = DistanceFormatter.Builder() + .setDecimalCount(2) + .setMetricUnits(false) + .build(context); + + // A large number in imperial + assertEquals("3.11 mi", formatter.formatDistance(Distance.of(5000))); // A small number in imperial - assertEquals("328.08 ft", formatter.formatDistance(Distance.of(100), false)); + assertEquals("328.08 ft", formatter.formatDistance(Distance.of(100))); } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java index e593ebb7a..02fd3dc10 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java @@ -191,7 +191,9 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co int iconId = TrackIconUtils.getIconDrawable(icon); String name = cursor.getString(nameIndex); String totalTime = StringUtils.formatElapsedTime(Duration.ofMillis(cursor.getLong(totalTimeIndex))); - String totalDistance = DistanceFormatter.Builder().build(TrackListActivity.this).formatDistance(Distance.of(cursor.getDouble(totalDistanceIndex)), metricUnits); + String totalDistance = DistanceFormatter.Builder() + .setMetricUnits(metricUnits) + .build(TrackListActivity.this).formatDistance(Distance.of(cursor.getDouble(totalDistanceIndex))); int markerCount = cursor.getInt(markerCountIndex); long startTime = cursor.getLong(startTimeIndex); int startTimeOffset = cursor.getInt(startTimeOffsetIndex); 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 78c5e8608..ebd5f38ea 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/DistanceFormatter.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/DistanceFormatter.java @@ -13,17 +13,20 @@ public class DistanceFormatter { private final int decimalCount; - private DistanceFormatter(Resources resources, int decimalCount) { + private final boolean metricUnits; + + private DistanceFormatter(Resources resources, int decimalCount, boolean metricUnits) { this.resources = resources; this.decimalCount = decimalCount; + this.metricUnits = metricUnits; } - public String formatDistance(Distance distance, boolean metricUnits) { + public String formatDistance(Distance distance) { if (distance.isInvalid()) { return resources.getString(R.string.value_unknown); } - Pair distanceParts = getDistanceParts(distance, metricUnits); + Pair distanceParts = getDistanceParts(distance); return resources.getString(R.string.distance_with_unit, distanceParts.first, distanceParts.second); } @@ -34,7 +37,7 @@ public class DistanceFormatter { * @param metricUnits true to use metric unit * @return the formatted distance (or null) and it's unit as {@link Pair} */ - public Pair getDistanceParts(Distance distance, boolean metricUnits) { + public Pair getDistanceParts(Distance distance) { if (distance.isInvalid()) { return new Pair<>(null, resources.getString(metricUnits ? R.string.unit_meter : R.string.unit_feet)); } @@ -62,8 +65,11 @@ public class DistanceFormatter { private int decimalCount; + private boolean metricUnits; + public Builder() { decimalCount = 2; + metricUnits = true; } public Builder setDecimalCount(int decimalCount) { @@ -71,8 +77,13 @@ public class DistanceFormatter { return this; } + public Builder setMetricUnits(boolean metricUnits) { + this.metricUnits = metricUnits; + return this; + } + public DistanceFormatter build(Resources resource) { - return new DistanceFormatter(resource, decimalCount); + return new DistanceFormatter(resource, decimalCount, metricUnits); } public DistanceFormatter build(Context context) { diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java index ab5a23d2d..e5dc928f9 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java @@ -187,7 +187,9 @@ public class StatisticsRecordedFragment extends Fragment { TrackStatistics trackStatistics = track.getTrackStatistics(); // Set total distance { - Pair parts = DistanceFormatter.Builder().build(getContext()).getDistanceParts(trackStatistics.getTotalDistance(), preferenceMetricUnits); + Pair parts = DistanceFormatter.Builder() + .setMetricUnits(preferenceMetricUnits) + .build(getContext()).getDistanceParts(trackStatistics.getTotalDistance()); viewBinding.statsDistanceValue.setText(parts.first); viewBinding.statsDistanceUnit.setText(parts.second); diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java index 32b5ab07a..fcb731a1e 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java @@ -84,9 +84,11 @@ class TrackRecordingServiceNotificationManager implements SharedPreferences.OnSh void updateTrackPoint(Context context, TrackStatistics trackStatistics, TrackPoint trackPoint, Distance recordingGpsAccuracy) { String formattedAccuracy = context.getString(R.string.value_none); - DistanceFormatter formatter = DistanceFormatter.Builder().build(context); + DistanceFormatter formatter = DistanceFormatter.Builder() + .setMetricUnits(metricUnits) + .build(context); if (trackPoint.hasHorizontalAccuracy()) { - formattedAccuracy = formatter.formatDistance(trackPoint.getHorizontalAccuracy(), metricUnits); + formattedAccuracy = formatter.formatDistance(trackPoint.getHorizontalAccuracy()); boolean currentLocationWasAccurate = trackPoint.getHorizontalAccuracy().lessThan(recordingGpsAccuracy); boolean shouldAlert = !currentLocationWasAccurate && previousLocationWasAccurate; @@ -94,7 +96,7 @@ class TrackRecordingServiceNotificationManager implements SharedPreferences.OnSh previousLocationWasAccurate = currentLocationWasAccurate; } - notificationBuilder.setContentTitle(context.getString(R.string.track_distance_notification, formatter.formatDistance(trackStatistics.getTotalDistance(), metricUnits))); + notificationBuilder.setContentTitle(context.getString(R.string.track_distance_notification, formatter.formatDistance(trackStatistics.getTotalDistance()))); notificationBuilder.setContentText(context.getString(R.string.track_speed_notification, StringUtils.formatSpeed(context, trackPoint.getSpeed(), metricUnits, true))); notificationBuilder.setSubText(context.getString(R.string.track_recording_notification_accuracy, formattedAccuracy)); updateNotification(); diff --git a/src/main/java/de/dennisguse/opentracks/settings/GpsSettingsFragment.java b/src/main/java/de/dennisguse/opentracks/settings/GpsSettingsFragment.java index 7dfd8fceb..9dcc81556 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/GpsSettingsFragment.java +++ b/src/main/java/de/dennisguse/opentracks/settings/GpsSettingsFragment.java @@ -17,34 +17,34 @@ public class GpsSettingsFragment extends PreferenceFragmentCompat { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.settings_gps); + boolean metricUnits = PreferencesUtils.isMetricUnits(); + final DistanceFormatter formatter = DistanceFormatter.Builder() .setDecimalCount(0) + .setMetricUnits(metricUnits) .build(getContext()); findPreference(getString(R.string.recording_distance_interval_key)) .setSummaryProvider( preference -> { - boolean metricUnits = PreferencesUtils.isMetricUnits(); Distance distance = PreferencesUtils.getRecordingDistanceInterval(); - return getString(R.string.settings_recording_location_frequency_summary, formatter.formatDistance(distance, metricUnits)); + return getString(R.string.settings_recording_location_frequency_summary, formatter.formatDistance(distance)); } ); findPreference(getString(R.string.max_recording_distance_key)) .setSummaryProvider( preference -> { - boolean metricUnits = PreferencesUtils.isMetricUnits(); Distance distance = PreferencesUtils.getMaxRecordingDistance(); - return getString(R.string.settings_recording_max_recording_distance_summary, formatter.formatDistance(distance, metricUnits)); + return getString(R.string.settings_recording_max_recording_distance_summary, formatter.formatDistance(distance)); } ); findPreference(getString(R.string.recording_gps_accuracy_key)) .setSummaryProvider( preference -> { - boolean metricUnits = PreferencesUtils.isMetricUnits(); Distance distance = PreferencesUtils.getThresholdHorizontalAccuracy(); - return getString(R.string.settings_recording_min_required_accuracy_summary, formatter.formatDistance(distance, metricUnits)); + return getString(R.string.settings_recording_min_required_accuracy_summary, formatter.formatDistance(distance)); } ); diff --git a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java index 7310b74ea..e53d9f4d2 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java +++ b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java @@ -310,13 +310,14 @@ public class PreferencesUtils { DistanceFormatter formatter = DistanceFormatter.Builder() .setDecimalCount(0) + .setMetricUnits(metricUnits) .build(resources); for (int i = 0; i < values.length; i++) { if (resources.getString(R.string.announcement_off).equals(values[i])) { options[i] = resources.getString(R.string.value_off); } else { Distance distance = Distance.one(metricUnits).multipliedBy(Double.parseDouble(values[i])); - options[i] = formatter.formatDistance(distance, metricUnits); + options[i] = formatter.formatDistance(distance); } } return options; @@ -356,13 +357,14 @@ public class PreferencesUtils { boolean metricUnits = isMetricUnits(); DistanceFormatter formatter = DistanceFormatter.Builder() + .setMetricUnits(metricUnits) .setDecimalCount(0) .build(resources); for (int i = 0; i < entryValues.length; i++) { int value = Integer.parseInt(entryValues[i]); Distance distance = Distance.of(1).multipliedBy(value); - String displayValue = formatter.formatDistance(distance, metricUnits); + String displayValue = formatter.formatDistance(distance); if (metricUnits) { if (value == recordingDistanceIntervalDefault) { entries[i] = resources.getString(R.string.value_integer_meter_recommended, value); @@ -395,12 +397,13 @@ public class PreferencesUtils { DistanceFormatter formatter = DistanceFormatter.Builder() .setDecimalCount(0) + .setMetricUnits(metricUnits) .build(resources); for (int i = 0; i < entryValues.length; i++) { int value = Integer.parseInt(entryValues[i]); Distance distance = Distance.of(1).multipliedBy(value); - String displayValue = formatter.formatDistance(distance, metricUnits); + String displayValue = formatter.formatDistance(distance); if (metricUnits) { if (value == maxRecordingDistanceDefault) { entries[i] = resources.getString(R.string.value_integer_meter_recommended, value); @@ -461,13 +464,14 @@ public class PreferencesUtils { DistanceFormatter formatter = DistanceFormatter.Builder() .setDecimalCount(0) + .setMetricUnits(metricUnits) .build(resources); for (int i = 0; i < entryValues.length; i++) { int value = Integer.parseInt(entryValues[i]); Distance distance = Distance.of(1).multipliedBy(value); - String displayValue = formatter.formatDistance(distance, metricUnits); + String displayValue = formatter.formatDistance(distance); if (metricUnits) { if (value == recordingGPSAccuracyDefault) { entries[i] = resources.getString(R.string.value_integer_meter_recommended, value); diff --git a/src/main/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatisticsAdapter.java b/src/main/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatisticsAdapter.java index 93967c08a..d841bdd1d 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatisticsAdapter.java +++ b/src/main/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatisticsAdapter.java @@ -162,7 +162,9 @@ public class AggregatedStatisticsAdapter extends BaseAdapter { typeLabel.setText(category); numTracks.setText(StringUtils.valueInParentheses(String.valueOf(aggregatedStatistic.getCountTracks()))); - Pair parts = DistanceFormatter.Builder().build(context).getDistanceParts(aggregatedStatistic.getTrackStatistics().getTotalDistance(), metricsUnits); + Pair parts = DistanceFormatter.Builder() + .setMetricUnits(metricsUnits) + .build(context).getDistanceParts(aggregatedStatistic.getTrackStatistics().getTotalDistance()); distance.setText(parts.first); distanceUnit.setText(parts.second); diff --git a/src/main/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsAdapter.java b/src/main/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsAdapter.java index 16b2d181c..16c4ef59b 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsAdapter.java +++ b/src/main/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsAdapter.java @@ -55,7 +55,9 @@ public class IntervalStatisticsAdapter extends RecyclerView.Adapter(getContext(), android.R.layout.simple_spinner_dropdown_item, IntervalStatisticsModel.IntervalOption.values()) { @@ -117,7 +118,7 @@ public class IntervalsFragment extends Fragment { TextView v = (TextView) super.getView(position, convertView, parent); IntervalStatisticsModel.IntervalOption option = getItem(position); - String stringValue = formatter.formatDistance(option.getDistance(metricUnits), metricUnits); + String stringValue = formatter.formatDistance(option.getDistance(metricUnits)); v.setText(stringValue); return v; } @@ -199,10 +200,11 @@ public class IntervalsFragment extends Fragment { private void setIntervalsDropdownText() { DistanceFormatter formatter = DistanceFormatter.Builder() .setDecimalCount(0) + .setMetricUnits(metricUnits) .build(getContext()); IntervalStatisticsModel.IntervalOption option = selectedInterval != null ? selectedInterval : IntervalStatisticsModel.IntervalOption.DEFAULT; - String stringValue = formatter.formatDistance(option.getDistance(metricUnits), metricUnits); + String stringValue = formatter.formatDistance(option.getDistance(metricUnits)); viewBinding.intervalsDropdown.setText(stringValue, false); } diff --git a/src/main/java/de/dennisguse/opentracks/viewmodels/StatisticDataBuilder.java b/src/main/java/de/dennisguse/opentracks/viewmodels/StatisticDataBuilder.java index 351c1902f..c6ec8eb61 100644 --- a/src/main/java/de/dennisguse/opentracks/viewmodels/StatisticDataBuilder.java +++ b/src/main/java/de/dennisguse/opentracks/viewmodels/StatisticDataBuilder.java @@ -54,7 +54,9 @@ public class StatisticDataBuilder { valueAndUnit = new Pair<>(StringUtils.formatElapsedTime(trackStatistics.getMovingTime()), null); title = context.getString(R.string.stats_moving_time); } else if (fieldKey.equals(context.getString(R.string.stats_custom_layout_distance_key))) { - valueAndUnit = DistanceFormatter.Builder().build(context).getDistanceParts(trackStatistics.getTotalDistance(), metricUnits); + valueAndUnit = DistanceFormatter.Builder() + .setMetricUnits(metricUnits) + .build(context).getDistanceParts(trackStatistics.getTotalDistance()); title = context.getString(R.string.stats_distance); } else if (fieldKey.equals(context.getString(R.string.stats_custom_layout_speed_key)) || fieldKey.equals(context.getString(R.string.stats_custom_layout_pace_key))) { boolean reportSpeed = fieldKey.equals("speed");