From 2c5886de0918faa8d599cd2515b65dcf5679e568 Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Wed, 22 May 2024 18:45:23 +0800 Subject: [PATCH] new: wearos detect (#358) --- ios/Runner.xcodeproj/project.pbxproj | 36 +++---- lib/app.dart | 22 +++-- lib/data/model/app/shell_func.dart | 97 +++++++------------ lib/data/provider/app.dart | 27 +++++- lib/data/res/build_data.dart | 8 +- lib/main.dart | 47 +++++---- lib/view/page/home/home.dart | 66 ++++++------- lib/view/page/home/wear.dart | 86 ++++++++++++++++ lib/view/page/server/detail/view.dart | 1 - macos/Flutter/GeneratedPluginRegistrant.swift | 2 + macos/Runner.xcodeproj/project.pbxproj | 12 +-- pubspec.lock | 24 +++++ pubspec.yaml | 1 + 13 files changed, 268 insertions(+), 161 deletions(-) create mode 100644 lib/view/page/home/wear.dart diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 47a4366e..2b157a53 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -690,7 +690,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 897; + CURRENT_PROJECT_VERSION = 904; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -700,7 +700,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.897; + MARKETING_VERSION = 1.0.904; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -826,7 +826,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 897; + CURRENT_PROJECT_VERSION = 904; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -836,7 +836,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.897; + MARKETING_VERSION = 1.0.904; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -854,7 +854,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 897; + CURRENT_PROJECT_VERSION = 904; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -864,7 +864,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.897; + MARKETING_VERSION = 1.0.904; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -885,7 +885,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 897; + CURRENT_PROJECT_VERSION = 904; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -898,7 +898,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.897; + MARKETING_VERSION = 1.0.904; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -924,7 +924,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 897; + CURRENT_PROJECT_VERSION = 904; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -937,7 +937,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.897; + MARKETING_VERSION = 1.0.904; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -960,7 +960,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 897; + CURRENT_PROJECT_VERSION = 904; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -973,7 +973,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.897; + MARKETING_VERSION = 1.0.904; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -996,7 +996,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 897; + CURRENT_PROJECT_VERSION = 904; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1008,7 +1008,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.897; + MARKETING_VERSION = 1.0.904; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; @@ -1037,7 +1037,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 897; + CURRENT_PROJECT_VERSION = 904; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1049,7 +1049,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.897; + MARKETING_VERSION = 1.0.904; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; @@ -1075,7 +1075,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 897; + CURRENT_PROJECT_VERSION = 904; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1087,7 +1087,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.897; + MARKETING_VERSION = 1.0.904; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; diff --git a/lib/app.dart b/lib/app.dart index 99104129..c6cda50a 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -18,7 +18,7 @@ class MyApp extends StatelessWidget { builder: (_, __) { if (!Stores.setting.useSystemPrimaryColor.fetch()) { UIs.colorSeed = Color(Stores.setting.primaryColor.fetch()); - return _buildApp(); + return _buildApp(context); } return DynamicColorBuilder( builder: (light, dark) { @@ -36,14 +36,14 @@ class MyApp extends StatelessWidget { } else if (!context.isDark && dark != null) { UIs.primaryColor = dark.primary; } - return _buildApp(light: lightTheme, dark: darkTheme); + return _buildApp(context, light: lightTheme, dark: darkTheme); }, ); }, ); } - Widget _buildApp({ThemeData? light, ThemeData? dark}) { + Widget _buildApp(BuildContext ctx, {ThemeData? light, ThemeData? dark}) { final tMode = Stores.setting.themeMode.fetch(); // Issue #57 final themeMode = switch (tMode) { @@ -71,15 +71,17 @@ class MyApp extends StatelessWidget { themeMode: themeMode, theme: light, darkTheme: tMode < 3 ? dark : _getAmoledTheme(dark), - home: Stores.setting.fullScreen.fetch() - ? OrientationBuilder( - builder: (_, ori) { - return HomePage(fullScreen: ori == Orientation.landscape); - }, - ) - : const HomePage(), + home: _buildAppContent(ctx), ); } + + Widget _buildAppContent(BuildContext ctx) { + //if (Pros.app.isWearOS) return const WearHome(); + return const HomePage(); + } + + // bool _isSmallDevice(BuildContext ctx) => + // MediaQuery.of(ctx).size.shortestSide < 600; } void _setup(BuildContext context) async { diff --git a/lib/data/model/app/shell_func.dart b/lib/data/model/app/shell_func.dart index d34c4e35..fb465ca1 100644 --- a/lib/data/model/app/shell_func.dart +++ b/lib/data/model/app/shell_func.dart @@ -82,9 +82,9 @@ chmod +x $_installShellPath case ShellFunc.status: return ''' if [ "\$macSign" = "" ] && [ "\$bsdSign" = "" ]; then -\t${_statusCmds.join(cmdDivider)} +\t${StatusCmdType.values.map((e) => e.cmd).join(cmdDivider)} else -\t${_bsdStatusCmd.join(cmdDivider)} +\t${BSDStatusCmdType.values.map((e) => e.cmd).join(cmdDivider)} fi'''; // case ShellFunc.docker: // return ''' @@ -196,72 +196,47 @@ extension EnumX on Enum { } enum StatusCmdType { - echo, - time, - net, - sys, - cpu, - uptime, - conn, - disk, - mem, - tempType, - tempVal, - host, - diskio, - battery, - nvidia, - sensors, + echo._('echo ${SystemType.linuxSign}'), + time._('date +%s'), + net._('cat /proc/net/dev'), + sys._('cat /etc/*-release | grep PRETTY_NAME'), + cpu._('cat /proc/stat | grep cpu'), + uptime._('uptime'), + conn._('cat /proc/net/snmp'), + disk._('df'), + mem._("cat /proc/meminfo | grep -E 'Mem|Swap'"), + tempType._('cat /sys/class/thermal/thermal_zone*/type'), + tempVal._('cat /sys/class/thermal/thermal_zone*/temp'), + host._('cat /etc/hostname'), + diskio._('cat /proc/diskstats'), + battery._( + 'for f in /sys/class/power_supply/*/uevent; do cat "\$f"; echo; done'), + nvidia._('nvidia-smi -q -x'), + sensors._('sensors'), ; -} -/// Cmds for linux server -const _statusCmds = [ - 'echo ${SystemType.linuxSign}', - 'date +%s', - 'cat /proc/net/dev', - 'cat /etc/*-release | grep PRETTY_NAME', - 'cat /proc/stat | grep cpu', - 'uptime', - 'cat /proc/net/snmp', - 'df', - "cat /proc/meminfo | grep -E 'Mem|Swap'", - 'cat /sys/class/thermal/thermal_zone*/type', - 'cat /sys/class/thermal/thermal_zone*/temp', - 'cat /etc/hostname', - 'cat /proc/diskstats', - 'for f in /sys/class/power_supply/*/uevent; do cat "\$f"; echo; done', - 'nvidia-smi -q -x', - 'sensors', -]; + final String cmd; + + const StatusCmdType._(this.cmd); +} enum BSDStatusCmdType { - echo, - time, - net, - sys, - cpu, - uptime, - disk, - mem, + echo._('echo ${SystemType.bsdSign}'), + time._('date +%s'), + net._('netstat -ibn'), + sys._('uname -or'), + cpu._('top -l 1 | grep "CPU usage"'), + uptime._('uptime'), + disk._('df -k'), + mem._('top -l 1 | grep PhysMem'), //temp, - host, + host._('hostname'), ; -} -/// Cmds for BSD server -const _bsdStatusCmd = [ - 'echo ${SystemType.bsdSign}', - 'date +%s', - 'netstat -ibn', - 'uname -or', - 'top -l 1 | grep "CPU usage"', - 'uptime', - 'df -k', - 'top -l 1 | grep PhysMem', - //'sysctl -a | grep temperature', - 'hostname', -]; + final String cmd; + + const BSDStatusCmdType._(this.cmd); +} extension StatusCmdTypeX on StatusCmdType { String get i18n => switch (this) { diff --git a/lib/data/provider/app.dart b/lib/data/provider/app.dart index a7900d72..50a8fb46 100644 --- a/lib/data/provider/app.dart +++ b/lib/data/provider/app.dart @@ -1,3 +1,5 @@ +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:fl_lib/fl_lib.dart'; import 'package:flutter/material.dart'; class AppProvider extends ChangeNotifier { @@ -8,7 +10,28 @@ class AppProvider extends ChangeNotifier { notifyListeners(); } - bool moveBg = true; - BuildContext? ctx; + + bool isWearOS = false; + + Future init() async { + await _initIsWearOS(); + } + + Future _initIsWearOS() async { + if (!isAndroid) { + isWearOS = false; + return; + } + + final deviceInfo = DeviceInfoPlugin(); + final androidInfo = await deviceInfo.androidInfo; + + const feat = 'android.hardware.type.watch'; + final hasFeat = androidInfo.systemFeatures.contains(feat); + if (hasFeat) { + isWearOS = true; + return; + } + } } diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index 01855b91..d3a7e003 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,9 +2,9 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 897; - static const String engine = "3.19.6"; - static const String buildAt = "2024-05-14 22:32:07"; - static const int modifications = 12; + static const int build = 904; + static const String engine = "3.22.0"; + static const String buildAt = "2024-05-20 16:10:12"; + static const int modifications = 11; static const int script = 47; } diff --git a/lib/main.dart b/lib/main.dart index 224632b7..83472ed5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -65,36 +65,17 @@ Future _initApp() async { WidgetsFlutterBinding.ensureInitialized(); await Paths.init(BuildData.name); - - // Base of all data. - await _initDb(); - + await _initData(); _setupDebug(); - SystemUIs.initDesktopWindow(Stores.setting.hideTitleBar.fetch()); - // Load font + SystemUIs.initDesktopWindow(Stores.setting.hideTitleBar.fetch()); FontUtils.loadFrom(Stores.setting.fontPath.fetch()); - if (isAndroid) { - // SharedPreferences is only used on Android for saving home widgets settings. - SharedPreferences.setPrefix(''); - // try switch to highest refresh rate - await FlutterDisplayMode.setHighRefreshRate(); - } - - final serversCount = Stores.server.box.keys.length; - // Plus 1 to avoid 0. - Computer.shared.turnOn(workersCount: (serversCount / 3).round() + 1); - - if (isIOS || isMacOS) { - if (Stores.setting.icloudSync.fetch()) ICloud.sync(); - } - if (Stores.setting.webdavSync.fetch()) Webdav.sync(); - + _doPlatformRelated(); _doVersionRelated(); } -Future _initDb() async { +Future _initData() async { // await SecureStore.init(); await Hive.initFlutter(); // Ordered by typeId @@ -115,6 +96,7 @@ Future _initDb() async { Pros.snippet.load(); Pros.key.load(); + await Pros.app.init(); } void _setupDebug() { @@ -131,6 +113,24 @@ void _setupDebug() { } } +void _doPlatformRelated() async { + if (isAndroid) { + // SharedPreferences is only used on Android for saving home widgets settings. + SharedPreferences.setPrefix(''); + // try switch to highest refresh rate + FlutterDisplayMode.setHighRefreshRate(); + } + + final serversCount = Stores.server.box.keys.length; + // Plus 1 to avoid 0. + Computer.shared.turnOn(workersCount: (serversCount / 3).round() + 1); + + if (isIOS || isMacOS) { + if (Stores.setting.icloudSync.fetch()) ICloud.sync(); + } + if (Stores.setting.webdavSync.fetch()) Webdav.sync(); +} + // It may contains some async heavy funcs. Future _doVersionRelated() async { final curVer = Stores.setting.lastVer.fetch(); @@ -138,7 +138,6 @@ Future _doVersionRelated() async { // It's only the version upgrade trigger logic. // How to upgrade the data is inside each own func. if (curVer < newVer) { - // DO version check inside each func. ServerDetailCards.autoAddNewCards(newVer); Stores.setting.lastVer.put(newVer); } diff --git a/lib/view/page/home/home.dart b/lib/view/page/home/home.dart index ab6f1ca6..ebccfe77 100644 --- a/lib/view/page/home/home.dart +++ b/lib/view/page/home/home.dart @@ -5,7 +5,6 @@ import 'package:fl_lib/fl_lib.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:icons_plus/icons_plus.dart'; -import 'package:permission_handler/permission_handler.dart'; import 'package:toolbox/core/channel/home_widget.dart'; import 'package:toolbox/core/extension/build.dart'; import 'package:toolbox/core/extension/context/locale.dart'; @@ -23,9 +22,7 @@ import 'package:wakelock_plus/wakelock_plus.dart'; part 'appbar.dart'; class HomePage extends StatefulWidget { - final bool fullScreen; - - const HomePage({super.key, this.fullScreen = false}); + const HomePage({super.key}); @override State createState() => _HomePageState(); @@ -157,17 +154,17 @@ class _HomePageState extends State } }, ), - bottomNavigationBar: widget.fullScreen - ? null - : ValBuilder( - listenable: _isLandscape, - builder: (ls) { - return ListenableBuilder( + bottomNavigationBar: ValBuilder( + listenable: _isLandscape, + builder: (ls) { + return Stores.setting.fullScreen.fetch() + ? UIs.placeholder + : ListenableBuilder( listenable: _selectIndex, builder: (_, __) => _buildBottomBar(ls), ); - }, - ), + }, + ), ); } @@ -337,7 +334,7 @@ ${GithubIds.participants.map((e) => '[$e](${e.url})').join(' ')} // Auth required for first launch if (Stores.setting.useBioAuth.fetch()) BioAuth.go(); - _reqNotiPerm(); + //_reqNotiPerm(); if (Stores.setting.autoCheckAppUpdate.fetch()) { AppUpdateIface.doUpdate( @@ -352,28 +349,27 @@ ${GithubIds.participants.map((e) => '[$e](${e.url})').join(' ')} await Pros.server.refresh(); } - // It's required by RUpgrade to send update progress - Future _reqNotiPerm() async { - if (!isAndroid) return; - final suc = await PermUtils.request(Permission.notification); - if (!suc) { - final noNotiPerm = Stores.setting.noNotiPerm; - if (noNotiPerm.fetch()) return; - context.showRoundDialog( - title: l10n.error, - child: Text(l10n.noNotiPerm), - actions: [ - TextButton( - onPressed: () { - noNotiPerm.put(true); - context.pop(); - }, - child: Text(l10n.ok), - ), - ], - ); - } - } + // Future _reqNotiPerm() async { + // if (!isAndroid) return; + // final suc = await PermUtils.request(Permission.notification); + // if (!suc) { + // final noNotiPerm = Stores.setting.noNotiPerm; + // if (noNotiPerm.fetch()) return; + // context.showRoundDialog( + // title: l10n.error, + // child: Text(l10n.noNotiPerm), + // actions: [ + // TextButton( + // onPressed: () { + // noNotiPerm.put(true); + // context.pop(); + // }, + // child: Text(l10n.ok), + // ), + // ], + // ); + // } + // } Future _onLongPressSetting() async { final map = Stores.setting.box.toJson(includeInternal: false); diff --git a/lib/view/page/home/wear.dart b/lib/view/page/home/wear.dart new file mode 100644 index 00000000..174caa05 --- /dev/null +++ b/lib/view/page/home/wear.dart @@ -0,0 +1,86 @@ +import 'dart:async'; + +import 'package:after_layout/after_layout.dart'; +import 'package:fl_lib/fl_lib.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:toolbox/core/extension/context/locale.dart'; +import 'package:toolbox/data/model/server/server.dart'; +import 'package:toolbox/data/provider/server.dart'; +import 'package:toolbox/data/res/build_data.dart'; +import 'package:toolbox/data/res/provider.dart'; +import 'package:toolbox/data/res/store.dart'; +import 'package:toolbox/data/res/url.dart'; + +final class WearHome extends StatefulWidget { + const WearHome({super.key}); + + @override + _WearHomeState createState() => _WearHomeState(); +} + +final class _WearHomeState extends State with AfterLayoutMixin { + late final _pageCtrl = + PageController(initialPage: Pros.server.servers.isNotEmpty ? 1 : 0); + + @override + Widget build(BuildContext context) { + return _buildBody(); + } + + Widget _buildBody() { + return Consumer(builder: (_, pro, __) { + if (pro.servers.isEmpty) { + return const Center(child: Text('No server')); + } + return PageView.builder( + controller: _pageCtrl, + itemCount: pro.servers.length + 1, + itemBuilder: (_, index) { + if (index == 0) return _buildInit(); + + final id = pro.serverOrder[index]; + final server = Pros.server.pick(id: id); + if (server == null) return UIs.placeholder; + return _buildEachSever(server); + }, + ); + }); + } + + Widget _buildInit() { + return Center( + child: Column( + children: [ + IconButton(onPressed: () {}, icon: const Icon(Icons.add)), + UIs.height7, + Text(l10n.restore) + ], + ), + ); + } + + Widget _buildEachSever(Server srv) { + return const Padding( + padding: EdgeInsets.all(7), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [], + ), + ); + } + + @override + FutureOr afterFirstLayout(BuildContext context) async { + if (Stores.setting.autoCheckAppUpdate.fetch()) { + AppUpdateIface.doUpdate( + build: BuildData.build, + url: '${Urls.cdnBase}/update.json', + context: context, + updateL10n: l10n.update, + ); + } + await Pros.server.load(); + await Pros.server.refresh(); + } +} diff --git a/lib/view/page/server/detail/view.dart b/lib/view/page/server/detail/view.dart index b553f136..914dfe37 100644 --- a/lib/view/page/server/detail/view.dart +++ b/lib/view/page/server/detail/view.dart @@ -802,7 +802,6 @@ class _ServerDetailPageState extends State return CardX( child: ListTile( title: const Text('PVE'), - subtitle: Text(addr, style: UIs.textGrey), leading: const Icon(FontAwesome.server_solid, size: 17), trailing: const Icon(Icons.chevron_right), onTap: () => AppRoutes.pve(spi: widget.spi).go(context), diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index f68ecd9a..c6be844b 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,7 @@ import FlutterMacOS import Foundation +import device_info_plus import dynamic_color import icloud_storage import package_info_plus @@ -17,6 +18,7 @@ import wakelock_plus import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) IcloudStoragePlugin.register(with: registry.registrar(forPlugin: "IcloudStoragePlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 4eb16977..79ab89a8 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -471,7 +471,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 897; + CURRENT_PROJECT_VERSION = 904; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -481,7 +481,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.897; + MARKETING_VERSION = 1.0.904; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -608,7 +608,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 897; + CURRENT_PROJECT_VERSION = 904; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -618,7 +618,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.897; + MARKETING_VERSION = 1.0.904; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -638,7 +638,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 897; + CURRENT_PROJECT_VERSION = 904; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=macosx*]" = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; @@ -649,7 +649,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.897; + MARKETING_VERSION = 1.0.904; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/pubspec.lock b/pubspec.lock index 0c7cc2c4..2c9c748d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -276,6 +276,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.10" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: eead12d1a1ed83d8283ab4c2f3fca23ac4082f29f25f29dff0f758f57d06ec91 + url: "https://pub.dev" + source: hosted + version: "10.1.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 + url: "https://pub.dev" + source: hosted + version: "7.0.0" dio: dependency: "direct main" description: @@ -1440,6 +1456,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.5.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "10589e0d7f4e053f2c61023a31c9ce01146656a70b7b7f0828c0b46d7da2a9bb" + url: "https://pub.dev" + source: hosted + version: "1.1.3" window_manager: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9d146282..2a623ead 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -63,6 +63,7 @@ dependencies: git: url: https://github.com/lollipopkit/fl_lib ref: main + device_info_plus: ^10.1.0 # path: ../fl_lib dev_dependencies: