Attempt at more resilient XAPK installs (#682)

This commit is contained in:
Imran Remtulla
2023-07-16 12:05:43 -04:00
parent 53dba06cc3
commit 579bc94847

View File

@@ -341,20 +341,33 @@ class AppsProvider with ChangeNotifier {
Future<void> installXApkDir(DownloadedXApkDir dir, Future<void> installXApkDir(DownloadedXApkDir dir,
{bool silent = false}) async { {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 { try {
var somethingInstalled = false; var somethingInstalled = false;
var firstError = null;
for (var file in dir.extracted for (var file in dir.extracted
.listSync(recursive: true, followLinks: false) .listSync(recursive: true, followLinks: false)
.whereType<File>()) { .whereType<File>()) {
if (file.path.toLowerCase().endsWith('.apk')) { if (file.path.toLowerCase().endsWith('.apk')) {
somethingInstalled = somethingInstalled || try {
await installApk(DownloadedApk(dir.appId, file), silent: silent); 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')) { } else if (file.path.toLowerCase().endsWith('.obb')) {
await moveObbFile(file, dir.appId); await moveObbFile(file, dir.appId);
} }
} }
if (somethingInstalled) { if (somethingInstalled) {
dir.file.delete(recursive: true); dir.file.delete(recursive: true);
} else if (firstError) {
throw firstError;
} }
} finally { } finally {
dir.extracted.delete(recursive: true); dir.extracted.delete(recursive: true);