From fdd5dd65bfa0c84223fd33da4d4fff4f1ffbf4a5 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 29 Apr 2026 11:00:23 -0300 Subject: [PATCH] Fix suggested and installable versions in app details For both we weren't considering the actual version code of the already installed app in case the repository did not have that version --- .../org/fdroid/ui/details/DetailsPresenter.kt | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/app/src/main/kotlin/org/fdroid/ui/details/DetailsPresenter.kt b/app/src/main/kotlin/org/fdroid/ui/details/DetailsPresenter.kt index 1e713da20..083486aa0 100644 --- a/app/src/main/kotlin/org/fdroid/ui/details/DetailsPresenter.kt +++ b/app/src/main/kotlin/org/fdroid/ui/details/DetailsPresenter.kt @@ -100,15 +100,21 @@ fun DetailsPresenter( @Suppress("DEPRECATION") // so far we had issues with the new way of getting sigs packageInfo?.signatures?.get(0)?.let { sha256(it.toByteArray()) } } + val installedVersionCode = packageInfo?.let { getLongVersionCode(packageInfo) } val suggestedVersion = remember(versions, appPrefs, installedSigner) { if (versions == null || appPrefs == null) { null } else { - updateChecker.getSuggestedVersion( + // Use getUpdate() instead of getSuggestedVersion() to consider `installedVersionCode`. + // Otherwise, we would default to `installedVersionCode = 0` and get a suggested version + // that can have a smaller version code than the installed one. + updateChecker.getUpdate( versions = versions, - preferredSigner = installedSigner ?: app.metadata.preferredSigner, - releaseChannels = appPrefs.releaseChannels, + installedVersionCode = installedVersionCode ?: 0, + allowedSignersGetter = + (installedSigner ?: app.metadata.preferredSigner)?.let { { setOf(it) } }, + allowedReleaseChannels = appPrefs.releaseChannels, preferencesGetter = { appPrefs }, ) } @@ -151,27 +157,25 @@ fun DetailsPresenter( ) } } - val installedVersionCode = packageInfo?.let { getLongVersionCode(packageInfo) } - val installedVersion = - packageInfo?.let { - val installedVersions = versions?.filter { it.versionCode == installedVersionCode } - when (installedVersions?.size) { - null -> null - 0 -> null - 1 -> installedVersions.first() - // more than version with the same version code, find a matching signer - else -> - installedVersions.find { - val versionSigners = it.signer?.sha256?.toSet() - // F-Droid allows versions without a signer entry, allow those - if (versionSigners != null && installedSigner != null) { - versionSigners.intersect(setOf(installedSigner)).isNotEmpty() - } else { - true - } + val installedVersion = packageInfo?.let { + val installedVersions = versions?.filter { it.versionCode == installedVersionCode } + when (installedVersions?.size) { + null -> null + 0 -> null + 1 -> installedVersions.first() + // more than version with the same version code, find a matching signer + else -> + installedVersions.find { + val versionSigners = it.signer?.sha256?.toSet() + // F-Droid allows versions without a signer entry, allow those + if (versionSigners != null && installedSigner != null) { + versionSigners.intersect(setOf(installedSigner)).isNotEmpty() + } else { + true } - } + } } + } val authorName = app.authorName val authorHasMoreThanOneApp = if (authorName == null) false @@ -257,7 +261,7 @@ fun DetailsPresenter( if (!signerCompatible || installState.showProgress) { false } else { - (installedVersion?.versionCode ?: 0) < version.versionCode + (installedVersionCode ?: 0) < version.versionCode }, ) },