From 12d1a50995c9b7434f7062778155c8fef16264cb Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Thu, 27 Nov 2025 20:34:51 +0100 Subject: [PATCH] Track is now a record. Create Track directly. --- .../opentracks/content/data/TestDataUtil.java | 17 +++-- .../data/CustomContentProviderUtilsTest.java | 17 ++++- .../IntervalStatisticsUpdaterTest.java | 44 ++++++++--- .../opentracks/TrackEditActivity.java | 10 +-- .../opentracks/data/ContentProviderUtils.java | 3 +- .../opentracks/data/models/TrackBuilder.java | 75 +------------------ 6 files changed, 65 insertions(+), 101 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java b/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java index b1a74b2fe..1f4149c7e 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java +++ b/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java @@ -7,10 +7,13 @@ import android.util.Pair; import java.io.File; import java.io.IOException; import java.time.Instant; +import java.time.ZoneOffset; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import de.dennisguse.opentracks.data.ContentProviderUtils; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Altitude; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Marker; @@ -36,11 +39,15 @@ public class TestDataUtil { * Create a track without any trackPoints. */ public static Track createTrack(Track.Id trackId) { - TrackBuilder track = new TrackBuilder(Statistics.DEFAULT); - track.setId(trackId); - track.setName("Test: " + trackId.id()); - - return track.getTrack(); + return new Track( + trackId, + UUID.randomUUID(), + "Test: " + trackId.id(), + "", + "", + ActivityType.UNKNOWN, + ZoneOffset.UTC, + Statistics.DEFAULT); } /** diff --git a/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java index 9de0e3b95..1b888c18f 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java @@ -42,6 +42,7 @@ import java.io.File; import java.io.IOException; import java.time.Duration; import java.time.Instant; +import java.time.ZoneOffset; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; @@ -50,6 +51,7 @@ import java.util.UUID; import de.dennisguse.opentracks.content.data.TestDataUtil; import de.dennisguse.opentracks.content.data.TestSensorDataUtil; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Altitude; import de.dennisguse.opentracks.data.models.AltitudeExtremities; import de.dennisguse.opentracks.data.models.AltitudeGainLoss; @@ -130,10 +132,17 @@ public class CustomContentProviderUtilsTest { } private TrackPoint.Id initializeTrack(Track.Id id, int numPoints) { - TrackBuilder trackbuilder = new TrackBuilder(Statistics.DEFAULT); - trackbuilder.setId(id); - trackbuilder.setName("Test: " + id.id()); - contentProviderUtils.insertTrack(trackbuilder.getTrack()); + Track createdTrack = new Track( + id, + UUID.randomUUID(), + "Test: " + id, + "", + "", + ActivityType.UNKNOWN, + ZoneOffset.UTC, + Statistics.DEFAULT); + + contentProviderUtils.insertTrack(createdTrack); Track track = contentProviderUtils.getTrack(id); assertNotNull(track); diff --git a/src/androidTest/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsUpdaterTest.java b/src/androidTest/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsUpdaterTest.java index ec0c8cb3f..84bbbff31 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsUpdaterTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsUpdaterTest.java @@ -9,10 +9,12 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import java.time.ZoneOffset; import java.util.ArrayList; import java.util.List; import de.dennisguse.opentracks.content.data.TestDataUtil; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Statistics; import de.dennisguse.opentracks.data.models.Track; @@ -103,26 +105,34 @@ public class IntervalStatisticsUpdaterTest { ArrayList trackPoints = new ArrayList<>(); for (int i = 0; i < numberOfPoints; i++) { - trackPoints.add(TestDataUtil.createTrackPoint(i).setAltitudeGainLoss(null)); + trackPoints.add(TestDataUtil.createTrackPoint(i) + .setAltitudeGainLoss(null)); } TrackStatisticsUpdater trackStatisticsUpdater = new TrackStatisticsUpdater(trackPoints); - TrackBuilder dummyTrack = new TrackBuilder(trackStatisticsUpdater.getTrackStatistics()); - dummyTrack.setId(new Track.Id(System.currentTimeMillis())); - dummyTrack.setName("Dummy Track Without Elevation Loss"); + Track dummyTrack = new Track( + new Track.Id(System.currentTimeMillis()), + null, + "Dummy Track Without Elevation Loss", + null, + "", + null, + ZoneOffset.UTC, + trackStatisticsUpdater.getTrackStatistics() + ); - Pair> trackWithStats = new Pair<>(dummyTrack, trackPoints); + Pair> trackWithStats = new Pair<>(dummyTrack, trackPoints); // when and then whenAndThen(trackWithStats.first, trackWithStats.second, numberOfPoints, distanceInterval); } private void whenAndThen(int numberOfPoints, float distanceInterval) { - Pair> trackWithStats = buildTrackWithTrackPoints(numberOfPoints); + Pair> trackWithStats = buildTrackWithTrackPoints(numberOfPoints); whenAndThen(trackWithStats.first, trackWithStats.second, numberOfPoints, distanceInterval); } - private void whenAndThen(TrackBuilder track, List trackPoints, int numberOfPoints, float distanceInterval) { + private void whenAndThen(Track track, List trackPoints, int numberOfPoints, float distanceInterval) { IntervalStatisticsUpdater intervalStatistics = new IntervalStatisticsUpdater(Distance.of(distanceInterval)); intervalStatistics.addTrackPoints(trackPoints.iterator()); @@ -150,9 +160,9 @@ public class IntervalStatisticsUpdaterTest { } // then - assertEquals(track.getStatistics().totalDuration().toSeconds(), totalTime, 0.01); - assertEquals(track.getStatistics().totalDistance().toM(), totalDistance.toM(), 0.01); - assertEquals(intervalList.size(), (int) Math.ceil(track.getStatistics().totalDistance().toM() / distanceInterval)); + assertEquals(track.statistics().totalDuration().toSeconds(), totalTime, 0.01); + assertEquals(track.statistics().totalDistance().toM(), totalDistance.toM(), 0.01); + assertEquals(intervalList.size(), (int) Math.ceil(track.statistics().totalDistance().toM() / distanceInterval)); if (totalGain != null && totalLoss != null) { assertEquals(totalGain, numberOfPoints * TestDataUtil.ALTITUDE_GAIN, 0.1); assertEquals(totalLoss, numberOfPoints * TestDataUtil.ALTITUDE_LOSS, 0.1); @@ -168,13 +178,23 @@ public class IntervalStatisticsUpdaterTest { assertEquals(intervalList.get(intervalList.size() - 1).totalDistance().toM(), totalDistance.toM(), 0.01); } - private static Pair> buildTrackWithTrackPoints(int numberOfPoints) { + private static Pair> buildTrackWithTrackPoints(int numberOfPoints) { ArrayList trackPoints = new ArrayList<>(); for (int i = 0; i < numberOfPoints; i++) { trackPoints.add(TestDataUtil.createTrackPoint(i)); } TrackStatisticsUpdater trackStatisticsUpdater = new TrackStatisticsUpdater(trackPoints); - return new Pair<>(new TrackBuilder(trackStatisticsUpdater.getTrackStatistics()), trackPoints); + Track track = new Track( + null, + null, + "", + "", + "", + ActivityType.UNKNOWN, + ZoneOffset.UTC, + trackStatisticsUpdater.getTrackStatistics()); + + return new Pair<>(track, trackPoints); } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java b/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java index d39640a83..1b5547a94 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java @@ -72,9 +72,9 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit } trackBuilder = new TrackBuilder(track); - viewBinding.trackEditName.setText(trackBuilder.getName()); + viewBinding.trackEditName.setText(track.name()); - viewBinding.trackEditActivityTypeLocalized.setText(trackBuilder.getActivityTypeLocalized()); + viewBinding.trackEditActivityTypeLocalized.setText(track.activityTypeLocalized()); ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this)); viewBinding.trackEditActivityTypeLocalized.setAdapter(adapter); viewBinding.trackEditActivityTypeLocalized.setOnItemClickListener((parent, view, position, id) -> { @@ -93,15 +93,15 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit activityType = (ActivityType) bundle.getSerializable(ICON_VALUE_KEY); } if (activityType == null) { - activityType = trackBuilder.getActivityType(); + activityType = track.activityType(); } setActivityTypeIcon(activityType); viewBinding.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), this, viewBinding.trackEditActivityTypeLocalized.getText().toString())); - viewBinding.trackEditDescription.setText(trackBuilder.getDescription()); + viewBinding.trackEditDescription.setText(track.description()); final ArrayAdapter zoneOffsetAdapter = new ZoneOffsetAdapter(this, android.R.layout.simple_dropdown_item_1line); - viewBinding.trackEditTimeOffset.setText(trackBuilder.getZoneOffset().toString()); + viewBinding.trackEditTimeOffset.setText(track.zoneOffset().toString()); viewBinding.trackEditTimeOffset.setAdapter(zoneOffsetAdapter); viewBinding.trackEditTimeOffset.setOnItemClickListener((parent, view, position, id) -> trackBuilder.setZoneOffset(zoneOffsetAdapter.getItem(position))); diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index dbbaabbdc..fef498ad9 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -128,7 +128,7 @@ public class ContentProviderUtils { null, null ); - + return new Track( new Track.Id(cursor.getLong(idIndex)), UUIDUtils.fromBytes(cursor.getBlob(uuidIndex)), @@ -251,6 +251,7 @@ public class ContentProviderUtils { * @return the content provider URI of the inserted track. */ public Track.Id insertTrack(Track track) { + //TODO Unset trackId Uri uri = contentResolver.insert(TracksColumns.CONTENT_URI, createContentValues(track)); return new Track.Id(ContentUris.parseId(uri)); } diff --git a/src/main/java/de/dennisguse/opentracks/data/models/TrackBuilder.java b/src/main/java/de/dennisguse/opentracks/data/models/TrackBuilder.java index 046a0b525..5dcc9644b 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/TrackBuilder.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/TrackBuilder.java @@ -50,13 +50,6 @@ public class TrackBuilder { @NonNull private Statistics trackStatistics; - @Deprecated - @VisibleForTesting - public TrackBuilder(@NonNull Statistics trackStatistics) { - this.zoneOffset = ZoneOffset.UTC; - this.trackStatistics = trackStatistics; - } - public TrackBuilder(Track track) { this.id = track.id(); this.uuid = track.uuid(); @@ -68,60 +61,23 @@ public class TrackBuilder { this.trackStatistics = track.statistics(); } - /** - * May be null if the track was not loaded from the database. - */ - @Nullable - @Deprecated - public Track.Id getId() { - return id; - } - + @VisibleForTesting public void setId(Track.Id id) { this.id = id; } - @Deprecated - public UUID getUuid() { - return uuid; - } - - public void setUuid(UUID uuid) { - this.uuid = uuid; - } - - @Deprecated - public String getName() { - return name; - } - public void setName(String name) { this.name = name; } - @Deprecated - public String getDescription() { - return description; - } - public void setDescription(String description) { this.description = description; } - @Deprecated - public String getActivityTypeLocalized() { - return activityTypeLocalized; - } - public void setActivityTypeLocalized(String activityTypeLocalized) { this.activityTypeLocalized = activityTypeLocalized; } - @Deprecated - public ActivityType getActivityType() { - return activityType; - } - public void setActivityType(ActivityType activityType) { this.activityType = activityType; } @@ -131,27 +87,10 @@ public class TrackBuilder { setActivityType(ActivityType.findByLocalizedString(context, activityTypeLocalized)); } - @Deprecated - public ZoneOffset getZoneOffset() { - return zoneOffset; - } - public void setZoneOffset(@NonNull ZoneOffset zoneOffset) { this.zoneOffset = zoneOffset; } - @Deprecated - public OffsetDateTime getStartTime() { - return trackStatistics - .startTime().atOffset(zoneOffset); - } - - @Deprecated - public OffsetDateTime getStopTime() { - return trackStatistics - .stopTime().atOffset(zoneOffset); - } - @Deprecated public Statistics getStatistics() { return trackStatistics; @@ -173,16 +112,4 @@ public class TrackBuilder { trackStatistics ); } - - @NonNull - @Override - public String toString() { - return "Track{" + - "name='" + name + '\'' + - ", description='" + description + '\'' + - ", activityTypeLocalized='" + activityTypeLocalized + '\'' + - ", activityType=" + activityType + - '}'; - } - }