diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 8cf7235a..50efb55f 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -359,7 +359,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 261; + CURRENT_PROJECT_VERSION = 262; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -367,7 +367,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.261; + MARKETING_VERSION = 1.0.262; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -490,7 +490,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 261; + CURRENT_PROJECT_VERSION = 262; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -498,7 +498,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.261; + MARKETING_VERSION = 1.0.262; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -515,7 +515,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 261; + CURRENT_PROJECT_VERSION = 262; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -523,7 +523,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.261; + MARKETING_VERSION = 1.0.262; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; diff --git a/lib/core/update.dart b/lib/core/update.dart index bc791f3d..26c8886b 100644 --- a/lib/core/update.dart +++ b/lib/core/update.dart @@ -4,7 +4,6 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:logging/logging.dart'; import 'package:r_upgrade/r_upgrade.dart'; -import '../data/model/app/update.dart'; import '../data/provider/app.dart'; import '../data/res/build_data.dart'; import '../data/service/app.dart'; @@ -27,16 +26,11 @@ Future isFileAvailable(String url) async { Future doUpdate(BuildContext context, {bool force = false}) async { final update = await locator().getUpdate(); - final newest = () { - if (isAndroid) { - return update.androidbuild; - } else if (isIOS) { - return update.iosbuild; - } else if (isMacOS) { - return update.macbuild; - } - return update.newest; - }(); + final newest = update.build.last.current; + if (newest == null) { + _logger.warning('Update not available on $platform'); + return; + } locator().setNewestBuild(newest); @@ -47,21 +41,23 @@ Future doUpdate(BuildContext context, {bool force = false}) async { } _logger.info('Update available: $newest'); - if (isAndroid && !await isFileAvailable(update.android)) { + final url = update.url.current!; + + if (isAndroid && !await isFileAvailable(url)) { _logger.warning('Android update file not available'); return; } final s = S.of(context)!; - if (update.min > BuildData.build) { + if (update.build.min.current! > BuildData.build) { showRoundDialog( context, s.attention, Text(s.updateTipTooLow(newest)), [ TextButton( - onPressed: () => _doUpdate(update, context, s), + onPressed: () => _doUpdate(url, context, s), child: Text(s.ok), ) ], @@ -73,15 +69,15 @@ Future doUpdate(BuildContext context, {bool force = false}) async { context, '${s.updateTip(newest)} \n${update.changelog}', s.update, - () => _doUpdate(update, context, s), + () => _doUpdate(url, context, s), ); } -Future _doUpdate(AppUpdate update, BuildContext context, S s) async { +Future _doUpdate(String url, BuildContext context, S s) async { if (isAndroid) { await RUpgrade.upgrade( - update.android, - fileName: update.android.split('/').last, + url, + fileName: url.split('/').last, isAutoRequestInstall: true, ); } else if (isIOS) { diff --git a/lib/data/model/app/update.dart b/lib/data/model/app/update.dart index 580d50be..bc31458c 100644 --- a/lib/data/model/app/update.dart +++ b/lib/data/model/app/update.dart @@ -1,54 +1,123 @@ -/// -/// Code generated by jsonToDartModel https://ashamp.github.io/jsonToDartModel/ -/// -class AppUpdate { /* { - "newest": 33, - "android": "https://v2.custed.lolli.tech/res/tiku/apk/33.apk", - "ios": "https://", - "min": 30, - "changelog": "" -} + "changelog": { + "mac": "xxx", + "ios": "xxx", + "android": "" + }, + "build": { + "min": { + "mac": 1, + "ios": 1, + "android": 1 + }, + "last": { + "mac": 1, + "ios": 1, + "android": 1 + } + }, + "url": { + "mac": "https://apps.apple.com/app/id1586449703", + "ios": "https://apps.apple.com/app/id1586449703", + "android": "https://cdn3.cust.app/uploads/ServerBox_262_Arm64.apk" + } +} */ - late int newest; - late int iosbuild; - late int androidbuild; - late int macbuild; - late String android; - late String ios; - late String mac; - late int min; - late String changelog; +import 'dart:convert'; - AppUpdate({ - required this.newest, - required this.android, - required this.ios, - required this.min, - required this.changelog, - }); - AppUpdate.fromJson(Map json) { - newest = json["newest"]?.toInt(); - macbuild = json["macbuild"]?.toInt(); - iosbuild = json["iosbuild"]?.toInt(); - androidbuild = json["androidbuild"]?.toInt(); - android = json["android"].toString(); - ios = json["ios"].toString(); - min = json["min"].toInt(); - changelog = json["changelog"].toString(); - } - Map toJson() { - final Map data = {}; - data["newest"] = newest; - data["macbuild"] = macbuild; - data["iosbuild"] = iosbuild; - data["androidbuild"] = androidbuild; - data["android"] = android; - data["ios"] = ios; - data["min"] = min; - data["changelog"] = changelog; - return data; - } +import '/core/utils/platform.dart'; + +class AppUpdate { + AppUpdate({ + required this.changelog, + required this.build, + required this.url, + }); + + final AppUpdatePlatformSpecific changelog; + final Build build; + final AppUpdatePlatformSpecific url; + + factory AppUpdate.fromRawJson(String str) => AppUpdate.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory AppUpdate.fromJson(Map json) => AppUpdate( + changelog: AppUpdatePlatformSpecific.fromJson(json["changelog"]), + build: Build.fromJson(json["build"]), + url: AppUpdatePlatformSpecific.fromJson(json["url"]), + ); + + Map toJson() => { + "changelog": changelog.toJson(), + "build": build.toJson(), + "url": url.toJson(), + }; +} + +class Build { + Build({ + required this.min, + required this.last, + }); + + final AppUpdatePlatformSpecific min; + final AppUpdatePlatformSpecific last; + + factory Build.fromRawJson(String str) => Build.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory Build.fromJson(Map json) => Build( + min: AppUpdatePlatformSpecific.fromJson(json["min"]), + last: AppUpdatePlatformSpecific.fromJson(json["last"]), + ); + + Map toJson() => { + "min": min.toJson(), + "last": last.toJson(), + }; +} + +class AppUpdatePlatformSpecific { + AppUpdatePlatformSpecific({ + required this.mac, + required this.ios, + required this.android, + }); + + final T mac; + final T ios; + final T android; + + factory AppUpdatePlatformSpecific.fromRawJson(String str) => AppUpdatePlatformSpecific.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory AppUpdatePlatformSpecific.fromJson(Map json) => AppUpdatePlatformSpecific( + mac: json["mac"], + ios: json["ios"], + android: json["android"], + ); + + Map toJson() => { + "mac": mac, + "ios": ios, + "android": android, + }; + + T? get current { + switch (platform) { + case PlatformType.macos: + return mac; + case PlatformType.ios: + return ios; + case PlatformType.android: + return android; + default: + return null; + } + } } diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index 5c6e1e49..7bce6fb3 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,8 +2,8 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 261; - static const String engine = "Flutter 3.7.11 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision f72efea43c (5 days ago) • 2023-04-11 11:57:21 -0700\nEngine • revision 1a65d409c7\nTools • Dart 2.19.6 • DevTools 2.20.1\n"; - static const String buildAt = "2023-04-17 13:09:32.878040"; - static const int modifications = 5; + static const int build = 262; + static const String engine = "3.7.11"; + static const String buildAt = "2023-04-17 18:13:48.223240"; + static const int modifications = 4; } diff --git a/lib/data/res/url.dart b/lib/data/res/url.dart index c658ef5e..7509ab42 100644 --- a/lib/data/res/url.dart +++ b/lib/data/res/url.dart @@ -1,5 +1,5 @@ const backendUrl = 'https://res.lolli.tech'; -const baseUrl = '$backendUrl/toolbox'; +const baseUrl = '$backendUrl/serverbox'; const joinQQGroupUrl = 'https://jq.qq.com/?_wv=1027&k=G0hUmPAq'; const myGithub = 'https://github.com/lollipopkit'; const issueUrl = '$myGithub/flutter_server_box/issues'; diff --git a/lib/data/res/virtual_key.dart b/lib/data/res/virtual_key.dart index d8870b5c..43d4d0f8 100644 --- a/lib/data/res/virtual_key.dart +++ b/lib/data/res/virtual_key.dart @@ -3,7 +3,7 @@ import 'package:xterm/core.dart'; import '../model/ssh/virtual_key.dart'; -var virtualKeys = [ +final virtualKeys = [ VirtualKey('Esc', key: TerminalKey.escape), VirtualKey('Alt', key: TerminalKey.alt, toggleable: true), VirtualKey('Home', key: TerminalKey.home),