mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
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:
+24
-46
@@ -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
|
||||
|
||||
+12
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user