From a429fbe4dfb5d38e66286ff591834fd61aec6d95 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Thu, 26 Nov 2020 20:37:00 +0100 Subject: [PATCH] Interval list: RTL and localized formatting (only default strings.xml). --- .../opentracks/util/StringUtilsTest.java | 9 +++ .../adapters/IntervalStatisticsAdapter.java | 16 ++---- .../opentracks/util/StringUtils.java | 28 ++++++++++ .../res/layout/interval_stats_list_item.xml | 56 +++++++------------ src/main/res/values/strings.xml | 5 ++ 5 files changed, 68 insertions(+), 46 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/util/StringUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/util/StringUtilsTest.java index 20be2001c..21a57ca6d 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/util/StringUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/util/StringUtilsTest.java @@ -226,4 +226,13 @@ public class StringUtilsTest { assertEquals("min/km", StringUtils.getSpeedParts(context, 0, true, false).second); assertEquals("min/mi", StringUtils.getSpeedParts(context, 0, false, false).second); } + + @Test + public void testFormatSpeed() { + assertEquals("4:59 min/km", StringUtils.formatSpeed(context, 3.34, true, false)); + assertEquals("8:02 min/mi", StringUtils.formatSpeed(context, 3.34, false, false)); + + assertEquals("12.02 km/h", StringUtils.formatSpeed(context, 3.34, true, true)); + assertEquals("7.47 mph", StringUtils.formatSpeed(context, 3.34, false, true)); + } } diff --git a/src/main/java/de/dennisguse/opentracks/adapters/IntervalStatisticsAdapter.java b/src/main/java/de/dennisguse/opentracks/adapters/IntervalStatisticsAdapter.java index 2e718f32b..6b478353b 100644 --- a/src/main/java/de/dennisguse/opentracks/adapters/IntervalStatisticsAdapter.java +++ b/src/main/java/de/dennisguse/opentracks/adapters/IntervalStatisticsAdapter.java @@ -1,7 +1,6 @@ package de.dennisguse.opentracks.adapters; import android.content.Context; -import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -20,10 +19,10 @@ import de.dennisguse.opentracks.viewmodels.IntervalStatistics; public class IntervalStatisticsAdapter extends ArrayAdapter { - private StackMode stackMode; - private boolean metricUnits; + private final StackMode stackMode; + private final boolean metricUnits; private float sumDistance_m; - private String category; + private final String category; public IntervalStatisticsAdapter(Context context, List intervalList, String category, StackMode stackMode) { super(context, R.layout.interval_stats_list_item, intervalList); @@ -61,15 +60,12 @@ public class IntervalStatisticsAdapter extends ArrayAdapter speedParts = StringUtils.getSpeedParts(getContext(), interval.getSpeed_ms(), metricUnits, true); - viewHolder.rate.setText(speedParts.first + " " + speedParts.second); + viewHolder.rate.setText(StringUtils.formatSpeed(getContext(), interval.getSpeed_ms(), metricUnits, true)); } else { - Pair paceParts = StringUtils.getSpeedParts(getContext(), interval.getSpeed_ms(), metricUnits, false); - viewHolder.rate.setText(paceParts.first + " " + paceParts.second); + viewHolder.rate.setText(StringUtils.formatSpeed(getContext(), interval.getSpeed_ms(), metricUnits, false)); } - Pair gainParts = StringUtils.formatElevation(getContext(), interval.getGain_m(), metricUnits); - viewHolder.gain.setText(gainParts.first + " " + gainParts.second); + viewHolder.gain.setText(StringUtils.formatDistance(getContext(), interval.getGain_m(), metricUnits)); return intervalView; } diff --git a/src/main/java/de/dennisguse/opentracks/util/StringUtils.java b/src/main/java/de/dennisguse/opentracks/util/StringUtils.java index 2a7d9db34..94f55ac9e 100644 --- a/src/main/java/de/dennisguse/opentracks/util/StringUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/StringUtils.java @@ -118,6 +118,34 @@ public class StringUtils { } } + public static String formatSpeed(Context context, double speed_mps, boolean metricUnits, boolean reportSpeed) { + if (Double.isNaN(speed_mps) || Double.isInfinite(speed_mps)) { + speed_mps = 0; + } + + double speed = speed_mps * UnitConversions.M_TO_KM; //KM p sec + if (!metricUnits) { + speed *= UnitConversions.KM_TO_MI; + } + + if (reportSpeed) { + if (metricUnits) { + return context.getString(R.string.value_float_kilometer_hour, speed * UnitConversions.S_TO_HR); + } else { + return context.getString(R.string.value_float_mile_hour, speed * UnitConversions.S_TO_HR); + } + } else { + int pace = speed == 0 ? 0 : (int) Math.round(1 / speed); //sec / [KM | MI] + int minutes = pace / 60; + int seconds = pace % 60; + if (metricUnits) { + return context.getString(R.string.value_pace_kilometer, minutes, seconds); + } else { + return context.getString(R.string.value_pace_mile, minutes, seconds); + } + } + } + private static String formatDecimal(double value) { return StringUtils.formatDecimal(value, 2); } diff --git a/src/main/res/layout/interval_stats_list_item.xml b/src/main/res/layout/interval_stats_list_item.xml index 1de6ac727..121dd9db1 100644 --- a/src/main/res/layout/interval_stats_list_item.xml +++ b/src/main/res/layout/interval_stats_list_item.xml @@ -1,47 +1,31 @@ - + - + - - - - - - - + \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 7736bdbf9..3838e33e6 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -508,8 +508,11 @@ limitations under the License. Always %1$.2f ft %1$.2f km + %1$.2f km/h %1$.2f m %1$.2f mi + %1$.2f mph + %1$.1f mi (poor GPS) %1$d ft %1$d ft (excellent GPS) @@ -525,6 +528,8 @@ limitations under the License. %1$d min %1$d %% %1$d s + %1$d:%2$02d min/mi + %1$d:%2$02d min/km None Off Smallest