From 19382f19c4017476291cd85f05f82cbcf508b396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rom=C3=A1n=20Mart=C3=ADnez?= Date: Sat, 4 Dec 2021 16:31:44 +0100 Subject: [PATCH] Aggregated stats for only selected tracks. --- .../AggregatedStatisticsActivity.java | 9 ++++++++- .../opentracks/TrackListActivity.java | 11 ++++++++++ .../provider/ContentProviderUtils.java | 20 +++++++++++++++++++ .../viewmodels/AggregatedStatisticsModel.java | 9 +++++---- src/main/res/menu/list_context_menu.xml | 5 +++++ 5 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/AggregatedStatisticsActivity.java b/src/main/java/de/dennisguse/opentracks/AggregatedStatisticsActivity.java index 59a712871..da44589ca 100644 --- a/src/main/java/de/dennisguse/opentracks/AggregatedStatisticsActivity.java +++ b/src/main/java/de/dennisguse/opentracks/AggregatedStatisticsActivity.java @@ -5,12 +5,17 @@ import android.view.View; import androidx.lifecycle.ViewModelProvider; +import java.util.List; + import de.dennisguse.opentracks.adapters.AggregatedStatisticsAdapter; +import de.dennisguse.opentracks.content.data.Track; import de.dennisguse.opentracks.databinding.AggregatedStatsBinding; import de.dennisguse.opentracks.viewmodels.AggregatedStatisticsModel; public class AggregatedStatisticsActivity extends AbstractActivity { + public static final String EXTRA_TRACK_IDS = "track_ids"; + private AggregatedStatsBinding viewBinding; private AggregatedStatisticsAdapter adapter; @@ -21,8 +26,10 @@ public class AggregatedStatisticsActivity extends AbstractActivity { viewBinding.aggregatedStatsList.setEmptyView(viewBinding.aggregatedStatsEmptyView); + List trackIds = getIntent().getParcelableArrayListExtra(EXTRA_TRACK_IDS); + final AggregatedStatisticsModel viewModel = new ViewModelProvider(this).get(AggregatedStatisticsModel.class); - viewModel.getAggregatedStats().observe(this, aggregatedStatistics -> { + viewModel.getAggregatedStats(trackIds).observe(this, aggregatedStatistics -> { if (aggregatedStatistics != null) { adapter = new AggregatedStatisticsAdapter(this, aggregatedStatistics); viewBinding.aggregatedStatsList.setAdapter(adapter); diff --git a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java index 96ec2a480..7ded44a45 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java @@ -49,6 +49,10 @@ import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import java.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; import de.dennisguse.opentracks.content.data.Distance; import de.dennisguse.opentracks.content.data.Track; @@ -470,6 +474,13 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co return true; } + if (itemId == R.id.list_context_menu_aggregated_stats) { + Intent intent = IntentUtils.newIntent(this, AggregatedStatisticsActivity.class) + .putParcelableArrayListExtra(AggregatedStatisticsActivity.EXTRA_TRACK_IDS, new ArrayList<>(Arrays.asList(trackIds))); + startActivity(intent); + return true; + } + if (itemId == R.id.list_context_menu_select_all) { for (int i = 0; i < viewBinding.trackList.getCount(); i++) { viewBinding.trackList.setItemChecked(i, true); diff --git a/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java index 9a0f86fa4..adba1c767 100644 --- a/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java @@ -205,6 +205,26 @@ public class ContentProviderUtils { return tracks; } + public List getTracks(List trackIds) { + if (trackIds == null || trackIds.isEmpty()) { + return getTracks(); + } + + String selection = String.format(TracksColumns._ID + " IN (%s)", TextUtils.join(",", Collections.nCopies(trackIds.size(), "?"))); + String[] selectionArgs = trackIds.stream().map(id -> Long.toString(id.getId())).toArray(String[]::new); + ArrayList tracks = new ArrayList<>(); + try (Cursor cursor = getTrackCursor(selection, selectionArgs, TracksColumns._ID)) { + if (cursor != null && cursor.moveToFirst()) { + tracks.ensureCapacity(cursor.getCount()); + do { + tracks.add(createTrack(cursor)); + } while (cursor.moveToNext()); + } + } + + return tracks; + } + public Track getTrack(@NonNull Track.Id trackId) { try (Cursor cursor = getTrackCursor(TracksColumns._ID + "=?", new String[]{Long.toString(trackId.getId())}, null)) { if (cursor != null && cursor.moveToNext()) { diff --git a/src/main/java/de/dennisguse/opentracks/viewmodels/AggregatedStatisticsModel.java b/src/main/java/de/dennisguse/opentracks/viewmodels/AggregatedStatisticsModel.java index 46ed54f68..2eb29470c 100644 --- a/src/main/java/de/dennisguse/opentracks/viewmodels/AggregatedStatisticsModel.java +++ b/src/main/java/de/dennisguse/opentracks/viewmodels/AggregatedStatisticsModel.java @@ -3,6 +3,7 @@ package de.dennisguse.opentracks.viewmodels; import android.app.Application; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; @@ -20,18 +21,18 @@ public class AggregatedStatisticsModel extends AndroidViewModel { super(application); } - public LiveData getAggregatedStats() { + public LiveData getAggregatedStats(@Nullable List trackIds) { if (aggregatedStats == null) { aggregatedStats = new MutableLiveData<>(); - loadAggregatedStats(); + loadAggregatedStats(trackIds); } return aggregatedStats; } - private void loadAggregatedStats() { + private void loadAggregatedStats(@Nullable List trackIds) { new Thread(() -> { ContentProviderUtils contentProviderUtils = new ContentProviderUtils(getApplication().getApplicationContext()); - List tracks = contentProviderUtils.getTracks(); + List tracks = contentProviderUtils.getTracks(trackIds); AggregatedStatistics aggregatedStatistics = new AggregatedStatistics(tracks); diff --git a/src/main/res/menu/list_context_menu.xml b/src/main/res/menu/list_context_menu.xml index 5bb3e3f88..3abebcc3a 100644 --- a/src/main/res/menu/list_context_menu.xml +++ b/src/main/res/menu/list_context_menu.xml @@ -35,6 +35,11 @@ limitations under the License. android:icon="@drawable/ic_delete_forever_24dp" android:title="@string/menu_delete" app:showAsAction="ifRoom" /> +