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}