From 9f6b199b82313ec3c7077ff51a885aac8cef4b17 Mon Sep 17 00:00:00 2001 From: Cranyozen <61766249+cranyozen@users.noreply.github.com> Date: Fri, 23 Feb 2024 15:10:35 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=F0=9F=94=A7=20Fix:=20Bluetooth=20Connect?= =?UTF-8?q?=20permission=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For Android 12 --- kitx_mobile/android/app/src/main/AndroidManifest.xml | 1 + kitx_mobile/lib/data/local_network_info.dart | 4 ++-- kitx_mobile/lib/utils/handlers/permissions_handlers.dart | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/kitx_mobile/android/app/src/main/AndroidManifest.xml b/kitx_mobile/android/app/src/main/AndroidManifest.xml index 5c605ad..372f60a 100644 --- a/kitx_mobile/android/app/src/main/AndroidManifest.xml +++ b/kitx_mobile/android/app/src/main/AndroidManifest.xml @@ -80,6 +80,7 @@ + diff --git a/kitx_mobile/lib/data/local_network_info.dart b/kitx_mobile/lib/data/local_network_info.dart index 0861dfc..f13674e 100644 --- a/kitx_mobile/lib/data/local_network_info.dart +++ b/kitx_mobile/lib/data/local_network_info.dart @@ -20,6 +20,8 @@ class LocalNetworkInfo { /// Get an instance for [LocalNetworkInfo] class static Future get() async { + await requestNetworkRelatedPermissions(); + var getBackupDeviceIdStringForAndroid = () async { var _deviceInfoPlugin = DeviceInfoPlugin(); @@ -47,8 +49,6 @@ class LocalNetworkInfo { late String? _ipv4, _ipv6, _mac; - await requestNetworkRelatedPermissions(); - _ipv4 = await _networkInfo.getWifiIP(); _ipv6 = await _networkInfo.getWifiIPv6(); diff --git a/kitx_mobile/lib/utils/handlers/permissions_handlers.dart b/kitx_mobile/lib/utils/handlers/permissions_handlers.dart index 31b2dd5..0b7175c 100644 --- a/kitx_mobile/lib/utils/handlers/permissions_handlers.dart +++ b/kitx_mobile/lib/utils/handlers/permissions_handlers.dart @@ -2,7 +2,7 @@ /// Request Permission Future requestPermission(Permission target) async { - var status = await Permission.location.status; + var status = await target.status; if (status.isDenied || status.isRestricted) { return target.request().isGranted; } else { @@ -24,6 +24,7 @@ Future requestNetworkRelatedPermissions() async { var result = await requestPermissions([ Permission.location, Permission.bluetooth, + Permission.bluetoothConnect, ]); if (result.every((element) => element)) { From 8ef86960f5505011cab8b7fd090e131b31cdd642 Mon Sep 17 00:00:00 2001 From: Cranyozen <61766249+cranyozen@users.noreply.github.com> Date: Sat, 24 Feb 2024 20:49:03 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=F0=9F=92=BE=20Feat:=20Add=20test=20notif?= =?UTF-8?q?ication=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TODO: Adapt to iOS. See [awesome_notifications docs](https://github.com/rafaelsetragni/awesome_notifications/blob/master/README.md#-configuring-ios-for-awesome-notifications) --- .../android/app/src/main/AndroidManifest.xml | 1 + .../app/src/main/res/drawable/app_icon.png | Bin 0 -> 3777 bytes kitx_mobile/android/build.gradle | 1 + kitx_mobile/lib/instances.dart | 7 +++ kitx_mobile/lib/services/notification.dart | 54 ++++++++++++++++++ .../extensions/service_status_to_string.dart | 23 ++++++++ kitx_mobile/lib/utils/translation.dart | 14 +++++ kitx_mobile/pubspec.yaml | 1 + 8 files changed, 101 insertions(+) create mode 100644 kitx_mobile/android/app/src/main/res/drawable/app_icon.png create mode 100644 kitx_mobile/lib/services/notification.dart create mode 100644 kitx_mobile/lib/utils/extensions/service_status_to_string.dart diff --git a/kitx_mobile/android/app/src/main/AndroidManifest.xml b/kitx_mobile/android/app/src/main/AndroidManifest.xml index 372f60a..376ca70 100644 --- a/kitx_mobile/android/app/src/main/AndroidManifest.xml +++ b/kitx_mobile/android/app/src/main/AndroidManifest.xml @@ -83,4 +83,5 @@ + diff --git a/kitx_mobile/android/app/src/main/res/drawable/app_icon.png b/kitx_mobile/android/app/src/main/res/drawable/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..61be1b2bbcd6edac0321766a1387614f8953f027 GIT binary patch literal 3777 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 T1@jVnt_0?%tc**HoTL8(>uT9l literal 0 HcmV?d00001 diff --git a/kitx_mobile/android/build.gradle b/kitx_mobile/android/build.gradle index 28680a3..92fb1c6 100644 --- a/kitx_mobile/android/build.gradle +++ b/kitx_mobile/android/build.gradle @@ -7,6 +7,7 @@ buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'com.android.tools.build:gradle:7.3.0' } } diff --git a/kitx_mobile/lib/instances.dart b/kitx_mobile/lib/instances.dart index c178dc6..bf3598f 100644 --- a/kitx_mobile/lib/instances.dart +++ b/kitx_mobile/lib/instances.dart @@ -7,6 +7,7 @@ import 'package:kitx_mobile/data/local_device_info.dart'; import 'package:kitx_mobile/data/local_network_info.dart'; import 'package:kitx_mobile/services/devices_discovery_service.dart'; import 'package:kitx_mobile/services/devices_service.dart'; +import 'package:kitx_mobile/services/notification.dart'; import 'package:kitx_mobile/utils/config.dart'; import 'package:kitx_mobile/utils/handlers/tasks/delayed_task.dart'; import 'package:kitx_mobile/utils/handlers/url_handler.dart'; @@ -53,6 +54,9 @@ class Instances { /// Instance for [DeviceService] class var devicesService = DeviceService(); + /// Instance for [NotificationService] class + var notificationService = NotificationService(); + /// Is in debug mode var isDebugMode = kDebugMode.obs; @@ -75,6 +79,9 @@ class Instances { // Init DeviceService await devicesService.init(); + + // Init NotificationService + await notificationService.initAsync(); } /// Restart [devicesService] and [devicesDiscoveryService] diff --git a/kitx_mobile/lib/services/notification.dart b/kitx_mobile/lib/services/notification.dart new file mode 100644 index 0000000..5f54b01 --- /dev/null +++ b/kitx_mobile/lib/services/notification.dart @@ -0,0 +1,54 @@ +import 'package:awesome_notifications/awesome_notifications.dart'; +import 'package:get/get.dart'; +import 'package:kitx_mobile/services/public/service_status.dart'; +import 'package:kitx_mobile/utils/extensions/service_status_to_string.dart'; +// import 'package:flutter/material.dart'; + +/// [NotificationService] class +class NotificationService { + /// Status notification id + var statusNotificationId = 10; + + /// Status channel key + var statusChannelKey = "status_channel"; + + /// Initialize the notification service + Future initAsync() async { + // TODO: Adapt to iOS + AwesomeNotifications().initialize( + 'resource://drawable/app_icon', + [ + // KitX status channel + NotificationChannel( + channelKey: statusChannelKey, + channelName: 'KitX Status Notifications', + channelDescription: 'KitX status', + locked: true, + // defaultColor: Color(0xFF9D50DD), + // ledColor: Colors.white, + ), + ], + ); + } + + /// Update status notification + Future updateStatusNotification({ + required int deviceCount, + required ServiceStatus serviceStatus, + }) async { + AwesomeNotifications().createNotification( + content: NotificationContent( + id: statusNotificationId, + channelKey: statusChannelKey, + title: + 'NotificationService_StatusNotificationTitle'.tr.replaceAll("%status%", serviceStatus.toText()), + body: 'NotificationService_StatusNotificationBody' + .tr + .replaceAll('%device_count%', deviceCount.toString()), + locked: true, + autoDismissible: false, + category: NotificationCategory.Status, + ), + ); + } +} diff --git a/kitx_mobile/lib/utils/extensions/service_status_to_string.dart b/kitx_mobile/lib/utils/extensions/service_status_to_string.dart new file mode 100644 index 0000000..44cb541 --- /dev/null +++ b/kitx_mobile/lib/utils/extensions/service_status_to_string.dart @@ -0,0 +1,23 @@ +import 'package:get/get.dart'; +import 'package:kitx_mobile/services/public/service_status.dart'; + +/// [ServiceStatus] Extensions +extension ServiceStatusExtensions on ServiceStatus { + /// Convert [ServiceStatus] to [String] + String toText() { + switch (this) { + case ServiceStatus.error: + return 'ServiceStatus_Error'.tr; + case ServiceStatus.starting: + return 'ServiceStatus_Starting'.tr; + case ServiceStatus.stopping: + return 'ServiceStatus_Stopping'.tr; + case ServiceStatus.running: + return 'ServiceStatus_Running'.tr; + case ServiceStatus.pending: + return 'ServiceStatus_Pending'.tr; + default: + return 'Unknown'; + } + } +} diff --git a/kitx_mobile/lib/utils/translation.dart b/kitx_mobile/lib/utils/translation.dart index 630c2f3..bcd7e37 100644 --- a/kitx_mobile/lib/utils/translation.dart +++ b/kitx_mobile/lib/utils/translation.dart @@ -19,6 +19,13 @@ class Translation extends Translations { 'Public_Launching': "启动中", 'Public_Stop': "停止", 'Public_Stopping': "停止中", + 'ServiceStatus_Error': '发生错误', + 'ServiceStatus_Starting': '正在启动', + 'ServiceStatus_Stopping': '正在停止', + 'ServiceStatus_Running': '已停止', + 'ServiceStatus_Pending': '等待中', + 'NotificationService_StatusNotificationTitle': 'KitX %status%', + 'NotificationService_StatusNotificationBody': '当前设备数: %device_count%', 'Drawer_Title': 'KitX', 'Drawer_Devices': '设备管理', 'Drawer_Account': '账户', @@ -72,6 +79,13 @@ class Translation extends Translations { 'Public_Launching': "Launching", 'Public_Stop': "Stop", 'Public_Stopping': "Stopping", + 'ServiceStatus_Error': 'Error', + 'ServiceStatus_Starting': 'Starting', + 'ServiceStatus_Stopping': 'Stopping', + 'ServiceStatus_Running': 'Running', + 'ServiceStatus_Pending': 'Stopped', + 'NotificationService_StatusNotificationTitle': 'KitX %status%', + 'NotificationService_StatusNotificationBody': '%device_count% Devices Online', 'Drawer_Title': 'KitX', 'Drawer_Devices': 'Devices', 'Drawer_Account': 'Account', diff --git a/kitx_mobile/pubspec.yaml b/kitx_mobile/pubspec.yaml index a77f2bf..fb7e51a 100644 --- a/kitx_mobile/pubspec.yaml +++ b/kitx_mobile/pubspec.yaml @@ -9,6 +9,7 @@ environment: sdk: ">=3.0.0 <4.0.0" dependencies: + awesome_notifications: ^0.7.4+1 badges: ^3.1.2 # 徽章 battery_plus: ^5.0.3 # 电池数据 community_material_icon: ^5.9.55 # Material Design Icons 社区贡献 From ad8592a6e243bbf8c662e3b9c765dd979a5cbbbf Mon Sep 17 00:00:00 2001 From: Cranyozen <61766249+cranyozen@users.noreply.github.com> Date: Sat, 24 Feb 2024 22:22:29 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=F0=9F=94=A7=20Fix(instances.dart):=20Fix?= =?UTF-8?q?=20LateError=20(LateInitializationError:=20Field=20'sendTimer'?= =?UTF-8?q?=20has=20not=20been=20initialized.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kitx_mobile/lib/instances.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/kitx_mobile/lib/instances.dart b/kitx_mobile/lib/instances.dart index bf3598f..c83fd12 100644 --- a/kitx_mobile/lib/instances.dart +++ b/kitx_mobile/lib/instances.dart @@ -66,14 +66,6 @@ class Instances { deviceInfo = await LocalDeviceInfo.get(); networkInfo = await LocalNetworkInfo.get(); - connectivity.onConnectivityChanged.listen( - (result) async { - instances.deviceInfo = await LocalDeviceInfo.get(); - instances.networkInfo = await LocalNetworkInfo.get(); - restartDevicesServer(); - }, - ); - // Init WebService await devicesDiscoveryService.init(); @@ -82,6 +74,14 @@ class Instances { // Init NotificationService await notificationService.initAsync(); + + connectivity.onConnectivityChanged.listen( + (result) async { + instances.deviceInfo = await LocalDeviceInfo.get(); + instances.networkInfo = await LocalNetworkInfo.get(); + restartDevicesServer(); + }, + ); } /// Restart [devicesService] and [devicesDiscoveryService] From c9e0cee30f47dcc138038579de7e22da690d188a Mon Sep 17 00:00:00 2001 From: Cranyozen <61766249+cranyozen@users.noreply.github.com> Date: Sat, 24 Feb 2024 22:24:59 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=F0=9F=92=BE=20Feat(log.dart):=20Add=20st?= =?UTF-8?q?ack=20trace=20for=20log.error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kitx_mobile/lib/utils/log.dart | 7 ++++++- kitx_mobile/pubspec.yaml | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/kitx_mobile/lib/utils/log.dart b/kitx_mobile/lib/utils/log.dart index 285f625..539f866 100644 --- a/kitx_mobile/lib/utils/log.dart +++ b/kitx_mobile/lib/utils/log.dart @@ -7,6 +7,7 @@ import 'package:f_logs/model/flog/flog_config.dart'; import 'package:f_logs/model/flog/log_level.dart'; import 'package:f_logs/utils/formatter/formate_type.dart'; import 'package:f_logs/utils/timestamp/timestamp_format.dart'; +import 'package:stack_trace/stack_trace.dart'; var _config = LogsConfig() ..isDebuggable = true @@ -26,7 +27,11 @@ class Log { void info(String message) => FLog.info(text: message); /// Log a message at level [LogLevel.ERROR]. - void error(String message) => FLog.error(text: message); + void error(String message) { + var trace = Trace.current().frames; + var filteredTrace = trace.where((frame) => !frame.library.contains('package:kitx_mobile/utils/log.dart')); + FLog.error(text: message, stacktrace: Trace(filteredTrace)); + } /// Log a message at level [LogLevel.WARNING]. void warning(String message) => FLog.warning(text: message); diff --git a/kitx_mobile/pubspec.yaml b/kitx_mobile/pubspec.yaml index fb7e51a..424a5be 100644 --- a/kitx_mobile/pubspec.yaml +++ b/kitx_mobile/pubspec.yaml @@ -35,6 +35,7 @@ dependencies: shared_preferences: ^2.2.2 sliding_up_panel: ^2.0.0+1 # 向上滑动布局 # sms_receiver: ^0.4.1 # 短信接收 + stack_trace: ^1.11.1 url_launcher: ^6.2.4 # 打开链接 vibration: ^1.8.4 # 手机震动 wakelock_plus: ^1.1.4 From d810d9c12884015a762eb09628e69e093b464875 Mon Sep 17 00:00:00 2001 From: Cranyozen <61766249+cranyozen@users.noreply.github.com> Date: Sat, 24 Feb 2024 22:35:40 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=F0=9F=93=9D=20Chore(about=5Fpage.dart):?= =?UTF-8?q?=20Corrected=20the=20contributor's=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kitx_mobile/lib/pages/about_page.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kitx_mobile/lib/pages/about_page.dart b/kitx_mobile/lib/pages/about_page.dart index d8e558d..aedc78f 100644 --- a/kitx_mobile/lib/pages/about_page.dart +++ b/kitx_mobile/lib/pages/about_page.dart @@ -207,8 +207,8 @@ class _AboutPageState extends State { const ContributorChip(name: 'Dynesshely', url: 'https://github.com/Dynesshely'), const SizedBox(width: 10), const ContributorChip( - name: 'LYF511', - url: 'https://github.com/LYF511', + name: 'Cranyozen', + url: 'https://github.com/Cranyozen', ), const SizedBox(width: 10), const ContributorChip( From 3eeaefcc7f1537f08ab4a2e4078f1d86ab135e23 Mon Sep 17 00:00:00 2001 From: Cranyozen <61766249+cranyozen@users.noreply.github.com> Date: Sat, 24 Feb 2024 22:47:41 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=F0=9F=94=A7=20Fix(translation.dart):=20T?= =?UTF-8?q?ranslation=20error=20for=20service=20status?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kitx_mobile/lib/utils/translation.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kitx_mobile/lib/utils/translation.dart b/kitx_mobile/lib/utils/translation.dart index bcd7e37..8689964 100644 --- a/kitx_mobile/lib/utils/translation.dart +++ b/kitx_mobile/lib/utils/translation.dart @@ -22,8 +22,8 @@ class Translation extends Translations { 'ServiceStatus_Error': '发生错误', 'ServiceStatus_Starting': '正在启动', 'ServiceStatus_Stopping': '正在停止', - 'ServiceStatus_Running': '已停止', - 'ServiceStatus_Pending': '等待中', + 'ServiceStatus_Running': '正在运行', + 'ServiceStatus_Pending': '已停止', 'NotificationService_StatusNotificationTitle': 'KitX %status%', 'NotificationService_StatusNotificationBody': '当前设备数: %device_count%', 'Drawer_Title': 'KitX', From 95f1abf1cc60c4af9d8da7f29934285c1a9d34ef Mon Sep 17 00:00:00 2001 From: Cranyozen <61766249+cranyozen@users.noreply.github.com> Date: Fri, 29 Mar 2024 19:58:38 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=F0=9F=94=A7=20Fix(devices=5Fdiscovery=5F?= =?UTF-8?q?service.dart):=20Fix=20sendTimer=20LateError.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kitx_mobile/lib/services/devices_discovery_service.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kitx_mobile/lib/services/devices_discovery_service.dart b/kitx_mobile/lib/services/devices_discovery_service.dart index f54c27e..713fdbc 100644 --- a/kitx_mobile/lib/services/devices_discovery_service.dart +++ b/kitx_mobile/lib/services/devices_discovery_service.dart @@ -93,9 +93,7 @@ class DevicesDiscoveryService implements Service { socket.broadcastEnabled = true; socket.joinMulticast(InternetAddress(_udpBroadcastAddress)); - Timer.periodic(Duration(seconds: config.webServiceUdpSendFrequency), (timer) { - sendTimer = timer; - + sendTimer = Timer.periodic(Duration(seconds: config.webServiceUdpSendFrequency), (timer) { try { deviceInfo = deviceInfo.rebuild((b) => b..sendTime = DateTime.now().toUtc()); From 9698f92584e5916ddfc3c36c45bfdeff42b23aa3 Mon Sep 17 00:00:00 2001 From: Cranyozen <61766249+cranyozen@users.noreply.github.com> Date: Sun, 31 Mar 2024 13:01:59 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=EF=BB=BF=F0=9F=A7=A9=20Refactor(translat?= =?UTF-8?q?ion).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kitx_mobile/lib/utils/translation.dart | 140 ------------------ kitx_mobile/lib/utils/translation/en_us.dart | 66 +++++++++ .../lib/utils/translation/translation.dart | 10 ++ kitx_mobile/lib/utils/translation/zh_cn.dart | 66 +++++++++ 4 files changed, 142 insertions(+), 140 deletions(-) delete mode 100644 kitx_mobile/lib/utils/translation.dart create mode 100644 kitx_mobile/lib/utils/translation/en_us.dart create mode 100644 kitx_mobile/lib/utils/translation/translation.dart create mode 100644 kitx_mobile/lib/utils/translation/zh_cn.dart diff --git a/kitx_mobile/lib/utils/translation.dart b/kitx_mobile/lib/utils/translation.dart deleted file mode 100644 index dcacef0..0000000 --- a/kitx_mobile/lib/utils/translation.dart +++ /dev/null @@ -1,140 +0,0 @@ -import 'package:get/get.dart'; - -/// Translation Data -class Translation extends Translations { - @override - Map> get keys => { - 'zh_CN': { - 'Public_Enable': '启用', - 'Public_Disable': '禁用', - 'Public_Animation': '动画', - 'Public_Additional': '额外的', - 'Public_Log': '日志', - 'Public_Reload': '重载', - 'Public_Restart': '重启', - 'Public_Chat': '聊天', - 'Public_Closed': "已关闭", - 'Public_Error': "错误", - 'Public_Launch': "启动", - 'Public_Launching': "启动中", - 'Public_Stop': "停止", - 'Public_Stopping': "停止中", - 'ServiceStatus_Error': '发生错误', - 'ServiceStatus_Starting': '正在启动', - 'ServiceStatus_Stopping': '正在停止', - 'ServiceStatus_Running': '正在运行', - 'ServiceStatus_Pending': '已停止', - 'NotificationService_StatusNotificationTitle': 'KitX %status%', - 'NotificationService_StatusNotificationBody': '当前设备数: %device_count%', - 'Drawer_Title': 'KitX', - 'Drawer_Devices': '设备管理', - 'Drawer_Plugins': '插件列表', - 'Drawer_Account': '账户', - 'Drawer_Test': '测试', - 'Drawer_Setting': '设置', - 'Drawer_About': '关于', - 'Option_RestartDevicesServer': '重启设备网络服务器', - 'Option_ShutdownDevicesServer': '关闭设备网络服务器', - 'IndexPage_Title': 'KitX', - 'HomePage_DevicesCount': '设备在线', - 'DevicesPage_Title': '设备管理', - 'DevicesPage_PluginsCountText': '%count% 插件在线', - 'DevicesPage_LocalDevice': '(本机)', - 'DevicesPage_MainDevice': '(主控)', - 'DeviceChatPage_Title': '聊天', - 'PluginsPage_Title': '插件列表', - 'PluginsPage_BuiltInPlugins': '内置插件', - 'PluginsPage_ConnectedPlugins': '已连接的插件', - 'AccountPage_Title': '账户', - 'TestPage_Title': '测试', - 'SettingsPage_Title': '设置', - 'SettingsPage_Languages': '语言', - 'SettingsPage_Theme': '主题', - 'SettingsPage_Light': '浅', - 'SettingsPage_Dark': '深', - 'SettingsPage_FollowSystem': '跟随', - 'SettingsPage_CleanLog': '清理日志', - 'SettingsPage_Saved': '配置已保存!', - 'AboutPage_Title': '关于', - 'AboutPage_Version': '版本', - 'AboutPage_VersionCode': '构建号', - 'AboutPage_Contributors': '贡献者', - 'AboutPage_Repos': '仓库', - 'AboutPage_ThirdPartyLicenses': '第三方许可', - 'AboutPage_ThirdPartyLicenses_DisplayAll': '显示全部', - 'AboutPage_JoinUS': '加入我们', - 'AboutPage_JoinUS_Text': '' - '我们的项目都托管在 https://github.com/Crequency/, 欢迎 Fork 并贡献您宝贵的意见.' - '\n\n' - 'KitX Mobile 的源码全部位于 https://github.com/Crequency/KitX-Mobile/' - '\n\n' - 'KitX Mobile 是 KitX Project 一部分, KitX Project 的主仓库是 https://github.com/Crequency/KitX', - }, - 'en_US': { - 'Public_Enable': 'Enable', - 'Public_Disable': 'Disable', - 'Public_Animation': 'Animation', - 'Public_Additional': 'Additional', - 'Public_Log': 'Log', - 'Public_Reload': 'Reload', - 'Public_Restart': 'Restart', - 'Public_Chat': 'Chat', - 'Public_Closed': "Closed", - 'Public_Error': "Error", - 'Public_Launch': "Launch", - 'Public_Launching': "Launching", - 'Public_Stop': "Stop", - 'Public_Stopping': "Stopping", - 'ServiceStatus_Error': 'Error', - 'ServiceStatus_Starting': 'Starting', - 'ServiceStatus_Stopping': 'Stopping', - 'ServiceStatus_Running': 'Running', - 'ServiceStatus_Pending': 'Stopped', - 'NotificationService_StatusNotificationTitle': 'KitX %status%', - 'NotificationService_StatusNotificationBody': '%device_count% Devices Online', - 'Drawer_Title': 'KitX', - 'Drawer_Devices': 'Devices', - 'Drawer_Plugins': 'Plugins', - 'Drawer_Account': 'Account', - 'Drawer_Test': 'Test', - 'Drawer_Setting': 'Settings', - 'Drawer_About': 'About', - 'Option_RestartDevicesServer': 'Restart Devices Server', - 'Option_ShutdownDevicesServer': 'Shutdown Devices Server', - 'IndexPage_Title': 'KitX', - 'HomePage_DevicesCount': 'Devices found.', - 'DevicesPage_Title': 'Devices', - 'DevicesPage_PluginsCountText': '%count% Plugins Online', - 'DevicesPage_LocalDevice': '(Local)', - 'DevicesPage_MainDevice': '(Master)', - 'DeviceChatPage_Title': 'Chat', - 'PluginsPage_Title': 'Plugins', - 'PluginsPage_BuiltInPlugins': 'Built-in Plugins', - 'PluginsPage_ConnectedPlugins': 'Connected Plugins', - 'AccountPage_Title': 'Account', - 'TestPage_Title': 'Test', - 'SettingsPage_Title': 'Settings', - 'SettingsPage_Languages': 'Languages', - 'SettingsPage_Theme': 'Theme', - 'SettingsPage_Light': 'Light', - 'SettingsPage_Dark': 'Dark', - 'SettingsPage_FollowSystem': 'Follow system', - 'SettingsPage_CleanLog': 'Clean Log', - 'SettingsPage_Saved': 'Changes saved!', - 'AboutPage_Title': 'About', - 'AboutPage_Version': 'Version', - 'AboutPage_VersionCode': 'Build Number', - 'AboutPage_Contributors': 'Contributors', - 'AboutPage_Repos': 'Repos', - 'AboutPage_ThirdPartyLicenses': 'Third-Party Licenses', - 'AboutPage_ThirdPartyLicenses_DisplayAll': 'Display all', - 'AboutPage_JoinUS': 'Join US', - 'AboutPage_JoinUS_Text': '' - 'All our projects storage on https://github.com/Crequency/, welcome to fork and contribute to them.' - '\n\n' - 'Source code of KitX Mobile located at https://github.com/Crequency/KitX-Mobile/' - '\n\n' - 'KitX Mobile belongs to KitX Project, Main repo of KitX Project located at https://github.com/Crequency/KitX', - } - }; -} diff --git a/kitx_mobile/lib/utils/translation/en_us.dart b/kitx_mobile/lib/utils/translation/en_us.dart new file mode 100644 index 0000000..f54fd3c --- /dev/null +++ b/kitx_mobile/lib/utils/translation/en_us.dart @@ -0,0 +1,66 @@ +// ignore_for_file: constant_identifier_names + +/// English - United States (en_US) translation +const Map en_us = { + 'Public_Enable': 'Enable', + 'Public_Disable': 'Disable', + 'Public_Animation': 'Animation', + 'Public_Additional': 'Additional', + 'Public_Log': 'Log', + 'Public_Reload': 'Reload', + 'Public_Restart': 'Restart', + 'Public_Chat': 'Chat', + 'Public_Closed': 'Closed', + 'Public_Error': 'Error', + 'Public_Launch': 'Launch', + 'Public_Launching': 'Launching', + 'Public_Stop': 'Stop', + 'Public_Stopping': 'Stopping', + 'Public_Running': 'Running', + 'Public_Pending': 'Pending', + 'NotificationService_StatusNotificationTitle': 'KitX %status%', + 'NotificationService_StatusNotificationBody': '%device_count% Devices Online', + 'Drawer_Title': 'KitX', + 'Drawer_Devices': 'Devices', + 'Drawer_Plugins': 'Plugins', + 'Drawer_Account': 'Account', + 'Drawer_Test': 'Test', + 'Drawer_Setting': 'Settings', + 'Drawer_About': 'About', + 'Option_RestartDevicesServer': 'Restart Devices Server', + 'Option_ShutdownDevicesServer': 'Shutdown Devices Server', + 'IndexPage_Title': 'KitX', + 'HomePage_DevicesCount': 'Devices found.', + 'DevicesPage_Title': 'Devices', + 'DevicesPage_PluginsCountText': '%count% Plugins Online', + 'DevicesPage_LocalDevice': '(Local)', + 'DevicesPage_MainDevice': '(Master)', + 'DeviceChatPage_Title': 'Chat', + 'PluginsPage_Title': 'Plugins', + 'PluginsPage_BuiltInPlugins': 'Built-in Plugins', + 'PluginsPage_ConnectedPlugins': 'Connected Plugins', + 'AccountPage_Title': 'Account', + 'TestPage_Title': 'Test', + 'SettingsPage_Title': 'Settings', + 'SettingsPage_Languages': 'Languages', + 'SettingsPage_Theme': 'Theme', + 'SettingsPage_Light': 'Light', + 'SettingsPage_Dark': 'Dark', + 'SettingsPage_FollowSystem': 'Follow system', + 'SettingsPage_CleanLog': 'Clean Log', + 'SettingsPage_Saved': 'Changes saved!', + 'AboutPage_Title': 'About', + 'AboutPage_Version': 'Version', + 'AboutPage_VersionCode': 'Build Number', + 'AboutPage_Contributors': 'Contributors', + 'AboutPage_Repos': 'Repos', + 'AboutPage_ThirdPartyLicenses': 'Third-Party Licenses', + 'AboutPage_ThirdPartyLicenses_DisplayAll': 'Display all', + 'AboutPage_JoinUS': 'Join US', + 'AboutPage_JoinUS_Text': '' + 'All our projects storage on https://github.com/Crequency/, welcome to fork and contribute to them.' + '\n\n' + 'Source code of KitX Mobile located at https://github.com/Crequency/KitX-Mobile/' + '\n\n' + 'KitX Mobile belongs to KitX Project, Main repo of KitX Project located at https://github.com/Crequency/KitX', +}; diff --git a/kitx_mobile/lib/utils/translation/translation.dart b/kitx_mobile/lib/utils/translation/translation.dart new file mode 100644 index 0000000..b4082c8 --- /dev/null +++ b/kitx_mobile/lib/utils/translation/translation.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'package:kitx_mobile/utils/translation/en_us.dart'; +import 'package:kitx_mobile/utils/translation/zh_cn.dart'; + +/// Translation Data +class Translation extends Translations { + @override + Map> get keys => {'zh_CN': zh_cn, 'en_US': en_us}; +} diff --git a/kitx_mobile/lib/utils/translation/zh_cn.dart b/kitx_mobile/lib/utils/translation/zh_cn.dart new file mode 100644 index 0000000..9855435 --- /dev/null +++ b/kitx_mobile/lib/utils/translation/zh_cn.dart @@ -0,0 +1,66 @@ +// ignore_for_file: constant_identifier_names + +/// Simplified Chinese (zh_CN) translation +const Map zh_cn = { + 'Public_Enable': '启用', + 'Public_Disable': '禁用', + 'Public_Animation': '动画', + 'Public_Additional': '额外的', + 'Public_Log': '日志', + 'Public_Reload': '重载', + 'Public_Restart': '重启', + 'Public_Chat': '聊天', + 'Public_Closed': '已关闭', + 'Public_Error': '错误', + 'Public_Launch': '启动', + 'Public_Launching': '启动中', + 'Public_Stop': '停止', + 'Public_Stopping': '停止中', + 'Public_Running': '运行中', + 'Public_Pending': '等待中', + 'NotificationService_StatusNotificationTitle': 'KitX %status%', + 'NotificationService_StatusNotificationBody': '当前设备数: %device_count%', + 'Drawer_Title': 'KitX', + 'Drawer_Devices': '设备管理', + 'Drawer_Plugins': '插件列表', + 'Drawer_Account': '账户', + 'Drawer_Test': '测试', + 'Drawer_Setting': '设置', + 'Drawer_About': '关于', + 'Option_RestartDevicesServer': '重启设备网络服务器', + 'Option_ShutdownDevicesServer': '关闭设备网络服务器', + 'IndexPage_Title': 'KitX', + 'HomePage_DevicesCount': '设备在线', + 'DevicesPage_Title': '设备管理', + 'DevicesPage_PluginsCountText': '%count% 插件在线', + 'DevicesPage_LocalDevice': '(本机)', + 'DevicesPage_MainDevice': '(主控)', + 'DeviceChatPage_Title': '聊天', + 'PluginsPage_Title': '插件列表', + 'PluginsPage_BuiltInPlugins': '内置插件', + 'PluginsPage_ConnectedPlugins': '已连接的插件', + 'AccountPage_Title': '账户', + 'TestPage_Title': '测试', + 'SettingsPage_Title': '设置', + 'SettingsPage_Languages': '语言', + 'SettingsPage_Theme': '主题', + 'SettingsPage_Light': '浅', + 'SettingsPage_Dark': '深', + 'SettingsPage_FollowSystem': '跟随', + 'SettingsPage_CleanLog': '清理日志', + 'SettingsPage_Saved': '配置已保存!', + 'AboutPage_Title': '关于', + 'AboutPage_Version': '版本', + 'AboutPage_VersionCode': '构建号', + 'AboutPage_Contributors': '贡献者', + 'AboutPage_Repos': '仓库', + 'AboutPage_ThirdPartyLicenses': '第三方许可', + 'AboutPage_ThirdPartyLicenses_DisplayAll': '显示全部', + 'AboutPage_JoinUS': '加入我们', + 'AboutPage_JoinUS_Text': '' + '我们的项目都托管在 https://github.com/Crequency/, 欢迎 Fork 并贡献您宝贵的意见.' + '\n\n' + 'KitX Mobile 的源码全部位于 https://github.com/Crequency/KitX-Mobile/' + '\n\n' + 'KitX Mobile 是 KitX Project 一部分, KitX Project 的主仓库是 https://github.com/Crequency/KitX', +}; From 0796c26521ab0bff2749209644d860db03fb05e2 Mon Sep 17 00:00:00 2001 From: Cranyozen <61766249+cranyozen@users.noreply.github.com> Date: Sun, 31 Mar 2024 13:37:32 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=EF=BB=BF=F0=9F=92=BE=20Feat:=20Replace?= =?UTF-8?q?=20`.tr.replaceAll`=20with=20`.trParams`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kitx_mobile/lib/main.dart | 2 +- kitx_mobile/lib/pages/controls/device_card.dart | 2 +- kitx_mobile/lib/services/notification.dart | 7 ++----- .../lib/utils/extensions/service_status_to_string.dart | 10 +++++----- kitx_mobile/lib/utils/translation/en_us.dart | 6 +++--- kitx_mobile/lib/utils/translation/zh_cn.dart | 6 +++--- 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/kitx_mobile/lib/main.dart b/kitx_mobile/lib/main.dart index 03fa277..f999200 100644 --- a/kitx_mobile/lib/main.dart +++ b/kitx_mobile/lib/main.dart @@ -5,7 +5,7 @@ import 'package:kitx_mobile/pages/pages.dart'; import 'package:kitx_mobile/utils/config.dart'; import 'package:kitx_mobile/utils/log.dart'; import 'package:kitx_mobile/utils/themes/themes.dart'; -import 'package:kitx_mobile/utils/translation.dart'; +import 'package:kitx_mobile/utils/translation/translation.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); diff --git a/kitx_mobile/lib/pages/controls/device_card.dart b/kitx_mobile/lib/pages/controls/device_card.dart index befc47b..f8bd7bc 100644 --- a/kitx_mobile/lib/pages/controls/device_card.dart +++ b/kitx_mobile/lib/pages/controls/device_card.dart @@ -147,7 +147,7 @@ class _DeviceCard extends State with TickerProviderStateMixin { padding: EdgeInsets.only(bottom: width == null ? 20 : 8), child: badges.Badge( badgeContent: Text( - 'DevicesPage_PluginsCountText'.tr.replaceAll('%count%', (info.pluginsCount).toString()), + 'DevicesPage_PluginsCountText'.trParams({'count': info.pluginsCount.toString()}), style: const TextStyle(color: Colors.white), ), position: badges.BadgePosition.topEnd(top: 70, end: 15), diff --git a/kitx_mobile/lib/services/notification.dart b/kitx_mobile/lib/services/notification.dart index 5f54b01..cabab19 100644 --- a/kitx_mobile/lib/services/notification.dart +++ b/kitx_mobile/lib/services/notification.dart @@ -40,11 +40,8 @@ class NotificationService { content: NotificationContent( id: statusNotificationId, channelKey: statusChannelKey, - title: - 'NotificationService_StatusNotificationTitle'.tr.replaceAll("%status%", serviceStatus.toText()), - body: 'NotificationService_StatusNotificationBody' - .tr - .replaceAll('%device_count%', deviceCount.toString()), + title: 'NotificationService_StatusNotificationTitle'.trParams({"status": serviceStatus.toText()}), + body: 'NotificationService_StatusNotificationBody'.trParams({'device_count': deviceCount.toString()}), locked: true, autoDismissible: false, category: NotificationCategory.Status, diff --git a/kitx_mobile/lib/utils/extensions/service_status_to_string.dart b/kitx_mobile/lib/utils/extensions/service_status_to_string.dart index 44cb541..dab0f31 100644 --- a/kitx_mobile/lib/utils/extensions/service_status_to_string.dart +++ b/kitx_mobile/lib/utils/extensions/service_status_to_string.dart @@ -7,15 +7,15 @@ extension ServiceStatusExtensions on ServiceStatus { String toText() { switch (this) { case ServiceStatus.error: - return 'ServiceStatus_Error'.tr; + return 'Public_Error'.tr; case ServiceStatus.starting: - return 'ServiceStatus_Starting'.tr; + return 'Public_Launching'.tr; case ServiceStatus.stopping: - return 'ServiceStatus_Stopping'.tr; + return 'Public_Stopping'.tr; case ServiceStatus.running: - return 'ServiceStatus_Running'.tr; + return 'Public_Running'.tr; case ServiceStatus.pending: - return 'ServiceStatus_Pending'.tr; + return 'Public_Pending'.tr; default: return 'Unknown'; } diff --git a/kitx_mobile/lib/utils/translation/en_us.dart b/kitx_mobile/lib/utils/translation/en_us.dart index f54fd3c..61e662a 100644 --- a/kitx_mobile/lib/utils/translation/en_us.dart +++ b/kitx_mobile/lib/utils/translation/en_us.dart @@ -18,8 +18,8 @@ const Map en_us = { 'Public_Stopping': 'Stopping', 'Public_Running': 'Running', 'Public_Pending': 'Pending', - 'NotificationService_StatusNotificationTitle': 'KitX %status%', - 'NotificationService_StatusNotificationBody': '%device_count% Devices Online', + 'NotificationService_StatusNotificationTitle': 'KitX @status', + 'NotificationService_StatusNotificationBody': '@device_count Devices Online', 'Drawer_Title': 'KitX', 'Drawer_Devices': 'Devices', 'Drawer_Plugins': 'Plugins', @@ -32,7 +32,7 @@ const Map en_us = { 'IndexPage_Title': 'KitX', 'HomePage_DevicesCount': 'Devices found.', 'DevicesPage_Title': 'Devices', - 'DevicesPage_PluginsCountText': '%count% Plugins Online', + 'DevicesPage_PluginsCountText': '@count Plugins Online', 'DevicesPage_LocalDevice': '(Local)', 'DevicesPage_MainDevice': '(Master)', 'DeviceChatPage_Title': 'Chat', diff --git a/kitx_mobile/lib/utils/translation/zh_cn.dart b/kitx_mobile/lib/utils/translation/zh_cn.dart index 9855435..5fa0b60 100644 --- a/kitx_mobile/lib/utils/translation/zh_cn.dart +++ b/kitx_mobile/lib/utils/translation/zh_cn.dart @@ -18,8 +18,8 @@ const Map zh_cn = { 'Public_Stopping': '停止中', 'Public_Running': '运行中', 'Public_Pending': '等待中', - 'NotificationService_StatusNotificationTitle': 'KitX %status%', - 'NotificationService_StatusNotificationBody': '当前设备数: %device_count%', + 'NotificationService_StatusNotificationTitle': 'KitX @status', + 'NotificationService_StatusNotificationBody': '当前设备数: @device_count', 'Drawer_Title': 'KitX', 'Drawer_Devices': '设备管理', 'Drawer_Plugins': '插件列表', @@ -32,7 +32,7 @@ const Map zh_cn = { 'IndexPage_Title': 'KitX', 'HomePage_DevicesCount': '设备在线', 'DevicesPage_Title': '设备管理', - 'DevicesPage_PluginsCountText': '%count% 插件在线', + 'DevicesPage_PluginsCountText': '@count 插件在线', 'DevicesPage_LocalDevice': '(本机)', 'DevicesPage_MainDevice': '(主控)', 'DeviceChatPage_Title': '聊天', From f40c3fdff9b7733a05c252aa45e7c4d1e6645056 Mon Sep 17 00:00:00 2001 From: Cranyozen <61766249+cranyozen@users.noreply.github.com> Date: Sun, 31 Mar 2024 14:38:26 +0800 Subject: [PATCH 10/12] =?UTF-8?q?=EF=BB=BF=F0=9F=92=BE=20Feat:=20Simple=20?= =?UTF-8?q?notification=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kitx_mobile/lib/services/devices_service.dart | 6 ++ kitx_mobile/lib/services/notification.dart | 57 +++++++++++++++---- kitx_mobile/lib/utils/translation/en_us.dart | 1 + kitx_mobile/lib/utils/translation/zh_cn.dart | 1 + kitx_mobile/pubspec.lock | 8 +++ 5 files changed, 62 insertions(+), 11 deletions(-) diff --git a/kitx_mobile/lib/services/devices_service.dart b/kitx_mobile/lib/services/devices_service.dart index 245ddb2..41699a2 100644 --- a/kitx_mobile/lib/services/devices_service.dart +++ b/kitx_mobile/lib/services/devices_service.dart @@ -139,6 +139,12 @@ class DeviceService implements Service { } deviceInfoList.refresh(); + + // Update notification service. + instances.notificationService.updateStatusNotification( + deviceCount: deviceInfoList.length, + serviceStatus: serviceStatus.value, + ); }); serviceStatus.value = ServiceStatus.running; diff --git a/kitx_mobile/lib/services/notification.dart b/kitx_mobile/lib/services/notification.dart index cabab19..fd599fd 100644 --- a/kitx_mobile/lib/services/notification.dart +++ b/kitx_mobile/lib/services/notification.dart @@ -1,7 +1,9 @@ import 'package:awesome_notifications/awesome_notifications.dart'; +import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:kitx_mobile/services/public/service_status.dart'; import 'package:kitx_mobile/utils/extensions/service_status_to_string.dart'; +import 'package:kitx_mobile/instances.dart'; // import 'package:flutter/material.dart'; /// [NotificationService] class @@ -23,12 +25,34 @@ class NotificationService { channelKey: statusChannelKey, channelName: 'KitX Status Notifications', channelDescription: 'KitX status', - locked: true, + locked: true, // Prevents the user from deleting the channel + playSound: false, // Do NOT play sound when the notification is displayed + enableVibration: false, // Do NOT vibrate when the notification is displayed + onlyAlertOnce: true, // Only alert once // defaultColor: Color(0xFF9D50DD), // ledColor: Colors.white, ), ], ); + AwesomeNotifications().setListeners(onActionReceivedMethod: onActionReceivedMethod); + } + + /// On action received method + @pragma('vm:entry-point') + static Future onActionReceivedMethod(ReceivedAction receivedAction) async { + var key = receivedAction.buttonKeyPressed; + if (key == 'action_view_button') { + if (instances.devicesService.serviceStatus == ServiceStatus.running) { + // Stop service + instances.shutdownDevicesServer(); + } else { + // Start service + instances.restartDevicesServer(); + } + } else if (key == 'action_view_exit') { + // Exit app + SystemNavigator.pop(); // Probably not working on iOS (by Copilot) + } } /// Update status notification @@ -37,15 +61,26 @@ class NotificationService { required ServiceStatus serviceStatus, }) async { AwesomeNotifications().createNotification( - content: NotificationContent( - id: statusNotificationId, - channelKey: statusChannelKey, - title: 'NotificationService_StatusNotificationTitle'.trParams({"status": serviceStatus.toText()}), - body: 'NotificationService_StatusNotificationBody'.trParams({'device_count': deviceCount.toString()}), - locked: true, - autoDismissible: false, - category: NotificationCategory.Status, - ), - ); + content: NotificationContent( + id: statusNotificationId, + channelKey: statusChannelKey, + title: 'NotificationService_StatusNotificationTitle'.trParams({"status": serviceStatus.toText()}), + body: 'NotificationService_StatusNotificationBody'.trParams({'device_count': deviceCount.toString()}), + locked: true, + autoDismissible: false, + category: NotificationCategory.Status, + ), + actionButtons: [ + NotificationActionButton( + key: 'action_view_button', + label: (serviceStatus == ServiceStatus.running) ? 'Public_Stop'.tr : 'Public_Launch'.tr, + actionType: ActionType.SilentAction, + ), + NotificationActionButton( + key: 'action_view_exit', + label: 'Public_Quit'.tr, + actionType: ActionType.SilentAction, + ), + ]); } } diff --git a/kitx_mobile/lib/utils/translation/en_us.dart b/kitx_mobile/lib/utils/translation/en_us.dart index 61e662a..e4ce8b4 100644 --- a/kitx_mobile/lib/utils/translation/en_us.dart +++ b/kitx_mobile/lib/utils/translation/en_us.dart @@ -18,6 +18,7 @@ const Map en_us = { 'Public_Stopping': 'Stopping', 'Public_Running': 'Running', 'Public_Pending': 'Pending', + 'Public_Quit': 'Quit', 'NotificationService_StatusNotificationTitle': 'KitX @status', 'NotificationService_StatusNotificationBody': '@device_count Devices Online', 'Drawer_Title': 'KitX', diff --git a/kitx_mobile/lib/utils/translation/zh_cn.dart b/kitx_mobile/lib/utils/translation/zh_cn.dart index 5fa0b60..bd68ee9 100644 --- a/kitx_mobile/lib/utils/translation/zh_cn.dart +++ b/kitx_mobile/lib/utils/translation/zh_cn.dart @@ -18,6 +18,7 @@ const Map zh_cn = { 'Public_Stopping': '停止中', 'Public_Running': '运行中', 'Public_Pending': '等待中', + 'Public_Quit': '退出', 'NotificationService_StatusNotificationTitle': 'KitX @status', 'NotificationService_StatusNotificationBody': '当前设备数: @device_count', 'Drawer_Title': 'KitX', diff --git a/kitx_mobile/pubspec.lock b/kitx_mobile/pubspec.lock index 471da4b..57454ef 100644 --- a/kitx_mobile/pubspec.lock +++ b/kitx_mobile/pubspec.lock @@ -33,6 +33,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" + awesome_notifications: + dependency: "direct main" + description: + name: awesome_notifications + sha256: "2b430c75cc879d6cfd52bb6eb2b5c1591ed425347816408cdcbd3f6916bba14c" + url: "https://pub.dev" + source: hosted + version: "0.7.4+1" badges: dependency: "direct main" description: From 80e15c4df6c0caee71014a47f8f8b6a32a379496 Mon Sep 17 00:00:00 2001 From: Cranyozen <61766249+cranyozen@users.noreply.github.com> Date: Sun, 31 Mar 2024 18:30:59 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=EF=BB=BF=F0=9F=94=A7=20Fix(notification.?= =?UTF-8?q?dart):=20Fix=20clicking=20twice=20to=20exit=20the=20application?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kitx_mobile/lib/services/notification.dart | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/kitx_mobile/lib/services/notification.dart b/kitx_mobile/lib/services/notification.dart index fd599fd..b44f4ca 100644 --- a/kitx_mobile/lib/services/notification.dart +++ b/kitx_mobile/lib/services/notification.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:awesome_notifications/awesome_notifications.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; @@ -51,7 +53,13 @@ class NotificationService { } } else if (key == 'action_view_exit') { // Exit app - SystemNavigator.pop(); // Probably not working on iOS (by Copilot) + instances.shutdownDevicesServer(); + + // Delete all notifications + AwesomeNotifications().cancelAll(); + + await SystemNavigator.pop(); // Probably not working on iOS (by Copilot) + exit(0); } } @@ -74,12 +82,14 @@ class NotificationService { NotificationActionButton( key: 'action_view_button', label: (serviceStatus == ServiceStatus.running) ? 'Public_Stop'.tr : 'Public_Launch'.tr, - actionType: ActionType.SilentAction, + actionType: ActionType.KeepOnTop, + autoDismissible: false, ), NotificationActionButton( key: 'action_view_exit', label: 'Public_Quit'.tr, actionType: ActionType.SilentAction, + autoDismissible: false, ), ]); } From 26d34d16127395d18769abaecd4b11901c0c9c1e Mon Sep 17 00:00:00 2001 From: Dynesshely Date: Sun, 31 Mar 2024 18:51:42 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=F0=9F=8E=87=20Style:=20No=20need=20to=20?= =?UTF-8?q?wrap=20line?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kitx_mobile/lib/pages/about_page.dart | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/kitx_mobile/lib/pages/about_page.dart b/kitx_mobile/lib/pages/about_page.dart index 7740768..364a5b4 100644 --- a/kitx_mobile/lib/pages/about_page.dart +++ b/kitx_mobile/lib/pages/about_page.dart @@ -159,8 +159,7 @@ class _AboutPageState extends State { duration: 500, opacity: titleEntered.value && versionDisplay.value ? 1 : 0, curve: Curves.easeInOutCubic, - child: Text( - '${instances.appInfo.versionString.value} (${instances.appInfo.versionCode.value})'), + child: Text('${instances.appInfo.versionString.value} (${instances.appInfo.versionCode.value})'), ), ), ], @@ -223,7 +222,8 @@ class _AboutPageState extends State { url: 'https://github.com/Cronyet', ), const SizedBox(width: 15), - ]), + ], + ), ), ), ), @@ -371,9 +371,7 @@ class _AboutPageState extends State { splashRadius: 20, padding: const EdgeInsets.all(0), iconSize: 24, - icon: url?.contains('pub.dev') ?? false - ? const Icon(CommunityMaterialIcons.link) - : const Icon(CommunityMaterialIcons.link), + icon: url?.contains('pub.dev') ?? false ? const Icon(CommunityMaterialIcons.link) : const Icon(CommunityMaterialIcons.link), onPressed: () => instances.urlHandler.open(thirdPartyData.ThirdPartyUrl ?? ''), ), IconButton( @@ -381,9 +379,7 @@ class _AboutPageState extends State { splashRadius: 20, padding: const EdgeInsets.all(0), iconSize: 24, - icon: repo?.contains('github.com') ?? false - ? const Icon(CommunityMaterialIcons.github) - : const Icon(CommunityMaterialIcons.link), + icon: repo?.contains('github.com') ?? false ? const Icon(CommunityMaterialIcons.github) : const Icon(CommunityMaterialIcons.link), onPressed: () => instances.urlHandler.open(thirdPartyData.ThirdPartyRepo ?? ''), ), Container(