diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index 049430552..31a849e6a 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -506,8 +506,7 @@ public class ContentProviderUtils { return contentResolver.query(MarkerColumns.CONTENT_URI, projection, selection, selectionArgs, sortOrder); } - //TODO Use AutoCloseableIterator - public List searchMarkers(Track.Id trackId, String query) { + public MarkerIterator searchMarkers(Track.Id trackId, String query) { String selection = null; String[] selectionArgs = null; String sortOrder = null; @@ -525,15 +524,7 @@ public class ContentProviderUtils { sortOrder = MarkerColumns.DEFAULT_SORT_ORDER + " DESC"; } - ArrayList markers = new ArrayList<>(); - try (Cursor cursor = getMarkerCursor(null, selection, selectionArgs, sortOrder, -1)) { - if (cursor.moveToFirst()) { - do { - markers.add(createMarker(cursor)); - } while (cursor.moveToNext()); - } - } - return markers; + return new MarkerIterator(this, getMarkerCursor(null, selection, selectionArgs, sortOrder, -1)); } /** diff --git a/src/main/java/de/dennisguse/opentracks/data/MarkerIterator.java b/src/main/java/de/dennisguse/opentracks/data/MarkerIterator.java index da2f68ca8..7b5cce296 100644 --- a/src/main/java/de/dennisguse/opentracks/data/MarkerIterator.java +++ b/src/main/java/de/dennisguse/opentracks/data/MarkerIterator.java @@ -11,13 +11,18 @@ import de.dennisguse.opentracks.data.models.Marker; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.util.AutoCloseableIterator; -class MarkerIterator extends AutoCloseableIterator { +public class MarkerIterator extends AutoCloseableIterator { private static final String TAG = MarkerIterator.class.getSimpleName(); private final ContentProviderUtils contentProviderUtils; private Cursor cursor; + MarkerIterator(ContentProviderUtils contentProviderUtils, Cursor cursor) { + this.contentProviderUtils = contentProviderUtils; + this.cursor = cursor; + } + MarkerIterator(ContentProviderUtils contentProviderUtils, Track.Id trackId, int maxCount) { this.contentProviderUtils = contentProviderUtils; diff --git a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListActivity.java b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListActivity.java index 7f5cee204..3d9a5bfd1 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListActivity.java @@ -26,12 +26,12 @@ import androidx.annotation.NonNull; import androidx.annotation.UiThread; import androidx.recyclerview.widget.LinearLayoutManager; -import java.util.List; import java.util.Objects; import de.dennisguse.opentracks.AbstractActivity; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.ContentProviderUtils; +import de.dennisguse.opentracks.data.MarkerIterator; import de.dennisguse.opentracks.data.models.Marker; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.databinding.MarkerListBinding; @@ -243,11 +243,11 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker viewBinding.markerListToolbar.setTitle(Objects.requireNonNullElseGet(searchQuery, () -> getString(R.string.menu_markers))); - List markers = contentProviderUtils.searchMarkers(trackId, searchQuery); + MarkerIterator markers = contentProviderUtils.searchMarkers(trackId, searchQuery); adapter.swapData(markers); - if (markers.isEmpty()) { + if (markers.getCount() == 0) { viewBinding.markerListEmpty.setVisibility(View.VISIBLE); viewBinding.markerList.setVisibility(View.GONE); } else { diff --git a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListAdapter.java b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListAdapter.java index d31960037..9fc1b658e 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListAdapter.java +++ b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListAdapter.java @@ -28,6 +28,7 @@ import java.util.List; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.ContentProviderUtils; +import de.dennisguse.opentracks.data.MarkerIterator; import de.dennisguse.opentracks.data.models.Marker; import de.dennisguse.opentracks.databinding.MarkerListItemBinding; import de.dennisguse.opentracks.ui.util.ActivityUtils; @@ -42,7 +43,7 @@ public class MarkerListAdapter extends RecyclerView.Adapter markers; + private MarkerIterator markerIterator; private final SparseBooleanArray selection; private boolean selectionMode; private ActivityUtils.ContextualActionModeCallback actionModeCallback; @@ -52,10 +53,10 @@ public class MarkerListAdapter extends RecyclerView.Adapter memoryCache; - public MarkerListAdapter(AppCompatActivity context, RecyclerView recyclerView, List markers) { + public MarkerListAdapter(AppCompatActivity context, RecyclerView recyclerView, MarkerIterator markerIterator) { this.context = context; this.recyclerView = recyclerView; - this.markers = markers; + this.markerIterator = markerIterator; selection = new SparseBooleanArray(); selectionMode = false; @@ -87,19 +88,19 @@ public class MarkerListAdapter extends RecyclerView.Adapter markers) { - this.markers = markers; + public void swapData(MarkerIterator markers) { + this.markerIterator = markers; this.notifyDataSetChanged(); } @@ -135,8 +136,10 @@ public class MarkerListAdapter extends RecyclerView.Adapter