From 6f96c668debe84891900ef5ba033b65448e44ed2 Mon Sep 17 00:00:00 2001 From: Alberto Ponces Date: Wed, 24 Aug 2022 14:17:16 +0100 Subject: [PATCH] fix: improve installer progress and logs update --- .../app/revanced/manager/MainActivity.kt | 148 ++++++++++++++---- .../views/installer/installer_viewmodel.dart | 62 ++++---- 2 files changed, 145 insertions(+), 65 deletions(-) diff --git a/android/app/src/main/kotlin/app/revanced/manager/MainActivity.kt b/android/app/src/main/kotlin/app/revanced/manager/MainActivity.kt index d41e5c6e..74dddf2f 100644 --- a/android/app/src/main/kotlin/app/revanced/manager/MainActivity.kt +++ b/android/app/src/main/kotlin/app/revanced/manager/MainActivity.kt @@ -196,8 +196,14 @@ class MainActivity : FlutterActivity() { Thread( Runnable { handler.post { - installerChannel.invokeMethod("updateProgress", 0.1) - installerChannel.invokeMethod("updateLog", "Copying original apk") + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 0.1, + "header" to "", + "log" to "Copying original apk" + ) + ) } Files.copy( originalFile.toPath(), @@ -206,8 +212,14 @@ class MainActivity : FlutterActivity() { ) handler.post { - installerChannel.invokeMethod("updateProgress", 0.2) - installerChannel.invokeMethod("updateLog", "Creating patcher") + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 0.2, + "header" to "Unpacking apk...", + "log" to "Unpacking copied apk" + ) + ) } val patcher = Patcher( @@ -222,73 +234,131 @@ class MainActivity : FlutterActivity() { app.revanced.patcher.logging.Logger { override fun error(msg: String) { handler.post { - installerChannel - .invokeMethod( - "updateLog", - msg + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 0.2, + "header" to "", + "log" to msg ) + ) } } override fun warn(msg: String) { handler.post { - installerChannel - .invokeMethod( - "updateLog", - msg + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 0.2, + "header" to "", + "log" to msg ) + ) } } override fun info(msg: String) { handler.post { - installerChannel - .invokeMethod( - "updateLog", - msg + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 0.2, + "header" to "", + "log" to msg ) + ) } } override fun trace(msg: String) { handler.post { - installerChannel - .invokeMethod( - "updateLog", - msg + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 0.2, + "header" to "", + "log" to msg ) + ) } } } ) ) - handler.post { installerChannel.invokeMethod("updateProgress", 0.3) } + handler.post { + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 0.3, + "header" to "", + "log" to "" + ) + ) + } if (mergeIntegrations) { handler.post { installerChannel.invokeMethod( - "updateLog", - "Merging integrations" + "update", + mapOf( + "progress" to 0.4, + "header" to "Merging integrations...", + "log" to "Merging integrations" + ) ) } patcher.addFiles(listOf(integrations)) {} } - handler.post { installerChannel.invokeMethod("updateProgress", 0.5) } + handler.post { + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 0.5, + "header" to "Applying patches...", + "log" to "" + ) + ) + } patcher.addPatches(filteredPatches) patcher.applyPatches().forEach { (patch, res) -> if (res.isSuccess) { val msg = "[success] $patch" - handler.post { installerChannel.invokeMethod("updateLog", msg) } + handler.post { + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 0.5, + "header" to "", + "log" to msg + ) + ) + } return@forEach } val msg = "[error] $patch:" + res.exceptionOrNull()!! - handler.post { installerChannel.invokeMethod("updateLog", msg) } + handler.post { + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 0.5, + "header" to "", + "log" to msg + ) + ) + } } handler.post { - installerChannel.invokeMethod("updateProgress", 0.7) - installerChannel.invokeMethod("updateLog", "Repacking patched apk") + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 0.7, + "header" to "Repacking apk...", + "log" to "Repacking patched apk" + ) + ) } val res = patcher.save() ZipFile(patchedFile).use { file -> @@ -309,13 +379,27 @@ class MainActivity : FlutterActivity() { ZipAligner::getEntryAlignment ) } - - handler.post { installerChannel.invokeMethod("updateProgress", 0.9) } + handler.post { + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 0.9, + "header" to "Signing apk...", + "log" to "" + ) + ) + } Signer("ReVanced", "s3cur3p@ssw0rd").signApk(patchedFile, outFile) handler.post { - installerChannel.invokeMethod("updateProgress", 1.0) - installerChannel.invokeMethod("updateLog", "Finished") + installerChannel.invokeMethod( + "update", + mapOf( + "progress" to 1.0, + "header" to "Finished", + "log" to "Finished" + ) + ) } handler.post { result.success(null) } diff --git a/lib/ui/views/installer/installer_viewmodel.dart b/lib/ui/views/installer/installer_viewmodel.dart index 834d9dfc..f7043309 100644 --- a/lib/ui/views/installer/installer_viewmodel.dart +++ b/lib/ui/views/installer/installer_viewmodel.dart @@ -23,7 +23,7 @@ class InstallerViewModel extends BaseViewModel { double? progress = 0.0; String logs = ''; String headerLogs = ''; - bool isPatching = false; + bool isPatching = true; bool isInstalled = false; Future initialize(BuildContext context) async { @@ -55,36 +55,34 @@ class InstallerViewModel extends BaseViewModel { Future handlePlatformChannelMethods() async { _installerChannel.setMethodCallHandler((call) async { switch (call.method) { - case 'updateProgress': + case 'update': if (call.arguments != null) { - updateProgress(call.arguments); - } - break; - case 'updateLog': - if (call.arguments != null) { - updateLog(call.arguments); + Map arguments = call.arguments; + double progress = arguments['progress']; + String header = arguments['header']; + String log = arguments['log']; + update(progress, header, log); } break; } }); } - void updateProgress(double value) { + void update(double value, String header, String log) { progress = value; isInstalled = false; isPatching = progress == 1.0 ? false : true; if (progress == 0.0) { logs = ''; } - notifyListeners(); - } - - void updateLog(String message) { - if (message.isNotEmpty && !message.startsWith('Merging L')) { + if (header.isNotEmpty) { + headerLogs = header; + } + if (log.isNotEmpty && !log.startsWith('Merging L')) { if (logs.isNotEmpty) { logs += '\n'; } - logs += message; + logs += log; Future.delayed(const Duration(milliseconds: 500)).then((value) { scrollController.animateTo( scrollController.position.maxScrollExtent, @@ -92,26 +90,24 @@ class InstallerViewModel extends BaseViewModel { curve: Curves.fastOutSlowIn, ); }); - notifyListeners(); } + notifyListeners(); } Future runPatcher() async { - updateProgress(0.0); + update(0.0, 'Initializing...', 'Initializing installer'); if (_app != null && _patches.isNotEmpty) { String apkFilePath = _app!.apkFilePath; try { - updateLog('Initializing installer'); - headerLogs = 'Initializing'; if (_app!.isRooted && !_app!.isFromStorage) { - updateLog('Checking if an old patched version exists'); + update(0.0, '', 'Checking if an old patched version exists'); bool oldExists = await _patcherAPI.checkOldPatch(_app!); if (oldExists) { - updateLog('Deleting old patched version'); + update(0.0, '', 'Deleting old patched version'); await _patcherAPI.deleteOldPatch(_app!); } } - updateLog('Creating working directory'); + update(0.0, '', 'Creating working directory'); bool mergeIntegrations = false; bool resourcePatching = false; if (_app!.packageName == 'com.google.android.youtube') { @@ -122,7 +118,6 @@ class InstallerViewModel extends BaseViewModel { resourcePatching = true; } await _patcherAPI.mergeIntegrations(mergeIntegrations); - headerLogs = 'Merging integrations'; await _patcherAPI.runPatcher( apkFilePath, _patches, @@ -130,11 +125,10 @@ class InstallerViewModel extends BaseViewModel { resourcePatching, ); } on Exception { - updateLog('An error occurred! Aborting'); - headerLogs = 'Aborting...'; + update(1.0, 'Aborting...', 'An error occurred! Aborting'); } } else { - updateLog('No app or patches selected! Aborting'); + update(1.0, 'Aborting...', 'No app or patches selected! Aborting'); } try { await FlutterBackground.disableBackgroundExecution(); @@ -145,19 +139,21 @@ class InstallerViewModel extends BaseViewModel { void installResult() async { if (_app != null) { - updateLog(_app!.isRooted - ? 'Installing patched file using root method' - : 'Installing patched file using nonroot method'); - headerLogs = 'Installing...'; + update( + 1.0, + 'Installing...', + _app!.isRooted + ? 'Installing patched file using root method' + : 'Installing patched file using nonroot method', + ); isInstalled = await _patcherAPI.installPatchedFile(_app!); if (isInstalled) { - updateLog('Done'); + update(1.0, 'Installed...', 'Installed'); _app!.patchDate = DateTime.now(); _app!.appliedPatches.addAll(_patches.map((p) => p.name).toList()); await saveApp(); } else { - updateLog('An error occurred! Aborting'); - headerLogs = 'Aborting...'; + update(1.0, 'Aborting...', 'An error occurred! Aborting'); } } }