import 'package:shared_preferences/shared_preferences.dart'; import '../../core/theme/theme_preference.dart'; import '../models/slot_assignment.dart'; import '../models/slot_type.dart'; /// Persists launcher configuration. This is the single source of truth for /// theme choice, the automatic night window, and the three shortcut slots. class SettingsRepository { SettingsRepository(this._prefs); final SharedPreferences _prefs; static const _themeKey = 'settings.theme'; static const _nightStartKey = 'settings.nightStartMinutes'; static const _nightEndKey = 'settings.nightEndMinutes'; static const _slotPrefix = 'slot'; ThemePreference get themePreference { return ThemePreference.fromStorage(_prefs.getString(_themeKey)); } int get nightStartMinutes => _prefs.getInt(_nightStartKey) ?? 19 * 60; int get nightEndMinutes => _prefs.getInt(_nightEndKey) ?? 7 * 60; Future setThemePreference(ThemePreference preference) { return _prefs.setString(_themeKey, preference.storageValue); } Future setNightWindow({ required int startMinutes, required int endMinutes, }) async { await _prefs.setInt(_nightStartKey, startMinutes); await _prefs.setInt(_nightEndKey, endMinutes); } SlotAssignment? slot(SlotType slot) { final packageName = _prefs.getString('$_slotPrefix.${slot.key}.package'); final activityName = _prefs.getString('$_slotPrefix.${slot.key}.activity'); final label = _prefs.getString('$_slotPrefix.${slot.key}.label'); if (packageName == null || activityName == null) return null; return SlotAssignment( packageName: packageName, activityName: activityName, label: label ?? packageName, ); } Future setSlot(SlotType slot, SlotAssignment assignment) async { await _prefs.setString( '$_slotPrefix.${slot.key}.package', assignment.packageName, ); await _prefs.setString( '$_slotPrefix.${slot.key}.activity', assignment.activityName, ); await _prefs.setString('$_slotPrefix.${slot.key}.label', assignment.label); } Future clearSlot(SlotType slot) async { await _prefs.remove('$_slotPrefix.${slot.key}.package'); await _prefs.remove('$_slotPrefix.${slot.key}.activity'); await _prefs.remove('$_slotPrefix.${slot.key}.label'); } }