diff --git a/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderUtilsTest.java index b7a517715..339c13e9f 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderUtilsTest.java @@ -455,7 +455,7 @@ public class CustomContentProviderUtilsTest { statistics.setTotalTime(1500L); statistics.setMovingTime(700L); statistics.setTotalDistance(750.0); - statistics.setTotalElevationGain(50.0); + statistics.setTotalElevationGain(50.0f); statistics.setMaxSpeed(60.0); statistics.setMaxElevation(1250.0); statistics.setMinElevation(1200.0); diff --git a/src/androidTest/java/de/dennisguse/opentracks/stats/TrackStatisticsTest.java b/src/androidTest/java/de/dennisguse/opentracks/stats/TrackStatisticsTest.java index 11bfd1239..a7fb3727a 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/stats/TrackStatisticsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/stats/TrackStatisticsTest.java @@ -51,8 +51,8 @@ public class TrackStatisticsTest { statistics2.setMovingTime(600L); // Result: 700+600 statistics.setTotalDistance(750.0); statistics2.setTotalDistance(350.0); // Result: 750+350 - statistics.setTotalElevationGain(50.0); - statistics2.setTotalElevationGain(850.0); // Result: 850+50 + statistics.setTotalElevationGain(50.0f); + statistics2.setTotalElevationGain(850.0f); // Result: 850+50 statistics.setMaxSpeed(60.0); // Resulting max speed statistics2.setMaxSpeed(30.0); statistics.setMaxElevation(1250.0); diff --git a/src/androidTest/java/de/dennisguse/opentracks/viewmodels/AggregatedStatisticsTest.java b/src/androidTest/java/de/dennisguse/opentracks/viewmodels/AggregatedStatisticsTest.java index b6148d3a4..4d67bfc64 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/viewmodels/AggregatedStatisticsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/viewmodels/AggregatedStatisticsTest.java @@ -35,7 +35,7 @@ public class AggregatedStatisticsTest { statistics.setTotalTime(totalTime); statistics.setMovingTime(totalTime); statistics.setTotalDistance(totalDistance); - statistics.setTotalElevationGain(50.0); + statistics.setTotalElevationGain(50.0f); statistics.setMaxSpeed(50.0); // Resulting max speed statistics.setMaxElevation(1250.0); statistics.setMinElevation(1200.0); // Resulting min elevation diff --git a/src/main/java/de/dennisguse/opentracks/content/DescriptionGenerator.java b/src/main/java/de/dennisguse/opentracks/content/DescriptionGenerator.java index bbd0c3f76..f73dd8d84 100644 --- a/src/main/java/de/dennisguse/opentracks/content/DescriptionGenerator.java +++ b/src/main/java/de/dennisguse/opentracks/content/DescriptionGenerator.java @@ -136,7 +136,9 @@ public class DescriptionGenerator { } // Elevation gain - writeElevation(stats.getTotalElevationGain(), builder, R.string.description_elevation_gain, lineBreak); + if (stats.hasTotalElevationGain()) { + writeElevation(stats.getTotalElevationGain(), builder, R.string.description_elevation_gain, lineBreak); + } // Recorded time builder.append(context.getString(R.string.description_recorded_time, StringUtils.formatDateTime(context, stats.getStartTime_ms()))); diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java index ba4fb1bf3..cbaa683b8 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java @@ -284,7 +284,7 @@ public class StatisticsRecordedFragment extends Fragment { boolean showElevation = PreferencesUtils.isShowStatsElevation(getContext()); elevationGroup.setVisibility(showElevation ? View.VISIBLE : View.GONE); - double elevationGain_m = trackStatistics != null ? trackStatistics.getTotalElevationGain() : 0f; + Float elevationGain_m = trackStatistics != null ? trackStatistics.getTotalElevationGain() : null; Pair parts = StringUtils.formatElevation(getContext(), elevationGain_m, metricUnits); elevationTotalGainValue.setText(parts.first); diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java index 170c051f5..b297f8d6d 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java @@ -481,14 +481,17 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi // Set elevation gain private void setTotalElevationGain(Float elevationGain_m) { + //TODO Check if we can distribute the total elevation gain via trackStatistics instead of doing some computation in the UI layer. boolean metricUnits = PreferencesUtils.isMetricUnits(getContext()); - float totalElevationGain = 0; - if (elevationGain_m != null) { - totalElevationGain = elevationGain_m; - } - if (lastTrackStatistics != null) { - totalElevationGain += (float) lastTrackStatistics.getTotalElevationGain(); + Float totalElevationGain = elevationGain_m; + + if (lastTrackStatistics != null && lastTrackStatistics.hasTotalElevationGain()) { + if (elevationGain_m == null) { + totalElevationGain = lastTrackStatistics.getTotalElevationGain(); + } else { + totalElevationGain += lastTrackStatistics.getTotalElevationGain(); + } } Pair parts = StringUtils.formatElevation(getContext(), totalElevationGain, metricUnits); @@ -626,7 +629,7 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi if (showElevation) { // Current elevation - double altitude = lastTrackPoint != null && lastTrackPoint.hasAltitude() ? lastTrackPoint.getAltitude() : Double.NaN; + Float altitude = lastTrackPoint != null && lastTrackPoint.hasAltitude() ? (float) lastTrackPoint.getAltitude() : null; Pair parts = StringUtils.formatElevation(getContext(), altitude, metricUnits); elevationCurrentValue.setText(parts.first); elevationCurrentUnit.setText(parts.second); diff --git a/src/main/java/de/dennisguse/opentracks/stats/TrackStatistics.java b/src/main/java/de/dennisguse/opentracks/stats/TrackStatistics.java index b9c0674c0..42bd19f7b 100644 --- a/src/main/java/de/dennisguse/opentracks/stats/TrackStatistics.java +++ b/src/main/java/de/dennisguse/opentracks/stats/TrackStatistics.java @@ -17,6 +17,7 @@ package de.dennisguse.opentracks.stats; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; /** * Statistical data about a {@link de.dennisguse.opentracks.content.data.Track}. @@ -24,6 +25,7 @@ import androidx.annotation.NonNull; * * @author Rodrigo Damazio */ +//TODO Use null instead of Double.isInfinite public class TrackStatistics { // The min and max elevation (meters) seen on this track. @@ -42,7 +44,7 @@ public class TrackStatistics { // The maximum speed (meters/second) that we believe is valid. private double maxSpeed_mps; // The total elevation gained (meters). - private double totalElevationGain_m; + private Float totalElevationGain_m = null; public TrackStatistics() { } @@ -80,7 +82,15 @@ public class TrackStatistics { elevationExtremities.update(other.elevationExtremities.getMin()); elevationExtremities.update(other.elevationExtremities.getMax()); } - totalElevationGain_m += other.totalElevationGain_m; + if (totalElevationGain_m == null) { + if (other.totalElevationGain_m != null) { + totalElevationGain_m = other.totalElevationGain_m; + } + } else { + if (other.totalElevationGain_m != null) { + totalElevationGain_m += other.totalElevationGain_m; + } + } } /** @@ -227,18 +237,23 @@ public class TrackStatistics { elevationExtremities.update(elevation_m); } - /** - * Gets the total elevation gain in meters. - */ - public double getTotalElevationGain() { + public boolean hasTotalElevationGain() { + return totalElevationGain_m != null; + } + + public @Nullable + Float getTotalElevationGain() { return totalElevationGain_m; } - public void setTotalElevationGain(double totalElevationGain_m) { + public void setTotalElevationGain(float totalElevationGain_m) { this.totalElevationGain_m = totalElevationGain_m; } - public void addTotalElevationGain(double gain_m) { + public void addTotalElevationGain(float gain_m) { + if (totalElevationGain_m == null) { + totalElevationGain_m = 0f; + } totalElevationGain_m += gain_m; } diff --git a/src/main/java/de/dennisguse/opentracks/util/StringUtils.java b/src/main/java/de/dennisguse/opentracks/util/StringUtils.java index c8c6239fa..583a317e9 100644 --- a/src/main/java/de/dennisguse/opentracks/util/StringUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/StringUtils.java @@ -324,21 +324,21 @@ public class StringUtils { } /** - * Sets an elevation value. + * Sets an elevation_m value. * * @param context the context - * @param elevation the elevation in meters + * @param elevation_m the elevation_m * @param metricUnits true if metric units - * @return the formatted elevation (or null) and it's unit as {@link Pair} + * @return the formatted elevation_m (or null) and it's unit as {@link Pair} */ - public static Pair formatElevation(Context context, double elevation, boolean metricUnits) { + public static Pair formatElevation(Context context, Float elevation_m, boolean metricUnits) { String value = context.getString(R.string.value_unknown); String unit = context.getString(metricUnits ? R.string.unit_meter : R.string.unit_feet); - if (!Double.isNaN(elevation) && !Double.isInfinite(elevation)) { + if (elevation_m != null) { if (!metricUnits) { - elevation *= UnitConversions.M_TO_FT; + elevation_m *= (float) UnitConversions.M_TO_FT; } - value = StringUtils.formatDecimal(elevation, 0); + value = StringUtils.formatDecimal(elevation_m, 0); } return new Pair<>(value, unit); }