diff --git a/src/androidTest/java/de/dennisguse/opentracks/content/DescriptionGeneratorImplTest.java b/src/androidTest/java/de/dennisguse/opentracks/content/DescriptionGeneratorTest.java
similarity index 86%
rename from src/androidTest/java/de/dennisguse/opentracks/content/DescriptionGeneratorImplTest.java
rename to src/androidTest/java/de/dennisguse/opentracks/content/DescriptionGeneratorTest.java
index a2bc332cc..ac0d3a170 100644
--- a/src/androidTest/java/de/dennisguse/opentracks/content/DescriptionGeneratorImplTest.java
+++ b/src/androidTest/java/de/dennisguse/opentracks/content/DescriptionGeneratorTest.java
@@ -33,25 +33,25 @@ import de.dennisguse.opentracks.stats.TripStatistics;
import de.dennisguse.opentracks.util.StringUtils;
/**
- * Tests for {@link DescriptionGeneratorImpl}.
+ * Tests for {@link DescriptionGenerator}.
*
* @author Jimmy Shih
*/
@RunWith(AndroidJUnit4.class)
-public class DescriptionGeneratorImplTest {
+public class DescriptionGeneratorTest {
private static final long START_TIME = 1288721514000L;
- private DescriptionGeneratorImpl descriptionGenerator;
+ private DescriptionGenerator descriptionGenerator;
private Context context = ApplicationProvider.getApplicationContext();
@Before
public void setUp() {
- descriptionGenerator = new DescriptionGeneratorImpl(ApplicationProvider.getApplicationContext());
+ descriptionGenerator = new DescriptionGenerator(ApplicationProvider.getApplicationContext());
}
/**
- * Tests {@link DescriptionGeneratorImpl#generateTrackDescription(Track, boolean)}.
+ * Tests {@link DescriptionGenerator#generateTrackDescription(Track, boolean)}.
*/
@Test
public void testGenerateTrackDescription() {
@@ -94,7 +94,7 @@ public class DescriptionGeneratorImplTest {
}
/**
- * Tests {@link DescriptionGeneratorImpl#generateWaypointDescription(TripStatistics)}.
+ * Tests {@link DescriptionGenerator#generateWaypointDescription(TripStatistics)}.
*/
@Test
public void testGenerateWaypointDescription() {
@@ -130,7 +130,7 @@ public class DescriptionGeneratorImplTest {
}
/**
- * Tests {@link DescriptionGeneratorImpl#writeDistance(double, StringBuilder, int, String)}.
+ * Tests {@link DescriptionGenerator#writeDistance(double, StringBuilder, int, String)}.
*/
@Test
public void testWriteDistance() {
@@ -140,7 +140,7 @@ public class DescriptionGeneratorImplTest {
}
/**
- * Tests {@link DescriptionGeneratorImpl#writeTime(long, StringBuilder, int, String)}.
+ * Tests {@link DescriptionGenerator#writeTime(long, StringBuilder, int, String)}.
*/
@Test
public void testWriteTime() {
@@ -150,7 +150,7 @@ public class DescriptionGeneratorImplTest {
}
/**
- * Tests {@link DescriptionGeneratorImpl#writeSpeed(double, StringBuilder, int, String)}.
+ * Tests {@link DescriptionGenerator#writeSpeed(double, StringBuilder, int, String)}.
*/
@Test
public void testWriteSpeed() {
@@ -160,7 +160,7 @@ public class DescriptionGeneratorImplTest {
}
/**
- * Tests {@link DescriptionGeneratorImpl#writeElevation(double, StringBuilder, int, String)}.
+ * Tests {@link DescriptionGenerator#writeElevation(double, StringBuilder, int, String)}.
*/
@Test
public void testWriteElevation() {
@@ -170,7 +170,7 @@ public class DescriptionGeneratorImplTest {
}
/**
- * Tests {@link DescriptionGeneratorImpl#writePace(double, StringBuilder, int, String)}.
+ * Tests {@link DescriptionGenerator#writePace(double, StringBuilder, int, String)}.
*/
@Test
public void testWritePace() {
@@ -180,7 +180,7 @@ public class DescriptionGeneratorImplTest {
}
/**
- * Tests {@link DescriptionGeneratorImpl#writeGrade(double, StringBuilder, int, String)}.
+ * Tests {@link DescriptionGenerator#writeGrade(double, StringBuilder, int, String)}.
*/
@Test
public void testWriteGrade() {
@@ -190,7 +190,7 @@ public class DescriptionGeneratorImplTest {
}
/**
- * Tests {@link DescriptionGeneratorImpl#writeGrade(double, StringBuilder, int, String)} with a NaN.
+ * Tests {@link DescriptionGenerator#writeGrade(double, StringBuilder, int, String)} with a NaN.
*/
@Test
public void testWriteGrade_nan() {
@@ -200,7 +200,7 @@ public class DescriptionGeneratorImplTest {
}
/**
- * Tests {@link DescriptionGeneratorImpl#writeGrade(double, StringBuilder, int, String)} with an infinite number.
+ * Tests {@link DescriptionGenerator#writeGrade(double, StringBuilder, int, String)} with an infinite number.
*/
@Test
public void testWriteGrade_infinite() {
diff --git a/src/main/java/de/dennisguse/opentracks/chart/ChartView.java b/src/main/java/de/dennisguse/opentracks/chart/ChartView.java
index ecbbef10f..b90b12d2f 100644
--- a/src/main/java/de/dennisguse/opentracks/chart/ChartView.java
+++ b/src/main/java/de/dennisguse/opentracks/chart/ChartView.java
@@ -555,7 +555,7 @@ public class ChartView extends View {
canvas.save();
float x = getX(getWaypointXValue(waypoint));
canvas.drawLine(x, topBorder + spacer + markerHeight / 2, x, topBorder + effectiveHeight, markerPaint);
- canvas.translate(x - (float) (markerWidth * WAYPOINT_X_ANCHOR), topBorder + spacer);
+ canvas.translate(x - (markerWidth * WAYPOINT_X_ANCHOR), topBorder + spacer);
waypointMarker.draw(canvas);
canvas.restore();
diff --git a/src/main/java/de/dennisguse/opentracks/content/DescriptionGenerator.java b/src/main/java/de/dennisguse/opentracks/content/DescriptionGenerator.java
index deaf02711..47637a27d 100644
--- a/src/main/java/de/dennisguse/opentracks/content/DescriptionGenerator.java
+++ b/src/main/java/de/dennisguse/opentracks/content/DescriptionGenerator.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2010 Google Inc.
+ * Copyright 2012 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
@@ -13,17 +13,37 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package de.dennisguse.opentracks.content;
+import android.content.Context;
+import android.util.Pair;
+
+import androidx.annotation.VisibleForTesting;
+
+import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.stats.TripStatistics;
+import de.dennisguse.opentracks.util.StringUtils;
+import de.dennisguse.opentracks.util.UnitConversions;
/**
- * An interface for an object that can generate descriptions of track and waypoint.
+ * Generates descriptions for tracks and waypoints.
*
- * @author Sandor Dornbush
+ * @author Jimmy Shih
*/
-public interface DescriptionGenerator {
+public class DescriptionGenerator {
+
+ private static final String HTML_LINE_BREAK = "
";
+ private static final String HTML_PARAGRAPH_SEPARATOR = "
";
+ private static final String TEXT_LINE_BREAK = "\n";
+ private static final String TEXT_PARAGRAPH_SEPARATOR = "\n\n";
+
+ private Context context;
+
+ public DescriptionGenerator(Context context) {
+ this.context = context;
+ }
/**
* Generates a track description.
@@ -31,12 +51,205 @@ public interface DescriptionGenerator {
* @param track the track
* @param html true to output html, false to output plain text
*/
- String generateTrackDescription(Track track, boolean html);
+ public String generateTrackDescription(Track track, boolean html) {
+ String paragraphSeparator = html ? HTML_PARAGRAPH_SEPARATOR : TEXT_PARAGRAPH_SEPARATOR;
+ String lineBreak = html ? HTML_LINE_BREAK : TEXT_LINE_BREAK;
+ StringBuilder builder = new StringBuilder();
+
+ // Created by
+ String creator = html
+ ? "" + context.getString(R.string.app_name) + ""
+ : context.getString(R.string.app_name);
+ builder.append(creator);
+
+ builder.append(paragraphSeparator);
+
+ writeString(track.getName(), builder, R.string.generic_name_line, lineBreak);
+ writeString(track.getCategory(), builder, R.string.description_activity_type, lineBreak);
+ writeString(track.getDescription(), builder, R.string.generic_description_line, lineBreak);
+ builder.append(generateTripStatisticsDescription(track.getTripStatistics(), html));
+
+ return builder.toString();
+ }
/**
* Generate a waypoint description from a trip statistics.
*
* @param tripStatistics the trip statistics
*/
- String generateWaypointDescription(TripStatistics tripStatistics);
+ public String generateWaypointDescription(TripStatistics tripStatistics) {
+ return generateTripStatisticsDescription(tripStatistics, false);
+ }
+
+ /**
+ * Writes a string to a string builder.
+ *
+ * @param text the string
+ * @param builder the string builder
+ * @param resId the resource id containing one string placeholder
+ * @param lineBreak the line break
+ */
+ private void writeString(String text, StringBuilder builder, int resId, String lineBreak) {
+ if (text == null || text.length() == 0) {
+ text = context.getString(R.string.value_unknown);
+ }
+ builder.append(context.getString(resId, text));
+ builder.append(lineBreak);
+ }
+
+ /**
+ * Generates a description for a {@link TripStatistics}.
+ *
+ * @param stats the trip statistics
+ * @param html true to use " ";
- private static final String TEXT_LINE_BREAK = "\n";
- private static final String TEXT_PARAGRAPH_SEPARATOR = "\n\n";
-
- private Context context;
-
- public DescriptionGeneratorImpl(Context context) {
- this.context = context;
- }
-
- @Override
- public String generateTrackDescription(Track track, boolean html) {
- String paragraphSeparator = html ? HTML_PARAGRAPH_SEPARATOR : TEXT_PARAGRAPH_SEPARATOR;
- String lineBreak = html ? HTML_LINE_BREAK : TEXT_LINE_BREAK;
- StringBuilder builder = new StringBuilder();
-
- // Created by
- String creator = html
- ? "" + context.getString(R.string.app_name) + ""
- : context.getString(R.string.app_name);
- builder.append(creator);
-
- builder.append(paragraphSeparator);
-
- writeString(track.getName(), builder, R.string.generic_name_line, lineBreak);
- writeString(track.getCategory(), builder, R.string.description_activity_type, lineBreak);
- writeString(track.getDescription(), builder, R.string.generic_description_line, lineBreak);
- builder.append(generateTripStatisticsDescription(track.getTripStatistics(), html));
-
- return builder.toString();
- }
-
- @Override
- public String generateWaypointDescription(TripStatistics tripStatistics) {
- return generateTripStatisticsDescription(tripStatistics, false);
- }
-
- /**
- * Writes a string to a string builder.
- *
- * @param text the string
- * @param builder the string builder
- * @param resId the resource id containing one string placeholder
- * @param lineBreak the line break
- */
- private void writeString(String text, StringBuilder builder, int resId, String lineBreak) {
- if (text == null || text.length() == 0) {
- text = context.getString(R.string.value_unknown);
- }
- builder.append(context.getString(resId, text));
- builder.append(lineBreak);
- }
-
- /**
- * Generates a description for a {@link TripStatistics}.
- *
- * @param stats the trip statistics
- * @param html true to use "
" for line break instead of "\n"
+ */
+ private String generateTripStatisticsDescription(TripStatistics stats, boolean html) {
+ String lineBreak = html ? HTML_LINE_BREAK : TEXT_LINE_BREAK;
+ StringBuilder builder = new StringBuilder();
+
+ // Total distance
+ writeDistance(stats.getTotalDistance(), builder, R.string.description_total_distance, lineBreak);
+
+ // Total time
+ writeTime(stats.getTotalTime(), builder, R.string.description_total_time, lineBreak);
+
+ // Moving time
+ writeTime(stats.getMovingTime(), builder, R.string.description_moving_time, lineBreak);
+
+ // Average speed
+ writeSpeed(stats.getAverageSpeed(), builder, R.string.description_average_speed, lineBreak);
+
+ // Average moving speed
+ writeSpeed(stats.getAverageMovingSpeed(), builder, R.string.description_average_moving_speed, lineBreak);
+
+ // Max speed
+ writeSpeed(stats.getMaxSpeed(), builder, R.string.description_max_speed, lineBreak);
+
+ // Average pace
+ writePace(stats.getAverageSpeed(), builder, R.string.description_average_pace_in_minute, lineBreak);
+
+ // Average moving pace
+ writePace(stats.getAverageMovingSpeed(), builder, R.string.description_average_moving_pace_in_minute, lineBreak);
+
+ // Fastest pace
+ writePace(stats.getMaxSpeed(), builder, R.string.description_fastest_pace_in_minute, lineBreak);
+
+ // Max elevation
+ writeElevation(stats.getMaxElevation(), builder, R.string.description_max_elevation, lineBreak);
+
+ // Min elevation
+ writeElevation(stats.getMinElevation(), builder, R.string.description_min_elevation, lineBreak);
+
+ // Elevation gain
+ writeElevation(stats.getTotalElevationGain(), builder, R.string.description_elevation_gain, lineBreak);
+
+ // Max grade
+ writeGrade(stats.getMaxGrade(), builder, R.string.description_max_grade, lineBreak);
+
+ // Min grade
+ writeGrade(stats.getMinGrade(), builder, R.string.description_min_grade, lineBreak);
+
+ // Recorded time
+ builder.append(context.getString(R.string.description_recorded_time, StringUtils.formatDateTime(context, stats.getStartTime())));
+ builder.append(lineBreak);
+
+ return builder.toString();
+ }
+
+ /**
+ * Writes distance.
+ *
+ * @param distance distance in meters
+ * @param builder StringBuilder to append distance
+ * @param resId resource id of distance string
+ * @param lineBreak line break string
+ */
+ @VisibleForTesting
+ void writeDistance(double distance, StringBuilder builder, int resId, String lineBreak) {
+ double distanceInKm = distance * UnitConversions.M_TO_KM;
+ double distanceInMi = distanceInKm * UnitConversions.KM_TO_MI;
+ builder.append(context.getString(resId, distanceInKm, distanceInMi));
+ builder.append(lineBreak);
+ }
+
+ /**
+ * Writes time.
+ *
+ * @param time time in milliseconds.
+ * @param builder StringBuilder to append time
+ * @param resId resource id of time string
+ * @param lineBreak line break string
+ */
+ @VisibleForTesting
+ void writeTime(long time, StringBuilder builder, int resId, String lineBreak) {
+ builder.append(context.getString(resId, StringUtils.formatElapsedTime(time)));
+ builder.append(lineBreak);
+ }
+
+ /**
+ * Writes speed.
+ *
+ * @param speed speed in meters per second
+ * @param builder StringBuilder to append speed
+ * @param resId resource id of speed string
+ * @param lineBreak line break string
+ */
+ @VisibleForTesting
+ void writeSpeed(double speed, StringBuilder builder, int resId, String lineBreak) {
+ double speedInKmHr = speed * UnitConversions.MS_TO_KMH;
+ double speedInMiHr = speedInKmHr * UnitConversions.KM_TO_MI;
+ builder.append(context.getString(resId, speedInKmHr, speedInMiHr));
+ builder.append(lineBreak);
+ }
+
+ /**
+ * Writes pace.
+ *
+ * @param speed speed in meters per second
+ * @param builder StringBuilder to append pace
+ * @param resId resource id of pace string
+ * @param lineBreak line break string
+ */
+ @VisibleForTesting
+ void writePace(double speed, StringBuilder builder, int resId, String lineBreak) {
+ Pair
";
- private static final String HTML_PARAGRAPH_SEPARATOR = "
" for line break instead of "\n"
- */
- private String generateTripStatisticsDescription(TripStatistics stats, boolean html) {
- String lineBreak = html ? HTML_LINE_BREAK : TEXT_LINE_BREAK;
- StringBuilder builder = new StringBuilder();
-
- // Total distance
- writeDistance(stats.getTotalDistance(), builder, R.string.description_total_distance, lineBreak);
-
- // Total time
- writeTime(stats.getTotalTime(), builder, R.string.description_total_time, lineBreak);
-
- // Moving time
- writeTime(stats.getMovingTime(), builder, R.string.description_moving_time, lineBreak);
-
- // Average speed
- writeSpeed(stats.getAverageSpeed(), builder, R.string.description_average_speed, lineBreak);
-
- // Average moving speed
- writeSpeed(stats.getAverageMovingSpeed(), builder, R.string.description_average_moving_speed, lineBreak);
-
- // Max speed
- writeSpeed(stats.getMaxSpeed(), builder, R.string.description_max_speed, lineBreak);
-
- // Average pace
- writePace(stats.getAverageSpeed(), builder, R.string.description_average_pace_in_minute, lineBreak);
-
- // Average moving pace
- writePace(stats.getAverageMovingSpeed(), builder, R.string.description_average_moving_pace_in_minute, lineBreak);
-
- // Fastest pace
- writePace(stats.getMaxSpeed(), builder, R.string.description_fastest_pace_in_minute, lineBreak);
-
- // Max elevation
- writeElevation(stats.getMaxElevation(), builder, R.string.description_max_elevation, lineBreak);
-
- // Min elevation
- writeElevation(stats.getMinElevation(), builder, R.string.description_min_elevation, lineBreak);
-
- // Elevation gain
- writeElevation(stats.getTotalElevationGain(), builder, R.string.description_elevation_gain, lineBreak);
-
- // Max grade
- writeGrade(stats.getMaxGrade(), builder, R.string.description_max_grade, lineBreak);
-
- // Min grade
- writeGrade(stats.getMinGrade(), builder, R.string.description_min_grade, lineBreak);
-
- // Recorded time
- builder.append(context.getString(R.string.description_recorded_time, StringUtils.formatDateTime(context, stats.getStartTime())));
- builder.append(lineBreak);
-
- return builder.toString();
- }
-
- /**
- * Writes distance.
- *
- * @param distance distance in meters
- * @param builder StringBuilder to append distance
- * @param resId resource id of distance string
- * @param lineBreak line break string
- */
- @VisibleForTesting
- void writeDistance(double distance, StringBuilder builder, int resId, String lineBreak) {
- double distanceInKm = distance * UnitConversions.M_TO_KM;
- double distanceInMi = distanceInKm * UnitConversions.KM_TO_MI;
- builder.append(context.getString(resId, distanceInKm, distanceInMi));
- builder.append(lineBreak);
- }
-
- /**
- * Writes time.
- *
- * @param time time in milliseconds.
- * @param builder StringBuilder to append time
- * @param resId resource id of time string
- * @param lineBreak line break string
- */
- @VisibleForTesting
- void writeTime(long time, StringBuilder builder, int resId, String lineBreak) {
- builder.append(context.getString(resId, StringUtils.formatElapsedTime(time)));
- builder.append(lineBreak);
- }
-
- /**
- * Writes speed.
- *
- * @param speed speed in meters per second
- * @param builder StringBuilder to append speed
- * @param resId resource id of speed string
- * @param lineBreak line break string
- */
- @VisibleForTesting
- void writeSpeed(double speed, StringBuilder builder, int resId, String lineBreak) {
- double speedInKmHr = speed * UnitConversions.MS_TO_KMH;
- double speedInMiHr = speedInKmHr * UnitConversions.KM_TO_MI;
- builder.append(context.getString(resId, speedInKmHr, speedInMiHr));
- builder.append(lineBreak);
- }
-
- /**
- * Writes pace.
- *
- * @param speed speed in meters per second
- * @param builder StringBuilder to append pace
- * @param resId resource id of pace string
- * @param lineBreak line break string
- */
- @VisibleForTesting
- void writePace(double speed, StringBuilder builder, int resId, String lineBreak) {
- Pair