Add "preferredSigner" field to App.

At present, this is chosen from the first package in the index-v1
metadata.
This commit is contained in:
Peter Serwylo 2017-06-21 15:48:21 +10:00
parent 6b42b802b3
commit caac895442
8 changed files with 53 additions and 9 deletions

View File

@ -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<Apk>(0);
apks = new ArrayList<>(0);
}
if (apks.size() > 0) {
app.preferredSigner = apks.get(0).sig;
}
if (appCount % 50 == 0) {

View File

@ -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:
* <ul>
* <li>If installed, limit to apks signed by the same signer as the installed apk.</li>
* <li>Otherwise, limit to apks signed by the "preferred" signer (see {@link App#preferredSigner}).</li>
* </ul>
*/
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) {

View File

@ -98,6 +98,8 @@ public class App extends ValueObject implements Comparable<App>, 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<App>, 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<App>, 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<App>, 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<App>, 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();

View File

@ -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) {

View File

@ -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,
};

View File

@ -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);
}

View File

@ -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);

View File

@ -263,6 +263,7 @@ public class IndexV1UpdaterTest extends FDroidProviderTest {
"installedSig",
"installedVersionCode",
"installedVersionName",
"preferredSigner",
"prefs",
"TAG",
};