diff --git a/lib/cwtch/cwtchNotifier.dart b/lib/cwtch/cwtchNotifier.dart index 66abce25..f5f0f7d6 100644 --- a/lib/cwtch/cwtchNotifier.dart +++ b/lib/cwtch/cwtchNotifier.dart @@ -176,6 +176,7 @@ class CwtchNotifier { seenMessageCallback!(data["ProfileOnion"]!, identifier, DateTime.now().toUtc()); } + print("New Message from peer..."); if (notification == "SimpleEvent") { notificationManager.notify(notificationSimple ?? "New Message", "", 0); } else if (notification == "ContactInfo") { diff --git a/lib/l10n/custom_material_delegate.dart b/lib/l10n/custom_material_delegate.dart index d7609a60..e0cb4fe9 100644 --- a/lib/l10n/custom_material_delegate.dart +++ b/lib/l10n/custom_material_delegate.dart @@ -312,6 +312,182 @@ class MaterialLocalizationLu extends MaterialLocalizations { @override String get viewLicensesButtonLabel => 'LIZENZEN ANZEIGEN'; + // ***** NEW ***** + + @override + String get keyboardKeyAlt => 'Datum'; + + @override + String get keyboardKeyAltGraph => 'Datum'; + + @override + String get keyboardKeyBackspace => 'Datum'; + + @override + String get keyboardKeyCapsLock => 'Datum'; + + @override + String get keyboardKeyChannelDown => 'Datum'; + + @override + String get keyboardKeyChannelUp => 'Datum'; + + @override + String get keyboardKeyControl => 'Datum'; + + @override + String get keyboardKeyDelete => 'Datum'; + + @override + String get keyboardKeyEisu => 'Datum'; + + @override + String get keyboardKeyEject => 'Datum'; + + @override + String get keyboardKeyEnd => 'Datum'; + + @override + String get keyboardKeyEscape => 'Datum'; + + @override + String get keyboardKeyFn => 'Datum'; + + @override + String get keyboardKeyHangulMode => 'Datum'; + + @override + String get keyboardKeyHanjaMode => 'Datum'; + + @override + String get keyboardKeyHankaku => 'Datum'; + + @override + String get keyboardKeyHiragana => 'Datum'; + + @override + String get keyboardKeyHiraganaKatakana => 'Datum'; + + @override + String get keyboardKeyHome => 'Datum'; + + @override + String get keyboardKeyInsert => 'Datum'; + + @override + String get keyboardKeyKanaMode => 'Datum'; + + @override + String get keyboardKeyKanjiMode => 'Datum'; + + @override + String get keyboardKeyKatakana => 'Datum'; + + @override + String get keyboardKeyMeta => 'Datum'; + + @override + String get keyboardKeyMetaMacOs => 'Datum'; + + @override + String get keyboardKeyMetaWindows => 'Datum'; + + @override + String get keyboardKeyNumLock => 'Datum'; + + @override + String get keyboardKeyNumpad1 => 'Datum'; + + @override + String get keyboardKeyNumpad2 => 'Datum'; + + @override + String get keyboardKeyNumpad3 => 'Datum'; + + @override + String get keyboardKeyNumpad4 => 'Datum'; + + @override + String get keyboardKeyNumpad5 => 'Datum'; + + @override + String get keyboardKeyNumpad6 => 'Datum'; + + @override + String get keyboardKeyNumpad7 => 'Datum'; + + @override + String get keyboardKeyNumpad8 => 'Datum'; + + @override + String get keyboardKeyNumpad9 => 'Datum'; + + @override + String get keyboardKeyNumpad0 => 'Datum'; + + @override + String get keyboardKeyNumpadAdd => 'Datum'; + + @override + String get keyboardKeyNumpadComma => 'Datum'; + + @override + String get keyboardKeyNumpadDecimal => 'Datum'; + + @override + String get keyboardKeyNumpadDivide => 'Datum'; + + @override + String get keyboardKeyNumpadEnter => 'Datum'; + + @override + String get keyboardKeyNumpadEqual => 'Datum'; + + @override + String get keyboardKeyNumpadMultiply => 'Datum'; + + @override + String get keyboardKeyNumpadParenLeft => 'Datum'; + + @override + String get keyboardKeyNumpadParenRight => 'Datum'; + + @override + String get keyboardKeyNumpadSubtract => 'Datum'; + + @override + String get keyboardKeyPageDown => 'Datum'; + + @override + String get keyboardKeyPageUp => 'Datum'; + + @override + String get keyboardKeyPower => 'Datum'; + + @override + String get keyboardKeyPowerOff => 'Datum'; + + @override + String get keyboardKeyPrintScreen => 'Datum'; + + @override + String get keyboardKeyRomaji => 'Datum'; + + @override + String get keyboardKeyScrollLock => 'Datum'; + + @override + String get keyboardKeySelect => 'Datum'; + + @override + String get keyboardKeySpace => 'Datum'; + + @override + String get keyboardKeyZenkaku => 'Datum'; + + @override + String get keyboardKeyZenkakuHankaku => 'Datum'; + @override String aboutListTileTitle(String applicationName) { return aboutListTileTitleRaw.replaceFirst("$applicationName", applicationName); diff --git a/lib/notification_manager.dart b/lib/notification_manager.dart index 4e2f58d4..10ab6ee4 100644 --- a/lib/notification_manager.dart +++ b/lib/notification_manager.dart @@ -10,6 +10,8 @@ import 'package:desktop_notifications/desktop_notifications.dart' as linux_notif import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications_linux/flutter_local_notifications_linux.dart'; import 'package:flutter_local_notifications_linux/src/model/hint.dart'; +import 'package:flutter_local_notifications_linux/src/model/icon.dart'; + import 'package:path/path.dart' as path; @@ -126,32 +128,80 @@ class NotificationPayload { class NixNotificationManager implements NotificationsManager { late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin; late Future Function(String, int) notificationSelectConvo; + late String linuxAssetsPath; + + + // Cwtch can install in non flutter supported ways on linux, this code detects where the assets are on Linux + Future detectLinuxAssetsPath() async { + //var devStat = FileStat.stat("assets"); + //var localStat = FileStat.stat("data/flutter_assets"); + var homeStat = FileStat.stat((Platform.environment["HOME"] ?? "") + "/.local/share/cwtch/data/flutter_assets"); + var rootStat = FileStat.stat("/usr/share/cwtch/data/flutter_assets"); + + /*if ((await devStat).type == FileSystemEntityType.directory) { + return Directory.current.path; //appPath; + } else if ((await localStat).type == FileSystemEntityType.directory) { + return path.join(Directory.current.path, "data/flutter_assets/"); + } else */if ((await homeStat).type == FileSystemEntityType.directory) { + return (Platform.environment["HOME"] ?? "") + "/.local/share/cwtch/data/flutter_assets/"; + } else if ((await rootStat).type == FileSystemEntityType.directory) { + return "/usr/share/cwtch/data/flutter_assets/"; + } + return ""; + } NixNotificationManager(Future Function(String, int) notificationSelectConvo) { this.notificationSelectConvo = notificationSelectConvo; flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); - final MacOSInitializationSettings initializationSettingsMacOS = MacOSInitializationSettings(defaultPresentSound: false); - final LinuxInitializationSettings initializationSettingsLinux = - LinuxInitializationSettings(defaultActionName: 'Open notification', defaultIcon: AssetsLinuxIcon('assets/knott.png'), defaultSuppressSound: true); - final InitializationSettings initializationSettings = InitializationSettings(android: null, iOS: null, macOS: initializationSettingsMacOS, linux: initializationSettingsLinux); + scheduleMicrotask(() async { + + if (Platform.isLinux) { + linuxAssetsPath = await detectLinuxAssetsPath(); + print("NixNotificationManager found LinuxAssetsPath!: $linuxAssetsPath"); + } else { + linuxAssetsPath = ""; + } + + final MacOSInitializationSettings initializationSettingsMacOS = MacOSInitializationSettings(defaultPresentSound: false); + var linuxIcon = FilePathLinuxIcon( path.join(linuxAssetsPath, 'assets/knott.png')); + print("NixNotificationManager make linux settings"); + + final LinuxInitializationSettings initializationSettingsLinux = + LinuxInitializationSettings(defaultActionName: 'Open notification', defaultIcon: linuxIcon, defaultSuppressSound: true); + + print("NixNotificationManager InitializationSettings"); + + final InitializationSettings initializationSettings = InitializationSettings(android: null, iOS: null, macOS: initializationSettingsMacOS, linux: initializationSettingsLinux); + + print("NixNotificationManager mac req perms"); + flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation()?.requestPermissions( alert: true, badge: false, sound: false, ); + print("NixNotificationManager initialize..."); await flutterLocalNotificationsPlugin.initialize(initializationSettings, onSelectNotification: selectNotification); + print("NixNotificationManager initialized!!!"); }); } Future notify(String message, String profile, int conversationId) async { + print("notify if !globalAppState.focus so do? ${!globalAppState.focus}"); if (!globalAppState.focus) { + + print("do notify!"); + // Warning: Only use title field on Linux, body field will render links as clickable - await flutterLocalNotificationsPlugin.show(0, message, '', NotificationDetails(linux: LinuxNotificationDetails(suppressSound: true, category: LinuxNotificationCategory.imReceived())), + await flutterLocalNotificationsPlugin.show(0, message, '', + NotificationDetails(linux: LinuxNotificationDetails(suppressSound: true, category: LinuxNotificationCategory.imReceived(), icon: FilePathLinuxIcon(path.join(linuxAssetsPath, 'assets/knott.png')))), payload: jsonEncode(NotificationPayload(profile, conversationId))); + + print("done notify"); } } @@ -168,7 +218,7 @@ class NixNotificationManager implements NotificationsManager { NotificationsManager newDesktopNotificationsManager(Future Function(String profileOnion, int convoId) notificationSelectConvo) { if (Platform.isLinux && !Platform.isAndroid) { try { - return LinuxNotificationsManager(notificationSelectConvo); + return NixNotificationManager(notificationSelectConvo); } catch (e) { EnvironmentConfig.debugLog("Failed to create LinuxNotificationManager. Switching off notifications."); } diff --git a/pubspec.lock b/pubspec.lock index b393355b..56b9d2a4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -28,7 +28,7 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.6" + version: "3.1.11" args: dependency: transitive description: @@ -154,7 +154,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" convert: dependency: transitive description: @@ -203,7 +203,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" ffi: dependency: "direct main" description: @@ -259,16 +259,16 @@ packages: flutter_local_notifications: dependency: "direct main" description: - name: flutter_local_notifications - url: "https://pub.dartlang.org" - source: hosted - version: "9.3.2" + path: "/home/dan/src/openprivacy/flutter_local_notifications/flutter_local_notifications" + relative: false + source: path + version: "9.5.3+1" flutter_local_notifications_linux: - dependency: transitive + dependency: "direct overridden" description: - name: flutter_local_notifications_linux - url: "https://pub.dartlang.org" - source: hosted + path: "/home/dan/src/openprivacy/flutter_local_notifications/flutter_local_notifications_linux" + relative: false + source: path version: "0.4.2" flutter_local_notifications_platform_interface: dependency: transitive @@ -385,7 +385,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: @@ -407,6 +407,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.12.11" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" meta: dependency: transitive description: @@ -490,7 +497,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" path_provider: dependency: "direct main" description: @@ -553,7 +560,7 @@ packages: name: platform url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.1.0" plugin_platform_interface: dependency: transitive description: @@ -635,7 +642,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -684,7 +691,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.4.9" timezone: dependency: transitive description: @@ -768,14 +775,14 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" vm_service: dependency: transitive description: name: vm_service url: "https://pub.dartlang.org" source: hosted - version: "7.3.0" + version: "8.2.2" watcher: dependency: transitive description: @@ -840,5 +847,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.15.0 <3.0.0" + dart: ">=2.17.0-0 <3.0.0" flutter: ">=2.5.0" diff --git a/pubspec.yaml b/pubspec.yaml index 022f539c..676e0aad 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -44,9 +44,17 @@ dependencies: window_manager: ^0.1.4 # notification plugins win_toast: ^0.0.2 - flutter_local_notifications: 9.3.2 + # 9.3.2 + flutter_local_notifications: + path: /home/dan/src/openprivacy/flutter_local_notifications/flutter_local_notifications + + desktop_notifications: ^0.6.3 +dependency_overrides: + flutter_local_notifications_linux: + path: /home/dan/src/openprivacy/flutter_local_notifications/flutter_local_notifications_linux + dev_dependencies: msix: ^2.1.3 flutter_gherkin: ^3.0.0-rc.9