package de.dennisguse.opentracks.content.data; import android.text.TextUtils; import java.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import de.dennisguse.opentracks.content.provider.ContentProviderUtils; import de.dennisguse.opentracks.content.provider.SelectionData; public class TrackSelection implements ContentProviderUtils.ContentProviderSelectionInterface { private final List trackIds = new ArrayList<>(); private final List categories = new ArrayList<>(); private Instant from; private Instant to; public TrackSelection addDateRange(Instant from, Instant to) { this.from = from; this.to = to; return this; } public TrackSelection addTrackId(Track.Id trackId) { if (!this.trackIds.contains(trackId)) { this.trackIds.add(trackId); } return this; } public TrackSelection addCategory(String category) { if (!this.categories.contains(category)) { this.categories.add(category); } return this; } public boolean isEmpty() { return trackIds.isEmpty() && categories.isEmpty() && from == null && to == null; } @Override public SelectionData buildSelection() { String selection = ""; String[] selectionArgs; ArrayList fromToArgs = new ArrayList<>(); // Builds selection. if (!trackIds.isEmpty()) { selection = String.format(TracksColumns._ID + " IN (%s)", TextUtils.join(",", Collections.nCopies(trackIds.size(), "?"))); } if (!categories.isEmpty()) { selection += selection.isEmpty() ? "" : " AND "; selection += String.format(TracksColumns.CATEGORY + " IN (%s)", TextUtils.join(",", Collections.nCopies(categories.size(), "?"))); } if (from != null && to != null) { selection += selection.isEmpty() ? "" : " AND "; selection += TracksColumns.STARTTIME + " BETWEEN ? AND ?"; fromToArgs.add(Long.toString(from.toEpochMilli())); fromToArgs.add(Long.toString(to.toEpochMilli())); } if (selection.isEmpty()) { return new SelectionData(); } // Builds selection arguments. ArrayList args = trackIds.stream().map(id -> Long.toString(id.getId())).collect(Collectors.toCollection(ArrayList::new)); args.addAll(categories); args.addAll(fromToArgs); selectionArgs = args.stream().toArray(String[]::new); return new SelectionData(selection, selectionArgs); } }