Renamed TripStatistics to TrackStatistics.

This commit is contained in:
Dennis Guse
2020-04-02 08:01:00 +02:00
parent dfc785f2fd
commit 16c654141f
28 changed files with 237 additions and 237 deletions
@@ -28,7 +28,7 @@ import org.junit.runner.RunWith;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.content.data.Track; import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.StringUtils; import de.dennisguse.opentracks.util.StringUtils;
/** /**
@@ -55,7 +55,7 @@ public class DescriptionGeneratorTest {
@Test @Test
public void testGenerateTrackDescription() { public void testGenerateTrackDescription() {
Track track = new Track(); Track track = new Track();
TripStatistics stats = new TripStatistics(); TrackStatistics stats = new TrackStatistics();
stats.setTotalDistance(20000); stats.setTotalDistance(20000);
stats.setTotalTime(600000); stats.setTotalTime(600000);
stats.setMovingTime(300000); stats.setMovingTime(300000);
@@ -63,8 +63,8 @@ public class DescriptionGeneratorTest {
stats.setMaxElevation(550); stats.setMaxElevation(550);
stats.setMinElevation(-500); stats.setMinElevation(-500);
stats.setTotalElevationGain(6000); stats.setTotalElevationGain(6000);
stats.setStartTime(START_TIME); stats.setStartTime_ms(START_TIME);
track.setTripStatistics(stats); track.setTrackStatistics(stats);
track.setCategory("hiking"); track.setCategory("hiking");
String expected = //"Created by" String expected = //"Created by"
"<a href='https://github.com/OpenTracksApp/OpenTracks'>OpenTracks</a><p>" "<a href='https://github.com/OpenTracksApp/OpenTracks'>OpenTracks</a><p>"
@@ -39,7 +39,7 @@ import de.dennisguse.opentracks.content.SearchEngine.SearchQuery;
import de.dennisguse.opentracks.content.data.Track; import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.content.data.Waypoint; import de.dennisguse.opentracks.content.data.Waypoint;
import de.dennisguse.opentracks.content.provider.ContentProviderUtils; import de.dennisguse.opentracks.content.provider.ContentProviderUtils;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
/** /**
* Tests for {@link SearchEngine}. * Tests for {@link SearchEngine}.
@@ -76,11 +76,11 @@ public class SearchEngineTest {
track.setDescription(description); track.setDescription(description);
track.setCategory(category); track.setCategory(category);
TripStatistics stats = track.getTripStatistics(); TrackStatistics stats = track.getTrackStatistics();
if (hoursAgo > 0) { if (hoursAgo > 0) {
// Started twice hoursAgo, so the average time is hoursAgo. // Started twice hoursAgo, so the average time is hoursAgo.
stats.setStartTime(NOW - hoursAgo * 1000L * 60L * 60L * 2); stats.setStartTime_ms(NOW - hoursAgo * 1000L * 60L * 60L * 2);
stats.setStopTime(NOW); stats.setStopTime_ms(NOW);
} }
Uri uri = providerUtils.insertTrack(track); Uri uri = providerUtils.insertTrack(track);
@@ -41,7 +41,7 @@ import de.dennisguse.opentracks.content.data.TrackPointsColumns;
import de.dennisguse.opentracks.content.data.TracksColumns; import de.dennisguse.opentracks.content.data.TracksColumns;
import de.dennisguse.opentracks.content.data.Waypoint; import de.dennisguse.opentracks.content.data.Waypoint;
import de.dennisguse.opentracks.content.data.WaypointsColumns; import de.dennisguse.opentracks.content.data.WaypointsColumns;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -313,9 +313,9 @@ public class CustomContentProviderUtilsTest {
long startTime = 1000L; long startTime = 1000L;
// AverageSpeed // AverageSpeed
double minGrade = -20.11; double minGrade = -20.11;
TripStatistics statistics = new TripStatistics(); TrackStatistics statistics = new TrackStatistics();
statistics.setStartTime(startTime); statistics.setStartTime_ms(startTime);
statistics.setStopTime(2500L); statistics.setStopTime_ms(2500L);
statistics.setTotalTime(1500L); statistics.setTotalTime(1500L);
statistics.setMovingTime(700L); statistics.setMovingTime(700L);
statistics.setTotalDistance(750.0); statistics.setTotalDistance(750.0);
@@ -324,7 +324,7 @@ public class CustomContentProviderUtilsTest {
statistics.setMaxElevation(1250.0); statistics.setMaxElevation(1250.0);
statistics.setMinElevation(1200.0); statistics.setMinElevation(1200.0);
track.setTripStatistics(statistics); track.setTrackStatistics(statistics);
contentProviderUtils.insertTrack(track); contentProviderUtils.insertTrack(track);
// Insert at first. // Insert at first.
@@ -415,9 +415,9 @@ public class CustomContentProviderUtilsTest {
long trackId = System.currentTimeMillis(); long trackId = System.currentTimeMillis();
Track track = TestDataUtil.getTrack(trackId, 10); Track track = TestDataUtil.getTrack(trackId, 10);
TripStatistics statistics = new TripStatistics(); TrackStatistics statistics = new TrackStatistics();
statistics.setStartTime(1000L); statistics.setStartTime_ms(1000L);
statistics.setStopTime(2500L); statistics.setStopTime_ms(2500L);
statistics.setTotalTime(1500L); statistics.setTotalTime(1500L);
statistics.setMovingTime(700L); statistics.setMovingTime(700L);
statistics.setTotalDistance(750.0); statistics.setTotalDistance(750.0);
@@ -426,7 +426,7 @@ public class CustomContentProviderUtilsTest {
statistics.setMaxElevation(1250.0); statistics.setMaxElevation(1250.0);
statistics.setMinElevation(1200.0); statistics.setMinElevation(1200.0);
track.setTripStatistics(statistics); track.setTrackStatistics(statistics);
contentProviderUtils.insertTrack(track); contentProviderUtils.insertTrack(track);
@@ -63,7 +63,7 @@ public class ChartFragmentTest {
boolean chartByDistance = false; boolean chartByDistance = false;
chartFragment = (ChartFragment) ChartFragment.newInstance(chartByDistance); chartFragment = (ChartFragment) ChartFragment.newInstance(chartByDistance);
chartFragment.setChartView(new ChartView(ApplicationProvider.getApplicationContext(), chartByDistance)); chartFragment.setChartView(new ChartView(ApplicationProvider.getApplicationContext(), chartByDistance));
chartFragment.setTripStatisticsUpdater(TrackStubUtils.INITIAL_TIME); chartFragment.setTrackStatisticsUpdater(TrackStubUtils.INITIAL_TIME);
} }
/** /**
@@ -125,7 +125,7 @@ public abstract class AbstractTestFileTrackImporter {
Assert.assertEquals(name, track.getName()); Assert.assertEquals(name, track.getName());
Assert.assertEquals(description, track.getDescription()); Assert.assertEquals(description, track.getDescription());
if (time != -1L) { if (time != -1L) {
Assert.assertEquals(time, track.getTripStatistics().getStartTime()); Assert.assertEquals(time, track.getTrackStatistics().getStartTime_ms());
} }
} }
} }
@@ -25,6 +25,7 @@ import de.dennisguse.opentracks.content.data.Waypoint;
import de.dennisguse.opentracks.content.provider.ContentProviderUtils; import de.dennisguse.opentracks.content.provider.ContentProviderUtils;
import de.dennisguse.opentracks.io.file.TrackFileFormat; import de.dennisguse.opentracks.io.file.TrackFileFormat;
import de.dennisguse.opentracks.io.file.exporter.TrackExporter; import de.dennisguse.opentracks.io.file.exporter.TrackExporter;
import de.dennisguse.opentracks.stats.TrackStatistics;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
@@ -32,7 +33,7 @@ import static org.junit.Assert.assertNotNull;
/** /**
* Export a track to {@link TrackFileFormat} and verify that the import is identical. * Export a track to {@link TrackFileFormat} and verify that the import is identical.
* <p> * <p>
* TODO: test ignores {@link de.dennisguse.opentracks.stats.TripStatistics} for now. * TODO: test ignores {@link TrackStatistics} for now.
*/ */
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
public class ExportImportTest { public class ExportImportTest {
@@ -108,7 +108,7 @@ public class GpxFileTrackImporterTest extends AbstractTestFileTrackImporter {
verify(contentProviderUtils, atLeastOnce()).updateTrack(trackCaptor.capture()); verify(contentProviderUtils, atLeastOnce()).updateTrack(trackCaptor.capture());
long time0 = DATE_FORMAT_0.parse(TRACK_TIME_0).getTime(); long time0 = DATE_FORMAT_0.parse(TRACK_TIME_0).getTime();
long time1 = DATE_FORMAT_1.parse(TRACK_TIME_1).getTime(); long time1 = DATE_FORMAT_1.parse(TRACK_TIME_1).getTime();
Assert.assertEquals(time1 - time0, trackCaptor.getValue().getTripStatistics().getTotalTime()); Assert.assertEquals(time1 - time0, trackCaptor.getValue().getTrackStatistics().getTotalTime());
verifyTrack(trackCaptor.getValue(), TRACK_NAME_0, TRACK_DESCRIPTION_0, time0); verifyTrack(trackCaptor.getValue(), TRACK_NAME_0, TRACK_DESCRIPTION_0, time0);
} }
@@ -140,7 +140,7 @@ public class GpxFileTrackImporterTest extends AbstractTestFileTrackImporter {
long time1 = DATE_FORMAT_1.parse(TRACK_TIME_1).getTime(); long time1 = DATE_FORMAT_1.parse(TRACK_TIME_1).getTime();
long time2 = DATE_FORMAT_1.parse(TRACK_TIME_2).getTime(); long time2 = DATE_FORMAT_1.parse(TRACK_TIME_2).getTime();
long time3 = DATE_FORMAT_1.parse(TRACK_TIME_3).getTime(); long time3 = DATE_FORMAT_1.parse(TRACK_TIME_3).getTime();
Assert.assertEquals(time1 - time0 + time3 - time2, trackCaptor.getValue().getTripStatistics().getTotalTime()); Assert.assertEquals(time1 - time0 + time3 - time2, trackCaptor.getValue().getTrackStatistics().getTotalTime());
verifyTrack(trackCaptor.getValue(), TRACK_NAME_0, TRACK_DESCRIPTION_0, DATE_FORMAT_0.parse(TRACK_TIME_0).getTime()); verifyTrack(trackCaptor.getValue(), TRACK_NAME_0, TRACK_DESCRIPTION_0, DATE_FORMAT_0.parse(TRACK_TIME_0).getTime());
} }
@@ -168,7 +168,7 @@ public class GpxFileTrackImporterTest extends AbstractTestFileTrackImporter {
verify(contentProviderUtils, atLeastOnce()).updateTrack(trackCaptor.capture()); verify(contentProviderUtils, atLeastOnce()).updateTrack(trackCaptor.capture());
Assert.assertEquals(TRACK_ID_0, trackId); Assert.assertEquals(TRACK_ID_0, trackId);
Assert.assertEquals(0, trackCaptor.getValue().getTripStatistics().getTotalTime()); Assert.assertEquals(0, trackCaptor.getValue().getTrackStatistics().getTotalTime());
verifyTrack(trackCaptor.getValue(), TRACK_NAME_0, TRACK_DESCRIPTION_0, -1L); verifyTrack(trackCaptor.getValue(), TRACK_NAME_0, TRACK_DESCRIPTION_0, -1L);
} }
@@ -93,7 +93,7 @@ public class KmlFileTrackImporterTest extends AbstractTestFileTrackImporter {
long time0 = DATE_FORMAT_0.parse(TRACK_TIME_0).getTime(); long time0 = DATE_FORMAT_0.parse(TRACK_TIME_0).getTime();
long time1 = DATE_FORMAT_1.parse(TRACK_TIME_1).getTime(); long time1 = DATE_FORMAT_1.parse(TRACK_TIME_1).getTime();
Assert.assertEquals(time1 - time0, trackCaptor.getValue().getTripStatistics().getTotalTime()); Assert.assertEquals(time1 - time0, trackCaptor.getValue().getTrackStatistics().getTotalTime());
verifyTrack(trackCaptor.getValue(), TRACK_NAME_0, TRACK_DESCRIPTION_0, time0); verifyTrack(trackCaptor.getValue(), TRACK_NAME_0, TRACK_DESCRIPTION_0, time0);
} }
@@ -126,7 +126,7 @@ public class KmlFileTrackImporterTest extends AbstractTestFileTrackImporter {
long time1 = DATE_FORMAT_1.parse(TRACK_TIME_1).getTime(); long time1 = DATE_FORMAT_1.parse(TRACK_TIME_1).getTime();
long time2 = DATE_FORMAT_1.parse(TRACK_TIME_2).getTime(); long time2 = DATE_FORMAT_1.parse(TRACK_TIME_2).getTime();
long time3 = DATE_FORMAT_1.parse(TRACK_TIME_3).getTime(); long time3 = DATE_FORMAT_1.parse(TRACK_TIME_3).getTime();
Assert.assertEquals(time1 - time0 + time3 - time2, trackCaptor.getValue().getTripStatistics().getTotalTime()); Assert.assertEquals(time1 - time0 + time3 - time2, trackCaptor.getValue().getTrackStatistics().getTotalTime());
verifyTrack(trackCaptor.getValue(), TRACK_NAME_0, TRACK_DESCRIPTION_0, DATE_FORMAT_0.parse(TRACK_TIME_0).getTime()); verifyTrack(trackCaptor.getValue(), TRACK_NAME_0, TRACK_DESCRIPTION_0, DATE_FORMAT_0.parse(TRACK_TIME_0).getTime());
} }
@@ -46,7 +46,7 @@ import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.content.data.Waypoint; import de.dennisguse.opentracks.content.data.Waypoint;
import de.dennisguse.opentracks.content.provider.ContentProviderUtils; import de.dennisguse.opentracks.content.provider.ContentProviderUtils;
import de.dennisguse.opentracks.content.provider.CustomContentProvider; import de.dennisguse.opentracks.content.provider.CustomContentProvider;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.PreferencesUtils;
/** /**
@@ -193,9 +193,9 @@ public class TrackRecordingServiceTest {
Track dummyTrack = new Track(); Track dummyTrack = new Track();
dummyTrack.setId(id); dummyTrack.setId(id);
dummyTrack.setName("Dummy Track"); dummyTrack.setName("Dummy Track");
TripStatistics tripStatistics = new TripStatistics(); TrackStatistics trackStatistics = new TrackStatistics();
tripStatistics.setStopTime(stopTime); trackStatistics.setStopTime_ms(stopTime);
dummyTrack.setTripStatistics(tripStatistics); dummyTrack.setTrackStatistics(trackStatistics);
addTrack(dummyTrack, isRecording); addTrack(dummyTrack, isRecording);
} }
@@ -28,7 +28,7 @@ import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.content.data.Track; import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.content.provider.ContentProviderUtils; import de.dennisguse.opentracks.content.provider.ContentProviderUtils;
import de.dennisguse.opentracks.content.provider.CustomContentProvider; import de.dennisguse.opentracks.content.provider.CustomContentProvider;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.PreferencesUtils;
/** /**
@@ -229,9 +229,9 @@ public class TrackRecordingServiceTestLooper {
track = contentProviderUtils.getTrack(id); track = contentProviderUtils.getTrack(id);
Assert.assertNotNull(track); Assert.assertNotNull(track);
Assert.assertEquals(id, track.getId()); Assert.assertEquals(id, track.getId());
TripStatistics tripStatistics = track.getTripStatistics(); TrackStatistics trackStatistics = track.getTrackStatistics();
Assert.assertNotNull(tripStatistics); Assert.assertNotNull(trackStatistics);
Assert.assertTrue(tripStatistics.getStartTime() > 0); Assert.assertTrue(trackStatistics.getStartTime_ms() > 0);
Assert.assertTrue(tripStatistics.getStopTime() >= tripStatistics.getStartTime()); Assert.assertTrue(trackStatistics.getStopTime_ms() >= trackStatistics.getStartTime_ms());
} }
} }
@@ -22,28 +22,28 @@ import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.junit.runners.JUnit4;
/** /**
* Tests for {@link TripStatistics}. * Tests for {@link TrackStatistics}.
* This only tests non-trivial pieces of that class. * This only tests non-trivial pieces of that class.
* *
* @author Rodrigo Damazio * @author Rodrigo Damazio
*/ */
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
public class TripStatisticsTest { public class TrackStatisticsTest {
private TripStatistics statistics; private TrackStatistics statistics;
@Before @Before
public void setUp() { public void setUp() {
statistics = new TripStatistics(); statistics = new TrackStatistics();
} }
@Test @Test
public void testMerge() { public void testMerge() {
TripStatistics statistics2 = new TripStatistics(); TrackStatistics statistics2 = new TrackStatistics();
statistics.setStartTime(1000L); // Resulting start time statistics.setStartTime_ms(1000L); // Resulting start time
statistics.setStopTime(2500L); statistics.setStopTime_ms(2500L);
statistics2.setStartTime(3000L); statistics2.setStartTime_ms(3000L);
statistics2.setStopTime(4000L); // Resulting stop time statistics2.setStopTime_ms(4000L); // Resulting stop time
statistics.setTotalTime(1500L); statistics.setTotalTime(1500L);
statistics2.setTotalTime(1000L); // Result: 1500+1000 statistics2.setTotalTime(1000L); // Result: 1500+1000
statistics.setMovingTime(700L); statistics.setMovingTime(700L);
@@ -61,8 +61,8 @@ public class TripStatisticsTest {
statistics.merge(statistics2); statistics.merge(statistics2);
Assert.assertEquals(1000L, statistics.getStartTime()); Assert.assertEquals(1000L, statistics.getStartTime_ms());
Assert.assertEquals(4000L, statistics.getStopTime()); Assert.assertEquals(4000L, statistics.getStopTime_ms());
Assert.assertEquals(2500L, statistics.getTotalTime()); Assert.assertEquals(2500L, statistics.getTotalTime());
Assert.assertEquals(1300L, statistics.getMovingTime()); Assert.assertEquals(1300L, statistics.getMovingTime());
Assert.assertEquals(1100.0, statistics.getTotalDistance(), 0.001); Assert.assertEquals(1100.0, statistics.getTotalDistance(), 0.001);
@@ -9,7 +9,7 @@ import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class AnnouncementUtilsTest { public class AnnouncementUtilsTest {
@@ -18,7 +18,7 @@ public class AnnouncementUtilsTest {
@Test @Test
public void getAnnouncement() { public void getAnnouncement() {
TripStatistics stats = new TripStatistics(); TrackStatistics stats = new TrackStatistics();
stats.setTotalDistance(20000); stats.setTotalDistance(20000);
stats.setTotalTime(600000); stats.setTotalTime(600000);
stats.setMovingTime(300000); stats.setMovingTime(300000);
@@ -50,7 +50,7 @@ import de.dennisguse.opentracks.fragments.ConfirmDeleteDialogFragment;
import de.dennisguse.opentracks.fragments.DeleteMarkerDialogFragment; import de.dennisguse.opentracks.fragments.DeleteMarkerDialogFragment;
import de.dennisguse.opentracks.fragments.DeleteMarkerDialogFragment.DeleteMarkerCaller; import de.dennisguse.opentracks.fragments.DeleteMarkerDialogFragment.DeleteMarkerCaller;
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.ActivityUtils; import de.dennisguse.opentracks.util.ActivityUtils;
import de.dennisguse.opentracks.util.IntentUtils; import de.dennisguse.opentracks.util.IntentUtils;
import de.dennisguse.opentracks.util.ListItemUtils; import de.dennisguse.opentracks.util.ListItemUtils;
@@ -424,7 +424,7 @@ public class SearchListActivity extends AbstractListActivity implements DeleteMa
private Map<String, Object> prepareTrackForDisplay(Track track) { private Map<String, Object> prepareTrackForDisplay(Track track) {
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
TripStatistics tripStatistics = track.getTripStatistics(); TrackStatistics trackStatistics = track.getTrackStatistics();
String icon = track.getIcon(); String icon = track.getIcon();
String category = icon != null && !icon.equals("") ? null : track.getCategory(); String category = icon != null && !icon.equals("") ? null : track.getCategory();
@@ -433,10 +433,10 @@ public class SearchListActivity extends AbstractListActivity implements DeleteMa
resultMap.put(ICON_ID_FIELD, TrackIconUtils.getIconDrawable(icon)); resultMap.put(ICON_ID_FIELD, TrackIconUtils.getIconDrawable(icon));
resultMap.put(ICON_CONTENT_DESCRIPTION_ID_FIELD, R.string.image_track); resultMap.put(ICON_CONTENT_DESCRIPTION_ID_FIELD, R.string.image_track);
resultMap.put(NAME_FIELD, track.getName()); resultMap.put(NAME_FIELD, track.getName());
resultMap.put(TOTAL_TIME_FIELD, StringUtils.formatElapsedTime(tripStatistics.getTotalTime())); resultMap.put(TOTAL_TIME_FIELD, StringUtils.formatElapsedTime(trackStatistics.getTotalTime()));
resultMap.put(TOTAL_DISTANCE_FIELD, StringUtils.formatDistance(this, tripStatistics.getTotalDistance(), metricUnits)); resultMap.put(TOTAL_DISTANCE_FIELD, StringUtils.formatDistance(this, trackStatistics.getTotalDistance(), metricUnits));
resultMap.put(MARKER_COUNT_FIELD, contentProviderUtils.getWaypointCount(track.getId())); resultMap.put(MARKER_COUNT_FIELD, contentProviderUtils.getWaypointCount(track.getId()));
resultMap.put(START_TIME_FIELD, tripStatistics.getStartTime()); resultMap.put(START_TIME_FIELD, trackStatistics.getStartTime_ms());
resultMap.put(CATEGORY_FIELD, category); resultMap.put(CATEGORY_FIELD, category);
resultMap.put(DESCRIPTION_FIELD, track.getDescription()); resultMap.put(DESCRIPTION_FIELD, track.getDescription());
resultMap.put(PHOTO_URL_FIELD, null); resultMap.put(PHOTO_URL_FIELD, null);
@@ -23,7 +23,7 @@ import androidx.annotation.VisibleForTesting;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.content.data.Track; import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.StringUtils; import de.dennisguse.opentracks.util.StringUtils;
import de.dennisguse.opentracks.util.UnitConversions; import de.dennisguse.opentracks.util.UnitConversions;
@@ -67,7 +67,7 @@ public class DescriptionGenerator {
writeString(track.getName(), builder, R.string.generic_name_line, lineBreak); writeString(track.getName(), builder, R.string.generic_name_line, lineBreak);
writeString(track.getCategory(), builder, R.string.description_activity_type, lineBreak); writeString(track.getCategory(), builder, R.string.description_activity_type, lineBreak);
writeString(track.getDescription(), builder, R.string.generic_description_line, lineBreak); writeString(track.getDescription(), builder, R.string.generic_description_line, lineBreak);
builder.append(generateTripStatisticsDescription(track.getTripStatistics(), html)); builder.append(generateTrackStatisticsDescription(track.getTrackStatistics(), html));
return builder.toString(); return builder.toString();
} }
@@ -89,12 +89,12 @@ public class DescriptionGenerator {
} }
/** /**
* Generates a description for a {@link TripStatistics}. * Generates a description for a {@link TrackStatistics}.
* *
* @param stats the trip statistics * @param stats the track statistics
* @param html true to use "<br>" for line break instead of "\n" * @param html true to use "<br>" for line break instead of "\n"
*/ */
private String generateTripStatisticsDescription(TripStatistics stats, boolean html) { private String generateTrackStatisticsDescription(TrackStatistics stats, boolean html) {
String lineBreak = html ? HTML_LINE_BREAK : TEXT_LINE_BREAK; String lineBreak = html ? HTML_LINE_BREAK : TEXT_LINE_BREAK;
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
@@ -135,7 +135,7 @@ public class DescriptionGenerator {
writeElevation(stats.getTotalElevationGain(), builder, R.string.description_elevation_gain, lineBreak); writeElevation(stats.getTotalElevationGain(), builder, R.string.description_elevation_gain, lineBreak);
// Recorded time // Recorded time
builder.append(context.getString(R.string.description_recorded_time, StringUtils.formatDateTime(context, stats.getStartTime()))); builder.append(context.getString(R.string.description_recorded_time, StringUtils.formatDateTime(context, stats.getStartTime_ms())));
builder.append(lineBreak); builder.append(lineBreak);
return builder.toString(); return builder.toString();
@@ -33,7 +33,7 @@ import de.dennisguse.opentracks.content.data.TracksColumns;
import de.dennisguse.opentracks.content.data.Waypoint; import de.dennisguse.opentracks.content.data.Waypoint;
import de.dennisguse.opentracks.content.data.WaypointsColumns; import de.dennisguse.opentracks.content.data.WaypointsColumns;
import de.dennisguse.opentracks.content.provider.ContentProviderUtils; import de.dennisguse.opentracks.content.provider.ContentProviderUtils;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.LocationUtils; import de.dennisguse.opentracks.util.LocationUtils;
import de.dennisguse.opentracks.util.UnitConversions; import de.dennisguse.opentracks.util.UnitConversions;
@@ -247,9 +247,9 @@ public class SearchEngine {
score *= getTitleBoost(query, track.getName(), track.getDescription(), track.getCategory()); score *= getTitleBoost(query, track.getName(), track.getDescription(), track.getCategory());
TripStatistics statistics = track.getTripStatistics(); TrackStatistics statistics = track.getTrackStatistics();
long meanTimestamp = (statistics.getStartTime() + statistics.getStopTime()) / 2L; long meanTimestamp = (statistics.getStartTime_ms() + statistics.getStopTime_ms()) / 2L;
score *= getTimeBoost(query, meanTimestamp); score *= getTimeBoost(query, meanTimestamp);
// Score the currently-selected track lower (user is already there, wouldn't be searching for it). // Score the currently-selected track lower (user is already there, wouldn't be searching for it).
@@ -21,7 +21,7 @@ import androidx.annotation.VisibleForTesting;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
/** /**
* A track. * A track.
@@ -38,7 +38,7 @@ public class Track {
private String icon = ""; private String icon = "";
private TripStatistics tripStatistics = new TripStatistics(); private TrackStatistics trackStatistics = new TrackStatistics();
// Location points (which may not have been loaded) // Location points (which may not have been loaded)
private List<TrackPoint> trackPoints = new ArrayList<>(); private List<TrackPoint> trackPoints = new ArrayList<>();
@@ -86,12 +86,12 @@ public class Track {
this.icon = icon; this.icon = icon;
} }
public TripStatistics getTripStatistics() { public TrackStatistics getTrackStatistics() {
return tripStatistics; return trackStatistics;
} }
public void setTripStatistics(TripStatistics tripStatistics) { public void setTrackStatistics(TrackStatistics trackStatistics) {
this.tripStatistics = tripStatistics; this.trackStatistics = trackStatistics;
} }
@VisibleForTesting @VisibleForTesting
@@ -41,7 +41,7 @@ import de.dennisguse.opentracks.content.data.TracksColumns;
import de.dennisguse.opentracks.content.data.Waypoint; import de.dennisguse.opentracks.content.data.Waypoint;
import de.dennisguse.opentracks.content.data.WaypointsColumns; import de.dennisguse.opentracks.content.data.WaypointsColumns;
import de.dennisguse.opentracks.content.sensor.SensorDataSet; import de.dennisguse.opentracks.content.sensor.SensorDataSet;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.FileUtils; import de.dennisguse.opentracks.util.FileUtils;
/** /**
@@ -121,7 +121,7 @@ public class ContentProviderUtils {
int iconIndex = cursor.getColumnIndexOrThrow(TracksColumns.ICON); int iconIndex = cursor.getColumnIndexOrThrow(TracksColumns.ICON);
Track track = new Track(); Track track = new Track();
TripStatistics tripStatistics = track.getTripStatistics(); TrackStatistics trackStatistics = track.getTrackStatistics();
if (!cursor.isNull(idIndex)) { if (!cursor.isNull(idIndex)) {
track.setId(cursor.getLong(idIndex)); track.setId(cursor.getLong(idIndex));
} }
@@ -135,31 +135,31 @@ public class ContentProviderUtils {
track.setCategory(cursor.getString(categoryIndex)); track.setCategory(cursor.getString(categoryIndex));
} }
if (!cursor.isNull(startTimeIndex)) { if (!cursor.isNull(startTimeIndex)) {
tripStatistics.setStartTime(cursor.getLong(startTimeIndex)); trackStatistics.setStartTime_ms(cursor.getLong(startTimeIndex));
} }
if (!cursor.isNull(stopTimeIndex)) { if (!cursor.isNull(stopTimeIndex)) {
tripStatistics.setStopTime(cursor.getLong(stopTimeIndex)); trackStatistics.setStopTime_ms(cursor.getLong(stopTimeIndex));
} }
if (!cursor.isNull(totalDistanceIndex)) { if (!cursor.isNull(totalDistanceIndex)) {
tripStatistics.setTotalDistance(cursor.getFloat(totalDistanceIndex)); trackStatistics.setTotalDistance(cursor.getFloat(totalDistanceIndex));
} }
if (!cursor.isNull(totalTimeIndex)) { if (!cursor.isNull(totalTimeIndex)) {
tripStatistics.setTotalTime(cursor.getLong(totalTimeIndex)); trackStatistics.setTotalTime(cursor.getLong(totalTimeIndex));
} }
if (!cursor.isNull(movingTimeIndex)) { if (!cursor.isNull(movingTimeIndex)) {
tripStatistics.setMovingTime(cursor.getLong(movingTimeIndex)); trackStatistics.setMovingTime(cursor.getLong(movingTimeIndex));
} }
if (!cursor.isNull(maxSpeedIndex)) { if (!cursor.isNull(maxSpeedIndex)) {
tripStatistics.setMaxSpeed(cursor.getFloat(maxSpeedIndex)); trackStatistics.setMaxSpeed(cursor.getFloat(maxSpeedIndex));
} }
if (!cursor.isNull(minElevationIndex)) { if (!cursor.isNull(minElevationIndex)) {
tripStatistics.setMinElevation(cursor.getFloat(minElevationIndex)); trackStatistics.setMinElevation(cursor.getFloat(minElevationIndex));
} }
if (!cursor.isNull(maxElevationIndex)) { if (!cursor.isNull(maxElevationIndex)) {
tripStatistics.setMaxElevation(cursor.getFloat(maxElevationIndex)); trackStatistics.setMaxElevation(cursor.getFloat(maxElevationIndex));
} }
if (!cursor.isNull(elevationGainIndex)) { if (!cursor.isNull(elevationGainIndex)) {
tripStatistics.setTotalElevationGain(cursor.getFloat(elevationGainIndex)); trackStatistics.setTotalElevationGain(cursor.getFloat(elevationGainIndex));
} }
if (!cursor.isNull(iconIndex)) { if (!cursor.isNull(iconIndex)) {
track.setIcon(cursor.getString(iconIndex)); track.setIcon(cursor.getString(iconIndex));
@@ -308,7 +308,7 @@ public class ContentProviderUtils {
private ContentValues createContentValues(Track track) { private ContentValues createContentValues(Track track) {
ContentValues values = new ContentValues(); ContentValues values = new ContentValues();
TripStatistics tripStatistics = track.getTripStatistics(); TrackStatistics trackStatistics = track.getTrackStatistics();
// Value < 0 indicates no id is available // Value < 0 indicates no id is available
if (track.getId() >= 0) { if (track.getId() >= 0) {
@@ -317,17 +317,17 @@ public class ContentProviderUtils {
values.put(TracksColumns.NAME, track.getName()); values.put(TracksColumns.NAME, track.getName());
values.put(TracksColumns.DESCRIPTION, track.getDescription()); values.put(TracksColumns.DESCRIPTION, track.getDescription());
values.put(TracksColumns.CATEGORY, track.getCategory()); values.put(TracksColumns.CATEGORY, track.getCategory());
values.put(TracksColumns.STARTTIME, tripStatistics.getStartTime()); values.put(TracksColumns.STARTTIME, trackStatistics.getStartTime_ms());
values.put(TracksColumns.STOPTIME, tripStatistics.getStopTime()); values.put(TracksColumns.STOPTIME, trackStatistics.getStopTime_ms());
values.put(TracksColumns.TOTALDISTANCE, tripStatistics.getTotalDistance()); values.put(TracksColumns.TOTALDISTANCE, trackStatistics.getTotalDistance());
values.put(TracksColumns.TOTALTIME, tripStatistics.getTotalTime()); values.put(TracksColumns.TOTALTIME, trackStatistics.getTotalTime());
values.put(TracksColumns.MOVINGTIME, tripStatistics.getMovingTime()); values.put(TracksColumns.MOVINGTIME, trackStatistics.getMovingTime());
values.put(TracksColumns.AVGSPEED, tripStatistics.getAverageSpeed()); values.put(TracksColumns.AVGSPEED, trackStatistics.getAverageSpeed());
values.put(TracksColumns.AVGMOVINGSPEED, tripStatistics.getAverageMovingSpeed()); values.put(TracksColumns.AVGMOVINGSPEED, trackStatistics.getAverageMovingSpeed());
values.put(TracksColumns.MAXSPEED, tripStatistics.getMaxSpeed()); values.put(TracksColumns.MAXSPEED, trackStatistics.getMaxSpeed());
values.put(TracksColumns.MINELEVATION, tripStatistics.getMinElevation()); values.put(TracksColumns.MINELEVATION, trackStatistics.getMinElevation());
values.put(TracksColumns.MAXELEVATION, tripStatistics.getMaxElevation()); values.put(TracksColumns.MAXELEVATION, trackStatistics.getMaxElevation());
values.put(TracksColumns.ELEVATIONGAIN, tripStatistics.getTotalElevationGain()); values.put(TracksColumns.ELEVATIONGAIN, trackStatistics.getTotalElevationGain());
values.put(TracksColumns.ICON, track.getIcon()); values.put(TracksColumns.ICON, track.getIcon());
return values; return values;
@@ -42,8 +42,8 @@ import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.content.data.TrackPoint; import de.dennisguse.opentracks.content.data.TrackPoint;
import de.dennisguse.opentracks.content.data.Waypoint; import de.dennisguse.opentracks.content.data.Waypoint;
import de.dennisguse.opentracks.content.sensor.SensorDataSet; import de.dennisguse.opentracks.content.sensor.SensorDataSet;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.stats.TripStatisticsUpdater; import de.dennisguse.opentracks.stats.TrackStatisticsUpdater;
import de.dennisguse.opentracks.util.LocationUtils; import de.dennisguse.opentracks.util.LocationUtils;
import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.PreferencesUtils;
import de.dennisguse.opentracks.util.UnitConversions; import de.dennisguse.opentracks.util.UnitConversions;
@@ -72,7 +72,7 @@ public class ChartFragment extends Fragment implements TrackDataListener {
private TrackDataHub trackDataHub; private TrackDataHub trackDataHub;
// Stats gathered from the received data // Stats gathered from the received data
private TripStatisticsUpdater tripStatisticsUpdater; private TrackStatisticsUpdater trackStatisticsUpdater;
private long startTime; private long startTime;
private int recordingDistanceInterval; private int recordingDistanceInterval;
@@ -193,18 +193,18 @@ public class ChartFragment extends Fragment implements TrackDataListener {
@Override @Override
public void onTrackUpdated(Track track) { public void onTrackUpdated(Track track) {
if (isResumed()) { if (isResumed()) {
if (track == null || track.getTripStatistics() == null) { if (track == null || track.getTrackStatistics() == null) {
startTime = -1L; startTime = -1L;
return; return;
} }
startTime = track.getTripStatistics().getStartTime(); startTime = track.getTrackStatistics().getStartTime_ms();
} }
} }
@Override @Override
public void clearTrackPoints() { public void clearTrackPoints() {
if (isResumed()) { if (isResumed()) {
tripStatisticsUpdater = startTime != -1L ? new TripStatisticsUpdater(startTime) : null; trackStatisticsUpdater = startTime != -1L ? new TrackStatisticsUpdater(startTime) : null;
pendingPoints.clear(); pendingPoints.clear();
chartView.reset(); chartView.reset();
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@@ -369,25 +369,25 @@ public class ChartFragment extends Fragment implements TrackDataListener {
double speed = Double.NaN; double speed = Double.NaN;
double pace = Double.NaN; double pace = Double.NaN;
if (tripStatisticsUpdater != null) { if (trackStatisticsUpdater != null) {
tripStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval); trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);
TripStatistics tripStatistics = tripStatisticsUpdater.getTripStatistics(); TrackStatistics trackStatistics = trackStatisticsUpdater.getTrackStatistics();
if (chartByDistance) { if (chartByDistance) {
double distance = tripStatistics.getTotalDistance() * UnitConversions.M_TO_KM; double distance = trackStatistics.getTotalDistance() * UnitConversions.M_TO_KM;
if (!chartView.getMetricUnits()) { if (!chartView.getMetricUnits()) {
distance *= UnitConversions.KM_TO_MI; distance *= UnitConversions.KM_TO_MI;
} }
timeOrDistance = distance; timeOrDistance = distance;
} else { } else {
timeOrDistance = tripStatistics.getTotalTime(); timeOrDistance = trackStatistics.getTotalTime();
} }
elevation = tripStatisticsUpdater.getSmoothedElevation(); elevation = trackStatisticsUpdater.getSmoothedElevation();
if (!chartView.getMetricUnits()) { if (!chartView.getMetricUnits()) {
elevation *= UnitConversions.M_TO_FT; elevation *= UnitConversions.M_TO_FT;
} }
speed = tripStatisticsUpdater.getSmoothedSpeed() * UnitConversions.MS_TO_KMH; speed = trackStatisticsUpdater.getSmoothedSpeed() * UnitConversions.MS_TO_KMH;
if (!chartView.getMetricUnits()) { if (!chartView.getMetricUnits()) {
speed *= UnitConversions.KM_TO_MI; speed *= UnitConversions.KM_TO_MI;
} }
@@ -423,8 +423,8 @@ public class ChartFragment extends Fragment implements TrackDataListener {
} }
@VisibleForTesting @VisibleForTesting
void setTripStatisticsUpdater(long time) { void setTrackStatisticsUpdater(long time) {
tripStatisticsUpdater = new TripStatisticsUpdater(time); trackStatisticsUpdater = new TrackStatisticsUpdater(time);
} }
@VisibleForTesting @VisibleForTesting
@@ -47,7 +47,7 @@ import de.dennisguse.opentracks.content.sensor.SensorDataSet;
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
import de.dennisguse.opentracks.services.TrackRecordingServiceInterface; import de.dennisguse.opentracks.services.TrackRecordingServiceInterface;
import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager; import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.LocationUtils; import de.dennisguse.opentracks.util.LocationUtils;
import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.PreferencesUtils;
import de.dennisguse.opentracks.util.StringUtils; import de.dennisguse.opentracks.util.StringUtils;
@@ -73,7 +73,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
private TrackRecordingServiceConnection trackRecordingServiceConnection; private TrackRecordingServiceConnection trackRecordingServiceConnection;
private TrackPoint lastTrackPoint = null; private TrackPoint lastTrackPoint = null;
private TripStatistics lastTripStatistics = null; private TrackStatistics lastTrackStatistics = null;
private String category = ""; private String category = "";
@Deprecated //TODO This should be handled somewhere else; not in the UI. @Deprecated //TODO This should be handled somewhere else; not in the UI.
@@ -124,7 +124,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
private final Runnable updateUIeachSecond = new Runnable() { private final Runnable updateUIeachSecond = new Runnable() {
public void run() { public void run() {
if (isResumed() && isSelectedTrackRecording()) { if (isResumed() && isSelectedTrackRecording()) {
if (!isSelectedTrackPaused() && lastTripStatistics != null) { if (!isSelectedTrackPaused() && lastTrackStatistics != null) {
updateTotalTime(); updateTotalTime();
updateSensorDataUI(); updateSensorDataUI();
} }
@@ -322,7 +322,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
@Override @Override
public void run() { public void run() {
if (isResumed()) { if (isResumed()) {
lastTripStatistics = track != null ? track.getTripStatistics() : null; lastTrackStatistics = track != null ? track.getTrackStatistics() : null;
category = track != null ? track.getCategory() : ""; category = track != null ? track.getCategory() : "";
updateUI(); updateUI();
} }
@@ -477,7 +477,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
// Set total distance // Set total distance
{ {
double totalDistance = lastTripStatistics == null ? Double.NaN : lastTripStatistics.getTotalDistance(); double totalDistance = lastTrackStatistics == null ? Double.NaN : lastTrackStatistics.getTotalDistance();
Pair<String, String> parts = StringUtils.getDistanceParts(getContext(), totalDistance, metricUnits); Pair<String, String> parts = StringUtils.getDistanceParts(getContext(), totalDistance, metricUnits);
distanceValue.setText(parts.first); distanceValue.setText(parts.first);
@@ -496,14 +496,14 @@ public class StatsFragment extends Fragment implements TrackDataListener {
} }
// Set time // Set time
if (lastTripStatistics != null) { if (lastTrackStatistics != null) {
movingTimeValue.setText(StringUtils.formatElapsedTime(lastTripStatistics.getMovingTime())); movingTimeValue.setText(StringUtils.formatElapsedTime(lastTrackStatistics.getMovingTime()));
updateTotalTime(); updateTotalTime();
} }
// Set average speed/pace // Set average speed/pace
{ {
double speed = lastTripStatistics != null ? lastTripStatistics.getAverageSpeed() : Double.NaN; double speed = lastTrackStatistics != null ? lastTrackStatistics.getAverageSpeed() : Double.NaN;
speedAvgLabel.setText(reportSpeed ? R.string.stats_average_speed : R.string.stats_average_pace); speedAvgLabel.setText(reportSpeed ? R.string.stats_average_speed : R.string.stats_average_pace);
Pair<String, String> parts = StringUtils.getSpeedParts(getContext(), speed, metricUnits, reportSpeed); Pair<String, String> parts = StringUtils.getSpeedParts(getContext(), speed, metricUnits, reportSpeed);
@@ -513,7 +513,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
// Set max speed/pace // Set max speed/pace
{ {
double speed = lastTripStatistics == null ? Double.NaN : lastTripStatistics.getMaxSpeed(); double speed = lastTrackStatistics == null ? Double.NaN : lastTrackStatistics.getMaxSpeed();
speedMaxLabel.setText(reportSpeed ? R.string.stats_max_speed : R.string.stats_fastest_pace); speedMaxLabel.setText(reportSpeed ? R.string.stats_max_speed : R.string.stats_fastest_pace);
@@ -524,7 +524,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
// Set moving speed/pace // Set moving speed/pace
{ {
double speed = lastTripStatistics != null ? lastTripStatistics.getAverageMovingSpeed() : Double.NaN; double speed = lastTrackStatistics != null ? lastTrackStatistics.getAverageMovingSpeed() : Double.NaN;
speedMovingLabel.setText(reportSpeed ? R.string.stats_average_moving_speed : R.string.stats_average_moving_pace); speedMovingLabel.setText(reportSpeed ? R.string.stats_average_moving_speed : R.string.stats_average_moving_pace);
@@ -545,21 +545,21 @@ public class StatsFragment extends Fragment implements TrackDataListener {
if (isSelectedTrackRecording()) { if (isSelectedTrackRecording()) {
totalTime = calculateTotalTime(); totalTime = calculateTotalTime();
} else { } else {
totalTime = lastTripStatistics.getTotalTime(); totalTime = lastTrackStatistics.getTotalTime();
} }
totalTimeValueView.setText(StringUtils.formatElapsedTime(totalTime)); totalTimeValueView.setText(StringUtils.formatElapsedTime(totalTime));
} }
/** /**
* Return time from service. * Return time from service.
* If service isn't bound then use lastTripStatistics for calculate it. * If service isn't bound then use lastTrackStatistics for calculate it.
*/ */
private long calculateTotalTime() { private long calculateTotalTime() {
TrackRecordingServiceInterface trackRecordingService = trackRecordingServiceConnection.getServiceIfBound(); TrackRecordingServiceInterface trackRecordingService = trackRecordingServiceConnection.getServiceIfBound();
if (trackRecordingService != null) { if (trackRecordingService != null) {
return trackRecordingService.getTotalTime(); return trackRecordingService.getTotalTime();
} else { } else {
return System.currentTimeMillis() - lastTripStatistics.getStopTime() + lastTripStatistics.getTotalTime(); return System.currentTimeMillis() - lastTrackStatistics.getStopTime_ms() + lastTrackStatistics.getTotalTime();
} }
} }
@@ -70,9 +70,9 @@ public class FileTrackExporter implements TrackExporter {
writeWaypoints(track1); writeWaypoints(track1);
} }
trackWriter.writeBeginTracks(); trackWriter.writeBeginTracks();
long startTime = tracks[0].getTripStatistics().getStartTime(); long startTime = tracks[0].getTrackStatistics().getStartTime_ms();
for (Track track : tracks) { for (Track track : tracks) {
long offset = track.getTripStatistics().getStartTime() - startTime; long offset = track.getTrackStatistics().getStartTime_ms() - startTime;
writeLocations(track, offset); writeLocations(track, offset);
} }
trackWriter.writeEndTracks(); trackWriter.writeEndTracks();
@@ -41,7 +41,7 @@ import de.dennisguse.opentracks.content.data.TrackPoint;
import de.dennisguse.opentracks.content.data.Waypoint; import de.dennisguse.opentracks.content.data.Waypoint;
import de.dennisguse.opentracks.content.provider.ContentProviderUtils; import de.dennisguse.opentracks.content.provider.ContentProviderUtils;
import de.dennisguse.opentracks.content.provider.TrackPointIterator; import de.dennisguse.opentracks.content.provider.TrackPointIterator;
import de.dennisguse.opentracks.stats.TripStatisticsUpdater; import de.dennisguse.opentracks.stats.TrackStatisticsUpdater;
import de.dennisguse.opentracks.util.FileUtils; import de.dennisguse.opentracks.util.FileUtils;
import de.dennisguse.opentracks.util.LocationUtils; import de.dennisguse.opentracks.util.LocationUtils;
import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.PreferencesUtils;
@@ -156,9 +156,9 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
int waypointPosition = -1; int waypointPosition = -1;
Waypoint waypoint = null; Waypoint waypoint = null;
TrackPoint trackPoint = null; TrackPoint trackPoint = null;
TripStatisticsUpdater trackTripStatisticstrackUpdater = new TripStatisticsUpdater(track.getTripStatistics().getStartTime()); TrackStatisticsUpdater trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics().getStartTime_ms());
@Deprecated // TODO Should not be necessary anymore? // TODO Should not be necessary anymore?
TripStatisticsUpdater markerTripStatisticsUpdater = new TripStatisticsUpdater(track.getTripStatistics().getStartTime()); TrackStatisticsUpdater markerTrackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics().getStartTime_ms());
try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), -1L, false)) { try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), -1L, false)) {
@@ -178,8 +178,8 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
return; return;
} }
trackPoint = trackPointIterator.next(); trackPoint = trackPointIterator.next();
trackTripStatisticstrackUpdater.addTrackPoint(trackPoint, recordingDistanceInterval); trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);
markerTripStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval); markerTrackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);
} }
if (waypoint.getLocation().getTime() > trackPoint.getTime()) { if (waypoint.getLocation().getTime() > trackPoint.getTime()) {
@@ -199,8 +199,8 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
if (trackPoint.getLatitude() == waypoint.getLocation().getLatitude() && trackPoint.getLongitude() == waypoint.getLocation().getLongitude()) { if (trackPoint.getLatitude() == waypoint.getLocation().getLatitude() && trackPoint.getLongitude() == waypoint.getLocation().getLongitude()) {
String waypointDescription = waypoint.getDescription(); String waypointDescription = waypoint.getDescription();
String icon = context.getString(R.string.marker_waypoint_icon_url); String icon = context.getString(R.string.marker_waypoint_icon_url);
double length = trackTripStatisticstrackUpdater.getTripStatistics().getTotalDistance(); double length = trackStatisticsUpdater.getTrackStatistics().getTotalDistance();
long duration = trackTripStatisticstrackUpdater.getTripStatistics().getTotalTime(); long duration = trackStatisticsUpdater.getTrackStatistics().getTotalTime();
// Insert waypoint // Insert waypoint
Waypoint newWaypoint = new Waypoint(waypoint.getName(), waypointDescription, waypoint.getCategory(), icon, track.getId(), length, duration, trackPoint.getLocation(), waypoint.getPhotoUrl()); Waypoint newWaypoint = new Waypoint(waypoint.getName(), waypointDescription, waypoint.getCategory(), icon, track.getId(), length, duration, trackPoint.getLocation(), waypoint.getPhotoUrl());
@@ -254,11 +254,11 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
if (icon != null) { if (icon != null) {
trackData.track.setIcon(icon); trackData.track.setIcon(icon);
} }
if (trackData.tripStatisticsUpdater == null) { if (trackData.trackStatisticsUpdater == null) {
trackData.tripStatisticsUpdater = new TripStatisticsUpdater(trackData.importTime); trackData.trackStatisticsUpdater = new TrackStatisticsUpdater(trackData.importTime);
trackData.tripStatisticsUpdater.updateTime(trackData.importTime); trackData.trackStatisticsUpdater.updateTime(trackData.importTime);
} }
trackData.track.setTripStatistics(trackData.tripStatisticsUpdater.getTripStatistics()); trackData.track.setTrackStatistics(trackData.trackStatisticsUpdater.getTrackStatistics());
contentProviderUtils.updateTrack(trackData.track); contentProviderUtils.updateTrack(trackData.track);
} }
@@ -420,10 +420,10 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
* @param trackPoint the trackPoint * @param trackPoint the trackPoint
*/ */
private void insertLocation(TrackPoint trackPoint) { private void insertLocation(TrackPoint trackPoint) {
if (trackData.tripStatisticsUpdater == null) { if (trackData.trackStatisticsUpdater == null) {
trackData.tripStatisticsUpdater = new TripStatisticsUpdater(trackPoint.getTime() != -1L ? trackPoint.getTime() : trackData.importTime); trackData.trackStatisticsUpdater = new TrackStatisticsUpdater(trackPoint.getTime() != -1L ? trackPoint.getTime() : trackData.importTime);
} }
trackData.tripStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval); trackData.trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);
trackData.bufferedTrackPoints[trackData.numBufferedLocations] = trackPoint; trackData.bufferedTrackPoints[trackData.numBufferedLocations] = trackPoint;
trackData.numBufferedLocations++; trackData.numBufferedLocations++;
@@ -475,8 +475,8 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
// The number of locations processed for the current track // The number of locations processed for the current track
int numberOfLocations = 0; int numberOfLocations = 0;
// The trip statistics updater for the current track // The TrackStatisticsUpdater for the current track
TripStatisticsUpdater tripStatisticsUpdater; TrackStatisticsUpdater trackStatisticsUpdater;
// The import time of the track. // The import time of the track.
final long importTime = System.currentTimeMillis(); final long importTime = System.currentTimeMillis();
@@ -51,8 +51,8 @@ import de.dennisguse.opentracks.content.sensor.SensorDataSet;
import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager; import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager;
import de.dennisguse.opentracks.services.tasks.AnnouncementPeriodicTaskFactory; import de.dennisguse.opentracks.services.tasks.AnnouncementPeriodicTaskFactory;
import de.dennisguse.opentracks.services.tasks.PeriodicTaskExecutor; import de.dennisguse.opentracks.services.tasks.PeriodicTaskExecutor;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.stats.TripStatisticsUpdater; import de.dennisguse.opentracks.stats.TrackStatisticsUpdater;
import de.dennisguse.opentracks.util.IntentUtils; import de.dennisguse.opentracks.util.IntentUtils;
import de.dennisguse.opentracks.util.LocationUtils; import de.dennisguse.opentracks.util.LocationUtils;
import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.PreferencesUtils;
@@ -137,7 +137,7 @@ public class TrackRecordingService extends Service {
private WakeLock wakeLock; private WakeLock wakeLock;
private BluetoothRemoteSensorManager remoteSensorManager; private BluetoothRemoteSensorManager remoteSensorManager;
private TripStatisticsUpdater trackTripStatisticsUpdater; private TrackStatisticsUpdater trackStatisticsUpdater;
private TrackPoint lastTrackPoint; private TrackPoint lastTrackPoint;
private boolean currentSegmentHasLocation; private boolean currentSegmentHasLocation;
private boolean isIdle; private boolean isIdle;
@@ -259,21 +259,21 @@ public class TrackRecordingService extends Service {
return recordingTrackId; return recordingTrackId;
} }
public TripStatistics getTripStatistics() { public TrackStatistics getTrackStatistics() {
if (trackTripStatisticsUpdater == null) { if (trackStatisticsUpdater == null) {
return null; return null;
} }
return trackTripStatisticsUpdater.getTripStatistics(); return trackStatisticsUpdater.getTrackStatistics();
} }
public long getTotalTime() { public long getTotalTime() {
if (trackTripStatisticsUpdater == null) { if (trackStatisticsUpdater == null) {
return 0; return 0;
} }
if (!isPaused()) { if (!isPaused()) {
trackTripStatisticsUpdater.updateTime(System.currentTimeMillis()); trackStatisticsUpdater.updateTime(System.currentTimeMillis());
} }
return trackTripStatisticsUpdater.getTripStatistics().getTotalTime(); return trackStatisticsUpdater.getTrackStatistics().getTotalTime();
} }
/** /**
@@ -305,7 +305,7 @@ public class TrackRecordingService extends Service {
String icon = getString(R.string.marker_waypoint_icon_url); String icon = getString(R.string.marker_waypoint_icon_url);
photoUrl = photoUrl != null ? photoUrl : ""; photoUrl = photoUrl != null ? photoUrl : "";
TripStatistics stats = trackTripStatisticsUpdater.getTripStatistics(); TrackStatistics stats = trackStatisticsUpdater.getTrackStatistics();
double length = stats.getTotalDistance(); double length = stats.getTotalDistance();
long duration = stats.getTotalTime(); long duration = stats.getTotalTime();
@@ -326,7 +326,7 @@ public class TrackRecordingService extends Service {
return -1L; return -1L;
} }
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
trackTripStatisticsUpdater = new TripStatisticsUpdater(now); trackStatisticsUpdater = new TrackStatisticsUpdater(now);
// Insert a track // Insert a track
Track track = new Track(); Track track = new Track();
@@ -343,7 +343,7 @@ public class TrackRecordingService extends Service {
String category = PreferencesUtils.getDefaultActivity(this); String category = PreferencesUtils.getDefaultActivity(this);
track.setCategory(category); track.setCategory(category);
track.setIcon(TrackIconUtils.getIconValue(this, category)); track.setIcon(TrackIconUtils.getIconValue(this, category));
track.setTripStatistics(trackTripStatisticsUpdater.getTripStatistics()); track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics());
contentProviderUtils.updateTrack(track); contentProviderUtils.updateTrack(track);
startRecording(); startRecording();
@@ -364,8 +364,8 @@ public class TrackRecordingService extends Service {
} }
// Sync the real time setting the stop time with current time. // Sync the real time setting the stop time with current time.
track.getTripStatistics().setStopTime(System.currentTimeMillis()); track.getTrackStatistics().setStopTime_ms(System.currentTimeMillis());
trackTripStatisticsUpdater = new TripStatisticsUpdater(track.getTripStatistics()); trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics());
insertTrackPoint(track, TrackPoint.createPause(), null); insertTrackPoint(track, TrackPoint.createPause(), null);
insertTrackPoint(track, TrackPoint.createResume(), null); insertTrackPoint(track, TrackPoint.createResume(), null);
@@ -379,11 +379,10 @@ public class TrackRecordingService extends Service {
private void restartTrack(Track track) { private void restartTrack(Track track) {
Log.d(TAG, "Restarting track: " + track.getId()); Log.d(TAG, "Restarting track: " + track.getId());
TripStatistics tripStatistics = track.getTripStatistics(); trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics().getStartTime_ms());
trackTripStatisticsUpdater = new TripStatisticsUpdater(tripStatistics.getStartTime());
try (TrackPointIterator locationIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), -1L, false)) { try (TrackPointIterator locationIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), -1L, false)) {
trackTripStatisticsUpdater.addTrackPoint(locationIterator, recordingDistanceInterval); trackStatisticsUpdater.addTrackPoint(locationIterator, recordingDistanceInterval);
} catch (RuntimeException e) { } catch (RuntimeException e) {
Log.e(TAG, "RuntimeException", e); Log.e(TAG, "RuntimeException", e);
} }
@@ -462,7 +461,7 @@ public class TrackRecordingService extends Service {
updateRecordingTrack(track); updateRecordingTrack(track);
} }
String trackName = TrackNameUtils.getTrackName(this, trackId, track.getTripStatistics().getStartTime()); String trackName = TrackNameUtils.getTrackName(this, trackId, track.getTrackStatistics().getStartTime_ms());
if (trackName != null && !trackName.equals(track.getName())) { if (trackName != null && !trackName.equals(track.getName())) {
track.setName(trackName); track.setName(trackName);
contentProviderUtils.updateTrack(track); contentProviderUtils.updateTrack(track);
@@ -657,7 +656,7 @@ public class TrackRecordingService extends Service {
try { try {
contentProviderUtils.insertTrackPoint(trackPoint, track.getId()); contentProviderUtils.insertTrackPoint(trackPoint, track.getId());
trackTripStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval); trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);
updateRecordingTrack(track); updateRecordingTrack(track);
} catch (SQLiteException e) { } catch (SQLiteException e) {
/* /*
@@ -675,8 +674,8 @@ public class TrackRecordingService extends Service {
* @param track the track * @param track the track
*/ */
private void updateRecordingTrack(Track track) { private void updateRecordingTrack(Track track) {
trackTripStatisticsUpdater.updateTime(System.currentTimeMillis()); trackStatisticsUpdater.updateTime(System.currentTimeMillis());
track.setTripStatistics(trackTripStatisticsUpdater.getTripStatistics()); track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics());
contentProviderUtils.updateTrack(track); contentProviderUtils.updateTrack(track);
} }
@@ -26,11 +26,11 @@ import android.util.Log;
import java.util.Locale; import java.util.Locale;
import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingService;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.AnnouncementUtils; import de.dennisguse.opentracks.util.AnnouncementUtils;
/** /**
* This class will periodically announce the user's trip statistics. * This class will periodically announce the user's {@link TrackStatistics}.
* *
* @author Sandor Dornbush * @author Sandor Dornbush
*/ */
@@ -126,17 +126,17 @@ public class AnnouncementPeriodicTask implements PeriodicTask {
Log.e(TAG, "TrackRecordingService is null."); Log.e(TAG, "TrackRecordingService is null.");
return; return;
} }
announce(trackRecordingService.getTripStatistics()); announce(trackRecordingService.getTrackStatistics());
} }
/** /**
* Runs this task. * Runs this task.
* *
* @param tripStatistics the trip statistics * @param trackStatistics the track statistics
*/ */
private void announce(TripStatistics tripStatistics) { private void announce(TrackStatistics trackStatistics) {
if (tripStatistics == null) { if (trackStatistics == null) {
Log.e(TAG, "TripStatistics is null."); Log.e(TAG, "TrackStatistics is null.");
return; return;
} }
@@ -157,7 +157,7 @@ public class AnnouncementPeriodicTask implements PeriodicTask {
Log.i(TAG, "Speech is not allowed at this time."); Log.i(TAG, "Speech is not allowed at this time.");
return; return;
} }
String announcement = AnnouncementUtils.getAnnouncement(context, tripStatistics); String announcement = AnnouncementUtils.getAnnouncement(context, trackStatistics);
speakAnnouncement(announcement); speakAnnouncement(announcement);
} }
@@ -19,7 +19,7 @@ import android.util.Log;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingService;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.UnitConversions; import de.dennisguse.opentracks.util.UnitConversions;
/** /**
@@ -122,12 +122,12 @@ public class PeriodicTaskExecutor {
return; return;
} }
TripStatistics tripStatistics = trackRecordingService.getTripStatistics(); TrackStatistics trackStatistics = trackRecordingService.getTrackStatistics();
if (tripStatistics == null) { if (trackStatistics == null) {
return; return;
} }
double distance = tripStatistics.getTotalDistance() * UnitConversions.M_TO_KM; double distance = trackStatistics.getTotalDistance() * UnitConversions.M_TO_KM;
if (!metricUnits) { if (!metricUnits) {
distance *= UnitConversions.KM_TO_MI; distance *= UnitConversions.KM_TO_MI;
} }
@@ -166,8 +166,8 @@ public class PeriodicTaskExecutor {
return; return;
} }
TripStatistics tripStatistics = trackRecordingService.getTripStatistics(); TrackStatistics trackStatistics = trackRecordingService.getTrackStatistics();
if (tripStatistics == null) { if (trackStatistics == null) {
return; return;
} }
@@ -177,7 +177,7 @@ public class PeriodicTaskExecutor {
return; return;
} }
double distance = tripStatistics.getTotalDistance() * UnitConversions.M_TO_KM; double distance = trackStatistics.getTotalDistance() * UnitConversions.M_TO_KM;
if (!metricUnits) { if (!metricUnits) {
distance *= UnitConversions.KM_TO_MI; distance *= UnitConversions.KM_TO_MI;
} }
@@ -21,7 +21,7 @@ import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingService;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
/** /**
* This class will periodically perform a task. * This class will periodically perform a task.
@@ -55,8 +55,8 @@ class TimerTaskExecutor {
return; return;
} }
TripStatistics tripStatistics = trackRecordingService.getTripStatistics(); TrackStatistics trackStatistics = trackRecordingService.getTrackStatistics();
if (tripStatistics == null) { if (trackStatistics == null) {
return; return;
} }
@@ -69,7 +69,7 @@ class TimerTaskExecutor {
} }
}; };
timer = new Timer(TimerTaskExecutor.class.getSimpleName()); timer = new Timer(TimerTaskExecutor.class.getSimpleName());
long next = System.currentTimeMillis() + interval_ms - (tripStatistics.getTotalTime() % interval_ms); long next = System.currentTimeMillis() + interval_ms - (trackStatistics.getTotalTime() % interval_ms);
timer.scheduleAtFixedRate(timerTask, new Date(next), interval_ms); timer.scheduleAtFixedRate(timerTask, new Date(next), interval_ms);
} }
@@ -19,20 +19,20 @@ package de.dennisguse.opentracks.stats;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
/** /**
* Statistical data about a trip. * Statistical data about a {@link de.dennisguse.opentracks.content.data.Track}.
* The data in this class should be filled out by TripStatisticsBuilder. * The data in this class should be filled out by {@link TrackStatisticsUpdater}.
* *
* @author Rodrigo Damazio * @author Rodrigo Damazio
*/ */
public class TripStatistics { public class TrackStatistics {
// The min and max elevation (meters) seen on this trip. // The min and max elevation (meters) seen on this track.
private final ExtremityMonitor elevationExtremities = new ExtremityMonitor(); private final ExtremityMonitor elevationExtremities = new ExtremityMonitor();
// The trip start time. This is the system time, might not match the GPs time. // The track start time. This is the system time, might not match the GPs time.
private long startTime = -1L; private long startTime_ms = -1L;
// The trip stop time. This is the system time, might not match the GPS time. // The track stop time. This is the system time, might not match the GPS time.
private long stopTime = -1L; private long stopTime_ms = -1L;
private double totalDistance_m; private double totalDistance_m;
// Updated when new points are received, may be stale. // Updated when new points are received, may be stale.
@@ -44,7 +44,7 @@ public class TripStatistics {
// The total elevation gained (meters). // The total elevation gained (meters).
private double totalElevationGain_m; private double totalElevationGain_m;
public TripStatistics() { public TrackStatistics() {
} }
/** /**
@@ -52,9 +52,9 @@ public class TripStatistics {
* *
* @param other another statistics data object to copy from * @param other another statistics data object to copy from
*/ */
public TripStatistics(TripStatistics other) { public TrackStatistics(TrackStatistics other) {
startTime = other.startTime; startTime_ms = other.startTime_ms;
stopTime = other.stopTime; stopTime_ms = other.stopTime_ms;
totalDistance_m = other.totalDistance_m; totalDistance_m = other.totalDistance_m;
totalTime_ms = other.totalTime_ms; totalTime_ms = other.totalTime_ms;
movingTime_ms = other.movingTime_ms; movingTime_ms = other.movingTime_ms;
@@ -69,9 +69,9 @@ public class TripStatistics {
* *
* @param other another statistics data object * @param other another statistics data object
*/ */
public void merge(TripStatistics other) { public void merge(TrackStatistics other) {
startTime = Math.min(startTime, other.startTime); startTime_ms = Math.min(startTime_ms, other.startTime_ms);
stopTime = Math.max(stopTime, other.stopTime); stopTime_ms = Math.max(stopTime_ms, other.stopTime_ms);
totalDistance_m += other.totalDistance_m; totalDistance_m += other.totalDistance_m;
totalTime_ms += other.totalTime_ms; totalTime_ms += other.totalTime_ms;
movingTime_ms += other.movingTime_ms; movingTime_ms += other.movingTime_ms;
@@ -84,22 +84,22 @@ public class TripStatistics {
} }
/** /**
* Gets the trip start time. The number of milliseconds since epoch. * Gets the track start time. The number of milliseconds since epoch.
*/ */
public long getStartTime() { public long getStartTime_ms() {
return startTime; return startTime_ms;
} }
public void setStartTime(long startTime) { public void setStartTime_ms(long startTime_ms) {
this.startTime = startTime; this.startTime_ms = startTime_ms;
} }
public long getStopTime() { public long getStopTime_ms() {
return stopTime; return stopTime_ms;
} }
public void setStopTime(long stopTime) { public void setStopTime_ms(long stopTime_ms) {
this.stopTime = stopTime; this.stopTime_ms = stopTime_ms;
} }
public double getTotalDistance() { public double getTotalDistance() {
@@ -117,7 +117,7 @@ public class TripStatistics {
/** /**
* Gets the total time in milliseconds that this track has been active. * Gets the total time in milliseconds that this track has been active.
* This statistic is only updated when a new point is added to the statistics, so it may be off. * This statistic is only updated when a new point is added to the statistics, so it may be off.
* If you need to calculate the proper total time, use {@link #getStartTime} with the current time. * If you need to calculate the proper total time, use {@link #getStartTime_ms} with the current time.
*/ */
public long getTotalTime() { public long getTotalTime() {
return totalTime_ms; return totalTime_ms;
@@ -237,7 +237,7 @@ public class TripStatistics {
@NonNull @NonNull
@Override @Override
public String toString() { public String toString() {
return "TripStatistics { Start Time: " + getStartTime() + "; Stop Time: " + getStopTime() return "TrackStatistics { Start Time: " + getStartTime_ms() + "; Stop Time: " + getStopTime_ms()
+ "; Total Distance: " + getTotalDistance() + "; Total Time: " + getTotalTime() + "; Total Distance: " + getTotalDistance() + "; Total Time: " + getTotalTime()
+ "; Moving Time: " + getMovingTime() + "; Max Speed: " + getMaxSpeed() + "; Moving Time: " + getMovingTime() + "; Max Speed: " + getMaxSpeed()
+ "; Min Elevation: " + getMinElevation() + "; Max Elevation: " + getMaxElevation() + "; Min Elevation: " + getMinElevation() + "; Max Elevation: " + getMaxElevation()
@@ -28,14 +28,14 @@ import de.dennisguse.opentracks.util.LocationUtils;
import static de.dennisguse.opentracks.services.TrackRecordingService.MAX_NO_MOVEMENT_SPEED; import static de.dennisguse.opentracks.services.TrackRecordingService.MAX_NO_MOVEMENT_SPEED;
/** /**
* Updater for {@link TripStatistics}. * Updater for {@link TrackStatistics}.
* For updating track trip statistics as new locations are added. * For updating track {@link TrackStatistics} as new {@link TrackPoint}s are added.
* NOTE:Some of the locations represent pause/resume separator. * NOTE: Some of the locations represent pause/resume separator.
* *
* @author Sandor Dornbush * @author Sandor Dornbush
* @author Rodrigo Damazio * @author Rodrigo Damazio
*/ */
public class TripStatisticsUpdater { public class TrackStatisticsUpdater {
/** /**
* The number of elevation readings to smooth to get a somewhat accurate signal. * The number of elevation readings to smooth to get a somewhat accurate signal.
@@ -49,7 +49,7 @@ public class TripStatisticsUpdater {
@VisibleForTesting @VisibleForTesting
private static final int SPEED_SMOOTHING_FACTOR = 25; private static final int SPEED_SMOOTHING_FACTOR = 25;
private static final String TAG = TripStatisticsUpdater.class.getSimpleName(); private static final String TAG = TrackStatisticsUpdater.class.getSimpleName();
/** /**
* Ignore any acceleration faster than this. * Ignore any acceleration faster than this.
* Will ignore any speeds that imply acceleration greater than 2g's * Will ignore any speeds that imply acceleration greater than 2g's
@@ -57,52 +57,52 @@ public class TripStatisticsUpdater {
*/ */
private static final double MAX_ACCELERATION = 0.02; private static final double MAX_ACCELERATION = 0.02;
// The track's trip statistics // The track's statistics
private final TripStatistics tripStatistics; private final TrackStatistics trackStatistics;
// A buffer of the recent elevation readings (m) // A buffer of the recent elevation readings (m)
private final DoubleBuffer elevationBuffer = new DoubleBuffer(ELEVATION_SMOOTHING_FACTOR); private final DoubleBuffer elevationBuffer = new DoubleBuffer(ELEVATION_SMOOTHING_FACTOR);
// A buffer of the recent speed readings (m/s) for calculating max speed // A buffer of the recent speed readings (m/s) for calculating max speed
private final DoubleBuffer speedBuffer = new DoubleBuffer(SPEED_SMOOTHING_FACTOR); private final DoubleBuffer speedBuffer = new DoubleBuffer(SPEED_SMOOTHING_FACTOR);
// The current segment's trip statistics // The current segment's statistics
private TripStatistics currentSegment; private TrackStatistics currentSegment;
// Current segment's last trackPoint // Current segment's last trackPoint
private TrackPoint lastTrackPoint; private TrackPoint lastTrackPoint;
// Current segment's last moving trackPoint // Current segment's last moving trackPoint
private TrackPoint lastMovingTrackPoint; private TrackPoint lastMovingTrackPoint;
/** /**
* Creates a new trip statistics updater. * Creates a new {@link TrackStatisticsUpdater}.
* *
* @param startTime the start time * @param startTime_ms the start time in milliseconds
*/ */
public TripStatisticsUpdater(long startTime) { public TrackStatisticsUpdater(long startTime_ms) {
tripStatistics = init(startTime); trackStatistics = init(startTime_ms);
currentSegment = init(startTime); currentSegment = init(startTime_ms);
} }
/** /**
* Creates a new trip statistics updater with a trip statistics already existed. * Creates a new{@link TrackStatisticsUpdater} with a {@link TrackStatisticsUpdater} already existed.
* *
* @param tripStatistics a trip statistics. * @param trackStatistics a {@link TrackStatisticsUpdater}
*/ */
public TripStatisticsUpdater(TripStatistics tripStatistics) { public TrackStatisticsUpdater(TrackStatistics trackStatistics) {
this.tripStatistics = tripStatistics; this.trackStatistics = trackStatistics;
currentSegment = init(System.currentTimeMillis()); currentSegment = init(System.currentTimeMillis());
} }
public void updateTime(long time) { public void updateTime(long time) {
currentSegment.setStopTime(time); currentSegment.setStopTime_ms(time);
currentSegment.setTotalTime(time - currentSegment.getStartTime()); currentSegment.setTotalTime(time - currentSegment.getStartTime_ms());
} }
/** /**
* Gets the track's trip statistics. * Gets the track's statistics.
*/ */
public TripStatistics getTripStatistics() { public TrackStatistics getTrackStatistics() {
// Take a snapshot - we don't want anyone messing with our tripStatistics // Take a snapshot - we don't want anyone messing with our trackStatistics
TripStatistics stats = new TripStatistics(tripStatistics); TrackStatistics stats = new TrackStatistics(trackStatistics);
stats.merge(currentSegment); stats.merge(currentSegment);
return stats; return stats;
} }
@@ -123,7 +123,7 @@ public class TripStatisticsUpdater {
if (lastTrackPoint != null && lastMovingTrackPoint != null && lastTrackPoint != lastMovingTrackPoint) { if (lastTrackPoint != null && lastMovingTrackPoint != null && lastTrackPoint != lastMovingTrackPoint) {
currentSegment.addTotalDistance(lastMovingTrackPoint.distanceTo(lastTrackPoint)); currentSegment.addTotalDistance(lastMovingTrackPoint.distanceTo(lastTrackPoint));
} }
tripStatistics.merge(currentSegment); trackStatistics.merge(currentSegment);
} }
currentSegment = init(trackPoint.getLocation().getTime()); currentSegment = init(trackPoint.getLocation().getTime());
lastTrackPoint = null; lastTrackPoint = null;
@@ -230,10 +230,10 @@ public class TripStatisticsUpdater {
return difference; return difference;
} }
private TripStatistics init(long time) { private TrackStatistics init(long time) {
TripStatistics stats = new TripStatistics(); TrackStatistics stats = new TrackStatistics();
stats.setStartTime(time); stats.setStartTime_ms(time);
stats.setStopTime(time); stats.setStopTime_ms(time);
return stats; return stats;
} }
@@ -3,17 +3,17 @@ package de.dennisguse.opentracks.util;
import android.content.Context; import android.content.Context;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.stats.TripStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
public class AnnouncementUtils { public class AnnouncementUtils {
private AnnouncementUtils() {} private AnnouncementUtils() {}
public static String getAnnouncement(Context context, TripStatistics tripStatistics) { public static String getAnnouncement(Context context, TrackStatistics trackStatistics) {
boolean metricUnits = PreferencesUtils.isMetricUnits(context); boolean metricUnits = PreferencesUtils.isMetricUnits(context);
boolean reportSpeed = PreferencesUtils.isReportSpeed(context); boolean reportSpeed = PreferencesUtils.isReportSpeed(context);
double distance = tripStatistics.getTotalDistance() * UnitConversions.M_TO_KM; double distance = trackStatistics.getTotalDistance() * UnitConversions.M_TO_KM;
double distancePerTime = tripStatistics.getAverageMovingSpeed() * UnitConversions.MS_TO_KMH; double distancePerTime = trackStatistics.getAverageMovingSpeed() * UnitConversions.MS_TO_KMH;
if (distance == 0) { if (distance == 0) {
return context.getString(R.string.voice_total_distance_zero); return context.getString(R.string.voice_total_distance_zero);
@@ -38,7 +38,7 @@ public class AnnouncementUtils {
int totalDistanceId = metricUnits ? R.plurals.voiceTotalDistanceKilometers : R.plurals.voiceTotalDistanceMiles; int totalDistanceId = metricUnits ? R.plurals.voiceTotalDistanceKilometers : R.plurals.voiceTotalDistanceMiles;
String totalDistance = context.getResources().getQuantityString(totalDistanceId, getQuantityCount(distance), distance); String totalDistance = context.getResources().getQuantityString(totalDistanceId, getQuantityCount(distance), distance);
return context.getString(R.string.voice_template, totalDistance, getAnnounceTime(context, tripStatistics.getMovingTime()), rate); return context.getString(R.string.voice_template, totalDistance, getAnnounceTime(context, trackStatistics.getMovingTime()), rate);
} }
public static String getAnnounceTime(Context context, long time) { public static String getAnnounceTime(Context context, long time) {