Adjust default sleep range to 18:00

This is a saner default than 12:00, which cuts off sleep sessions that
go past noon. We keep the previous noon-to-noon setting as an option, in
case that is a better option for some users.
This commit is contained in:
José Rebelo
2026-04-23 20:49:47 +01:00
parent 997d338d52
commit 2380f98815
10 changed files with 67 additions and 48 deletions
@@ -421,7 +421,8 @@ public abstract class AbstractActivityChartFragment<D extends ChartsData> extend
}
protected List<? extends ActivitySample> getSamplesofSleep(DBHandler db, GBDevice device) {
int SLEEP_HOUR_LIMIT = 12;
final String chartSleepRangeMode = GBApplication.getPrefs().getString("chart_sleep_range_mode", "18:00");
final int SLEEP_HOUR_LIMIT = "18:00".equals(chartSleepRangeMode) ? 18 : 12;
int tsStart = getTSStart();
Calendar day = GregorianCalendar.getInstance();
@@ -51,17 +51,12 @@ public class ActivitySleepChartFragment extends AbstractActivityChartFragment<De
private LineChart mChart;
private int mSmartAlarmFrom = -1;
private int mSmartAlarmTo = -1;
private int mTimestampFrom = -1;
private int mSmartAlarmGoneOff = -1;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_charts, container, false);
mChart = (LineChart) rootView.findViewById(R.id.activitysleepchart);
mChart = rootView.findViewById(R.id.activitysleepchart);
setupChart();
@@ -114,12 +109,7 @@ public class ActivitySleepChartFragment extends AbstractActivityChartFragment<De
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ChartsHost.REFRESH)) {
// TODO: use LimitLines to visualize smart alarms?
mSmartAlarmFrom = intent.getIntExtra("smartalarm_from", -1);
mSmartAlarmTo = intent.getIntExtra("smartalarm_to", -1);
mTimestampFrom = intent.getIntExtra("recording_base_timestamp", -1);
mSmartAlarmGoneOff = intent.getIntExtra("alarm_gone_off", -1);
if (ChartsHost.REFRESH.equals(action)) {
refresh();
} else {
super.onReceive(context, intent);
@@ -140,7 +130,7 @@ public class ActivitySleepChartFragment extends AbstractActivityChartFragment<De
mChart.getLegend().setTextColor(LEGEND_TEXT_COLOR);
mChart.setData(null); // workaround for https://github.com/PhilJay/MPAndroidChart/issues/2317
mChart.getXAxis().setValueFormatter(dcd.getXValueFormatter());
mChart.setData((LineData) dcd.getData());
mChart.setData(dcd.getData());
}
@Override
@@ -91,12 +91,8 @@ public class SleepDailyFragment extends SleepFragment<SleepDailyFragment.MyChart
private FragmentSleepchartBinding binding;
private int mSmartAlarmFrom = -1;
private int mSmartAlarmTo = -1;
private int mTimestampFrom = -1;
private int mSmartAlarmGoneOff = -1;
Prefs prefs = GBApplication.getPrefs();
private final boolean CHARTS_SLEEP_RANGE_24H = prefs.getBoolean("chart_sleep_range_24h", false);
private final boolean CHARTS_SLEEP_RANGE_24H = prefs.getString("chart_sleep_range_mode", "18:00").equals("24h");
private final boolean SHOW_CHARTS_AVERAGE = prefs.getBoolean("charts_show_average", true);
private final int sleepLinesLimit = prefs.getInt("chart_sleep_lines_limit", 6);
@@ -643,11 +639,6 @@ public class SleepDailyFragment extends SleepFragment<SleepDailyFragment.MyChart
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action != null && action.equals(ChartsHost.REFRESH)) {
// TODO: use LimitLines to visualize smart alarms?
mSmartAlarmFrom = intent.getIntExtra("smartalarm_from", -1);
mSmartAlarmTo = intent.getIntExtra("smartalarm_to", -1);
mTimestampFrom = intent.getIntExtra("recording_base_timestamp", -1);
mSmartAlarmGoneOff = intent.getIntExtra("alarm_gone_off", -1);
refresh();
} else {
super.onReceive(context, intent);
@@ -77,7 +77,7 @@ public class SleepPeriodFragment extends SleepFragment<SleepPeriodFragment.MyCha
protected Locale mLocale;
protected int mTargetValue = 0;
private final int mOffsetHours = getOffsetHours();
private final int mCutOffHour = GBApplication.getPrefs().getString("chart_sleep_range_mode", "18:00").equals("18:00") ? 18 : 12;
protected boolean SHOW_BALANCE;
@@ -475,7 +475,7 @@ public class SleepPeriodFragment extends SleepFragment<SleepPeriodFragment.MyCha
}
int getOffsetHours() {
return -12;
return GBApplication.getPrefs().getString("chart_sleep_range_mode", "18:00").equals("18:00") ? -18 : -12;
}
@@ -627,7 +627,7 @@ public class SleepPeriodFragment extends SleepFragment<SleepPeriodFragment.MyCha
ActivityAmounts amounts = null;
Activity activity = getActivity();
int key = (int) (day.getTimeInMillis() / 1000) + (mOffsetHours * 3600);
int key = (int) (day.getTimeInMillis() / 1000) + (-mCutOffHour * 3600);
if (activity != null) {
activityAmountCache = ((ActivityChartsActivity) activity).mActivityAmountCache;
amounts = activityAmountCache.lookup(key);
@@ -635,7 +635,7 @@ public class SleepPeriodFragment extends SleepFragment<SleepPeriodFragment.MyCha
if (amounts == null) {
ActivityAnalysis analysis = new ActivityAnalysis();
amounts = analysis.calculateActivityAmounts(getSamplesOfDay(db, day, mOffsetHours, device));
amounts = analysis.calculateActivityAmounts(getSamplesOfDay(db, day, mCutOffHour, device));
if (activityAmountCache != null) {
activityAmountCache.add(key, amounts);
}
@@ -644,20 +644,22 @@ public class SleepPeriodFragment extends SleepFragment<SleepPeriodFragment.MyCha
return amounts;
}
private List<? extends ActivitySample> getSamplesOfDay(DBHandler db, Calendar day, int offsetHours, GBDevice device) {
int startTs;
int endTs;
private List<? extends ActivitySample> getSamplesOfDay(DBHandler db, Calendar day, int cutoffHour, GBDevice device) {
day = (Calendar) day.clone(); // do not modify the caller's argument
day.set(Calendar.HOUR_OF_DAY, 0);
day.set(Calendar.HOUR_OF_DAY, cutoffHour);
day.set(Calendar.MINUTE, 0);
day.set(Calendar.SECOND, 0);
day.add(Calendar.HOUR, offsetHours);
final int tsEnd = toTimestamp(day.getTime());
startTs = (int) (day.getTimeInMillis() / 1000);
endTs = startTs + 24 * 60 * 60 - 1;
int tsStart = tsEnd - 24 * 60 * 60;
day.setTimeInMillis(tsStart * 1000L);
day.set(Calendar.HOUR_OF_DAY, cutoffHour);
day.set(Calendar.MINUTE, 0);
day.set(Calendar.SECOND, 0);
tsStart = toTimestamp(day.getTime());
return getSamples(db, device, startTs, endTs);
return getSamples(db, device, tsStart, tsEnd);
}
private int getRangeDays() {
@@ -80,7 +80,6 @@ public class StressDailyFragment extends StressFragment<StressDailyFragment.Stre
private String STRESS_AVERAGE_LABEL;
private final Prefs prefs = GBApplication.getPrefs();
private final boolean CHARTS_SLEEP_RANGE_24H = prefs.getBoolean("chart_sleep_range_24h", false);
private final boolean SHOW_CHARTS_AVERAGE = prefs.getBoolean("charts_show_average", true);
private boolean showStressLevelInPercents = false;
@@ -259,7 +258,7 @@ public class StressDailyFragment extends StressFragment<StressDailyFragment.Stre
protected void setupLegend(final Chart<?> chart) {
final List<LegendEntry> legendEntries = createLegendEntries(chart);
if (!CHARTS_SLEEP_RANGE_24H && SHOW_CHARTS_AVERAGE) {
if (SHOW_CHARTS_AVERAGE) {
final LegendEntry averageEntry = new LegendEntry();
averageEntry.label = STRESS_AVERAGE_LABEL;
averageEntry.formColor = Color.GRAY;
@@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory;
import nodomain.freeyourgadget.gadgetbridge.prefs.migrators.PreferenceMigrator55;
import nodomain.freeyourgadget.gadgetbridge.prefs.migrators.PreferenceMigrator56;
import nodomain.freeyourgadget.gadgetbridge.prefs.migrators.PreferenceMigrator57;
import nodomain.freeyourgadget.gadgetbridge.prefs.migrators.PreferenceMigrator58;
public class GBPrefsMigrator {
private static final Logger LOG = LoggerFactory.getLogger(GBPrefsMigrator.class);
@@ -15,7 +16,7 @@ public class GBPrefsMigrator {
public static final String PREFS_VERSION = "shared_preferences_version";
//if preferences have to be migrated, increment the following and add the migration logic in migratePrefs below
// see http://stackoverflow.com/questions/16397848/how-can-i-migrate-android-preferences-with-a-new-version
private static final int CURRENT_PREFS_VERSION = 57;
private static final int CURRENT_PREFS_VERSION = 58;
public static void migratePrefsIfNeeded(final SharedPreferences sharedPrefs) {
final int oldVersion = getPrefsFileVersion(sharedPrefs);
@@ -28,6 +29,7 @@ public class GBPrefsMigrator {
if (oldVersion < 55) new PreferenceMigrator55().migrate(oldVersion, sharedPrefs, editor);
if (oldVersion < 56) new PreferenceMigrator56().migrate(oldVersion, sharedPrefs, editor);
if (oldVersion < 57) new PreferenceMigrator57().migrate(oldVersion, sharedPrefs, editor);
if (oldVersion < 58) new PreferenceMigrator58().migrate(oldVersion, sharedPrefs, editor);
editor.putString(PREFS_VERSION, Integer.toString(CURRENT_PREFS_VERSION));
editor.apply();
@@ -0,0 +1,21 @@
package nodomain.freeyourgadget.gadgetbridge.prefs.migrators;
import android.content.SharedPreferences;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import nodomain.freeyourgadget.gadgetbridge.prefs.AbstractPreferenceMigrator;
public class PreferenceMigrator58 extends AbstractPreferenceMigrator {
private static final Logger LOG = LoggerFactory.getLogger(PreferenceMigrator58.class);
@Override
public void migrate(final int oldVersion, final SharedPreferences sharedPrefs, final SharedPreferences.Editor editor) {
try {
editor.putString("chart_sleep_range_mode", sharedPrefs.getBoolean("chart_sleep_range_24h", false) ? "24h" : "18:00");
} catch (final Exception e) {
LOG.error("Failed to migrate prefs to version 58", e);
}
}
}
+11
View File
@@ -5039,6 +5039,17 @@
<item>23</item>
</string-array>
<string-array name="sleep_range_entries">
<item>@string/pref_chart_sleep_range_rolling_24h</item>
<item>@string/pref_chart_sleep_range_noon</item>
<item>@string/pref_chart_sleep_range_18h</item>
</string-array>
<string-array name="sleep_range_values">
<item>24h</item>
<item>12:00</item>
<item>18:00</item>
</string-array>
<string-array name="prefs_wena3_button_action_list">
<item>@string/menuitem_nothing</item>
<!-- <item>@string/menuitem_alexa</item> -->
+4 -2
View File
@@ -1361,8 +1361,10 @@
<string name="weekstepschart_steps_a_week_or_month">Steps per week/month</string>
<string name="weeksleepchart_sleep_a_week_or_month">Sleep per week/month</string>
<string name="pref_title_chart_sleep_rolling_24_hour">Sleep range</string>
<string name="pref_chart_sleep_rolling_24_on">Past 24 hours</string>
<string name="pref_chart_sleep_rolling_24_off">Noon to noon</string>
<string name="pref_summary_chart_sleep_range">Determines which day a sleep session is assigned to</string>
<string name="pref_chart_sleep_range_rolling_24h">Rolling 24 hours</string>
<string name="pref_chart_sleep_range_noon">Noon (12:00)</string>
<string name="pref_chart_sleep_range_18h">Evening (18:00)</string>
<string name="activity_prefs_chart_min_steps_per_minute_for_run">Minimal steps per minute to detect run</string>
<string name="activity_prefs_chart_min_steps_per_minute">Minimal steps per minute to detect activity</string>
<string name="activity_prefs_chart_max_idle_phase_length">Pause length to separate activities (minutes)</string>
+6 -6
View File
@@ -53,12 +53,12 @@
android:title="@string/pref_title_charts_swipe"
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="chart_sleep_range_24h"
android:layout="@layout/preference_checkbox"
android:summaryOff="@string/pref_chart_sleep_rolling_24_off"
android:summaryOn="@string/pref_chart_sleep_rolling_24_on"
<ListPreference
android:defaultValue="18:00"
android:entries="@array/sleep_range_entries"
android:entryValues="@array/sleep_range_values"
android:key="chart_sleep_range_mode"
android:summary="@string/pref_summary_chart_sleep_range"
android:title="@string/pref_title_chart_sleep_rolling_24_hour"
app:iconSpaceReserved="false" />