Implement suggested version code for third-party F-Droid repos (#2524)

Enable it by default for both official and third-party F-Droid sources.

Reuse trySelectingSuggestedVersionCode label from official F-Droid repository source.
This commit is contained in:
Alexey Arutyunov
2025-09-11 22:52:07 +02:00
committed by Alexey Arutyunov
parent b9931e00e7
commit 1b499700fd
2 changed files with 41 additions and 18 deletions

View File

@@ -32,6 +32,7 @@ class FDroid extends AppSource {
GeneratedFormSwitch( GeneratedFormSwitch(
'trySelectingSuggestedVersionCode', 'trySelectingSuggestedVersionCode',
label: tr('trySelectingSuggestedVersionCode'), label: tr('trySelectingSuggestedVersionCode'),
defaultValue: true,
), ),
], ],
[ [

View File

@@ -29,6 +29,13 @@ class FDroidRepo extends AppSource {
defaultValue: false, defaultValue: false,
), ),
], ],
[
GeneratedFormSwitch(
'trySelectingSuggestedVersionCode',
label: tr('trySelectingSuggestedVersionCode'),
defaultValue: true,
),
],
]; ];
} }
@@ -170,6 +177,7 @@ class FDroidRepo extends AppSource {
} }
standardUrl = removeQueryParamsFromUrl(standardUrl); standardUrl = removeQueryParamsFromUrl(standardUrl);
bool pickHighestVersionCode = additionalSettings['pickHighestVersionCode']; bool pickHighestVersionCode = additionalSettings['pickHighestVersionCode'];
bool trySelectingSuggestedVersionCode = additionalSettings['trySelectingSuggestedVersionCode'];
if (appIdOrName == null) { if (appIdOrName == null) {
throw NoReleasesError(); throw NoReleasesError();
} }
@@ -207,35 +215,49 @@ class FDroidRepo extends AppSource {
foundApps[0].querySelector('name')?.innerHtml ?? appId; foundApps[0].querySelector('name')?.innerHtml ?? appId;
var appName = foundApps[0].querySelector('name')?.innerHtml ?? appId; var appName = foundApps[0].querySelector('name')?.innerHtml ?? appId;
var releases = foundApps[0].querySelectorAll('package'); var releases = foundApps[0].querySelectorAll('package');
if (releases.isEmpty) {
throw NoReleasesError();
}
String? latestVersion = releases[0].querySelector('version')?.innerHtml; String? latestVersion = releases[0].querySelector('version')?.innerHtml;
String? added = releases[0].querySelector('added')?.innerHtml;
DateTime? releaseDate = added != null ? DateTime.parse(added) : null;
if (latestVersion == null) { if (latestVersion == null) {
throw NoVersionError(); throw NoVersionError();
} }
var latestVersionReleases = releases String? marketvercodeStr = foundApps[0].querySelector('marketvercode')?.innerHtml;
.where( int? marketvercode = int.tryParse(marketvercodeStr ?? '');
(element) => List selectedReleases = [];
element.querySelector('version')?.innerHtml == latestVersion && if (trySelectingSuggestedVersionCode && marketvercode != null) {
element.querySelector('apkname') != null, selectedReleases = releases.where((e) =>
) int.tryParse(e.querySelector('versioncode')?.innerHtml ?? '') == marketvercode &&
.toList(); e.querySelector('apkname') != null
if (latestVersionReleases.length > 1 && pickHighestVersionCode) { ).toList();
latestVersionReleases.sort((e1, e2) {
return int.parse(
e2.querySelector('versioncode')!.innerHtml,
).compareTo(int.parse(e1.querySelector('versioncode')!.innerHtml));
});
latestVersionReleases = [latestVersionReleases[0]];
} }
List<String> apkUrls = latestVersionReleases if (selectedReleases.isEmpty) {
selectedReleases = releases.where((e) =>
e.querySelector('version')?.innerHtml == latestVersion &&
e.querySelector('apkname') != null
).toList();
if (selectedReleases.length > 1 && pickHighestVersionCode) {
selectedReleases.sort((e1, e2) {
return int.parse(e2.querySelector('versioncode')!.innerHtml)
.compareTo(int.parse(e1.querySelector('versioncode')!.innerHtml));
});
selectedReleases = [selectedReleases[0]];
}
}
String? selectedVersion = selectedReleases[0].querySelector('version')?.innerHtml;
if (selectedVersion == null) {
throw NoVersionError();
}
String? added = selectedReleases[0].querySelector('added')?.innerHtml;
DateTime? releaseDate = added != null ? DateTime.parse(added) : null;
List<String> apkUrls = selectedReleases
.map( .map(
(e) => (e) =>
'${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}/${e.querySelector('apkname')!.innerHtml}', '${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}/${e.querySelector('apkname')!.innerHtml}',
) )
.toList(); .toList();
return APKDetails( return APKDetails(
latestVersion, selectedVersion,
getApkUrlsFromUrls(apkUrls), getApkUrlsFromUrls(apkUrls),
AppNames(authorName, appName), AppNames(authorName, appName),
releaseDate: releaseDate, releaseDate: releaseDate,