From 1490394a764226f1cb97058cd3e1408d7a83eda5 Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Tue, 17 Nov 2020 17:37:30 -0500 Subject: [PATCH 1/6] Added Hive database --- mobile/lib/src/app.dart | 6 ++ .../sleep_sequence_history_cubit.dart | 14 +-- mobile/lib/src/databse.dart | 12 +++ .../hive_sleep_sequence_stats.dart | 44 +++++++++ .../i_sleep_sequence_repository.dart | 2 + .../sleep_sequence/sleep_sequence_stats.dart | 4 +- .../eeg_data_repository.dart | 5 +- mobile/lib/src/infrastructure/constants.dart | 3 + .../sleep_history/mock_data.dart | 8 +- .../mock_sleep_sequence_repository.dart | 31 ++++++ .../sleep_history_repository.dart | 26 ----- .../sleep_squence_repository.dart | 94 +++++++++++++++++++ mobile/lib/src/locator.dart | 4 +- mobile/pubspec.lock | 38 +++++++- mobile/pubspec.yaml | 3 + 15 files changed, 247 insertions(+), 47 deletions(-) create mode 100644 mobile/lib/src/databse.dart create mode 100644 mobile/lib/src/domain/sleep_sequence/hive_sleep_sequence_stats.dart create mode 100644 mobile/lib/src/infrastructure/sleep_history/mock_sleep_sequence_repository.dart delete mode 100644 mobile/lib/src/infrastructure/sleep_history/sleep_history_repository.dart create mode 100644 mobile/lib/src/infrastructure/sleep_history/sleep_squence_repository.dart diff --git a/mobile/lib/src/app.dart b/mobile/lib/src/app.dart index f5a40f5f..328f44d2 100644 --- a/mobile/lib/src/app.dart +++ b/mobile/lib/src/app.dart @@ -1,6 +1,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:polydodo/src/databse.dart'; import 'locator.dart'; import 'presentation/navigation/routes/router.gr.dart' as auto_router; @@ -8,6 +9,11 @@ import 'theme.dart'; class App extends StatelessWidget { App() { + init(); + } + + void init() async { + await initDatabase(); registerServices(); } diff --git a/mobile/lib/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart b/mobile/lib/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart index e31c5ad8..49e289f5 100644 --- a/mobile/lib/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart +++ b/mobile/lib/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart @@ -8,7 +8,7 @@ import 'package:polydodo/src/domain/sleep_sequence/sleep_sequence_stats.dart'; import 'sleep_sequence_history_state.dart'; class SleepSequenceHistoryCubit extends Cubit { - final ISleepSequenceRepository _sleepHistoryRepository; + final ISleepSequenceRepository _sleepSequenceRepository; final SleepSequenceStatsCubit _sleepSequenceStatsCubit; final StreamController _selectText = StreamController.broadcast(); @@ -16,14 +16,14 @@ class SleepSequenceHistoryCubit extends Cubit { List _selectedSequences; SleepSequenceHistoryCubit( - this._sleepHistoryRepository, this._sleepSequenceStatsCubit) + this._sleepSequenceRepository, this._sleepSequenceStatsCubit) : super(SleepSequenceHistoryInitial()) { loadHistory(); } void loadHistory() { emit(SleepSequenceHistoryLoaded( - _sleepHistoryRepository.getSleepSequences())); + _sleepSequenceRepository.getSleepSequences())); } void loadSleepSequence(SleepSequenceStats sequence) { @@ -42,14 +42,14 @@ class SleepSequenceHistoryCubit extends Cubit { _selectedSequences = []; _selectText.add('Done'); emit(SleepSequenceHistoryEditInProgress( - _sleepHistoryRepository.getSleepSequences(), _selectedSequences)); + _sleepSequenceRepository.getSleepSequences(), _selectedSequences)); } void _disableSelection() { _selectedSequences = null; _selectText.add('Select'); emit(SleepSequenceHistoryLoaded( - _sleepHistoryRepository.getSleepSequences())); + _sleepSequenceRepository.getSleepSequences())); } void toggleSelectSequenceForDeletion(SleepSequenceStats sequence) { @@ -60,11 +60,11 @@ class SleepSequenceHistoryCubit extends Cubit { } emit(SleepSequenceHistoryEditInProgress( - _sleepHistoryRepository.getSleepSequences(), _selectedSequences)); + _sleepSequenceRepository.getSleepSequences(), _selectedSequences)); } void deleteSelected() { - _sleepHistoryRepository.deleteSleepSequences(_selectedSequences); + _sleepSequenceRepository.deleteSleepSequences(_selectedSequences); _disableSelection(); } diff --git a/mobile/lib/src/databse.dart b/mobile/lib/src/databse.dart new file mode 100644 index 00000000..f971c435 --- /dev/null +++ b/mobile/lib/src/databse.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:polydodo/src/domain/sleep_sequence/hive_sleep_sequence_stats.dart'; + +Future initDatabase() async { + WidgetsFlutterBinding.ensureInitialized(); + var appDocDir = await getApplicationDocumentsDirectory(); + await Hive.initFlutter(appDocDir.path + '/hive'); + Hive.registerAdapter(HiveSleepSequenceStatsAdapter()); +} diff --git a/mobile/lib/src/domain/sleep_sequence/hive_sleep_sequence_stats.dart b/mobile/lib/src/domain/sleep_sequence/hive_sleep_sequence_stats.dart new file mode 100644 index 00000000..72f0a450 --- /dev/null +++ b/mobile/lib/src/domain/sleep_sequence/hive_sleep_sequence_stats.dart @@ -0,0 +1,44 @@ +import 'package:hive/hive.dart'; + +part 'hive_sleep_sequence_stats.g.dart'; // Name of the TypeAdapter that we will generate in the future + +@HiveType(typeId: 1) +class HiveSleepSequenceStats { + @HiveField(0) + DateTime recordingStart; + + @HiveField(1) + DateTime recordingEnd; + + @HiveField(2) + double effectiveSleepTime; + + @HiveField(3) + double sleepEfficiency; + + @HiveField(4) + int sleepLatency; + + @HiveField(5) + double waso; + + @HiveField(6) + int awakenings; + + @HiveField(7) + int remLatency; + + @HiveField(8) + int numberTransitions; + + HiveSleepSequenceStats( + this.recordingStart, + this.recordingEnd, + this.effectiveSleepTime, + this.sleepEfficiency, + this.sleepLatency, + this.waso, + this.awakenings, + this.remLatency, + this.numberTransitions); +} diff --git a/mobile/lib/src/domain/sleep_sequence/i_sleep_sequence_repository.dart b/mobile/lib/src/domain/sleep_sequence/i_sleep_sequence_repository.dart index 53001468..7670a7fb 100644 --- a/mobile/lib/src/domain/sleep_sequence/i_sleep_sequence_repository.dart +++ b/mobile/lib/src/domain/sleep_sequence/i_sleep_sequence_repository.dart @@ -3,5 +3,7 @@ import 'package:polydodo/src/domain/sleep_sequence/sleep_sequence_stats.dart'; abstract class ISleepSequenceRepository { List getSleepSequences(); + void addSleepSequence(SleepSequenceStats sequence); + void deleteSleepSequences(List sequence); } diff --git a/mobile/lib/src/domain/sleep_sequence/sleep_sequence_stats.dart b/mobile/lib/src/domain/sleep_sequence/sleep_sequence_stats.dart index 18ed13ee..666254cf 100644 --- a/mobile/lib/src/domain/sleep_sequence/sleep_sequence_stats.dart +++ b/mobile/lib/src/domain/sleep_sequence/sleep_sequence_stats.dart @@ -4,10 +4,10 @@ import 'package:flutter/foundation.dart'; class SleepSequenceStats extends Entity { final DateTimeRange recordingTime; - final DateTime effectiveSleepTime; + final double effectiveSleepTime; final double sleepEfficiency; final int sleepLatency; - final DateTime waso; + final double waso; final int awakenings; final int remLatency; final int numberTransitions; diff --git a/mobile/lib/src/infrastructure/connection_repositories/eeg_data_repository.dart b/mobile/lib/src/infrastructure/connection_repositories/eeg_data_repository.dart index 156cd279..fa2d74b3 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/eeg_data_repository.dart +++ b/mobile/lib/src/infrastructure/connection_repositories/eeg_data_repository.dart @@ -57,11 +57,14 @@ class EEGDataRepository implements IEEGDataRepository { @override Future stopRecordingFromStream() async { - // todo: move save future to another file unawaited(_currentTransformerStream.cancel()); if (_recordingData == null) return; + _saveRecordingToFile(); + } + + void _saveRecordingToFile() async { final directory = await getExternalStorageDirectory(); final pathOfTheFileToWrite = directory.path + '/' + _recordingData.fileName + '.txt'; diff --git a/mobile/lib/src/infrastructure/constants.dart b/mobile/lib/src/infrastructure/constants.dart index 58ebdd21..b147e28c 100644 --- a/mobile/lib/src/infrastructure/constants.dart +++ b/mobile/lib/src/infrastructure/constants.dart @@ -75,3 +75,6 @@ const OPEN_BCI_CYTON_HEADER = [ ' Timestamp (Formatted)' ] ]; + +const POLYDODO_BOX = 'Polydodo'; +const SLEEP_SEQUENCES_LIST_KEY = 'sequence_list'; diff --git a/mobile/lib/src/infrastructure/sleep_history/mock_data.dart b/mobile/lib/src/infrastructure/sleep_history/mock_data.dart index f4719e87..ed769b51 100644 --- a/mobile/lib/src/infrastructure/sleep_history/mock_data.dart +++ b/mobile/lib/src/infrastructure/sleep_history/mock_data.dart @@ -5,21 +5,21 @@ import 'package:polydodo/src/domain/unique_id.dart'; SleepSequenceStats mock_data_1 = SleepSequenceStats( id: UniqueId.from('test'), awakenings: 3, - effectiveSleepTime: DateTime.now(), + effectiveSleepTime: 80.0, numberTransitions: 5, recordingTime: DateTimeRange(start: DateTime.now(), end: DateTime.now()), remLatency: 20, sleepEfficiency: 20.0, sleepLatency: 10, - waso: DateTime.now()); + waso: 80.0); SleepSequenceStats mock_data_2 = SleepSequenceStats( id: UniqueId.from('test2'), awakenings: 100, - effectiveSleepTime: DateTime.now(), + effectiveSleepTime: 100.0, numberTransitions: 5, recordingTime: DateTimeRange(start: DateTime.now(), end: DateTime.now()), remLatency: 20, sleepEfficiency: 20.0, sleepLatency: 10, - waso: DateTime.now()); + waso: 100.0); diff --git a/mobile/lib/src/infrastructure/sleep_history/mock_sleep_sequence_repository.dart b/mobile/lib/src/infrastructure/sleep_history/mock_sleep_sequence_repository.dart new file mode 100644 index 00000000..a2f85bb7 --- /dev/null +++ b/mobile/lib/src/infrastructure/sleep_history/mock_sleep_sequence_repository.dart @@ -0,0 +1,31 @@ +import 'dart:async'; + +import 'package:polydodo/src/domain/sleep_sequence/i_sleep_sequence_repository.dart'; +import 'package:polydodo/src/domain/sleep_sequence/sleep_sequence_stats.dart'; +import 'package:polydodo/src/infrastructure/sleep_history/mock_data.dart'; + +class MockSleepSequenceRepository implements ISleepSequenceRepository { + final List _sleepSequencesPersistency = []; + final sequenceStreamController = StreamController(); + + MockSleepSequenceRepository() { + _sleepSequencesPersistency.add(mock_data_1); + + _sleepSequencesPersistency.add(mock_data_2); + } + + @override + List getSleepSequences() => _sleepSequencesPersistency; + + @override + void addSleepSequence(SleepSequenceStats sequence) { + _sleepSequencesPersistency.add(sequence); + } + + @override + void deleteSleepSequences(List sequences) { + for (var sequence in sequences) { + _sleepSequencesPersistency.remove(sequence); + } + } +} diff --git a/mobile/lib/src/infrastructure/sleep_history/sleep_history_repository.dart b/mobile/lib/src/infrastructure/sleep_history/sleep_history_repository.dart deleted file mode 100644 index 4ead4c9e..00000000 --- a/mobile/lib/src/infrastructure/sleep_history/sleep_history_repository.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'dart:async'; - -import 'package:polydodo/src/domain/sleep_sequence/i_sleep_sequence_repository.dart'; -import 'package:polydodo/src/domain/sleep_sequence/sleep_sequence_stats.dart'; -import 'package:polydodo/src/infrastructure/sleep_history/mock_data.dart'; - -class SleepHistoryRepository implements ISleepSequenceRepository { - final List _sleepHistoryPersistency = []; - final sequenceStreamController = StreamController(); - - SleepHistoryRepository() { - _sleepHistoryPersistency.add(mock_data_1); - - _sleepHistoryPersistency.add(mock_data_2); - } - - @override - List getSleepSequences() => _sleepHistoryPersistency; - - @override - void deleteSleepSequences(List sequences) { - for (var sequence in sequences) { - _sleepHistoryPersistency.remove(sequence); - } - } -} diff --git a/mobile/lib/src/infrastructure/sleep_history/sleep_squence_repository.dart b/mobile/lib/src/infrastructure/sleep_history/sleep_squence_repository.dart new file mode 100644 index 00000000..cee9e6b9 --- /dev/null +++ b/mobile/lib/src/infrastructure/sleep_history/sleep_squence_repository.dart @@ -0,0 +1,94 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:polydodo/src/domain/sleep_sequence/hive_sleep_sequence_stats.dart'; +import 'package:polydodo/src/domain/sleep_sequence/i_sleep_sequence_repository.dart'; +import 'package:polydodo/src/domain/sleep_sequence/sleep_sequence_stats.dart'; +import 'package:polydodo/src/domain/unique_id.dart'; +import 'package:polydodo/src/infrastructure/constants.dart'; + +class SleepSequenceRepository implements ISleepSequenceRepository { + final List _sleepSequencesPersistency = []; + final sequenceStreamController = StreamController(); + Box _sleepSequencesListBox; + + SleepSequenceRepository() { + _loadSleepSequences(); + } + + void _loadSleepSequences() async { + _sleepSequencesListBox = await Hive.openBox(POLYDODO_BOX); + + var sequenceList = _sleepSequencesListBox.get(SLEEP_SEQUENCES_LIST_KEY); + print(sequenceList); + + if (sequenceList != null) { + _sleepSequencesPersistency + .addAll(_parseHiveSleepSequenceList(sequenceList)); + } + } + + @override + List getSleepSequences() => _sleepSequencesPersistency; + + @override + void addSleepSequence(SleepSequenceStats sequence) { + _sleepSequencesPersistency.add(sequence); + + _saveSleepSequences(); + } + + @override + void deleteSleepSequences(List sequences) { + for (var sequence in sequences) { + _sleepSequencesPersistency.remove(sequence); + } + } + + void _saveSleepSequences() { + _sleepSequencesListBox.put(SLEEP_SEQUENCES_LIST_KEY, + _parseSleepSequenceList(_sleepSequencesPersistency)); + } + + List _parseHiveSleepSequenceList(var historyList) { + // ignore: omit_local_variable_types + List list = []; + for (var sequence in historyList) { + list.add(SleepSequenceStats( + id: UniqueId.from(sequence.recordingStart.toString()), + awakenings: sequence.awakenings, + effectiveSleepTime: sequence.effectiveSleepTime, + numberTransitions: sequence.numberTransitions, + recordingTime: DateTimeRange( + start: sequence.recordingStart, end: sequence.recordingEnd), + remLatency: sequence.remLatency, + sleepEfficiency: sequence.sleepEfficiency, + sleepLatency: sequence.sleepLatency, + waso: sequence.waso)); + } + + return list; + } + + List _parseSleepSequenceList( + List historyList) { + // ignore: omit_local_variable_types + List list = []; + + for (var sequence in historyList) { + list.add(HiveSleepSequenceStats( + sequence.recordingTime.start, + sequence.recordingTime.end, + sequence.effectiveSleepTime, + sequence.sleepEfficiency, + sequence.sleepLatency, + sequence.waso, + sequence.awakenings, + sequence.remLatency, + sequence.numberTransitions)); + } + + return list; + } +} diff --git a/mobile/lib/src/locator.dart b/mobile/lib/src/locator.dart index 7a0f1be4..77627ab0 100644 --- a/mobile/lib/src/locator.dart +++ b/mobile/lib/src/locator.dart @@ -9,7 +9,7 @@ import 'package:polydodo/src/domain/eeg_data/i_eeg_data_repository.dart'; import 'package:polydodo/src/domain/sleep_sequence/i_sleep_sequence_repository.dart'; import 'package:polydodo/src/infrastructure/connection_repositories/acquisition_device_repository.dart'; import 'package:polydodo/src/infrastructure/connection_repositories/eeg_data_repository.dart'; -import 'package:polydodo/src/infrastructure/sleep_history/sleep_history_repository.dart'; +import 'package:polydodo/src/infrastructure/sleep_history/sleep_squence_repository.dart'; /// Private GetIt instance as we want all DI to be performed here in this file final _serviceLocator = GetIt.asNewInstance(); @@ -19,7 +19,7 @@ void registerServices() { AcquisitionDeviceRepository()); _serviceLocator.registerSingleton(EEGDataRepository()); _serviceLocator - .registerSingleton(SleepHistoryRepository()); + .registerSingleton(SleepSequenceRepository()); } /// This function creates all the BlocProviders used in this app diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index d038824d..eb3ce0e1 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -225,6 +225,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.9" + dartx: + dependency: transitive + description: + name: dartx + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.0" equatable: dependency: "direct main" description: @@ -271,7 +278,7 @@ packages: name: flutter_bloc url: "https://pub.dartlang.org" source: hosted - version: "6.0.6" + version: "6.1.1" flutter_launcher_icons: dependency: "direct dev" description: @@ -285,7 +292,7 @@ packages: name: flutter_reactive_ble url: "https://pub.dartlang.org" source: hosted - version: "2.6.1+1" + version: "2.7.1" flutter_test: dependency: "direct dev" description: flutter @@ -331,6 +338,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.4.4+1" + hive_flutter: + dependency: "direct main" + description: + name: hive_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" + hive_generator: + dependency: "direct dev" + description: + name: hive_generator + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.2" http_multi_server: dependency: transitive description: @@ -351,7 +372,7 @@ packages: name: image url: "https://pub.dartlang.org" source: hosted - version: "2.1.18" + version: "2.1.19" intl: dependency: "direct main" description: @@ -568,7 +589,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.1.4+1" + version: "2.1.5" share: dependency: "direct main" description: @@ -700,6 +721,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.19-nullsafety.2" + time: + dependency: transitive + description: + name: time + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" timing: dependency: transitive description: @@ -755,7 +783,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "1.7.3" + version: "1.7.4" xdg_directories: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index a1ab84b4..4925c1d7 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -35,6 +35,7 @@ dependencies: flutter_reactive_ble: ^2.5.2 get_it: ^4.0.4 hive: ^1.4.4 + hive_flutter: ^0.3.1 intl: ^0.16.1 meta: ^1.1.8 path_provider: ^1.6.16 @@ -51,6 +52,8 @@ dev_dependencies: flutter_launcher_icons: "^0.7.0" flutter_test: sdk: flutter + hive_generator: ^0.8.2 + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec # The following section is specific to Flutter. From e8b56abf0d3116fb7cb58c15400c87479bd45713 Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Tue, 17 Nov 2020 17:40:44 -0500 Subject: [PATCH 2/6] Renamed folder --- ...p_squence_repository.dart => sleep_sequence_repository.dart} | 0 mobile/lib/src/locator.dart | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename mobile/lib/src/infrastructure/sleep_history/{sleep_squence_repository.dart => sleep_sequence_repository.dart} (100%) diff --git a/mobile/lib/src/infrastructure/sleep_history/sleep_squence_repository.dart b/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart similarity index 100% rename from mobile/lib/src/infrastructure/sleep_history/sleep_squence_repository.dart rename to mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart diff --git a/mobile/lib/src/locator.dart b/mobile/lib/src/locator.dart index 77627ab0..d5ce4103 100644 --- a/mobile/lib/src/locator.dart +++ b/mobile/lib/src/locator.dart @@ -9,7 +9,7 @@ import 'package:polydodo/src/domain/eeg_data/i_eeg_data_repository.dart'; import 'package:polydodo/src/domain/sleep_sequence/i_sleep_sequence_repository.dart'; import 'package:polydodo/src/infrastructure/connection_repositories/acquisition_device_repository.dart'; import 'package:polydodo/src/infrastructure/connection_repositories/eeg_data_repository.dart'; -import 'package:polydodo/src/infrastructure/sleep_history/sleep_squence_repository.dart'; +import 'package:polydodo/src/infrastructure/sleep_history/sleep_sequence_repository.dart'; /// Private GetIt instance as we want all DI to be performed here in this file final _serviceLocator = GetIt.asNewInstance(); From 0e03aebcef419ac3fb7139c934cacc84b9c44f11 Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Wed, 18 Nov 2020 23:19:58 -0500 Subject: [PATCH 3/6] Changed function signature for database and fixed typo --- mobile/lib/src/app.dart | 2 +- .../sleep_sequence_history_cubit.dart | 4 +- .../lib/src/{databse.dart => database.dart} | 2 +- .../i_sleep_sequence_repository.dart | 5 ++- .../mock_sleep_sequence_repository.dart | 9 +++-- .../sleep_sequence_repository.dart | 39 ++++++++----------- 6 files changed, 29 insertions(+), 32 deletions(-) rename mobile/lib/src/{databse.dart => database.dart} (89%) diff --git a/mobile/lib/src/app.dart b/mobile/lib/src/app.dart index 328f44d2..b53ce123 100644 --- a/mobile/lib/src/app.dart +++ b/mobile/lib/src/app.dart @@ -1,7 +1,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:polydodo/src/databse.dart'; +import 'database.dart'; import 'locator.dart'; import 'presentation/navigation/routes/router.gr.dart' as auto_router; diff --git a/mobile/lib/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart b/mobile/lib/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart index 49e289f5..35410482 100644 --- a/mobile/lib/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart +++ b/mobile/lib/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart @@ -64,7 +64,9 @@ class SleepSequenceHistoryCubit extends Cubit { } void deleteSelected() { - _sleepSequenceRepository.deleteSleepSequences(_selectedSequences); + _sleepSequenceRepository.delete( + (state as SleepSequenceHistoryEditInProgress).history, + _selectedSequences); _disableSelection(); } diff --git a/mobile/lib/src/databse.dart b/mobile/lib/src/database.dart similarity index 89% rename from mobile/lib/src/databse.dart rename to mobile/lib/src/database.dart index f971c435..5656f7be 100644 --- a/mobile/lib/src/databse.dart +++ b/mobile/lib/src/database.dart @@ -7,6 +7,6 @@ import 'package:polydodo/src/domain/sleep_sequence/hive_sleep_sequence_stats.dar Future initDatabase() async { WidgetsFlutterBinding.ensureInitialized(); var appDocDir = await getApplicationDocumentsDirectory(); - await Hive.initFlutter(appDocDir.path + '/hive'); + await Hive.initFlutter(appDocDir.path + '/test'); Hive.registerAdapter(HiveSleepSequenceStatsAdapter()); } diff --git a/mobile/lib/src/domain/sleep_sequence/i_sleep_sequence_repository.dart b/mobile/lib/src/domain/sleep_sequence/i_sleep_sequence_repository.dart index 7670a7fb..cc540372 100644 --- a/mobile/lib/src/domain/sleep_sequence/i_sleep_sequence_repository.dart +++ b/mobile/lib/src/domain/sleep_sequence/i_sleep_sequence_repository.dart @@ -3,7 +3,8 @@ import 'package:polydodo/src/domain/sleep_sequence/sleep_sequence_stats.dart'; abstract class ISleepSequenceRepository { List getSleepSequences(); - void addSleepSequence(SleepSequenceStats sequence); + void store(List sequence); - void deleteSleepSequences(List sequence); + void delete(List sequences, + List sequencesToDelete); } diff --git a/mobile/lib/src/infrastructure/sleep_history/mock_sleep_sequence_repository.dart b/mobile/lib/src/infrastructure/sleep_history/mock_sleep_sequence_repository.dart index a2f85bb7..627c0284 100644 --- a/mobile/lib/src/infrastructure/sleep_history/mock_sleep_sequence_repository.dart +++ b/mobile/lib/src/infrastructure/sleep_history/mock_sleep_sequence_repository.dart @@ -5,8 +5,8 @@ import 'package:polydodo/src/domain/sleep_sequence/sleep_sequence_stats.dart'; import 'package:polydodo/src/infrastructure/sleep_history/mock_data.dart'; class MockSleepSequenceRepository implements ISleepSequenceRepository { - final List _sleepSequencesPersistency = []; final sequenceStreamController = StreamController(); + List _sleepSequencesPersistency = []; MockSleepSequenceRepository() { _sleepSequencesPersistency.add(mock_data_1); @@ -18,12 +18,13 @@ class MockSleepSequenceRepository implements ISleepSequenceRepository { List getSleepSequences() => _sleepSequencesPersistency; @override - void addSleepSequence(SleepSequenceStats sequence) { - _sleepSequencesPersistency.add(sequence); + void store(List sequenceList) { + _sleepSequencesPersistency = sequenceList; } @override - void deleteSleepSequences(List sequences) { + void delete(List sequences, + List sequencesToDelete) { for (var sequence in sequences) { _sleepSequencesPersistency.remove(sequence); } diff --git a/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart b/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart index cee9e6b9..3e301680 100644 --- a/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart +++ b/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart @@ -8,47 +8,40 @@ import 'package:polydodo/src/domain/sleep_sequence/sleep_sequence_stats.dart'; import 'package:polydodo/src/domain/unique_id.dart'; import 'package:polydodo/src/infrastructure/constants.dart'; +import 'mock_data.dart'; + class SleepSequenceRepository implements ISleepSequenceRepository { - final List _sleepSequencesPersistency = []; final sequenceStreamController = StreamController(); Box _sleepSequencesListBox; SleepSequenceRepository() { - _loadSleepSequences(); + _loadHiveBox(); } - void _loadSleepSequences() async { + void _loadHiveBox() async { _sleepSequencesListBox = await Hive.openBox(POLYDODO_BOX); - - var sequenceList = _sleepSequencesListBox.get(SLEEP_SEQUENCES_LIST_KEY); - print(sequenceList); - - if (sequenceList != null) { - _sleepSequencesPersistency - .addAll(_parseHiveSleepSequenceList(sequenceList)); - } } @override - List getSleepSequences() => _sleepSequencesPersistency; + List getSleepSequences() { + return _parseHiveSleepSequenceList( + _sleepSequencesListBox.get(SLEEP_SEQUENCES_LIST_KEY) ?? []); + } @override - void addSleepSequence(SleepSequenceStats sequence) { - _sleepSequencesPersistency.add(sequence); - - _saveSleepSequences(); + void store(List sequence) { + _sleepSequencesListBox.put( + SLEEP_SEQUENCES_LIST_KEY, _parseSleepSequenceList(sequence)); } @override - void deleteSleepSequences(List sequences) { - for (var sequence in sequences) { - _sleepSequencesPersistency.remove(sequence); + void delete(List sequences, + List sequencesToDelete) { + for (var sequence in sequencesToDelete) { + sequences.remove(sequence); } - } - void _saveSleepSequences() { - _sleepSequencesListBox.put(SLEEP_SEQUENCES_LIST_KEY, - _parseSleepSequenceList(_sleepSequencesPersistency)); + store(sequences); } List _parseHiveSleepSequenceList(var historyList) { From 68bfeeb1c18942fa30f8a040dc253452b6905426 Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Wed, 18 Nov 2020 23:20:13 -0500 Subject: [PATCH 4/6] Removed unused import --- .../infrastructure/sleep_history/sleep_sequence_repository.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart b/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart index 3e301680..419474b3 100644 --- a/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart +++ b/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart @@ -8,8 +8,6 @@ import 'package:polydodo/src/domain/sleep_sequence/sleep_sequence_stats.dart'; import 'package:polydodo/src/domain/unique_id.dart'; import 'package:polydodo/src/infrastructure/constants.dart'; -import 'mock_data.dart'; - class SleepSequenceRepository implements ISleepSequenceRepository { final sequenceStreamController = StreamController(); Box _sleepSequencesListBox; From eed7961ce7ec456a4b2327d3124013ea1d727c14 Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Thu, 19 Nov 2020 00:11:34 -0500 Subject: [PATCH 5/6] Changed effective sleep time and waso from double to duration --- mobile/lib/src/database.dart | 2 +- .../sleep_sequence/hive_sleep_sequence_stats.dart | 8 ++++---- .../domain/sleep_sequence/sleep_sequence_stats.dart | 4 ++-- .../src/infrastructure/sleep_history/mock_data.dart | 8 ++++---- .../sleep_history/sleep_sequence_repository.dart | 10 ++++++---- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/mobile/lib/src/database.dart b/mobile/lib/src/database.dart index 5656f7be..f971c435 100644 --- a/mobile/lib/src/database.dart +++ b/mobile/lib/src/database.dart @@ -7,6 +7,6 @@ import 'package:polydodo/src/domain/sleep_sequence/hive_sleep_sequence_stats.dar Future initDatabase() async { WidgetsFlutterBinding.ensureInitialized(); var appDocDir = await getApplicationDocumentsDirectory(); - await Hive.initFlutter(appDocDir.path + '/test'); + await Hive.initFlutter(appDocDir.path + '/hive'); Hive.registerAdapter(HiveSleepSequenceStatsAdapter()); } diff --git a/mobile/lib/src/domain/sleep_sequence/hive_sleep_sequence_stats.dart b/mobile/lib/src/domain/sleep_sequence/hive_sleep_sequence_stats.dart index 72f0a450..75c31d17 100644 --- a/mobile/lib/src/domain/sleep_sequence/hive_sleep_sequence_stats.dart +++ b/mobile/lib/src/domain/sleep_sequence/hive_sleep_sequence_stats.dart @@ -11,7 +11,7 @@ class HiveSleepSequenceStats { DateTime recordingEnd; @HiveField(2) - double effectiveSleepTime; + int effectiveSleepTimeInSeconds; @HiveField(3) double sleepEfficiency; @@ -20,7 +20,7 @@ class HiveSleepSequenceStats { int sleepLatency; @HiveField(5) - double waso; + int wasoInSeconds; @HiveField(6) int awakenings; @@ -34,10 +34,10 @@ class HiveSleepSequenceStats { HiveSleepSequenceStats( this.recordingStart, this.recordingEnd, - this.effectiveSleepTime, + this.effectiveSleepTimeInSeconds, this.sleepEfficiency, this.sleepLatency, - this.waso, + this.wasoInSeconds, this.awakenings, this.remLatency, this.numberTransitions); diff --git a/mobile/lib/src/domain/sleep_sequence/sleep_sequence_stats.dart b/mobile/lib/src/domain/sleep_sequence/sleep_sequence_stats.dart index 666254cf..283f3a00 100644 --- a/mobile/lib/src/domain/sleep_sequence/sleep_sequence_stats.dart +++ b/mobile/lib/src/domain/sleep_sequence/sleep_sequence_stats.dart @@ -4,10 +4,10 @@ import 'package:flutter/foundation.dart'; class SleepSequenceStats extends Entity { final DateTimeRange recordingTime; - final double effectiveSleepTime; + final Duration effectiveSleepTime; final double sleepEfficiency; final int sleepLatency; - final double waso; + final Duration waso; final int awakenings; final int remLatency; final int numberTransitions; diff --git a/mobile/lib/src/infrastructure/sleep_history/mock_data.dart b/mobile/lib/src/infrastructure/sleep_history/mock_data.dart index ed769b51..2ebb4216 100644 --- a/mobile/lib/src/infrastructure/sleep_history/mock_data.dart +++ b/mobile/lib/src/infrastructure/sleep_history/mock_data.dart @@ -5,21 +5,21 @@ import 'package:polydodo/src/domain/unique_id.dart'; SleepSequenceStats mock_data_1 = SleepSequenceStats( id: UniqueId.from('test'), awakenings: 3, - effectiveSleepTime: 80.0, + effectiveSleepTime: Duration(minutes: 59), numberTransitions: 5, recordingTime: DateTimeRange(start: DateTime.now(), end: DateTime.now()), remLatency: 20, sleepEfficiency: 20.0, sleepLatency: 10, - waso: 80.0); + waso: Duration(minutes: 59)); SleepSequenceStats mock_data_2 = SleepSequenceStats( id: UniqueId.from('test2'), awakenings: 100, - effectiveSleepTime: 100.0, + effectiveSleepTime: Duration(minutes: 100), numberTransitions: 5, recordingTime: DateTimeRange(start: DateTime.now(), end: DateTime.now()), remLatency: 20, sleepEfficiency: 20.0, sleepLatency: 10, - waso: 100.0); + waso: Duration(minutes: 100)); diff --git a/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart b/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart index 419474b3..fba0aaaf 100644 --- a/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart +++ b/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart @@ -45,18 +45,20 @@ class SleepSequenceRepository implements ISleepSequenceRepository { List _parseHiveSleepSequenceList(var historyList) { // ignore: omit_local_variable_types List list = []; + for (var sequence in historyList) { list.add(SleepSequenceStats( id: UniqueId.from(sequence.recordingStart.toString()), awakenings: sequence.awakenings, - effectiveSleepTime: sequence.effectiveSleepTime, + effectiveSleepTime: + Duration(seconds: sequence.effectiveSleepTimeInSeconds), numberTransitions: sequence.numberTransitions, recordingTime: DateTimeRange( start: sequence.recordingStart, end: sequence.recordingEnd), remLatency: sequence.remLatency, sleepEfficiency: sequence.sleepEfficiency, sleepLatency: sequence.sleepLatency, - waso: sequence.waso)); + waso: Duration(seconds: sequence.wasoInSeconds))); } return list; @@ -71,10 +73,10 @@ class SleepSequenceRepository implements ISleepSequenceRepository { list.add(HiveSleepSequenceStats( sequence.recordingTime.start, sequence.recordingTime.end, - sequence.effectiveSleepTime, + sequence.effectiveSleepTime.inSeconds, sequence.sleepEfficiency, sequence.sleepLatency, - sequence.waso, + sequence.waso.inSeconds, sequence.awakenings, sequence.remLatency, sequence.numberTransitions)); From ce1b532224e836a51ca57cfac73717c1f68586d4 Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Thu, 19 Nov 2020 17:38:45 -0500 Subject: [PATCH 6/6] Changed function signature --- .../sleep_sequence_history_cubit.dart | 10 ++++------ .../sleep_sequence/i_sleep_sequence_repository.dart | 2 +- .../sleep_history/mock_sleep_sequence_repository.dart | 2 +- .../sleep_history/sleep_sequence_repository.dart | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/mobile/lib/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart b/mobile/lib/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart index 35410482..d8d96d10 100644 --- a/mobile/lib/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart +++ b/mobile/lib/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart @@ -22,8 +22,7 @@ class SleepSequenceHistoryCubit extends Cubit { } void loadHistory() { - emit(SleepSequenceHistoryLoaded( - _sleepSequenceRepository.getSleepSequences())); + emit(SleepSequenceHistoryLoaded(_sleepSequenceRepository.getAll())); } void loadSleepSequence(SleepSequenceStats sequence) { @@ -42,14 +41,13 @@ class SleepSequenceHistoryCubit extends Cubit { _selectedSequences = []; _selectText.add('Done'); emit(SleepSequenceHistoryEditInProgress( - _sleepSequenceRepository.getSleepSequences(), _selectedSequences)); + _sleepSequenceRepository.getAll(), _selectedSequences)); } void _disableSelection() { _selectedSequences = null; _selectText.add('Select'); - emit(SleepSequenceHistoryLoaded( - _sleepSequenceRepository.getSleepSequences())); + emit(SleepSequenceHistoryLoaded(_sleepSequenceRepository.getAll())); } void toggleSelectSequenceForDeletion(SleepSequenceStats sequence) { @@ -60,7 +58,7 @@ class SleepSequenceHistoryCubit extends Cubit { } emit(SleepSequenceHistoryEditInProgress( - _sleepSequenceRepository.getSleepSequences(), _selectedSequences)); + _sleepSequenceRepository.getAll(), _selectedSequences)); } void deleteSelected() { diff --git a/mobile/lib/src/domain/sleep_sequence/i_sleep_sequence_repository.dart b/mobile/lib/src/domain/sleep_sequence/i_sleep_sequence_repository.dart index cc540372..f24d3f9a 100644 --- a/mobile/lib/src/domain/sleep_sequence/i_sleep_sequence_repository.dart +++ b/mobile/lib/src/domain/sleep_sequence/i_sleep_sequence_repository.dart @@ -1,7 +1,7 @@ import 'package:polydodo/src/domain/sleep_sequence/sleep_sequence_stats.dart'; abstract class ISleepSequenceRepository { - List getSleepSequences(); + List getAll(); void store(List sequence); diff --git a/mobile/lib/src/infrastructure/sleep_history/mock_sleep_sequence_repository.dart b/mobile/lib/src/infrastructure/sleep_history/mock_sleep_sequence_repository.dart index 627c0284..446fb53a 100644 --- a/mobile/lib/src/infrastructure/sleep_history/mock_sleep_sequence_repository.dart +++ b/mobile/lib/src/infrastructure/sleep_history/mock_sleep_sequence_repository.dart @@ -15,7 +15,7 @@ class MockSleepSequenceRepository implements ISleepSequenceRepository { } @override - List getSleepSequences() => _sleepSequencesPersistency; + List getAll() => _sleepSequencesPersistency; @override void store(List sequenceList) { diff --git a/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart b/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart index fba0aaaf..2b86cc19 100644 --- a/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart +++ b/mobile/lib/src/infrastructure/sleep_history/sleep_sequence_repository.dart @@ -21,7 +21,7 @@ class SleepSequenceRepository implements ISleepSequenceRepository { } @override - List getSleepSequences() { + List getAll() { return _parseHiveSleepSequenceList( _sleepSequencesListBox.get(SLEEP_SEQUENCES_LIST_KEY) ?? []); }