Skip to content

Commit

Permalink
feat: use UpdateNotifications service
Browse files Browse the repository at this point in the history
  • Loading branch information
matthiasn committed May 3, 2024
1 parent 7af9459 commit 2458890
Show file tree
Hide file tree
Showing 19 changed files with 149 additions and 62 deletions.
13 changes: 13 additions & 0 deletions integration_test/matrix_service_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import 'package:lotti/database/database.dart';
import 'package:lotti/database/logging_db.dart';
import 'package:lotti/database/settings_db.dart';
import 'package:lotti/get_it.dart';
import 'package:lotti/services/db_notification.dart';
import 'package:lotti/sync/matrix/matrix_service.dart';
import 'package:lotti/sync/secure_storage.dart';
import 'package:lotti/sync/vector_clock.dart';
Expand All @@ -39,6 +40,18 @@ void main() {

// create separate databases for each simulated device & suppress warning
drift.driftRuntimeOptions.dontWarnAboutMultipleDatabases = true;

final mockUpdateNotifications = MockUpdateNotifications();

when(() => mockUpdateNotifications.updateStream).thenAnswer(
(_) => Stream<DatabaseType>.fromIterable([]),
);

when(() => mockUpdateNotifications.notifyUpdate(DatabaseType.journal))
.thenAnswer((_) {});

getIt.registerSingleton<UpdateNotifications>(mockUpdateNotifications);

final aliceDb = JournalDb(overriddenFilename: 'alice_db.sqlite');
final bobDb = JournalDb(overriddenFilename: 'bob_db.sqlite');

Expand Down
21 changes: 12 additions & 9 deletions lib/blocs/journal/journal_page_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import 'package:lotti/database/database.dart';
import 'package:lotti/database/fts5_db.dart';
import 'package:lotti/database/settings_db.dart';
import 'package:lotti/get_it.dart';
import 'package:lotti/services/db_notification.dart';
import 'package:lotti/utils/platform.dart';
import 'package:rxdart/rxdart.dart';
import 'package:visibility_detector/visibility_detector.dart';
Expand Down Expand Up @@ -101,14 +102,12 @@ class JournalPageCubit extends Cubit<JournalPageState> {
}
});
} else {
_db
.watchJournalCount()
_updateNotifications.updateStream
.throttleTime(
const Duration(seconds: 2),
leading: false,
trailing: true,
)
.where(makeDuplicateFilter())
const Duration(seconds: 1),
leading: false,
trailing: true,
)
.listen((_) {
if (_isVisible) {
refreshQuery();
Expand All @@ -121,6 +120,7 @@ class JournalPageCubit extends Cubit<JournalPageState> {
static const selectedEntryTypesKey = 'SELECTED_ENTRY_TYPES';

final JournalDb _db = getIt<JournalDb>();
final UpdateNotifications _updateNotifications = getIt<UpdateNotifications>();
bool _isVisible = false;
static const _pageSize = 50;
Set<String> _selectedEntryTypes = entryTypes.toSet();
Expand Down Expand Up @@ -308,15 +308,18 @@ class JournalPageCubit extends Cubit<JournalPageState> {
.first;

final isLastPage = newItems.length < _pageSize;

if (isLastPage) {
state.pagingController.appendLastPage(newItems);
} else {
final nextPageKey = pageKey + newItems.length;
state.pagingController.appendPage(newItems, nextPageKey);
}
final finished = DateTime.now();
final duration = finished.difference(start);
debugPrint('_fetchPage $showTasks duration $duration');
final duration = finished.difference(start).inMicroseconds / 1000;
debugPrint(
'_fetchPage ${showTasks ? 'TASK' : 'JOURNAL'} duration $duration ms',
);
} catch (error) {
state.pagingController.error = error;
}
Expand Down
33 changes: 4 additions & 29 deletions lib/database/database.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:collection/collection.dart';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:enum_to_string/enum_to_string.dart';
import 'package:flutter/foundation.dart';
import 'package:lotti/classes/entity_definitions.dart';
Expand All @@ -15,13 +13,10 @@ import 'package:lotti/database/common.dart';
import 'package:lotti/database/conversions.dart';
import 'package:lotti/database/logging_db.dart';
import 'package:lotti/get_it.dart';
import 'package:lotti/services/db_notification.dart';
import 'package:lotti/sync/vector_clock.dart';
import 'package:lotti/utils/file_utils.dart';
import 'package:lotti/widgets/journal/entry_tools.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:sqlite3/sqlite3.dart';
import 'package:sqlite3_flutter_libs/sqlite3_flutter_libs.dart';

part 'database.g.dart';

Expand All @@ -40,35 +35,14 @@ class JournalDb extends _$JournalDb {
this.inMemoryDatabase = false,
String? overriddenFilename,
}) : super(
_openConnection(
openDbConnection(
overriddenFilename ?? journalDbFileName,
inMemoryDatabase: inMemoryDatabase,
),
);

static LazyDatabase _openConnection(
String fileName, {
bool inMemoryDatabase = false,
}) {
return LazyDatabase(() async {
if (inMemoryDatabase) {
return NativeDatabase.memory();
}

final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, fileName));

if (Platform.isAndroid) {
await applyWorkaroundToOpenSqlite3OnOldAndroidVersions();
}

sqlite3.tempDirectory = (await getTemporaryDirectory()).path;

return NativeDatabase.createInBackground(file);
});
}

bool inMemoryDatabase = false;
final UpdateNotifications _updateNotifications = getIt<UpdateNotifications>();

@override
int get schemaVersion => 19;
Expand Down Expand Up @@ -749,6 +723,7 @@ class JournalDb extends _$JournalDb {
dashboard: upsertDashboardDefinition,
categoryDefinition: upsertCategoryDefinition,
);
_updateNotifications.notifyUpdate(DatabaseType.journal);
return linesAffected;
}
}
5 changes: 2 additions & 3 deletions lib/get_it.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import 'package:lotti/logic/ai/ai_logic.dart';
import 'package:lotti/logic/health_import.dart';
import 'package:lotti/logic/persistence_logic.dart';
import 'package:lotti/services/asr_service.dart';
import 'package:lotti/services/db_notification.dart';
import 'package:lotti/services/editor_state_service.dart';
import 'package:lotti/services/entities_cache_service.dart';
import 'package:lotti/services/link_service.dart';
Expand All @@ -29,10 +30,8 @@ Future<void> registerSingletons() async {
getIt
..registerSingleton<Fts5Db>(Fts5Db())
..registerSingleton<LoggingDb>(LoggingDb())
..registerSingleton<UpdateNotifications>(UpdateNotifications())
..registerSingleton<JournalDb>(JournalDb())
// ..registerSingleton<DatabaseUpdateNotifications>(
// DatabaseUpdateNotifications(),
// )
..registerSingleton<EditorDb>(EditorDb())
..registerSingleton<TagsService>(TagsService())
..registerSingleton<EntitiesCacheService>(EntitiesCacheService())
Expand Down
31 changes: 15 additions & 16 deletions lib/services/db_notification.dart
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
import 'package:flutter/foundation.dart';
import 'package:lotti/database/database.dart';
import 'package:lotti/get_it.dart';
import 'dart:async';

class DatabaseUpdateNotifications {
DatabaseUpdateNotifications() {
listen();
}
enum DatabaseType {
journal,
setting,
sync,
logging,
}

class UpdateNotifications {
UpdateNotifications();

final _updateStreamController = StreamController<DatabaseType>.broadcast();

final JournalDb _journalDb = getIt<JournalDb>();
Stream<DatabaseType> get updateStream => _updateStreamController.stream;

void listen() {
_journalDb.countJournalEntries().watch().listen((event) async {
final start = DateTime.now();
final count = await _journalDb.countJournalEntries().getSingle();
final end = DateTime.now();
final duration = end.difference(start).inMicroseconds / 1000;
debugPrint('DatabaseUpdateNotifications $count - $duration ms');
});
void notifyUpdate(DatabaseType databaseType) {
_updateStreamController.add(databaseType);
}
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: lotti
description: Achieve your goals and keep your data private with Lotti.
publish_to: 'none'
version: 0.9.459+2496
version: 0.9.459+2498

msix_config:
display_name: LottiApp
Expand Down
7 changes: 7 additions & 0 deletions test/blocs/journal/entry_cubit_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import 'package:lotti/database/settings_db.dart';
import 'package:lotti/database/sync_db.dart';
import 'package:lotti/get_it.dart';
import 'package:lotti/logic/persistence_logic.dart';
import 'package:lotti/services/db_notification.dart';
import 'package:lotti/services/editor_state_service.dart';
import 'package:lotti/services/time_service.dart';
import 'package:lotti/services/vector_clock_service.dart';
Expand All @@ -28,6 +29,12 @@ void main() {
var vcMockNext = '1';

setUpAll(() {
final mockUpdateNotifications = MockUpdateNotifications();
when(() => mockUpdateNotifications.updateStream).thenAnswer(
(_) => Stream<DatabaseType>.fromIterable([]),
);
getIt.registerSingleton<UpdateNotifications>(mockUpdateNotifications);

final secureStorageMock = MockSecureStorage();
final settingsDb = SettingsDb(inMemoryDatabase: true);
final mockTimeService = MockTimeService();
Expand Down
7 changes: 7 additions & 0 deletions test/blocs/journal/journal_page_cubit_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'package:lotti/database/settings_db.dart';
import 'package:lotti/database/sync_db.dart';
import 'package:lotti/get_it.dart';
import 'package:lotti/logic/persistence_logic.dart';
import 'package:lotti/services/db_notification.dart';
import 'package:lotti/services/editor_state_service.dart';
import 'package:lotti/services/time_service.dart';
import 'package:lotti/services/vector_clock_service.dart';
Expand All @@ -23,6 +24,7 @@ import '../../test_data/sync_config_test_data.dart';

void main() {
TestWidgetsFlutterBinding.ensureInitialized();
final mockUpdateNotifications = MockUpdateNotifications();

group('JournalPageCubit Tests - ', () {
var vcMockNext = '1';
Expand All @@ -32,6 +34,10 @@ void main() {
final settingsDb = SettingsDb(inMemoryDatabase: true);
final mockTimeService = MockTimeService();

when(() => mockUpdateNotifications.updateStream).thenAnswer(
(_) => Stream<DatabaseType>.fromIterable([]),
);

when(() => secureStorageMock.readValue(hostKey))
.thenAnswer((_) async => 'some_host');

Expand All @@ -46,6 +52,7 @@ void main() {
});

getIt
..registerSingleton<UpdateNotifications>(mockUpdateNotifications)
..registerSingleton<SettingsDb>(settingsDb)
..registerSingleton<SyncDatabase>(SyncDatabase(inMemoryDatabase: true))
..registerSingleton<JournalDb>(JournalDb(inMemoryDatabase: true))
Expand Down
13 changes: 13 additions & 0 deletions test/database/database_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@ import 'dart:io';
import 'package:flutter_test/flutter_test.dart';
import 'package:lotti/database/database.dart';
import 'package:lotti/database/journal_db/config_flags.dart';
import 'package:lotti/get_it.dart';
import 'package:lotti/services/db_notification.dart';
import 'package:lotti/utils/consts.dart';
import 'package:mocktail/mocktail.dart';

import '../mocks/mocks.dart';

final expectedActiveFlagNames = {
privateFlag,
Expand Down Expand Up @@ -63,14 +68,22 @@ final expectedMacFlags = <ConfigFlag>{

void main() {
JournalDb? db;
final mockUpdateNotifications = MockUpdateNotifications();

group('Database Tests - ', () {
setUp(() async {
getIt.registerSingleton<UpdateNotifications>(mockUpdateNotifications);

db = JournalDb(inMemoryDatabase: true);
await initConfigFlags(db!, inMemoryDatabase: true);

when(() => mockUpdateNotifications.updateStream).thenAnswer(
(_) => Stream<DatabaseType>.fromIterable([]),
);
});
tearDown(() async {
await db?.close();
getIt.unregister<UpdateNotifications>();
});

test(
Expand Down
8 changes: 8 additions & 0 deletions test/logic/persistence_logic_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import 'package:lotti/database/sync_db.dart';
import 'package:lotti/get_it.dart';
import 'package:lotti/logic/ai/ai_logic.dart';
import 'package:lotti/logic/persistence_logic.dart';
import 'package:lotti/services/db_notification.dart';
import 'package:lotti/services/notification_service.dart';
import 'package:lotti/services/tags_service.dart';
import 'package:lotti/services/vector_clock_service.dart';
Expand All @@ -36,6 +37,7 @@ void main() {
registerFallbackValue(FakeJournalEntity());

final mockNotificationService = MockNotificationService();
final mockUpdateNotifications = MockUpdateNotifications();
final mockAiLogic = MockAiLogic();
final mockFts5Db = MockFts5Db();

Expand All @@ -49,6 +51,8 @@ void main() {
setUpAll(() async {
setFakeDocumentsPath();

getIt.registerSingleton<UpdateNotifications>(mockUpdateNotifications);

final settingsDb = SettingsDb(inMemoryDatabase: true);
final journalDb = JournalDb(inMemoryDatabase: true);
await initConfigFlags(journalDb, inMemoryDatabase: true);
Expand All @@ -66,6 +70,10 @@ void main() {

when(mockNotificationService.updateBadge).thenAnswer((_) async {});

when(() => mockUpdateNotifications.updateStream).thenAnswer(
(_) => Stream<DatabaseType>.fromIterable([]),
);

when(() => mockFts5Db.insertText(any())).thenAnswer((_) async {});

when(
Expand Down
3 changes: 3 additions & 0 deletions test/mocks/mocks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import 'package:lotti/logic/ai/ai_logic.dart';
import 'package:lotti/logic/health_import.dart';
import 'package:lotti/logic/persistence_logic.dart';
import 'package:lotti/services/asr_service.dart';
import 'package:lotti/services/db_notification.dart';
import 'package:lotti/services/editor_state_service.dart';
import 'package:lotti/services/entities_cache_service.dart';
import 'package:lotti/services/link_service.dart';
Expand Down Expand Up @@ -115,6 +116,8 @@ class MockEditorStateService extends Mock implements EditorStateService {}

class MockLinkService extends Mock implements LinkService {}

class MockUpdateNotifications extends Mock implements UpdateNotifications {}

class MockEntryCubit extends MockBloc<EntryCubit, EntryState>
implements EntryCubit {}

Expand Down
Loading

0 comments on commit 2458890

Please sign in to comment.