diff --git a/assets/translations/br.json b/assets/translations/br.json index 96e9e7d..a083e20 100644 --- a/assets/translations/br.json +++ b/assets/translations/br.json @@ -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?" diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 01d0d2b..7352027 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -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?" diff --git a/assets/translations/de.json b/assets/translations/de.json index f6f9d0e..5ab4801 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -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": "App entfernen?", "other": "Apps entfernen?" diff --git a/assets/translations/en.json b/assets/translations/en.json index 4395c68..6e782f9 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -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?" diff --git a/assets/translations/es.json b/assets/translations/es.json index b662041..aefea28 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -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?" diff --git a/assets/translations/fa.json b/assets/translations/fa.json index c3f5274..9c62c43 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -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": "برنامه ها حذف شوند؟" diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 8576909..33e9fb6 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -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 ?" diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 845e313..164cd9a 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -252,6 +252,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": "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 7fec3c8..b805fc5 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -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?" diff --git a/assets/translations/ja.json b/assets/translations/ja.json index 541da17..9093e15 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -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": "アプリを削除しますか?" diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 04f8322..205d716 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -259,6 +259,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": "Usunąć aplikację?", "few": "Usunąć aplikacje?", diff --git a/assets/translations/ru.json b/assets/translations/ru.json index 690cd53..9db80ce 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -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": "Удалить приложения?" diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 66fc426..1057515 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -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": "是否删除应用?" diff --git a/lib/app_sources/fdroid.dart b/lib/app_sources/fdroid.dart index ffee596..f2dd3f9 100644 --- a/lib/app_sources/fdroid.dart +++ b/lib/app_sources/fdroid.dart @@ -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 releases = jsonDecode(res.body)['packages'] ?? []; + var response = jsonDecode(res.body); + List releases = response['packages'] ?? []; if (releases.isEmpty) { throw NoReleasesError(); } - String? latestVersion = releases[0]['versionName']; - if (latestVersion == null) { + String? version; + Iterable 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 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 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 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 diff --git a/lib/app_sources/izzyondroid.dart b/lib/app_sources/izzyondroid.dart index f145bb8..8f801db 100644 --- a/lib/app_sources/izzyondroid.dart +++ b/lib/app_sources/izzyondroid.dart @@ -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']); } }