Commit c2546a5

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2023-10-06 13:17:47
migrate existing settings to new format
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 59371e2
lib/model/storage/update_legacy_settings.dart
@@ -0,0 +1,186 @@
+import 'dart:convert';
+
+import 'package:blood_pressure_app/model/blood_pressure.dart';
+import 'package:blood_pressure_app/model/horizontal_graph_line.dart';
+import 'package:blood_pressure_app/model/settings_store.dart';
+import 'package:blood_pressure_app/model/storage/export_csv_settings_store.dart';
+import 'package:blood_pressure_app/model/storage/export_pdf_settings_store.dart';
+import 'package:blood_pressure_app/model/storage/export_settings_store.dart';
+import 'package:blood_pressure_app/model/storage/intervall_store.dart';
+import 'package:blood_pressure_app/model/storage/settings_store.dart';
+import 'package:flutter/material.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+
+Future<void> updateLegacySettings(Settings settings, ExportSettings exportSettings, CsvExportSettings csvExportSettings,
+    PdfExportSettings pdfExportSettings, IntervallStoreManager intervallStoreManager) async {
+  SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
+
+  List<Future> futures = [];
+
+  final keys = sharedPreferences.getKeys();
+  for (final key in keys) { // remove these first
+    print(key);
+    switch (key) {
+      case 'age':
+        final age = sharedPreferences.getInt('age') ?? 30;
+        settings.sysWarn = BloodPressureWarnValues.getUpperSysWarnValue(age);
+        settings.diaWarn = BloodPressureWarnValues.getUpperDiaWarnValue(age);
+        await sharedPreferences.remove(key);
+        break;
+      case 'overrideWarnValues':
+      case 'exportLimitDataRange':
+      case 'exportDataRangeStartEpochMs':
+      case 'exportDataRangeEndEpochMs':
+      case 'exportAddableItems':
+      case 'iconSize':
+      case 'titlesCount':
+        await sharedPreferences.remove(key);
+        break;
+      case 'exportCustomEntries':
+        csvExportSettings.exportCustomFields = sharedPreferences.getBool(key)!;
+        await sharedPreferences.remove(key);
+        break;
+      case 'exportItems':
+        csvExportSettings.customFields = sharedPreferences.getStringList(key)!;
+        await sharedPreferences.remove(key);
+        break;
+    }
+  }
+  for (final key in keys) {
+    switch (key) {
+      case 'graphStepSize':
+        intervallStoreManager.mainPage.changeStepSize(TimeStep.deserialize(sharedPreferences.getInt(key)!));
+        intervallStoreManager.statsPage.changeStepSize(TimeStep.deserialize(sharedPreferences.getInt(key)!));
+        intervallStoreManager.exportPage.changeStepSize(TimeStep.deserialize(sharedPreferences.getInt(key)!));
+        break;
+      case 'followSystemDarkMode':
+        settings.followSystemDarkMode = sharedPreferences.getBool(key)!;
+        break;
+      case 'darkMode':
+        settings.darkMode = sharedPreferences.getBool(key)!;
+        break;
+      case 'accentColor':
+        settings.accentColor = createMaterialColor(sharedPreferences.getInt(key)!);
+        break;
+      case 'diaColor':
+        settings.diaColor = createMaterialColor(sharedPreferences.getInt(key)!);
+        break;
+      case 'sysColor':
+        settings.sysColor = createMaterialColor(sharedPreferences.getInt(key)!);
+        break;
+      case 'pulColor':
+        settings.pulColor = createMaterialColor(sharedPreferences.getInt(key)!);
+        break;
+      case 'allowManualTimeInput':
+        settings.allowManualTimeInput = sharedPreferences.getBool(key)!;
+        break;
+      case 'dateFormatString':
+        settings.dateFormatString = sharedPreferences.getString(key)!;
+        break;
+      case 'sysWarn':
+        settings.sysWarn = sharedPreferences.getInt(key)!;
+        break;
+      case 'diaWarn':
+        settings.sysWarn = sharedPreferences.getInt(key)!;
+        break;
+      case 'validateInputs':
+        settings.validateInputs = sharedPreferences.getBool(key)!;
+        break;
+      case 'allowMissingValues':
+        settings.allowMissingValues = sharedPreferences.getBool(key)!;
+        break;
+      case 'graphLineThickness':
+        settings.graphLineThickness = sharedPreferences.getDouble(key)!;
+        break;
+      case 'animationSpeed':
+        settings.animationSpeed = sharedPreferences.getInt(key)!;
+        break;
+      case 'confirmDeletion':
+        settings.confirmDeletion = sharedPreferences.getBool(key)!;
+        break;
+      case 'exportFormat':
+        exportSettings.exportFormat = ExportFormat.deserialize(sharedPreferences.getInt(key)!);
+        break;
+      case 'csvFieldDelimiter':
+        csvExportSettings.fieldDelimiter = sharedPreferences.getString(key)!;
+        break;
+      case 'csvTextDelimiter':
+        csvExportSettings.textDelimiter = sharedPreferences.getString(key)!;
+        break;
+      case 'exportMimeType':
+        break;
+      case 'exportCustomEntriesCsv':
+        csvExportSettings.exportCustomFields = sharedPreferences.getBool(key)!;
+        break;
+      case 'exportItemsCsv':
+        csvExportSettings.customFields = sharedPreferences.getStringList(key)!;
+        break;
+      case 'exportCsvHeadline':
+        csvExportSettings.exportHeadline = sharedPreferences.getBool(key)!;
+        break;
+      case 'defaultExportDir':
+        exportSettings.defaultExportDir = sharedPreferences.getString(key)!;
+        break;
+      case 'exportAfterEveryEntry':
+        exportSettings.exportAfterEveryEntry = sharedPreferences.getBool(key)!;
+        break;
+      case 'language':
+        final value = sharedPreferences.getString(key);
+        if (value?.isEmpty ?? true) {
+          settings.language = null;
+        } else {
+          settings.language = Locale(value!);
+        }
+        break;
+      case 'drawRegressionLines':
+        settings.drawRegressionLines = sharedPreferences.getBool(key)!;
+        break;
+      case 'exportPdfHeaderHeight':
+        pdfExportSettings.headerHeight = sharedPreferences.getDouble(key)!;
+        break;
+      case 'exportPdfCellHeight':
+        pdfExportSettings.cellHeight = sharedPreferences.getDouble(key)!;
+        break;
+      case 'exportPdfHeaderFontSize':
+        pdfExportSettings.headerFontSize = sharedPreferences.getDouble(key)!;
+        break;
+      case 'exportPdfCellFontSize':
+        pdfExportSettings.cellFontSize = sharedPreferences.getDouble(key)!;
+        break;
+      case 'exportPdfExportTitle':
+        pdfExportSettings.exportTitle = sharedPreferences.getBool(key)!;
+        break;
+      case 'exportPdfExportStatistics':
+        pdfExportSettings.exportStatistics = sharedPreferences.getBool(key)!;
+        break;
+      case 'exportPdfExportData':
+        pdfExportSettings.exportData = sharedPreferences.getBool(key)!;
+        break;
+      case 'startWithAddMeasurementPage':
+        settings.startWithAddMeasurementPage = sharedPreferences.getBool(key)!;
+        break;
+      case 'exportCustomEntriesPdf':
+        pdfExportSettings.exportCustomFields = sharedPreferences.getBool(key)!;
+        break;
+      case 'exportItemsPdf':
+        pdfExportSettings.customFields = sharedPreferences.getStringList(key)!;
+        break;
+      case 'horizontalGraphLines':
+        settings.horizontalGraphLines = sharedPreferences.getStringList(key)!.map((e) =>
+            HorizontalGraphLine.fromJson(jsonDecode(e))).toList();
+        break;
+      case 'useLegacyList':
+        settings.useLegacyList = sharedPreferences.getBool(key)!;
+        break;
+      case 'lastAppVersion':
+        break;
+      default:
+        assert(false, 'Unexpected property saved: $key with value ${sharedPreferences.get(key)}');
+        break;
+    }
+    futures.add(sharedPreferences.remove(key));
+  }
+  for (final f in futures) {
+    await f;
+  }
+}
\ No newline at end of file
lib/model/settings_store.dart
@@ -1,675 +1,7 @@
-import 'dart:convert';
-
-import 'package:blood_pressure_app/model/blood_pressure.dart';
-import 'package:blood_pressure_app/model/export_import.dart';
-import 'package:blood_pressure_app/model/export_options.dart';
-import 'package:blood_pressure_app/model/horizontal_graph_line.dart';
-import 'package:file_saver/file_saver.dart' show MimeType;
 import 'package:flutter/material.dart';
-import 'package:flutter_gen/gen_l10n/app_localizations.dart';
-import 'package:package_info_plus/package_info_plus.dart';
-import 'package:shared_preferences/shared_preferences.dart';
 
 // TODO: remove file
 
-class _Settings extends ChangeNotifier {
-
-  late final SharedPreferences _prefs;
-  final PackageInfo _packageInfo;
-
-  DateTime? _displayDataStart;
-  DateTime? _displayDataEnd;
-
-  _Settings._create(this._packageInfo);
-  // factory method, to allow for async constructor
-  static Future<_Settings> create([PackageInfo? packageInfo]) async {
-    final component = _Settings._create(packageInfo ?? (await PackageInfo.fromPlatform()));
-    component._prefs = await SharedPreferences.getInstance();
-    await component._update();
-    return component;
-  }
-
-  Future<void> _update() async {
-    final keys = _prefs.getKeys();
-    List<Future> toAwait = [];
-
-    // delete old keys
-    if (keys.contains('age')) {
-      final lastAge = _prefs.getInt('age') ?? 30;
-      sysWarn = BloodPressureWarnValues.getUpperSysWarnValue(lastAge);
-      diaWarn = BloodPressureWarnValues.getUpperDiaWarnValue(lastAge);
-      toAwait.add(_prefs.remove('age'));
-    }
-    if (keys.contains('overrideWarnValues')) {
-      toAwait.add(_prefs.remove('overrideWarnValues'));
-    }
-    if (keys.contains('exportLimitDataRange')) {
-      toAwait.add(_prefs.remove('exportLimitDataRange'));
-    }
-    if (keys.contains('exportDataRangeStartEpochMs')) {
-      toAwait.add(_prefs.remove('exportDataRangeStartEpochMs'));
-    }
-    if (keys.contains('exportDataRangeEndEpochMs')) {
-      toAwait.add(_prefs.remove('exportDataRangeEndEpochMs'));
-    }
-    if (keys.contains('exportAddableItems')) {
-      toAwait.add(_prefs.remove('exportAddableItems'));
-    }
-    if (keys.contains('exportCustomEntries')) {
-      await _prefs.setBool('exportCustomEntriesCsv', _prefs.getBool('exportCustomEntries') ?? false);
-      toAwait.add(_prefs.remove('exportCustomEntries'));
-    }
-    if (keys.contains('exportItems')) {
-      await _prefs.setStringList('exportItemsCsv', _prefs.getStringList('exportItems') ?? ExportFields.defaultCsv);
-      toAwait.add(_prefs.remove('exportItems'));
-    }
-    if (keys.contains('iconSize')) {
-      toAwait.add(_prefs.remove('iconSize'));
-    }
-    if (keys.contains('titlesCount')) {
-      toAwait.add(_prefs.remove('titlesCount'));
-    }
-
-    // reset variables for new version. Necessary for reusing variable names in new version and avoid having unexpected
-    // breaking values in the preferences
-    switch (_prefs.getInt('lastAppVersion')) {
-      case null:
-        toAwait.add(_prefs.remove('exportCsvHeadline'));
-        toAwait.add(_prefs.remove('exportCustomEntries'));
-        toAwait.add(_prefs.remove('exportItems'));
-        toAwait.add(_prefs.remove('exportMimeType'));
-    }
-
-    for (var e in toAwait) {
-      await e;
-    }
-    await _prefs.setInt('lastAppVersion', int.parse(_packageInfo.buildNumber));
-    return;
-  }
-
-  _TimeStep get graphStepSize {
-    int stepInt = _prefs.getInt('graphStepSize') ?? 0;
-    switch (stepInt) {
-      case 0:
-        return _TimeStep.day;
-      case 1:
-        return _TimeStep.month;
-      case 2:
-        return _TimeStep.year;
-      case 3:
-        return _TimeStep.lifetime;
-      case 4:
-        return _TimeStep.week;
-      case 5:
-        return _TimeStep.last7Days;
-      case 6:
-        return _TimeStep.last30Days;
-      case 7:
-        return _TimeStep.custom;
-    }
-    assert(false);
-    return _TimeStep.day;
-  }
-
-  set graphStepSize(_TimeStep newStepSize) {
-    _prefs.setInt('graphStepSize', ((){
-      switch (newStepSize) {
-        case _TimeStep.day:
-          return 0;
-        case _TimeStep.month:
-          return 1;
-        case _TimeStep.year:
-          return 2;
-        case _TimeStep.lifetime:
-          return 3;
-        case _TimeStep.week:
-          return 4;
-        case _TimeStep.last7Days:
-          return 5;
-        case _TimeStep.last30Days:
-          return 6;
-        case _TimeStep.custom:
-          return 7;
-      }
-    })());
-
-
-    notifyListeners();
-  }
-
-  void changeStepSize(_TimeStep value) {
-    graphStepSize = value;
-    final newInterval = getMostRecentDisplayIntervall();
-    displayDataStart = newInterval[0];
-    displayDataEnd = newInterval[1];
-  }
-
-  void setToMostRecentIntervall() {
-    changeStepSize(graphStepSize);
-  }
-
-  void moveDisplayDataByStep(int directionalStep) {
-    final oldStart = displayDataStart;
-    final oldEnd = displayDataEnd;
-    switch (graphStepSize) {
-      case _TimeStep.day:
-        displayDataStart = oldStart.copyWith(day: oldStart.day + directionalStep);
-        displayDataEnd = oldEnd.copyWith(day: oldEnd.day + directionalStep);
-        break;
-      case _TimeStep.week:
-      case _TimeStep.last7Days:
-        displayDataStart = oldStart.copyWith(day: oldStart.day + directionalStep * 7);
-        displayDataEnd = oldEnd.copyWith(day: oldEnd.day + directionalStep * 7);
-        break;
-      case _TimeStep.month:
-        displayDataStart = oldStart.copyWith(month: oldStart.month + directionalStep);
-        displayDataEnd = oldEnd.copyWith(month: oldEnd.month + directionalStep);
-        break;
-      case _TimeStep.year:
-        displayDataStart = oldStart.copyWith(year: oldStart.year + directionalStep);
-        displayDataEnd = oldEnd.copyWith(year: oldEnd.year + directionalStep);
-        break;
-      case _TimeStep.lifetime:
-        displayDataStart = DateTime.fromMillisecondsSinceEpoch(1);
-        displayDataEnd = DateTime.now().copyWith(hour: 23, minute: 59, second: 59);
-        break;
-      case _TimeStep.last30Days:
-        displayDataStart = oldStart.copyWith(day: oldStart.day + directionalStep * 30);
-        displayDataEnd = oldEnd.copyWith(day: oldEnd.day + directionalStep * 30);
-        break;
-      case _TimeStep.custom:
-        final step = oldEnd.difference(oldStart) * directionalStep;
-        displayDataStart = oldStart.add(step);
-        displayDataEnd = oldEnd.add(step);
-        break;
-    }
-  }
-
-  List<DateTime> getMostRecentDisplayIntervall() {
-    final now = DateTime.now();
-    switch (graphStepSize) {
-      case _TimeStep.day:
-        final start = DateTime(now.year, now.month, now.day);
-        return [start, start.copyWith(day: now.day + 1)];
-      case _TimeStep.week:
-        final start = DateTime(now.year, now.month, now.day - (now.weekday - 1)); // monday
-        return [start, start.copyWith(day: start.day + DateTime.sunday)]; // end of sunday
-      case _TimeStep.month:
-        final start = DateTime(now.year, now.month);
-        return [start, start.copyWith(month: now.month + 1)];
-      case _TimeStep.year:
-        final start = DateTime(now.year);
-        return [start, start.copyWith(year: now.year + 1)];
-      case _TimeStep.lifetime:
-        final start = DateTime.fromMillisecondsSinceEpoch(1);
-        final endOfToday = now.copyWith(hour: 23, minute: 59, second: 59);
-        return [start, endOfToday];
-      case _TimeStep.last7Days:
-        final start = now.copyWith(day: now.day - 7);
-        final endOfToday = now.copyWith(hour: 23, minute: 59, second: 59);
-        return [start, endOfToday];
-      case _TimeStep.last30Days:
-        final start = now.copyWith(day: now.day - 30);
-        final endOfToday = now.copyWith(hour: 23, minute: 59, second: 59);
-        return [start, endOfToday];
-      case _TimeStep.custom:
-        // fallback, _TimeStep will be reset by getter
-        return [DateTime.fromMillisecondsSinceEpoch(-1), DateTime.fromMillisecondsSinceEpoch(-1)];
-    }
-  }
-
-  DateTime get displayDataStart {
-    final s = _displayDataStart ?? getMostRecentDisplayIntervall()[0];
-    if(s.millisecondsSinceEpoch < 1) {
-      changeStepSize(_TimeStep.last7Days);
-    }
-    return s;
-  }
-
-  set displayDataStart(DateTime newGraphStart) {
-    _displayDataStart = newGraphStart;
-    notifyListeners();
-  }
-
-  DateTime get displayDataEnd {
-    final s = _displayDataEnd ?? getMostRecentDisplayIntervall()[1];
-    if(s.millisecondsSinceEpoch < 1) {
-      changeStepSize(_TimeStep.last7Days);
-    }
-    return s;
-  }
-
-  set displayDataEnd(DateTime newGraphEnd) {
-    _displayDataEnd = newGraphEnd;
-    notifyListeners();
-  }
-
-  bool get followSystemDarkMode {
-    return _prefs.getBool('followSystemDarkMode') ?? true;
-  }
-
-  set followSystemDarkMode(bool newSetting) {
-    _prefs.setBool('followSystemDarkMode', newSetting);
-    notifyListeners();
-  }
-
-  bool get darkMode {
-    return _prefs.getBool('darkMode') ?? true;
-  }
-
-  set darkMode(bool newSetting) {
-    _prefs.setBool('darkMode', newSetting);
-    notifyListeners();
-  }
-
-  MaterialColor get accentColor {
-    return createMaterialColor(_prefs.getInt('accentColor') ?? 0xFF009688);
-  }
-
-  set accentColor(MaterialColor newColor) {
-    _prefs.setInt('accentColor', newColor.value);
-    notifyListeners();
-  }
-
-  MaterialColor get diaColor {
-    return createMaterialColor(_prefs.getInt('diaColor') ?? 0xFF4CAF50);
-  }
-
-  set diaColor(MaterialColor newColor) {
-    _prefs.setInt('diaColor', newColor.value);
-    notifyListeners();
-  }
-
-  MaterialColor get sysColor {
-    return createMaterialColor(_prefs.getInt('sysColor') ?? 0xFF009688);
-  }
-
-  set sysColor(MaterialColor newColor) {
-    _prefs.setInt('sysColor', newColor.value);
-    notifyListeners();
-  }
-
-  MaterialColor get pulColor {
-    return createMaterialColor(_prefs.getInt('pulColor') ?? 0xFFF44336);
-  }
-
-  set pulColor(MaterialColor newColor) {
-    _prefs.setInt('pulColor', newColor.value);
-    notifyListeners();
-  }
-
-  bool get allowManualTimeInput {
-    return _prefs.getBool('allowManualTimeInput') ?? true;
-  }
-
-  set allowManualTimeInput(bool newSetting) {
-    _prefs.setBool('allowManualTimeInput', newSetting);
-    notifyListeners();
-  }
-
-  String get dateFormatString {
-    return _prefs.getString('dateFormatString') ?? 'yyyy-MM-dd  HH:mm';
-  }
-
-  set dateFormatString(String newFormatString) {
-    _prefs.setString('dateFormatString', newFormatString);
-    notifyListeners();
-  }
-
-  int get sysWarn {
-    return _prefs.getInt('sysWarn') ?? 120;
-  }
-
-  set sysWarn(int newWarn) {
-    _prefs.setInt('sysWarn', newWarn);
-    notifyListeners();
-  }
-
-  int get diaWarn {
-    return _prefs.getInt('diaWarn') ?? 80;
-  }
-
-  set diaWarn(int newWarn) {
-    _prefs.setInt('diaWarn', newWarn);
-    notifyListeners();
-  }
-
-  bool get validateInputs {
-    return _prefs.getBool('validateInputs') ?? true;
-  }
-
-  set validateInputs(bool validateInputs) {
-    _prefs.setBool('validateInputs', validateInputs);
-    notifyListeners();
-  }
-
-  bool get allowMissingValues {
-    return _prefs.getBool('allowMissingValues') ?? false;
-  }
-
-  set allowMissingValues(bool allowMissingValues) {
-    _prefs.setBool('allowMissingValues', allowMissingValues);
-    notifyListeners();
-  }
-
-  double get graphLineThickness {
-    return _prefs.getDouble('graphLineThickness') ?? 3;
-  }
-
-  set graphLineThickness(double newThickness) {
-    _prefs.setDouble('graphLineThickness', newThickness);
-    notifyListeners();
-  }
-
-  int get animationSpeed {
-    return _prefs.getInt('animationSpeed') ?? 150;
-  }
-
-  set animationSpeed(int newSpeed) {
-    _prefs.setInt('animationSpeed', newSpeed);
-    notifyListeners();
-  }
-
-  bool get confirmDeletion {
-    return _prefs.getBool('confirmDeletion') ?? true;
-  }
-
-  set confirmDeletion(bool confirmDeletion) {
-    _prefs.setBool('confirmDeletion', confirmDeletion);
-    notifyListeners();
-  }
-
-  ExportFormat get exportFormat {
-    switch (_prefs.getInt('exportFormat') ?? 0) {
-      case 0:
-        return ExportFormat.csv;
-      case 1:
-        return ExportFormat.pdf;
-      case 2:
-        return ExportFormat.db;
-      default:
-        assert(false);
-        return ExportFormat.csv;
-    }
-  }
-
-  set exportFormat(ExportFormat format) {
-    switch (format) {
-      case ExportFormat.csv:
-        _prefs.setInt('exportFormat', 0);
-        break;
-      case ExportFormat.pdf:
-        _prefs.setInt('exportFormat', 1);
-        break;
-      case ExportFormat.db:
-        _prefs.setInt('exportFormat', 2);
-        break;
-      default:
-        assert(false);
-    }
-    notifyListeners();
-  }
-
-  String get csvFieldDelimiter {
-    return _prefs.getString('csvFieldDelimiter') ?? ',';
-  }
-
-  set csvFieldDelimiter(String value) {
-    _prefs.setString('csvFieldDelimiter', value);
-    notifyListeners();
-  }
-
-  String get csvTextDelimiter {
-    return _prefs.getString('csvTextDelimiter') ?? '"';
-  }
-
-  set csvTextDelimiter(String value) {
-    _prefs.setString('csvTextDelimiter', value);
-    notifyListeners();
-  }
-
-  MimeType get exportMimeType {
-    switch (_prefs.getInt('exportMimeType') ?? 0) {
-      case 0:
-        return MimeType.csv;
-      case 1:
-        return MimeType.text;
-      case 2:
-        return MimeType.pdf;
-      case 3:
-        return MimeType.other;
-      default:
-        throw UnimplementedError();
-    }
-  }
-  set exportMimeType(MimeType value) {
-    switch (value) {
-      case MimeType.csv:
-        _prefs.setInt('exportMimeType', 0);
-        break;
-      case MimeType.text:
-        _prefs.setInt('exportMimeType', 1);
-        break;
-      case MimeType.pdf:
-        _prefs.setInt('exportMimeType', 2);
-        break;
-      case MimeType.other:
-        _prefs.setInt('exportMimeType', 3);
-        break;
-      default:
-        throw UnimplementedError();
-    }
-    notifyListeners();
-  }
-
-  bool get exportCustomEntriesCsv {
-    return _prefs.getBool('exportCustomEntriesCsv') ?? false;
-  }
-
-  set exportCustomEntriesCsv(bool value) {
-    _prefs.setBool('exportCustomEntriesCsv', value);
-    notifyListeners();
-  }
-
-  List<String> get exportItemsCsv {
-    return _prefs.getStringList('exportItemsCsv') ?? ExportFields.defaultCsv;
-  }
-
-  set exportItemsCsv(List<String> value) {
-    _prefs.setStringList('exportItemsCsv', value);
-    notifyListeners();
-  }
-
-  bool get exportCsvHeadline {
-    return _prefs.getBool('exportCsvHeadline') ?? true;
-  }
-
-  set exportCsvHeadline(bool value) {
-    _prefs.setBool('exportCsvHeadline', value);
-    notifyListeners();
-  }
-
-  String get defaultExportDir {
-    return _prefs.getString('defaultExportDir') ?? '';
-  }
-  set defaultExportDir (String value) {
-    _prefs.setString('defaultExportDir', value);
-    notifyListeners();
-  }
-
-  bool get exportAfterEveryEntry {
-    return _prefs.getBool('exportAfterEveryEntry') ?? false;
-  }
-
-  set exportAfterEveryEntry(bool value) {
-    _prefs.setBool('exportAfterEveryEntry', value);
-    notifyListeners();
-  }
-
-  Locale? get language {
-    final value = _prefs.getString('language');
-    if (value?.isEmpty ?? true) return null;
-    return Locale(value ?? 'en');
-  }
-
-  set language (Locale? value) {
-    _prefs.setString('language', value?.languageCode ?? '');
-    notifyListeners();
-  }
-
-  bool get drawRegressionLines {
-    return _prefs.getBool('drawRegressionLines') ?? false;
-  }
-
-  set drawRegressionLines(bool value) {
-    _prefs.setBool('drawRegressionLines', value);
-    notifyListeners();
-  }
-
-  double get exportPdfHeaderHeight {
-    return _prefs.getDouble('exportPdfHeaderHeight') ?? 20;
-  }
-
-  set exportPdfHeaderHeight(double value) {
-    _prefs.setDouble('exportPdfHeaderHeight', value);
-    notifyListeners();
-  }
-  double get exportPdfCellHeight {
-    return _prefs.getDouble('exportPdfCellHeight') ?? 15;
-  }
-
-  set exportPdfCellHeight(double value) {
-    _prefs.setDouble('exportPdfCellHeight', value);
-    notifyListeners();
-  }
-
-  double get exportPdfHeaderFontSize {
-    return _prefs.getDouble('exportPdfHeaderFontSize') ?? 10;
-  }
-
-  set exportPdfHeaderFontSize(double value) {
-    _prefs.setDouble('exportPdfHeaderFontSize', value);
-    notifyListeners();
-  }
-
-  double get exportPdfCellFontSize {
-    return _prefs.getDouble('exportPdfCellFontSize') ?? 8;
-  }
-
-  set exportPdfCellFontSize(double value) {
-    _prefs.setDouble('exportPdfCellFontSize', value);
-    notifyListeners();
-  }
-
-  bool get exportPdfExportTitle {
-    return _prefs.getBool('exportPdfExportTitle') ?? true;
-  }
-
-  set exportPdfExportTitle(bool value) {
-    _prefs.setBool('exportPdfExportTitle', value);
-    notifyListeners();
-  }
-
-  bool get exportPdfExportStatistics {
-    return _prefs.getBool('exportPdfExportStatistics') ?? false;
-  }
-
-  set exportPdfExportStatistics(bool value) {
-    _prefs.setBool('exportPdfExportStatistics', value);
-    notifyListeners();
-  }
-
-  /// whether to add a section with all entries to pdf export
-  bool get exportPdfExportData {
-    return _prefs.getBool('exportPdfExportData') ?? true;
-  }
-
-  set exportPdfExportData(bool value) {
-    _prefs.setBool('exportPdfExportData', value);
-    notifyListeners();
-  }
-
-  bool get startWithAddMeasurementPage {
-    return _prefs.getBool('startWithAddMeasurementPage') ?? false;
-  }
-
-  set startWithAddMeasurementPage(bool value) {
-    _prefs.setBool('startWithAddMeasurementPage', value);
-    notifyListeners();
-  }
-
-  bool get exportCustomEntriesPdf {
-    return _prefs.getBool('exportCustomEntriesPdf') ?? false;
-  }
-
-  set exportCustomEntriesPdf(bool value) {
-    _prefs.setBool('exportCustomEntriesPdf', value);
-    notifyListeners();
-  }
-
-  List<String> get exportItemsPdf {
-    return _prefs.getStringList('exportItemsPdf') ?? ExportFields.defaultPdf;
-  }
-
-  set exportItemsPdf(List<String> value) {
-    _prefs.setStringList('exportItemsPdf', value);
-    notifyListeners();
-  }
-
-  Iterable<HorizontalGraphLine> get horizontalGraphLines {
-    final linesStr = _prefs.getStringList('horizontalGraphLines') ?? [];
-    return linesStr.map((e) => HorizontalGraphLine.fromJson(jsonDecode(e)));
-  }
-
-  set horizontalGraphLines(Iterable<HorizontalGraphLine> value) {
-    _prefs.setStringList('horizontalGraphLines', value.map((e) => jsonEncode(e)).toList());
-    notifyListeners();
-  }
-
-  bool get useLegacyList {
-    return _prefs.getBool('useLegacyList') ?? false;
-  }
-
-  set useLegacyList(bool value) {
-    _prefs.setBool('useLegacyList', value);
-    notifyListeners();
-  }
-}
-
-enum _TimeStep {
-  day,
-  month,
-  year,
-  lifetime,
-  week,
-  last7Days,
-  last30Days,
-  custom;
-
-  static const options = [_TimeStep.day, _TimeStep.week, _TimeStep.month, _TimeStep.year, _TimeStep.lifetime, _TimeStep.last7Days, _TimeStep.last30Days, _TimeStep.custom];
-
-  static String getName(_TimeStep opt, BuildContext context) {
-    switch (opt) {
-      case _TimeStep.day:
-        return AppLocalizations.of(context)!.day;
-      case _TimeStep.month:
-        return AppLocalizations.of(context)!.month;
-      case _TimeStep.year:
-        return AppLocalizations.of(context)!.year;
-      case _TimeStep.lifetime:
-        return AppLocalizations.of(context)!.lifetime;
-      case _TimeStep.week:
-        return AppLocalizations.of(context)!.week;
-      case _TimeStep.last7Days:
-        return AppLocalizations.of(context)!.last7Days;
-      case _TimeStep.last30Days:
-        return AppLocalizations.of(context)!.last30Days;
-      case _TimeStep.custom:
-        return AppLocalizations.of(context)!.custom;
-    }
-  }
-}
-
 MaterialColor createMaterialColor(int value) { // TODO: remove
   final color = Color(value);
   List strengths = <double>[.05];
lib/main.dart
@@ -1,9 +1,9 @@
 import 'package:blood_pressure_app/model/blood_pressure.dart';
-import 'package:blood_pressure_app/model/settings_store.dart';
 import 'package:blood_pressure_app/model/storage/db/config_dao.dart';
 import 'package:blood_pressure_app/model/storage/db/config_db.dart';
 import 'package:blood_pressure_app/model/storage/intervall_store.dart';
 import 'package:blood_pressure_app/model/storage/settings_store.dart';
+import 'package:blood_pressure_app/model/storage/update_legacy_settings.dart';
 import 'package:blood_pressure_app/screens/home.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
@@ -20,7 +20,6 @@ void main() async {
   // 2 different db files
   final dataModel = await BloodPressureModel.create();
 
-  // TODO:
   final configDB = await ConfigDB.open();
   final configDao = ConfigDao(configDB);
 
@@ -30,7 +29,7 @@ void main() async {
   final pdfExportSettings = await configDao.loadPdfExportSettings(0);
   final intervalStorageManager = await IntervallStoreManager.load(configDao, 0);
 
-  // TODO: old settings migration
+  await updateLegacySettings(settings, exportSettings, csvExportSettings, pdfExportSettings, intervalStorageManager);
 
   globalConfigDao = configDao;