Add "Today" and "distant past" quick filter option to workout list with persistent selection

- Add "Today" and "distant past" option to time period filter dropdown
- Store selected filter in SharedPreferences for persistence across sessions
- Auto-restore last selected filter when opening workout filter settings
- Today filter shows workouts from midnight to current time, distant pass shows all workouts
This commit is contained in:
Gideon Zenz
2026-01-25 16:58:00 +01:00
committed by José Rebelo
parent 13cdf45484
commit b42db53109
5 changed files with 127 additions and 46 deletions
@@ -63,12 +63,15 @@ import nodomain.freeyourgadget.gadgetbridge.entities.Device;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind;
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
import nodomain.freeyourgadget.gadgetbridge.util.WorkoutFilterUtils;
public class ActivitySummariesFilter extends AbstractGBActivity {
private static final Logger LOG = LoggerFactory.getLogger(ActivitySummariesFilter.class);
private static final String DATE_FILTER_FROM = "dateFromFilter";
private static final String DATE_FILTER_TO = "dateToFilter";
private static final String PREF_QUICK_FILTER = "workout_list_quick_filter";
public static long ALL_DEVICES = 999;
int activityFilter = 0;
long dateFromFilter = 0;
@@ -150,6 +153,14 @@ public class ActivitySummariesFilter extends AbstractGBActivity {
quick_filter_period_select.setAdapter(filterDateAdapter);
addListenerOnQuickFilterSelection();
// Restore saved quick filter selection
String savedFilter = GBApplication.getPrefs().getPreferences().getString(PREF_QUICK_FILTER, "noselection");
ArrayList<String> filterValues = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.activity_filter_quick_filter_period_values)));
int savedPosition = filterValues.indexOf(savedFilter);
if (savedPosition >= 0) {
quick_filter_period_select.setSelection(savedPosition);
}
//set current values coming from parent
update_filter_fields();
@@ -189,6 +200,10 @@ public class ActivitySummariesFilter extends AbstractGBActivity {
itemsFilter = null;
deviceFilterSpinner.setSelection(filterDevicesAdapter.getItemPositionForSelection(getDeviceById(initial_deviceFilter)));
quick_filter_period_select.setSelection(0);
// Clear saved filter preference
GBApplication.getPrefs().getPreferences().edit()
.putString(PREF_QUICK_FILTER, "noselection")
.apply();
update_filter_fields();
}
});
@@ -331,53 +346,12 @@ public class ActivitySummariesFilter extends AbstractGBActivity {
}
private void setTimePeriodFilter(String selection) {
Calendar date = Calendar.getInstance();
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
long firstdate;
long lastdate;
switch (selection) {
case "thisweek":
date.set(Calendar.DAY_OF_WEEK, date.getFirstDayOfWeek());
firstdate = date.getTimeInMillis();
lastdate = Calendar.getInstance().getTimeInMillis();
break;
case "thismonth":
date.set(Calendar.DAY_OF_MONTH, 1);
firstdate = date.getTimeInMillis();
lastdate = Calendar.getInstance().getTimeInMillis();
break;
case "lastweek":
int i = date.get(Calendar.DAY_OF_WEEK) - date.getFirstDayOfWeek();
date.add(Calendar.DATE, -i - 7);
firstdate = date.getTimeInMillis();
date.add(Calendar.DATE, 6);
lastdate = date.getTimeInMillis();
break;
case "lastmonth":
date.set(Calendar.DATE, 1);
date.add(Calendar.DAY_OF_MONTH, -1);
lastdate = date.getTimeInMillis();
date.set(Calendar.DATE, 1);
firstdate = date.getTimeInMillis();
break;
case "7days":
date.add(Calendar.DATE, -7);
firstdate = date.getTimeInMillis();
lastdate = Calendar.getInstance().getTimeInMillis();
break;
case "30days":
date.add(Calendar.DATE, -30);
firstdate = date.getTimeInMillis();
lastdate = Calendar.getInstance().getTimeInMillis();
break;
default:
return;
android.util.Pair<Long, Long> dateRange = WorkoutFilterUtils.getDateRangeForFilter(selection);
if (dateRange == null) {
return;
}
dateFromFilter = firstdate;
dateToFilter = lastdate;
dateFromFilter = dateRange.first;
dateToFilter = dateRange.second;
update_filter_fields();
}
@@ -469,6 +443,10 @@ public class ActivitySummariesFilter extends AbstractGBActivity {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
selection = activity_filter_quick_filter_period_values.get(pos);
setTimePeriodFilter(selection);
// Save the selection to preferences
GBApplication.getPrefs().getPreferences().edit()
.putString(PREF_QUICK_FILTER, selection)
.apply();
}
@Override
@@ -29,6 +29,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind
import nodomain.freeyourgadget.gadgetbridge.model.RecordedDataTypes
import nodomain.freeyourgadget.gadgetbridge.util.ActivitySummaryUtils
import nodomain.freeyourgadget.gadgetbridge.util.GB
import nodomain.freeyourgadget.gadgetbridge.util.WorkoutFilterUtils
import org.slf4j.LoggerFactory
import java.io.File
import java.util.BitSet
@@ -128,6 +129,9 @@ class WorkoutListActivity : AbstractListActivity<BaseActivitySummary>() {
?: throw IllegalArgumentException("Must provide a device when invoking this activity")
deviceFilter = getDeviceId(gbDevice!!)
// Load and apply saved quick filter
applySavedQuickFilter()
val filterLocal = IntentFilter(GBDevice.ACTION_DEVICE_CHANGED)
LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filterLocal)
@@ -473,6 +477,14 @@ class WorkoutListActivity : AbstractListActivity<BaseActivitySummary>() {
}
}
private fun applySavedQuickFilter() {
val savedFilter = GBApplication.getPrefs().preferences.getString("workout_list_quick_filter", "noselection")
val dateRange = WorkoutFilterUtils.getDateRangeForFilter(savedFilter) ?: return
dateFromFilter = dateRange.first
dateToFilter = dateRange.second
}
companion object {
private val LOG = LoggerFactory.getLogger(WorkoutListActivity::class.java)
const val ACTIVITY_FILTER = 1
@@ -0,0 +1,86 @@
/* Copyright (C) 2020-2024 Daniel Dakhno, Petr Vaněk, Gideon Zenz
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.util;
import android.util.Pair;
import java.util.Calendar;
public class WorkoutFilterUtils {
public static Pair<Long, Long> getDateRangeForFilter(String filterSelection) {
if (filterSelection == null || filterSelection.equals("noselection")) {
return null;
}
Calendar date = Calendar.getInstance();
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
long firstdate;
long lastdate;
switch (filterSelection) {
case "today":
firstdate = date.getTimeInMillis();
lastdate = Calendar.getInstance().getTimeInMillis();
break;
case "thisweek":
date.set(Calendar.DAY_OF_WEEK, date.getFirstDayOfWeek());
firstdate = date.getTimeInMillis();
lastdate = Calendar.getInstance().getTimeInMillis();
break;
case "thismonth":
date.set(Calendar.DAY_OF_MONTH, 1);
firstdate = date.getTimeInMillis();
lastdate = Calendar.getInstance().getTimeInMillis();
break;
case "lastweek":
int i = date.get(Calendar.DAY_OF_WEEK) - date.getFirstDayOfWeek();
date.add(Calendar.DATE, -i - 7);
firstdate = date.getTimeInMillis();
date.add(Calendar.DATE, 6);
lastdate = date.getTimeInMillis();
break;
case "lastmonth":
date.set(Calendar.DATE, 1);
date.add(Calendar.DAY_OF_MONTH, -1);
lastdate = date.getTimeInMillis();
date.set(Calendar.DATE, 1);
firstdate = date.getTimeInMillis();
break;
case "7days":
date.add(Calendar.DATE, -7);
firstdate = date.getTimeInMillis();
lastdate = Calendar.getInstance().getTimeInMillis();
break;
case "30days":
date.add(Calendar.DATE, -30);
firstdate = date.getTimeInMillis();
lastdate = Calendar.getInstance().getTimeInMillis();
break;
case "distantpast":
firstdate = 0L;
lastdate = 0L;
break;
default:
return null;
}
return new Pair<>(firstdate, lastdate);
}
}
+4
View File
@@ -3355,21 +3355,25 @@
<string-array name="activity_filter_quick_filter_period_items">
<item>@string/sports_activity_quick_filter_select</item>
<item>@string/activity_summary_today</item>
<item>@string/sports_activity_quick_filter_this_week</item>
<item>@string/sports_activity_quick_filter_this_month</item>
<item>@string/sports_activity_quick_filter_last_week</item>
<item>@string/sports_activity_quick_filter_last_month</item>
<item>@string/sports_activity_quick_filter_7days</item>
<item>@string/sports_activity_quick_filter_30days</item>
<item>@string/sports_activity_quick_filter_distant_past</item>
</string-array>
<string-array name="activity_filter_quick_filter_period_values">
<item>noselection</item>
<item>today</item>
<item>thisweek</item>
<item>thismonth</item>
<item>lastweek</item>
<item>lastmonth</item>
<item>7days</item>
<item>30days</item>
<item>distantpast</item>
</string-array>
<string-array name="lefun_interface_language_names">
+1
View File
@@ -2871,6 +2871,7 @@
<string name="sports_activity_quick_filter_last_month">Previous month</string>
<string name="sports_activity_quick_filter_7days">7 days</string>
<string name="sports_activity_quick_filter_30days">30 days</string>
<string name="sports_activity_quick_filter_distant_past">Distant past (all workouts)</string>
<string name="sports_activity_quick_filter_select">Time period</string>
<string name="sports_activity_confirm_delete_title">Delete %d activities</string>
<string name="sports_activity_confirm_delete_description">Are you sure you want to delete %d activities?</string>