diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 24cc724..32606cd 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -55,6 +55,7 @@ jobs: sudo apt-get install libmpv-dev mpv sudo apt-get install libayatana-appindicator3-dev sudo apt-get install keybinder-3.0 + sudo apt-get install libnotify-dev - run: flutter pub get - run: flutter build linux - name: Archive production artifacts diff --git a/assets/translations/en-US.json b/assets/translations/en-US.json index 97b6b97..7c43d6a 100644 --- a/assets/translations/en-US.json +++ b/assets/translations/en-US.json @@ -717,5 +717,6 @@ "fieldStickerAttachment": "Attachment", "stickersNew": "New Sticker", "stickersNewDescription": "Create a new sticker belongs to this pack.", - "stickersPackNew": "New Sticker Pack" + "stickersPackNew": "New Sticker Pack", + "trayMenuShow": "Show" } diff --git a/assets/translations/zh-CN.json b/assets/translations/zh-CN.json index e779b51..472178d 100644 --- a/assets/translations/zh-CN.json +++ b/assets/translations/zh-CN.json @@ -715,5 +715,6 @@ "fieldStickerAttachment": "附件", "stickersNew": "新建贴图", "stickersNewDescription": "创建一个新的贴图。", - "stickersPackNew": "新建贴图包" + "stickersPackNew": "新建贴图包", + "trayMenuShow": "显示" } diff --git a/lib/main.dart b/lib/main.dart index 5b74e46..7f5b55a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -48,6 +48,7 @@ import 'package:workmanager/workmanager.dart'; import 'package:in_app_review/in_app_review.dart'; import 'package:image_picker_android/image_picker_android.dart'; import 'package:image_picker_platform_interface/image_picker_platform_interface.dart'; +import 'package:local_notifier/local_notifier.dart'; @pragma('vm:entry-point') void appBackgroundDispatcher() { @@ -350,6 +351,10 @@ class _AppSplashScreenState extends State<_AppSplashScreen> with TrayListener { disabled: true, ), MenuItem.separator(), + MenuItem( + key: 'window_show', + label: 'trayMenuShow'.tr(), + ), MenuItem( key: 'exit', label: 'trayMenuExit'.tr(), @@ -359,6 +364,15 @@ class _AppSplashScreenState extends State<_AppSplashScreen> with TrayListener { await trayManager.setContextMenu(menu); } + Future _notifyInitialization() async { + if (kIsWeb || Platform.isAndroid || Platform.isIOS) return; + + await localNotifier.setup( + appName: 'solian', + shortcutPolicy: ShortcutPolicy.requireCreate, + ); + } + AppLifecycleListener? _appLifecycleListener; @override @@ -373,6 +387,7 @@ class _AppSplashScreenState extends State<_AppSplashScreen> with TrayListener { _trayInitialization(); _hotkeyInitialization(); + _notifyInitialization(); _initialize().then((_) { _postInitialization(); _tryRequestRating(); @@ -408,6 +423,9 @@ class _AppSplashScreenState extends State<_AppSplashScreen> with TrayListener { @override void onTrayMenuItemClick(MenuItem menuItem) { switch (menuItem.key) { + case 'window_show': + appWindow.show(); + break; case 'exit': _appLifecycleListener?.dispose(); SystemChannels.platform.invokeMethod('SystemNavigator.pop'); diff --git a/lib/providers/notification.dart b/lib/providers/notification.dart index d107ad1..18c63eb 100644 --- a/lib/providers/notification.dart +++ b/lib/providers/notification.dart @@ -1,11 +1,13 @@ import 'dart:developer'; import 'dart:io'; +import 'package:bitsdojo_window/bitsdojo_window.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_udid/flutter_udid.dart'; +import 'package:local_notifier/local_notifier.dart'; import 'package:provider/provider.dart'; import 'package:surface/providers/config.dart'; import 'package:surface/providers/sn_network.dart'; @@ -92,6 +94,20 @@ class NotificationProvider extends ChangeNotifier { updateTray(); final doHaptic = _cfg.prefs.getBool(kAppNotifyWithHaptic) ?? true; if (doHaptic) HapticFeedback.mediumImpact(); + + if (!kIsWeb) { + if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) { + LocalNotification notify = LocalNotification( + title: notification.title, + subtitle: notification.subtitle, + body: notification.body, + ); + notify.onClick = () { + appWindow.show(); + }; + notify.show(); + } + } } }); } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 85367b4..829bb26 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -38,6 +39,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) hotkey_manager_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "HotkeyManagerLinuxPlugin"); hotkey_manager_linux_plugin_register_with_registrar(hotkey_manager_linux_registrar); + g_autoptr(FlPluginRegistrar) local_notifier_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "LocalNotifierPlugin"); + local_notifier_plugin_register_with_registrar(local_notifier_registrar); g_autoptr(FlPluginRegistrar) media_kit_libs_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "MediaKitLibsLinuxPlugin"); media_kit_libs_linux_plugin_register_with_registrar(media_kit_libs_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 6d08ac5..02e94ea 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -9,6 +9,7 @@ list(APPEND FLUTTER_PLUGIN_LIST flutter_udid flutter_webrtc hotkey_manager_linux + local_notifier media_kit_libs_linux media_kit_video pasteboard diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 96a5bb8..965bc4c 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -21,6 +21,7 @@ import gal import hotkey_manager_macos import in_app_review import livekit_client +import local_notifier import media_kit_libs_macos_video import media_kit_video import package_info_plus @@ -53,6 +54,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { HotkeyManagerMacosPlugin.register(with: registry.registrar(forPlugin: "HotkeyManagerMacosPlugin")) InAppReviewPlugin.register(with: registry.registrar(forPlugin: "InAppReviewPlugin")) LiveKitPlugin.register(with: registry.registrar(forPlugin: "LiveKitPlugin")) + LocalNotifierPlugin.register(with: registry.registrar(forPlugin: "LocalNotifierPlugin")) MediaKitLibsMacosVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosVideoPlugin")) MediaKitVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitVideoPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) diff --git a/pubspec.lock b/pubspec.lock index d9111d0..459dcf0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1205,6 +1205,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.6" + local_notifier: + dependency: "direct main" + description: + name: local_notifier + sha256: f6cfc933c6fbc961f4e52b5c880f68e41b2d3cd29aad557cc654fd211093a025 + url: "https://pub.dev" + source: hosted + version: "0.1.6" logging: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 34bbe47..743741b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -123,6 +123,7 @@ dependencies: image_picker_platform_interface: ^2.10.1 drift: ^2.25.1 drift_flutter: ^0.2.4 + local_notifier: ^0.1.6 dev_dependencies: flutter_test: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 6afb8f4..91d44ed 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("HotkeyManagerWindowsPluginCApi")); LiveKitPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("LiveKitPlugin")); + LocalNotifierPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("LocalNotifierPlugin")); MediaKitLibsWindowsVideoPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("MediaKitLibsWindowsVideoPluginCApi")); MediaKitVideoPluginCApiRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b9e9598..4b751c1 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -14,6 +14,7 @@ list(APPEND FLUTTER_PLUGIN_LIST gal hotkey_manager_windows livekit_client + local_notifier media_kit_libs_windows_video media_kit_video pasteboard