From 38123311660a24259f91e376221313ab039d0612 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 29 May 2019 15:20:18 +0200 Subject: [PATCH] stop crashing if the suggested version ends up being bogus It is possible for repo operators to specify a bad CurrentVersionCode for an app that is also in another repo, and cause confusion in the suggested version calculation. Or if one repo's index is very out of date. This adds a fallback for these cases, so at least it'll stop the crash and attempt the user's requested install. --- .../org/fdroid/fdroid/data/ApkProvider.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java b/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java index 8d128568a..4a6135a59 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java @@ -86,10 +86,28 @@ public class ApkProvider extends FDroidProvider { *
  • If installed, limit to apks signed by the same signer as the installed apk.
  • *
  • Otherwise, limit to apks signed by the "preferred" signer (see {@link App#preferredSigner}).
  • * + * If all else fails, try to return some {@link Apk} that will install something, + * rather than returning a null and triggering a {@link NullPointerException}. */ + @Nullable public static Apk findSuggestedApk(Context context, App app) { - return findApkFromAnyRepo(context, app.packageName, app.suggestedVersionCode, - app.getMostAppropriateSignature()); + String mostAppropriateSignature = app.getMostAppropriateSignature(); + Apk apk = findApkFromAnyRepo(context, app.packageName, app.suggestedVersionCode, + mostAppropriateSignature); + if (apk == null && (mostAppropriateSignature == null || !app.isInstalled(context))) { + List apks = findByPackageName(context, app.packageName); + for (Apk availableApk : apks) { + if (availableApk.sig.equals(mostAppropriateSignature)) { + apk = availableApk; + break; + } + } + if (apk == null && apks.size() > 0) { + apk = apks.get(0); + } + } + return apk; + } public static Apk findApkFromAnyRepo(Context context, String packageName, int versionCode) {