From e82170fec64284edd08c8d4604785c792a5d4299 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 23 Nov 2024 16:05:02 -0500 Subject: [PATCH] Improved XAPK Support (#682) --- lib/app_sources/apkpure.dart | 6 +---- lib/providers/apps_provider.dart | 46 +++++++++++++++++++++----------- pubspec.lock | 22 +++++++-------- 3 files changed, 42 insertions(+), 32 deletions(-) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index 060d898c..9f20e0e4 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -105,11 +105,7 @@ class APKPure extends AppSource { .map((e) => e.text.trim()) .map((t) => t == 'APKs' ? 'APK' : t) ?? []; - String type = types.isEmpty - ? 'APK' - : types.length == 1 - ? types.first - : types.last; + String type = types.isEmpty ? 'APK' : types.first; String? dateString = apkInfo ?.querySelector('div.info-bottom span.time') ?.text diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index e4c2641b..f0f4817e 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -644,28 +644,38 @@ class AppsProvider with ChangeNotifier { var somethingInstalled = false; try { MultiAppMultiError errors = MultiAppMultiError(); + List APKFiles = []; for (var file in dir.extracted .listSync(recursive: true, followLinks: false) .whereType()) { if (file.path.toLowerCase().endsWith('.apk')) { - try { - somethingInstalled = somethingInstalled || - await installApk( - DownloadedApk(dir.appId, file), firstTimeWithContext, - needsBGWorkaround: needsBGWorkaround, - shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay); - } catch (e) { - logs.add( - 'Could not install APK from XAPK \'${file.path}\': ${e.toString()}'); - errors.add(dir.appId, e, appName: apps[dir.appId]?.name); - } + APKFiles.add(file); } else if (file.path.toLowerCase().endsWith('.obb')) { await moveObbFile(file, dir.appId); } } - if (somethingInstalled) { + APKFiles.sort((a, b) { + if (a.uri.pathSegments.last.startsWith(dir.appId)) { + return -1; + } else { + return 0; + } + }); + try { + await installApk( + DownloadedApk(dir.appId, APKFiles[0]), firstTimeWithContext, + needsBGWorkaround: needsBGWorkaround, + shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay, + additionalAPKs: APKFiles.sublist(1) + .map((a) => DownloadedApk(dir.appId, a)) + .toList()); + somethingInstalled = true; dir.file.delete(recursive: true); - } else if (errors.idsByErrorString.isNotEmpty) { + } catch (e) { + logs.add('Could not install APKs from XAPK: ${e.toString()}'); + errors.add(dir.appId, e, appName: apps[dir.appId]?.name); + } + if (errors.idsByErrorString.isNotEmpty) { throw errors; } } finally { @@ -677,7 +687,8 @@ class AppsProvider with ChangeNotifier { Future installApk( DownloadedApk file, BuildContext? firstTimeWithContext, {bool needsBGWorkaround = false, - bool shizukuPretendToBeGooglePlay = false}) async { + bool shizukuPretendToBeGooglePlay = false, + List additionalAPKs = const []}) async { if (firstTimeWithContext != null && settingsProvider.beforeNewInstallsShareToAppVerifier && (await getInstalledInfo('dev.soupslurpr.appverifier')) != null) { @@ -693,6 +704,7 @@ class AppsProvider with ChangeNotifier { if (newInfo == null) { try { file.file.deleteSync(recursive: true); + additionalAPKs.forEach((a) => a.file.deleteSync(recursive: true)); } catch (e) { // } finally { @@ -720,8 +732,10 @@ class AppsProvider with ChangeNotifier { } int? code; if (!settingsProvider.useShizuku) { - code = - await AndroidPackageInstaller.installApk(apkFilePath: file.file.path); + var allAPKs = [file.file.path]; + allAPKs.addAll(additionalAPKs.map((a) => a.file.path)); + code = await AndroidPackageInstaller.installApk( + apkFilePath: allAPKs.join(',')); } else { code = await ShizukuApkInstaller.installAPK(file.file.uri.toString(), shizukuPretendToBeGooglePlay ? "com.android.vending" : ""); diff --git a/pubspec.lock b/pubspec.lock index 2250673b..cbd4a202 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -14,7 +14,7 @@ packages: description: path: "." ref: main - resolved-ref: ba2aa7a11edc2649d1d80c25ed9291521262f714 + resolved-ref: bcad19e964d377da8816718032e5dbf6dd16ba3a url: "https://github.com/ImranR98/android_package_installer" source: git version: "0.0.1" @@ -449,10 +449,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: f0e599ba89c9946c8e051780f0ec99aba4ba15895e0380a7ab68f420046fc44e + sha256: "999a4e3cb3e1532a971c86d6c73a480264f6a687959d4887cb4e2990821827e4" url: "https://pub.dev" source: hosted - version: "0.7.4+1" + version: "0.7.4+2" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -731,10 +731,10 @@ packages: dependency: transitive description: name: permission_handler_html - sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" url: "https://pub.dev" source: hosted - version: "0.1.3+2" + version: "0.1.3+5" permission_handler_platform_interface: dependency: transitive description: @@ -945,10 +945,10 @@ packages: dependency: transitive description: name: sqflite_common - sha256: "4468b24876d673418a7b7147e5a08a715b4998a7ae69227acafaab762e0e5490" + sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" url: "https://pub.dev" source: hosted - version: "2.5.4+5" + version: "2.5.4+6" sqflite_darwin: dependency: transitive description: @@ -1145,10 +1145,10 @@ packages: dependency: transitive description: name: webview_flutter_android - sha256: "86c2d01c37c4578ee46560109cf2e18fb271f0d080a796f09188d0952352e057" + sha256: "285cedfd9441267f6cca8843458620b5fda1af75b04f5818d0441acda5d7df19" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.1.0" webview_flutter_platform_interface: dependency: transitive description: @@ -1161,10 +1161,10 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "3be297aa4ca78205abdd284cf55f168c35246c75b3079990ad8ba9d257681a30" + sha256: b7e92f129482460951d96ef9a46b49db34bd2e1621685de26e9eaafd9674e7eb url: "https://pub.dev" source: hosted - version: "3.16.2" + version: "3.16.3" win32: dependency: transitive description: