From 0d7807bed3100fb0a59d9d10103efe8d6497dba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 11 Nov 2025 10:52:26 +0100 Subject: [PATCH 1/5] fix: Possible database corruption cause by allow multiple instances --- .../builder.dart | 1 - .../notification_background_handler.dart | 36 ++----------------- 2 files changed, 3 insertions(+), 34 deletions(-) diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart index 09738b518..3387fdf38 100644 --- a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart @@ -105,7 +105,6 @@ Future _constructDatabase(String clientName) async { version: 1, // most important : apply encryption when opening the DB onConfigure: helper?.applyPragmaKey, - singleInstance: false, ), ); diff --git a/lib/utils/notification_background_handler.dart b/lib/utils/notification_background_handler.dart index aa8ea17dd..aec2d747a 100644 --- a/lib/utils/notification_background_handler.dart +++ b/lib/utils/notification_background_handler.dart @@ -3,21 +3,17 @@ import 'dart:ui'; import 'package:collection/collection.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:flutter_vodozemac/flutter_vodozemac.dart' as vod; import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/client_download_content_extension.dart'; -import 'package:fluffychat/utils/client_manager.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/push_helper.dart'; import '../config/app_config.dart'; import '../config/setting_keys.dart'; -bool _vodInitialized = false; - extension NotificationResponseJson on NotificationResponse { String toJsonString() => jsonEncode({ 'type': notificationResponseType.name, @@ -49,35 +45,9 @@ void notificationTapBackground( Logs().i('Notification tap in background'); final sendPort = IsolateNameServer.lookupPortByName('background_tab_port'); - if (sendPort != null) { - sendPort.send(notificationResponse.toJsonString()); - return; - } - - if (!_vodInitialized) { - await vod.init(); - _vodInitialized = true; - } - final store = await AppSettings.init(); - final client = (await ClientManager.getClients( - initialize: false, - store: store, - )) - .first; - await client.abortSync(); - await client.init( - waitForFirstSync: false, - waitUntilLoadCompletedLoaded: false, - ); - - if (!client.isLogged()) { - throw Exception('Notification tab in background but not logged in!'); - } - try { - await notificationTap(notificationResponse, client: client); - } finally { - await client.dispose(closeDatabase: false); - } + if (sendPort == null) throw Exception('Main isolate not up!'); + sendPort.send(notificationResponse.toJsonString()); + Logs().wtf('Send notification tap intent to main isolate!'); return; } From 582797b5f60755037cc573a663b5ee545f257f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 11 Nov 2025 11:08:29 +0100 Subject: [PATCH 2/5] Revert "fix: Possible database corruption cause by allow multiple instances" --- .../notification_background_handler.dart | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/utils/notification_background_handler.dart b/lib/utils/notification_background_handler.dart index aec2d747a..aa8ea17dd 100644 --- a/lib/utils/notification_background_handler.dart +++ b/lib/utils/notification_background_handler.dart @@ -3,17 +3,21 @@ import 'dart:ui'; import 'package:collection/collection.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_vodozemac/flutter_vodozemac.dart' as vod; import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/client_download_content_extension.dart'; +import 'package:fluffychat/utils/client_manager.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/push_helper.dart'; import '../config/app_config.dart'; import '../config/setting_keys.dart'; +bool _vodInitialized = false; + extension NotificationResponseJson on NotificationResponse { String toJsonString() => jsonEncode({ 'type': notificationResponseType.name, @@ -45,9 +49,35 @@ void notificationTapBackground( Logs().i('Notification tap in background'); final sendPort = IsolateNameServer.lookupPortByName('background_tab_port'); - if (sendPort == null) throw Exception('Main isolate not up!'); - sendPort.send(notificationResponse.toJsonString()); - Logs().wtf('Send notification tap intent to main isolate!'); + if (sendPort != null) { + sendPort.send(notificationResponse.toJsonString()); + return; + } + + if (!_vodInitialized) { + await vod.init(); + _vodInitialized = true; + } + final store = await AppSettings.init(); + final client = (await ClientManager.getClients( + initialize: false, + store: store, + )) + .first; + await client.abortSync(); + await client.init( + waitForFirstSync: false, + waitUntilLoadCompletedLoaded: false, + ); + + if (!client.isLogged()) { + throw Exception('Notification tab in background but not logged in!'); + } + try { + await notificationTap(notificationResponse, client: client); + } finally { + await client.dispose(closeDatabase: false); + } return; } From 92fcfacfc4863037305a1109610aaa8030633dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 11 Nov 2025 14:30:34 +0100 Subject: [PATCH 3/5] fix: Database corruption because notification tab isolate starts too late --- lib/main.dart | 13 +++++++++++++ lib/utils/notification_background_handler.dart | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index 9f9c350c2..b07e69a8e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,6 @@ +import 'dart:isolate'; +import 'dart:ui'; + import 'package:flutter/material.dart'; import 'package:collection/collection.dart'; @@ -12,12 +15,22 @@ import 'config/setting_keys.dart'; import 'utils/background_push.dart'; import 'widgets/fluffy_chat_app.dart'; +ReceivePort? mainIsolateReceivePort; + void main() async { // Our background push shared isolate accesses flutter-internal things very early in the startup proccess // To make sure that the parts of flutter needed are started up already, we need to ensure that the // widget bindings are initialized already. WidgetsFlutterBinding.ensureInitialized(); + if (PlatformInfos.isAndroid) { + final port = mainIsolateReceivePort = ReceivePort(); + IsolateNameServer.registerPortWithName( + port.sendPort, + 'main_isolate', + ); + } + final store = await AppSettings.init(); Logs().i('Welcome to ${AppSettings.applicationName.value} <3'); diff --git a/lib/utils/notification_background_handler.dart b/lib/utils/notification_background_handler.dart index aa8ea17dd..32113502a 100644 --- a/lib/utils/notification_background_handler.dart +++ b/lib/utils/notification_background_handler.dart @@ -48,7 +48,7 @@ void notificationTapBackground( ) async { Logs().i('Notification tap in background'); - final sendPort = IsolateNameServer.lookupPortByName('background_tab_port'); + final sendPort = IsolateNameServer.lookupPortByName('main_isolate'); if (sendPort != null) { sendPort.send(notificationResponse.toJsonString()); return; From ae11d5b47f121e95c4b43d2ea566ba5b18191455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 11 Nov 2025 16:24:51 +0100 Subject: [PATCH 4/5] chore: set main isolate port even earlier --- lib/main.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index b07e69a8e..37e472add 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,11 +18,6 @@ import 'widgets/fluffy_chat_app.dart'; ReceivePort? mainIsolateReceivePort; void main() async { - // Our background push shared isolate accesses flutter-internal things very early in the startup proccess - // To make sure that the parts of flutter needed are started up already, we need to ensure that the - // widget bindings are initialized already. - WidgetsFlutterBinding.ensureInitialized(); - if (PlatformInfos.isAndroid) { final port = mainIsolateReceivePort = ReceivePort(); IsolateNameServer.registerPortWithName( @@ -31,6 +26,11 @@ void main() async { ); } + // Our background push shared isolate accesses flutter-internal things very early in the startup proccess + // To make sure that the parts of flutter needed are started up already, we need to ensure that the + // widget bindings are initialized already. + WidgetsFlutterBinding.ensureInitialized(); + final store = await AppSettings.init(); Logs().i('Welcome to ${AppSettings.applicationName.value} <3'); From 4f37d8e8ff2bb36439f6b6beb9cfd0fc1fa54587 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Nov 2025 21:09:10 +0000 Subject: [PATCH 5/5] build: (deps): bump file_picker from 10.3.3 to 10.3.6 Bumps [file_picker](https://github.com/miguelpruivo/flutter_file_picker) from 10.3.3 to 10.3.6. - [Release notes](https://github.com/miguelpruivo/flutter_file_picker/releases) - [Changelog](https://github.com/miguelpruivo/flutter_file_picker/blob/master/CHANGELOG.md) - [Commits](https://github.com/miguelpruivo/flutter_file_picker/compare/v10.3.3...v10.3.6) --- updated-dependencies: - dependency-name: file_picker dependency-version: 10.3.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 0a719fe83..3e2777e79 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -405,10 +405,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: f2d9f173c2c14635cc0e9b14c143c49ef30b4934e8d1d274d6206fcb0086a06f + sha256: f8f4ea435f791ab1f817b4e338ed958cb3d04ba43d6736ffc39958d950754967 url: "https://pub.dev" source: hosted - version: "10.3.3" + version: "10.3.6" file_selector: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 9b48f9f7b..72d4d1ef4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -26,7 +26,7 @@ dependencies: dynamic_color: ^1.8.1 emoji_picker_flutter: ^4.3.0 emojis: ^0.9.9 - file_picker: ^10.3.3 + file_picker: ^10.3.6 file_selector: ^1.0.4 flutter: sdk: flutter