diff --git a/src/androidTest/java/de/dennisguse/opentracks/util/AnnouncementUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/util/AnnouncementUtilsTest.java index 09a7835be..9abd2369a 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/util/AnnouncementUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/util/AnnouncementUtilsTest.java @@ -27,7 +27,7 @@ public class AnnouncementUtilsTest { private final Context context = ApplicationProvider.getApplicationContext(); @Test - public void getAnnouncement_metric() { + public void getAnnouncement_metric_speed() { TrackStatistics stats = new TrackStatistics(); stats.setTotalDistance(Distance.of(20000)); stats.setTotalTime(Duration.ofHours(2).plusMinutes(5).plusSeconds(10)); @@ -43,7 +43,7 @@ public class AnnouncementUtilsTest { } @Test - public void getAnnouncement_withInterval_metric() { + public void getAnnouncement_withInterval_metric_speed() { TrackStatistics stats = new TrackStatistics(); stats.setTotalDistance(Distance.of(20000)); stats.setTotalTime(Duration.ofHours(2).plusMinutes(5).plusSeconds(10)); @@ -61,4 +61,112 @@ public class AnnouncementUtilsTest { // then assertEquals("OpenTracks total distance 20.00 kilometers in 1 hour 5 minutes 10 seconds at 18.4 kilometers per hour Lap speed of 51.2 kilometers per hour", announcement); } + + @Test + public void getAnnouncement_metric_pace() { + TrackStatistics stats = new TrackStatistics(); + stats.setTotalDistance(Distance.of(20000)); + stats.setTotalTime(Duration.ofHours(2).plusMinutes(5).plusSeconds(10)); + stats.setMovingTime(Duration.ofHours(1).plusMinutes(5).plusSeconds(10)); + stats.setMaxSpeed(Speed.of(100)); + stats.setTotalAltitudeGain(6000f); + + // when + String announcement = AnnouncementUtils.getAnnouncement(context, stats, true, false, null); + + // then + assertEquals("OpenTracks total distance 20.00 kilometers in 1 hour 5 minutes 10 seconds at 3 minutes 15 seconds per kilometer", announcement); + } + + @Test + public void getAnnouncement_withInterval_metric_pace() { + TrackStatistics stats = new TrackStatistics(); + stats.setTotalDistance(Distance.of(20000)); + stats.setTotalTime(Duration.ofHours(2).plusMinutes(5).plusSeconds(10)); + stats.setMovingTime(Duration.ofHours(1).plusMinutes(5).plusSeconds(10)); + stats.setMaxSpeed(Speed.of(100)); + stats.setTotalAltitudeGain(6000f); + + List trackPoints = TestDataUtil.createTrack(new Track.Id(System.currentTimeMillis()), 10).second; + IntervalStatistics intervalStatistics = new IntervalStatistics(trackPoints, Distance.of(1000)); + IntervalStatistics.Interval lastInterval = intervalStatistics.getIntervalList().get(intervalStatistics.getIntervalList().size() - 1); + + // when + String announcement = AnnouncementUtils.getAnnouncement(context, stats, true, false, lastInterval); + + // then + assertEquals("OpenTracks total distance 20.00 kilometers in 1 hour 5 minutes 10 seconds at 3 minutes 15 seconds per kilometer Lap time of 1 minute 10 seconds per kilometer", announcement); + } + + @Test + public void getAnnouncement_imperial_speed() { + TrackStatistics stats = new TrackStatistics(); + stats.setTotalDistance(Distance.of(20000)); + stats.setTotalTime(Duration.ofHours(2).plusMinutes(5).plusSeconds(10)); + stats.setMovingTime(Duration.ofHours(1).plusMinutes(5).plusSeconds(10)); + stats.setMaxSpeed(Speed.of(100)); + stats.setTotalAltitudeGain(6000f); + + // when + String announcement = AnnouncementUtils.getAnnouncement(context, stats, false, true, null); + + // then + assertEquals("OpenTracks total distance 12.43 miles in 1 hour 5 minutes 10 seconds at 11.4 miles per hour", announcement); + } + + @Test + public void getAnnouncement_withInterval_imperial_speed() { + TrackStatistics stats = new TrackStatistics(); + stats.setTotalDistance(Distance.of(20000)); + stats.setTotalTime(Duration.ofHours(2).plusMinutes(5).plusSeconds(10)); + stats.setMovingTime(Duration.ofHours(1).plusMinutes(5).plusSeconds(10)); + stats.setMaxSpeed(Speed.of(100)); + stats.setTotalAltitudeGain(6000f); + + List trackPoints = TestDataUtil.createTrack(new Track.Id(System.currentTimeMillis()), 10).second; + IntervalStatistics intervalStatistics = new IntervalStatistics(trackPoints, Distance.of(1000)); + IntervalStatistics.Interval lastInterval = intervalStatistics.getIntervalList().get(intervalStatistics.getIntervalList().size() - 1); + + // when + String announcement = AnnouncementUtils.getAnnouncement(context, stats, false, true, lastInterval); + + // then + assertEquals("OpenTracks total distance 12.43 miles in 1 hour 5 minutes 10 seconds at 11.4 miles per hour Lap speed of 31.8 miles per hour", announcement); + } + + @Test + public void getAnnouncement_imperial_pace() { + TrackStatistics stats = new TrackStatistics(); + stats.setTotalDistance(Distance.of(20000)); + stats.setTotalTime(Duration.ofHours(2).plusMinutes(5).plusSeconds(10)); + stats.setMovingTime(Duration.ofHours(1).plusMinutes(5).plusSeconds(10)); + stats.setMaxSpeed(Speed.of(100)); + stats.setTotalAltitudeGain(6000f); + + // when + String announcement = AnnouncementUtils.getAnnouncement(context, stats, false, false, null); + + // then + assertEquals("OpenTracks total distance 12.43 miles in 1 hour 5 minutes 10 seconds at 5 minutes 15 seconds per mile", announcement); + } + + @Test + public void getAnnouncement_withInterval_imperial_pace() { + TrackStatistics stats = new TrackStatistics(); + stats.setTotalDistance(Distance.of(20000)); + stats.setTotalTime(Duration.ofHours(2).plusMinutes(5).plusSeconds(10)); + stats.setMovingTime(Duration.ofHours(1).plusMinutes(5).plusSeconds(10)); + stats.setMaxSpeed(Speed.of(100)); + stats.setTotalAltitudeGain(6000f); + + List trackPoints = TestDataUtil.createTrack(new Track.Id(System.currentTimeMillis()), 10).second; + IntervalStatistics intervalStatistics = new IntervalStatistics(trackPoints, Distance.of(1000)); + IntervalStatistics.Interval lastInterval = intervalStatistics.getIntervalList().get(intervalStatistics.getIntervalList().size() - 1); + + // when + String announcement = AnnouncementUtils.getAnnouncement(context, stats, false, false, lastInterval); + + // then + assertEquals("OpenTracks total distance 12.43 miles in 1 hour 5 minutes 10 seconds at 5 minutes 15 seconds per mile Lap time of 1 minute 53 seconds per mile", announcement); + } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/util/AnnouncementUtils.java b/src/main/java/de/dennisguse/opentracks/util/AnnouncementUtils.java index 11659d474..152a458d0 100644 --- a/src/main/java/de/dennisguse/opentracks/util/AnnouncementUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/AnnouncementUtils.java @@ -43,7 +43,7 @@ public class AnnouncementUtils { int paceId = isMetricUnits ? R.string.voice_pace_per_kilometer : R.string.voice_pace_per_mile; rate = context.getString(paceId, getAnnounceTime(context, time)); - Duration currentTime = currentDistancePerTime.toPace(isMetricUnits); + Duration currentTime = currentDistancePerTime != null ? currentDistancePerTime.toPace(isMetricUnits) : Duration.ofMillis(0); currentRate = context.getString(paceId, getAnnounceTime(context, currentTime)); currentRateMsg = context.getString(R.string.voice_pace_lap, currentRate); }