mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-31 05:23:28 +01:00 
			
		
		
		
	Compare commits
	
		
			30 Commits
		
	
	
		
			v0.14.13-b
			...
			v0.14.16-b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 734a548bc3 | ||
|  | 591973d97f | ||
|  | a2f57ecd66 | ||
|  | 13dcfb479d | ||
|  | 3328d80130 | ||
|  | f9df3ac0e2 | ||
|  | 61d66e80d8 | ||
|  | 93e0360116 | ||
|  | 2cec5f7934 | ||
|  | 8d4a09b007 | ||
|  | 6d8d2fa99d | ||
|  | 59ecd55530 | ||
|  | 77fcc89e37 | ||
|  | 7d63da4d9c | ||
|  | 8eea0bae99 | ||
|  | f5dcd8f776 | ||
|  | e1f2baeeda | ||
|  | 84d8ff8b0b | ||
|  | 9862c22fdb | ||
|  | 8c82f53dd2 | ||
|  | 5cf4c21ce3 | ||
|  | 4951f62d4a | ||
|  | 4c0c4b7010 | ||
|  | 96051e614c | ||
|  | a2e494b2ba | ||
|  | 2d5a9bec84 | ||
|  | 7d9571cfdd | ||
|  | acc6a780fa | ||
|  | 0e36d42a06 | ||
|  | 5cfddd807a | 
| @@ -256,6 +256,8 @@ | ||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|     "pickExportDir": "Pick Export Directory", | ||||
|     "autoExportOnChanges": "Auto-export on changes", | ||||
|     "filterVersionsByRegEx": "Filter Versions by Regular Expression", | ||||
|     "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Remover App?", | ||||
|         "other": "Remover Apps?" | ||||
|   | ||||
| @@ -253,6 +253,8 @@ | ||||
|    "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|    "pickExportDir": "Pick Export Directory", | ||||
|    "autoExportOnChanges": "Auto-export on changes", | ||||
|    "filterVersionsByRegEx": "Filter Versions by Regular Expression", | ||||
|    "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", | ||||
|      "removeAppQuestion": { | ||||
|       "one": "Želite li ukloniti aplikaciju?", | ||||
|       "other": "Želite li ukloniti aplikacije?" | ||||
|   | ||||
| @@ -28,8 +28,8 @@ | ||||
|     "xIsTrackOnly": "{} ist nur zur Nachverfolgung", | ||||
|     "source": "Quelle", | ||||
|     "app": "App", | ||||
|     "appsFromSourceAreTrackOnly": "Apps aus dieser Quelle sind 'Nur Nachverfolgen'.", | ||||
|     "youPickedTrackOnly": "Sie haben die Option 'Nur Nachverfolgen' gewählt.", | ||||
|     "appsFromSourceAreTrackOnly": "Apps aus dieser Quelle sind nur zum Nachverfolgen.", | ||||
|     "youPickedTrackOnly": "Sie haben die Option „Nur Nachverfolgen“ gewählt.", | ||||
|     "trackOnlyAppDescription": "Die App wird auf Updates überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.", | ||||
|     "cancelled": "Abgebrochen", | ||||
|     "appAlreadyAdded": "App bereits hinzugefügt", | ||||
| @@ -38,7 +38,7 @@ | ||||
|     "appSourceURL": "Quell-URL der App", | ||||
|     "error": "Fehler", | ||||
|     "add": "Hinzufügen", | ||||
|     "searchSomeSourcesLabel": "Suche (nur bestimmte Quellen)", | ||||
|     "searchSomeSourcesLabel": "Suche (nur für bestimmte Quellen)", | ||||
|     "search": "Suchen", | ||||
|     "additionalOptsFor": "Zusatzoptionen für {}", | ||||
|     "supportedSources": "Unterstützte Quellen", | ||||
| @@ -70,7 +70,7 @@ | ||||
|     "yes": "Ja", | ||||
|     "markSelectedAppsUpdated": "Markiere ausgewählte Apps als aktuell", | ||||
|     "pinToTop": "Oben anheften", | ||||
|     "unpinFromTop": "'Oben anheften' aufheben", | ||||
|     "unpinFromTop": "„Oben anheften“ aufheben", | ||||
|     "resetInstallStatusForSelectedAppsQuestion": "Installationsstatus für ausgewählte Apps zurücksetzen?", | ||||
|     "installStatusOfXWillBeResetExplanation": "Der Installationsstatus der ausgewählten Apps wird zurückgesetzt. Dies kann hilfreich sein, wenn die in Obtainium angezeigte App-Version aufgrund fehlgeschlagener Aktualisierungen oder anderer Probleme falsch ist.", | ||||
|     "shareSelectedAppURLs": "Ausgewählte App-URLs teilen", | ||||
| @@ -175,7 +175,7 @@ | ||||
|     "appId": "App ID", | ||||
|     "appWithIdOrNameNotFound": "Es wurde keine App mit dieser ID oder diesem Namen gefunden", | ||||
|     "reposHaveMultipleApps": "Repos können mehrere Apps enthalten", | ||||
|     "fdroidThirdPartyRepo": "F-Droid Third-Party Repo", | ||||
|     "fdroidThirdPartyRepo": "F-Droid Drittparteienrepo", | ||||
|     "steam": "Steam", | ||||
|     "steamMobile": "Steam Mobile", | ||||
|     "steamChat": "Steam Chat", | ||||
| @@ -244,15 +244,17 @@ | ||||
|     "xWasPossiblyUpdatedToY": "{} wurde möglicherweise aktualisiert auf {}.", | ||||
|     "backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist möglicherweise nicht für alle Apps möglich.", | ||||
|     "backgroundUpdateLimitsExplanation": "Der Erfolg einer Hintergrundinstallation kann nur festgestellt werden, wenn Obtainium geöffnet wird.", | ||||
|     "verifyLatestTag": "Überprüfe das 'latest' Tag", | ||||
|     "verifyLatestTag": "Überprüfe das „latest“ Tag", | ||||
|     "exemptFromBackgroundUpdates": "Ausschluss von Hintergrundaktualisierungen (falls aktiviert)", | ||||
|     "bgUpdatesOnWiFiOnly": "Hintergrundaktualisierungen deaktivieren, wenn kein WLAN vorhanden ist", | ||||
|     "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", | ||||
|     "versionExtractionRegEx": "Version Extraction RegEx", | ||||
|     "matchGroupToUse": "Match Group to Use", | ||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|     "pickExportDir": "Pick Export Directory", | ||||
|     "autoExportOnChanges": "Auto-export on changes", | ||||
|     "autoSelectHighestVersionCode": "Automatisch höchste APK-Code-Version auswählen", | ||||
|     "versionExtractionRegEx": "Versions-Extraktion RegEx", | ||||
|     "matchGroupToUse": "Zu verwendende Gruppe abgleichen", | ||||
|     "highlightTouchTargets": "Weniger offensichtliche Ziele hervorheben", | ||||
|     "pickExportDir": "Export-Verzeichnis wählen", | ||||
|     "autoExportOnChanges": "Automatischer Export bei Änderung", | ||||
|     "filterVersionsByRegEx": "Versionen nach regulären Ausdrücken filtern", | ||||
|     "trySelectingSuggestedVersionCode": "Versuchen, die vorgeschlagene APK-Code-Version auszuwählen", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "App entfernen?", | ||||
|         "other": "Apps entfernen?" | ||||
|   | ||||
| @@ -256,6 +256,8 @@ | ||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|     "pickExportDir": "Pick Export Directory", | ||||
|     "autoExportOnChanges": "Auto-export on changes", | ||||
|     "filterVersionsByRegEx": "Filter Versions by Regular Expression", | ||||
|     "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Remove App?", | ||||
|         "other": "Remove Apps?" | ||||
|   | ||||
| @@ -253,6 +253,8 @@ | ||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|     "pickExportDir": "Pick Export Directory", | ||||
|     "autoExportOnChanges": "Auto-export on changes", | ||||
|     "filterVersionsByRegEx": "Filter Versions by Regular Expression", | ||||
|     "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "¿Eliminar Aplicación?", | ||||
|         "other": "¿Eliminar Aplicaciones?" | ||||
|   | ||||
| @@ -253,6 +253,8 @@ | ||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|     "pickExportDir": "Pick Export Directory", | ||||
|     "autoExportOnChanges": "Auto-export on changes", | ||||
|     "filterVersionsByRegEx": "Filter Versions by Regular Expression", | ||||
|     "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "برنامه حذف شود؟", | ||||
|         "other": "برنامه ها حذف شوند؟" | ||||
|   | ||||
| @@ -253,6 +253,8 @@ | ||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|     "pickExportDir": "Pick Export Directory", | ||||
|     "autoExportOnChanges": "Auto-export on changes", | ||||
|     "filterVersionsByRegEx": "Filter Versions by Regular Expression", | ||||
|     "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Supprimer l'application ?", | ||||
|         "other": "Supprimer les applications ?" | ||||
|   | ||||
| @@ -246,12 +246,14 @@ | ||||
|     "verifyLatestTag": "Ellenőrizze a „legújabb” címkét", | ||||
|     "exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)", | ||||
|     "bgUpdatesOnWiFiOnly": "Tiltsa le a háttérben frissítéseket, ha nincs Wi-Fi-n", | ||||
|     "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", | ||||
|     "versionExtractionRegEx": "Version Extraction RegEx", | ||||
|     "matchGroupToUse": "Match Group to Use", | ||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|     "pickExportDir": "Pick Export Directory", | ||||
|     "autoExportOnChanges": "Auto-export on changes", | ||||
|     "autoSelectHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása", | ||||
|     "versionExtractionRegEx": "Verzió kibontása reguláris kifejezéssel", | ||||
|     "matchGroupToUse": "Párosítsa a csoportot a használathoz", | ||||
|     "highlightTouchTargets": "Emelje ki a kevésbé nyilvánvaló érintési célokat", | ||||
|     "pickExportDir": "Válassza az Exportálási könyvtárat", | ||||
|     "autoExportOnChanges": "Auto-exportálás a változások után", | ||||
|     "filterVersionsByRegEx": "Verziók szűrése reguláris kifejezéssel", | ||||
|     "trySelectingSuggestedVersionCode": "Próbálja ki a javasolt verziókódú APK-t", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Eltávolítja az alkalmazást?", | ||||
|         "other": "Eltávolítja az alkalmazást?" | ||||
|   | ||||
| @@ -253,6 +253,8 @@ | ||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|     "pickExportDir": "Pick Export Directory", | ||||
|     "autoExportOnChanges": "Auto-export on changes", | ||||
|     "filterVersionsByRegEx": "Filter Versions by Regular Expression", | ||||
|     "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Rimuovere l'app?", | ||||
|         "other": "Rimuovere le app?" | ||||
|   | ||||
| @@ -144,7 +144,7 @@ | ||||
|     "updatesAvailable": "アップデートが利用可能", | ||||
|     "updatesAvailableNotifDescription": "Obtainiumが追跡している1つまたは複数のアプリのアップデートが利用可能であることをユーザーに通知する", | ||||
|     "noNewUpdates": "新しいアップデートはありません", | ||||
|     "xHasAnUpdate": "{} のアップデートが利用可能です", | ||||
|     "xHasAnUpdate": "{} のアップデートが利用可能です。", | ||||
|     "appsUpdated": "アプリをアップデートしました", | ||||
|     "appsUpdatedNotifDescription": "1つまたは複数のAppのアップデートがバックグラウンドで適用されたことをユーザーに通知する", | ||||
|     "xWasUpdatedToY": "{} が {} にアップデートされました", | ||||
| @@ -241,19 +241,23 @@ | ||||
|     "customLinkFilterRegex": "正規表現によるカスタムリンクフィルター (デフォルト '.apk$')", | ||||
|     "appsPossiblyUpdated": "アプリのアップデートを試行", | ||||
|     "appsPossiblyUpdatedNotifDescription": "1つまたは複数のアプリのアップデートがバックグラウンドで適用された可能性があることをユーザーに通知する", | ||||
|     "xWasPossiblyUpdatedToY": "{} が {} にアップデートされた可能性があります", | ||||
|     "xWasPossiblyUpdatedToY": "{} が {} にアップデートされた可能性があります。", | ||||
|     "enableBackgroundUpdates": "バックグラウンドアップデートを有効化する", | ||||
|     "backgroundUpdateReqsExplanation": "バックグラウンドアップデートは、すべてのアプリで可能とは限りません。", | ||||
|     "backgroundUpdateLimitsExplanation": "バックグラウンドアップデートが成功したかどうかは、Obtainiumを起動したときにしか判断できません。", | ||||
|     "verifyLatestTag": "'latest'タグを確認する", | ||||
|     "intermediateLinkRegex": "最初にアクセスする「中間」リンクをフィルタリングする", | ||||
|     "intermediateLinkNotFound": "中間リンクが見つかりませんでした", | ||||
|     "exemptFromBackgroundUpdates": "バックグラウンドアップデートを行わない (有効な場合)", | ||||
|     "bgUpdatesOnWiFiOnly": "WiFiを使用していない場合,バックグラウンドアップデートを無効にする", | ||||
|     "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", | ||||
|     "versionExtractionRegEx": "Version Extraction RegEx", | ||||
|     "matchGroupToUse": "Match Group to Use", | ||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|     "pickExportDir": "Pick Export Directory", | ||||
|     "autoExportOnChanges": "Auto-export on changes", | ||||
|     "autoSelectHighestVersionCode": "最も高いバージョンコードのAPKを自動で選択する", | ||||
|     "versionExtractionRegEx": "バージョン抽出の正規表現", | ||||
|     "matchGroupToUse": "使用するマッチしたグループ", | ||||
|     "highlightTouchTargets": "目立たないタップ可能な対象をハイライトする", | ||||
|     "pickExportDir": "エクスポートディレクトリを選択", | ||||
|     "autoExportOnChanges": "変更があった際に自動でエクスポートする", | ||||
|     "filterVersionsByRegEx": "正規表現でバージョンをフィルタリングする", | ||||
|     "trySelectingSuggestedVersionCode": "提案されたバージョンコードのAPKを選択する", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "アプリを削除しますか?", | ||||
|         "other": "アプリを削除しますか?" | ||||
| @@ -295,15 +299,15 @@ | ||||
|         "other": "{n} 個のログをクリアしました (前 = {before}, 後 = {after})" | ||||
|     }, | ||||
|     "xAndNMoreUpdatesAvailable": { | ||||
|         "one": "{} とさらに {} 個のアプリのアップデートが利用可能です", | ||||
|         "other": "{} とさらに {} 個のアプリのアップデートが利用可能です" | ||||
|         "one": "{} とさらに {} 個のアプリのアップデートが利用可能です。", | ||||
|         "other": "{} とさらに {} 個のアプリのアップデートが利用可能です。" | ||||
|     }, | ||||
|     "xAndNMoreUpdatesInstalled": { | ||||
|         "one": "{} とさらに {} 個のアプリがアップデートされました", | ||||
|         "other": "{} とさらに {} 個のアプリがアップデートされました" | ||||
|         "one": "{} とさらに {} 個のアプリがアップデートされました。", | ||||
|         "other": "{} とさらに {} 個のアプリがアップデートされました。" | ||||
|     }, | ||||
|     "xAndNMoreUpdatesPossiblyInstalled": { | ||||
|         "one": "{} とさらに 1 個のアプリがアップデートされた可能性があります", | ||||
|         "other": "{} とさらに {} 個のアプリがアップデートされた可能性があります" | ||||
|         "one": "{} とさらに 1 個のアプリがアップデートされた可能性があります。", | ||||
|         "other": "{} とさらに {} 個のアプリがアップデートされた可能性があります。" | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -253,12 +253,14 @@ | ||||
|     "verifyLatestTag": "Zweryfikuj najnowszy tag", | ||||
|     "exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)", | ||||
|     "bgUpdatesOnWiFiOnly": "Wyłącz aktualizacje w tle, gdy nie ma połączenia z Wi-Fi", | ||||
|     "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", | ||||
|     "versionExtractionRegEx": "Version Extraction RegEx", | ||||
|     "matchGroupToUse": "Match Group to Use", | ||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|     "pickExportDir": "Pick Export Directory", | ||||
|     "autoExportOnChanges": "Auto-export on changes", | ||||
|     "autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK", | ||||
|     "versionExtractionRegEx": "Wyrażenie regularne wyodrębniające wersję", | ||||
|     "matchGroupToUse": "Dopasuj grupę do użycia", | ||||
|     "highlightTouchTargets": "Wyróżnij mniej oczywiste elementy dotykowe", | ||||
|     "pickExportDir": "Wybierz katalog eksportu", | ||||
|     "autoExportOnChanges": "Automatyczny eksport po wprowadzeniu zmian", | ||||
|     "filterVersionsByRegEx": "Filtruj wersje według wyrażenia regularnego", | ||||
|     "trySelectingSuggestedVersionCode": "Spróbuj wybierać sugerowany kod wersji APK", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Usunąć aplikację?", | ||||
|         "few": "Usunąć aplikacje?", | ||||
|   | ||||
| @@ -253,6 +253,8 @@ | ||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|     "pickExportDir": "Pick Export Directory", | ||||
|     "autoExportOnChanges": "Auto-export on changes", | ||||
|     "filterVersionsByRegEx": "Filter Versions by Regular Expression", | ||||
|     "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Удалить приложение?", | ||||
|         "other": "Удалить приложения?" | ||||
|   | ||||
| @@ -254,6 +254,8 @@ | ||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||
|     "pickExportDir": "Pick Export Directory", | ||||
|     "autoExportOnChanges": "Auto-export on changes", | ||||
|     "filterVersionsByRegEx": "Filter Versions by Regular Expression", | ||||
|     "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "是否删除应用?", | ||||
|         "other": "是否删除应用?" | ||||
|   | ||||
| @@ -13,10 +13,24 @@ class FDroid extends AppSource { | ||||
|     name = tr('fdroid'); | ||||
|     canSearch = true; | ||||
|     additionalSourceAppSpecificSettingFormItems = [ | ||||
|       [ | ||||
|         GeneratedFormTextField('filterVersionsByRegEx', | ||||
|             label: tr('filterVersionsByRegEx'), | ||||
|             required: false, | ||||
|             additionalValidators: [ | ||||
|               (value) { | ||||
|                 return regExValidator(value); | ||||
|               } | ||||
|             ]) | ||||
|       ], | ||||
|       [ | ||||
|         GeneratedFormSwitch('trySelectingSuggestedVersionCode', | ||||
|             label: tr('trySelectingSuggestedVersionCode'), defaultValue: true) | ||||
|       ], | ||||
|       [ | ||||
|         GeneratedFormSwitch('autoSelectHighestVersionCode', | ||||
|             label: tr('autoSelectHighestVersionCode')) | ||||
|       ] | ||||
|       ], | ||||
|     ]; | ||||
|   } | ||||
|  | ||||
| @@ -45,25 +59,73 @@ class FDroid extends AppSource { | ||||
|  | ||||
|   APKDetails getAPKUrlsFromFDroidPackagesAPIResponse( | ||||
|       Response res, String apkUrlPrefix, String standardUrl, | ||||
|       {bool autoSelectHighestVersionCode = false}) { | ||||
|       {bool autoSelectHighestVersionCode = false, | ||||
|       bool trySelectingSuggestedVersionCode = false, | ||||
|       String? filterVersionsByRegEx}) { | ||||
|     if (res.statusCode == 200) { | ||||
|       List<dynamic> releases = jsonDecode(res.body)['packages'] ?? []; | ||||
|       var response = jsonDecode(res.body); | ||||
|       List<dynamic> releases = response['packages'] ?? []; | ||||
|       if (releases.isEmpty) { | ||||
|         throw NoReleasesError(); | ||||
|       } | ||||
|       String? latestVersion = releases[0]['versionName']; | ||||
|       if (latestVersion == null) { | ||||
|       String? version; | ||||
|       Iterable<dynamic> releaseChoices = []; | ||||
|       // Grab the versionCode suggested if the user chose to do that | ||||
|       // Only do so at this stage if the user has no release filter | ||||
|       if (trySelectingSuggestedVersionCode && | ||||
|           response['suggestedVersionCode'] != null && | ||||
|           filterVersionsByRegEx == null) { | ||||
|         var suggestedReleases = releases.where((element) => | ||||
|             element['versionCode'] == response['suggestedVersionCode']); | ||||
|         if (suggestedReleases.isNotEmpty) { | ||||
|           releaseChoices = suggestedReleases; | ||||
|           version = suggestedReleases.first['versionName']; | ||||
|         } | ||||
|       } | ||||
|       // Apply the release filter if any | ||||
|       if (filterVersionsByRegEx != null) { | ||||
|         version = null; | ||||
|         releaseChoices = []; | ||||
|         for (var i = 0; i < releases.length; i++) { | ||||
|           if (RegExp(filterVersionsByRegEx) | ||||
|               .hasMatch(releases[i]['versionName'])) { | ||||
|             version = releases[i]['versionName']; | ||||
|           } | ||||
|         } | ||||
|         if (version == null) { | ||||
|           throw NoVersionError(); | ||||
|         } | ||||
|       } | ||||
|       // Default to the highest version | ||||
|       version ??= releases[0]['versionName']; | ||||
|       if (version == null) { | ||||
|         throw NoVersionError(); | ||||
|       } | ||||
|       Iterable<dynamic> latestReleases = | ||||
|           releases.where((element) => element['versionName'] == latestVersion); | ||||
|       if (latestReleases.length > 1 && autoSelectHighestVersionCode) { | ||||
|         latestReleases = [latestReleases.first]; | ||||
|       // If a suggested release was not already picked, pick all those with the selected version | ||||
|       if (releaseChoices.isEmpty) { | ||||
|         releaseChoices = | ||||
|             releases.where((element) => element['versionName'] == version); | ||||
|       } | ||||
|       List<String> apkUrls = latestReleases | ||||
|       // For the remaining releases, use the toggles to auto-select one if possible | ||||
|       if (releaseChoices.length > 1) { | ||||
|         if (autoSelectHighestVersionCode) { | ||||
|           releaseChoices = [releaseChoices.first]; | ||||
|         } else if (trySelectingSuggestedVersionCode && | ||||
|             response['suggestedVersionCode'] != null) { | ||||
|           var suggestedReleases = releaseChoices.where((element) => | ||||
|               element['versionCode'] == response['suggestedVersionCode']); | ||||
|           if (suggestedReleases.isNotEmpty) { | ||||
|             releaseChoices = suggestedReleases; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       if (releaseChoices.isEmpty) { | ||||
|         throw NoReleasesError(); | ||||
|       } | ||||
|       List<String> apkUrls = releaseChoices | ||||
|           .map((e) => '${apkUrlPrefix}_${e['versionCode']}.apk') | ||||
|           .toList(); | ||||
|       return APKDetails(latestVersion, getApkUrlsFromUrls(apkUrls), | ||||
|       return APKDetails(version, getApkUrlsFromUrls(apkUrls), | ||||
|           AppNames(name, Uri.parse(standardUrl).pathSegments.last)); | ||||
|     } else { | ||||
|       throw getObtainiumHttpError(res); | ||||
| @@ -82,7 +144,15 @@ class FDroid extends AppSource { | ||||
|         'https://$host/repo/$appId', | ||||
|         standardUrl, | ||||
|         autoSelectHighestVersionCode: | ||||
|             additionalSettings['autoSelectHighestVersionCode'] == true); | ||||
|             additionalSettings['autoSelectHighestVersionCode'] == true, | ||||
|         trySelectingSuggestedVersionCode: | ||||
|             additionalSettings['trySelectingSuggestedVersionCode'] == true, | ||||
|         filterVersionsByRegEx: | ||||
|             (additionalSettings['filterVersionsByRegEx'] as String?) | ||||
|                         ?.isNotEmpty == | ||||
|                     true | ||||
|                 ? additionalSettings['filterVersionsByRegEx'] | ||||
|                 : null); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   | ||||
| @@ -40,6 +40,9 @@ class IzzyOnDroid extends AppSource { | ||||
|         'https://android.izzysoft.de/frepo/$appId', | ||||
|         standardUrl, | ||||
|         autoSelectHighestVersionCode: | ||||
|             additionalSettings['autoSelectHighestVersionCode'] == true); | ||||
|             additionalSettings['autoSelectHighestVersionCode'] == true, | ||||
|         trySelectingSuggestedVersionCode: | ||||
|             additionalSettings['trySelectingSuggestedVersionCode'] == true, | ||||
|         filterVersionsByRegEx: additionalSettings['filterVersionsByRegEx']); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -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.13'; | ||||
| const String currentVersion = '0.14.16'; | ||||
| const String currentReleaseTag = | ||||
|     'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES | ||||
|  | ||||
|   | ||||
| @@ -148,7 +148,7 @@ class _AddAppPageState extends State<AddAppPage> { | ||||
|                 userPickedTrackOnly))) { | ||||
|           var trackOnly = pickedSource!.enforceTrackOnly || userPickedTrackOnly; | ||||
|           app = await sourceProvider.getApp( | ||||
|               pickedSource!, userInput, additionalSettings, | ||||
|               pickedSource!, userInput.trim(), additionalSettings, | ||||
|               trackOnlyOverride: trackOnly, | ||||
|               overrideSource: pickedSourceOverride, | ||||
|               inferAppIdIfOptional: inferAppIdIfOptional); | ||||
|   | ||||
| @@ -152,7 +152,7 @@ class _AppPageState extends State<AppPage> { | ||||
|           mainAxisAlignment: MainAxisAlignment.center, | ||||
|           crossAxisAlignment: CrossAxisAlignment.stretch, | ||||
|           children: [ | ||||
|             const SizedBox(height: 125), | ||||
|             const SizedBox(height: 20), | ||||
|             app?.icon != null | ||||
|                 ? Row(mainAxisAlignment: MainAxisAlignment.center, children: [ | ||||
|                     Image.memory( | ||||
| @@ -464,8 +464,17 @@ class _AppPageState extends State<AppPage> { | ||||
|           ], | ||||
|         )); | ||||
|      | ||||
|     appScreenAppBar() => AppBar( | ||||
|       leading: IconButton( | ||||
|         icon: const Icon(Icons.arrow_back), | ||||
|         onPressed: () { | ||||
|           Navigator.pop(context); | ||||
|         }, | ||||
|       ), | ||||
|     ); | ||||
|  | ||||
|     return Scaffold( | ||||
|         appBar: settingsProvider.showAppWebpage ? AppBar() : null, | ||||
|         appBar: settingsProvider.showAppWebpage ? AppBar() : appScreenAppBar(), | ||||
|         backgroundColor: Theme.of(context).colorScheme.surface, | ||||
|         body: RefreshIndicator( | ||||
|             child: settingsProvider.showAppWebpage | ||||
|   | ||||
| @@ -430,7 +430,8 @@ class AppsProvider with ChangeNotifier { | ||||
|         zipFile: File(filePath), destinationDir: Directory(destinationPath)); | ||||
|   } | ||||
|  | ||||
|   Future<void> installXApkDir(DownloadedXApkDir dir) async { | ||||
|   Future<void> installXApkDir(DownloadedXApkDir dir, | ||||
|       {bool needsBGWorkaround = 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 | ||||
| @@ -443,7 +444,8 @@ class AppsProvider with ChangeNotifier { | ||||
|         if (file.path.toLowerCase().endsWith('.apk')) { | ||||
|           try { | ||||
|             somethingInstalled = somethingInstalled || | ||||
|                 await installApk(DownloadedApk(dir.appId, file)); | ||||
|                 await installApk(DownloadedApk(dir.appId, file), | ||||
|                     needsBGWorkaround: needsBGWorkaround); | ||||
|           } catch (e) { | ||||
|             logs.add( | ||||
|                 'Could not install APK from XAPK \'${file.path}\': ${e.toString()}'); | ||||
| @@ -463,7 +465,8 @@ class AppsProvider with ChangeNotifier { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   Future<bool> installApk(DownloadedApk file) async { | ||||
|   Future<bool> installApk(DownloadedApk file, | ||||
|       {bool needsBGWorkaround = false}) async { | ||||
|     var newInfo = | ||||
|         await pm.getPackageArchiveInfo(archiveFilePath: file.file.path); | ||||
|     PackageInfo? appInfo = await getInstalledInfo(apps[file.appId]!.app.id); | ||||
| @@ -472,6 +475,17 @@ class AppsProvider with ChangeNotifier { | ||||
|         !(await canDowngradeApps())) { | ||||
|       throw DowngradeError(); | ||||
|     } | ||||
|     if (needsBGWorkaround) { | ||||
|       // The below 'await' will never return if we are in a background process | ||||
|       // To work around this, we should assume the install will be successful | ||||
|       // So we update the app's installed version first as we will never get to the later code | ||||
|       // We can't conditionally get rid of the 'await' as this causes install fails (BG process times out) - see #896 | ||||
|       // TODO: When fixed, update this function and the calls to it accordingly | ||||
|       apps[file.appId]!.app.installedVersion = | ||||
|           apps[file.appId]!.app.latestVersion; | ||||
|       await saveApps([apps[file.appId]!.app], | ||||
|           attemptToCorrectInstallStatus: false); | ||||
|     } | ||||
|     int? code = | ||||
|         await AndroidPackageInstaller.installApk(apkFilePath: file.file.path); | ||||
|     bool installed = false; | ||||
| @@ -641,15 +655,13 @@ class AppsProvider with ChangeNotifier { | ||||
|         try { | ||||
|           if (downloadedFile != null) { | ||||
|             if (willBeSilent && context == null) { | ||||
|               // Would await forever - workaround - TODO | ||||
|               installApk(downloadedFile); | ||||
|               installApk(downloadedFile, needsBGWorkaround: true); | ||||
|             } else { | ||||
|               await installApk(downloadedFile); | ||||
|             } | ||||
|           } else { | ||||
|             if (willBeSilent && context == null) { | ||||
|               // Would await forever - workaround - TODO | ||||
|               installXApkDir(downloadedDir!); | ||||
|               installXApkDir(downloadedDir!, needsBGWorkaround: true); | ||||
|             } else { | ||||
|               await installXApkDir(downloadedDir!); | ||||
|             } | ||||
| @@ -1132,7 +1144,8 @@ class AppsProvider with ChangeNotifier { | ||||
|           displayName: | ||||
|               '${tr('obtainiumExportHyphenatedLowercase')}-${DateTime.now().toIso8601String().replaceAll(':', '-')}${isAuto ? '-auto' : ''}.json', | ||||
|           mimeType: 'application/json', | ||||
|           content: jsonEncode(apps.values.map((e) => e.app.toJson()).toList())); | ||||
|           bytes: Uint8List.fromList(utf8.encode( | ||||
|               jsonEncode(apps.values.map((e) => e.app.toJson()).toList())))); | ||||
|       if (result == null) { | ||||
|         throw ObtainiumError(tr('unexpectedError')); | ||||
|       } | ||||
|   | ||||
							
								
								
									
										24
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								pubspec.lock
									
									
									
									
									
								
							| @@ -46,10 +46,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: archive | ||||
|       sha256: "49b1fad315e57ab0bbc15bcbb874e83116a1d78f77ebd500a4af6c9407d6b28e" | ||||
|       sha256: e0902a06f0e00414e4e3438a084580161279f137aeb862274710f29ec10cf01e | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.3.8" | ||||
|     version: "3.3.9" | ||||
|   args: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -198,10 +198,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: dynamic_color | ||||
|       sha256: de4798a7069121aee12d5895315680258415de9b00e717723a1bd73d58f0126d | ||||
|       sha256: "96bff3df72e3d428bda2b874c7a521e8c86f592cae626ea594922fcc8d166e0c" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.6.6" | ||||
|     version: "1.6.7" | ||||
|   easy_localization: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
| @@ -320,10 +320,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: flutter_markdown | ||||
|       sha256: d4a1cb250c4e059586af0235f32e02882860a508e189b61f2b31b8810c1e1330 | ||||
|       sha256: a10979814c5f4ddbe2b6143fba25d927599e21e3ba65b3862995960606fae78f | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.6.17+2" | ||||
|     version: "0.6.17+3" | ||||
|   flutter_plugin_android_lifecycle: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -538,18 +538,18 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: permission_handler | ||||
|       sha256: bc56bfe9d3f44c3c612d8d393bd9b174eb796d706759f9b495ac254e4294baa5 | ||||
|       sha256: ad65ba9af42a3d067203641de3fd9f547ded1410bad3b84400c2b4899faede70 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "10.4.5" | ||||
|     version: "11.0.0" | ||||
|   permission_handler_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: permission_handler_android | ||||
|       sha256: "59c6322171c29df93a22d150ad95f3aa19ed86542eaec409ab2691b8f35f9a47" | ||||
|       sha256: f23cfe9af0d49c6b9fd8a8b09f7b3301ca7e346204939b5afef4404d36d2608f | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "10.3.6" | ||||
|     version: "11.0.1" | ||||
|   permission_handler_apple: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -887,10 +887,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: webview_flutter_android | ||||
|       sha256: "9427774649fd3c8b7ff53523051395d13aed2ca355822b822e6493d79f5fc05a" | ||||
|       sha256: ddc167c6676f57c8b367d19fcbee267d6dc6adf81bd6c3cb87981d30746e0a6d | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.10.0" | ||||
|     version: "3.10.1" | ||||
|   webview_flutter_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|   | ||||
| @@ -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.13+205 # When changing this, update the tag in main() accordingly | ||||
| version: 0.14.16+208 # When changing this, update the tag in main() accordingly | ||||
|  | ||||
| environment: | ||||
|   sdk: '>=3.0.0 <4.0.0' | ||||
| @@ -46,7 +46,7 @@ dependencies: | ||||
|   html: ^0.15.0 | ||||
|   shared_preferences: ^2.0.15 | ||||
|   url_launcher: ^6.1.5 | ||||
|   permission_handler: ^10.0.0 | ||||
|   permission_handler: ^11.0.0 | ||||
|   fluttertoast: ^8.0.9 | ||||
|   device_info_plus: ^9.0.0 | ||||
|   file_picker: ^5.2.10 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user