diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 3d6b1590..ef741242 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,5 +1,5 @@ PODS: - - countly_flutter (23.8.0): + - countly_flutter (23.8.1): - Flutter - file_picker (0.0.1): - Flutter @@ -71,7 +71,7 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/watch_connectivity/ios" SPEC CHECKSUMS: - countly_flutter: f153e5547d4f3cdf24be11f6ed4df32c9a421fa3 + countly_flutter: 9024d787ff03c4a2882bca3578edee80901b4289 file_picker: 1d63c4949e05e386da864365f8c13e1e64787675 Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 6b58995e..4b16f871 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -25,10 +25,13 @@ E39515C22AB5AC85003602C1 /* Info-Profile.plist in Resources */ = {isa = PBXBuildFile; fileRef = E39515BF2AB5AC85003602C1 /* Info-Profile.plist */; }; E39515CA2AB5AD62003602C1 /* WatchEndApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = E39515C92AB5AD62003602C1 /* WatchEndApp.swift */; }; E39515CC2AB5AD62003602C1 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E39515CB2AB5AD62003602C1 /* ContentView.swift */; }; - E39515D42AB5AD64003602C1 /* WatchApp.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = E39515C72AB5AD62003602C1 /* WatchApp.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + E39515D42AB5AD64003602C1 /* ServerBox.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = E39515C72AB5AD62003602C1 /* ServerBox.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; E39515DB2AB5AE7F003602C1 /* PhoneConnMgr.swift in Sources */ = {isa = PBXBuildFile; fileRef = E39515DA2AB5AE7F003602C1 /* PhoneConnMgr.swift */; }; E39515DD2AB5AE9E003602C1 /* Store.swift in Sources */ = {isa = PBXBuildFile; fileRef = E39515DC2AB5AE9E003602C1 /* Store.swift */; }; E39515E02AB5CF97003602C1 /* Watch.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E39515DF2AB5CF97003602C1 /* Watch.xcassets */; }; + E3AE8AEA2AB601DB000A6459 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3AE8AE92AB601DB000A6459 /* Utils.swift */; }; + E3AE8AEB2AB601DB000A6459 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3AE8AE92AB601DB000A6459 /* Utils.swift */; }; + E3AE8AEC2AB601DB000A6459 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3AE8AE92AB601DB000A6459 /* Utils.swift */; }; E3DB67ED2A31FE200027B8CB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E3DB67EB2A31FE200027B8CB /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ @@ -77,7 +80,7 @@ dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; dstSubfolderSpec = 16; files = ( - E39515D42AB5AD64003602C1 /* WatchApp.app in Embed Watch Content */, + E39515D42AB5AD64003602C1 /* ServerBox.app in Embed Watch Content */, ); name = "Embed Watch Content"; runOnlyForDeploymentPostprocessing = 0; @@ -110,13 +113,14 @@ E39515BD2AB5AC85003602C1 /* Info-Release.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "Info-Release.plist"; path = "../../../server_box_bak/ios/Runner/Info-Release.plist"; sourceTree = ""; }; E39515BE2AB5AC85003602C1 /* Info-Debug.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "Info-Debug.plist"; path = "../../../server_box_bak/ios/Runner/Info-Debug.plist"; sourceTree = ""; }; E39515BF2AB5AC85003602C1 /* Info-Profile.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "Info-Profile.plist"; path = "../../../server_box_bak/ios/Runner/Info-Profile.plist"; sourceTree = ""; }; - E39515C72AB5AD62003602C1 /* WatchApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WatchApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + E39515C72AB5AD62003602C1 /* ServerBox.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ServerBox.app; sourceTree = BUILT_PRODUCTS_DIR; }; E39515C92AB5AD62003602C1 /* WatchEndApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchEndApp.swift; sourceTree = ""; }; E39515CB2AB5AD62003602C1 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; E39515DA2AB5AE7F003602C1 /* PhoneConnMgr.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneConnMgr.swift; sourceTree = ""; }; E39515DC2AB5AE9E003602C1 /* Store.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Store.swift; sourceTree = ""; }; E39515DF2AB5CF97003602C1 /* Watch.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Watch.xcassets; sourceTree = ""; }; E398BF6A29BDB34500FE4FD5 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + E3AE8AE92AB601DB000A6459 /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; E3DB67EC2A31FE200027B8CB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; /* End PBXFileReference section */ @@ -187,7 +191,7 @@ children = ( 97C146EE1CF9000F007C117D /* Runner.app */, E33A3E352A626DCD009744AB /* StatusWidgetExtension.appex */, - E39515C72AB5AD62003602C1 /* WatchApp.app */, + E39515C72AB5AD62003602C1 /* ServerBox.app */, ); name = Products; sourceTree = ""; @@ -204,6 +208,7 @@ E3DB67EB2A31FE200027B8CB /* LaunchScreen.storyboard */, 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + E3AE8AE92AB601DB000A6459 /* Utils.swift */, 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, ); @@ -303,7 +308,7 @@ ); name = WatchApp; productName = "WatchEnd Watch App"; - productReference = E39515C72AB5AD62003602C1 /* WatchApp.app */; + productReference = E39515C72AB5AD62003602C1 /* ServerBox.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -461,6 +466,7 @@ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, E33A3E462A626DD0009744AB /* StatusWidget.intentdefinition in Sources */, + E3AE8AEA2AB601DB000A6459 /* Utils.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -471,6 +477,7 @@ E33A3E402A626DCE009744AB /* StatusWidget.swift in Sources */, E33A3E452A626DD0009744AB /* StatusWidget.intentdefinition in Sources */, E33A3E3C2A626DCE009744AB /* StatusWidgetBundle.swift in Sources */, + E3AE8AEB2AB601DB000A6459 /* Utils.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -478,6 +485,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + E3AE8AEC2AB601DB000A6459 /* Utils.swift in Sources */, E39515DB2AB5AE7F003602C1 /* PhoneConnMgr.swift in Sources */, E39515CC2AB5AD62003602C1 /* ContentView.swift in Sources */, E39515CA2AB5AD62003602C1 /* WatchEndApp.swift in Sources */, @@ -578,7 +586,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 560; + CURRENT_PROJECT_VERSION = 561; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -586,7 +594,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.560; + MARKETING_VERSION = 1.0.561; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -710,7 +718,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 560; + CURRENT_PROJECT_VERSION = 561; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -718,7 +726,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.560; + MARKETING_VERSION = 1.0.561; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -736,7 +744,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 560; + CURRENT_PROJECT_VERSION = 561; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -744,7 +752,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.560; + MARKETING_VERSION = 1.0.561; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -765,7 +773,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 560; + CURRENT_PROJECT_VERSION = 561; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -778,7 +786,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.560; + MARKETING_VERSION = 1.0.561; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -804,7 +812,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 560; + CURRENT_PROJECT_VERSION = 561; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -817,7 +825,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.560; + MARKETING_VERSION = 1.0.561; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -840,7 +848,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 560; + CURRENT_PROJECT_VERSION = 561; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -853,7 +861,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.560; + MARKETING_VERSION = 1.0.561; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -876,24 +884,23 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 560; + CURRENT_PROJECT_VERSION = 561; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = WatchEnd; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.lollipopkit.toolbox; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.560; + MARKETING_VERSION = 1.0.561; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = ServerBox; SDKROOT = watchos; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "watchsimulator watchos"; @@ -918,23 +925,22 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 560; + CURRENT_PROJECT_VERSION = 561; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = WatchEnd; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.lollipopkit.toolbox; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.560; + MARKETING_VERSION = 1.0.561; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = ServerBox; SDKROOT = watchos; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "watchsimulator watchos"; @@ -957,23 +963,22 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 560; + CURRENT_PROJECT_VERSION = 561; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = WatchEnd; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.lollipopkit.toolbox; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.560; + MARKETING_VERSION = 1.0.561; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = ServerBox; SDKROOT = watchos; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "watchsimulator watchos"; diff --git a/ios/Runner/Utils.swift b/ios/Runner/Utils.swift new file mode 100644 index 00000000..814cb7a0 --- /dev/null +++ b/ios/Runner/Utils.swift @@ -0,0 +1,32 @@ +// +// Utils.swift +// Runner +// +// Created by lolli on 2023/9/16. +// + +import Foundation + +extension Date { + func toStr() -> String { + let formatter = DateFormatter() + formatter.dateStyle = .none + formatter.timeStyle = .short + formatter.locale = Locale.current + return formatter.string(from: self) + } +} + +enum ContentState { + case loading + case error(String) + case normal(Status) +} + +struct Status { + let name: String + let cpu: String + let mem: String + let disk: String + let net: String +} diff --git a/ios/StatusWidget/StatusWidget.swift b/ios/StatusWidget/StatusWidget.swift index 309c5317..5c7b09f5 100644 --- a/ios/StatusWidget/StatusWidget.swift +++ b/ios/StatusWidget/StatusWidget.swift @@ -9,25 +9,17 @@ import WidgetKit import SwiftUI import Intents -struct Status { - let name: String - let cpu: String - let mem: String - let disk: String - let net: String -} - -let demoStatus = Status(name: "Server Name", cpu: "31.7%", mem: "1.3g / 1.9g", disk: "7.1g / 30.0g", net: "712.3k / 1.2m") +let demoStatus = Status(name: "Server", cpu: "31.7%", mem: "1.3g / 1.9g", disk: "7.1g / 30.0g", net: "712.3k / 1.2m") let domain = "com.lollipopkit.toolbox" var url: String? struct Provider: IntentTimelineProvider { func placeholder(in context: Context) -> SimpleEntry { - SimpleEntry(date: Date(), configuration: ConfigurationIntent(), data: demoStatus, state: .normal) + SimpleEntry(date: Date(), configuration: ConfigurationIntent(), state: .normal(demoStatus)) } func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) { - let entry = SimpleEntry(date: Date(), configuration: configuration, data: demoStatus, state: .normal) + let entry = SimpleEntry(date: Date(), configuration: configuration, state: .normal(demoStatus)) completion(entry) } @@ -43,11 +35,10 @@ struct Provider: IntentTimelineProvider { entry = SimpleEntry( date: currentDate, configuration: configuration, - data: status, - state: .normal + state: .normal(status) ) case .failure(let err): - entry = SimpleEntry(date: currentDate, configuration: configuration, data: demoStatus, state: .error(err.localizedDescription)) + entry = SimpleEntry(date: currentDate, configuration: configuration, state: .error(err.localizedDescription)) } let timeline = Timeline(entries: [entry], policy: .after(refreshDate)) completion(timeline) @@ -58,7 +49,6 @@ struct Provider: IntentTimelineProvider { struct SimpleEntry: TimelineEntry { let date: Date let configuration: ConfigurationIntent - let data: Status let state: ContentState } @@ -71,17 +61,19 @@ struct StatusWidgetEntryView : View { ProgressView().padding() case .error(let descriotion): Text(descriotion).padding(.all, 13) - case .normal: - VStack(alignment: .leading, spacing: 5.7) { - Text(entry.data.name).font(.system(.title3)) + case .normal(let data): + let sumColor: Color = .primary.opacity(0.7) + VStack(alignment: .leading, spacing: 3.7) { + Text(data.name).font(.system(.title3, design: .monospaced)) Spacer() - DetailItem(icon: "cpu", text: entry.data.cpu, color: .primary.opacity(0.7)) - DetailItem(icon: "memorychip", text: entry.data.mem, color: .primary.opacity(0.7)) - DetailItem(icon: "externaldrive", text: entry.data.disk, color: .primary.opacity(0.7)) + DetailItem(icon: "cpu", text: data.cpu, color: sumColor) + DetailItem(icon: "memorychip", text: data.mem, color: sumColor) + DetailItem(icon: "externaldrive", text: data.disk, color: sumColor) + DetailItem(icon: "network", text: data.net, color: sumColor) Spacer() - DetailItem(icon: "clock", text: date2String(entry.date, dateFormat: "HH:mm"), color: .primary.opacity(0.7)) + DetailItem(icon: "clock", text: entry.date.toStr(), color: sumColor) }.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) - .padding() + .padding(.all, 17) } } } @@ -101,28 +93,31 @@ struct StatusWidget: Widget { struct StatusWidget_Previews: PreviewProvider { static var previews: some View { - StatusWidgetEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent(), data: demoStatus, state: .normal)) + StatusWidgetEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent(), state: .normal(demoStatus))) .previewContext(WidgetPreviewContext(family: .systemSmall)) } } struct StatusLoader { static func fetch(completion: @escaping (Result) -> Void) { - if let url = url, url.count < 12 { - completion(.failure(NSError(domain: domain, code: 1, userInfo: [NSLocalizedDescriptionKey: "https://github.com/lollipopkit/server_box_monitor/wiki"]))) + guard let url = url, url.count < 12 else { + completion(.failure(NSError(domain: domain, code: 0, userInfo: [NSLocalizedDescriptionKey: "https://github.com/lollipopkit/server_box_monitor/wiki"]))) return } - let URL = URL(string: url!)! - let task = URLSession.shared.dataTask(with: URL) { (data, response, error) in + guard let url = URL(string: url) else { + completion(.failure(NSError(domain: domain, code: 1, userInfo: [NSLocalizedDescriptionKey: "url is invalid"]))) + return + } + let task = URLSession.shared.dataTask(with: url) { (data, response, error) in guard error == nil else { completion(.failure(error!)) return } - guard data != nil else { + guard let data = data else { completion(.failure(NSError(domain: domain, code: 2, userInfo: [NSLocalizedDescriptionKey: "empty network data."]))) return } - let result = getStatus(fromData: data!) + let result = getStatus(fromData: data) switch result { case .success(let status): completion(.success(status)) @@ -182,24 +177,11 @@ struct DetailItem: View { let color: Color var body: some View { - HStack(spacing: 5.7) { + HStack(spacing: 7.7) { Image(systemName: icon).resizable().foregroundColor(color).frame(width: 11, height: 11, alignment: .center) Text(text) - .font(.system(.caption2)) + .font(.system(.caption2, design: .monospaced)) .foregroundColor(color) } } } - -func date2String(_ date:Date, dateFormat:String = "yyyy-MM-dd HH:mm:ss") -> String { - let formatter = DateFormatter() - formatter.dateFormat = dateFormat - let date = formatter.string(from: date) - return date -} - -enum ContentState { - case loading - case error(String) - case normal -} diff --git a/ios/WatchApp/ContentView.swift b/ios/WatchApp/ContentView.swift index c2531060..2033d048 100644 --- a/ios/WatchApp/ContentView.swift +++ b/ios/WatchApp/ContentView.swift @@ -65,7 +65,7 @@ struct PageView: View { DetailItem(icon: "memorychip", text: status.mem) DetailItem(icon: "externaldrive", text: status.disk) DetailItem(icon: "network", text: status.net) - }.frame(maxWidth: .infinity, maxHeight: .infinity).padding([.horizontal], 7) + }.frame(maxWidth: .infinity, maxHeight: .infinity).padding([.horizontal], 11) } } } @@ -134,18 +134,3 @@ struct DetailItem: View { } } } - -enum ContentState { - case loading - case error(String) - case normal(Status) -} - -struct Status { - let name: String - let cpu: String - let mem: String - let disk: String - let net: String -} - diff --git a/lib/core/utils/platform/auth.dart b/lib/core/utils/platform/auth.dart index c200e54b..4d59dbaa 100644 --- a/lib/core/utils/platform/auth.dart +++ b/lib/core/utils/platform/auth.dart @@ -18,6 +18,7 @@ class BioAuth { return false; } final biometrics = await _auth.getAvailableBiometrics(); + /// [biometrics] on Android and Windows is returned with error /// Handle it specially if (isAndroid | isWindows) return biometrics.isNotEmpty; diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index 46bf2e47..cb702076 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 = 560; + static const int build = 561; static const String engine = "3.13.2"; - static const String buildAt = "2023-09-16 22:15:32"; - static const int modifications = 6; + static const String buildAt = "2023-09-17 00:01:27"; + static const int modifications = 8; static const int script = 15; } diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 1d21159d..da056f4e 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -476,9 +476,9 @@ baseConfigurationReference = C1C758C41C4E208965A68933 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 560; + CURRENT_PROJECT_VERSION = 561; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.560; + MARKETING_VERSION = 1.0.561; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -491,9 +491,9 @@ baseConfigurationReference = 15AF97DF993E8968098D6EBE /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 560; + CURRENT_PROJECT_VERSION = 561; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.560; + MARKETING_VERSION = 1.0.561; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -506,9 +506,9 @@ baseConfigurationReference = 7CFA7DE7FABA75685DFB6948 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 560; + CURRENT_PROJECT_VERSION = 561; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.560; + MARKETING_VERSION = 1.0.561; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0;