ContentProviderUtils.searchMarkers uses MarkerIterator.

This commit is contained in:
Dennis Guse
2025-12-04 17:07:35 +01:00
parent a78e059612
commit 12f0c3313f
4 changed files with 24 additions and 25 deletions
@@ -506,8 +506,7 @@ public class ContentProviderUtils {
return contentResolver.query(MarkerColumns.CONTENT_URI, projection, selection, selectionArgs, sortOrder); return contentResolver.query(MarkerColumns.CONTENT_URI, projection, selection, selectionArgs, sortOrder);
} }
//TODO Use AutoCloseableIterator<Marker> public MarkerIterator searchMarkers(Track.Id trackId, String query) {
public List<Marker> searchMarkers(Track.Id trackId, String query) {
String selection = null; String selection = null;
String[] selectionArgs = null; String[] selectionArgs = null;
String sortOrder = null; String sortOrder = null;
@@ -525,15 +524,7 @@ public class ContentProviderUtils {
sortOrder = MarkerColumns.DEFAULT_SORT_ORDER + " DESC"; sortOrder = MarkerColumns.DEFAULT_SORT_ORDER + " DESC";
} }
ArrayList<Marker> markers = new ArrayList<>(); return new MarkerIterator(this, getMarkerCursor(null, selection, selectionArgs, sortOrder, -1));
try (Cursor cursor = getMarkerCursor(null, selection, selectionArgs, sortOrder, -1)) {
if (cursor.moveToFirst()) {
do {
markers.add(createMarker(cursor));
} while (cursor.moveToNext());
}
}
return markers;
} }
/** /**
@@ -11,13 +11,18 @@ import de.dennisguse.opentracks.data.models.Marker;
import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.util.AutoCloseableIterator; import de.dennisguse.opentracks.util.AutoCloseableIterator;
class MarkerIterator extends AutoCloseableIterator<Marker> { public class MarkerIterator extends AutoCloseableIterator<Marker> {
private static final String TAG = MarkerIterator.class.getSimpleName(); private static final String TAG = MarkerIterator.class.getSimpleName();
private final ContentProviderUtils contentProviderUtils; private final ContentProviderUtils contentProviderUtils;
private Cursor cursor; private Cursor cursor;
MarkerIterator(ContentProviderUtils contentProviderUtils, Cursor cursor) {
this.contentProviderUtils = contentProviderUtils;
this.cursor = cursor;
}
MarkerIterator(ContentProviderUtils contentProviderUtils, Track.Id trackId, int maxCount) { MarkerIterator(ContentProviderUtils contentProviderUtils, Track.Id trackId, int maxCount) {
this.contentProviderUtils = contentProviderUtils; this.contentProviderUtils = contentProviderUtils;
@@ -26,12 +26,12 @@ import androidx.annotation.NonNull;
import androidx.annotation.UiThread; import androidx.annotation.UiThread;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import de.dennisguse.opentracks.AbstractActivity; import de.dennisguse.opentracks.AbstractActivity;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.ContentProviderUtils; 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.Marker;
import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.databinding.MarkerListBinding; 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))); viewBinding.markerListToolbar.setTitle(Objects.requireNonNullElseGet(searchQuery, () -> getString(R.string.menu_markers)));
List<Marker> markers = contentProviderUtils.searchMarkers(trackId, searchQuery); MarkerIterator markers = contentProviderUtils.searchMarkers(trackId, searchQuery);
adapter.swapData(markers); adapter.swapData(markers);
if (markers.isEmpty()) { if (markers.getCount() == 0) {
viewBinding.markerListEmpty.setVisibility(View.VISIBLE); viewBinding.markerListEmpty.setVisibility(View.VISIBLE);
viewBinding.markerList.setVisibility(View.GONE); viewBinding.markerList.setVisibility(View.GONE);
} else { } else {
@@ -28,6 +28,7 @@ import java.util.List;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.ContentProviderUtils; 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.Marker;
import de.dennisguse.opentracks.databinding.MarkerListItemBinding; import de.dennisguse.opentracks.databinding.MarkerListItemBinding;
import de.dennisguse.opentracks.ui.util.ActivityUtils; import de.dennisguse.opentracks.ui.util.ActivityUtils;
@@ -42,7 +43,7 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
private final AppCompatActivity context; private final AppCompatActivity context;
private final RecyclerView recyclerView; private final RecyclerView recyclerView;
private List<Marker> markers; private MarkerIterator markerIterator;
private final SparseBooleanArray selection; private final SparseBooleanArray selection;
private boolean selectionMode; private boolean selectionMode;
private ActivityUtils.ContextualActionModeCallback actionModeCallback; private ActivityUtils.ContextualActionModeCallback actionModeCallback;
@@ -52,10 +53,10 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
private final LruCache<Marker.Id, Bitmap> memoryCache; private final LruCache<Marker.Id, Bitmap> memoryCache;
public MarkerListAdapter(AppCompatActivity context, RecyclerView recyclerView, List<Marker> markers) { public MarkerListAdapter(AppCompatActivity context, RecyclerView recyclerView, MarkerIterator markerIterator) {
this.context = context; this.context = context;
this.recyclerView = recyclerView; this.recyclerView = recyclerView;
this.markers = markers; this.markerIterator = markerIterator;
selection = new SparseBooleanArray(); selection = new SparseBooleanArray();
selectionMode = false; selectionMode = false;
@@ -87,19 +88,19 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
ViewHolder viewHolder = (ViewHolder) holder; ViewHolder viewHolder = (ViewHolder) holder;
viewHolder.bind(markers.get(position)); viewHolder.bind(markerIterator.get(position));
} }
@Override @Override
public int getItemCount() { public int getItemCount() {
if (markers == null) { if (markerIterator == null) {
return 0; return 0;
} }
return markers.size(); return markerIterator.getCount();
} }
public void swapData(List<Marker> markers) { public void swapData(MarkerIterator markers) {
this.markers = markers; this.markerIterator = markers;
this.notifyDataSetChanged(); this.notifyDataSetChanged();
} }
@@ -135,8 +136,10 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
public void setAllSelected(boolean isSelected) { public void setAllSelected(boolean isSelected) {
if (isSelected) { if (isSelected) {
for (Marker marker : markers) { markerIterator.moveToPosition(-1);
selection.put((int) marker.id().id(), true); while (markerIterator.hasNext()) {
selection.put((int) markerIterator.get().id().id(), true);
markerIterator.next();
} }
} else { } else {
selection.clear(); selection.clear();