From 799a1ac5f0ecc997e3dff0be20680775e6731ab1 Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Sun, 28 Jan 2024 14:53:48 +0800 Subject: [PATCH] opt.: reconnect logic (#258) --- ios/Runner.xcodeproj/project.pbxproj | 36 +++++++++++++------------- lib/core/persistant_store.dart | 23 ++++++++++++---- lib/data/provider/server.dart | 20 ++++++++++---- lib/data/res/build_data.dart | 6 ++--- lib/view/page/full_screen.dart | 2 +- lib/view/page/home.dart | 2 +- lib/view/page/server/tab.dart | 6 ++--- macos/Runner.xcodeproj/project.pbxproj | 12 ++++----- 8 files changed, 65 insertions(+), 42 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index fa747a57..6c3948d3 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -586,7 +586,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 725; + CURRENT_PROJECT_VERSION = 726; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -596,7 +596,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.725; + MARKETING_VERSION = 1.0.726; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -720,7 +720,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 725; + CURRENT_PROJECT_VERSION = 726; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -730,7 +730,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.725; + MARKETING_VERSION = 1.0.726; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -748,7 +748,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 725; + CURRENT_PROJECT_VERSION = 726; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -758,7 +758,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.725; + MARKETING_VERSION = 1.0.726; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -779,7 +779,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 725; + CURRENT_PROJECT_VERSION = 726; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -792,7 +792,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.725; + MARKETING_VERSION = 1.0.726; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -818,7 +818,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 725; + CURRENT_PROJECT_VERSION = 726; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -831,7 +831,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.725; + MARKETING_VERSION = 1.0.726; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -854,7 +854,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 725; + CURRENT_PROJECT_VERSION = 726; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -867,7 +867,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.725; + MARKETING_VERSION = 1.0.726; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -890,7 +890,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 725; + CURRENT_PROJECT_VERSION = 726; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -902,7 +902,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.725; + MARKETING_VERSION = 1.0.726; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; @@ -931,7 +931,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 725; + CURRENT_PROJECT_VERSION = 726; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -943,7 +943,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.725; + MARKETING_VERSION = 1.0.726; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; @@ -969,7 +969,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 725; + CURRENT_PROJECT_VERSION = 726; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -981,7 +981,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.725; + MARKETING_VERSION = 1.0.726; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; diff --git a/lib/core/persistant_store.dart b/lib/core/persistant_store.dart index 05237413..54836881 100644 --- a/lib/core/persistant_store.dart +++ b/lib/core/persistant_store.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:hive_flutter/hive_flutter.dart'; +import 'package:logging/logging.dart'; import 'package:toolbox/core/utils/misc.dart'; // abstract final class SecureStore { @@ -29,6 +30,8 @@ import 'package:toolbox/core/utils/misc.dart'; // } // } +final _logger = Logger('Store'); + class PersistentStore { late final Box box; @@ -142,8 +145,12 @@ class _StoreProperty implements StorePropertyBase { T fetch() { final stored = _box.get(_key); if (stored == null || stored is! T) { - if (decoder != null) { - return decoder!(stored); + try { + if (decoder != null) { + return decoder!(stored); + } + } catch (_) { + _logger.warning('Failed to decode "$_key"'); } return defaultValue; } @@ -193,9 +200,15 @@ class _StoreListProperty implements StorePropertyBase> { if (val is! List) { throw Exception('StoreListProperty("$_key") is: ${val.runtimeType}'); } - return decoder == null - ? List.from(val) - : val.map((e) => decoder!.call(e)).toList(); + if (decoder != null) { + try { + return List.from(val.map(decoder!)); + } catch (_) { + _logger.warning('Failed to decode "$_key"'); + return defaultValue; + } + } + return List.from(val); } @override diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index a8651887..8f195304 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -36,12 +36,22 @@ class ServerProvider extends ChangeNotifier { Future load() async { // Issue #147 // Clear all servers because of restarting app will cause duplicate servers + final oldServers = Map.from(_servers); _servers.clear(); _serverOrder.clear(); final spis = Stores.server.fetch(); for (int idx = 0; idx < spis.length; idx++) { - _servers[spis[idx].id] = genServer(spis[idx]); + final spi = spis[idx]; + final originServer = oldServers[spi.id]; + final newServer = genServer(spi); + + /// Issues #258 + /// If not [shouldReconnect], then keep the old state. + if (originServer != null && !originServer.spi.shouldReconnect(spi)) { + newServer.state = originServer.state; + } + _servers[spi.id] = newServer; } final serverOrder_ = Stores.setting.serverOrder.fetch(); if (serverOrder_.isNotEmpty) { @@ -107,7 +117,7 @@ class ServerProvider extends ChangeNotifier { /// if [spi] is specificed then only refresh this server /// [onlyFailed] only refresh failed servers - Future refreshData({ + Future refresh({ ServerPrivateInfo? spi, bool onlyFailed = false, }) async { @@ -149,7 +159,7 @@ class ServerProvider extends ChangeNotifier { } refreshKey.currentState?.show(); _timer = Timer.periodic(Duration(seconds: duration), (_) async { - await refreshData(); + await refresh(); }); } @@ -192,7 +202,7 @@ class ServerProvider extends ChangeNotifier { _serverOrder.add(spi.id); Stores.setting.serverOrder.put(_serverOrder); _updateTags(); - refreshData(spi: spi); + refresh(spi: spi); } void delServer(String id) { @@ -233,7 +243,7 @@ class ServerProvider extends ChangeNotifier { if (newSpi.shouldReconnect(old)) { // Use [newSpi.id] instead of [old.id] because [old.id] may be changed TryLimiter.reset(newSpi.id); - refreshData(spi: newSpi); + refresh(spi: newSpi); } // Only update if [spi.tags] changed diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index c8445eaf..020e7b3c 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 = 725; + static const int build = 726; static const String engine = "3.16.8"; - static const String buildAt = "2024-01-27 21:27:49"; - static const int modifications = 4; + static const String buildAt = "2024-01-27 23:32:47"; + static const int modifications = 3; static const int script = 36; } diff --git a/lib/view/page/full_screen.dart b/lib/view/page/full_screen.dart index 72c485d1..36791d65 100644 --- a/lib/view/page/full_screen.dart +++ b/lib/view/page/full_screen.dart @@ -365,7 +365,7 @@ class _FullScreenPageState extends State with AfterLayoutMixin { } await GetIt.I.allReady(); await Pros.server.load(); - await Pros.server.refreshData(); + await Pros.server.refresh(); if (!Analysis.enabled) { await Analysis.init(); } diff --git a/lib/view/page/home.dart b/lib/view/page/home.dart index 2f0da646..af4492b1 100644 --- a/lib/view/page/home.dart +++ b/lib/view/page/home.dart @@ -319,7 +319,7 @@ ${GithubIds.participants.map((e) => '[$e](${e.url})').join(' ')} HomeWidgetMC.update(); await GetIt.I.allReady(); await Pros.server.load(); - await Pros.server.refreshData(); + await Pros.server.refresh(); } Future _onLongPressSetting() async { diff --git a/lib/view/page/server/tab.dart b/lib/view/page/server/tab.dart index c57ea776..bf05d183 100644 --- a/lib/view/page/server/tab.dart +++ b/lib/view/page/server/tab.dart @@ -107,7 +107,7 @@ class _ServerPageState extends State return RefreshIndicator( key: ServerProvider.refreshKey, - onRefresh: () async => await Pros.server.refreshData(onlyFailed: true), + onRefresh: () async => await Pros.server.refresh(onlyFailed: true), child: child, ); } @@ -323,7 +323,7 @@ class _ServerPageState extends State rightCorner = InkWell( onTap: () { TryLimiter.reset(spi.id); - Pros.server.refreshData(spi: spi); + Pros.server.refresh(spi: spi); }, child: const Padding( padding: EdgeInsets.symmetric(horizontal: 7), @@ -336,7 +336,7 @@ class _ServerPageState extends State ); } else if (!(spi.autoConnect ?? true) && cs == ServerState.disconnected) { rightCorner = InkWell( - onTap: () => Pros.server.refreshData(spi: spi), + onTap: () => Pros.server.refresh(spi: spi), child: const Padding( padding: EdgeInsets.symmetric(horizontal: 7), child: Icon( diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 08ffe237..81fdf318 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -439,7 +439,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 725; + CURRENT_PROJECT_VERSION = 726; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -449,7 +449,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.725; + MARKETING_VERSION = 1.0.726; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -574,7 +574,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 725; + CURRENT_PROJECT_VERSION = 726; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -584,7 +584,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.725; + MARKETING_VERSION = 1.0.726; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -604,7 +604,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 725; + CURRENT_PROJECT_VERSION = 726; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=macosx*]" = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; @@ -615,7 +615,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.725; + MARKETING_VERSION = 1.0.726; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = "";