From 8922b1c048518878ce174d8e50feae969b051caa Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 23 Nov 2024 15:26:58 -0500 Subject: [PATCH 1/5] Custom user-agent for APKMirror (as per feedback in #1973) --- lib/app_sources/apkmirror.dart | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/app_sources/apkmirror.dart b/lib/app_sources/apkmirror.dart index 1b3a67b9..c9b11335 100644 --- a/lib/app_sources/apkmirror.dart +++ b/lib/app_sources/apkmirror.dart @@ -5,6 +5,8 @@ import 'package:html/parser.dart'; import 'package:http/http.dart'; import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/custom_errors.dart'; +import 'package:obtainium/providers/apps_provider.dart'; +import 'package:obtainium/providers/settings_provider.dart'; import 'package:obtainium/providers/source_provider.dart'; class APKMirror extends AppSource { @@ -31,6 +33,16 @@ class APKMirror extends AppSource { ]; } + @override + Future?> getRequestHeaders( + Map additionalSettings, + {bool forAPKDownload = false}) async { + return { + "User-Agent": + "Obtainium/${(await getInstalledInfo(obtainiumId))?.versionName ?? '1.0.0'}" + }; + } + @override String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { RegExp standardUrlRegEx = RegExp( From e82170fec64284edd08c8d4604785c792a5d4299 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 23 Nov 2024 16:05:02 -0500 Subject: [PATCH 2/5] 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: From 327f73cc9e8f0eb6d6056074bad7edbd321e9b61 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 23 Nov 2024 16:26:11 -0500 Subject: [PATCH 3/5] More changes for XAPK support (#682) --- lib/providers/apps_provider.dart | 43 ++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index f0f4817e..4871ebe5 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -516,11 +516,29 @@ class AppsProvider with ChangeNotifier { .listSync() .where((e) => e.path.toLowerCase().endsWith('.apk')) .toList(); + + FileSystemEntity? temp; + apks.removeWhere((element) { + bool res = element.uri.pathSegments.last.startsWith(app.id); + if (res) { + temp = element; + } + return res; + }); + if (temp != null) { + apks = [ + temp!, + ...apks, + ]; + } + for (var i = 0; i < apks.length; i++) { try { - newInfo = await pm.getPackageArchiveInfo( - archiveFilePath: apks.first.path); - break; + newInfo = + await pm.getPackageArchiveInfo(archiveFilePath: apks[i].path); + if (newInfo != null) { + break; + } } catch (e) { if (i == apks.length - 1) { rethrow; @@ -654,13 +672,22 @@ class AppsProvider with ChangeNotifier { await moveObbFile(file, dir.appId); } } - APKFiles.sort((a, b) { - if (a.uri.pathSegments.last.startsWith(dir.appId)) { - return -1; - } else { - return 0; + + File? temp; + APKFiles.removeWhere((element) { + bool res = element.uri.pathSegments.last.startsWith(dir.appId); + if (res) { + temp = element; } + return res; }); + if (temp != null) { + APKFiles = [ + temp!, + ...APKFiles, + ]; + } + try { await installApk( DownloadedApk(dir.appId, APKFiles[0]), firstTimeWithContext, From 4af4160aaadfc78c110ca1b87edf1c3573a73a82 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 23 Nov 2024 16:27:11 -0500 Subject: [PATCH 4/5] Increment version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 01fae0c2..90a8b4cd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.1.31+2288 +version: 1.1.32+2289 environment: sdk: '>=3.0.0 <4.0.0' From 5b79f399d1c7d1746a6cd2a7014f26f5407a3787 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 23 Nov 2024 16:29:10 -0500 Subject: [PATCH 5/5] Minor change to German translation (#1986) --- assets/translations/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/translations/de.json b/assets/translations/de.json index 45a427ca..7369804d 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -114,7 +114,7 @@ "light": "Hell", "followSystem": "System folgen", "followSystemThemeExplanation": "Das Folgen des Systemthemes ist unter Android < 10 nur mit Hilfe von Drittanbieterapps möglich", - "useBlackTheme": "Pure Black Dark Theme verwenden", + "useBlackTheme": "Rein schwarzen Hintergrund verwenden", "appSortBy": "App sortieren nach", "authorName": "Autor/Name", "nameAuthor": "Name/Autor",