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 870978911..04685d957 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java +++ b/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java @@ -11,7 +11,6 @@ import java.util.ArrayList; import java.util.List; import de.dennisguse.opentracks.data.ContentProviderUtils; -import de.dennisguse.opentracks.data.TrackPointIterator; import de.dennisguse.opentracks.data.models.Altitude; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Marker; @@ -20,6 +19,7 @@ import de.dennisguse.opentracks.data.models.Speed; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.ui.markers.MarkerUtils; +import de.dennisguse.opentracks.util.AutoCloseableIterator; import de.dennisguse.opentracks.util.FileUtils; public class TestDataUtil { @@ -150,7 +150,7 @@ public class TestDataUtil { } public static List getTrackPoints(ContentProviderUtils contentProviderUtils, Track.Id trackId) { - try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { + try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { ArrayList trackPoints = new ArrayList<>(); while (trackPointIterator.hasNext()) { trackPoints.add(trackPointIterator.next()); diff --git a/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java index 93ec4e9a4..c0948bcab 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java @@ -65,6 +65,7 @@ import de.dennisguse.opentracks.data.tables.MarkerColumns; import de.dennisguse.opentracks.data.tables.TrackPointsColumns; import de.dennisguse.opentracks.data.tables.TracksColumns; import de.dennisguse.opentracks.stats.SensorStatistics; +import de.dennisguse.opentracks.util.AutoCloseableIterator; import de.dennisguse.opentracks.util.FileUtils; /** @@ -116,7 +117,7 @@ public class CustomContentProviderUtilsTest { private void testIterator(Track.Id trackId, int numPoints) { TrackPoint.Id lastPointId = initializeTrack(trackId, numPoints); List locations = new ArrayList<>(numPoints); - try (TrackPointIterator it = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { + try (AutoCloseableIterator it = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { while (it.hasNext()) { TrackPoint trackPoint = it.next(); assertNotNull(trackPoint); @@ -154,7 +155,7 @@ public class CustomContentProviderUtilsTest { // Load all inserted trackPoints. TrackPoint.Id lastPointId = null; int counter = 0; - try (TrackPointIterator it = contentProviderUtils.getTrackPointLocationIterator(id, null)) { + try (AutoCloseableIterator it = contentProviderUtils.getTrackPointLocationIterator(id, null)) { while (it.hasNext()) { TrackPoint trackPoint = it.next(); lastPointId = trackPoint.getId(); @@ -857,7 +858,7 @@ public class CustomContentProviderUtilsTest { TrackPoint.Id startTrackPointId = trackpointIds.get(0); // when - TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, trackpointIds.get(0)); + AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, trackpointIds.get(0)); // then for (int i = 0; i < trackpointIds.size(); i++) { diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtilsTest.java index fca43146e..de42c5e38 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtilsTest.java @@ -25,7 +25,6 @@ import java.util.Map; import de.dennisguse.opentracks.LocaleRule; import de.dennisguse.opentracks.content.data.TestDataUtil; import de.dennisguse.opentracks.data.ContentProviderUtils; -import de.dennisguse.opentracks.data.TrackPointIterator; import de.dennisguse.opentracks.data.models.AltitudeGainLoss; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.HeartRate; @@ -40,6 +39,7 @@ import de.dennisguse.opentracks.stats.SegmentStatisticUpdater; import de.dennisguse.opentracks.stats.SensorStatistics; import de.dennisguse.opentracks.stats.TrackStatisticsUpdater; import de.dennisguse.opentracks.ui.intervals.IntervalStatisticsUpdater; +import de.dennisguse.opentracks.util.AutoCloseableIterator; @RunWith(AndroidJUnit4.class) public class VoiceAnnouncementUtilsTest { @@ -180,8 +180,7 @@ public class VoiceAnnouncementUtilsTest { Track.Id trackId = trackWithStats.first; SegmentStatisticUpdater stats = trackWithStats.second; IntervalStatisticsUpdater.Interval lastInterval; - try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { - assertEquals(numberOfPoints, trackPointIterator.getCount()); + try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { IntervalStatisticsUpdater intervalStatistics = new IntervalStatisticsUpdater(Distance.of(1000)); intervalStatistics.addTrackPoints(trackPointIterator); lastInterval = intervalStatistics.getIntervalList().get(intervalStatistics.getIntervalList().size() - 1); @@ -233,8 +232,7 @@ public class VoiceAnnouncementUtilsTest { Track.Id trackId = trackWithStats.first; SegmentStatisticUpdater stats = trackWithStats.second; IntervalStatisticsUpdater.Interval lastInterval; - try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { - assertEquals(numberOfPoints, trackPointIterator.getCount()); + try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { IntervalStatisticsUpdater intervalStatistics = new IntervalStatisticsUpdater(Distance.of(1000)); intervalStatistics.addTrackPoints(trackPointIterator); lastInterval = intervalStatistics.getIntervalList().get(intervalStatistics.getIntervalList().size() - 1); @@ -364,8 +362,7 @@ public class VoiceAnnouncementUtilsTest { Track.Id trackId = trackWithStats.first; SegmentStatisticUpdater stats = trackWithStats.second; IntervalStatisticsUpdater.Interval lastInterval; - try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { - assertEquals(numberOfPoints, trackPointIterator.getCount()); + try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { IntervalStatisticsUpdater intervalStatistics = new IntervalStatisticsUpdater(Distance.of(1000)); intervalStatistics.addTrackPoints(trackPointIterator); lastInterval = intervalStatistics.getIntervalList().get(intervalStatistics.getIntervalList().size() - 1); @@ -417,8 +414,7 @@ public class VoiceAnnouncementUtilsTest { Track.Id trackId = trackWithStats.first; SegmentStatisticUpdater stats = trackWithStats.second; IntervalStatisticsUpdater.Interval lastInterval; - try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { - assertEquals(numberOfPoints, trackPointIterator.getCount()); + try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { IntervalStatisticsUpdater intervalStatistics = new IntervalStatisticsUpdater(Distance.of(1000)); intervalStatistics.addTrackPoints(trackPointIterator); lastInterval = intervalStatistics.getIntervalList().get(intervalStatistics.getIntervalList().size() - 1); @@ -446,8 +442,7 @@ public class VoiceAnnouncementUtilsTest { Track.Id trackId = trackWithStats.first; SegmentStatisticUpdater stats = trackWithStats.second; IntervalStatisticsUpdater.Interval lastInterval; - try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { - assertEquals(numberOfPoints, trackPointIterator.getCount()); + try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { IntervalStatisticsUpdater intervalStatistics = new IntervalStatisticsUpdater(Distance.of(1000)); intervalStatistics.addTrackPoints(trackPointIterator); lastInterval = intervalStatistics.getIntervalList().get(intervalStatistics.getIntervalList().size() - 1); @@ -483,8 +478,7 @@ public class VoiceAnnouncementUtilsTest { Track.Id trackId = trackWithStats.first; SegmentStatisticUpdater stats = trackWithStats.second; IntervalStatisticsUpdater.Interval lastInterval; - try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { - assertEquals(numberOfPoints, trackPointIterator.getCount()); + try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, null)) { IntervalStatisticsUpdater intervalStatistics = new IntervalStatisticsUpdater(Distance.of(1000)); intervalStatistics.addTrackPoints(trackPointIterator); lastInterval = intervalStatistics.getIntervalList().get(intervalStatistics.getIntervalList().size() - 1); diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index c7d790ef7..5d0fc424b 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -58,6 +58,7 @@ import de.dennisguse.opentracks.data.tables.TrackPointsColumns; import de.dennisguse.opentracks.data.tables.TracksColumns; import de.dennisguse.opentracks.stats.SensorStatistics; import de.dennisguse.opentracks.ui.markers.MarkerUtils; +import de.dennisguse.opentracks.util.AutoCloseableIterator; import de.dennisguse.opentracks.util.FileUtils; /** @@ -831,7 +832,7 @@ public class ContentProviderUtils { * @param trackId the track id * @param startTrackPointId the starting trackPoint id. `null` to ignore */ - public TrackPointIterator getTrackPointLocationIterator(final Track.Id trackId, final TrackPoint.Id startTrackPointId) { + public AutoCloseableIterator getTrackPointLocationIterator(final Track.Id trackId, final TrackPoint.Id startTrackPointId) { return new TrackPointIterator(this, trackId, startTrackPointId); } diff --git a/src/main/java/de/dennisguse/opentracks/data/TrackDataHub.java b/src/main/java/de/dennisguse/opentracks/data/TrackDataHub.java index b5d9c867e..db169f62b 100644 --- a/src/main/java/de/dennisguse/opentracks/data/TrackDataHub.java +++ b/src/main/java/de/dennisguse/opentracks/data/TrackDataHub.java @@ -42,6 +42,7 @@ import de.dennisguse.opentracks.services.RecordingStatus; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.handlers.AltitudeCorrectionManager; import de.dennisguse.opentracks.stats.TrackStatisticsUpdater; +import de.dennisguse.opentracks.util.AutoCloseableIterator; /** * Track data hub. @@ -330,7 +331,7 @@ public class TrackDataHub { } TrackPoint trackPoint = null; - try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(selectedTrackId, next)) { + try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(selectedTrackId, next)) { while (trackPointIterator.hasNext()) { //Prevents a NPE if stop() is happening while notifyTrackPointsTableUpdate() diff --git a/src/main/java/de/dennisguse/opentracks/data/TrackPointIterator.java b/src/main/java/de/dennisguse/opentracks/data/TrackPointIterator.java index ecd5da7cb..b7f648bd4 100644 --- a/src/main/java/de/dennisguse/opentracks/data/TrackPointIterator.java +++ b/src/main/java/de/dennisguse/opentracks/data/TrackPointIterator.java @@ -5,16 +5,16 @@ import android.database.Cursor; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; -import java.util.Iterator; import java.util.NoSuchElementException; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; +import de.dennisguse.opentracks.util.AutoCloseableIterator; /** * A lightweight wrapper around the original {@link Cursor}. */ -public class TrackPointIterator implements Iterator, AutoCloseable { +class TrackPointIterator extends AutoCloseableIterator { private static final String TAG = TrackPointIterator.class.getSimpleName(); @@ -23,7 +23,7 @@ public class TrackPointIterator implements Iterator, AutoCloseable { private final CachedTrackPointsIndexes indexes; private Cursor cursor; - public TrackPointIterator(ContentProviderUtils contentProviderUtils, Track.Id trackId, TrackPoint.Id startTrackPointId) { + TrackPointIterator(ContentProviderUtils contentProviderUtils, Track.Id trackId, TrackPoint.Id startTrackPointId) { this.contentProviderUtils = contentProviderUtils; this.trackId = trackId; diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/CSVTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/CSVTrackExporter.java index 8f086c51a..ab5da9ac9 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/CSVTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/CSVTrackExporter.java @@ -28,10 +28,10 @@ import java.util.Locale; import java.util.function.Function; import de.dennisguse.opentracks.data.ContentProviderUtils; -import de.dennisguse.opentracks.data.TrackPointIterator; import de.dennisguse.opentracks.data.models.Marker; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; +import de.dennisguse.opentracks.util.AutoCloseableIterator; import de.dennisguse.opentracks.util.StringUtils; /** @@ -131,7 +131,7 @@ public class CSVTrackExporter implements TrackExporter { } private void writeTrackPoints(List columns, Track track) throws InterruptedException { - try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), null)) { + try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), null)) { while (trackPointIterator.hasNext()) { if (Thread.interrupted()) throw new InterruptedException(); diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java index 9df2a08a0..71e2c0eac 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java @@ -33,13 +33,13 @@ import java.util.function.Function; import java.util.stream.Stream; import de.dennisguse.opentracks.data.ContentProviderUtils; -import de.dennisguse.opentracks.data.TrackPointIterator; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Marker; import de.dennisguse.opentracks.data.models.Position; import de.dennisguse.opentracks.data.models.Statistics; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; +import de.dennisguse.opentracks.util.AutoCloseableIterator; import de.dennisguse.opentracks.util.StringUtils; /** @@ -128,7 +128,7 @@ public class GPXTrackExporter implements TrackExporter { LinkedList sensorPoints = new LinkedList<>(); - try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), null)) { + try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), null)) { while (trackPointIterator.hasNext()) { if (Thread.interrupted()) throw new InterruptedException(); diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java index 445b4bb18..cb71f304c 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java @@ -36,13 +36,13 @@ import java.util.Objects; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.ContentProviderUtils; -import de.dennisguse.opentracks.data.TrackPointIterator; import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Marker; import de.dennisguse.opentracks.data.models.Position; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.ui.markers.MarkerUtils; +import de.dennisguse.opentracks.util.AutoCloseableIterator; import de.dennisguse.opentracks.util.StringUtils; /** @@ -162,7 +162,7 @@ public class KMLTrackExporter implements TrackExporter { boolean wroteTrack = false; boolean wroteSegment = false; - try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), null)) { + try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), null)) { while (trackPointIterator.hasNext()) { if (Thread.interrupted()) throw new InterruptedException(); diff --git a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManager.java b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManager.java index 99bd7e64b..0787134b5 100644 --- a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManager.java @@ -30,7 +30,6 @@ import java.util.List; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.ContentProviderUtils; -import de.dennisguse.opentracks.data.TrackPointIterator; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Statistics; import de.dennisguse.opentracks.data.models.Track; @@ -39,6 +38,7 @@ import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet; import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.stats.SensorStatistics; import de.dennisguse.opentracks.ui.intervals.IntervalStatisticsUpdater; +import de.dennisguse.opentracks.util.AutoCloseableIterator; /** * Execute a periodic task on a time or distance schedule. @@ -149,7 +149,8 @@ public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPrefe startTrackPointId = null; } - TrackPointIterator trackPointIterator = new TrackPointIterator(contentProviderUtils, track.getId(), startTrackPointId); + //TODO wrap in try {} + AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), startTrackPointId); startTrackPointId = intervalStatistics.addTrackPoints(trackPointIterator); IntervalStatisticsUpdater.Interval lastInterval = intervalStatistics.getLastInterval(); SensorStatistics sensorStatistics = null; diff --git a/src/main/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsModel.java b/src/main/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsModel.java index 5c1d32395..a0b8399c7 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsModel.java +++ b/src/main/java/de/dennisguse/opentracks/ui/intervals/IntervalStatisticsModel.java @@ -17,12 +17,12 @@ import java.util.concurrent.Executor; import java.util.concurrent.Executors; import de.dennisguse.opentracks.data.ContentProviderUtils; -import de.dennisguse.opentracks.data.TrackPointIterator; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.data.tables.TrackPointsColumns; import de.dennisguse.opentracks.settings.UnitSystem; +import de.dennisguse.opentracks.util.AutoCloseableIterator; /** * This model is used to load intervals for a track. @@ -92,7 +92,7 @@ public class IntervalStatisticsModel extends AndroidViewModel { private void loadIntervalStatistics(Track.Id trackId) { executor.execute(() -> { ContentProviderUtils contentProviderUtils = new ContentProviderUtils(getApplication()); - try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, lastTrackPointId)) { + try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(trackId, lastTrackPointId)) { lastTrackPointId = intervalStatistics.addTrackPoints(trackPointIterator); intervalsLiveData.postValue(intervalStatistics.getIntervalList()); } diff --git a/src/main/java/de/dennisguse/opentracks/util/AutoCloseableIterator.java b/src/main/java/de/dennisguse/opentracks/util/AutoCloseableIterator.java new file mode 100644 index 000000000..ab145f9f5 --- /dev/null +++ b/src/main/java/de/dennisguse/opentracks/util/AutoCloseableIterator.java @@ -0,0 +1,11 @@ +package de.dennisguse.opentracks.util; + +import java.util.Iterator; + +public abstract class AutoCloseableIterator implements Iterator, AutoCloseable { + + /** + * Override: AutoClosable.close() throws Exception. + */ + public abstract void close(); +}