From caac895442adb6178295c0992c2f207cf08da43a Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Wed, 21 Jun 2017 15:48:21 +1000 Subject: [PATCH] Add "preferredSigner" field to App. At present, this is chosen from the first package in the index-v1 metadata. --- .../java/org/fdroid/fdroid/IndexV1Updater.java | 7 ++++++- .../org/fdroid/fdroid/data/ApkProvider.java | 17 ++++++++++++++++- .../main/java/org/fdroid/fdroid/data/App.java | 8 ++++++++ .../java/org/fdroid/fdroid/data/DBHelper.java | 15 ++++++++++++++- .../java/org/fdroid/fdroid/data/Schema.java | 5 +++-- .../test/java/org/fdroid/fdroid/TestUtils.java | 3 ++- .../fdroid/data/PreferredSignatureTest.java | 6 +++--- .../fdroid/updater/IndexV1UpdaterTest.java | 1 + 8 files changed, 53 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java b/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java index 7b4d36a5e..a8de65bb9 100644 --- a/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java +++ b/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java @@ -217,9 +217,14 @@ public class IndexV1Updater extends RepoUpdater { if (packages != null) { apks = packages.get(app.packageName); } + if (apks == null) { Log.i(TAG, "processIndexV1 empty packages"); - apks = new ArrayList(0); + apks = new ArrayList<>(0); + } + + if (apks.size() > 0) { + app.preferredSigner = apks.get(0).sig; } if (appCount % 50 == 0) { 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 e73cdfa2e..147683b18 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/ApkProvider.java @@ -8,6 +8,7 @@ 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; @@ -75,8 +76,22 @@ public class ApkProvider extends FDroidProvider { return resolver.delete(uri, null, null); } + /** + * Find an app which is closest to the version code suggested by the server, with some caveates: + * + */ public static Apk findSuggestedApk(Context context, App app) { - return findApkFromAnyRepo(context, app.packageName, app.suggestedVersionCode, app.installedSig); + 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); } 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 ad189b7b0..8faeaeceb 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -98,6 +98,8 @@ public class App extends ValueObject implements Comparable, Parcelable { private long id; @JsonIgnore private AppPrefs prefs; + @JsonIgnore + public String preferredSigner; @JacksonInject("repoId") public long repoId; @@ -286,6 +288,9 @@ public class App extends ValueObject implements Comparable, Parcelable { case Cols.SuggestedApk.VERSION_NAME: suggestedVersionName = cursor.getString(i); break; + case Cols.PREFERRED_SIGNER: + preferredSigner = cursor.getString(i); + break; case Cols.SUGGESTED_VERSION_CODE: suggestedVersionCode = cursor.getInt(i); break; @@ -828,6 +833,7 @@ public class App extends ValueObject implements Comparable, Parcelable { values.put(Cols.FLATTR_ID, flattrID); values.put(Cols.ADDED, Utils.formatDate(added, "")); values.put(Cols.LAST_UPDATED, Utils.formatDate(lastUpdated, "")); + values.put(Cols.PREFERRED_SIGNER, preferredSigner); values.put(Cols.SUGGESTED_VERSION_CODE, suggestedVersionCode); values.put(Cols.UPSTREAM_VERSION_NAME, upstreamVersionName); values.put(Cols.UPSTREAM_VERSION_CODE, upstreamVersionCode); @@ -1003,6 +1009,7 @@ public class App extends ValueObject implements Comparable, Parcelable { dest.writeString(this.bitcoin); dest.writeString(this.litecoin); dest.writeString(this.flattrID); + dest.writeString(this.preferredSigner); dest.writeString(this.upstreamVersionName); dest.writeInt(this.upstreamVersionCode); dest.writeString(this.suggestedVersionName); @@ -1050,6 +1057,7 @@ public class App extends ValueObject implements Comparable, Parcelable { this.bitcoin = in.readString(); this.litecoin = in.readString(); this.flattrID = in.readString(); + this.preferredSigner = in.readString(); this.upstreamVersionName = in.readString(); this.upstreamVersionCode = in.readInt(); this.suggestedVersionName = in.readString(); diff --git a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java index 555d39f90..3ad0ee818 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -128,6 +128,7 @@ class DBHelper extends SQLiteOpenHelper { + AppMetadataTable.Cols.SOURCE_CODE + " text, " + AppMetadataTable.Cols.VIDEO + " string, " + AppMetadataTable.Cols.CHANGELOG + " text, " + + AppMetadataTable.Cols.PREFERRED_SIGNER + " text," + AppMetadataTable.Cols.SUGGESTED_VERSION_CODE + " text," + AppMetadataTable.Cols.UPSTREAM_VERSION_NAME + " text," + AppMetadataTable.Cols.UPSTREAM_VERSION_CODE + " integer," @@ -192,7 +193,7 @@ class DBHelper extends SQLiteOpenHelper { + InstalledAppTable.Cols.HASH + " TEXT NOT NULL" + " );"; - protected static final int DB_VERSION = 71; + protected static final int DB_VERSION = 72; private final Context context; @@ -278,6 +279,18 @@ class DBHelper extends SQLiteOpenHelper { addWhatsNewAndVideo(db, oldVersion); dropApkPrimaryKey(db, oldVersion); addIntegerPrimaryKeyToInstalledApps(db, oldVersion); + addPreferredSignerToApp(db, oldVersion); + } + + private void addPreferredSignerToApp(SQLiteDatabase db, int oldVersion) { + if (oldVersion >= 72) { + return; + } + + if (!columnExists(db, AppMetadataTable.NAME, AppMetadataTable.Cols.PREFERRED_SIGNER)) { + Log.i(TAG, "Adding preferred signer to app table."); + db.execSQL("alter table " + AppMetadataTable.NAME + " add column " + AppMetadataTable.Cols.PREFERRED_SIGNER + " text;"); + } } private void addIntegerPrimaryKeyToInstalledApps(SQLiteDatabase db, int oldVersion) { diff --git a/app/src/main/java/org/fdroid/fdroid/data/Schema.java b/app/src/main/java/org/fdroid/fdroid/data/Schema.java index cb02a85d9..c10996b7c 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Schema.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Schema.java @@ -136,6 +136,7 @@ public interface Schema { String BITCOIN = "bitcoinAddr"; String LITECOIN = "litecoinAddr"; String FLATTR_ID = "flattrID"; + String PREFERRED_SIGNER = "preferredSigner"; String SUGGESTED_VERSION_CODE = "suggestedVercode"; String UPSTREAM_VERSION_NAME = "upstreamVersion"; String UPSTREAM_VERSION_CODE = "upstreamVercode"; @@ -192,7 +193,7 @@ public interface Schema { ANTI_FEATURES, REQUIREMENTS, ICON_URL, ICON_URL_LARGE, FEATURE_GRAPHIC, PROMO_GRAPHIC, TV_BANNER, PHONE_SCREENSHOTS, SEVEN_INCH_SCREENSHOTS, TEN_INCH_SCREENSHOTS, TV_SCREENSHOTS, WEAR_SCREENSHOTS, - SUGGESTED_VERSION_CODE, + PREFERRED_SIGNER, SUGGESTED_VERSION_CODE, }; /** @@ -208,7 +209,7 @@ public interface Schema { ANTI_FEATURES, REQUIREMENTS, ICON_URL, ICON_URL_LARGE, FEATURE_GRAPHIC, PROMO_GRAPHIC, TV_BANNER, PHONE_SCREENSHOTS, SEVEN_INCH_SCREENSHOTS, TEN_INCH_SCREENSHOTS, TV_SCREENSHOTS, WEAR_SCREENSHOTS, - SUGGESTED_VERSION_CODE, SuggestedApk.VERSION_NAME, + PREFERRED_SIGNER, SUGGESTED_VERSION_CODE, SuggestedApk.VERSION_NAME, InstalledApp.VERSION_CODE, InstalledApp.VERSION_NAME, InstalledApp.SIGNATURE, Package.PACKAGE_NAME, }; diff --git a/app/src/test/java/org/fdroid/fdroid/TestUtils.java b/app/src/test/java/org/fdroid/fdroid/TestUtils.java index 1ae1179e6..837f35db7 100644 --- a/app/src/test/java/org/fdroid/fdroid/TestUtils.java +++ b/app/src/test/java/org/fdroid/fdroid/TestUtils.java @@ -92,10 +92,11 @@ public class TestUtils { } public static App insertApp(Context context, String packageName, String appName, int upstreamVersionCode, - Repo repo) { + Repo repo, String preferredSigner) { ContentValues values = new ContentValues(); values.put(Schema.AppMetadataTable.Cols.REPO_ID, repo.getId()); values.put(Schema.AppMetadataTable.Cols.UPSTREAM_VERSION_CODE, upstreamVersionCode); + values.put(Schema.AppMetadataTable.Cols.PREFERRED_SIGNER, preferredSigner); return Assert.insertApp(context, packageName, appName, values); } diff --git a/app/src/test/java/org/fdroid/fdroid/data/PreferredSignatureTest.java b/app/src/test/java/org/fdroid/fdroid/data/PreferredSignatureTest.java index 6b48b3e97..20c2d55e3 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/PreferredSignatureTest.java +++ b/app/src/test/java/org/fdroid/fdroid/data/PreferredSignatureTest.java @@ -37,7 +37,7 @@ public class PreferredSignatureTest extends FDroidProviderTest { } private App populateFDroidRepo(Repo repo) { - App app = TestUtils.insertApp(context, PACKAGE_NAME, "App", 3100, repo); + App app = TestUtils.insertApp(context, PACKAGE_NAME, "App", 3100, repo, TestUtils.UPSTREAM_SIG); TestUtils.insertApk(context, app, 1100, TestUtils.FDROID_SIG); // 1.0 TestUtils.insertApk(context, app, 2100, TestUtils.FDROID_SIG); // 2.0 @@ -54,7 +54,7 @@ public class PreferredSignatureTest extends FDroidProviderTest { } private App populateDevRepo(Repo repo) { - App app = TestUtils.insertApp(context, PACKAGE_NAME, "App", 4100, repo); + App app = TestUtils.insertApp(context, PACKAGE_NAME, "App", 4100, repo, TestUtils.THIRD_PARTY_SIG); TestUtils.insertApk(context, app, 1001, TestUtils.THIRD_PARTY_SIG); // 1.0-rc2 TestUtils.insertApk(context, app, 1100, TestUtils.THIRD_PARTY_SIG); // 1.0 @@ -78,7 +78,7 @@ public class PreferredSignatureTest extends FDroidProviderTest { } private App populateUpstreamRepo(Repo repo) { - App app = TestUtils.insertApp(context, PACKAGE_NAME, "App", 4100, repo); + App app = TestUtils.insertApp(context, PACKAGE_NAME, "App", 4100, repo, TestUtils.UPSTREAM_SIG); TestUtils.insertApk(context, app, 2100, TestUtils.UPSTREAM_SIG); TestUtils.insertApk(context, app, 3100, TestUtils.UPSTREAM_SIG); diff --git a/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java b/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java index d44c63292..10675b127 100644 --- a/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java +++ b/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java @@ -263,6 +263,7 @@ public class IndexV1UpdaterTest extends FDroidProviderTest { "installedSig", "installedVersionCode", "installedVersionName", + "preferredSigner", "prefs", "TAG", };