Add data persistence for focus mode

This commit is contained in:
Hank Grabowski 2024-08-19 14:50:49 -04:00
parent 6ff5092d60
commit 7d6b0bee41
3 changed files with 49 additions and 17 deletions

View file

@ -2,7 +2,9 @@ import 'dart:async';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import '../globals.dart';
import '../models/focus_mode_data.dart';
import '../services/setting_service.dart';
part 'focus_mode.g.dart';
@ -12,21 +14,25 @@ class FocusMode extends _$FocusMode {
void setMode(FocusModeData newMode) {
_disableTimer?.cancel();
var updatedState = newMode;
if (newMode.enabled && newMode.disableTime != null) {
_disableTimer =
Timer(newMode.disableTime!.difference(DateTime.now()), () {
print('disabling mode');
state = const FocusModeData(false);
final timeDifference = newMode.disableTime!.difference(DateTime.now());
if (timeDifference.isNegative || timeDifference.inMicroseconds == 0) {
updatedState = FocusModeData.disabled();
}
_disableTimer = Timer(timeDifference, () {
state = FocusModeData.disabled();
});
}
print('New focus mode: $newMode');
state = newMode;
getIt<SettingsService>().focusModeData = updatedState;
state = updatedState;
}
@override
FocusModeData build() {
print('Building FocusMode provider');
state = const FocusModeData(false);
final storedFocusMode = getIt<SettingsService>().focusModeData;
setMode(storedFocusMode);
return state;
}
}

View file

@ -6,7 +6,7 @@ part of 'focus_mode.dart';
// RiverpodGenerator
// **************************************************************************
String _$focusModeHash() => r'd9eab6fca9c114d94a42a9cb45dcea74ee82c567';
String _$focusModeHash() => r'93028f8514cecda8ce68506ec242f4d26d63b4b2';
/// See also [FocusMode].
@ProviderFor(FocusMode)

View file

@ -5,9 +5,19 @@ import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../models/focus_mode_data.dart';
import '../models/settings/network_capabilities_settings.dart';
import '../utils/theme_mode_extensions.dart';
const _lowBandwidthModeKey = 'LowBandwidthMode';
const _themeModeKey = 'ThemeMode';
const _colorBlindnessTestingModeKey = 'ColorBlindnessTestingMode';
const _logLevelKey = 'LogLevel';
const _networkCapabilitiesKey = 'NetworkCapabilities';
const _notificationGroupingKey = 'NotificationGrouping';
const _spoilerHidingEnabledKey = 'SpoilerHidingEnabled';
const _focusModeKey = 'FocusMode';
class SettingsService extends ChangeNotifier {
late final SharedPreferences _prefs;
var _initialized = false;
@ -86,6 +96,18 @@ class SettingsService extends ChangeNotifier {
notifyListeners();
}
FocusModeData _focusModeData = FocusModeData.disabled();
FocusModeData get focusModeData => _focusModeData;
set focusModeData(FocusModeData updatedData) {
_focusModeData = updatedData;
final jsonData = _focusModeData.toJson();
final jsonString = jsonEncode(jsonData);
_prefs.setString(_focusModeKey, jsonString);
notifyListeners();
}
Future<void> initialize() async {
if (_initialized) {
return;
@ -98,18 +120,11 @@ class SettingsService extends ChangeNotifier {
_colorBlindnessType = _colorBlindnessTypeFromPrefs(_prefs);
_logLevel = _levelFromPrefs(_prefs);
_networkCapabilities = _networkCapabilitiesFromPrefs(_prefs);
_focusModeData = _focusModeDataFromPrefs(_prefs);
_initialized = true;
}
}
const _lowBandwidthModeKey = 'LowBandwidthMode';
const _themeModeKey = 'ThemeMode';
const _colorBlindnessTestingModeKey = 'ColorBlindnessTestingMode';
const _logLevelKey = 'LogLevel';
const _networkCapabilitiesKey = 'NetworkCapabilities';
const _notificationGroupingKey = 'NotificationGrouping';
const _spoilerHidingEnabledKey = 'SpoilerHidingEnabled';
ColorBlindnessType _colorBlindnessTypeFromPrefs(SharedPreferences prefs) {
final cbString = prefs.getString(_colorBlindnessTestingModeKey);
if (cbString?.isEmpty ?? true) {
@ -149,3 +164,14 @@ Level _levelFromPrefs(SharedPreferences prefs) {
_ => Level.OFF,
};
}
FocusModeData _focusModeDataFromPrefs(SharedPreferences prefs) {
final fmString = prefs.getString(_focusModeKey);
if (fmString?.isEmpty ?? true) {
return FocusModeData.disabled();
}
final Map<String, dynamic> json = jsonDecode(fmString!);
final fm = FocusModeData.fromJson(json);
return fm;
}