diff --git a/README.md b/README.md index 762d485..9f82043 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ Obtainium allows you to install and update Apps directly from their releases pag Motivation: [Side Of Burritos - You should use this instead of F-Droid | How to use app RSS feed](https://youtu.be/FFz57zNR_M0) +Wiki: [https://github.com/ImranR98/Obtainium/wiki](https://github.com/ImranR98/Obtainium/wiki) + Currently supported App sources: - Open Source - General: - [GitHub](https://github.com/) diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml index eb5ee1b..df283b7 100644 --- a/android/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,8 +1,8 @@ + android:width="108dp" + android:height="108dp"> diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 3745373..d03e918 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Probajte izabrati preloženu (verziju) versionCode APK-a", "dontSortReleasesList": "Zadrži redosled izdanja iz API-a", "reverseSort": "Obrni redosled", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Meni za otkrivanje grešaka", "bgTaskStarted": "Rad u pozadini pokrenut - provjerite log-ove.", "runBgCheckNow": "Pokrenite pozadinsku provjeru ažuriranja sad", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Isključivo provjerite ažuriranje za instalirane i aplikacije 'samo za praćenje'", "supportFixedAPKURL": "Podržite fiksne APK URL-ove", "selectX": "Izaberite {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "Želite li ukloniti aplikaciju?", "other": "Želite li ukloniti aplikacije?" diff --git a/assets/translations/cs.json b/assets/translations/cs.json index d029e18..2e44a68 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Zkusit vybrat navrhovaný kód verze APK", "dontSortReleasesList": "Retain release order from API", "reverseSort": "Reverse sorting", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Only check installed and Track-Only apps for updates", "supportFixedAPKURL": "Support fixed APK URLs", "selectX": "Select {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "Odstranit Apku?", "other": "Odstranit Apky?" diff --git a/assets/translations/de.json b/assets/translations/de.json index 289e192..fae8d4d 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Versuchen, den vorgeschlagenen APK-Versionscode auszuwählen", "dontSortReleasesList": "Freigaberelease von der API ordern", "reverseSort": "Umgekehrtes Sortieren", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Debug-Menü", "bgTaskStarted": "Hintergrundaufgabe gestartet – Logs prüfen.", "runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Überprüfe nur installierte und mit „nur Nachverfolgen“ markierte Apps auf Aktualisierungen", "supportFixedAPKURL": "neuere Version anhand der ersten dreißig Zahlen der Checksumme der APK URL erraten, wenn anderweitig nicht unterstützt", "selectX": "Wähle {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "App entfernen?", "other": "Apps entfernen?" diff --git a/assets/translations/en.json b/assets/translations/en.json index 251c19e..defd488 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", "dontSortReleasesList": "Retain release order from API", "reverseSort": "Reverse sorting", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Only check installed and Track-Only apps for updates", "supportFixedAPKURL": "Support fixed APK URLs", "selectX": "Select {}", + "parallelDownloads": "Allow parallel downloads", "installMethod": "Installation method", "normal": "Normal", "shizuku": "Shizuku", diff --git a/assets/translations/es.json b/assets/translations/es.json index a99123b..f3a07c1 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Prueba seleccionando la versionCode APK sugerida", "dontSortReleasesList": "Mantener el order de publicación desde API", "reverseSort": "Orden inverso", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Menu Depurar", "bgTaskStarted": "Iniciada tarea en segundo plano - revisa los logs.", "runBgCheckNow": "Ejecutar verficiación de actualizaciones en segundo plano", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Only check installed and Track-Only apps for updates", "supportFixedAPKURL": "Soporte para URLs fijas de APK", "selectX": "Selecciona {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "¿Eliminar Aplicación?", "other": "¿Eliminar Aplicaciones?" diff --git a/assets/translations/fa.json b/assets/translations/fa.json index f9a31fe..9af4cf6 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -245,8 +245,8 @@ "enableBackgroundUpdates": "به روز رسانی پس زمینه را فعال کنید", "backgroundUpdateReqsExplanation": "به روز رسانی پس زمینه ممکن است برای همه برنامه ها امکان پذیر نباشد.", "backgroundUpdateLimitsExplanation": "موفقیت نصب پس‌زمینه تنها زمانی مشخص می‌شود که Obtainium باز شود.", - "verifyLatestTag": "برچسب "آخرین" را تأیید کنید", - "intermediateLinkRegex": "برای اولین بار بازدید از لینک "متوسط" را فیلتر کنید", + "verifyLatestTag": "برچسب \"آخرین\" را تأیید کنید", + "intermediateLinkRegex": "برای اولین بار بازدید از لینک \"متوسط\" را فیلتر کنید", "intermediateLinkNotFound": "لینک میانی پیدا نشد", "exemptFromBackgroundUpdates": "معاف از به‌روزرسانی‌های پس‌زمینه (در صورت فعال بودن)", "bgUpdatesOnWiFiOnly": "به‌روزرسانی‌های پس‌زمینه را در صورت عدم اتصال به WiFi غیرفعال کنید", @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "نسخه پیشنهادی APK نسخه کد را انتخاب کنید", "dontSortReleasesList": "حفظ سفارش انتشار از API", "reverseSort": "مرتب سازی معکوس", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "منوی اشکال زدایی", "bgTaskStarted": "کار پس زمینه شروع شد - لاگ های مربوط را بررسی کنید.", "runBgCheckNow": "اکنون به‌روزرسانی پس‌زمینه را بررسی کنید", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "فقط برنامه های نصب شده و فقط ردیابی را برای به روز رسانی بررسی کنید", "supportFixedAPKURL": "پشتیبانی از URL های APK ثابت", "selectX": "انتخاب کنید {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "برنامه حذف شود؟", "other": "برنامه ها حذف شوند؟" diff --git a/assets/translations/fr.json b/assets/translations/fr.json index a7000c1..6322972 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", "dontSortReleasesList": "Retain release order from API", "reverseSort": "Reverse sorting", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Only check installed and Track-Only apps for updates", "supportFixedAPKURL": "Support fixed APK URLs", "selectX": "Select {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "Supprimer l'application ?", "other": "Supprimer les applications ?" diff --git a/assets/translations/hu.json b/assets/translations/hu.json index ff1e0f2..8e23dd3 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -260,6 +260,8 @@ "trySelectingSuggestedVersionCode": "Próbálja ki a javasolt verziókódú APK-t", "dontSortReleasesList": "Az API-ból származó kiadási sorrend megőrzése", "reverseSort": "Fordított rendezés", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Hibakereső menü", "bgTaskStarted": "A háttérfeladat elindult – ellenőrizze a naplókat.", "enableBackgroundUpdates": "Frissítések a háttérben", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Csak a telepített és a csak követhető appokat ellenőrizze frissítésekért", "supportFixedAPKURL": "Támogatja a rögzített APK URL-eket", "selectX": "Kiválaszt {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "Eltávolítja az alkalmazást?", "other": "Eltávolítja az alkalmazást?" diff --git a/assets/translations/it.json b/assets/translations/it.json index 3afdec3..34a7ea2 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Prova a selezionare APK con versionCode suggerito", "dontSortReleasesList": "Conserva l'ordine di release da API", "reverseSort": "Ordine inverso", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Menu di debug", "bgTaskStarted": "Attività in secondo piano iniziata - controllo log.", "runBgCheckNow": "Inizia aggiornamento in secondo piano ora", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Cerca aggiornamenti solo per app installate e app in Solo-Monitoraggio", "supportFixedAPKURL": "Support fixed APK URLs", "selectX": "Select {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "Rimuovere l'app?", "other": "Rimuovere le app?" diff --git a/assets/translations/ja.json b/assets/translations/ja.json index 88cbcea..3fd43f0 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "提案されたバージョンコードのAPKを選択する", "dontSortReleasesList": "APIからのリリース順を保持する", "reverseSort": "逆順ソート", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "デバッグメニュー", "bgTaskStarted": "バックグラウンドタスクが開始されました - ログを確認してください。", "runBgCheckNow": "今すぐバックグラウンドでのアップデート確認を開始する", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "インストール済みのアプリと「追跡のみ」のアプリのアップデートのみを確認する", "supportFixedAPKURL": "Support fixed APK URLs", "selectX": "Select {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "アプリを削除しますか?", "other": "アプリを削除しますか?" diff --git a/assets/translations/nl.json b/assets/translations/nl.json index a365bfa..678d21d 100644 --- a/assets/translations/nl.json +++ b/assets/translations/nl.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Probeer de voorgestelde versiecode APK te selecteren", "dontSortReleasesList": "Volgorde van releases behouden vanuit de API", "reverseSort": "Sortering omkeren", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Debug menu", "bgTaskStarted": "Achtergrondtaak gestart - controleer de logs.", "runBgCheckNow": "Voer nu een achtergrondupdatecontrole uit", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Alleen geïnstalleerde en Track-Only apps controleren op updates", "supportFixedAPKURL": "Support fixed APK URLs", "selectX": "Select {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "App verwijderen?", "other": "Apps verwijderen?" diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 7c43fee..2c340e0 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Spróbuj wybierać sugerowany kod wersji APK", "dontSortReleasesList": "Utrzymaj kolejność wydań z interfejsu API", "reverseSort": "Odwrotne sortowanie", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Menu debugowania", "bgTaskStarted": "Uruchomiono zadanie w tle - sprawdź logi.", "runBgCheckNow": "Wymuś sprawdzenie aktualizacji w tle", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Sprawdzaj tylko zainstalowane i obserwowane aplikacje pod kątem aktualizacji", "supportFixedAPKURL": "Obsługuj stałe adresy URL APK", "selectX": "Wybierz {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", diff --git a/assets/translations/pt.json b/assets/translations/pt.json index fa89746..eed4690 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Tente selecionar a versão sugerida", "dontSortReleasesList": "Reter a ordem de lançamento da API", "reverseSort": "Ordenação reversa", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Menu Debug", "bgTaskStarted": "Tarefa em segundo plano iniciada - verifique os logs.", "runBgCheckNow": "Execute a verificação de atualização em segundo plano agora", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Only check installed and Track-Only apps for updates", "supportFixedAPKURL": "Support fixed APK URLs", "selectX": "Select {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "Remover App?", "other": "Remover Apps?" diff --git a/assets/translations/ru.json b/assets/translations/ru.json index c59a501..fee1a28 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Попробуйте выбрать предложенный код версии APK", "dontSortReleasesList": "Сохранить порядок релизов от API", "reverseSort": "Обратная сортировка", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Меню отладки", "bgTaskStarted": "Фоновая задача начата — проверьте журналы", "runBgCheckNow": "Запустить проверку фонового обновления сейчас", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Проверять обновления только у установленных или отслеживаемых приложений", "supportFixedAPKURL": "Поддержка фиксированных URL-адресов APK", "selectX": "Выбрать {}", + "parallelDownloads": "Разрешить параллельные загрузки", "installMethod": "Метод установки", "normal": "Нормальный", "shizuku": "Shizuku", diff --git a/assets/translations/sv.json b/assets/translations/sv.json index c4b0304..e0bf922 100644 --- a/assets/translations/sv.json +++ b/assets/translations/sv.json @@ -261,9 +261,12 @@ "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", "dontSortReleasesList": "Retain release order from API", "reverseSort": "Omvänd sortering", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Felsökningsmeny", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Kör Bakgrundsuppdateringskoll Nu", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "Ta Bort App?", "other": "Ta Bort Appar?" diff --git a/assets/translations/tr.json b/assets/translations/tr.json index d2c15f3..e78901a 100644 --- a/assets/translations/tr.json +++ b/assets/translations/tr.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Önerilen sürüm kodunu seçmeyi dene", "dontSortReleasesList": "API'den sıralama düzenini koru", "reverseSort": "Ters sıralama", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Hata Ayıklama Menüsü", "bgTaskStarted": "Arka plan görevi başladı - günlükleri kontrol et.", "runBgCheckNow": "Arka Plan Güncelleme Kontrolünü Şimdi Çalıştır", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Yalnızca yüklü ve Yalnızca İzleme Uygulamalarını güncelleme", "supportFixedAPKURL": "Support fixed APK URLs", "selectX": "Select {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "Uygulamayı Kaldır?", "other": "Uygulamaları Kaldır?" diff --git a/assets/translations/vi.json b/assets/translations/vi.json index e5cd308..a4201ce 100644 --- a/assets/translations/vi.json +++ b/assets/translations/vi.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "Thử chọn APK Mã phiên bản được đề xuất", "dontSortReleasesList": "Giữ lại thứ tự phát hành từ API", "reverseSort": "Sắp xếp ngược", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "Danh sách gỡ lỗi", "bgTaskStarted": "Tác vụ nền đã bắt đầu - kiểm tra nhật ký.", "runBgCheckNow": "Chạy kiểm tra cập nhật nền ngay bây giờ", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "Chỉ kiểm tra các ứng dụng đã cài đặt và Chỉ-Theo dõi để biết các bản cập nhật", "supportFixedAPKURL": "Support fixed APK URLs", "selectX": "Select {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion":{ "one": "Gỡ ứng dụng?", "other": "Gỡ ứng dụng?" diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 46682d3..c7e25cb 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -261,6 +261,8 @@ "trySelectingSuggestedVersionCode": "尝试选择推荐版本的 APK 文件", "dontSortReleasesList": "保持来自 API 的发行顺序", "reverseSort": "反转排序", + "takeFirstLink": "Take first link", + "skipSort": "Skip sorting", "debugMenu": "调试选项", "bgTaskStarted": "后台任务已启动 - 详见日志", "runBgCheckNow": "立即进行后台更新检查", @@ -278,6 +280,7 @@ "onlyCheckInstalledOrTrackOnlyApps": "只对已安装和“仅追踪”的应用进行更新检查", "supportFixedAPKURL": "Support fixed APK URLs", "selectX": "Select {}", + "parallelDownloads": "Allow parallel downloads", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" diff --git a/lib/app_sources/html.dart b/lib/app_sources/html.dart index 1d4e06f..81cb7ec 100644 --- a/lib/app_sources/html.dart +++ b/lib/app_sources/html.dart @@ -94,7 +94,8 @@ class HTML extends AppSource { GeneratedFormSwitch('sortByFileNamesNotLinks', label: tr('sortByFileNamesNotLinks')) ], - [GeneratedFormSwitch('reverseSort', label: tr('reverseSort'))], + [GeneratedFormSwitch('skipSort', label: tr('skipSort'))], + [GeneratedFormSwitch('reverseSort', label: tr('takeTopLink'))], [ GeneratedFormSwitch('supportFixedAPKURL', defaultValue: true, label: tr('supportFixedAPKURL')), @@ -185,12 +186,15 @@ class HTML extends AppSource { .toList(); } List links = []; + bool skipSort = additionalSettings['skipSort'] == true; if ((additionalSettings['intermediateLinkRegex'] as String?) ?.isNotEmpty == true) { var reg = RegExp(additionalSettings['intermediateLinkRegex']); links = allLinks.where((element) => reg.hasMatch(element)).toList(); - links.sort((a, b) => compareAlphaNumeric(a, b)); + if (!skipSort) { + links.sort((a, b) => compareAlphaNumeric(a, b)); + } if (links.isEmpty) { throw ObtainiumError(tr('intermediateLinkNotFound')); } @@ -211,10 +215,14 @@ class HTML extends AppSource { Uri.parse(element).path.toLowerCase().endsWith('.apk')) .toList(); } - links.sort((a, b) => additionalSettings['sortByFileNamesNotLinks'] == true - ? compareAlphaNumeric(a.split('/').where((e) => e.isNotEmpty).last, - b.split('/').where((e) => e.isNotEmpty).last) - : compareAlphaNumeric(a, b)); + if (!skipSort) { + links.sort((a, b) => + additionalSettings['sortByFileNamesNotLinks'] == true + ? compareAlphaNumeric( + a.split('/').where((e) => e.isNotEmpty).last, + b.split('/').where((e) => e.isNotEmpty).last) + : compareAlphaNumeric(a, b)); + } if (additionalSettings['reverseSort'] == true) { links = links.reversed.toList(); } diff --git a/lib/main.dart b/lib/main.dart index 620f4bd..ebba088 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart'; // ignore: implementation_imports import 'package:easy_localization/src/localization.dart'; -const String currentVersion = '0.14.38'; +const String currentVersion = '0.14.40'; const String currentReleaseTag = 'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index 6deda9e..25f8b72 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -496,14 +496,8 @@ class AppsPageState extends State { var transparent = Theme.of(context).colorScheme.background.withAlpha(0).value; List stops = [ - ...listedApps[index] - .app - .categories - .asMap() - .entries - .map((e) => - ((e.key / (listedApps[index].app.categories.length - 1)))) - , + ...listedApps[index].app.categories.asMap().entries.map( + (e) => ((e.key / (listedApps[index].app.categories.length - 1)))), 1 ]; if (stops.length == 2) { @@ -516,13 +510,9 @@ class AppsPageState extends State { begin: const Alignment(-1, 0), end: const Alignment(-0.97, 0), colors: [ - ...listedApps[index] - .app - .categories - .map((e) => - Color(settingsProvider.categories[e] ?? transparent) - .withAlpha(255)) - , + ...listedApps[index].app.categories.map((e) => + Color(settingsProvider.categories[e] ?? transparent) + .withAlpha(255)), Color(transparent) ])), child: ListTile( @@ -881,7 +871,7 @@ class AppsPageState extends State { onPressed: () { String urls = ''; for (var a in selectedApps) { - urls += '${a.url}\n'; + urls += 'obtainium://add/${a.url}\n'; } urls = urls.substring(0, urls.length - 1); Share.share(urls, @@ -981,10 +971,8 @@ class AppsPageState extends State { defaultValue: filter.sourceFilter, [ MapEntry('', tr('none')), - ...sourceProvider.sources - .map((e) => - MapEntry(e.runtimeType.toString(), e.name)) - + ...sourceProvider.sources.map( + (e) => MapEntry(e.runtimeType.toString(), e.name)) ]) ] ], diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 23f742b..e83ddf3 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -352,6 +352,19 @@ class _SettingsPageState extends State { ), height16, installMethodDropdown, + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible(child: Text(tr('parallelDownloads'))), + Switch( + value: settingsProvider.parallelDownloads, + onChanged: (value) { + settingsProvider.parallelDownloads = + value; + }) + ], + ), height32, Text( tr('sourceSpecific'), diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 6d06c82..2669a0a 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -666,7 +666,7 @@ class AppsProvider with ChangeNotifier { appsToInstall = moveStrToEnd(appsToInstall, obtainiumId, strB: obtainiumTempId); - for (var id in appsToInstall) { + Future updateFn(String id, {bool skipInstalls = false}) async { try { var downloadedArtifact = // ignore: use_build_context_synchronously @@ -705,24 +705,26 @@ class AppsProvider with ChangeNotifier { apps[id]?.downloadProgress = -1; notifyListeners(); try { - if (downloadedFile != null) { - if (willBeSilent && context == null) { - installApk(downloadedFile, needsBGWorkaround: true); + if (!skipInstalls) { + if (downloadedFile != null) { + if (willBeSilent && context == null) { + installApk(downloadedFile, needsBGWorkaround: true); + } else { + await installApk(downloadedFile); + } } else { - await installApk(downloadedFile); + if (willBeSilent && context == null) { + installXApkDir(downloadedDir!, needsBGWorkaround: true); + } else { + await installXApkDir(downloadedDir!); + } } - } else { if (willBeSilent && context == null) { - installXApkDir(downloadedDir!, needsBGWorkaround: true); - } else { - await installXApkDir(downloadedDir!); + notificationsProvider?.notify(SilentUpdateAttemptNotification( + [apps[appId]!.app], + id: appId.hashCode)); } } - if (willBeSilent && context == null) { - notificationsProvider?.notify(SilentUpdateAttemptNotification( - [apps[appId]!.app], - id: appId.hashCode)); - } } finally { apps[id]?.downloadProgress = null; notifyListeners(); @@ -733,6 +735,18 @@ class AppsProvider with ChangeNotifier { } } + if (!settingsProvider.parallelDownloads) { + for (var id in appsToInstall) { + await updateFn(id); + } + } else { + await Future.wait( + appsToInstall.map((id) => updateFn(id, skipInstalls: true))); + for (var id in appsToInstall) { + await updateFn(id); + } + } + if (errors.idsByErrorString.isNotEmpty) { throw errors; } @@ -749,12 +763,15 @@ class AppsProvider with ChangeNotifier { return appsDir; } - Future getInstalledInfo(String? packageName) async { + Future getInstalledInfo(String? packageName, + {bool printErr = true}) async { if (packageName != null) { try { return await pm.getPackageInfo(packageName: packageName); } catch (e) { - print(e); // OK + if (printErr) { + print(e); // OK + } } } return null; @@ -1262,9 +1279,8 @@ class AppsProvider with ChangeNotifier { await Future.delayed(const Duration(microseconds: 1)); } for (App a in importedApps) { - if (apps[a.id]?.app.installedVersion != null) { - a.installedVersion = apps[a.id]?.app.installedVersion; - } + a.installedVersion = + (await getInstalledInfo(a.id, printErr: false))?.versionName; } await saveApps(importedApps, onlyIfExists: false); notifyListeners(); diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index cdc3b46..266f244 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -437,4 +437,13 @@ class SettingsProvider with ChangeNotifier { prefs?.setBool('exportSettings', val); notifyListeners(); } + + bool get parallelDownloads { + return prefs?.getBool('parallelDownloads') ?? false; + } + + set parallelDownloads(bool val) { + prefs?.setBool('parallelDownloads', val); + notifyListeners(); + } } diff --git a/pubspec.lock b/pubspec.lock index a84bba6..6bc1ea8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -206,10 +206,10 @@ packages: dependency: "direct main" description: name: dynamic_color - sha256: "8b8bd1d798bd393e11eddeaa8ae95b12ff028bf7d5998fc5d003488cd5f4ce2f" + sha256: a866f1f8947bfdaf674d7928e769eac7230388a2e7a2542824fad4bb5b87be3b url: "https://pub.dev" source: hosted - version: "1.6.8" + version: "1.6.9" easy_localization: dependency: "direct main" description: @@ -267,10 +267,10 @@ packages: dependency: "direct main" description: name: flutter_archive - sha256: aec85d1da65e5b33a529db00a86df0b8e92bda78088a7cfaeeba5187701d0d85 + sha256: "004132780d382df5171589ab793e2efc9c3eef570fe72d78b4ccfbfbe52762ae" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.0.0" flutter_fgbg: dependency: "direct main" description: @@ -919,26 +919,26 @@ packages: dependency: transitive description: name: webview_flutter_android - sha256: e313dcdf45d4c95bcb8960351ef2389b7f0687b90bc92483f7f7983ae5758456 + sha256: b54c89fe14a6d26a2a46e24880da0441cdd2bf1f6d01a5b3e1d39558feb1de0b url: "https://pub.dev" source: hosted - version: "3.13.0" + version: "3.13.1" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - sha256: "68e86162aa8fc646ae859e1585995c096c95fc2476881fa0c4a8d10f56013a5a" + sha256: dbe745ee459a16b6fec296f7565a8ef430d0d681001d8ae521898b9361854943 url: "https://pub.dev" source: hosted - version: "2.8.0" + version: "2.9.0" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: accdaaa49a2aca2dc3c3230907988954cdd23fed0a19525d6c9789d380f4dc76 + sha256: eebfabfa8a115b535b52031b8b26f7a4b58ceceab378bc9db8762b0fb46f7b5d url: "https://pub.dev" source: hosted - version: "3.9.4" + version: "3.10.0" win32: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f4b095a..d47a549 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: 0.14.38+232 # When changing this, update the tag in main() accordingly +version: 0.14.40+234 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0' @@ -62,7 +62,7 @@ dependencies: easy_localization: ^3.0.1 android_intent_plus: ^4.0.0 flutter_markdown: ^0.6.14 - flutter_archive: ^5.0.0 + flutter_archive: ^6.0.0 hsluv: ^1.1.3 connectivity_plus: ^5.0.0 shared_storage: ^0.8.0