From 55d7be0da9714bc83281d89bca68efdeade0b20e Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 9 May 2023 23:51:15 +0530 Subject: [PATCH 01/10] PkgManagerModule - getBaseApkPath() --- .../foundation/e/apps/manager/pkg/PkgManagerModule.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt b/app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt index 416504204..d5844027c 100644 --- a/app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt +++ b/app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt @@ -137,6 +137,14 @@ class PkgManagerModule @Inject constructor( } } + /** + * For an installed app, get the path to the base.apk. + */ + fun getBaseApkPath(packageName: String): String { + val packageInfo = getPackageInfo(packageName) + return packageInfo?.applicationInfo?.publicSourceDir ?: "" + } + /** * Installs the given package using system API * @param list List of [File] to be written to install session. -- GitLab From 1150e5f0823a44ee884ebc96eeb8204022c786f9 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 9 May 2023 23:52:58 +0530 Subject: [PATCH 02/10] Fused API: getOSSDownloadInfo --- app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt | 2 ++ .../main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt index 33e061c16..aba99deba 100644 --- a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt +++ b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt @@ -546,6 +546,8 @@ class FusedAPIImpl @Inject constructor( fusedDownload.downloadURLList = list } + suspend fun getOSSDownloadInfo(id: String) = cleanAPKRepository.getDownloadInfo(id) + suspend fun getPWAApps(category: String): ResultSupreme> { val list = mutableListOf() val status = runCodeBlockWithTimeout({ diff --git a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt index 537b533c0..2a9eaca92 100644 --- a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt +++ b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt @@ -134,6 +134,8 @@ class FusedAPIRepository @Inject constructor(private val fusedAPIImpl: FusedAPII ) } + suspend fun getOSSDownloadInfo(id: String) = fusedAPIImpl.getOSSDownloadInfo(id) + suspend fun getOnDemandModule( authData: AuthData, packageName: String, -- GitLab From ee5602c0b5c36dc5e887ad2741ca6b19eb7e346e Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Wed, 10 May 2023 00:00:56 +0530 Subject: [PATCH 03/10] UpdatesManagerImpl - getFDroidAppsAndSignatures(), getPgpSignature() --- .../updates/manager/UpdatesManagerImpl.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt index 97ef1bdd6..51baffca3 100644 --- a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt +++ b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt @@ -192,6 +192,33 @@ class UpdatesManagerImpl @Inject constructor( return apiResult.second } + /** + * Takes a list of package names and for the apps present on F-Droid, + * returns key value pairs of package names and their signatures. + * + * If none of the apps mentioned in [installedPackageNames] are present on F-Droid, + * then it returns an empty Map. + * + * Map is String : String = package name : signature + */ + private suspend fun getFDroidAppsAndSignatures(installedPackageNames: List): Map { + val appsAndSignatures = hashMapOf() + for (packageName in installedPackageNames) { + val cleanApkFusedApp = fusedAPIRepository.getCleanapkAppDetails(packageName).first + if (cleanApkFusedApp.package_name.isBlank()) { + continue + } + appsAndSignatures[packageName] = getPgpSignature(cleanApkFusedApp) + } + return appsAndSignatures + } + + private suspend fun getPgpSignature(cleanApkFusedApp: FusedApp): String { + val downloadInfo = + fusedAPIRepository.getOSSDownloadInfo(cleanApkFusedApp._id).body()?.download_data + return downloadInfo?.signature ?: "" + } + fun getApplicationCategoryPreference(): List { return fusedAPIRepository.getApplicationCategoryPreference() } -- GitLab From 39bb09622606a8dc61a15f8beb24d558d4812ed2 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Thu, 11 May 2023 18:15:15 +0530 Subject: [PATCH 04/10] UpdatesManagerImpl - findPackagesMatchingFDroidSignatures() --- .../updates/manager/UpdatesManagerImpl.kt | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt index 51baffca3..bcfcf1459 100644 --- a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt +++ b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt @@ -22,12 +22,12 @@ import android.content.Context import android.content.pm.ApplicationInfo import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.qualifiers.ApplicationContext +import foundation.e.apps.api.cleanapk.ApkSignatureManager import foundation.e.apps.api.faultyApps.FaultyAppRepository import foundation.e.apps.api.fused.FusedAPIImpl.Companion.APP_TYPE_ANY import foundation.e.apps.api.fused.FusedAPIRepository import foundation.e.apps.api.fused.data.FusedApp import foundation.e.apps.manager.pkg.PkgManagerModule -import foundation.e.apps.utils.Constants import foundation.e.apps.utils.enums.Origin import foundation.e.apps.utils.enums.ResultStatus import foundation.e.apps.utils.enums.Status @@ -219,6 +219,27 @@ class UpdatesManagerImpl @Inject constructor( return downloadInfo?.signature ?: "" } + /** + * Returns list of packages whose signature matches with the available listing on F-Droid. + * + * Example: If Element (im.vector.app) is installed from ApkMirror, then it's signature + * will not match with the version of Element on F-Droid. So if Element is present + * in [installedPackageNames], it will not be present in the list returned by this method. + */ + private suspend fun findPackagesMatchingFDroidSignatures( + installedPackageNames: List, + ): List { + val fDroidAppsAndSignatures = getFDroidAppsAndSignatures(installedPackageNames) + + val fDroidUpdatablePackageNames = fDroidAppsAndSignatures.filter { + // For each installed app also present on F-droid, check signature of base APK. + val baseApkPath = pkgManagerModule.getBaseApkPath(it.key) + ApkSignatureManager.verifyFdroidSignature(context, baseApkPath, it.value) + }.map { it.key } + + return fDroidUpdatablePackageNames + } + fun getApplicationCategoryPreference(): List { return fusedAPIRepository.getApplicationCategoryPreference() } -- GitLab From a9006389bc3d97c3c61bf5d8f398dd08f61ab2b4 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Thu, 11 May 2023 18:23:21 +0530 Subject: [PATCH 05/10] UpdatesManagerImpl - change how other store apps are considered. --- .../updates/manager/UpdatesManagerImpl.kt | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt index bcfcf1459..c87e4f1f7 100644 --- a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt +++ b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt @@ -61,10 +61,17 @@ class UpdatesManagerImpl @Inject constructor( val openSourceInstalledApps = getOpenSourceInstalledApps().toMutableList() val gPlayInstalledApps = getGPlayInstalledApps().toMutableList() - val otherStoreApps = getAppsFromOtherStores() - if (preferenceManagerModule.shouldUpdateAppsFromOtherStores()) { - openSourceInstalledApps.addAll(otherStoreApps) + val otherStoresInstalledApps = getAppsFromOtherStores().toMutableList() + + // This list is based on app signatures + val updatableFDroidApps = + findPackagesMatchingFDroidSignatures(otherStoresInstalledApps) + + openSourceInstalledApps.addAll(updatableFDroidApps) + + otherStoresInstalledApps.removeAll(updatableFDroidApps) + gPlayInstalledApps.addAll(otherStoresInstalledApps) } // Get open source app updates @@ -78,12 +85,6 @@ class UpdatesManagerImpl @Inject constructor( }, updateList) } - if (preferenceManagerModule.shouldUpdateAppsFromOtherStores()) { - val updateListFromFDroid = updateList.map { it.package_name } - val otherStoreAppsForGPlay = otherStoreApps - updateListFromFDroid.toSet() - gPlayInstalledApps.addAll(otherStoreAppsForGPlay) - } - // Get GPlay app updates if (getApplicationCategoryPreference().contains(APP_TYPE_ANY) && gPlayInstalledApps.isNotEmpty()) { @@ -107,10 +108,14 @@ class UpdatesManagerImpl @Inject constructor( val openSourceInstalledApps = getOpenSourceInstalledApps().toMutableList() - val otherStoreApps = getAppsFromOtherStores() - if (preferenceManagerModule.shouldUpdateAppsFromOtherStores()) { - openSourceInstalledApps.addAll(otherStoreApps) + val otherStoresInstalledApps = getAppsFromOtherStores().toMutableList() + + // This list is based on app signatures + val updatableFDroidApps = + findPackagesMatchingFDroidSignatures(otherStoresInstalledApps) + + openSourceInstalledApps.addAll(updatableFDroidApps) } if (openSourceInstalledApps.isNotEmpty()) { -- GitLab From da367db4840bc5ab99e0396a54cd30eca09fcdb5 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Wed, 10 May 2023 22:56:01 +0530 Subject: [PATCH 06/10] PkgManagerModule - getVersionCode, getVersionName --- .../e/apps/manager/pkg/PkgManagerModule.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt b/app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt index d5844027c..1b99aecb1 100644 --- a/app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt +++ b/app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt @@ -145,6 +145,21 @@ class PkgManagerModule @Inject constructor( return packageInfo?.applicationInfo?.publicSourceDir ?: "" } + fun getVersionCode(packageName: String): String { + val packageInfo = getPackageInfo(packageName) + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + packageInfo?.longVersionCode?.toString() ?: "" + } else { + @Suppress("DEPRECATION") + packageInfo?.versionCode?.toString() ?: "" + } + } + + fun getVersionName(packageName: String): String { + val packageInfo = getPackageInfo(packageName) + return packageInfo?.versionName?.toString() ?: "" + } + /** * Installs the given package using system API * @param list List of [File] to be written to install session. -- GitLab From 6faa439bd290f614c007a084f2747e9560a1ea2d Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Thu, 11 May 2023 00:01:35 +0530 Subject: [PATCH 07/10] FDroid API - get build info - versionName and versionCode --- .../e/apps/api/fdroid/FdroidRepository.kt | 5 +++ .../e/apps/api/fdroid/models/BuildInfo.kt | 37 +++++++++++++++++++ .../apps/api/fdroid/models/FdroidApiModel.kt | 7 +++- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/foundation/e/apps/api/fdroid/models/BuildInfo.kt diff --git a/app/src/main/java/foundation/e/apps/api/fdroid/FdroidRepository.kt b/app/src/main/java/foundation/e/apps/api/fdroid/FdroidRepository.kt index beba5d5b2..99ee0f1e7 100644 --- a/app/src/main/java/foundation/e/apps/api/fdroid/FdroidRepository.kt +++ b/app/src/main/java/foundation/e/apps/api/fdroid/FdroidRepository.kt @@ -2,6 +2,7 @@ package foundation.e.apps.api.fdroid import android.content.Context import foundation.e.apps.api.cleanapk.ApkSignatureManager +import foundation.e.apps.api.fdroid.models.BuildInfo import foundation.e.apps.api.fdroid.models.FdroidEntity import foundation.e.apps.api.fused.data.FusedApp import foundation.e.apps.utils.enums.Origin @@ -35,6 +36,10 @@ class FdroidRepository @Inject constructor( } } + suspend fun getBuildVersionInfo(packageName: String): List? { + return fdroidApi.getFdroidInfoForPackage(packageName).body()?.builds + } + override suspend fun getAuthorName(fusedApp: FusedApp): String { if (fusedApp.author != UNKNOWN || fusedApp.origin != Origin.CLEANAPK) { return fusedApp.author.ifEmpty { UNKNOWN } diff --git a/app/src/main/java/foundation/e/apps/api/fdroid/models/BuildInfo.kt b/app/src/main/java/foundation/e/apps/api/fdroid/models/BuildInfo.kt new file mode 100644 index 000000000..047395ded --- /dev/null +++ b/app/src/main/java/foundation/e/apps/api/fdroid/models/BuildInfo.kt @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2019-2023 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.apps.api.fdroid.models + +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonProperty + +@JsonIgnoreProperties(ignoreUnknown = true) +class BuildInfo() { + var versionCode: String = "" + var versionName: String = "" + + @JsonCreator + constructor( + @JsonProperty("versionCode") versionCode: String?, + @JsonProperty("versionName") versionName: String?, + ) : this() { + this.versionCode = versionCode ?: "" + this.versionName = versionName ?: "" + } +} \ No newline at end of file diff --git a/app/src/main/java/foundation/e/apps/api/fdroid/models/FdroidApiModel.kt b/app/src/main/java/foundation/e/apps/api/fdroid/models/FdroidApiModel.kt index e797823ad..e25eece59 100644 --- a/app/src/main/java/foundation/e/apps/api/fdroid/models/FdroidApiModel.kt +++ b/app/src/main/java/foundation/e/apps/api/fdroid/models/FdroidApiModel.kt @@ -19,9 +19,14 @@ import com.fasterxml.jackson.annotation.JsonProperty @JsonIgnoreProperties(ignoreUnknown = true) class FdroidApiModel() { var authorName: String = "" + var builds: List = mutableListOf() @JsonCreator - constructor(@JsonProperty("AuthorName") AuthorName: String?) : this() { + constructor( + @JsonProperty("AuthorName") AuthorName: String?, + @JsonProperty("Builds") Builds: List?, + ) : this() { this.authorName = AuthorName ?: "" + this.builds = Builds ?: emptyList() } } -- GitLab From e0725026934daeb3ef68380a66bff81dc6d4e255 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Thu, 11 May 2023 00:03:36 +0530 Subject: [PATCH 08/10] Fused API - modify getOSSDownloadInfo to take version --- app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt | 3 ++- .../java/foundation/e/apps/api/fused/FusedAPIRepository.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt index aba99deba..67948798b 100644 --- a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt +++ b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt @@ -546,7 +546,8 @@ class FusedAPIImpl @Inject constructor( fusedDownload.downloadURLList = list } - suspend fun getOSSDownloadInfo(id: String) = cleanAPKRepository.getDownloadInfo(id) + suspend fun getOSSDownloadInfo(id: String, version: String?) = + cleanAPKRepository.getDownloadInfo(id, version) suspend fun getPWAApps(category: String): ResultSupreme> { val list = mutableListOf() diff --git a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt index 2a9eaca92..7cd9bdcf1 100644 --- a/app/src/main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt +++ b/app/src/main/java/foundation/e/apps/api/fused/FusedAPIRepository.kt @@ -134,7 +134,8 @@ class FusedAPIRepository @Inject constructor(private val fusedAPIImpl: FusedAPII ) } - suspend fun getOSSDownloadInfo(id: String) = fusedAPIImpl.getOSSDownloadInfo(id) + suspend fun getOSSDownloadInfo(id: String, version: String? = null) = + fusedAPIImpl.getOSSDownloadInfo(id, version) suspend fun getOnDemandModule( authData: AuthData, -- GitLab From 3e8ff069d64637e6043223d17da3164649efdd88 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Thu, 11 May 2023 18:37:56 +0530 Subject: [PATCH 09/10] UpdatesManagerImpl - calculateSignatureVersion() --- .../updates/manager/UpdatesManagerImpl.kt | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt index c87e4f1f7..f00887fb2 100644 --- a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt +++ b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt @@ -24,6 +24,7 @@ import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.api.cleanapk.ApkSignatureManager import foundation.e.apps.api.faultyApps.FaultyAppRepository +import foundation.e.apps.api.fdroid.FdroidRepository import foundation.e.apps.api.fused.FusedAPIImpl.Companion.APP_TYPE_ANY import foundation.e.apps.api.fused.FusedAPIRepository import foundation.e.apps.api.fused.data.FusedApp @@ -34,6 +35,7 @@ import foundation.e.apps.utils.enums.Status import foundation.e.apps.utils.enums.isUnFiltered import foundation.e.apps.utils.modules.PreferenceManagerModule import javax.inject.Inject +import timber.log.Timber class UpdatesManagerImpl @Inject constructor( @ApplicationContext private val context: Context, @@ -41,6 +43,7 @@ class UpdatesManagerImpl @Inject constructor( private val fusedAPIRepository: FusedAPIRepository, private val faultyAppRepository: FaultyAppRepository, private val preferenceManagerModule: PreferenceManagerModule, + private val fdroidRepository: FdroidRepository, ) { companion object { @@ -245,6 +248,61 @@ class UpdatesManagerImpl @Inject constructor( return fDroidUpdatablePackageNames } + /** + * Get signature version for the installed version of the app. + * A signature version is like "update_XX" where XX is a 2 digit number. + * + * Example: + * The installed versionCode of an app is (say) 7. + * The latest available version is (say) 10, we need to update to this version. + * The latest signature version is (say) "update_33". + * Available builds of F-droid are (say): + * version 10 + * version 9 + * version 8 + * version 7 + * ... + * Index of version 7 from top is 3 (index of version 10 is 0). + * So the corresponding signature version will be "update_(33-3)" = "update_30" + */ + private suspend fun calculateSignatureVersion(latestCleanapkApp: FusedApp): String { + val packageName = latestCleanapkApp.package_name + val latestSignatureVersion = latestCleanapkApp.latest_downloaded_version + + Timber.i("Latest signature version for $packageName : $latestSignatureVersion") + + val installedVersionCode = pkgManagerModule.getVersionCode(packageName) + val installedVersionName = pkgManagerModule.getVersionName(packageName) + + Timber.i("Calculate signature for $packageName : $installedVersionCode, $installedVersionName") + + val latestSignatureVersionNumber = try { + latestSignatureVersion.split("_")[1].toInt() + } catch (e: Exception) { + return "" + } + + + // Received list has build info of the latest version at the bottom. + // We want it at the top. + val builds = fdroidRepository.getBuildVersionInfo(packageName)?.asReversed() ?: return "" + + val matchingIndex = builds.find { + it.versionCode == installedVersionCode && it.versionName == installedVersionName + }?.run { + builds.indexOf(this) + }?: return "" + + Timber.i("Build info match at index: $matchingIndex") + + /* If latest latest signature version is (say) "update_33" + * corresponding to (say) versionCode 10, and we need to find signature + * version of (say) versionCode 7, then we calculate signature version as: + * "update_" + [33 (latestSignatureVersionNumber) - 3 (i.e. matchingIndex)] = "update_30" + */ + return "update_${latestSignatureVersionNumber - matchingIndex}" + } + fun getApplicationCategoryPreference(): List { return fusedAPIRepository.getApplicationCategoryPreference() } -- GitLab From f4c24c4639ebf5fcf361cd8246861ae7d48caea0 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Thu, 11 May 2023 19:06:37 +0530 Subject: [PATCH 10/10] UpdatesManagerImpl - use calculated signature version --- .../updates/manager/UpdatesManagerImpl.kt | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt index f00887fb2..7c4a002b8 100644 --- a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt +++ b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesManagerImpl.kt @@ -204,6 +204,12 @@ class UpdatesManagerImpl @Inject constructor( * Takes a list of package names and for the apps present on F-Droid, * returns key value pairs of package names and their signatures. * + * The signature for an app corresponds to the version currently + * installed on the device. + * If the current installed version for an app is (say) 7, then even if + * the latest version is 10, we try to find the signature of version 7. + * If signature for version 7 of the app is unavailable, then we put blank. + * * If none of the apps mentioned in [installedPackageNames] are present on F-Droid, * then it returns an empty Map. * @@ -222,8 +228,21 @@ class UpdatesManagerImpl @Inject constructor( } private suspend fun getPgpSignature(cleanApkFusedApp: FusedApp): String { + val installedVersionSignature = calculateSignatureVersion(cleanApkFusedApp) + val downloadInfo = - fusedAPIRepository.getOSSDownloadInfo(cleanApkFusedApp._id).body()?.download_data + fusedAPIRepository + .getOSSDownloadInfo(cleanApkFusedApp._id, installedVersionSignature) + .body()?.download_data + + val pgpSignature = downloadInfo?.signature ?: "" + + Timber.i( + "Signature calculated for : ${cleanApkFusedApp.package_name}, " + + "signature version: ${installedVersionSignature}, " + + "is sig blank: ${pgpSignature.isBlank()}" + ) + return downloadInfo?.signature ?: "" } -- GitLab