diff --git a/assets/binary/aria2c.zip b/assets/binary/aria2c.zip new file mode 100644 index 0000000..f7ab6e9 Binary files /dev/null and b/assets/binary/aria2c.zip differ diff --git a/lib/common/conf/binary_conf.dart b/lib/common/conf/binary_conf.dart new file mode 100644 index 0000000..56c7fd3 --- /dev/null +++ b/lib/common/conf/binary_conf.dart @@ -0,0 +1,45 @@ +import 'dart:io'; + +import 'package:archive/archive.dart'; +import 'package:flutter/services.dart'; +import 'package:starcitizen_doctor/common/conf/app_conf.dart'; +import 'package:starcitizen_doctor/common/utils/base_utils.dart'; + +class BinaryModuleConf { + static const _modules = { + "aria2c": "0", + }; + + static Future extractModel() async { + final workingDir = "${AppConf.applicationSupportDir}\\modules"; + for (var m in _modules.entries) { + final name = m.key; + final version = m.value; + final dir = "$workingDir\\$name"; + final versionFile = File("$dir\\version"); + if (await versionFile.exists() && + (await versionFile.readAsString()).trim() == version) { + dPrint( + "BinaryModuleConf.extractModule skip $name version == $version"); + continue; + } + // write model file + final zipBuffer = await rootBundle.load("assets/binary/$name.zip"); + final decoder = ZipDecoder().decodeBytes(zipBuffer.buffer.asUint8List()); + for (var value in decoder.files) { + final filename = value.name; + if (value.isFile) { + final data = value.content as List; + final file = File('$dir\\$filename'); + await file.create(recursive: true); + await file.writeAsBytes(data); + } else { + await Directory('$dir\\$filename').create(recursive: true); + } + } + // write version file + await versionFile.writeAsString(version); + dPrint("BinaryModuleConf.extractModule $name $dir"); + } + } +} diff --git a/lib/ui/splash_ui_model.dart b/lib/ui/splash_ui_model.dart index cf010c6..a3869be 100644 --- a/lib/ui/splash_ui_model.dart +++ b/lib/ui/splash_ui_model.dart @@ -1,5 +1,6 @@ import 'package:starcitizen_doctor/api/analytics.dart'; import 'package:starcitizen_doctor/base/ui_model.dart'; +import 'package:starcitizen_doctor/common/conf/binary_conf.dart'; import 'package:starcitizen_doctor/common/conf/url_conf.dart'; import 'package:starcitizen_doctor/ui/index_ui.dart'; import 'package:starcitizen_doctor/ui/index_ui_model.dart'; @@ -27,6 +28,7 @@ class SplashUIModel extends BaseUIModel { await AppConf.checkUpdate(); step = 2; notifyListeners(); + await handleError(() => BinaryModuleConf.extractModel()); Future.delayed(const Duration(milliseconds: 300)); Navigator.pushAndRemoveUntil( context!, diff --git a/pubspec.yaml b/pubspec.yaml index 6f2b132..a93b01d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -102,6 +102,7 @@ flutter: uses-material-design: true assets: - assets/ + - assets/binary/ - assets/countdown/ # To add assets to your application, add an assets section, like this: