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(