Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions mobile/lib/src/app.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'database.dart';

import 'locator.dart';
import 'presentation/navigation/routes/router.gr.dart' as auto_router;
import 'theme.dart';

class App extends StatelessWidget {
App() {
init();
}

void init() async {
await initDatabase();
registerServices();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,21 @@ import 'package:polydodo/src/domain/sleep_sequence/sleep_sequence_stats.dart';
import 'sleep_sequence_history_state.dart';

class SleepSequenceHistoryCubit extends Cubit<SleepSequenceHistoryState> {
final ISleepSequenceRepository _sleepHistoryRepository;
final ISleepSequenceRepository _sleepSequenceRepository;
final SleepSequenceStatsCubit _sleepSequenceStatsCubit;
final StreamController<String> _selectText =
StreamController<String>.broadcast();

List<SleepSequenceStats> _selectedSequences;

SleepSequenceHistoryCubit(
this._sleepHistoryRepository, this._sleepSequenceStatsCubit)
this._sleepSequenceRepository, this._sleepSequenceStatsCubit)
: super(SleepSequenceHistoryInitial()) {
loadHistory();
}

void loadHistory() {
emit(SleepSequenceHistoryLoaded(
_sleepHistoryRepository.getSleepSequences()));
emit(SleepSequenceHistoryLoaded(_sleepSequenceRepository.getAll()));
}

void loadSleepSequence(SleepSequenceStats sequence) {
Expand All @@ -42,14 +41,13 @@ class SleepSequenceHistoryCubit extends Cubit<SleepSequenceHistoryState> {
_selectedSequences = [];
_selectText.add('Done');
emit(SleepSequenceHistoryEditInProgress(
_sleepHistoryRepository.getSleepSequences(), _selectedSequences));
_sleepSequenceRepository.getAll(), _selectedSequences));
}

void _disableSelection() {
_selectedSequences = null;
_selectText.add('Select');
emit(SleepSequenceHistoryLoaded(
_sleepHistoryRepository.getSleepSequences()));
emit(SleepSequenceHistoryLoaded(_sleepSequenceRepository.getAll()));
}

void toggleSelectSequenceForDeletion(SleepSequenceStats sequence) {
Expand All @@ -60,11 +58,13 @@ class SleepSequenceHistoryCubit extends Cubit<SleepSequenceHistoryState> {
}

emit(SleepSequenceHistoryEditInProgress(
_sleepHistoryRepository.getSleepSequences(), _selectedSequences));
_sleepSequenceRepository.getAll(), _selectedSequences));
}

void deleteSelected() {
_sleepHistoryRepository.deleteSleepSequences(_selectedSequences);
_sleepSequenceRepository.delete(
(state as SleepSequenceHistoryEditInProgress).history,
_selectedSequences);
_disableSelection();
}

Expand Down
12 changes: 12 additions & 0 deletions mobile/lib/src/database.dart
Original file line number Diff line number Diff line change
@@ -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<void> initDatabase() async {
WidgetsFlutterBinding.ensureInitialized();
var appDocDir = await getApplicationDocumentsDirectory();
await Hive.initFlutter(appDocDir.path + '/hive');
Hive.registerAdapter(HiveSleepSequenceStatsAdapter());
}
Original file line number Diff line number Diff line change
@@ -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)
int effectiveSleepTimeInSeconds;

@HiveField(3)
double sleepEfficiency;

@HiveField(4)
int sleepLatency;

@HiveField(5)
int wasoInSeconds;

@HiveField(6)
int awakenings;

@HiveField(7)
int remLatency;

@HiveField(8)
int numberTransitions;

HiveSleepSequenceStats(
this.recordingStart,
this.recordingEnd,
this.effectiveSleepTimeInSeconds,
this.sleepEfficiency,
this.sleepLatency,
this.wasoInSeconds,
this.awakenings,
this.remLatency,
this.numberTransitions);
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import 'package:polydodo/src/domain/sleep_sequence/sleep_sequence_stats.dart';

abstract class ISleepSequenceRepository {
List<SleepSequenceStats> getSleepSequences();
List<SleepSequenceStats> getAll();

void deleteSleepSequences(List<SleepSequenceStats> sequence);
void store(List<SleepSequenceStats> sequence);

void delete(List<SleepSequenceStats> sequences,
List<SleepSequenceStats> sequencesToDelete);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import 'package:flutter/foundation.dart';

class SleepSequenceStats extends Entity {
final DateTimeRange recordingTime;
final DateTime effectiveSleepTime;
final Duration effectiveSleepTime;
final double sleepEfficiency;
final int sleepLatency;
final DateTime waso;
final Duration waso;
final int awakenings;
final int remLatency;
final int numberTransitions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,14 @@ class EEGDataRepository implements IEEGDataRepository {

@override
Future<void> 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';
Expand Down
3 changes: 3 additions & 0 deletions mobile/lib/src/infrastructure/constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,6 @@ const OPEN_BCI_CYTON_HEADER = [
' Timestamp (Formatted)'
]
];

const POLYDODO_BOX = 'Polydodo';
const SLEEP_SEQUENCES_LIST_KEY = 'sequence_list';
8 changes: 4 additions & 4 deletions mobile/lib/src/infrastructure/sleep_history/mock_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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: Duration(minutes: 59),
numberTransitions: 5,
recordingTime: DateTimeRange(start: DateTime.now(), end: DateTime.now()),
remLatency: 20,
sleepEfficiency: 20.0,
sleepLatency: 10,
waso: DateTime.now());
waso: Duration(minutes: 59));

SleepSequenceStats mock_data_2 = SleepSequenceStats(
id: UniqueId.from('test2'),
awakenings: 100,
effectiveSleepTime: DateTime.now(),
effectiveSleepTime: Duration(minutes: 100),
numberTransitions: 5,
recordingTime: DateTimeRange(start: DateTime.now(), end: DateTime.now()),
remLatency: 20,
sleepEfficiency: 20.0,
sleepLatency: 10,
waso: DateTime.now());
waso: Duration(minutes: 100));
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
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 sequenceStreamController = StreamController<SleepSequenceStats>();
List<SleepSequenceStats> _sleepSequencesPersistency = [];

MockSleepSequenceRepository() {
_sleepSequencesPersistency.add(mock_data_1);

_sleepSequencesPersistency.add(mock_data_2);
}

@override
List<SleepSequenceStats> getAll() => _sleepSequencesPersistency;

@override
void store(List<SleepSequenceStats> sequenceList) {
_sleepSequencesPersistency = sequenceList;
}

@override
void delete(List<SleepSequenceStats> sequences,
List<SleepSequenceStats> sequencesToDelete) {
for (var sequence in sequences) {
_sleepSequencesPersistency.remove(sequence);
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
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 sequenceStreamController = StreamController<SleepSequenceStats>();
Box _sleepSequencesListBox;

SleepSequenceRepository() {
_loadHiveBox();
}

void _loadHiveBox() async {
_sleepSequencesListBox = await Hive.openBox(POLYDODO_BOX);
}

@override
List<SleepSequenceStats> getAll() {
return _parseHiveSleepSequenceList(
_sleepSequencesListBox.get(SLEEP_SEQUENCES_LIST_KEY) ?? []);
}

@override
void store(List<SleepSequenceStats> sequence) {
_sleepSequencesListBox.put(
SLEEP_SEQUENCES_LIST_KEY, _parseSleepSequenceList(sequence));
}

@override
void delete(List<SleepSequenceStats> sequences,
List<SleepSequenceStats> sequencesToDelete) {
for (var sequence in sequencesToDelete) {
sequences.remove(sequence);
}

store(sequences);
}

List<SleepSequenceStats> _parseHiveSleepSequenceList(var historyList) {
// ignore: omit_local_variable_types
List<SleepSequenceStats> list = [];

for (var sequence in historyList) {
list.add(SleepSequenceStats(
id: UniqueId.from(sequence.recordingStart.toString()),
awakenings: sequence.awakenings,
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: Duration(seconds: sequence.wasoInSeconds)));
}

return list;
}

List<HiveSleepSequenceStats> _parseSleepSequenceList(
List<SleepSequenceStats> historyList) {
// ignore: omit_local_variable_types
List<HiveSleepSequenceStats> list = [];

for (var sequence in historyList) {
list.add(HiveSleepSequenceStats(
sequence.recordingTime.start,
sequence.recordingTime.end,
sequence.effectiveSleepTime.inSeconds,
sequence.sleepEfficiency,
sequence.sleepLatency,
sequence.waso.inSeconds,
sequence.awakenings,
sequence.remLatency,
sequence.numberTransitions));
}

return list;
}
}
6 changes: 3 additions & 3 deletions mobile/lib/src/locator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import 'package:polydodo/src/domain/acquisition_device/device_locator_service.da
import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart';
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/serial_repository.dart';
import 'package:polydodo/src/infrastructure/connection_repositories/bluetooth_repository.dart';
import 'package:polydodo/src/infrastructure/connection_repositories/eeg_data_repository.dart';
import 'package:polydodo/src/infrastructure/connection_repositories/serial_repository.dart';
import 'package:polydodo/src/infrastructure/sleep_history/sleep_history_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();
Expand All @@ -21,7 +21,7 @@ void registerServices() {
DeviceLocatorService(BluetoothRepository(), SerialRepository()));
_serviceLocator.registerSingleton<IEEGDataRepository>(EEGDataRepository());
_serviceLocator
.registerSingleton<ISleepSequenceRepository>(SleepHistoryRepository());
.registerSingleton<ISleepSequenceRepository>(SleepSequenceRepository());
}

/// This function creates all the BlocProviders used in this app
Expand Down
Loading