diff --git a/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt b/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt index 4bdb6cf0..ef7a2a65 100644 --- a/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt +++ b/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt @@ -11,6 +11,9 @@ import app.revanced.patcher.PatchBundleLoader import app.revanced.patcher.Patcher import app.revanced.patcher.PatcherOptions import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages +import app.revanced.patcher.extensions.PatchExtensions.dependencies +import app.revanced.patcher.extensions.PatchExtensions.description +import app.revanced.patcher.extensions.PatchExtensions.include import app.revanced.patcher.extensions.PatchExtensions.patchName import app.revanced.patcher.patch.PatchResult import io.flutter.embedding.android.FlutterActivity @@ -89,6 +92,29 @@ class MainActivity : FlutterActivity() { stopResult = result } + "getPatches" -> { + val patchBundleFilePath = call.argument("patchBundleFilePath") + if (patchBundleFilePath != null) { + val patches = PatchBundleLoader.Dex( + File(patchBundleFilePath) + ).map { patch -> + val map = HashMap() + map["\"name\""] = "\"${patch.patchName.replace("\"","\\\"")}\"" + map["\"description\""] = "\"${patch.description?.replace("\"","\\\"")}\"" + map["\"excluded\""] = !patch.include + map["\"dependencies\""] = patch.dependencies?.map { "\"${it.java.patchName}\"" } ?: emptyList() + map["\"compatiblePackages\""] = patch.compatiblePackages?.map { + val map2 = HashMap() + map2["\"name\""] = "\"${it.name}\"" + map2["\"versions\""] = it.versions.map { version -> "\"${version}\"" } + map2 + } ?: emptyList() + map + } + result.success(patches) + } else result.notImplemented() + } + else -> result.notImplemented() } } diff --git a/lib/services/github_api.dart b/lib/services/github_api.dart index de8c160b..0949f1b9 100644 --- a/lib/services/github_api.dart +++ b/lib/services/github_api.dart @@ -222,10 +222,8 @@ class GithubAPI { final String downloadUrl = asset['browser_download_url']; if (extension == '.apk') { _managerAPI.setIntegrationsDownloadURL(downloadUrl); - } else if (extension == '.json') { - _managerAPI.setPatchesDownloadURL(downloadUrl, false); } else { - _managerAPI.setPatchesDownloadURL(downloadUrl, true); + _managerAPI.setPatchesDownloadURL(downloadUrl); } return await DefaultCacheManager().getSingleFile( downloadUrl, diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 4d4b3f44..0b2cb58d 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -11,6 +11,7 @@ import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/services/github_api.dart'; +import 'package:revanced_manager/services/patcher_api.dart'; import 'package:revanced_manager/services/revanced_api.dart'; import 'package:revanced_manager/services/root_api.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_material_button.dart'; @@ -26,6 +27,7 @@ class ManagerAPI { final String patcherRepo = 'revanced-patcher'; final String cliRepo = 'revanced-cli'; late SharedPreferences _prefs; + List patches = []; bool isRooted = false; String storedPatchesFile = '/selected-patches.json'; String keystoreFile = @@ -79,12 +81,12 @@ class ManagerAPI { await _prefs.setString('repoUrl', url); } - String getPatchesDownloadURL(bool bundle) { - return _prefs.getString('patchesDownloadURL-$bundle') ?? ''; + String getPatchesDownloadURL() { + return _prefs.getString('patchesDownloadURL') ?? ''; } - Future setPatchesDownloadURL(String value, bool bundle) async { - await _prefs.setString('patchesDownloadURL-$bundle', value); + Future setPatchesDownloadURL(String value) async { + await _prefs.setString('patchesDownloadURL', value); } String getPatchesRepo() { @@ -300,28 +302,38 @@ class ManagerAPI { } Future> getPatches() async { - try { - final String repoName = getPatchesRepo(); - final String currentVersion = await getCurrentPatchesVersion(); - final String url = getPatchesDownloadURL(false); - return await _githubAPI.getPatches( - repoName, - currentVersion, - url, - ); - } on Exception catch (e) { - if (kDebugMode) { - print(e); - } - return []; + if (patches.isNotEmpty) { + return patches; } + final File? patchBundleFile = await downloadPatches(); + if (patchBundleFile != null) { + try { + final patchesObject = await PatcherAPI.patcherChannel.invokeMethod( + 'getPatches', + { + 'patchBundleFilePath': patchBundleFile.path, + }, + ); + final List> patchesMap = []; + patchesObject.forEach((patch) { + patchesMap.add(jsonDecode('$patch')); + }); + patches = patchesMap.map((patch) => Patch.fromJson(patch)).toList(); + return patches; + } on Exception catch (e) { + if (kDebugMode) { + print(e); + } + } + } + return List.empty(); } Future downloadPatches() async { try { final String repoName = getPatchesRepo(); final String currentVersion = await getCurrentPatchesVersion(); - final String url = getPatchesDownloadURL(true); + final String url = getPatchesDownloadURL(); return await _githubAPI.getPatchesReleaseFile( '.jar', repoName, @@ -447,8 +459,7 @@ class ManagerAPI { Future setCurrentPatchesVersion(String version) async { await _prefs.setString('patchesVersion', version); - await setPatchesDownloadURL('', false); - await setPatchesDownloadURL('', true); + await setPatchesDownloadURL(''); await downloadPatches(); } diff --git a/lib/services/patcher_api.dart b/lib/services/patcher_api.dart index 9935d9ea..5838ab3b 100644 --- a/lib/services/patcher_api.dart +++ b/lib/services/patcher_api.dart @@ -32,7 +32,6 @@ class PatcherAPI { Future initialize() async { await _loadPatches(); - await _managerAPI.downloadPatches(); await _managerAPI.downloadIntegrations(); final Directory appCache = await getTemporaryDirectory(); _dataDir = await getExternalStorageDirectory() ?? appCache;