From 579bc948473a7c3832de55b853715cfff4ed82ef Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 16 Jul 2023 12:05:43 -0400 Subject: [PATCH] Attempt at more resilient XAPK installs (#682) --- lib/providers/apps_provider.dart | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index d6dc4be7..80e63127 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -341,20 +341,33 @@ class AppsProvider with ChangeNotifier { Future installXApkDir(DownloadedXApkDir dir, {bool silent = false}) async { + // We don't know which APKs in an XAPK are supported by the user's device + // So we try installing all of them and assume success if at least one installed + // If 0 APKs installed, throw the first install error encountered try { var somethingInstalled = false; + var firstError = null; for (var file in dir.extracted .listSync(recursive: true, followLinks: false) .whereType()) { if (file.path.toLowerCase().endsWith('.apk')) { - somethingInstalled = somethingInstalled || - await installApk(DownloadedApk(dir.appId, file), silent: silent); + try { + somethingInstalled = somethingInstalled || + await installApk(DownloadedApk(dir.appId, file), + silent: silent); + } catch (e) { + logs.add( + 'Could not install APK from XAPK \'${file.path}\': ${e.toString()}'); + firstError ??= e; + } } else if (file.path.toLowerCase().endsWith('.obb')) { await moveObbFile(file, dir.appId); } } if (somethingInstalled) { dir.file.delete(recursive: true); + } else if (firstError) { + throw firstError; } } finally { dir.extracted.delete(recursive: true);