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 147683b18..d3f3e8ddc 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java @@ -8,7 +8,6 @@ import android.database.Cursor; import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.text.TextUtils; import android.util.Log; import org.fdroid.fdroid.data.Schema.ApkTable; @@ -84,14 +83,7 @@ public class ApkProvider extends FDroidProvider { * */ public static Apk findSuggestedApk(Context context, App app) { - String preferredSignature = null; - if (!TextUtils.isEmpty(app.installedSig)) { - preferredSignature = app.installedSig; - } else if (!TextUtils.isEmpty(app.preferredSigner)) { - preferredSignature = app.preferredSigner; - } - - return findApkFromAnyRepo(context, app.packageName, app.suggestedVersionCode, preferredSignature); + return findApkFromAnyRepo(context, app.packageName, app.suggestedVersionCode, app.getMostAppropriateSignature()); } public static Apk findApkFromAnyRepo(Context context, String packageName, int versionCode) { diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java index 8faeaeceb..e8e7621bc 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -1098,4 +1098,24 @@ public class App extends ValueObject implements Comparable, Parcelable { return new App[size]; } }; + + /** + * Choose the signature which we should encourage the user to install. + * Usually, we want the {@link #preferredSigner} rather than any random signature. + * However, if the app is installed, then we override this and instead want to only encourage + * the user to try and install versions with that signature (because thats all the OS will let + * them do). + * TODO: I don't think preferredSigner should ever be null, because if an app has apks then + * we should have chosen the first and used that. If so, then we should change to @NonNull and + * throw an exception if it is null. + */ + @Nullable + public String getMostAppropriateSignature() { + if (!TextUtils.isEmpty(installedSig)) { + return installedSig; + } else if (!TextUtils.isEmpty(preferredSigner)) { + return preferredSigner; + } + return null; + } } diff --git a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java index dc76d1f99..eb7b4cc16 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java +++ b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java @@ -178,9 +178,10 @@ public class AppDetailsRecyclerViewAdapter private Apk getSuggestedApk() { Apk curApk = null; + String appropriateSig = app.getMostAppropriateSignature(); for (int i = 0; i < versions.size(); i++) { final Apk apk = versions.get(i); - if (apk.versionCode == app.suggestedVersionCode) { + if (apk.versionCode == app.suggestedVersionCode && TextUtils.equals(apk.sig, appropriateSig)) { curApk = apk; break; }