main
1import 'dart:convert';
2
3import 'package:blood_pressure_app/model/blood_pressure/warn_values.dart';
4import 'package:blood_pressure_app/model/export_import/export_configuration.dart';
5import 'package:blood_pressure_app/model/horizontal_graph_line.dart';
6import 'package:blood_pressure_app/model/storage/convert_util.dart';
7import 'package:blood_pressure_app/model/storage/db/config_db.dart';
8import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
9import 'package:blood_pressure_app/model/storage/export_csv_settings_store.dart';
10import 'package:blood_pressure_app/model/storage/export_pdf_settings_store.dart';
11import 'package:blood_pressure_app/model/storage/export_settings_store.dart';
12import 'package:blood_pressure_app/model/storage/interval_store.dart';
13import 'package:blood_pressure_app/model/storage/settings_store.dart';
14import 'package:flutter/material.dart';
15import 'package:health_data_store/health_data_store.dart';
16import 'package:shared_preferences/shared_preferences.dart';
17
18import 'db/config_dao.dart';
19
20/// Function for upgrading shared preferences from pre 1.5.4 (Oct 23) versions.
21Future<void> migrateSharedPreferences(Settings settings, ExportSettings exportSettings, CsvExportSettings csvExportSettings,
22 PdfExportSettings pdfExportSettings, IntervalStoreManager intervallStoreManager,) async {
23 final SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
24
25 final List<Future> futures = [];
26
27 final keys = sharedPreferences.getKeys();
28 for (final key in keys) { // remove these first
29 switch (key) {
30 case 'age':
31 final age = sharedPreferences.getInt('age') ?? 30;
32 settings.sysWarn = BloodPressureWarnValues.getUpperSysWarnValue(age);
33 settings.diaWarn = BloodPressureWarnValues.getUpperDiaWarnValue(age);
34 await sharedPreferences.remove(key);
35 break;
36 case 'overrideWarnValues':
37 case 'exportLimitDataRange':
38 case 'exportDataRangeStartEpochMs':
39 case 'exportDataRangeEndEpochMs':
40 case 'exportAddableItems':
41 case 'iconSize':
42 case 'titlesCount':
43 await sharedPreferences.remove(key);
44 break;
45 case 'exportCustomEntries':
46 csvExportSettings.exportFieldsConfiguration.activePreset =
47 sharedPreferences.getBool(key)! ? ExportImportPreset.none : ExportImportPreset.bloodPressureApp;
48 await sharedPreferences.remove(key);
49 break;
50 case 'exportItems':
51 // can't be migrated as internalIdentifier changed
52 await sharedPreferences.remove(key);
53 break;
54 case 'darkMode':
55 settings.themeMode = sharedPreferences.getBool(key)! ? ThemeMode.dark : ThemeMode.light;
56 await sharedPreferences.remove(key);
57 break;
58 }
59 }
60 for (final key in keys) {
61 switch (key) {
62 case 'graphStepSize':
63 intervallStoreManager.mainPage.changeStepSize(TimeStep.deserialize(sharedPreferences.getInt(key)!));
64 intervallStoreManager.statsPage.changeStepSize(TimeStep.deserialize(sharedPreferences.getInt(key)!));
65 intervallStoreManager.exportPage.changeStepSize(TimeStep.deserialize(sharedPreferences.getInt(key)!));
66 break;
67 case 'followSystemDarkMode':
68 if (sharedPreferences.getBool(key)!) settings.themeMode = ThemeMode.system;
69 break;
70 case 'accentColor':
71 settings.accentColor = ConvertUtil.parseColor(sharedPreferences.getInt(key)!)!;
72 break;
73 case 'diaColor':
74 settings.diaColor = ConvertUtil.parseColor(sharedPreferences.getInt(key)!)!;
75 break;
76 case 'sysColor':
77 settings.sysColor = ConvertUtil.parseColor(sharedPreferences.getInt(key)!)!;
78 break;
79 case 'pulColor':
80 settings.pulColor = ConvertUtil.parseColor(sharedPreferences.getInt(key)!)!;
81 break;
82 case 'allowManualTimeInput':
83 settings.allowManualTimeInput = sharedPreferences.getBool(key)!;
84 break;
85 case 'dateFormatString':
86 settings.dateFormatString = sharedPreferences.getString(key)!;
87 break;
88 case 'sysWarn':
89 settings.sysWarn = sharedPreferences.getInt(key)!;
90 break;
91 case 'diaWarn':
92 settings.diaWarn = sharedPreferences.getInt(key)!;
93 break;
94 case 'validateInputs':
95 settings.validateInputs = sharedPreferences.getBool(key)!;
96 break;
97 case 'allowMissingValues':
98 settings.allowMissingValues = sharedPreferences.getBool(key)!;
99 break;
100 case 'graphLineThickness':
101 settings.graphLineThickness = sharedPreferences.getDouble(key)!;
102 break;
103 case 'animationSpeed':
104 settings.animationSpeed = sharedPreferences.getInt(key)!;
105 break;
106 case 'confirmDeletion':
107 settings.confirmDeletion = sharedPreferences.getBool(key)!;
108 break;
109 case 'exportFormat':
110 exportSettings.exportFormat = ExportFormat.deserialize(sharedPreferences.getInt(key)!);
111 break;
112 case 'csvFieldDelimiter':
113 csvExportSettings.fieldDelimiter = sharedPreferences.getString(key)!;
114 break;
115 case 'csvTextDelimiter':
116 csvExportSettings.textDelimiter = sharedPreferences.getString(key)!;
117 break;
118 case 'exportMimeType':
119 break;
120 case 'exportCustomEntriesCsv':
121 csvExportSettings.exportFieldsConfiguration.activePreset =
122 sharedPreferences.getBool(key)! ? ExportImportPreset.none : ExportImportPreset.bloodPressureApp;
123 break;
124 case 'exportItemsCsv':
125 // can't be migrated as internalIdentifier changed
126 break;
127 case 'exportCsvHeadline':
128 csvExportSettings.exportHeadline = sharedPreferences.getBool(key)!;
129 break;
130 case 'defaultExportDir':
131 exportSettings.defaultExportDir = sharedPreferences.getString(key)!;
132 break;
133 case 'exportAfterEveryEntry':
134 exportSettings.exportAfterEveryEntry = sharedPreferences.getBool(key)!;
135 break;
136 case 'language':
137 final value = sharedPreferences.getString(key);
138 if (value?.isEmpty ?? true) {
139 settings.language = null;
140 } else {
141 settings.language = Locale(value!);
142 }
143 break;
144 case 'drawRegressionLines':
145 settings.drawRegressionLines = sharedPreferences.getBool(key)!;
146 break;
147 case 'exportPdfHeaderHeight':
148 pdfExportSettings.headerHeight = sharedPreferences.getDouble(key)!;
149 break;
150 case 'exportPdfCellHeight':
151 pdfExportSettings.cellHeight = sharedPreferences.getDouble(key)!;
152 break;
153 case 'exportPdfHeaderFontSize':
154 pdfExportSettings.headerFontSize = sharedPreferences.getDouble(key)!;
155 break;
156 case 'exportPdfCellFontSize':
157 pdfExportSettings.cellFontSize = sharedPreferences.getDouble(key)!;
158 break;
159 case 'exportPdfExportTitle':
160 pdfExportSettings.exportTitle = sharedPreferences.getBool(key)!;
161 break;
162 case 'exportPdfExportStatistics':
163 pdfExportSettings.exportStatistics = sharedPreferences.getBool(key)!;
164 break;
165 case 'exportPdfExportData':
166 pdfExportSettings.exportData = sharedPreferences.getBool(key)!;
167 break;
168 case 'startWithAddMeasurementPage':
169 settings.startWithAddMeasurementPage = sharedPreferences.getBool(key)!;
170 break;
171 case 'exportCustomEntriesPdf':
172 pdfExportSettings.exportFieldsConfiguration.activePreset =
173 sharedPreferences.getBool(key)!
174 ? ExportImportPreset.none : ExportImportPreset.bloodPressureApp;
175 break;
176 case 'exportItemsPdf':
177 // can't be migrated as internalIdentifier changed
178 break;
179 case 'horizontalGraphLines':
180 settings.horizontalGraphLines = sharedPreferences.getStringList(key)!.map((e) =>
181 HorizontalGraphLine.fromJson(jsonDecode(e)),).toList();
182 break;
183 case 'useLegacyList':
184 settings.compactList = sharedPreferences.getBool(key)!;
185 break;
186 case 'lastAppVersion':
187 break;
188 default:
189 assert(false, 'Unexpected property saved: $key with value ${sharedPreferences.get(key)}');
190 break;
191 }
192 futures.add(sharedPreferences.remove(key));
193 }
194 for (final f in futures) {
195 await f;
196 }
197}
198
199/// Migrate to file based settings format from db in pre 1.7.4 (Jul 24).
200Future<void> migrateDatabaseSettings(
201 Settings settings,
202 ExportSettings exportSettings,
203 CsvExportSettings csvExportSettings,
204 PdfExportSettings pdfExportSettings,
205 IntervalStoreManager intervallStoreManager,
206 ExportColumnsManager manager,
207 MedicineRepository medRepo,
208) async {
209 final configDB = await ConfigDB.open();
210 if(configDB == null) return; // not upgradable
211
212 final configDao = ConfigDao(configDB);
213
214 settings.copyFrom(await configDao.loadSettings());
215 exportSettings.copyFrom(await configDao.loadExportSettings());
216 csvExportSettings.copyFrom(await configDao.loadCsvExportSettings());
217 pdfExportSettings.copyFrom(await configDao.loadPdfExportSettings());
218 intervallStoreManager.copyFrom(await configDao.loadIntervalStorageManager());
219 manager.copyFrom(await configDao.loadExportColumnsManager());
220}