Skip to content

Commit 3b2acfc

Browse files
committed
Start adding alarms
1 parent b4a6af1 commit 3b2acfc

File tree

17 files changed

+1410
-1104
lines changed

17 files changed

+1410
-1104
lines changed

api/pubspec.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,10 @@ packages:
157157
dependency: transitive
158158
description:
159159
name: coverage
160-
sha256: "9086475ef2da7102a0c0a4e37e1e30707e7fb7b6d28c209f559a9c5f8ce42016"
160+
sha256: "802bd084fb82e55df091ec8ad1553a7331b61c08251eef19a508b6f3f3a9858d"
161161
url: "https://pub.dev"
162162
source: hosted
163-
version: "1.12.0"
163+
version: "1.13.1"
164164
crypto:
165165
dependency: transitive
166166
description:

app/android/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
22
<uses-permission android:name="android.permission.INTERNET"/>
33
<application
4-
android:label="Flow"
4+
android:label="${appName}"
55
android:name="${applicationName}"
66
android:icon="@mipmap/ic_launcher">
77
<activity

app/lib/cubits/settings.dart

Lines changed: 129 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,21 @@ import '../api/storage/remote/model.dart';
1111

1212
part 'settings.mapper.dart';
1313

14+
@MappableClass()
15+
final class Alarm with AlarmMappable {
16+
final DateTime date;
17+
final String title;
18+
final String description;
19+
final bool isActive;
20+
21+
const Alarm({
22+
required this.date,
23+
this.title = '',
24+
this.description = '',
25+
this.isActive = true,
26+
});
27+
}
28+
1429
@MappableEnum()
1530
enum ThemeDensity {
1631
system,
@@ -48,16 +63,27 @@ final class ThemeModeMapper extends SimpleMapper<ThemeMode> {
4863

4964
@MappableClass(includeCustomMappers: [ThemeModeMapper()])
5065
class FlowSettings with FlowSettingsMappable, LeapSettings {
66+
static const String localeKey = 'locale';
5167
final String locale;
68+
static const String themeModeKey = 'themeMode';
5269
final ThemeMode themeMode;
70+
static const String nativeTitleBarKey = 'nativeTitleBar';
5371
@override
5472
final bool nativeTitleBar;
73+
static const String designKey = 'design';
5574
final String design;
75+
static const String syncModeKey = 'syncMode';
5676
final SyncMode syncMode;
77+
static const String remotesKey = 'remotes';
5778
final List<RemoteStorage> remotes;
79+
static const String startOfWeekKey = 'startOfWeek';
5880
final int startOfWeek;
81+
static const String densityKey = 'density';
5982
final ThemeDensity density;
83+
static const String highContrastKey = 'highContrast';
6084
final bool highContrast;
85+
static const String alarmsKey = 'alarms';
86+
final List<Alarm> alarms;
6187

6288
const FlowSettings({
6389
this.locale = '',
@@ -69,39 +95,64 @@ class FlowSettings with FlowSettingsMappable, LeapSettings {
6995
this.startOfWeek = 0,
7096
this.density = ThemeDensity.system,
7197
this.highContrast = false,
98+
this.alarms = const [],
7299
});
73100

74101
factory FlowSettings.fromPrefs(SharedPreferences prefs) => FlowSettings(
75102
themeMode:
76-
ThemeMode.values.byName(prefs.getString('themeMode') ?? 'system'),
77-
design: prefs.getString('design') ?? '',
78-
nativeTitleBar: prefs.getBool('nativeTitleBar') ?? false,
79-
locale: prefs.getString('locale') ?? '',
103+
ThemeMode.values.byName(prefs.getString(themeModeKey) ?? 'system'),
104+
design: prefs.getString(designKey) ?? '',
105+
nativeTitleBar: prefs.getBool(nativeTitleBarKey) ?? false,
106+
locale: prefs.getString(localeKey) ?? '',
80107
syncMode:
81-
SyncMode.values.byName(prefs.getString('syncMode') ?? 'noMobile'),
108+
SyncMode.values.byName(prefs.getString(syncModeKey) ?? 'noMobile'),
82109
remotes: prefs
83-
.getStringList('remotes')
110+
.getStringList(remotesKey)
84111
?.map((e) => RemoteStorageMapper.fromJson(e))
85112
.toList() ??
86113
[],
87-
startOfWeek: prefs.getInt('startOfWeek') ?? 0,
114+
startOfWeek: prefs.getInt(startOfWeekKey) ?? 0,
88115
density:
89-
ThemeDensity.values.byName(prefs.getString('density') ?? 'system'),
90-
highContrast: prefs.getBool('highContrast') ?? false,
116+
ThemeDensity.values.byName(prefs.getString(densityKey) ?? 'system'),
117+
highContrast: prefs.getBool(highContrastKey) ?? false,
118+
alarms: prefs
119+
.getStringList(alarmsKey)
120+
?.map((e) => AlarmMapper.fromJson(e))
121+
.toList() ??
122+
[],
91123
);
124+
Future<void> saveThemeMode(SharedPreferences prefs) =>
125+
prefs.setString(themeModeKey, themeMode.name);
126+
Future<void> saveDesign(SharedPreferences prefs) =>
127+
prefs.setString(designKey, design);
128+
Future<void> saveNativeTitleBar(SharedPreferences prefs) =>
129+
prefs.setBool(nativeTitleBarKey, nativeTitleBar);
130+
Future<void> saveLocale(SharedPreferences prefs) =>
131+
prefs.setString(localeKey, locale);
132+
Future<void> saveSyncMode(SharedPreferences prefs) =>
133+
prefs.setString(syncModeKey, syncMode.name);
134+
Future<void> saveRemotes(SharedPreferences prefs) => prefs.setStringList(
135+
remotesKey, remotes.map((e) => json.encode(e.toJson())).toList());
136+
Future<void> saveStartOfWeek(SharedPreferences prefs) =>
137+
prefs.setInt(startOfWeekKey, startOfWeek);
138+
Future<void> saveDensity(SharedPreferences prefs) =>
139+
prefs.setString(densityKey, density.name);
140+
Future<void> saveHighContrast(SharedPreferences prefs) =>
141+
prefs.setBool(highContrastKey, highContrast);
142+
Future<void> saveAlarms(SharedPreferences prefs) => prefs.setStringList(
143+
alarmsKey, alarms.map((e) => json.encode(e.toJson())).toList());
92144

93-
Future<void> save() async {
94-
final prefs = await SharedPreferences.getInstance();
95-
await prefs.setString('themeMode', themeMode.name);
96-
await prefs.setString('design', design);
97-
await prefs.setBool('nativeTitleBar', nativeTitleBar);
98-
await prefs.setString('locale', locale);
99-
await prefs.setString('syncMode', syncMode.name);
100-
await prefs.setStringList(
101-
'remotes', remotes.map((e) => json.encode(e.toJson())).toList());
102-
await prefs.setInt('startOfWeek', startOfWeek);
103-
await prefs.setString('density', density.name);
104-
await prefs.setBool('highContrast', highContrast);
145+
Future<void> save(SharedPreferences prefs) async {
146+
await saveThemeMode(prefs);
147+
await saveDesign(prefs);
148+
await saveNativeTitleBar(prefs);
149+
await saveLocale(prefs);
150+
await saveSyncMode(prefs);
151+
await saveRemotes(prefs);
152+
await saveStartOfWeek(prefs);
153+
await saveDensity(prefs);
154+
await saveHighContrast(prefs);
155+
await saveAlarms(prefs);
105156
}
106157
}
107158

@@ -114,67 +165,103 @@ class SettingsCubit extends Cubit<FlowSettings>
114165
with LeapSettingsBlocBaseMixin<FlowSettings> {
115166
SettingsCubit(SharedPreferences prefs) : super(FlowSettings.fromPrefs(prefs));
116167

168+
Future<void> _runSave(
169+
Future<void> Function(SharedPreferences prefs) save) async {
170+
final prefs = await SharedPreferences.getInstance();
171+
await save(prefs);
172+
}
173+
117174
Future<void> changeThemeMode(ThemeMode mode) {
118175
emit(state.copyWith(themeMode: mode));
119-
return state.save();
176+
return _runSave(state.saveThemeMode);
120177
}
121178

122179
Future<void> changeDesign(String design) {
123-
emit(state.copyWith(design: design));
124-
return state.save();
180+
final newState = state.copyWith(design: design);
181+
emit(newState);
182+
return _runSave(newState.saveDesign);
125183
}
126184

127185
Future<void> changeNativeTitleBar(bool nativeTitleBar) {
128-
emit(state.copyWith(nativeTitleBar: nativeTitleBar));
129-
return state.save();
186+
final newState = state.copyWith(nativeTitleBar: nativeTitleBar);
187+
emit(newState);
188+
return _runSave(newState.saveNativeTitleBar);
130189
}
131190

132191
Future<void> changeLocale(String locale) {
133-
emit(state.copyWith(locale: locale));
134-
return state.save();
192+
final newState = state.copyWith(locale: locale);
193+
emit(newState);
194+
return _runSave(newState.saveLocale);
135195
}
136196

137197
Future<void> changeSyncMode(SyncMode syncMode) {
138-
emit(state.copyWith(syncMode: syncMode));
139-
return state.save();
198+
final newState = state.copyWith(syncMode: syncMode);
199+
emit(newState);
200+
return _runSave(newState.saveSyncMode);
140201
}
141202

142203
Future<void> addStorage(RemoteStorage remoteStorage) {
143-
emit(state.copyWith(remotes: [...state.remotes, remoteStorage]));
144-
return state.save();
204+
final newState = state.copyWith(remotes: [...state.remotes, remoteStorage]);
205+
emit(newState);
206+
return _runSave(newState.saveRemotes);
145207
}
146208

147209
RemoteStorage? getStorage(String name) {
148210
return state.remotes.firstWhereOrNull((e) => e.identifier == name);
149211
}
150212

151213
Future<void> removeStorage(String name) {
152-
emit(state.copyWith(
153-
remotes: state.remotes.where((e) => e.toFilename() != name).toList()));
154-
return state.save();
214+
final newState = state.copyWith(
215+
remotes: state.remotes.where((e) => e.toFilename() != name).toList());
216+
emit(newState);
217+
return _runSave(newState.saveRemotes);
155218
}
156219

157220
Future<void> changeStartOfWeek(int startOfWeek) {
158-
emit(state.copyWith(startOfWeek: startOfWeek));
159-
return state.save();
221+
final newState = state.copyWith(startOfWeek: startOfWeek);
222+
emit(newState);
223+
return _runSave(newState.saveStartOfWeek);
160224
}
161225

162226
Future<void> changeDensity(ThemeDensity density) {
163-
emit(state.copyWith(density: density));
164-
return state.save();
227+
final newState = state.copyWith(density: density);
228+
emit(newState);
229+
return _runSave(newState.saveDensity);
165230
}
166231

167232
Future<void> changeHighContrast(bool highContrast) {
168-
emit(state.copyWith(highContrast: highContrast));
169-
return state.save();
233+
final newState = state.copyWith(highContrast: highContrast);
234+
emit(newState);
235+
return _runSave(newState.saveHighContrast);
236+
}
237+
238+
Future<void> addAlarm(Alarm alarm) {
239+
final newState = state.copyWith(alarms: [...state.alarms, alarm]);
240+
emit(newState);
241+
return _runSave(newState.saveAlarms);
242+
}
243+
244+
Future<void> removeAlarm(Alarm alarm) {
245+
final newState =
246+
state.copyWith(alarms: state.alarms.where((e) => e != alarm).toList());
247+
emit(newState);
248+
return _runSave(newState.saveAlarms);
249+
}
250+
251+
Future<void> changeAlarm(int index, Alarm alarm) {
252+
final newState = state.copyWith(
253+
alarms:
254+
state.alarms.mapIndexed((i, e) => i == index ? alarm : e).toList());
255+
emit(newState);
256+
return _runSave(newState.saveAlarms);
170257
}
171258

172259
Future<void> importSettings(String data) {
173260
final settings = FlowSettingsMapper.fromJson(data).copyWith(
174261
remotes: state.remotes,
175262
);
176263
emit(settings);
177-
return state.save();
264+
return _runSave(settings.save);
178265
}
179266

180267
Future<String> exportSettings() async {

0 commit comments

Comments
 (0)